diff --git a/BUILD.gn b/BUILD.gn
index a1a2108f..8209523b 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1004,7 +1004,6 @@
       "//content/test:mojo_web_test_bindings_js_data_deps",
       "//content/shell:mojo_bindings_js_data_deps",
       "//device/bluetooth/public/mojom:fake_bluetooth_interfaces_js_data_deps",
-      "//device/usb/public/mojom:mojom_js_data_deps",
       "//device/vr/public/mojom:mojom_js_data_deps",
       "//media/capture/mojom:image_capture_js_data_deps",
       "//media/midi:mojo_js_data_deps",
@@ -1013,6 +1012,7 @@
       "//services/shape_detection/public/mojom:mojom_js_data_deps",
       "//services/device/public/mojom:mojom_js_data_deps",
       "//services/device/public/mojom:generic_sensor_js_data_deps",
+      "//services/device/public/mojom:usb_js_data_deps",
       "//skia/public/interfaces:interfaces_js_data_deps",
       "//testing/buildbot/filters:blink_web_tests_filter",
       "//third_party/blink/public:blink_devtools_frontend_resources_files",
diff --git a/DEPS b/DEPS
index 10752de..5a6521a 100644
--- a/DEPS
+++ b/DEPS
@@ -133,11 +133,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': 'b45ee83cc7c0f08be3e6bf6a2c9e3442da05a95d',
+  'skia_revision': 'f4c66ccafcb7fe62201cbe9a6eb72b09ef8a31da',
   # 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': '92b8322b89a02a88c867f43e7b6770c779ff6d62',
+  'v8_revision': 'c9178292dbb05caf07f5e1cd985f90383fbba6b9',
   # 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.
@@ -145,11 +145,11 @@
   # 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': '52bfbd35fc969f1fa2366e0cd28a8d832cbdddc0',
+  'angle_revision': '70958d15db70251fc1650ae3920acce06998038b',
   # 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': '62ad1eeb0e6b85ff703ea2a6c6c2edd07ad2494d',
+  'swiftshader_revision': '7ab65834bc02587341438f4d2f23e5514a6ef232',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -196,7 +196,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': '6ea34ccba4c6ae51128efad41523d6616b152e36',
+  'catapult_revision': '4d850033271b29cd51e6343747c75631d335f14c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -212,7 +212,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.
-  'feed_revision': '80206bfdbfec6a374e1ee5055331bd302551457d',
+  'feed_revision': 'eb5622ba5a63b0e62ee8cc7afd49d087faa107c9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling android_sdk_build-tools_version
   # and whatever else without interference from each other.
@@ -268,11 +268,11 @@
   # 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': '1b5fb81a01dfd3c06debd02ff41f4ee889b3b4f1',
+  'dawn_revision': '027a8f6464c56c7294a622118d5c1f0fbf9cf58f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': '63d0bc4ae8dcc67502f30c320cdc074c44ea4d89',
+  'quiche_revision': '034c98c00b23150a20d39e9ce90e71586102bc6c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -287,7 +287,7 @@
   # revisions.
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:64b846c96daeb3eaf08e26d8a84d8451c6cb712b',
+  'gn_version': 'git_revision:81ee1967d3fcbc829bac1c005c3da59739c88df9',
 
   # Also, if you change these, update buildtools/DEPS too. Also update the
   # libc++ svn_revision in //buildtools/deps_revisions.gni.
@@ -802,7 +802,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'fdbb15913346db795e7a7c9288feaf79c92e2cf4',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'f9db023d2092eb484bc7f17c59e99c0a5ed03a4a',
       'condition': 'checkout_linux',
   },
 
@@ -827,7 +827,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'd7e41546c030e9eb41bede1d4acfaa2a31b1c509',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '7639f1999ac1d8992fc4fbb169d164b156d9a7f7',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -896,7 +896,7 @@
   },
 
   'src/third_party/glslang/src':
-    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '6e384fef6c0fcd99395502217737be87b37e2218',
+    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '27ec9195850108c8495dbc1ee2a10d09e8ea1921',
 
   'src/third_party/google_toolbox_for_mac/src': {
       'url': Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'),
@@ -1177,7 +1177,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'b0f423a33189049776b359044a863b837bcc4d8f',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'f09f069a125f9ff57084616e11029da103aa91f5',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1345,7 +1345,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6f0b34abee8dba611c253738d955c59f703c147a',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '519d74a5fcd869478f2bd8cc3a38eca7dfb608e6',
+    Var('webrtc_git') + '/src.git' + '@' + 'b9979a533c0be7571c47fd727ad9796316e0f739',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1386,7 +1386,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bbaaf61f1d995681f17a25bc2c19c0e32b63a526',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e4f5cbe5d994203d31fdc9cf7f35e276d8a5260b',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 04cc0a70..35de071 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -856,7 +856,6 @@
     'build/android/gyp/create_apk_operations_script.pydeps',
     'build/android/gyp/create_java_binary_script.pydeps',
     'build/android/gyp/create_size_info_files.pydeps',
-    'build/android/gyp/create_stack_script.pydeps',
     'build/android/gyp/create_tool_wrapper.pydeps',
     'build/android/gyp/desugar.pydeps',
     'build/android/gyp/dexsplitter.pydeps',
@@ -3636,8 +3635,9 @@
 def _CheckForInvalidIfDefinedMacros(input_api, output_api):
   """Check all affected files for invalid "if defined" macros."""
   bad_macros = []
+  skipped_paths = ['third_party/sqlite/', 'third_party/abseil-cpp/']
   for f in input_api.AffectedFiles():
-    if f.LocalPath().startswith('third_party/sqlite/'):
+    if any([f.LocalPath().startswith(path) for path in skipped_paths]):
       continue
     if f.LocalPath().endswith(('.h', '.c', '.cc', '.m', '.mm')):
       bad_macros.extend(_CheckForInvalidIfDefinedMacrosInFile(input_api, f))
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index ca90423..5d2b36a 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -32,6 +32,7 @@
 
 generate_jni("native_jni") {
   sources = [
+    "apk/java/src/com/android/webview/chromium/WebViewApkApplication.java",
     "java/src/org/chromium/android_webview/AndroidProtocolHandler.java",
     "java/src/org/chromium/android_webview/AwAutofillClient.java",
     "java/src/org/chromium/android_webview/AwBrowserProcess.java",
@@ -222,13 +223,7 @@
   }
 }
 
-java_group("stub_assets") {
-  deps = [
-    ":license_assets",
-  ]
-}
-
-android_assets("license_assets") {
+android_assets("stub_assets") {
   renaming_sources = [ "$root_gen_dir/components/resources/about_credits.html" ]
   renaming_destinations = [ "webview_licenses.notice" ]
   deps = [
@@ -275,13 +270,13 @@
 
   # webui/resources has way too many resources. The whitelist is trim this down
   # to a reasonable size
-  whitelist = rebase_path("ui/grit_resources_whitelist.txt", root_build_dir)
+  _whitelist = "ui/grit_resources_whitelist.txt"
   inputs = [
-    "//android_webview/ui/grit_resources_whitelist.txt",
+    _whitelist,
   ]
   grit_flags = [
     "-w",
-    whitelist,
+    rebase_path(_whitelist, root_build_dir),
   ]
   outputs = [
     "grit/webui_resources.h",
@@ -298,13 +293,20 @@
   source_is_generated = true
 
   # See :generate_webui_resources for an explanation of the whitelist
-  whitelist = rebase_path("ui/grit_resources_whitelist.txt", root_build_dir)
+  _whitelist = "ui/grit_resources_whitelist.txt"
   inputs = [
-    "//android_webview/ui/grit_resources_whitelist.txt",
+    _whitelist,
   ]
+  _about_credits_file_bro =
+      get_label_info("//components/resources", "target_gen_dir") +
+      "/about_credits.bro"
+
   grit_flags = [
     "-w",
-    whitelist,
+    rebase_path(_whitelist, root_build_dir),
+    "-E",
+    "about_credits_file=" +
+        rebase_path(_about_credits_file_bro, root_build_dir),
   ]
   outputs = [
     "grit/components_resources.h",
@@ -312,7 +314,7 @@
   ]
 
   deps = [
-    "//components/resources:components_resources",
+    "//components/resources:compressed_about_credits",
   ]
 }
 
@@ -480,6 +482,7 @@
 
 source_set("common") {
   sources = [
+    "apk/webview_apk_application.cc",
     "browser/android_protocol_handler.cc",
     "browser/android_protocol_handler.h",
     "browser/aw_autofill_client.cc",
@@ -668,6 +671,8 @@
     "common/aw_paths.h",
     "common/aw_resource.cc",
     "common/aw_resource.h",
+    "common/aw_resource_bundle.cc",
+    "common/aw_resource_bundle.h",
     "common/aw_switches.cc",
     "common/aw_switches.h",
     "common/crash_reporter/aw_crash_reporter_client.cc",
@@ -719,6 +724,7 @@
     "//android_webview/utility",
     "//base",
     "//base/third_party/dynamic_annotations:dynamic_annotations",
+    "//components/about_ui",
     "//components/autofill/android:provider",
     "//components/autofill/content/browser",
     "//components/autofill/content/common:mojo_interfaces",
diff --git a/android_webview/DEPS b/android_webview/DEPS
index 8ac381e..d3242c9f 100644
--- a/android_webview/DEPS
+++ b/android_webview/DEPS
@@ -7,7 +7,9 @@
   # lib is the top-level target, and must remain a leaf in the dependency tree.
   "-android_webview/lib",
 
+  "+components/about_ui",
   "+components/content_capture",
+  "+components/embedder_support/android/java",
   "+components/heap_profiling",
   "+components/google/core",
   "+components/network_session_configurator/common",
diff --git a/android_webview/apk/BUILD.gn b/android_webview/apk/BUILD.gn
index 1ceff4b..8f5d5559 100644
--- a/android_webview/apk/BUILD.gn
+++ b/android_webview/apk/BUILD.gn
@@ -4,15 +4,34 @@
 
 import("//build/config/android/rules.gni")
 
-# Since Monochrome has its own content provider, these two files are put
-# in two different targets.
+# Monochrome uses a different copy of LicenseContentProvider.java.
+# This one is used in Trichrome and SystemWebview.
 android_library("webview_license_provider_java") {
-  java_files = [ "//android_webview/apk/java/src/com/android/webview/chromium/LicenseContentProvider.java" ]
+  java_files =
+      [ "java/src/com/android/webview/chromium/LicenseContentProvider.java" ]
   deps = [
+    ":apk_java",
     "//base:base_java",
+    "//components/about_ui/android:aboutui_java",
   ]
 }
 
-android_library("webview_license_activity_java") {
-  java_files = [ "//android_webview/apk/java/src/com/android/webview/chromium/LicenseActivity.java" ]
+# TODO(agrieve): Delete once downstream reference is updated.
+java_group("webview_license_activity_java") {
+  deps = [
+    ":apk_java",
+  ]
+}
+
+# Contains classes needed by the webview apk, but not used when loading the apk
+# as a library.
+android_library("apk_java") {
+  java_files = [
+    "java/src/com/android/webview/chromium/LicenseActivity.java",
+    "java/src/com/android/webview/chromium/WebViewApkApplication.java",
+  ]
+  deps = [
+    "//base:base_java",
+    "//components/embedder_support/android:application_java",
+  ]
 }
diff --git a/android_webview/apk/java/AndroidManifest.xml b/android_webview/apk/java/AndroidManifest.xml
index 76c992d..bca5a6b 100644
--- a/android_webview/apk/java/AndroidManifest.xml
+++ b/android_webview/apk/java/AndroidManifest.xml
@@ -26,7 +26,7 @@
 
     <application android:label="{{ application_label|default('Android System WebView') }}"
                  android:icon="@{{manifest_package|default('com.android.webview')}}:drawable/icon_webview"
-                 android:name="{{ application_name|default('com.android.webview.chromium.WebViewApplication') }}"
+                 android:name="{{ application_name|default('com.android.webview.chromium.WebViewApkApplication') }}"
                  android:multiArch="true"
                  android:use32bitAbi="true"
                  android:extractNativeLibs="{{ trichrome_library is not defined }}">
diff --git a/android_webview/apk/java/src/com/android/webview/chromium/LicenseContentProvider.java b/android_webview/apk/java/src/com/android/webview/chromium/LicenseContentProvider.java
index 94824a6..361870d 100644
--- a/android_webview/apk/java/src/com/android/webview/chromium/LicenseContentProvider.java
+++ b/android_webview/apk/java/src/com/android/webview/chromium/LicenseContentProvider.java
@@ -12,9 +12,9 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
-import android.util.Log;
 
 import org.chromium.base.FileUtils;
+import org.chromium.components.aboutui.CreditUtils;
 
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -23,10 +23,10 @@
 import java.io.OutputStream;
 
 /**
- * Content provider for the OSS licenses file.
- * This is compiled into the stub WebView and so should not depend on any classes from Chromium.
+ * Content provider for about:credits.
+ * Used by SystemWebview and TrichromeWebview, but not Monochrome.
  */
-@TargetApi(Build.VERSION_CODES.KITKAT)
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
 public class LicenseContentProvider
         extends ContentProvider implements ContentProvider.PipeDataWriter<String> {
     public static final String LICENSES_URI_SUFFIX = "LicenseContentProvider/webview_licenses";
@@ -49,11 +49,17 @@
     @Override
     public void writeDataToPipe(
             ParcelFileDescriptor output, Uri uri, String mimeType, Bundle opts, String filename) {
-        try (InputStream in = getContext().getAssets().open(filename);
-                OutputStream out = new FileOutputStream(output.getFileDescriptor());) {
-            FileUtils.copyStream(in, out);
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to read the license file", e);
+        if (WebViewApkApplication.initializeNative()) {
+            CreditUtils.nativeWriteCreditsHtml(output.detachFd());
+        } else {
+            // Missing native library means we're the webview stub and licenses are stored as an
+            // asset.
+            try (InputStream in = getContext().getAssets().open(filename);
+                    OutputStream out = new FileOutputStream(output.getFileDescriptor())) {
+                FileUtils.copyStream(in, out);
+            } catch (IOException ioException) {
+                throw new RuntimeException(ioException);
+            }
         }
     }
 
@@ -85,4 +91,4 @@
             String sortOrder) {
         throw new UnsupportedOperationException();
     }
-}
\ No newline at end of file
+}
diff --git a/android_webview/apk/java/src/com/android/webview/chromium/WebViewApkApplication.java b/android_webview/apk/java/src/com/android/webview/chromium/WebViewApkApplication.java
new file mode 100644
index 0000000..303ee895
--- /dev/null
+++ b/android_webview/apk/java/src/com/android/webview/chromium/WebViewApkApplication.java
@@ -0,0 +1,58 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package com.android.webview.chromium;
+
+import android.app.Application;
+import android.content.Context;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.components.embedder_support.application.FontPreloadingWorkaround;
+
+/**
+ * Application subclass for SystemWebView and Trichrome.
+ *
+ * Application subclass is only used in renderer processes and in the WebView APK's own services.
+ * None of this code runs in an application which simply uses WebView.
+ */
+@JNINamespace("android_webview")
+public class WebViewApkApplication extends Application {
+    // Called by the framework for ALL processes. Runs before ContentProviders are created.
+    // Quirk: context.getApplicationContext() returns null during this method.
+    @Override
+    protected void attachBaseContext(Context context) {
+        super.attachBaseContext(context);
+        ContextUtils.initApplicationContext(this);
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        FontPreloadingWorkaround.maybeInstallWorkaround(this);
+    }
+
+    /**
+     * Performs minimal native library initialization required when running as a stand-alone APK.
+     * @return True if the library was loaded, false if running as webview stub.
+     */
+    static synchronized boolean initializeNative() {
+        try {
+            if (LibraryLoader.getInstance().isInitialized()) {
+                return true;
+            }
+            LibraryLoader.getInstance().loadNow();
+        } catch (Throwable unused) {
+            // Happens for WebView Stub. Throws NoClassDefFoundError because of no
+            // NativeLibraries.java being generated.
+            return false;
+        }
+        LibraryLoader.getInstance().switchCommandLineForWebView();
+        nativeInitializePakResources();
+        return true;
+    }
+
+    private static native void nativeInitializePakResources();
+}
diff --git a/android_webview/apk/webview_apk_application.cc b/android_webview/apk/webview_apk_application.cc
new file mode 100644
index 0000000..9167db9
--- /dev/null
+++ b/android_webview/apk/webview_apk_application.cc
@@ -0,0 +1,18 @@
+// 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 "jni/WebViewApkApplication_jni.h"
+
+#include "android_webview/common/aw_resource_bundle.h"
+#include "base/android/base_jni_onload.h"
+#include "base/logging.h"
+
+namespace android_webview {
+
+void JNI_WebViewApkApplication_InitializePakResources(JNIEnv* env) {
+  CHECK(base::android::OnJNIOnLoadInit());
+  InitIcuAndResourceBundleBrowserSide();
+}
+
+}  // namespace android_webview
diff --git a/android_webview/common/aw_resource_bundle.cc b/android_webview/common/aw_resource_bundle.cc
new file mode 100644
index 0000000..1b27c6ca
--- /dev/null
+++ b/android_webview/common/aw_resource_bundle.cc
@@ -0,0 +1,60 @@
+// 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 "android_webview/common/aw_resource_bundle.h"
+
+#include "android_webview/common/aw_descriptors.h"
+#include "base/android/locale_utils.h"
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+#include "base/files/memory_mapped_file.h"
+#include "base/i18n/rtl.h"
+#include "base/logging.h"
+#include "base/path_service.h"
+#include "base/posix/global_descriptors.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/base/resource/resource_bundle_android.h"
+#include "ui/base/ui_base_paths.h"
+
+namespace android_webview {
+
+void InitIcuAndResourceBundleBrowserSide() {
+  ui::SetLocalePaksStoredInApk(true);
+  std::string locale = ui::ResourceBundle::InitSharedInstanceWithLocale(
+      base::android::GetDefaultLocaleString(), NULL,
+      ui::ResourceBundle::LOAD_COMMON_RESOURCES);
+  if (locale.empty()) {
+    LOG(WARNING) << "Failed to load locale .pak from apk.";
+  }
+  base::i18n::SetICUDefaultLocale(locale);
+
+  // Try to directly mmap the resources.pak from the apk. Fall back to load
+  // from file, using PATH_SERVICE, otherwise.
+  base::FilePath pak_file_path;
+  base::PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &pak_file_path);
+  pak_file_path = pak_file_path.AppendASCII("resources.pak");
+  ui::LoadMainAndroidPackFile("assets/resources.pak", pak_file_path);
+}
+
+void InitResourceBundleRendererSide() {
+  auto* global_descriptors = base::GlobalDescriptors::GetInstance();
+  int pak_fd = global_descriptors->Get(kAndroidWebViewLocalePakDescriptor);
+  base::MemoryMappedFile::Region pak_region =
+      global_descriptors->GetRegion(kAndroidWebViewLocalePakDescriptor);
+  ui::ResourceBundle::InitSharedInstanceWithPakFileRegion(base::File(pak_fd),
+                                                          pak_region);
+
+  std::pair<int, ui::ScaleFactor> extra_paks[] = {
+      {kAndroidWebViewMainPakDescriptor, ui::SCALE_FACTOR_NONE},
+      {kAndroidWebView100PercentPakDescriptor, ui::SCALE_FACTOR_100P}};
+
+  for (const auto& pak_info : extra_paks) {
+    pak_fd = global_descriptors->Get(pak_info.first);
+    pak_region = global_descriptors->GetRegion(pak_info.first);
+    ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion(
+        base::File(pak_fd), pak_region, pak_info.second);
+  }
+}
+
+}  // namespace android_webview
diff --git a/android_webview/common/aw_resource_bundle.h b/android_webview/common/aw_resource_bundle.h
new file mode 100644
index 0000000..b7bdce48
--- /dev/null
+++ b/android_webview/common/aw_resource_bundle.h
@@ -0,0 +1,16 @@
+// 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 ANDROID_WEBVIEW_COMMON_AW_RESOURCE_BUNDLE_H_
+#define ANDROID_WEBVIEW_COMMON_AW_RESOURCE_BUNDLE_H_
+
+namespace android_webview {
+
+void InitIcuAndResourceBundleBrowserSide();
+
+void InitResourceBundleRendererSide();
+
+}  // namespace android_webview
+
+#endif  // ANDROID_WEBVIEW_COMMON_AW_RESOURCE_BUNDLE_H_
diff --git a/android_webview/glue/BUILD.gn b/android_webview/glue/BUILD.gn
index ec3fac7..217be52 100644
--- a/android_webview/glue/BUILD.gn
+++ b/android_webview/glue/BUILD.gn
@@ -53,7 +53,6 @@
     "java/src/com/android/webview/chromium/WebResourceRequestAdapter.java",
     "java/src/com/android/webview/chromium/WebStorageAdapter.java",
     "java/src/com/android/webview/chromium/WebkitToSharedGlueConverter.java",
-    "java/src/com/android/webview/chromium/WebViewApplication.java",
     "java/src/com/android/webview/chromium/WebViewChromiumAwInit.java",
     "java/src/com/android/webview/chromium/WebViewChromium.java",
     "java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java",
diff --git a/android_webview/glue/glue.gni b/android_webview/glue/glue.gni
index 72a44aee..0581c9bb 100644
--- a/android_webview/glue/glue.gni
+++ b/android_webview/glue/glue.gni
@@ -14,7 +14,6 @@
   "//base:base_java",
   "//components/autofill/android:autofill_java",
   "//components/autofill/android:provider_java",
-  "//components/embedder_support/android:application_java",
   "//content/public/android:content_java",
   "//net/android:net_java",
   "//ui/android:ui_java",
diff --git a/android_webview/glue/java/DEPS b/android_webview/glue/java/DEPS
index 5f1cab87..f986aa0 100644
--- a/android_webview/glue/java/DEPS
+++ b/android_webview/glue/java/DEPS
@@ -2,7 +2,6 @@
   "+android_webview/java",
   "+base/android/java",
   "+components/autofill/android/java",
-  "+components/embedder_support/android/java",
 
   "-content/public/android/java",
   "+content/public/android/java/src/org/chromium/content_public",
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewApplication.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewApplication.java
deleted file mode 100644
index 64f1bd3..0000000
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewApplication.java
+++ /dev/null
@@ -1,27 +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.
-
-package com.android.webview.chromium;
-
-import android.app.Application;
-
-import org.chromium.components.embedder_support.application.FontPreloadingWorkaround;
-
-/**
- * Application subclass for standalone WebView, to allow installing the font preloading workaround
- * in renderer processes before the problematic code in ActivityThread runs.
- *
- * DO NOT ADD ANYTHING ELSE HERE! WebView's application subclass is only used in renderer processes
- * and in the WebView APK's own services. None of this code runs in an application which simply uses
- * WebView. This only exists because this is the only point where the font preloading workaround can
- * be installed early enough to be effective.
- */
-public class WebViewApplication extends Application {
-    @Override
-    public void onCreate() {
-        // Don't add anything else here! See above.
-        super.onCreate();
-        FontPreloadingWorkaround.maybeInstallWorkaround(this);
-    }
-}
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc
index d173ac04..21ed5d8 100644
--- a/android_webview/lib/aw_main_delegate.cc
+++ b/android_webview/lib/aw_main_delegate.cc
@@ -14,6 +14,7 @@
 #include "android_webview/browser/tracing/aw_trace_event_args_whitelist.h"
 #include "android_webview/common/aw_descriptors.h"
 #include "android_webview/common/aw_paths.h"
+#include "android_webview/common/aw_resource_bundle.h"
 #include "android_webview/common/aw_switches.h"
 #include "android_webview/common/crash_reporter/aw_crash_reporter_client.h"
 #include "android_webview/common/crash_reporter/crash_keys.h"
@@ -22,7 +23,6 @@
 #include "android_webview/utility/aw_content_utility_client.h"
 #include "base/android/apk_assets.h"
 #include "base/android/build_info.h"
-#include "base/android/locale_utils.h"
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/cpu.h"
@@ -30,7 +30,7 @@
 #include "base/i18n/rtl.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
-#include "base/path_service.h"
+#include "base/posix/global_descriptors.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/thread_restrictions.h"
 #include "cc/base/switches.h"
@@ -54,8 +54,6 @@
 #include "gpu/ipc/gl_in_process_context.h"
 #include "media/base/media_switches.h"
 #include "media/media_buildflags.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/base/resource/resource_bundle_android.h"
 #include "ui/base/ui_base_paths.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/events/gesture_detection/gesture_configuration.h"
@@ -248,23 +246,7 @@
   }
 
   if (process_type == switches::kRendererProcess) {
-    auto* global_descriptors = base::GlobalDescriptors::GetInstance();
-    int pak_fd = global_descriptors->Get(kAndroidWebViewLocalePakDescriptor);
-    base::MemoryMappedFile::Region pak_region =
-        global_descriptors->GetRegion(kAndroidWebViewLocalePakDescriptor);
-    ui::ResourceBundle::InitSharedInstanceWithPakFileRegion(base::File(pak_fd),
-                                                            pak_region);
-
-    std::pair<int, ui::ScaleFactor> extra_paks[] = {
-        {kAndroidWebViewMainPakDescriptor, ui::SCALE_FACTOR_NONE},
-        {kAndroidWebView100PercentPakDescriptor, ui::SCALE_FACTOR_100P}};
-
-    for (const auto& pak_info : extra_paks) {
-      pak_fd = global_descriptors->Get(pak_info.first);
-      pak_region = global_descriptors->GetRegion(pak_info.first);
-      ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion(
-          base::File(pak_fd), pak_region, pak_info.second);
-    }
+    InitResourceBundleRendererSide();
   }
 
   EnableCrashReporter(process_type);
@@ -317,23 +299,7 @@
 
 // This function is called only on the browser process.
 void AwMainDelegate::PostEarlyInitialization(bool is_running_tests) {
-  ui::SetLocalePaksStoredInApk(true);
-  std::string locale = ui::ResourceBundle::InitSharedInstanceWithLocale(
-      base::android::GetDefaultLocaleString(), NULL,
-      ui::ResourceBundle::LOAD_COMMON_RESOURCES);
-  if (locale.empty()) {
-    LOG(WARNING) << "Failed to load locale .pak from the apk. "
-                    "Bringing up WebView without any locale";
-  }
-  base::i18n::SetICUDefaultLocale(locale);
-
-  // Try to directly mmap the resources.pak from the apk. Fall back to load
-  // from file, using PATH_SERVICE, otherwise.
-  base::FilePath pak_file_path;
-  base::PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &pak_file_path);
-  pak_file_path = pak_file_path.AppendASCII("resources.pak");
-  ui::LoadMainAndroidPackFile("assets/resources.pak", pak_file_path);
-
+  InitIcuAndResourceBundleBrowserSide();
   aw_feature_list_creator_->CreateFeatureListAndFieldTrials();
 }
 
diff --git a/android_webview/system_webview_apk_tmpl.gni b/android_webview/system_webview_apk_tmpl.gni
index 4df323b..4d0bff5 100644
--- a/android_webview/system_webview_apk_tmpl.gni
+++ b/android_webview/system_webview_apk_tmpl.gni
@@ -23,10 +23,9 @@
     forward_variables_from(invoker, "*")
 
     deps += [
-      "//android_webview:license_assets",
       "//android_webview:locale_pak_assets",
       "//android_webview:pak_file_assets",
-      "//android_webview/apk:webview_license_activity_java",
+      "//android_webview/apk:apk_java",
       "//android_webview/apk:webview_license_provider_java",
       "//android_webview/glue",
       "//android_webview/support_library:support_lib_glue_java",
diff --git a/android_webview/ui/grit_resources_whitelist.txt b/android_webview/ui/grit_resources_whitelist.txt
index e39792b3..4ed17b9d 100644
--- a/android_webview/ui/grit_resources_whitelist.txt
+++ b/android_webview/ui/grit_resources_whitelist.txt
@@ -1,3 +1,4 @@
+IDR_ABOUT_UI_CREDITS_HTML
 IDR_WEBUI_JS_LOAD_TIME_DATA
 IDR_WEBUI_JSTEMPLATE_JS
 IDR_SECURITY_INTERSTITIAL_HTML
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 2458dc3..2d51ba8 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -429,6 +429,8 @@
     "login/ui/note_action_launch_button.h",
     "login/ui/parent_access_view.cc",
     "login/ui/parent_access_view.h",
+    "login/ui/parent_access_widget.cc",
+    "login/ui/parent_access_widget.h",
     "login/ui/pin_keyboard_animation.cc",
     "login/ui/pin_keyboard_animation.h",
     "login/ui/public_account_warning_dialog.cc",
@@ -745,8 +747,6 @@
     "system/network/network_icon_animation.cc",
     "system/network/network_icon_animation.h",
     "system/network/network_icon_animation_observer.h",
-    "system/network/network_icon_purger.cc",
-    "system/network/network_icon_purger.h",
     "system/network/network_info.cc",
     "system/network/network_info.h",
     "system/network/network_list.cc",
@@ -822,8 +822,6 @@
     "system/power/battery_notification.h",
     "system/power/dual_role_notification.cc",
     "system/power/dual_role_notification.h",
-    "system/power/notification_reporter.cc",
-    "system/power/notification_reporter.h",
     "system/power/peripheral_battery_notifier.cc",
     "system/power/peripheral_battery_notifier.h",
     "system/power/power_button_controller.cc",
@@ -1286,7 +1284,6 @@
     "//services/device/public/mojom",
     "//services/media_session/public/mojom",
     "//services/service_manager/public/cpp",
-    "//services/ws/public/cpp",
     "//services/ws/public/cpp/input_devices",
     "//services/ws/public/mojom",
     "//skia",
@@ -1770,7 +1767,6 @@
     "system/palette/tools/metalayer_unittest.cc",
     "system/palette/tools/screenshot_unittest.cc",
     "system/power/backlights_forced_off_setter_unittest.cc",
-    "system/power/notification_reporter_unittest.cc",
     "system/power/peripheral_battery_notifier_unittest.cc",
     "system/power/power_button_controller_unittest.cc",
     "system/power/power_button_screenshot_controller_unittest.cc",
@@ -2216,7 +2212,6 @@
     "//components/viz/test:test_support",
     "//device/bluetooth",
     "//services/device/public/mojom",
-    "//services/ws/public/cpp",
     "//services/ws/public/cpp/input_devices",
     "//services/ws/public/cpp/input_devices:test_support",
     "//services/ws/public/mojom",
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 19360214..cffe64e 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -600,6 +600,11 @@
   }
 }
 
+void HandleShowOrSwitchIme() {
+  base::RecordAction(UserMetricsAction("Accel_Show_Or_Switch_Ime"));
+  Shell::Get()->ime_controller()->ShowOrSwitchIme();
+}
+
 void HandleCrosh() {
   base::RecordAction(UserMetricsAction("Accel_Open_Crosh"));
 
@@ -1411,6 +1416,7 @@
     case RESTORE_TAB:
     case ROTATE_WINDOW:
     case SHOW_IME_MENU_BUBBLE:
+    case SHOW_OR_SWITCH_IME:
     case SHOW_SHORTCUT_VIEWER:
     case SHOW_TASK_MANAGER:
     case SUSPEND:
@@ -1641,6 +1647,9 @@
     case SHOW_IME_MENU_BUBBLE:
       HandleShowImeMenuBubble();
       break;
+    case SHOW_OR_SWITCH_IME:
+      HandleShowOrSwitchIme();
+      break;
     case SHOW_SHORTCUT_VIEWER:
       HandleShowKeyboardShortcutViewer();
       break;
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index ce63400f..c395952 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -16,6 +16,7 @@
 #include "ash/display/screen_orientation_controller.h"
 #include "ash/display/screen_orientation_controller_test_api.h"
 #include "ash/ime/ime_controller.h"
+#include "ash/ime/mode_indicator_observer.h"
 #include "ash/ime/test_ime_controller_client.h"
 #include "ash/magnifier/docked_magnifier_controller_impl.h"
 #include "ash/magnifier/magnification_controller.h"
@@ -47,6 +48,7 @@
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/metrics/user_action_tester.h"
 #include "base/test/scoped_feature_list.h"
@@ -2242,4 +2244,37 @@
   }
 }
 
+// Tests the IME mode change key.
+TEST_F(AcceleratorControllerTest,
+       ChangeIMEMode_ModeIndicatorHiddenShowsIndicator) {
+  ImeController* controller = Shell::Get()->ime_controller();
+
+  TestImeControllerClient client;
+  controller->SetClient(client.CreateInterfacePtr());
+
+  EXPECT_FALSE(controller->mode_indicator_observer()->active_widget());
+  EXPECT_EQ(0, client.show_mode_indicator_count_);
+
+  ProcessInController(ui::Accelerator(ui::VKEY_MODECHANGE, ui::EF_NONE));
+  controller->FlushMojoForTesting();
+
+  EXPECT_EQ(1, client.show_mode_indicator_count_);
+}
+
+TEST_F(AcceleratorControllerTest,
+       ChangeIMEMode_ModeIndicatorVisibleSwitchesInputMethod) {
+  ImeController* controller = Shell::Get()->ime_controller();
+
+  TestImeControllerClient client;
+  controller->SetClient(client.CreateInterfacePtr());
+
+  controller->ShowModeIndicator(gfx::Rect(10, 10), base::ASCIIToUTF16("test"));
+  EXPECT_EQ(0, client.next_ime_count_);
+
+  ProcessInController(ui::Accelerator(ui::VKEY_MODECHANGE, ui::EF_NONE));
+  controller->FlushMojoForTesting();
+
+  EXPECT_EQ(1, client.next_ime_count_);
+}
+
 }  // namespace ash
diff --git a/ash/accelerators/accelerator_table_unittest.cc b/ash/accelerators/accelerator_table_unittest.cc
index 8fcb3c2..95cf786 100644
--- a/ash/accelerators/accelerator_table_unittest.cc
+++ b/ash/accelerators/accelerator_table_unittest.cc
@@ -17,10 +17,10 @@
 namespace {
 
 // The number of non-Search-based accelerators.
-constexpr int kNonSearchAcceleratorsNum = 91;
+constexpr int kNonSearchAcceleratorsNum = 92;
 // The hash of non-Search-based accelerators. See HashAcceleratorData().
 constexpr char kNonSearchAcceleratorsHash[] =
-    "5b2317174d8863dc27000162f4ed2287";
+    "2fc4ce8b0d4f3629b7a4c9bdf1fa0deb";
 
 struct Cmp {
   bool operator()(const AcceleratorData& lhs,
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index c0f5062..6f29011 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -157,6 +157,9 @@
   // remove this from objects it's observing.
   if (!is_shutdown_)
     Shutdown();
+
+  if (client_)
+    client_->OnAppListControllerDestroyed();
 }
 
 // static
@@ -171,11 +174,6 @@
   client_ = client;
 }
 
-void AppListControllerImpl::BindRequest(
-    mojom::AppListControllerRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
 app_list::AppListModel* AppListControllerImpl::GetModel() {
   return model_.get();
 }
@@ -589,10 +587,6 @@
   return model_->state_fullscreen();
 }
 
-void AppListControllerImpl::FlushForTesting() {
-  bindings_.FlushForTesting();
-}
-
 void AppListControllerImpl::OnShellDestroying() {
   // Stop observing at the beginning of ~Shell to avoid unnecessary work during
   // Shell shutdown.
@@ -989,22 +983,6 @@
     client_->GetSearchResultContextMenuModel(result_id, std::move(callback));
 }
 
-void AppListControllerImpl::SearchResultContextMenuItemSelected(
-    const std::string& result_id,
-    int command_id,
-    int event_flags,
-    mojom::AppListLaunchType launch_type) {
-  if (launch_type == mojom::AppListLaunchType::kAppSearchResult &&
-      app_list::IsCommandIdAnAppLaunch(command_id)) {
-    RecordAppLaunched(mojom::AppListLaunchedFrom::kLaunchedFromSearchBox);
-  }
-
-  if (client_) {
-    client_->SearchResultContextMenuItemSelected(result_id, command_id,
-                                                 event_flags);
-  }
-}
-
 void AppListControllerImpl::ViewShown(int64_t display_id) {
   if (app_list_features::IsEmbeddedAssistantUIEnabled() &&
       GetAssistantViewDelegate()->GetUiModel()->ui_mode() !=
@@ -1066,18 +1044,6 @@
     client_->GetContextMenuModel(profile_id_, id, std::move(callback));
 }
 
-void AppListControllerImpl::ContextMenuItemSelected(
-    const std::string& id,
-    int command_id,
-    int event_flags,
-    mojom::AppListLaunchedFrom launched_from) {
-  if (app_list::IsCommandIdAnAppLaunch(command_id))
-    RecordAppLaunched(launched_from);
-
-  if (client_)
-    client_->ContextMenuItemSelected(profile_id_, id, command_id, event_flags);
-}
-
 void AppListControllerImpl::ShowWallpaperContextMenu(
     const gfx::Point& onscreen_location,
     ui::MenuSourceType source_type) {
@@ -1199,6 +1165,13 @@
     state_transition_animation_callback_.Run(state);
 }
 
+void AppListControllerImpl::GetAppLaunchedMetricParams(
+    app_list::AppLaunchedMetricParams* metric_params) {
+  metric_params->app_list_view_state = GetAppListViewState();
+  metric_params->is_tablet_mode = IsTabletMode();
+  metric_params->home_launcher_shown = presenter_.home_launcher_shown();
+}
+
 void AppListControllerImpl::RecordAppLaunched(
     mojom::AppListLaunchedFrom launched_from) {
   app_list::RecordAppListAppLaunched(launched_from, GetAppListViewState(),
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h
index f181a39b..49ba387 100644
--- a/ash/app_list/app_list_controller_impl.h
+++ b/ash/app_list/app_list_controller_impl.h
@@ -36,8 +36,6 @@
 #include "ash/wm/tablet_mode/tablet_mode_observer.h"
 #include "base/observer_list.h"
 #include "components/sync/model/string_ordinal.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
 
 class PrefRegistrySimple;
 
@@ -54,7 +52,6 @@
 // state.
 class ASH_EXPORT AppListControllerImpl
     : public app_list::AppListController,
-      public mojom::AppListController,
       public SessionObserver,
       public app_list::AppListModelObserver,
       public app_list::AppListViewDelegate,
@@ -71,22 +68,15 @@
       public HomeLauncherGestureHandlerObserver,
       public HomeScreenDelegate {
  public:
-  using AppListItemMetadataPtr = mojom::AppListItemMetadataPtr;
-  using SearchResultMetadataPtr = mojom::SearchResultMetadataPtr;
   AppListControllerImpl();
   ~AppListControllerImpl() override;
 
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
-  // Binds the mojom::AppListController interface request to this object.
-  void BindRequest(mojom::AppListControllerRequest request);
-
   app_list::AppListPresenterImpl* presenter() { return &presenter_; }
 
   // app_list::AppListController:
   void SetClient(app_list::AppListClient* client) override;
-
-  // mojom::AppListController:
   void AddItem(AppListItemMetadataPtr app_item) override;
   void AddItemToFolder(AppListItemMetadataPtr app_item,
                        const std::string& folder_id) override;
@@ -184,11 +174,6 @@
   void GetSearchResultContextMenuModel(
       const std::string& result_id,
       GetContextMenuModelCallback callback) override;
-  void SearchResultContextMenuItemSelected(
-      const std::string& result_id,
-      int command_id,
-      int event_flags,
-      mojom::AppListLaunchType launch_type) override;
   void ViewShown(int64_t display_id) override;
   void ViewClosing() override;
   void ViewClosed() override;
@@ -199,11 +184,6 @@
                     mojom::AppListLaunchedFrom launched_from) override;
   void GetContextMenuModel(const std::string& id,
                            GetContextMenuModelCallback callback) override;
-  void ContextMenuItemSelected(
-      const std::string& id,
-      int command_id,
-      int event_flags,
-      mojom::AppListLaunchedFrom launched_from) override;
   void ShowWallpaperContextMenu(const gfx::Point& onscreen_location,
                                 ui::MenuSourceType source_type) override;
   bool ProcessHomeLauncherGesture(ui::GestureEvent* event,
@@ -222,6 +202,8 @@
   void MarkAssistantPrivacyInfoDismissed() override;
   void OnStateTransitionAnimationCompleted(
       ash::mojom::AppListViewState state) override;
+  void GetAppLaunchedMetricParams(
+      app_list::AppLaunchedMetricParams* metric_params) override;
 
   void AddObserver(AppListControllerObserver* observer);
   void RemoveObserver(AppListControllerObserver* obsever);
@@ -230,8 +212,6 @@
   void NotifyAppListVisibilityChanged(bool visible, int64_t display_id);
   void NotifyAppListTargetVisibilityChanged(bool visible);
 
-  void FlushForTesting();
-
   // ShellObserver:
   void OnShellDestroying() override;
 
@@ -367,9 +347,6 @@
   // in destruction.
   app_list::AppListPresenterImpl presenter_;
 
-  // Bindings for the AppListController interface.
-  mojo::BindingSet<mojom::AppListController> bindings_;
-
   // True if the on-screen keyboard is shown.
   bool onscreen_keyboard_shown_ = false;
 
diff --git a/ash/app_list/app_list_metrics.h b/ash/app_list/app_list_metrics.h
index afdc671..67cf6ec 100644
--- a/ash/app_list/app_list_metrics.h
+++ b/ash/app_list/app_list_metrics.h
@@ -254,6 +254,19 @@
   kEnterFullscreenSearch
 };
 
+// Parameters to call RecordAppListAppLaunched. Passed to code that does not
+// directly have access to them, such ash AppListMenuModelAdapter.
+struct AppLaunchedMetricParams {
+  ash::mojom::AppListLaunchedFrom launched_from =
+      ash::mojom::AppListLaunchedFrom::kLaunchedFromGrid;
+  ash::mojom::AppListLaunchType search_launch_type =
+      ash::mojom::AppListLaunchType::kSearchResult;
+  ash::mojom::AppListViewState app_list_view_state =
+      ash::mojom::AppListViewState::kClosed;
+  bool is_tablet_mode = false;
+  bool home_launcher_shown = false;
+};
+
 void RecordFolderShowHideAnimationSmoothness(int actual_frames,
                                              int ideal_duration_ms,
                                              float refresh_rate);
diff --git a/ash/app_list/app_list_unittest.cc b/ash/app_list/app_list_unittest.cc
index ed49122..75ab567 100644
--- a/ash/app_list/app_list_unittest.cc
+++ b/ash/app_list/app_list_unittest.cc
@@ -46,20 +46,12 @@
   generator.set_current_screen_location(
       app_list_button->GetBoundsInScreen().CenterPoint());
   generator.ClickLeftButton();
-  // Flush the mojo message from Ash to Chrome to show the app list.
-  controller->FlushForTesting();
   EXPECT_TRUE(presenter->GetTargetVisibility());
-  // Flush the mojo message from Chrome to Ash reporting the visibility change.
-  EXPECT_TRUE(controller->GetTargetVisibility());
   EXPECT_EQ(1u, app_list_container->children().size());
   EXPECT_TRUE(app_list_button->IsShowingAppList());
 
   // Click the button again to dismiss the app list; it will animate to close.
   generator.ClickLeftButton();
-  // Flush the mojo message from Ash to Chrome to hide the app list.
-  controller->FlushForTesting();
-  EXPECT_FALSE(presenter->GetTargetVisibility());
-  // Flush the mojo message from Chrome to Ash reporting the visibility change.
   EXPECT_FALSE(controller->GetTargetVisibility());
   EXPECT_EQ(1u, app_list_container->children().size());
   EXPECT_FALSE(app_list_button->IsShowingAppList());
diff --git a/ash/app_list/app_list_view_delegate.h b/ash/app_list/app_list_view_delegate.h
index a2f88b65..ad1e530 100644
--- a/ash/app_list/app_list_view_delegate.h
+++ b/ash/app_list/app_list_view_delegate.h
@@ -30,6 +30,7 @@
 namespace app_list {
 
 class AppListModel;
+struct AppLaunchedMetricParams;
 class SearchModel;
 
 class ASH_PUBLIC_EXPORT AppListViewDelegate {
@@ -93,16 +94,6 @@
       const std::string& result_id,
       GetContextMenuModelCallback callback) = 0;
 
-  // Invoked when a context menu item of a search result is clicked.
-  // |result_id| is the clicked SearchResult's id
-  // |command_id| is the clicked menu item's command id
-  // |event_flags| is flags from the event which triggered this command
-  virtual void SearchResultContextMenuItemSelected(
-      const std::string& result_id,
-      int command_id,
-      int event_flags,
-      ash::mojom::AppListLaunchType launch_type) = 0;
-
   // Invoked when the app list is shown.
   virtual void ViewShown(int64_t display_id) = 0;
 
@@ -133,16 +124,6 @@
   virtual void GetContextMenuModel(const std::string& id,
                                    GetContextMenuModelCallback callback) = 0;
 
-  // Invoked when a context menu item of an app list item is clicked.
-  // |id| is the clicked AppListItem's id
-  // |command_id| is the clicked menu item's command id
-  // |event_flags| is flags from the event which triggered this command
-  virtual void ContextMenuItemSelected(
-      const std::string& id,
-      int command_id,
-      int event_flags,
-      ash::mojom::AppListLaunchedFrom launched_from) = 0;
-
   // Show wallpaper context menu from the specified onscreen location.
   virtual void ShowWallpaperContextMenu(const gfx::Point& onscreen_location,
                                         ui::MenuSourceType source_type) = 0;
@@ -193,6 +174,10 @@
   // Called when close button in the Assistant privacy info view is pressed to
   // indicate not to show the view any more.
   virtual void MarkAssistantPrivacyInfoDismissed() = 0;
+
+  // Fills the given AppLaunchedMetricParams with info known by the delegate.
+  virtual void GetAppLaunchedMetricParams(
+      AppLaunchedMetricParams* metric_params) = 0;
 };
 
 }  // namespace app_list
diff --git a/ash/app_list/test/app_list_test_helper.cc b/ash/app_list/test/app_list_test_helper.cc
index c2a1868..47c31e6 100644
--- a/ash/app_list/test/app_list_test_helper.cc
+++ b/ash/app_list/test/app_list_test_helper.cc
@@ -35,7 +35,6 @@
 }
 
 void AppListTestHelper::WaitUntilIdle() {
-  app_list_controller_->FlushForTesting();
   base::RunLoop().RunUntilIdle();
 }
 
diff --git a/ash/app_list/test/app_list_test_helper.h b/ash/app_list/test/app_list_test_helper.h
index 4a1001a..89a795b0 100644
--- a/ash/app_list/test/app_list_test_helper.h
+++ b/ash/app_list/test/app_list_test_helper.h
@@ -24,8 +24,7 @@
   AppListTestHelper();
   ~AppListTestHelper();
 
-  // Show the app list in |display_id|, and wait until animation and mojo calls
-  // finish.
+  // Show the app list in |display_id|, and wait until animation finishes.
   // Note: we usually don't care about the show source in tests.
   void ShowAndRunLoop(uint64_t display_id);
 
@@ -33,23 +32,22 @@
   void Show(uint64_t display_id);
 
   // Show the app list in |display_id| triggered with |show_source|, and wait
-  // until animation and mojo calls finish.
+  // until animation finishes.
   void ShowAndRunLoop(uint64_t display_id,
                       app_list::AppListShowSource show_source);
 
-  // Dismiss the app list, and wait until animation and mojo calls finish.
+  // Dismiss the app list, and wait until animation finishes.
   void DismissAndRunLoop();
 
   // Dismiss the app list.
   void Dismiss();
 
-  // Toggle the app list in |display_id|, and wait until animation and mojo
-  // calls finish.
+  // Toggle the app list in |display_id|, and wait until animation finishes.
   // Note: we usually don't care about the show source in tests.
   void ToggleAndRunLoop(uint64_t display_id);
 
   // Toggle the app list in |display_id| triggered with |show_source|, and wait
-  // until animation and mojo calls finish.
+  // until animation finishes.
   void ToggleAndRunLoop(uint64_t display_id,
                         app_list::AppListShowSource show_source);
 
@@ -60,7 +58,7 @@
   // Check the current app list view state.
   void CheckState(ash::mojom::AppListViewState state);
 
-  // Run all pending in message loop and flush all mojo calls.
+  // Run all pending in message loop to wait for animation to finish.
   void WaitUntilIdle();
 
   app_list::AppListView* GetAppListView();
diff --git a/ash/app_list/test/app_list_test_view_delegate.cc b/ash/app_list/test/app_list_test_view_delegate.cc
index e7d9de63..f03b6b1 100644
--- a/ash/app_list/test/app_list_test_view_delegate.cc
+++ b/ash/app_list/test/app_list_test_view_delegate.cc
@@ -164,6 +164,9 @@
 
 void AppListTestViewDelegate::MarkAssistantPrivacyInfoDismissed() {}
 
+void AppListTestViewDelegate::GetAppLaunchedMetricParams(
+    app_list::AppLaunchedMetricParams* metric_params) {}
+
 void AppListTestViewDelegate::RecordAppLaunched(
     ash::mojom::AppListLaunchedFrom launched_from) {
   app_list::RecordAppListAppLaunched(launched_from, model_->state_fullscreen(),
diff --git a/ash/app_list/test/app_list_test_view_delegate.h b/ash/app_list/test/app_list_test_view_delegate.h
index 3d8c16b..16d4116f 100644
--- a/ash/app_list/test/app_list_test_view_delegate.h
+++ b/ash/app_list/test/app_list_test_view_delegate.h
@@ -76,11 +76,6 @@
   void GetSearchResultContextMenuModel(
       const std::string& result_id,
       GetContextMenuModelCallback callback) override;
-  void SearchResultContextMenuItemSelected(
-      const std::string& result_id,
-      int command_id,
-      int event_flags,
-      ash::mojom::AppListLaunchType launch_type) override {}
   void ViewShown(int64_t display_id) override {}
   void DismissAppList() override;
   void ViewClosing() override {}
@@ -92,11 +87,6 @@
                     ash::mojom::AppListLaunchedFrom launched_from) override;
   void GetContextMenuModel(const std::string& id,
                            GetContextMenuModelCallback callback) override;
-  void ContextMenuItemSelected(
-      const std::string& id,
-      int command_id,
-      int event_flags,
-      ash::mojom::AppListLaunchedFrom launched_from) override {}
   void ShowWallpaperContextMenu(const gfx::Point& onscreen_location,
                                 ui::MenuSourceType source_type) override;
   bool ProcessHomeLauncherGesture(ui::GestureEvent* event,
@@ -114,6 +104,8 @@
   bool ShouldShowAssistantPrivacyInfo() const override;
   void MaybeIncreaseAssistantPrivacyInfoShownCount() override;
   void MarkAssistantPrivacyInfoDismissed() override;
+  void GetAppLaunchedMetricParams(
+      app_list::AppLaunchedMetricParams* metric_params) override;
 
   // Do a bulk replacement of the items in the model.
   void ReplaceTestModel(int item_count);
diff --git a/ash/app_list/test/test_app_list_client.h b/ash/app_list/test/test_app_list_client.h
index 6ca8d929..dff11810 100644
--- a/ash/app_list/test/test_app_list_client.h
+++ b/ash/app_list/test/test_app_list_client.h
@@ -20,6 +20,7 @@
   ~TestAppListClient() override;
 
   // app_list::AppListClient:
+  void OnAppListControllerDestroyed() override {}
   void StartSearch(const base::string16& trimmed_query) override {}
   void OpenSearchResult(const std::string& result_id,
                         int event_flags,
@@ -32,9 +33,6 @@
   void GetSearchResultContextMenuModel(
       const std::string& result_id,
       GetContextMenuModelCallback callback) override;
-  void SearchResultContextMenuItemSelected(const std::string& result_id,
-                                           int command_id,
-                                           int event_flags) override {}
   void ViewClosing() override {}
   void ViewShown(int64_t display_id) override {}
   void ActivateItem(int profile_id,
@@ -43,10 +41,6 @@
   void GetContextMenuModel(int profile_id,
                            const std::string& id,
                            GetContextMenuModelCallback callback) override;
-  void ContextMenuItemSelected(int profile_id,
-                               const std::string& id,
-                               int command_id,
-                               int event_flags) override {}
   void OnAppListTargetVisibilityChanged(bool visible) override {}
   void OnAppListVisibilityChanged(bool visible) override {}
   void OnFolderCreated(int profile_id,
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc
index 507fcb9..0a1242b 100644
--- a/ash/app_list/views/app_list_item_view.cc
+++ b/ash/app_list/views/app_list_item_view.cc
@@ -12,6 +12,7 @@
 #include "ash/app_list/app_list_view_delegate.h"
 #include "ash/app_list/model/app_list_folder_item.h"
 #include "ash/app_list/model/app_list_item.h"
+#include "ash/app_list/views/app_list_menu_model_adapter.h"
 #include "ash/app_list/views/apps_grid_view.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_switches.h"
@@ -479,9 +480,13 @@
   AdaptBoundsForSelectionHighlight(&anchor_rect);
   views::View::ConvertRectToScreen(apps_grid_view_, &anchor_rect);
 
+  AppLaunchedMetricParams metric_params = {
+      ash::mojom::AppListLaunchedFrom::kLaunchedFromGrid};
+  delegate_->GetAppLaunchedMetricParams(&metric_params);
+
   context_menu_ = std::make_unique<AppListMenuModelAdapter>(
       item_weak_->GetMetadata()->id, std::move(menu_model), GetWidget(),
-      source_type, this, AppListMenuModelAdapter::FULLSCREEN_APP_GRID,
+      source_type, metric_params, AppListMenuModelAdapter::FULLSCREEN_APP_GRID,
       base::BindOnce(&AppListItemView::OnMenuClosed,
                      weak_ptr_factory_.GetWeakPtr()),
       apps_grid_view_->IsTabletMode());
@@ -509,14 +514,6 @@
                      weak_ptr_factory_.GetWeakPtr(), point, source_type));
 }
 
-void AppListItemView::ExecuteCommand(int command_id, int event_flags) {
-  if (item_weak_) {
-    delegate_->ContextMenuItemSelected(
-        item_weak_->id(), command_id, event_flags,
-        ash::mojom::AppListLaunchedFrom::kLaunchedFromGrid);
-  }
-}
-
 bool AppListItemView::ShouldEnterPushedState(const ui::Event& event) {
   // Don't enter pushed state for ET_GESTURE_TAP_DOWN so that hover gray
   // background does not show up during scroll.
diff --git a/ash/app_list/views/app_list_item_view.h b/ash/app_list/views/app_list_item_view.h
index cb3e405..2d971b61 100644
--- a/ash/app_list/views/app_list_item_view.h
+++ b/ash/app_list/views/app_list_item_view.h
@@ -12,7 +12,6 @@
 
 #include "ash/app_list/app_list_export.h"
 #include "ash/app_list/model/app_list_item_observer.h"
-#include "ash/app_list/views/app_list_menu_model_adapter.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
@@ -20,6 +19,10 @@
 #include "ui/views/context_menu_controller.h"
 #include "ui/views/controls/button/button.h"
 
+namespace ui {
+class SimpleMenuModel;
+}  // namespace ui
+
 namespace views {
 class ImageView;
 class Label;
@@ -29,14 +32,13 @@
 namespace app_list {
 
 class AppListItem;
+class AppListMenuModelAdapter;
 class AppListViewDelegate;
 class AppsGridView;
 
-class APP_LIST_EXPORT AppListItemView
-    : public views::Button,
-      public views::ContextMenuController,
-      public AppListItemObserver,
-      public AppListMenuModelAdapter::Delegate {
+class APP_LIST_EXPORT AppListItemView : public views::Button,
+                                        public views::ContextMenuController,
+                                        public AppListItemObserver {
  public:
   // Internal class name.
   static const char kViewClassName[];
@@ -201,9 +203,6 @@
   void ItemPercentDownloadedChanged() override;
   void ItemBeingDestroyed() override;
 
-  // AppListMenuModelAdapter::Delegate overrides;
-  void ExecuteCommand(int command_id, int event_flags) override;
-
   // Returns the radius of preview circle.
   int GetPreviewCircleRadius() const;
 
diff --git a/ash/app_list/views/app_list_menu_model_adapter.cc b/ash/app_list/views/app_list_menu_model_adapter.cc
index 3ff32e54..1439264 100644
--- a/ash/app_list/views/app_list_menu_model_adapter.cc
+++ b/ash/app_list/views/app_list_menu_model_adapter.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "ash/app_list/app_list_metrics.h"
 #include "ash/public/cpp/app_menu_constants.h"
 #include "base/metrics/histogram_macros.h"
 #include "ui/views/controls/menu/menu_runner.h"
@@ -17,7 +18,7 @@
     std::unique_ptr<ui::SimpleMenuModel> menu_model,
     views::Widget* widget_owner,
     ui::MenuSourceType source_type,
-    Delegate* delegate,
+    const AppLaunchedMetricParams& metric_params,
     AppListViewAppType type,
     base::OnceClosure on_menu_closed_callback,
     bool is_tablet_mode)
@@ -27,9 +28,8 @@
                                source_type,
                                std::move(on_menu_closed_callback),
                                is_tablet_mode),
-      delegate_(delegate),
+      metric_params_(metric_params),
       type_(type) {
-  DCHECK(delegate_);
   DCHECK_NE(AppListViewAppType::APP_LIST_APP_TYPE_LAST, type);
 }
 
@@ -151,8 +151,31 @@
 }
 
 void AppListMenuModelAdapter::ExecuteCommand(int id, int mouse_event_flags) {
-  delegate_->ExecuteCommand(id, mouse_event_flags);
   RecordExecuteCommandHistogram(id);
+  MaybeRecordAppLaunched(id);
+
+  // Note that ExecuteCommand might delete us.
+  ash::AppMenuModelAdapter::ExecuteCommand(id, mouse_event_flags);
+}
+
+void AppListMenuModelAdapter::MaybeRecordAppLaunched(int command_id) {
+  // Early out if |command_id| is not considered as app launch.
+  if (!IsCommandIdAnAppLaunch(command_id))
+    return;
+
+  // Note that |search_launch_type| only matters when |launched_from| is
+  // kLaunchedFromSearchBox. Early out if it is not launched as an app search
+  // result.
+  if (metric_params_.launched_from ==
+          ash::mojom::AppListLaunchedFrom::kLaunchedFromSearchBox &&
+      metric_params_.search_launch_type !=
+          ash::mojom::AppListLaunchType::kAppSearchResult) {
+    return;
+  }
+
+  RecordAppListAppLaunched(
+      metric_params_.launched_from, metric_params_.app_list_view_state,
+      metric_params_.is_tablet_mode, metric_params_.home_launcher_shown);
 }
 
 }  // namespace app_list
diff --git a/ash/app_list/views/app_list_menu_model_adapter.h b/ash/app_list/views/app_list_menu_model_adapter.h
index 53081eb..1d6d37d2 100644
--- a/ash/app_list/views/app_list_menu_model_adapter.h
+++ b/ash/app_list/views/app_list_menu_model_adapter.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "ash/app_list/app_list_export.h"
+#include "ash/app_list/app_list_metrics.h"
 #include "ash/app_menu/app_menu_model_adapter.h"
 #include "ui/base/models/simple_menu_model.h"
 #include "ui/base/ui_base_types.h"
@@ -35,18 +36,11 @@
     APP_LIST_APP_TYPE_LAST
   };
 
-  // A delegate class of the menu with implementation of menu behaviors,
-  // which should be the view showing this menu.
-  class Delegate {
-   public:
-    virtual void ExecuteCommand(int command_id, int event_flags) {}
-  };
-
   AppListMenuModelAdapter(const std::string& app_id,
                           std::unique_ptr<ui::SimpleMenuModel> menu_model,
                           views::Widget* widget_owner,
                           ui::MenuSourceType source_type,
-                          Delegate* delegate,
+                          const AppLaunchedMetricParams& metric_params,
                           AppListViewAppType type,
                           base::OnceClosure on_menu_closed_callback,
                           bool is_tablet_mode);
@@ -60,8 +54,11 @@
   void ExecuteCommand(int id, int mouse_event_flags) override;
 
  private:
-  // The delegate, usually the owning view, which is used to execute commands.
-  Delegate* const delegate_;
+  // Calls RecordAppListAppLaunched() to record app launch related metrics if
+  // conditions are met.
+  void MaybeRecordAppLaunched(int command_id);
+
+  const AppLaunchedMetricParams metric_params_;
 
   // The type of app which is using this object to show a menu.
   const AppListViewAppType type_;
diff --git a/ash/app_list/views/app_list_menu_model_adapter_unittest.cc b/ash/app_list/views/app_list_menu_model_adapter_unittest.cc
index f1e3351..1df2ab3 100644
--- a/ash/app_list/views/app_list_menu_model_adapter_unittest.cc
+++ b/ash/app_list/views/app_list_menu_model_adapter_unittest.cc
@@ -10,22 +10,6 @@
 
 namespace app_list {
 
-namespace {
-
-class MockAppListMenuModelAdapterDelegate
-    : public AppListMenuModelAdapter::Delegate {
- public:
-  MockAppListMenuModelAdapterDelegate() = default;
-  virtual ~MockAppListMenuModelAdapterDelegate() = default;
-
-  void ExecuteCommand(int command_id, int event_flags) override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockAppListMenuModelAdapterDelegate);
-};
-
-}  // namespace
-
 class AppListMenuModelAdapterTest : public views::ViewsTestBase {
  public:
   AppListMenuModelAdapterTest() {}
@@ -33,12 +17,9 @@
 
   void SetUp() override {
     views::ViewsTestBase::SetUp();
-    mock_app_list_menu_model_adapter_delegate_ =
-        std::make_unique<MockAppListMenuModelAdapterDelegate>();
     app_list_menu_model_adapter_ = std::make_unique<AppListMenuModelAdapter>(
         "test-app-id", std::make_unique<ui::SimpleMenuModel>(nullptr), nullptr,
-        ui::MenuSourceType::MENU_SOURCE_TYPE_LAST,
-        mock_app_list_menu_model_adapter_delegate_.get(),
+        ui::MenuSourceType::MENU_SOURCE_TYPE_LAST, AppLaunchedMetricParams(),
         AppListMenuModelAdapter::FULLSCREEN_APP_GRID, base::OnceClosure(),
         false /* is_tablet_mode */);
   }
@@ -46,9 +27,6 @@
   std::unique_ptr<AppListMenuModelAdapter> app_list_menu_model_adapter_;
 
  private:
-  std::unique_ptr<MockAppListMenuModelAdapterDelegate>
-      mock_app_list_menu_model_adapter_delegate_;
-
   DISALLOW_COPY_AND_ASSIGN(AppListMenuModelAdapterTest);
 };
 
diff --git a/ash/app_list/views/search_result_tile_item_view.cc b/ash/app_list/views/search_result_tile_item_view.cc
index 11b5a67b..290aa9e 100644
--- a/ash/app_list/views/search_result_tile_item_view.cc
+++ b/ash/app_list/views/search_result_tile_item_view.cc
@@ -362,9 +362,14 @@
   // Anchor the menu to the same rect that is used for selection highlight.
   anchor_rect.ClampToCenteredSize(AppListConfig::instance().grid_focus_size());
 
+  AppLaunchedMetricParams metric_params = {
+      ash::mojom::AppListLaunchedFrom::kLaunchedFromSearchBox,
+      ash::mojom::AppListLaunchType::kAppSearchResult};
+  view_delegate_->GetAppLaunchedMetricParams(&metric_params);
+
   context_menu_ = std::make_unique<AppListMenuModelAdapter>(
-      result()->id(), std::move(menu_model), GetWidget(), source_type, this,
-      GetAppType(),
+      result()->id(), std::move(menu_model), GetWidget(), source_type,
+      metric_params, GetAppType(),
       base::BindOnce(&SearchResultTileItemView::OnMenuClosed,
                      weak_ptr_factory_.GetWeakPtr()),
       view_delegate_->GetSearchModel()->tablet_mode());
@@ -380,14 +385,6 @@
   OnBlur();
 }
 
-void SearchResultTileItemView::ExecuteCommand(int command_id, int event_flags) {
-  if (result()) {
-    view_delegate_->SearchResultContextMenuItemSelected(
-        result()->id(), command_id, event_flags,
-        ash::mojom::AppListLaunchType::kAppSearchResult);
-  }
-}
-
 void SearchResultTileItemView::ActivateResult(int event_flags) {
   LogAppLaunchForSuggestedApp();
 
diff --git a/ash/app_list/views/search_result_tile_item_view.h b/ash/app_list/views/search_result_tile_item_view.h
index 86a4f15..808613e 100644
--- a/ash/app_list/views/search_result_tile_item_view.h
+++ b/ash/app_list/views/search_result_tile_item_view.h
@@ -32,8 +32,7 @@
 // that has SearchResult::DisplayType DISPLAY_TILE or DISPLAY_RECOMMENDATION.
 class APP_LIST_EXPORT SearchResultTileItemView
     : public SearchResultBaseView,
-      public views::ContextMenuController,
-      public AppListMenuModelAdapter::Delegate {
+      public views::ContextMenuController {
  public:
   SearchResultTileItemView(AppListViewDelegate* view_delegate,
                            ash::PaginationModel* pagination_model,
@@ -69,9 +68,6 @@
                                   const gfx::Point& point,
                                   ui::MenuSourceType source_type) override;
 
-  // AppListMenuModelAdapter::Delegate overrides:
-  void ExecuteCommand(int command_id, int event_flags) override;
-
  private:
   // Launch the result and log to various histograms.
   void ActivateResult(int event_flags);
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc
index d3299553..0b8e84f3 100644
--- a/ash/app_list/views/search_result_view.cc
+++ b/ash/app_list/views/search_result_view.cc
@@ -458,24 +458,21 @@
   if (!menu_model || context_menu_->IsShowingMenu())
     return;
 
+  AppLaunchedMetricParams metric_params = {
+      ash::mojom::AppListLaunchedFrom::kLaunchedFromSearchBox,
+      ash::mojom::AppListLaunchType::kSearchResult};
+  view_delegate_->GetAppLaunchedMetricParams(&metric_params);
+
   context_menu_ = std::make_unique<AppListMenuModelAdapter>(
-      std::string(), std::move(menu_model), GetWidget(), source_type, this,
-      AppListMenuModelAdapter::SEARCH_RESULT, base::OnceClosure(),
-      view_delegate_->GetSearchModel()->tablet_mode());
+      std::string(), std::move(menu_model), GetWidget(), source_type,
+      metric_params, AppListMenuModelAdapter::SEARCH_RESULT,
+      base::OnceClosure(), view_delegate_->GetSearchModel()->tablet_mode());
   context_menu_->Run(gfx::Rect(point, gfx::Size()),
                      views::MenuAnchorPosition::kTopLeft,
                      views::MenuRunner::HAS_MNEMONICS);
   source->RequestFocus();
 }
 
-void SearchResultView::ExecuteCommand(int command_id, int event_flags) {
-  if (result()) {
-    view_delegate_->SearchResultContextMenuItemSelected(
-        result()->id(), command_id, event_flags,
-        ash::mojom::AppListLaunchType::kSearchResult);
-  }
-}
-
 void SearchResultView::SetDisplayIcon(const gfx::ImageSkia& source) {
   display_icon_->SetImage(source);
   display_icon_->SetVisible(!source.isNull());
diff --git a/ash/app_list/views/search_result_view.h b/ash/app_list/views/search_result_view.h
index beba147..48bacf7 100644
--- a/ash/app_list/views/search_result_view.h
+++ b/ash/app_list/views/search_result_view.h
@@ -43,8 +43,7 @@
 class APP_LIST_EXPORT SearchResultView
     : public SearchResultBaseView,
       public views::ContextMenuController,
-      public SearchResultActionsViewDelegate,
-      public AppListMenuModelAdapter::Delegate {
+      public SearchResultActionsViewDelegate {
  public:
   // Internal class name.
   static const char kViewClassName[];
@@ -56,9 +55,6 @@
   // Sets/gets SearchResult displayed by this view.
   void OnResultChanged() override;
 
-  // AppListMenuModelAdapter::Delegate overrides:
-  void ExecuteCommand(int command_id, int event_flags) override;
-
   bool selected() const { return selected_; }
 
   void SetDisplayIcon(const gfx::ImageSkia& source);
diff --git a/ash/assistant/assistant_controller.cc b/ash/assistant/assistant_controller.cc
index 6174b8f..b90b964 100644
--- a/ash/assistant/assistant_controller.cc
+++ b/ash/assistant/assistant_controller.cc
@@ -325,6 +325,11 @@
     assistant_ui_controller_.CloseUi(AssistantExitPoint::kUnspecified);
 }
 
+void AssistantController::OnLockedFullScreenStateChanged(bool enabled) {
+  if (enabled)
+    assistant_ui_controller_.CloseUi(AssistantExitPoint::kUnspecified);
+}
+
 base::WeakPtr<AssistantController> AssistantController::GetWeakPtr() {
   return weak_factory_.GetWeakPtr();
 }
diff --git a/ash/assistant/assistant_controller.h b/ash/assistant/assistant_controller.h
index 8da48e0..6384a718 100644
--- a/ash/assistant/assistant_controller.h
+++ b/ash/assistant/assistant_controller.h
@@ -158,6 +158,7 @@
   // mojom::VoiceInteractionObserver:
   void OnVoiceInteractionStatusChanged(
       mojom::VoiceInteractionState state) override;
+  void OnLockedFullScreenStateChanged(bool enabled) override;
 
   // The observer list should be initialized early so that sub-controllers may
   // register as observers during their construction.
diff --git a/ash/assistant/assistant_ui_controller.cc b/ash/assistant/assistant_ui_controller.cc
index 9a73478..207cca6c 100644
--- a/ash/assistant/assistant_ui_controller.cc
+++ b/ash/assistant/assistant_ui_controller.cc
@@ -352,10 +352,12 @@
 }
 
 void AssistantUiController::ShowUi(AssistantEntryPoint entry_point) {
-  if (!Shell::Get()
-           ->voice_interaction_controller()
-           ->settings_enabled()
-           .value_or(false)) {
+  auto* voice_interaction_controller =
+      Shell::Get()->voice_interaction_controller();
+
+  if (!voice_interaction_controller->settings_enabled().value_or(false) ||
+      voice_interaction_controller->locked_full_screen_enabled().value_or(
+          false)) {
     return;
   }
 
diff --git a/ash/display/cursor_window_controller.cc b/ash/display/cursor_window_controller.cc
index 9e3efea..139dff55 100644
--- a/ash/display/cursor_window_controller.cc
+++ b/ash/display/cursor_window_controller.cc
@@ -219,7 +219,7 @@
 void CursorWindowController::UpdateLocation() {
   if (!cursor_window_)
     return;
-  gfx::Point point = Shell::Get()->aura_env()->last_mouse_location();
+  gfx::Point point = aura::Env::GetInstance()->last_mouse_location();
   point.Offset(-bounds_in_screen_.x(), -bounds_in_screen_.y());
   point.Offset(-hot_point_.x(), -hot_point_.y());
   gfx::Rect bounds = cursor_window_->bounds();
@@ -371,7 +371,7 @@
 
 void CursorWindowController::UpdateCursorView() {
   cursor_view_.reset(new cursor::CursorView(
-      container_, Shell::Get()->aura_env()->last_mouse_location(),
+      container_, aura::Env::GetInstance()->last_mouse_location(),
       is_cursor_motion_blur_enabled_));
   UpdateCursorImage();
 }
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc
index 61043361..abce6ed4 100644
--- a/ash/display/display_manager_unittest.cc
+++ b/ash/display/display_manager_unittest.cc
@@ -2072,7 +2072,7 @@
   // Make sure just rotating will not change native location.
   UpdateDisplay("300x200,200x150");
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
-  aura::Env* env = Shell::Get()->aura_env();
+  aura::Env* env = aura::Env::GetInstance();
 
   ui::test::EventGenerator generator1(root_windows[0]);
   ui::test::EventGenerator generator2(root_windows[1]);
diff --git a/ash/display/display_util.cc b/ash/display/display_util.cc
index 40693a1..cbece91d 100644
--- a/ash/display/display_util.cc
+++ b/ash/display/display_util.cc
@@ -135,7 +135,7 @@
       Shell::GetPrimaryRootWindow()->GetHost()->ConvertScreenInPixelsToDIP(
           &new_point_in_screen);
     }
-    Shell::Get()->aura_env()->SetLastMouseLocation(new_point_in_screen);
+    aura::Env::GetInstance()->SetLastMouseLocation(new_point_in_screen);
   }
 }
 
diff --git a/ash/display/extended_mouse_warp_controller_unittest.cc b/ash/display/extended_mouse_warp_controller_unittest.cc
index d99f540a..8a0de72 100644
--- a/ash/display/extended_mouse_warp_controller_unittest.cc
+++ b/ash/display/extended_mouse_warp_controller_unittest.cc
@@ -450,7 +450,7 @@
                                0);
 
   // Mouse cursor should be warped into secondary display.
-  location_in_screen_dip = Shell::Get()->aura_env()->last_mouse_location();
+  location_in_screen_dip = aura::Env::GetInstance()->last_mouse_location();
   EXPECT_TRUE(
       root_windows[1]->GetBoundsInScreen().Contains(location_in_screen_dip));
 
@@ -464,7 +464,7 @@
                                0);
 
   // Mouse cursor should be warped into first display.
-  location_in_screen_dip = Shell::Get()->aura_env()->last_mouse_location();
+  location_in_screen_dip = aura::Env::GetInstance()->last_mouse_location();
   EXPECT_TRUE(
       root_windows[0]->GetBoundsInScreen().Contains(location_in_screen_dip));
 
@@ -473,11 +473,11 @@
   // the offset in screen coordinates should be 2/0.8, which is 2.5. The end of
   // primary display in screen coordinates is 250. So x-coordinate of mouse
   // cursor in screen coordinates should be 247.
-  EXPECT_EQ(247, Shell::Get()->aura_env()->last_mouse_location().x());
+  EXPECT_EQ(247, aura::Env::GetInstance()->last_mouse_location().x());
 
   // Get cursor's location in host native coordinates.
   gfx::Point location_in_host_dip;
-  location_in_screen_dip = Shell::Get()->aura_env()->last_mouse_location();
+  location_in_screen_dip = aura::Env::GetInstance()->last_mouse_location();
   location_in_host_dip = location_in_screen_dip;
   ::wm::ConvertPointFromScreen(root_windows[0], &location_in_host_dip);
   location_in_host_native = location_in_host_dip;
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc
index 3ce1796..a0cf6e5 100644
--- a/ash/display/mirror_window_controller.cc
+++ b/ash/display/mirror_window_controller.cc
@@ -125,7 +125,7 @@
 }
 
 ui::ContextFactoryPrivate* GetContextFactoryPrivate() {
-  return Shell::Get()->aura_env()->context_factory_private();
+  return aura::Env::GetInstance()->context_factory_private();
 }
 
 }  // namespace
diff --git a/ash/display/mouse_cursor_event_filter_unittest.cc b/ash/display/mouse_cursor_event_filter_unittest.cc
index ae69bb7..dc7fa63 100644
--- a/ash/display/mouse_cursor_event_filter_unittest.cc
+++ b/ash/display/mouse_cursor_event_filter_unittest.cc
@@ -51,12 +51,12 @@
   // Touch the right edge of the primary root window. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 11)));
   EXPECT_EQ("501,11",  // by 2px.
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   // Touch the left edge of the secondary root window. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(500, 11)));
   EXPECT_EQ("498,11",  // by 2px.
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   // Touch the left edge of the primary root window.
   EXPECT_FALSE(TestIfMouseWarpsAt(gfx::Point(0, 11)));
@@ -87,13 +87,13 @@
   // because 1px left of (0, 500) is outside the primary root window.
   EXPECT_FALSE(TestIfMouseWarpsAt(gfx::Point(501, 500)));
   EXPECT_EQ("501,500",
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   // Touch the left edge of the secondary root window. Pointer should warp
   // because 1px left of (0, 480) is inside the primary root window.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(500, 480)));
   EXPECT_EQ("498,480",  // by 2px.
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 }
 
 // Verifies if the mouse pointer correctly moves between displays with
@@ -108,18 +108,18 @@
                                                   .placement_list[0]
                                                   .position);
 
-  Shell::Get()->aura_env()->SetLastMouseLocation(gfx::Point(900, 123));
+  aura::Env::GetInstance()->SetLastMouseLocation(gfx::Point(900, 123));
 
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 123)));
   EXPECT_EQ("500,123",
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
   // Touch the edge of 2nd display again and make sure it warps to
   // 1st dislay.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(500, 123)));
   // TODO(oshima): Due to a bug in EventGenerator, the screen coordinates
   // is shrunk by dsf once. Fix this.
   EXPECT_EQ("498,61",
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 }
 
 // Verifies if MouseCursorEventFilter::set_mouse_warp_enabled() works as
@@ -130,12 +130,12 @@
   event_filter()->set_mouse_warp_enabled(false);
   EXPECT_FALSE(TestIfMouseWarpsAt(gfx::Point(499, 11)));
   EXPECT_EQ("499,11",
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   event_filter()->set_mouse_warp_enabled(true);
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 11)));
   EXPECT_EQ("501,11",
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 }
 
 // Verifies cursor's device scale factor is updated when a cursor has moved
diff --git a/ash/display/root_window_transformers_unittest.cc b/ash/display/root_window_transformers_unittest.cc
index 8b0416bc..163c58ca 100644
--- a/ash/display/root_window_transformers_unittest.cc
+++ b/ash/display/root_window_transformers_unittest.cc
@@ -168,7 +168,7 @@
   generator1.MoveMouseToInHost(40, 80);
   EXPECT_EQ("50,90", event_handler.GetLocationAndReset());
   EXPECT_EQ("50,90",
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
   EXPECT_EQ(display::Display::ROTATE_0,
             GetActiveDisplayRotation(display1.id()));
   EXPECT_EQ(display::Display::ROTATE_0, GetActiveDisplayRotation(display2_id));
@@ -189,7 +189,7 @@
   generator1.MoveMouseToInHost(39, 120);
   EXPECT_EQ("110,70", event_handler.GetLocationAndReset());
   EXPECT_EQ("110,70",
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
   EXPECT_EQ(display::Display::ROTATE_90,
             GetActiveDisplayRotation(display1.id()));
   EXPECT_EQ(display::Display::ROTATE_0, GetActiveDisplayRotation(display2_id));
@@ -215,7 +215,7 @@
   generator2.MoveMouseToInHost(172, 219);
   EXPECT_EQ("95,80", event_handler.GetLocationAndReset());
   EXPECT_EQ("145,200",
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
   EXPECT_EQ(display::Display::ROTATE_90,
             GetActiveDisplayRotation(display1.id()));
   EXPECT_EQ(display::Display::ROTATE_270,
diff --git a/ash/display/screen_ash.cc b/ash/display/screen_ash.cc
index 8baad56..6d389992 100644
--- a/ash/display/screen_ash.cc
+++ b/ash/display/screen_ash.cc
@@ -89,7 +89,7 @@
 ScreenAsh::~ScreenAsh() = default;
 
 gfx::Point ScreenAsh::GetCursorScreenPoint() {
-  return Shell::Get()->aura_env()->last_mouse_location();
+  return aura::Env::GetInstance()->last_mouse_location();
 }
 
 bool ScreenAsh::IsWindowUnderCursor(gfx::NativeWindow window) {
diff --git a/ash/display/screen_orientation_controller.cc b/ash/display/screen_orientation_controller.cc
index 041a579..64ba553 100644
--- a/ash/display/screen_orientation_controller.cc
+++ b/ash/display/screen_orientation_controller.cc
@@ -14,6 +14,7 @@
 #include "ash/wm/window_state.h"
 #include "base/auto_reset.h"
 #include "base/command_line.h"
+#include "base/stl_util.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
@@ -339,9 +340,8 @@
 void ScreenOrientationController::OnWindowVisibilityChanged(
     aura::Window* window,
     bool visible) {
-  if (lock_info_map_.find(window) == lock_info_map_.end())
-    return;
-  ApplyLockForActiveWindow();
+  if (base::ContainsKey(lock_info_map_, window))
+    ApplyLockForActiveWindow();
 }
 
 void ScreenOrientationController::OnAccelerometerUpdated(
@@ -594,37 +594,47 @@
   for (auto* window : mru_windows) {
     if (!window->TargetVisibility())
       continue;
-    for (auto& pair : lock_info_map_) {
-      if (pair.first->TargetVisibility() && window->Contains(pair.first)) {
-        if (pair.second.orientation_lock == OrientationLockType::kCurrent) {
-          // If the app requested "current" without previously
-          // specifying an orientation, use the current rotation.
-          pair.second.orientation_lock =
-              RotationToOrientation(natural_orientation_, current_rotation_);
-          LockRotationToOrientation(pair.second.orientation_lock);
-        } else {
-          const auto orientation_lock = ResolveOrientationLock(
-              pair.second.orientation_lock, user_locked_orientation_);
-          LockRotationToOrientation(orientation_lock);
-          if (pair.second.lock_completion_behavior ==
-              LockCompletionBehavior::DisableSensor) {
-            pair.second.lock_completion_behavior = LockCompletionBehavior::None;
-            pair.second.orientation_lock = orientation_lock;
-          }
-        }
-        return;
-      }
-    }
-    // The default orientation for all chrome browser/apps windows is
-    // ANY, so use the user_locked_orientation_;
-    if (window->TargetVisibility() &&
-        static_cast<AppType>(window->GetProperty(aura::client::kAppType)) !=
-            AppType::OTHERS) {
-      LockRotationToOrientation(user_locked_orientation_);
+    if (ApplyLockForWindowIfPossible(window))
       return;
+  }
+
+  LockRotationToOrientation(user_locked_orientation_);
+}
+
+bool ScreenOrientationController::ApplyLockForWindowIfPossible(
+    const aura::Window* window) {
+  for (auto& pair : lock_info_map_) {
+    const aura::Window* lock_window = pair.first;
+    LockInfo& lock_info = pair.second;
+    if (lock_window->TargetVisibility() && window->Contains(lock_window)) {
+      if (lock_info.orientation_lock == OrientationLockType::kCurrent) {
+        // If the app requested "current" without previously
+        // specifying an orientation, use the current rotation.
+        lock_info.orientation_lock =
+            RotationToOrientation(natural_orientation_, current_rotation_);
+        LockRotationToOrientation(lock_info.orientation_lock);
+      } else {
+        const auto orientation_lock = ResolveOrientationLock(
+            lock_info.orientation_lock, user_locked_orientation_);
+        LockRotationToOrientation(orientation_lock);
+        if (lock_info.lock_completion_behavior ==
+            LockCompletionBehavior::DisableSensor) {
+          lock_info.lock_completion_behavior = LockCompletionBehavior::None;
+          lock_info.orientation_lock = orientation_lock;
+        }
+      }
+      return true;
     }
   }
-  LockRotationToOrientation(user_locked_orientation_);
+
+  // The default orientation for all chrome browser/apps windows is
+  // ANY, so use the user_locked_orientation_;
+  if (static_cast<AppType>(window->GetProperty(aura::client::kAppType)) !=
+      AppType::OTHERS) {
+    LockRotationToOrientation(user_locked_orientation_);
+    return true;
+  }
+  return false;
 }
 
 bool ScreenOrientationController::IsRotationAllowedInLockedState(
diff --git a/ash/display/screen_orientation_controller.h b/ash/display/screen_orientation_controller.h
index a1b13e03d..1e7dabe 100644
--- a/ash/display/screen_orientation_controller.h
+++ b/ash/display/screen_orientation_controller.h
@@ -68,13 +68,12 @@
     virtual ~Observer() {}
   };
 
-  // Controls the behavior after lock is applied to the window (when
-  // the window becomes active window). |DisableSensor| disables
-  // the sensor based rotation and locks to the specific orientation.
-  // For example, PORTRAIT may rotate to PORTRAIT_PRIMARY or
-  // PORTRAIT_SECONDARY, and will allow rotate between these two.
-  // |DisableSensor| will lock the orientation to the one of them
-  // after locked to disalow the sensor basd rotation.
+  // Controls the behavior after lock is applied to the window (when the window
+  // becomes the active window). |DisableSensor| disables the sensor-based
+  // rotation and locks to the specific orientation. For example, PORTRAIT may
+  // rotate to PORTRAIT_PRIMARY or PORTRAIT_SECONDARY, and will allow rotation
+  // between these two. |DisableSensor| disallows the sensor-based rotation by
+  // locking the rotation to whichever specific orientation is applied.
   enum class LockCompletionBehavior {
     None,
     DisableSensor,
@@ -206,6 +205,10 @@
   // window, and applies it. If there is none, rotation lock will be removed.
   void ApplyLockForActiveWindow();
 
+  // If there is a rotation lock that can be applied to window, applies it and
+  // returns true. Otherwise returns false.
+  bool ApplyLockForWindowIfPossible(const aura::Window* window);
+
   // Both |OrientationLockType::kLandscape| and
   // |OrientationLock::kPortrait| allow for rotation between the
   // two angles of the same screen orientation
diff --git a/ash/display/screen_position_controller_unittest.cc b/ash/display/screen_position_controller_unittest.cc
index fc67cee..046e39adf 100644
--- a/ash/display/screen_position_controller_unittest.cc
+++ b/ash/display/screen_position_controller_unittest.cc
@@ -271,10 +271,10 @@
 class ConvertToScreenEventHandler : public ui::EventHandler {
  public:
   ConvertToScreenEventHandler() : could_convert_to_screen_(true) {
-    Shell::Get()->aura_env()->AddPreTargetHandler(this);
+    aura::Env::GetInstance()->AddPreTargetHandler(this);
   }
   ~ConvertToScreenEventHandler() override {
-    Shell::Get()->aura_env()->RemovePreTargetHandler(this);
+    aura::Env::GetInstance()->RemovePreTargetHandler(this);
   }
 
   bool could_convert_to_screen() const { return could_convert_to_screen_; }
@@ -316,7 +316,7 @@
   // ScreenPositionClient has been detached from the root window.
   GetEventGenerator()->MoveMouseTo(800, 200);
   EXPECT_TRUE(window_->GetBoundsInScreen().Contains(
-      Shell::Get()->aura_env()->last_mouse_location()));
+      aura::Env::GetInstance()->last_mouse_location()));
 
   aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows();
   aura::WindowTracker tracker;
diff --git a/ash/display/unified_mouse_warp_controller_unittest.cc b/ash/display/unified_mouse_warp_controller_unittest.cc
index 7280e46ba..36efbfe 100644
--- a/ash/display/unified_mouse_warp_controller_unittest.cc
+++ b/ash/display/unified_mouse_warp_controller_unittest.cc
@@ -86,7 +86,7 @@
 
     aura::Window* root = Shell::GetPrimaryRootWindow();
     gfx::Point new_location_in_unified_host =
-        Shell::Get()->aura_env()->last_mouse_location();
+        aura::Env::GetInstance()->last_mouse_location();
     // Convert screen to the host.
     root->GetHost()->ConvertDIPToPixels(&new_location_in_unified_host);
 
@@ -148,7 +148,7 @@
     for (const auto& group : warp_groups) {
       EXPECT_TRUE(TestIfMouseWarpsAt(group.native_point_at_edge));
 
-      gfx::Point new_location = Shell::Get()->aura_env()->last_mouse_location();
+      gfx::Point new_location = aura::Env::GetInstance()->last_mouse_location();
       EXPECT_EQ(group.expected_point_after_warp, new_location);
 
       // Convert screen to the host.
@@ -399,12 +399,12 @@
   // Touch the right edge of the first display. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 10)));
   EXPECT_EQ("501,10",  // by 2px.
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   // Touch the left edge of the second display. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(600, 10)));
   EXPECT_EQ("498,10",  // by 2px.
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
   {
     SCOPED_TRACE("1x1 NO WARP");
     NoWarpTestBody();
@@ -418,12 +418,12 @@
   // Touch the right edge of the first display. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 10)));
   EXPECT_EQ("250,5",  // moved to 501 by 2px, divided by 2 (dsf).
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   // Touch the left edge of the second display. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(600, 10)));
   EXPECT_EQ("249,5",  // moved to 498 by 2px, divided by 2 (dsf).
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   {
     SCOPED_TRACE("2x1 NO WARP");
@@ -438,12 +438,12 @@
   // Touch the right edge of the first display. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 10)));
   EXPECT_EQ("501,10",  // by 2px.
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   // Touch the left edge of the second display. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(600, 10)));
   EXPECT_EQ("498,10",  // by 2px.
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
   {
     SCOPED_TRACE("1x2 NO WARP");
     NoWarpTestBody();
@@ -457,12 +457,12 @@
   // Touch the right edge of the first display. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 10)));
   EXPECT_EQ("250,5",  // by 2px.
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
 
   // Touch the left edge of the second display. Pointer should warp.
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(600, 10)));
   EXPECT_EQ("249,5",  // moved to 498 by 2px, divided by 2 (dsf).
-            Shell::Get()->aura_env()->last_mouse_location().ToString());
+            aura::Env::GetInstance()->last_mouse_location().ToString());
   {
     SCOPED_TRACE("1x2 NO WARP");
     NoWarpTestBody();
diff --git a/ash/display/window_tree_host_manager_unittest.cc b/ash/display/window_tree_host_manager_unittest.cc
index fe85b10..7fe678c 100644
--- a/ash/display/window_tree_host_manager_unittest.cc
+++ b/ash/display/window_tree_host_manager_unittest.cc
@@ -1469,7 +1469,7 @@
   UpdateDisplay("200x200,300x300");
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
 
-  aura::Env* env = Shell::Get()->aura_env();
+  aura::Env* env = aura::Env::GetInstance();
 
   ui::test::EventGenerator generator_on_2nd(root_windows[1]);
 
@@ -1511,7 +1511,7 @@
   UpdateDisplay("500x300");
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
 
-  aura::Env* env = Shell::Get()->aura_env();
+  aura::Env* env = aura::Env::GetInstance();
 
   ui::test::EventGenerator generator(root_windows[0]);
 
@@ -1546,7 +1546,7 @@
   EXPECT_EQ("-300,0 300x300",
             display_manager()->GetSecondaryDisplay().bounds().ToString());
 
-  aura::Env* env = Shell::Get()->aura_env();
+  aura::Env* env = aura::Env::GetInstance();
 
   // Set the initial position.
   root_windows[0]->MoveCursorTo(gfx::Point(-150, 250));
@@ -1573,7 +1573,7 @@
        UpdateMouseLocationAfterDisplayChange_SwapPrimary) {
   UpdateDisplay("200x200,200x200*2/r");
 
-  aura::Env* env = Shell::Get()->aura_env();
+  aura::Env* env = aura::Env::GetInstance();
   Shell* shell = Shell::Get();
   WindowTreeHostManager* window_tree_host_manager =
       shell->window_tree_host_manager();
@@ -1597,7 +1597,7 @@
 // and rotation are updated when the primary display is disconnected.
 TEST_F(WindowTreeHostManagerTest,
        UpdateMouseLocationAfterDisplayChange_PrimaryDisconnected) {
-  aura::Env* env = Shell::Get()->aura_env();
+  aura::Env* env = aura::Env::GetInstance();
   Shell* shell = Shell::Get();
   WindowTreeHostManager* window_tree_host_manager =
       shell->window_tree_host_manager();
@@ -1628,7 +1628,7 @@
 
 TEST_F(WindowTreeHostManagerTest,
        UpdateNonVisibleMouseLocationAfterDisplayChange_PrimaryDisconnected) {
-  aura::Env* env = Shell::Get()->aura_env();
+  aura::Env* env = aura::Env::GetInstance();
   Shell* shell = Shell::Get();
   WindowTreeHostManager* window_tree_host_manager =
       shell->window_tree_host_manager();
diff --git a/ash/drag_drop/drag_drop_controller.cc b/ash/drag_drop/drag_drop_controller.cc
index 4afe4d3..9142611 100644
--- a/ash/drag_drop/drag_drop_controller.cc
+++ b/ash/drag_drop/drag_drop_controller.cc
@@ -175,7 +175,7 @@
     // We need to transfer the current gesture sequence and the GR's touch event
     // queue to the |drag_drop_tracker_|'s capture window so that when it takes
     // capture, it still gets a valid gesture state.
-    Shell::Get()->aura_env()->gesture_recognizer()->TransferEventsTo(
+    aura::Env::GetInstance()->gesture_recognizer()->TransferEventsTo(
         source_window, tracker->capture_window(),
         ui::TransferTouchesBehavior::kCancel);
     // We also send a gesture end to the source window so it can clear state.
diff --git a/ash/events/event_rewriter_controller.cc b/ash/events/event_rewriter_controller.cc
index 4c4edce..b1206462 100644
--- a/ash/events/event_rewriter_controller.cc
+++ b/ash/events/event_rewriter_controller.cc
@@ -21,7 +21,7 @@
 
 EventRewriterController::EventRewriterController() {
   // Add the controller as an observer for new root windows.
-  Shell::Get()->aura_env()->AddObserver(this);
+  aura::Env::GetInstance()->AddObserver(this);
 
   std::unique_ptr<KeyboardDrivenEventRewriter> keyboard_driven_event_rewriter =
       std::make_unique<KeyboardDrivenEventRewriter>();
@@ -35,7 +35,7 @@
 }
 
 EventRewriterController::~EventRewriterController() {
-  Shell::Get()->aura_env()->RemoveObserver(this);
+  aura::Env::GetInstance()->RemoveObserver(this);
   // Remove the rewriters from every root window EventSource and destroy them.
   for (const auto& rewriter : rewriters_) {
     for (auto* window : Shell::GetAllRootWindows())
diff --git a/ash/events/select_to_speak_event_handler_unittest.cc b/ash/events/select_to_speak_event_handler_unittest.cc
index 7bfa88b..3e03cebc 100644
--- a/ash/events/select_to_speak_event_handler_unittest.cc
+++ b/ash/events/select_to_speak_event_handler_unittest.cc
@@ -108,7 +108,7 @@
     // This test triggers a resize of WindowTreeHost, which will end up
     // throttling events. set_throttle_input_on_resize_for_testing() disables
     // this.
-    Shell::Get()->aura_env()->set_throttle_input_on_resize_for_testing(false);
+    aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
     delegate_ = std::make_unique<TestDelegate>();
     generator_ = AshTestBase::GetEventGenerator();
     CurrentContext()->AddPreTargetHandler(&event_capturer_);
diff --git a/ash/events/switch_access_event_handler_unittest.cc b/ash/events/switch_access_event_handler_unittest.cc
index 1788a35..b7520993 100644
--- a/ash/events/switch_access_event_handler_unittest.cc
+++ b/ash/events/switch_access_event_handler_unittest.cc
@@ -78,7 +78,7 @@
     // This test triggers a resize of WindowTreeHost, which will end up
     // throttling events. set_throttle_input_on_resize_for_testing() disables
     // this.
-    Shell::Get()->aura_env()->set_throttle_input_on_resize_for_testing(false);
+    aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
     delegate_ = std::make_unique<TestDelegate>();
 
     generator_ = AshTestBase::GetEventGenerator();
diff --git a/ash/extended_desktop_unittest.cc b/ash/extended_desktop_unittest.cc
index be43f19..fcffa167 100644
--- a/ash/extended_desktop_unittest.cc
+++ b/ash/extended_desktop_unittest.cc
@@ -349,7 +349,7 @@
 TEST_F(ExtendedDesktopTest, Capture) {
   // This test deals with input events but not visuals so don't throttle input
   // on visuals.
-  Shell::Get()->aura_env()->set_throttle_input_on_resize_for_testing(false);
+  aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
 
   UpdateDisplay("1000x600,600x400");
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
@@ -884,7 +884,7 @@
 TEST_F(ExtendedDesktopTest, PassiveGrab) {
   // This test deals with input events but not visuals so don't throttle input
   // on visuals.
-  Shell::Get()->aura_env()->set_throttle_input_on_resize_for_testing(false);
+  aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
   EventLocationRecordingEventHandler event_handler;
   Shell::Get()->AddPreTargetHandler(&event_handler);
 
diff --git a/ash/ime/ime_controller.cc b/ash/ime/ime_controller.cc
index 5c30e5aa..0f16039 100644
--- a/ash/ime/ime_controller.cc
+++ b/ash/ime/ime_controller.cc
@@ -222,6 +222,13 @@
   client_.FlushForTesting();
 }
 
+void ImeController::ShowOrSwitchIme() {
+  if (mode_indicator_observer_->active_widget())
+    SwitchToNextIme();
+  else
+    client_->ShowModeIndicator();
+}
+
 bool ImeController::IsCapsLockEnabled() const {
   return is_caps_lock_enabled_;
 }
diff --git a/ash/ime/ime_controller.h b/ash/ime/ime_controller.h
index 5bbe32b..25228625 100644
--- a/ash/ime/ime_controller.h
+++ b/ash/ime/ime_controller.h
@@ -130,6 +130,10 @@
     return mode_indicator_observer_.get();
   }
 
+  // Asynchronously show the current IME mode indicator. If it's already shown,
+  // switch to the next available IME.
+  void ShowOrSwitchIme();
+
  private:
   // Returns the IDs of the subset of input methods which are active and are
   // associated with |accelerator|. For example, two Japanese IMEs can be
diff --git a/ash/ime/test_ime_controller_client.cc b/ash/ime/test_ime_controller_client.cc
index 5d495f2..65943b6 100644
--- a/ash/ime/test_ime_controller_client.cc
+++ b/ash/ime/test_ime_controller_client.cc
@@ -58,4 +58,8 @@
   is_casting_ = enabled;
 }
 
+void TestImeControllerClient::ShowModeIndicator() {
+  ++show_mode_indicator_count_;
+}
+
 }  // namespace ash
diff --git a/ash/ime/test_ime_controller_client.h b/ash/ime/test_ime_controller_client.h
index a2b122ac..40f8ab1 100644
--- a/ash/ime/test_ime_controller_client.h
+++ b/ash/ime/test_ime_controller_client.h
@@ -28,6 +28,7 @@
                               OverrideKeyboardKeysetCallback callback) override;
   void UpdateMirroringState(bool enabled) override;
   void UpdateCastingState(bool enabled) override;
+  void ShowModeIndicator() override;
 
   int next_ime_count_ = 0;
   int last_used_ime_count_ = 0;
@@ -39,6 +40,7 @@
       chromeos::input_method::mojom::ImeKeyset::kNone;
   bool is_mirroring_ = false;
   bool is_casting_ = false;
+  int show_mode_indicator_count_ = 0;
 
  private:
   mojo::Binding<mojom::ImeControllerClient> binding_;
diff --git a/ash/keyboard/ash_keyboard_controller_unittest.cc b/ash/keyboard/ash_keyboard_controller_unittest.cc
index 0afc87d..7ed54ac 100644
--- a/ash/keyboard/ash_keyboard_controller_unittest.cc
+++ b/ash/keyboard/ash_keyboard_controller_unittest.cc
@@ -396,16 +396,10 @@
       target_bounds.size(),
       keyboard_controller()->GetKeyboardWindow()->GetTargetBounds().size());
 
-  // Set the container type to kFullscreen.
-  EXPECT_TRUE(test_client()->SetContainerType(
-      keyboard::mojom::ContainerType::kFullscreen, base::nullopt));
-  EXPECT_EQ(keyboard::mojom::ContainerType::kFullscreen,
-            keyboard_controller()->GetActiveContainerType());
-
   // Setting the container type to the current type should fail.
   EXPECT_FALSE(test_client()->SetContainerType(
-      keyboard::mojom::ContainerType::kFullscreen, base::nullopt));
-  EXPECT_EQ(keyboard::mojom::ContainerType::kFullscreen,
+      keyboard::mojom::ContainerType::kFloating, base::nullopt));
+  EXPECT_EQ(keyboard::mojom::ContainerType::kFloating,
             keyboard_controller()->GetActiveContainerType());
 }
 
diff --git a/ash/keyboard/ui/BUILD.gn b/ash/keyboard/ui/BUILD.gn
index 88bf659..ed41d81 100644
--- a/ash/keyboard/ui/BUILD.gn
+++ b/ash/keyboard/ui/BUILD.gn
@@ -19,8 +19,6 @@
     "container_floating_behavior.h",
     "container_full_width_behavior.cc",
     "container_full_width_behavior.h",
-    "container_fullscreen_behavior.cc",
-    "container_fullscreen_behavior.h",
     "display_util.cc",
     "display_util.h",
     "drag_descriptor.h",
diff --git a/ash/keyboard/ui/container_fullscreen_behavior.cc b/ash/keyboard/ui/container_fullscreen_behavior.cc
deleted file mode 100644
index 76621d6..0000000
--- a/ash/keyboard/ui/container_fullscreen_behavior.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/keyboard/ui/container_fullscreen_behavior.h"
-
-#include "ui/aura/window.h"
-
-namespace keyboard {
-
-ContainerFullscreenBehavior::ContainerFullscreenBehavior(Delegate* delegate)
-    : ContainerFullWidthBehavior(delegate) {}
-
-ContainerFullscreenBehavior::~ContainerFullscreenBehavior() {}
-
-gfx::Rect ContainerFullscreenBehavior::AdjustSetBoundsRequest(
-    const gfx::Rect& display_bounds,
-    const gfx::Rect& requested_bounds_in_screen_coords) {
-  return display_bounds;
-}
-
-void ContainerFullscreenBehavior::SetCanonicalBounds(
-    aura::Window* container,
-    const gfx::Rect& display_bounds) {
-  container->SetBounds(display_bounds);
-}
-
-gfx::Rect ContainerFullscreenBehavior::GetOccludedBounds(
-    const gfx::Rect& visual_bounds_in_screen) const {
-  return occluded_bounds_;
-}
-
-mojom::ContainerType ContainerFullscreenBehavior::GetType() const {
-  return mojom::ContainerType::kFullscreen;
-}
-
-void ContainerFullscreenBehavior::SetOccludedBounds(
-    const gfx::Rect& occluded_bounds) {
-  occluded_bounds_ = occluded_bounds;
-}
-
-}  //  namespace keyboard
diff --git a/ash/keyboard/ui/container_fullscreen_behavior.h b/ash/keyboard/ui/container_fullscreen_behavior.h
deleted file mode 100644
index c9474c9..0000000
--- a/ash/keyboard/ui/container_fullscreen_behavior.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_KEYBOARD_UI_CONTAINER_FULLSCREEN_BEHAVIOR_H_
-#define ASH_KEYBOARD_UI_CONTAINER_FULLSCREEN_BEHAVIOR_H_
-
-#include "ash/keyboard/ui/container_full_width_behavior.h"
-#include "ash/keyboard/ui/keyboard_export.h"
-
-namespace keyboard {
-
-class KEYBOARD_EXPORT ContainerFullscreenBehavior
-    : public ContainerFullWidthBehavior {
- public:
-  explicit ContainerFullscreenBehavior(Delegate* controller);
-  ~ContainerFullscreenBehavior() override;
-
-  // ContainerFullWidthBehavior overrides
-  gfx::Rect AdjustSetBoundsRequest(
-      const gfx::Rect& display_bounds,
-      const gfx::Rect& requested_bounds_in_screen_coords) override;
-  void SetCanonicalBounds(aura::Window* container,
-                          const gfx::Rect& display_bounds) override;
-  mojom::ContainerType GetType() const override;
-  void SetOccludedBounds(const gfx::Rect& occluded_bounds_in_window) override;
-  gfx::Rect GetOccludedBounds(
-      const gfx::Rect& visual_bounds_in_screen) const override;
-
- private:
-  // The occluded bounds for fullscreen behavior is determined on the IME
-  // extension side, so it has to be passed here via the extension API.
-  gfx::Rect occluded_bounds_;
-};
-
-}  // namespace keyboard
-
-#endif  // ASH_KEYBOARD_UI_CONTAINER_FULLSCREEN_BEHAVIOR_H_
diff --git a/ash/keyboard/ui/keyboard_controller.cc b/ash/keyboard/ui/keyboard_controller.cc
index 77b1ca2..56855d8 100644
--- a/ash/keyboard/ui/keyboard_controller.cc
+++ b/ash/keyboard/ui/keyboard_controller.cc
@@ -8,7 +8,6 @@
 
 #include "ash/keyboard/ui/container_floating_behavior.h"
 #include "ash/keyboard/ui/container_full_width_behavior.h"
-#include "ash/keyboard/ui/container_fullscreen_behavior.h"
 #include "ash/keyboard/ui/display_util.h"
 #include "ash/keyboard/ui/keyboard_controller_observer.h"
 #include "ash/keyboard/ui/keyboard_layout_manager.h"
@@ -80,8 +79,6 @@
       kAllowedStateTransition = {
           // The initial ShowKeyboard scenario
           // INITIAL -> LOADING_EXTENSION -> HIDDEN -> SHOWN.
-          {KeyboardControllerState::kUnknown,
-           KeyboardControllerState::kInitial},
           {KeyboardControllerState::kInitial,
            KeyboardControllerState::kLoadingExtension},
           {KeyboardControllerState::kLoadingExtension,
@@ -274,10 +271,9 @@
 
   show_on_keyboard_window_load_ = false;
   keyboard_locked_ = false;
-  state_ = KeyboardControllerState::kUnknown;
+  DCHECK_EQ(state_, KeyboardControllerState::kInitial);
   ui_->SetController(this);
   SetContainerBehaviorInternal(mojom::ContainerType::kFullWidth);
-  ChangeState(KeyboardControllerState::kInitial);
   visual_bounds_in_root_ = gfx::Rect();
   time_of_last_blur_ = base::Time::UnixEpoch();
   UpdateInputMethodObserver();
@@ -381,17 +377,24 @@
 // private
 void KeyboardController::NotifyKeyboardBoundsChanging(
     const gfx::Rect& new_bounds_in_root) {
-  visual_bounds_in_root_ = new_bounds_in_root;
-  gfx::Rect occluded_bounds_in_screen = GetWorkspaceOccludedBoundsInScreen();
-
+  gfx::Rect occluded_bounds_in_screen;
   aura::Window* window = GetKeyboardWindow();
   if (window && window->IsVisible()) {
+    visual_bounds_in_root_ = new_bounds_in_root;
+
+    // |visual_bounds_in_root_| affects the result of
+    // GetWorkspaceOccludedBoundsInScreen. Calculate |occluded_bounds_in_screen|
+    // after updating |visual_bounds_in_root_|.
+    // TODO(andrewxu): Add the unit test case for issue 960174.
+    occluded_bounds_in_screen = GetWorkspaceOccludedBoundsInScreen();
+
     // TODO(https://crbug.com/943446): Use screen bounds for visual bounds.
     notification_manager_.SendNotifications(
         container_behavior_->OccludedBoundsAffectWorkspaceLayout(),
         new_bounds_in_root, occluded_bounds_in_screen, observer_list_);
   } else {
     visual_bounds_in_root_ = gfx::Rect();
+    occluded_bounds_in_screen = GetWorkspaceOccludedBoundsInScreen();
   }
 
   EnsureCaretInWorkArea(occluded_bounds_in_screen);
@@ -727,11 +730,6 @@
     case mojom::ContainerType::kFloating:
       container_behavior_ = std::make_unique<ContainerFloatingBehavior>(this);
       break;
-    case mojom::ContainerType::kFullscreen:
-      container_behavior_ = std::make_unique<ContainerFullscreenBehavior>(this);
-      break;
-    default:
-      NOTREACHED();
   }
 }
 
@@ -1051,8 +1049,7 @@
   // temporarily overridden by a static field in certain lock screen contexts.
   // Furthermore, floating keyboard should never affect layout.
   if (!IsKeyboardOverscrollEnabled() &&
-      container_behavior_->GetType() != mojom::ContainerType::kFloating &&
-      container_behavior_->GetType() != mojom::ContainerType::kFullscreen) {
+      container_behavior_->GetType() != mojom::ContainerType::kFloating) {
     return visual_bounds_in_root_;
   }
   return gfx::Rect();
diff --git a/ash/keyboard/ui/keyboard_controller.h b/ash/keyboard/ui/keyboard_controller.h
index e2799e0a..4a8b8ee6 100644
--- a/ash/keyboard/ui/keyboard_controller.h
+++ b/ash/keyboard/ui/keyboard_controller.h
@@ -446,7 +446,7 @@
   // the keyboard window. If not, this should be empty.
   gfx::Rect visual_bounds_in_root_;
 
-  KeyboardControllerState state_ = KeyboardControllerState::kUnknown;
+  KeyboardControllerState state_ = KeyboardControllerState::kInitial;
 
   // Keyboard configuration associated with the controller.
   mojom::KeyboardConfig keyboard_config_;
diff --git a/ash/keyboard/ui/keyboard_controller_unittest.cc b/ash/keyboard/ui/keyboard_controller_unittest.cc
index 955a76b..46935beb7 100644
--- a/ash/keyboard/ui/keyboard_controller_unittest.cc
+++ b/ash/keyboard/ui/keyboard_controller_unittest.cc
@@ -503,32 +503,6 @@
   EXPECT_TRUE(IsKeyboardDisabled());
 }
 
-TEST_F(KeyboardControllerTest, SetOccludedBoundsChangesFullscreenBounds) {
-  // Keyboard is hidden, so SetContainerType should be synchronous.
-  controller().SetContainerType(mojom::ContainerType::kFullscreen,
-                                base::nullopt, base::DoNothing());
-
-  // KeyboardController only notifies occluded bound changes when the keyboard
-  // is visible.
-  ShowKeyboard();
-
-  const gfx::Rect test_occluded_bounds(0, 10, 20, 30);
-
-  // Expect that setting the occluded bounds raises
-  // OnKeyboardWorkspaceOccludedBoundsChanged event.
-  struct MockObserver : public KeyboardControllerObserver {
-    MOCK_METHOD1(OnKeyboardWorkspaceOccludedBoundsChanged,
-                 void(const gfx::Rect& new_bounds));
-  } observer;
-
-  EXPECT_CALL(observer,
-              OnKeyboardWorkspaceOccludedBoundsChanged(test_occluded_bounds));
-
-  controller().AddObserver(&observer);
-  controller().SetOccludedBounds(test_occluded_bounds);
-  controller().RemoveObserver(&observer);
-}
-
 class KeyboardControllerAnimationTest : public KeyboardControllerTest {
  public:
   KeyboardControllerAnimationTest() {}
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc
index f0d33b57..48bd1e8 100644
--- a/ash/login/login_screen_controller.cc
+++ b/ash/login/login_screen_controller.cc
@@ -180,7 +180,7 @@
 }
 
 void LoginScreenController::ValidateParentAccessCode(
-    const AccountId& account_id,
+    const base::Optional<AccountId>& account_id,
     const std::string& code,
     OnParentAccessValidation callback) {
   if (!login_screen_client_) {
diff --git a/ash/login/login_screen_controller.h b/ash/login/login_screen_controller.h
index ef262ba..551e1a9 100644
--- a/ash/login/login_screen_controller.h
+++ b/ash/login/login_screen_controller.h
@@ -74,7 +74,7 @@
                                           OnAuthenticateCallback callback);
   void EnrollUserWithExternalBinary(OnAuthenticateCallback callback);
   void AuthenticateUserWithEasyUnlock(const AccountId& account_id);
-  void ValidateParentAccessCode(const AccountId& account_id,
+  void ValidateParentAccessCode(const base::Optional<AccountId>& account_id,
                                 const std::string& code,
                                 OnParentAccessValidation callback);
   void HardlockPod(const AccountId& account_id);
@@ -218,4 +218,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_LOGIN_LOCK_SCREEN_CONTROLLER_H_
+#endif  // ASH_LOGIN_LOGIN_SCREEN_CONTROLLER_H_
diff --git a/ash/login/mock_login_screen_client.cc b/ash/login/mock_login_screen_client.cc
index 282c753..99bbe7a7 100644
--- a/ash/login/mock_login_screen_client.cc
+++ b/ash/login/mock_login_screen_client.cc
@@ -60,7 +60,7 @@
 }
 
 void MockLoginScreenClient::ValidateParentAccessCode(
-    const AccountId& account_id,
+    const base::Optional<AccountId>& account_id,
     const std::string& code,
     ValidateParentAccessCodeCallback callback) {
   ValidateParentAccessCode_(account_id, code, callback);
diff --git a/ash/login/mock_login_screen_client.h b/ash/login/mock_login_screen_client.h
index a88525f..3736ba1 100644
--- a/ash/login/mock_login_screen_client.h
+++ b/ash/login/mock_login_screen_client.h
@@ -30,7 +30,7 @@
   MOCK_METHOD1(EnrollUserWithExternalBinary_,
                void(EnrollUserWithExternalBinaryCallback& callback));
   MOCK_METHOD3(ValidateParentAccessCode_,
-               void(const AccountId& account_id,
+               void(const base::Optional<AccountId>& account_id,
                     const std::string& access_code,
                     ValidateParentAccessCodeCallback& callback));
 
@@ -74,7 +74,7 @@
   void EnrollUserWithExternalBinary(
       EnrollUserWithExternalBinaryCallback callback) override;
   void ValidateParentAccessCode(
-      const AccountId& account_id,
+      const base::Optional<AccountId>& account_id,
       const std::string& code,
       ValidateParentAccessCodeCallback callback) override;
   MOCK_METHOD1(AuthenticateUserWithEasyUnlock,
diff --git a/ash/login/ui/parent_access_view.cc b/ash/login/ui/parent_access_view.cc
index d507c5e..af1d35b 100644
--- a/ash/login/ui/parent_access_view.cc
+++ b/ash/login/ui/parent_access_view.cc
@@ -391,7 +391,7 @@
 
 ParentAccessView::Callbacks::~Callbacks() = default;
 
-ParentAccessView::ParentAccessView(const AccountId& account_id,
+ParentAccessView::ParentAccessView(const base::Optional<AccountId>& account_id,
                                    const Callbacks& callbacks)
     : NonAccessibleView(kParentAccessViewClassName),
       callbacks_(callbacks),
diff --git a/ash/login/ui/parent_access_view.h b/ash/login/ui/parent_access_view.h
index 88dc268..856feac 100644
--- a/ash/login/ui/parent_access_view.h
+++ b/ash/login/ui/parent_access_view.h
@@ -76,9 +76,12 @@
     OnFinished on_finished;
   };
 
-  // Creates parent access view for the user identified by |account_id|.
-  // |callbacks| will be called when user performs certain actions.
-  ParentAccessView(const AccountId& account_id, const Callbacks& callbacks);
+  // Creates parent access view that will validate the parent access code for a
+  // specific child, when |account_id| is set, or to any child signed in the
+  // device, when it is empty. |callbacks| will be called when user performs
+  // certain actions.
+  ParentAccessView(const base::Optional<AccountId>& account_id,
+                   const Callbacks& callbacks);
   ~ParentAccessView() override;
 
   // views::View:
@@ -118,8 +121,9 @@
   // Callbacks to be called when user performs certain actions.
   const Callbacks callbacks_;
 
-  // Account id of the user that parent access code is processed for.
-  const AccountId account_id_;
+  // Account id of the user that parent access code is processed for. When
+  // empty, the code is processed for all the children signed in the device.
+  const base::Optional<AccountId> account_id_;
 
   State state_ = State::kNormal;
 
diff --git a/ash/login/ui/parent_access_view_unittest.cc b/ash/login/ui/parent_access_view_unittest.cc
index fc3a427..869a2699 100644
--- a/ash/login/ui/parent_access_view_unittest.cc
+++ b/ash/login/ui/parent_access_view_unittest.cc
@@ -69,7 +69,7 @@
     access_granted ? ++successful_validation_ : ++back_action_;
   }
 
-  const AccountId account_id_;
+  const base::Optional<AccountId> account_id_;
   std::unique_ptr<MockLoginScreenClient> login_client_;
 
   // Number of times the view was dismissed with back button.
diff --git a/ash/login/ui/parent_access_widget.cc b/ash/login/ui/parent_access_widget.cc
new file mode 100644
index 0000000..065e784
--- /dev/null
+++ b/ash/login/ui/parent_access_widget.cc
@@ -0,0 +1,53 @@
+// 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 "ash/login/ui/parent_access_widget.h"
+
+#include <utility>
+
+#include "ash/login/ui/parent_access_view.h"
+#include "ash/public/cpp/shell_window_ids.h"
+#include "ash/session/session_controller_impl.h"
+#include "ash/shell.h"
+#include "components/session_manager/session_manager_types.h"
+#include "ui/views/widget/widget.h"
+
+namespace ash {
+
+ParentAccessWidget::ParentAccessWidget(
+    const base::Optional<AccountId>& account_id,
+    const OnExitCallback& callback) {
+  views::Widget::InitParams widget_params;
+  // Using window frameless to be able to get focus on the view input fields,
+  // which does not work with popup type.
+  widget_params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
+  widget_params.ownership =
+      views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  widget_params.opacity = views::Widget::InitParams::OPAQUE_WINDOW;
+  widget_params.accept_events = true;
+
+  ShellWindowId parent_window_id =
+      Shell::Get()->session_controller()->GetSessionState() ==
+              session_manager::SessionState::ACTIVE
+          ? ash::kShellWindowId_SystemModalContainer
+          : ash::kShellWindowId_LockSystemModalContainer;
+  widget_params.parent =
+      ash::Shell::GetPrimaryRootWindow()->GetChildById(parent_window_id);
+
+  widget_ = std::make_unique<views::Widget>();
+  widget_->set_focus_on_creation(true);
+  widget_->Init(widget_params);
+
+  ParentAccessView::Callbacks callbacks;
+  callbacks.on_finished = callback;
+
+  widget_->SetContentsView(new ParentAccessView(account_id, callbacks));
+  widget_->CenterWindow(widget_->GetContentsView()->GetPreferredSize());
+  widget_->Show();
+  widget_->GetContentsView()->RequestFocus();
+}
+
+ParentAccessWidget::~ParentAccessWidget() = default;
+
+}  // namespace ash
diff --git a/ash/login/ui/parent_access_widget.h b/ash/login/ui/parent_access_widget.h
new file mode 100644
index 0000000..53fccf01
--- /dev/null
+++ b/ash/login/ui/parent_access_widget.h
@@ -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.
+
+#ifndef ASH_LOGIN_UI_PARENT_ACCESS_WIDGET_H_
+#define ASH_LOGIN_UI_PARENT_ACCESS_WIDGET_H_
+
+#include <memory>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "base/optional.h"
+
+class AccountId;
+
+namespace views {
+class Widget;
+}
+
+namespace ash {
+
+// Widget to display the Parent Access View in a standalone container.
+class ParentAccessWidget {
+ public:
+  using OnExitCallback = base::RepeatingCallback<void(bool success)>;
+
+  // Creates and shows the widget. When |account_id| is set, the parent
+  // access code is validated using the configuration for the provided account,
+  // when it is empty it tries to validate the access code to any child signed
+  // in the device. The |callback| is called when (a) the validation is
+  // successful or (b) the back button is pressed.
+  ParentAccessWidget(const base::Optional<AccountId>& account_id,
+                     const OnExitCallback& callback);
+
+  ~ParentAccessWidget();
+
+ private:
+  std::unique_ptr<views::Widget> widget_;
+
+  DISALLOW_COPY_AND_ASSIGN(ParentAccessWidget);
+};
+
+}  // namespace ash
+
+#endif  // ASH_LOGIN_UI_PARENT_ACCESS_WIDGET_H_
diff --git a/ash/magnifier/docked_magnifier_controller_impl.cc b/ash/magnifier/docked_magnifier_controller_impl.cc
index 9cfe9a4..02d7ff9 100644
--- a/ash/magnifier/docked_magnifier_controller_impl.cc
+++ b/ash/magnifier/docked_magnifier_controller_impl.cc
@@ -491,7 +491,7 @@
   // reflector and the viewport widget and its layers. New viewport and
   // reflector may be recreated later if |new_root_window| is not |nullptr|.
   if (reflector_) {
-    Shell::Get()->aura_env()->context_factory_private()->RemoveReflector(
+    aura::Env::GetInstance()->context_factory_private()->RemoveReflector(
         reflector_.get());
     reflector_.reset();
   }
@@ -518,10 +518,10 @@
   if (input_method_)
     input_method_->AddObserver(this);
 
-  DCHECK(Shell::Get()->aura_env()->context_factory_private());
+  DCHECK(aura::Env::GetInstance()->context_factory_private());
   DCHECK(viewport_widget_);
   reflector_ =
-      Shell::Get()->aura_env()->context_factory_private()->CreateReflector(
+      aura::Env::GetInstance()->context_factory_private()->CreateReflector(
           current_source_root_window_->layer()->GetCompositor(),
           viewport_magnifier_layer_.get());
 }
diff --git a/ash/magnifier/magnification_controller_unittest.cc b/ash/magnifier/magnification_controller_unittest.cc
index df97fb2..743eb6f7 100644
--- a/ash/magnifier/magnification_controller_unittest.cc
+++ b/ash/magnifier/magnification_controller_unittest.cc
@@ -279,7 +279,7 @@
 }
 
 TEST_F(MagnificationControllerTest, PanWindow2xLeftToRight) {
-  const aura::Env* env = Shell::Get()->aura_env();
+  const aura::Env* env = aura::Env::GetInstance();
 
   ui::test::EventGenerator* event_generator = GetEventGenerator();
   event_generator->MoveMouseToInHost(gfx::Point(0, 0));
@@ -383,7 +383,7 @@
 }
 
 TEST_F(MagnificationControllerTest, PanWindow2xRightToLeft) {
-  const aura::Env* env = Shell::Get()->aura_env();
+  const aura::Env* env = aura::Env::GetInstance();
 
   ui::test::EventGenerator* event_generator = GetEventGenerator();
   event_generator->MoveMouseToInHost(gfx::Point(799, 300));
@@ -436,7 +436,7 @@
 }
 
 TEST_F(MagnificationControllerTest, PanWindowToRight) {
-  const aura::Env* env = Shell::Get()->aura_env();
+  const aura::Env* env = aura::Env::GetInstance();
 
   ui::test::EventGenerator* event_generator = GetEventGenerator();
   event_generator->MoveMouseToInHost(gfx::Point(400, 300));
@@ -482,7 +482,7 @@
 }
 
 TEST_F(MagnificationControllerTest, PanWindowToLeft) {
-  const aura::Env* env = Shell::Get()->aura_env();
+  const aura::Env* env = aura::Env::GetInstance();
 
   ui::test::EventGenerator* event_generator = GetEventGenerator();
   event_generator->MoveMouseToInHost(gfx::Point(400, 300));
diff --git a/ash/mojo_interface_factory.cc b/ash/mojo_interface_factory.cc
index dc54cfc8..fa7e940 100644
--- a/ash/mojo_interface_factory.cc
+++ b/ash/mojo_interface_factory.cc
@@ -66,15 +66,6 @@
       std::move(request));
 }
 
-void BindAppListControllerRequestOnMainThread(
-    mojom::AppListControllerRequest request) {
-  // The AppListController is not available in KioskNext sessions.
-  // TODO(michaelpg): Also disable the Chrome AppList client in KioskNext
-  // sessions.
-  if (Shell::Get()->app_list_controller())
-    Shell::Get()->app_list_controller()->BindRequest(std::move(request));
-}
-
 void BindAssistantAlarmTimerControllerRequestOnMainThread(
     mojom::AssistantAlarmTimerControllerRequest request) {
   Shell::Get()->assistant_controller()->alarm_timer_controller()->BindRequest(
@@ -233,9 +224,6 @@
       base::BindRepeating(
           &BindAccessibilityFocusRingControllerRequestOnMainThread),
       main_thread_task_runner);
-  registry->AddInterface(
-      base::BindRepeating(&BindAppListControllerRequestOnMainThread),
-      main_thread_task_runner);
   if (chromeos::switches::IsAssistantEnabled()) {
     registry->AddInterface(
         base::BindRepeating(
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index f89bfac0..6d60872 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -151,7 +151,6 @@
     "//components/sync:rest_of_sync",
     "//mojo/public/cpp/bindings",
     "//services/service_manager/public/cpp",
-    "//services/ws/public/cpp",
     "//services/ws/public/mojom",
     "//skia/public/interfaces",
     "//ui/aura",
@@ -215,8 +214,6 @@
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/mojom",
     "//services/viz/public/interfaces",
-    "//services/ws/public/cpp:manifest",
-    "//services/ws/public/mojom",
   ]
 }
 
diff --git a/ash/public/cpp/accelerators.cc b/ash/public/cpp/accelerators.cc
index f14c370..828b4915 100644
--- a/ash/public/cpp/accelerators.cc
+++ b/ash/public/cpp/accelerators.cc
@@ -183,6 +183,9 @@
     {true, ui::VKEY_A, ui::EF_COMMAND_DOWN, START_VOICE_INTERACTION},
     {true, ui::VKEY_ASSISTANT, ui::EF_NONE, START_VOICE_INTERACTION},
 
+    // IME mode change key.
+    {true, ui::VKEY_MODECHANGE, ui::EF_NONE, SHOW_OR_SWITCH_IME},
+
     // Debugging shortcuts that need to be available to end-users in
     // release builds.
     {true, ui::VKEY_U, kDebugModifier, PRINT_UI_HIERARCHIES},
diff --git a/ash/public/cpp/accelerators.h b/ash/public/cpp/accelerators.h
index 517af75..0b47828 100644
--- a/ash/public/cpp/accelerators.h
+++ b/ash/public/cpp/accelerators.h
@@ -70,6 +70,7 @@
   SCALE_UI_RESET,
   SCALE_UI_UP,
   SHOW_IME_MENU_BUBBLE,
+  SHOW_OR_SWITCH_IME,
   SHOW_SHORTCUT_VIEWER,
   SHOW_STYLUS_TOOLS,
   SHOW_TASK_MANAGER,
diff --git a/ash/public/cpp/app_list/app_list_client.h b/ash/public/cpp/app_list/app_list_client.h
index db76d5d1b..9319db30 100644
--- a/ash/public/cpp/app_list/app_list_client.h
+++ b/ash/public/cpp/app_list/app_list_client.h
@@ -19,6 +19,8 @@
 
 namespace app_list {
 
+class AppListController;
+
 // TODO(crbug.com/958134): Remove the alias and app_list.mojom.h include.
 using AppListLaunchedFrom = ash::mojom::AppListLaunchedFrom;
 using AppListLaunchType = ash::mojom::AppListLaunchType;
@@ -35,6 +37,9 @@
 //   in Chrome.
 class ASH_PUBLIC_EXPORT AppListClient {
  public:
+  // Invoked when AppListController is destroyed.
+  virtual void OnAppListControllerDestroyed() = 0;
+
   //////////////////////////////////////////////////////////////////////////////
   // Interfaces on searching:
   // Triggers a search query.
@@ -66,13 +71,6 @@
   virtual void GetSearchResultContextMenuModel(
       const std::string& result_id,
       GetSearchResultContextMenuModelCallback callback) = 0;
-  // Invoked when a context menu item of a search result is clicked.
-  // |result_id|: the clicked search result's id.
-  // |command_id|: the clicked menu item's command id.
-  // |event_flags|: flags from the event which triggered this command.
-  virtual void SearchResultContextMenuItemSelected(const std::string& result_id,
-                                                   int command_id,
-                                                   int event_flags) = 0;
 
   //////////////////////////////////////////////////////////////////////////////
   // Interfaces on the app list UI:
@@ -100,14 +98,6 @@
   virtual void GetContextMenuModel(int profile_id,
                                    const std::string& id,
                                    GetContextMenuModelCallback callback) = 0;
-  // Invoked when a context menu item of an app list item is clicked.
-  // |id|: the clicked AppListItem's id.
-  // |command_id|: the clicked menu item's command id.
-  // |event_flags|: flags from the event which triggered this command.
-  virtual void ContextMenuItemSelected(int profile_id,
-                                       const std::string& id,
-                                       int command_id,
-                                       int event_flags) = 0;
   // Invoked when a folder is created in Ash (e.g. merge items into a folder).
   virtual void OnFolderCreated(int profile_id,
                                ash::mojom::AppListItemMetadataPtr folder) = 0;
diff --git a/ash/public/cpp/app_list/app_list_controller.h b/ash/public/cpp/app_list/app_list_controller.h
index 0c8b840e..e9cbe3f 100644
--- a/ash/public/cpp/app_list/app_list_controller.h
+++ b/ash/public/cpp/app_list/app_list_controller.h
@@ -6,6 +6,10 @@
 #define ASH_PUBLIC_CPP_APP_LIST_APP_LIST_CONTROLLER_H_
 
 #include "ash/public/cpp/ash_public_export.h"
+// TODO(crbug.com/958134): Remove.
+#include "ash/public/interfaces/app_list.mojom.h"
+#include "base/callback_forward.h"
+#include "base/strings/string16.h"
 
 namespace app_list {
 
@@ -21,12 +25,145 @@
 //   happen while installing/uninstalling apps and the app list gets toggled.
 class ASH_PUBLIC_EXPORT AppListController {
  public:
+  using AppListItemMetadataPtr = ash::mojom::AppListItemMetadataPtr;
+  using SearchResultMetadataPtr = ash::mojom::SearchResultMetadataPtr;
+
   // Gets the instance.
   static AppListController* Get();
 
   // Sets a client to handle calls from Ash.
   virtual void SetClient(AppListClient* client) = 0;
 
+  // Adds an item to AppListModel.
+  virtual void AddItem(AppListItemMetadataPtr app_item) = 0;
+
+  // Adds an item into a certain folder in AppListModel.
+  virtual void AddItemToFolder(AppListItemMetadataPtr app_item,
+                               const std::string& folder_id) = 0;
+
+  // Removes an item by its id from AppListModel.
+  virtual void RemoveItem(const std::string& id) = 0;
+
+  // Removes an item by its id, and also cleans up if its parent folder has a
+  // single child left.
+  virtual void RemoveUninstalledItem(const std::string& id) = 0;
+
+  // Moves the item with |id| to the folder with |folder_id|.
+  virtual void MoveItemToFolder(const std::string& id,
+                                const std::string& folder_id) = 0;
+
+  // Tells Ash what the current status of AppListModel should be,
+  // e.g. the model is under synchronization or in normal status.
+  virtual void SetStatus(ash::AppListModelStatus status) = 0;
+
+  // Tells Ash what the current state of the app list should be,
+  // e.g. the user is searching for something, or showing apps, etc.
+  virtual void SetState(ash::AppListState state) = 0;
+
+  // Highlights the given item in the app list. If not present and it is later
+  // added, the item will be highlighted after being added.
+  virtual void HighlightItemInstalledFromUI(const std::string& id) = 0;
+
+  // Sets whether the search engine is Google or not.
+  virtual void SetSearchEngineIsGoogle(bool is_google) = 0;
+
+  // Sets the text for screen readers on the search box, and updates the
+  // accessible names.
+  virtual void SetSearchTabletAndClamshellAccessibleName(
+      const base::string16& tablet_accessible_name,
+      const base::string16& clamshell_accessible_name) = 0;
+
+  // Sets the hint text to display when there is in input.
+  virtual void SetSearchHintText(const base::string16& hint_text) = 0;
+
+  // Sets the text for the search box's Textfield and the voice search flag.
+  virtual void UpdateSearchBox(const base::string16& text,
+                               bool initiated_by_user) = 0;
+
+  // Publishes search results to Ash to render them.
+  virtual void PublishSearchResults(
+      std::vector<SearchResultMetadataPtr> results) = 0;
+
+  // Updates an item's metadata (e.g. name, position, etc).
+  virtual void SetItemMetadata(const std::string& id,
+                               AppListItemMetadataPtr data) = 0;
+
+  // Updates an item's icon.
+  virtual void SetItemIcon(const std::string& id,
+                           const gfx::ImageSkia& icon) = 0;
+
+  // Updates whether an item is installing.
+  virtual void SetItemIsInstalling(const std::string& id,
+                                   bool is_installing) = 0;
+
+  // Updates the downloaded percentage of an item.
+  virtual void SetItemPercentDownloaded(const std::string& id,
+                                        int32_t percent_downloaded) = 0;
+
+  // Update the whole model, usually when profile changes happen in Chrome.
+  virtual void SetModelData(int profile_id,
+                            std::vector<AppListItemMetadataPtr> apps,
+                            bool is_search_engine_google) = 0;
+
+  // Updates a search rresult's metadata.
+  virtual void SetSearchResultMetadata(SearchResultMetadataPtr metadata) = 0;
+
+  // Updates whether a search result is being installed.
+  virtual void SetSearchResultIsInstalling(const std::string& id,
+                                           bool is_installing) = 0;
+
+  // Updates the download progress of a search result.
+  virtual void SetSearchResultPercentDownloaded(const std::string& id,
+                                                int32_t percent_downloaded) = 0;
+
+  // Called when the app represented by a search result is installed.
+  virtual void NotifySearchResultItemInstalled(const std::string& id) = 0;
+
+  // Returns a map from each item's id to its shown index in the app list.
+  using GetIdToAppListIndexMapCallback =
+      base::OnceCallback<void(const base::flat_map<std::string, uint16_t>&)>;
+  virtual void GetIdToAppListIndexMap(
+      GetIdToAppListIndexMapCallback callback) = 0;
+
+  // Finds the OEM folder or creates one if it doesn't exist.
+  // |oem_folder_name|: the expected name of the OEM folder while creating.
+  // |preferred_oem_position|: the preferred position of the OEM folder while
+  //                           creating; if it's invalid then the final position
+  //                           is determined in Ash.
+  // |oem_folder|: the meta data of the existing/created OEM folder.
+  using FindOrCreateOemFolderCallback =
+      base::OnceCallback<void(AppListItemMetadataPtr)>;
+  virtual void FindOrCreateOemFolder(
+      const std::string& oem_folder_name,
+      const syncer::StringOrdinal& preferred_oem_position,
+      FindOrCreateOemFolderCallback callback) = 0;
+
+  // Resolves the position of the OEM folder.
+  // |preferred_oem_position|: the preferred position of the OEM folder; if it's
+  //                           invalid then the final position is determined in
+  //                           Ash.
+  // |oem_folder|: the meta data of the OEM folder, or null if it doesn't exist.
+  using ResolveOemFolderPositionCallback =
+      base::OnceCallback<void(AppListItemMetadataPtr)>;
+  virtual void ResolveOemFolderPosition(
+      const syncer::StringOrdinal& preferred_oem_position,
+      ResolveOemFolderPositionCallback callback) = 0;
+
+  // Dismisses the app list.
+  virtual void DismissAppList() = 0;
+
+  // Returns bounds of a rectangle to show an AppInfo dialog.
+  using GetAppInfoDialogBoundsCallback =
+      base::OnceCallback<void(const gfx::Rect&)>;
+  virtual void GetAppInfoDialogBounds(
+      GetAppInfoDialogBoundsCallback callback) = 0;
+
+  // Shows the app list and switches to |state|.
+  virtual void ShowAppListAndSwitchToState(ash::AppListState state) = 0;
+
+  // Shows the app list.
+  virtual void ShowAppList() = 0;
+
  protected:
   AppListController();
   virtual ~AppListController();
diff --git a/ash/public/cpp/assistant/assistant_state_base.h b/ash/public/cpp/assistant/assistant_state_base.h
index 85f1d711..d781681 100644
--- a/ash/public/cpp/assistant/assistant_state_base.h
+++ b/ash/public/cpp/assistant/assistant_state_base.h
@@ -57,6 +57,10 @@
     return arc_play_store_enabled_;
   }
 
+  const base::Optional<bool>& locked_full_screen_enabled() const {
+    return locked_full_screen_enabled_;
+  }
+
  protected:
   base::Optional<mojom::VoiceInteractionState> voice_interaction_state_;
 
@@ -87,6 +91,10 @@
   // Whether play store is enabled. nullopt if the data is not available yet.
   base::Optional<bool> arc_play_store_enabled_;
 
+  // Whether locked full screen state is enabled. nullopt if the data is not
+  // available yet.
+  base::Optional<bool> locked_full_screen_enabled_;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(AssistantStateBase);
 };
diff --git a/ash/public/cpp/assistant/assistant_state_proxy.cc b/ash/public/cpp/assistant/assistant_state_proxy.cc
index 3665f56..0e40434 100644
--- a/ash/public/cpp/assistant/assistant_state_proxy.cc
+++ b/ash/public/cpp/assistant/assistant_state_proxy.cc
@@ -111,4 +111,12 @@
     observer.OnArcPlayStoreEnabledChanged(arc_play_store_enabled_.value());
 }
 
+void AssistantStateProxy::OnLockedFullScreenStateChanged(bool enabled) {
+  locked_full_screen_enabled_ = enabled;
+  for (auto& observer : observers_) {
+    observer.OnLockedFullScreenStateChanged(
+        locked_full_screen_enabled_.value());
+  }
+}
+
 }  // namespace ash
diff --git a/ash/public/cpp/assistant/assistant_state_proxy.h b/ash/public/cpp/assistant/assistant_state_proxy.h
index a1810a5..c9ce46a 100644
--- a/ash/public/cpp/assistant/assistant_state_proxy.h
+++ b/ash/public/cpp/assistant/assistant_state_proxy.h
@@ -51,6 +51,7 @@
       mojom::AssistantAllowedState state) override;
   void OnLocaleChanged(const std::string& locale) override;
   void OnArcPlayStoreEnabledChanged(bool enabled) override;
+  void OnLockedFullScreenStateChanged(bool enabled) override;
 
   base::ObserverList<DefaultVoiceInteractionObserver> observers_;
 
diff --git a/ash/public/cpp/assistant/default_voice_interaction_observer.h b/ash/public/cpp/assistant/default_voice_interaction_observer.h
index 88a0a0a..951afd19 100644
--- a/ash/public/cpp/assistant/default_voice_interaction_observer.h
+++ b/ash/public/cpp/assistant/default_voice_interaction_observer.h
@@ -35,6 +35,7 @@
       ash::mojom::AssistantAllowedState state) override {}
   void OnLocaleChanged(const std::string& locale) override {}
   void OnArcPlayStoreEnabledChanged(bool enabled) override {}
+  void OnLockedFullScreenStateChanged(bool enabled) override {}
 
  protected:
   DefaultVoiceInteractionObserver() = default;
diff --git a/ash/public/cpp/manifest.cc b/ash/public/cpp/manifest.cc
index e905ef44..48433a3 100644
--- a/ash/public/cpp/manifest.cc
+++ b/ash/public/cpp/manifest.cc
@@ -41,8 +41,6 @@
 #include "services/preferences/public/mojom/preferences.mojom.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
 #include "services/viz/public/interfaces/constants.mojom.h"
-#include "services/ws/public/cpp/manifest.h"
-#include "services/ws/public/mojom/constants.mojom.h"
 #include "ui/base/ime/mojo/ime_engine_factory_registry.mojom.h"
 
 namespace ash {
@@ -68,7 +66,7 @@
               service_manager::Manifest::InterfaceList<
                   mojom::AccessibilityController,
                   mojom::AccessibilityFocusRingController,
-                  mojom::AppListController, mojom::AshMessageCenterController,
+                  mojom::AshMessageCenterController,
                   mojom::AssistantAlarmTimerController,
                   mojom::AssistantController,
                   mojom::AssistantNotificationController,
@@ -97,8 +95,6 @@
           .RequireCapability(data_decoder::mojom::kServiceName, "image_decoder")
           .RequireCapability(viz::mojom::kVizServiceName, "ozone")
           .RequireCapability(viz::mojom::kVizServiceName, "viz_host")
-          .RequireCapability(ws::mojom::kServiceName, "ozone")
-          .RequireCapability(ws::mojom::kServiceName, "window_manager")
           .RequireCapability(device::mojom::kServiceName,
                              "device:bluetooth_system")
           .RequireCapability(device::mojom::kServiceName, "device:fingerprint")
@@ -107,7 +103,6 @@
           .RequireCapability(
               chromeos::network_config::mojom::kServiceName,
               chromeos::network_config::mojom::kNetworkConfigCapability)
-          .PackageService(ws::GetManifest())
           .Build()
           .Amend(GetAmendmentForTesting())};
   return *manifest;
diff --git a/ash/public/cpp/test/shell_test_api.h b/ash/public/cpp/test/shell_test_api.h
index 9367df69..2bbfa64 100644
--- a/ash/public/cpp/test/shell_test_api.h
+++ b/ash/public/cpp/test/shell_test_api.h
@@ -6,12 +6,17 @@
 #define ASH_PUBLIC_CPP_TEST_SHELL_TEST_API_H_
 
 #include <memory>
+#include <vector>
 
 #include "ash/ash_export.h"
 #include "ash/public/interfaces/app_list_view.mojom-forward.h"
 #include "base/callback_forward.h"
 #include "base/macros.h"
 
+namespace aura {
+class Window;
+}
+
 namespace ash {
 class DragDropController;
 class MessageCenterController;
@@ -89,6 +94,10 @@
   // state transition animation.
   void WaitForLauncherAnimationState(mojom::AppListViewState state);
 
+  // Returns the list of windows used in overview item. Returns empty
+  // if not in the overview mode.
+  std::vector<aura::Window*> GetItemWindowListInOverviewGrids();
+
  private:
   Shell* shell_;  // not owned
 
diff --git a/ash/public/interfaces/app_list.mojom b/ash/public/interfaces/app_list.mojom
index 2fb0a61..5527921 100644
--- a/ash/public/interfaces/app_list.mojom
+++ b/ash/public/interfaces/app_list.mojom
@@ -163,153 +163,3 @@
   gfx.mojom.ImageSkia image;
   bool visible_on_hover;
 };
-
-// The Chrome app list (aka Launcher), is the place where user can find and
-// organize all installed apps, or search for various types of information.
-//
-// For apps:
-// The app list displays apps synced across devices based on a user account, in
-// an order that can be modified by the user. It supports up-to-3-layer app
-// organization, the root app list, folders, and apps:
-// - Each app can stay in the root app list or a folder.
-// - Each folder holds more than one apps, which means it'll automatically get
-//   removed when there's only one app left in it.
-// - The OEM folder is a special folder where we cannot move items to/from it.
-//   And we cannot rename it.
-// - Other folders are renamable.
-// - Folders cannot hold folders.
-// - Different items/folders never have a same GUID.
-// - Every item/folder has a same GUID on different devices.
-//
-// For searching:
-// The app list supports various kinds of searching (e.g. apps, onmibox, etc).
-// And search results can be displayed in different formats (e.g. tiles, cards).
-// - Result ids are url like string, e.g.
-//   "chrome-extension://mgndgikekgjfcpckkfioiadnlibdjbkf/",
-//   "play://hhbckbkcbnemggclionhhgaceohjfdkl", etc.
-// - Different search results never have a same id.
-// - Every search result has a same id on different devices.
-// - Every search result can have a list of actions (e.g. install), see
-//   app_list::SearchResult::Action.
-//
-// Users can long press on any app list item or search result to show a context
-// menu. A context menu has a list of commands (e.g. open, uninstall, etc.).
-// - Different items/results may have different command lists.
-// - Each item/result usually has a same command list, but not always. Consider
-//   when we pin an app to the shelf and when we unpin it, the context menu
-//   looks different.
-// - Inside each command list, each command has its own unique command id.
-// - A same command in different command lists has a unique command id, see
-//   app_list::AppContextMenu::CommandId.
-
-// The Chrome app list has its UI running in Ash, and everything else running in
-// Chrome (e.g. syncing, user profile, etc). This controller is implemented in
-// Ash to handle calls from Chrome. These include:
-// - When app list data changes in Chrome, it should notifies the UI models and
-//   views in Ash to get updated. This can happen while syncing, searching, etc.
-// - When Chrome needs real-time UI information from Ash. This can happen while
-//   calculating recommended search results based on the app list item order.
-// - When app list states in Chrome change that require UI's response. This can
-//   happen while installing/uninstalling apps and the app list gets toggled.
-interface AppListController {
-  //////////////////////////////////////////////////////////////////////////////
-  // Interfaces that come from AppListModelUpdater:
-  // The following interfaces are called to update the app list model in Ash,
-  // including both the app list item model, search result model and search box
-  // model.
-  // Adds an item to AppListModel.
-  AddItem(AppListItemMetadata app_item);
-  // Adds an item into a certain folder in AppListModel.
-  AddItemToFolder(AppListItemMetadata app_item, string folder_id);
-  // Removes an item by its id from AppListModel.
-  RemoveItem(string id);
-  // Removes an item by its id, and also cleans up if its parent folder has a
-  // single child left.
-  RemoveUninstalledItem(string id);
-  // Moves the item with |id| to the folder with |folder_id|.
-  MoveItemToFolder(string id, string folder_id);
-  // Tells Ash what the current status of AppListModel should be,
-  // e.g. the model is under synchronization or in normal status.
-  SetStatus(AppListModelStatus status);
-  // Tells Ash what the current state of the app list should be,
-  // e.g. the user is searching for something, or showing apps, etc.
-  SetState(AppListState state);
-  // Highlights the given item in the app list. If not present and it is later
-  // added, the item will be highlighted after being added.
-  HighlightItemInstalledFromUI(string id);
-  // Sets whether the search engine is Google or not.
-  SetSearchEngineIsGoogle(bool is_google);
-  // Sets the text for screen readers on the search box, and updates the
-  // accessible names.
-  SetSearchTabletAndClamshellAccessibleName(
-      mojo_base.mojom.String16 tablet_accessible_name,
-      mojo_base.mojom.String16 clamshell_accessible_name);
-  // Sets the hint text to display when there is in input.
-  SetSearchHintText(mojo_base.mojom.String16 hint_text);
-  // Sets the text for the search box's Textfield and the voice search flag.
-  UpdateSearchBox(mojo_base.mojom.String16 text, bool initiated_by_user);
-  // Publishes search results to Ash to render them.
-  PublishSearchResults(array<SearchResultMetadata> results);
-  // Update the whole model, usually when profile changes happen in Chrome.
-  SetModelData(int32 profile_id,
-               array<AppListItemMetadata> apps,
-               bool is_search_engine_google);
-
-  //////////////////////////////////////////////////////////////////////////////
-  // Interfaces only used by ChromeAppListItem:
-  // These interfaces are called when an item's data is updated in Chrome.
-  // Updates an item's metadata (e.g. name, position, etc).
-  SetItemMetadata(string id, AppListItemMetadata metadata);
-  // Updates an item's icon.
-  SetItemIcon(string id, gfx.mojom.ImageSkia? icon);
-  // Updates whether an item is installing.
-  SetItemIsInstalling(string id, bool is_installing);
-  // Updates the downloaded percentage of an item.
-  SetItemPercentDownloaded(string id, int32 percent_downloaded);
-
-  //////////////////////////////////////////////////////////////////////////////
-  // Interfaces for item querying:
-  // Returns a map from each item's id to its shown index in the app list.
-  GetIdToAppListIndexMap() => (map<string, uint16> indices);
-
-  //////////////////////////////////////////////////////////////////////////////
-  // Interfaces for AppListSyncableService:
-  // These interfaces are called while dealing with the OEM folder in the
-  // AppListSyncableService in Chrome.
-  // Finds the OEM folder or creates one if it doesn't exist.
-  // |oem_folder_name|: the expected name of the OEM folder while creating.
-  // |preferred_oem_position|: the preferred position of the OEM folder while
-  //                           creating; if it's invalid then the final position
-  //                           is determined in Ash.
-  // |oem_folder|: the meta data of the existing/created OEM folder.
-  FindOrCreateOemFolder(
-      string oem_folder_name,
-      syncer.mojom.StringOrdinal preferred_oem_position)
-      => (AppListItemMetadata oem_folder);
-  // Resolves the position of the OEM folder.
-  // |preferred_oem_position|: the preferred position of the OEM folder; if it's
-  //                           invalid then the final position is determined in
-  //                           Ash.
-  // |oem_folder|: the meta data of the OEM folder, or null if it doesn't exist.
-  ResolveOemFolderPosition(
-      syncer.mojom.StringOrdinal preferred_oem_position)
-      => (AppListItemMetadata? oem_folder);
-
-  //////////////////////////////////////////////////////////////////////////////
-  // Interfaces for ChromeSearchReult:
-  SetSearchResultMetadata(SearchResultMetadata metadata);
-  SetSearchResultIsInstalling(string result_id, bool is_installing);
-  SetSearchResultPercentDownloaded(string result_id, int32 percent_downloaded);
-  NotifySearchResultItemInstalled(string result_id);
-
-  //////////////////////////////////////////////////////////////////////////////
-  // Interfaces for views:
-  // Dismisses the app list.
-  DismissAppList();
-  // Returns bounds of a rectangle to show an AppInfo dialog.
-  GetAppInfoDialogBounds() => (gfx.mojom.Rect bounds);
-  // Shows the app list and switches to |state|.
-  ShowAppListAndSwitchToState(AppListState state);
-  // Shows the app list.
-  ShowAppList();
-};
diff --git a/ash/public/interfaces/ime_controller.mojom b/ash/public/interfaces/ime_controller.mojom
index 6bbcbcc..33f7299 100644
--- a/ash/public/interfaces/ime_controller.mojom
+++ b/ash/public/interfaces/ime_controller.mojom
@@ -98,4 +98,7 @@
   // 'kNone', we switch to the default keyset. Because this is asynchronous,
   // any code that needs the keyset to be updated first must use the callback.
   OverrideKeyboardKeyset(chromeos.input_method.mojom.ImeKeyset keyset) => ();
+
+  // Show the current mode.
+  ShowModeIndicator();
 };
diff --git a/ash/public/interfaces/keyboard_controller_types.mojom b/ash/public/interfaces/keyboard_controller_types.mojom
index 3873f99..dfa41cf 100644
--- a/ash/public/interfaces/keyboard_controller_types.mojom
+++ b/ash/public/interfaces/keyboard_controller_types.mojom
@@ -38,7 +38,7 @@
   kCommandLineEnabled,
 };
 
-// Container types used to set and identify contaner behavior. Used in UMA
+// Container types used to set and identify container behavior. Used in UMA
 // stats gathering, so values should never be changed or reused.
 enum ContainerType {
   // Corresponds to a ContainerFullWidthBehavior.
@@ -48,5 +48,5 @@
   kFloating = 1,
 
   // Corresponds to a ContainerFullscreenBehavior.
-  kFullscreen = 2,
+  // kFullscreen = 2,  // Deprecated; feature was abandoned.
 };
diff --git a/ash/public/interfaces/login_screen.mojom b/ash/public/interfaces/login_screen.mojom
index 66f6ea4..6a3367c0 100644
--- a/ash/public/interfaces/login_screen.mojom
+++ b/ash/public/interfaces/login_screen.mojom
@@ -285,11 +285,13 @@
   // the other auth methods above.
   AuthenticateUserWithEasyUnlock(signin.mojom.AccountId account_id);
 
-  // Validates parent access code for the user identified by |account_id|.
-  // Passes validation result in the callback.
-  // Note: This should only be used for child user.
+  // Validates parent access code for the user identified by |account_id|. When
+  // |account_id| is empty it tries to validate the access code for any child
+  // that is signed in the device. Passes validation result in the callback.
+  // Note: This should only be used for child user, it will always return false
+  // when a non-child id is used.
   ValidateParentAccessCode(
-    signin.mojom.AccountId account_id,
+    signin.mojom.AccountId? account_id,
     string access_code) => (bool access_code_valid);
 
   // Request to hard lock the user pod.
diff --git a/ash/public/interfaces/voice_interaction_controller.mojom b/ash/public/interfaces/voice_interaction_controller.mojom
index 0c3cc97..7b3136da 100644
--- a/ash/public/interfaces/voice_interaction_controller.mojom
+++ b/ash/public/interfaces/voice_interaction_controller.mojom
@@ -80,6 +80,9 @@
   // "en-US" or simply "en". When locale is not set in pref, it returns empty
   // string.
   OnLocaleChanged(string locale);
+
+  // Called when locked full screen state has changed.
+  OnLockedFullScreenStateChanged(bool enabled);
 };
 
 // Interface for ash client (Chrome) to connect to the voice interaction
@@ -121,6 +124,9 @@
   // Called when Google Play Store is enabled/disabled.
   NotifyArcPlayStoreEnabledChanged(bool enabled);
 
+  // Called when locked full screen state is enabled/disabled.
+  NotifyLockedFullScreenStateChanged(bool enabled);
+
   // Add an observer.
   AddObserver(VoiceInteractionObserver observer);
 };
diff --git a/ash/shelf/app_list_button_unittest.cc b/ash/shelf/app_list_button_unittest.cc
index e70bcfac..240cc87b 100644
--- a/ash/shelf/app_list_button_unittest.cc
+++ b/ash/shelf/app_list_button_unittest.cc
@@ -50,12 +50,13 @@
   // AshTestBase:
   void SetUp() override {
     AshTestBase::SetUp();
-    app_list_button_ =
-        GetPrimaryShelf()->GetShelfViewForTesting()->GetAppListButton();
   }
 
   void SendGestureEvent(ui::GestureEvent* event) {
-    app_list_button_->OnGestureEvent(event);
+    GetPrimaryShelf()
+        ->GetShelfViewForTesting()
+        ->GetAppListButton()
+        ->OnGestureEvent(event);
   }
 
   void SendGestureEventToSecondaryDisplay(ui::GestureEvent* event) {
@@ -68,11 +69,11 @@
         ->OnGestureEvent(event);
   }
 
-  const AppListButton* app_list_button() const { return app_list_button_; }
+  const AppListButton* app_list_button() const {
+    return GetPrimaryShelf()->GetShelfViewForTesting()->GetAppListButton();
+  }
 
  private:
-  AppListButton* app_list_button_ = nullptr;
-
   DISALLOW_COPY_AND_ASSIGN(AppListButtonTest);
 };
 
diff --git a/ash/shelf/back_button_unittest.cc b/ash/shelf/back_button_unittest.cc
index 8a53429f..0dc6d41 100644
--- a/ash/shelf/back_button_unittest.cc
+++ b/ash/shelf/back_button_unittest.cc
@@ -47,7 +47,7 @@
     base::RunLoop().RunUntilIdle();
   }
 
- private:
+ protected:
   std::unique_ptr<ShelfViewTestAPI> test_api_;
 
   DISALLOW_COPY_AND_ASSIGN(BackButtonTest);
@@ -136,6 +136,14 @@
     client_ = BindMockKioskNextShellClient();
   }
 
+  void SimulateKioskNextSession() {
+    LogInKioskNextUser(GetSessionControllerClient());
+
+    // Update test_api_ because its reference to ShelfView is outdated.
+    test_api_ = std::make_unique<ShelfViewTestAPI>(
+        GetPrimaryShelf()->GetShelfViewForTesting());
+  }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
   std::unique_ptr<MockKioskNextShellClient> client_;
@@ -144,7 +152,7 @@
 };
 
 TEST_F(KioskNextBackButtonTest, BackKeySequenceGenerated) {
-  LogInKioskNextUser(GetSessionControllerClient());
+  SimulateKioskNextSession();
 
   // Tablet mode should be enabled in Kiosk Next.
   ASSERT_TRUE(Shell::Get()
diff --git a/ash/shelf/shelf_window_watcher_item_delegate.cc b/ash/shelf/shelf_window_watcher_item_delegate.cc
index ca49964..962c43f 100644
--- a/ash/shelf/shelf_window_watcher_item_delegate.cc
+++ b/ash/shelf/shelf_window_watcher_item_delegate.cc
@@ -17,6 +17,9 @@
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/events/event_constants.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/controls/menu/menu_config.h"
+#include "ui/views/vector_icons.h"
 #include "ui/wm/core/window_animations.h"
 
 namespace ash {
@@ -62,7 +65,11 @@
     GetContextMenuCallback callback) {
   auto menu = std::make_unique<ShelfContextMenuModel>(this, display_id);
   // Show a default context menu with just an extra close item.
-  menu->AddItemWithStringId(kCloseCommandId, IDS_CLOSE);
+  const views::MenuConfig& menu_config = views::MenuConfig::instance();
+  menu->AddItemWithStringIdAndIcon(
+      kCloseCommandId, IDS_CLOSE,
+      gfx::CreateVectorIcon(views::kCloseIcon, menu_config.touchable_icon_size,
+                            menu_config.touchable_icon_color));
   std::move(callback).Run(std::move(menu));
 }
 
diff --git a/ash/shell.cc b/ash/shell.cc
index b863acb..291d5fb 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -106,7 +106,6 @@
 #include "ash/system/network/vpn_list.h"
 #include "ash/system/night_light/night_light_controller.h"
 #include "ash/system/power/backlights_forced_off_setter.h"
-#include "ash/system/power/notification_reporter.h"
 #include "ash/system/power/peripheral_battery_notifier.h"
 #include "ash/system/power/power_button_controller.h"
 #include "ash/system/power/power_event_observer.h"
@@ -549,8 +548,7 @@
 
 Shell::Shell(std::unique_ptr<ShellDelegate> shell_delegate,
              service_manager::Connector* connector)
-    : aura_env_(aura::Env::GetInstance()),
-      brightness_control_delegate_(
+    : brightness_control_delegate_(
           std::make_unique<system::BrightnessControllerChromeos>()),
       connector_(connector),
       first_run_helper_(std::make_unique<FirstRunHelper>()),
@@ -833,7 +831,6 @@
   PowerStatus::Shutdown();
   // Depends on SessionController.
   power_event_observer_.reset();
-  notification_reporter_.reset();
 
   session_controller_->RemoveObserver(this);
   // BluetoothPowerController depends on the PrefService and must be destructed
@@ -936,10 +933,11 @@
 
   // This will initialize aura::Env which requires |display_manager_| to
   // be initialized first.
+  aura::Env* env = aura::Env::GetInstance();
   if (context_factory)
-    aura_env_->set_context_factory(context_factory);
+    env->set_context_factory(context_factory);
   if (context_factory_private)
-    aura_env_->set_context_factory_private(context_factory_private);
+    env->set_context_factory_private(context_factory_private);
 
   // Night Light depends on the display manager, the display color manager, and
   // aura::Env, so initialize it after all have been initialized.
@@ -949,7 +947,7 @@
   // pretarget handler list to ensure that it processes input events when modal
   // windows are active.
   window_modality_controller_ =
-      std::make_unique<::wm::WindowModalityController>(this, aura_env_);
+      std::make_unique<::wm::WindowModalityController>(this, env);
 
   event_rewriter_controller_ = std::make_unique<EventRewriterController>();
 
@@ -1094,7 +1092,7 @@
   resize_shadow_controller_.reset(new ResizeShadowController());
   shadow_controller_ = std::make_unique<::wm::ShadowController>(
       focus_controller_.get(), std::make_unique<WmShadowControllerDelegate>(),
-      aura_env_);
+      env);
 
   logout_confirmation_controller_ =
       std::make_unique<LogoutConfirmationController>();
@@ -1162,8 +1160,6 @@
 
   user_metrics_recorder_->OnShellInitialized();
 
-  notification_reporter_ = std::make_unique<NotificationReporter>();
-
   // Initialize the D-Bus bus and services for ash.
   if (!::features::IsMultiProcessMash())
     ash_dbus_helper_ = AshDBusHelper::CreateWithExistingBus(dbus_bus);
@@ -1269,7 +1265,7 @@
 }
 
 ui::EventTarget* Shell::GetParentTarget() {
-  return aura_env_;
+  return aura::Env::GetInstance();
 }
 
 std::unique_ptr<ui::EventTargetIterator> Shell::GetChildIterator() const {
diff --git a/ash/shell.h b/ash/shell.h
index 9f74d31..995c1096 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -29,7 +29,6 @@
 class PrefService;
 
 namespace aura {
-class Env;
 class RootWindow;
 class Window;
 }  // namespace aura
@@ -156,7 +155,6 @@
 class PolicyRecommendationRestorer;
 class PowerButtonController;
 class PowerEventObserver;
-class NotificationReporter;
 class PowerPrefs;
 class ProjectingObserver;
 class ResizeShadowController;
@@ -357,7 +355,6 @@
   }
 
   DockedMagnifierControllerImpl* docked_magnifier_controller();
-  aura::Env* aura_env() { return aura_env_; }
   ::wm::CompoundEventFilter* env_filter() { return env_filter_.get(); }
   EventRewriterController* event_rewriter_controller() {
     return event_rewriter_controller_.get();
@@ -431,9 +428,6 @@
   NoteTakingController* note_taking_controller() {
     return note_taking_controller_.get();
   }
-  NotificationReporter* notification_reporter() {
-    return notification_reporter_.get();
-  }
   OverlayEventFilter* overlay_filter() { return overlay_filter_.get(); }
   PartialMagnificationController* partial_magnification_controller() {
     return partial_magnification_controller_.get();
@@ -651,9 +645,6 @@
 
   static Shell* instance_;
 
-  // TODO(crbug.com/960503): remove this.
-  aura::Env* aura_env_;
-
   // The CompoundEventFilter owned by aura::Env object.
   std::unique_ptr<::wm::CompoundEventFilter> env_filter_;
 
@@ -834,8 +825,6 @@
 
   std::unique_ptr<MessageCenterController> message_center_controller_;
 
-  std::unique_ptr<NotificationReporter> notification_reporter_;
-
   base::ObserverList<ShellObserver>::Unchecked shell_observers_;
 
   base::WeakPtrFactory<Shell> weak_factory_;
diff --git a/ash/shell_test_api.cc b/ash/shell_test_api.cc
index 3572f3a..d78b5cf 100644
--- a/ash/shell_test_api.cc
+++ b/ash/shell_test_api.cc
@@ -251,4 +251,10 @@
   run_loop.Run();
 }
 
+std::vector<aura::Window*> ShellTestApi::GetItemWindowListInOverviewGrids() {
+  return ash::Shell::Get()
+      ->overview_controller()
+      ->GetItemWindowListInOverviewGridsForTest();
+}
+
 }  // namespace ash
diff --git a/ash/shell_unittest.cc b/ash/shell_unittest.cc
index 4482b739..878403fb 100644
--- a/ash/shell_unittest.cc
+++ b/ash/shell_unittest.cc
@@ -553,11 +553,11 @@
 // Verifies an EventHandler added to Env gets notified from EventGenerator.
 TEST_F(ShellTest, EnvPreTargetHandler) {
   ui::test::TestEventHandler event_handler;
-  Shell::Get()->aura_env()->AddPreTargetHandler(&event_handler);
+  aura::Env::GetInstance()->AddPreTargetHandler(&event_handler);
   ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
   generator.MoveMouseBy(1, 1);
   EXPECT_NE(0, event_handler.num_mouse_events());
-  Shell::Get()->aura_env()->RemovePreTargetHandler(&event_handler);
+  aura::Env::GetInstance()->RemovePreTargetHandler(&event_handler);
 }
 
 // This verifies WindowObservers are removed when a window is destroyed after
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 08881abd..2cf59881f 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -173,7 +173,7 @@
 <translation id="3510164367642747937">माउस कर्सर को हाइलाइट करें</translation>
 <translation id="3513798432020909783"><ph name="MANAGER_EMAIL" /> खाता संभालते हैं</translation>
 <translation id="3573179567135747900">"<ph name="FROM_LOCALE" />" में फिर से बदलें (फिर से आरंभ करने की आवश्यकता है)</translation>
-<translation id="3595596368722241419">बैटरी पूर्ण</translation>
+<translation id="3595596368722241419">बैटरी पूरी हो गई</translation>
 <translation id="3606978283550408104">ब्रेल डिसप्ले कनेक्ट हो गया.</translation>
 <translation id="3621202678540785336">इनपुट</translation>
 <translation id="3626281679859535460">स्क्रीन की रोशनी</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index b016ce0..a47d53cd 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -206,7 +206,7 @@
 <translation id="4042660782729322247">Ekranınızı paylaşıyorsunuz</translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{Bir uygulama için kapalı}other{# uygulama için kapalı}}</translation>
 <translation id="4072264167173457037">Orta düzeyde sinyal</translation>
-<translation id="4112140312785995938">Geriye Doğru Ara</translation>
+<translation id="4112140312785995938">Geri Sar</translation>
 <translation id="4129129681837227511">Kilit ekranınızda bildirim göstermek için cihazın kilidini açarak ayarı değiştirin</translation>
 <translation id="4146833061457621061">Müzik çal</translation>
 <translation id="4181841719683918333">Diller</translation>
diff --git a/ash/system/network/active_network_icon.cc b/ash/system/network/active_network_icon.cc
index 3643456..4134e79 100644
--- a/ash/system/network/active_network_icon.cc
+++ b/ash/system/network/active_network_icon.cc
@@ -29,6 +29,8 @@
 
 namespace {
 
+const int kPurgeDelayMs = 500;
+
 bool IsTrayIcon(network_icon::IconType icon_type) {
   return icon_type == network_icon::ICON_TYPE_TRAY_REGULAR ||
          icon_type == network_icon::ICON_TYPE_TRAY_OOBE;
@@ -58,7 +60,8 @@
 
 }  // namespace
 
-ActiveNetworkIcon::ActiveNetworkIcon(service_manager::Connector* connector) {
+ActiveNetworkIcon::ActiveNetworkIcon(service_manager::Connector* connector)
+    : weak_ptr_factory_(this) {
   if (connector)  // May be null in tests.
     BindCrosNetworkConfig(connector);
 }
@@ -295,7 +298,14 @@
   SetCellularUninitializedMsg();
 }
 
-void ActiveNetworkIcon::OnNetworkStateListChanged() {}
+void ActiveNetworkIcon::OnNetworkStateListChanged() {
+  if (purge_timer_.IsRunning())
+    return;
+  purge_timer_.Start(FROM_HERE,
+                     base::TimeDelta::FromMilliseconds(kPurgeDelayMs),
+                     base::BindOnce(&ActiveNetworkIcon::PurgeNetworkIconCache,
+                                    weak_ptr_factory_.GetWeakPtr()));
+}
 
 void ActiveNetworkIcon::OnDeviceStateListChanged() {
   cros_network_config_ptr_->GetDeviceStateList(base::BindOnce(
@@ -323,4 +333,20 @@
   return iter->second.get();
 }
 
+void ActiveNetworkIcon::PurgeNetworkIconCache() {
+  cros_network_config_ptr_->GetNetworkStateList(
+      NetworkFilter::New(FilterType::kVisible, NetworkType::kAll,
+                         /*limit=*/0),
+      base::BindOnce(
+          [](std::vector<
+              chromeos::network_config::mojom::NetworkStatePropertiesPtr>
+                 networks) {
+            std::set<std::string> network_guids;
+            for (const auto& iter : networks) {
+              network_guids.insert(iter->guid);
+            }
+            network_icon::PurgeNetworkIconCache(network_guids);
+          }));
+}
+
 }  // namespace ash
diff --git a/ash/system/network/active_network_icon.h b/ash/system/network/active_network_icon.h
index 38de9bd..c9e3429 100644
--- a/ash/system/network/active_network_icon.h
+++ b/ash/system/network/active_network_icon.h
@@ -15,6 +15,7 @@
 #include "base/optional.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
 #include "mojo/public/cpp/bindings/binding.h"
 
@@ -40,6 +41,7 @@
 // network_icon_unittest.cc, and partially in active_network_icon_unittest.cc.
 // TODO(stevenjb): Move all test coverage to active_network_icon_unittest.cc and
 // test Dual icon methods.
+// This class is also responsible for periodically purging the icon cache.
 class ASH_EXPORT ActiveNetworkIcon
     : public chromeos::network_config::mojom::CrosNetworkConfigObserver {
  public:
@@ -91,6 +93,7 @@
           devices);
   chromeos::network_config::mojom::DeviceStateProperties* GetDevice(
       chromeos::network_config::mojom::NetworkType type);
+  void PurgeNetworkIconCache();
 
   chromeos::network_config::mojom::CrosNetworkConfigPtr
       cros_network_config_ptr_;
@@ -106,6 +109,8 @@
   base::Optional<network_icon::NetworkIconState> active_vpn_;
   int cellular_uninitialized_msg_ = 0;
   base::Time uninitialized_state_time_;
+  base::OneShotTimer purge_timer_;
+  base::WeakPtrFactory<ActiveNetworkIcon> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ActiveNetworkIcon);
 };
diff --git a/ash/system/network/network_icon_purger.cc b/ash/system/network/network_icon_purger.cc
deleted file mode 100644
index 44c6b7ad..0000000
--- a/ash/system/network/network_icon_purger.cc
+++ /dev/null
@@ -1,57 +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.
-
-#include "ash/system/network/network_icon_purger.h"
-
-#include "ash/system/network/network_icon.h"
-#include "base/bind.h"
-#include "chromeos/network/network_state_handler.h"
-
-using chromeos::NetworkHandler;
-using chromeos::NetworkStateHandler;
-
-namespace ash {
-
-namespace {
-
-const int kPurgeDelayMs = 300;
-
-void PurgeNetworkIconCache() {
-  NetworkStateHandler::NetworkStateList networks;
-  NetworkHandler::Get()->network_state_handler()->GetVisibleNetworkList(
-      &networks);
-  std::set<std::string> network_guids;
-  for (NetworkStateHandler::NetworkStateList::iterator iter = networks.begin();
-       iter != networks.end(); ++iter) {
-    network_guids.insert((*iter)->guid());
-  }
-  network_icon::PurgeNetworkIconCache(network_guids);
-}
-
-}  // namespace
-
-NetworkIconPurger::NetworkIconPurger() {
-  // NetworkHandler may not be initialized in tests.
-  if (NetworkHandler::IsInitialized()) {
-    NetworkHandler::Get()->network_state_handler()->AddObserver(this,
-                                                                FROM_HERE);
-  }
-}
-
-NetworkIconPurger::~NetworkIconPurger() {
-  // NetworkHandler may not be initialized in tests.
-  if (NetworkHandler::IsInitialized()) {
-    NetworkHandler::Get()->network_state_handler()->RemoveObserver(this,
-                                                                   FROM_HERE);
-  }
-}
-
-void NetworkIconPurger::NetworkListChanged() {
-  if (timer_.IsRunning())
-    return;
-  timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kPurgeDelayMs),
-               base::BindOnce(&PurgeNetworkIconCache));
-}
-
-}  // namespace ash
diff --git a/ash/system/network/network_icon_purger.h b/ash/system/network/network_icon_purger.h
deleted file mode 100644
index 2ff32ef..0000000
--- a/ash/system/network/network_icon_purger.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_SYSTEM_NETWORK_NETWORK_ICON_PURGER_H_
-#define ASH_SYSTEM_NETWORK_NETWORK_ICON_PURGER_H_
-
-#include "base/macros.h"
-#include "base/timer/timer.h"
-#include "chromeos/network/network_state_handler_observer.h"
-
-namespace ash {
-
-// Purges network icon caches when the network list is updated.
-// Introduces a small delay before purging the cache. This prevents
-// us from excessively purging icon caches when receiving updates
-// in quick succession.
-class NetworkIconPurger : public chromeos::NetworkStateHandlerObserver {
- public:
-  NetworkIconPurger();
-  ~NetworkIconPurger() override;
-
-  // chromeos::NetworkStateHandlerObserver
-  void NetworkListChanged() override;
-
- private:
-  base::OneShotTimer timer_;
-
-  DISALLOW_COPY_AND_ASSIGN(NetworkIconPurger);
-};
-
-}  // namespace ash
-
-#endif  // ASH_SYSTEM_NETWORK_NETWORK_ICON_PURGER_H_
diff --git a/ash/system/network/network_section_header_view.h b/ash/system/network/network_section_header_view.h
index 5f3b660..a385003 100644
--- a/ash/system/network/network_section_header_view.h
+++ b/ash/system/network/network_section_header_view.h
@@ -8,6 +8,7 @@
 #include "ash/system/network/network_row_title_view.h"
 #include "ash/system/tray/tray_popup_utils.h"
 #include "ash/system/tray/tri_view.h"
+#include "base/memory/weak_ptr.h"
 #include "base/timer/timer.h"
 #include "chromeos/network/network_state_handler.h"
 #include "ui/views/controls/button/toggle_button.h"
diff --git a/ash/system/night_light/night_light_controller.cc b/ash/system/night_light/night_light_controller.cc
index 21e1bf59..e049a73 100644
--- a/ash/system/night_light/night_light_controller.cc
+++ b/ash/system/night_light/night_light_controller.cc
@@ -305,13 +305,13 @@
       binding_(this) {
   Shell::Get()->session_controller()->AddObserver(this);
   Shell::Get()->window_tree_host_manager()->AddObserver(this);
-  Shell::Get()->aura_env()->AddObserver(this);
+  aura::Env::GetInstance()->AddObserver(this);
   chromeos::PowerManagerClient::Get()->AddObserver(this);
 }
 
 NightLightController::~NightLightController() {
   chromeos::PowerManagerClient::Get()->RemoveObserver(this);
-  Shell::Get()->aura_env()->RemoveObserver(this);
+  aura::Env::GetInstance()->RemoveObserver(this);
   Shell::Get()->window_tree_host_manager()->RemoveObserver(this);
   Shell::Get()->session_controller()->RemoveObserver(this);
 }
diff --git a/ash/system/power/notification_reporter.cc b/ash/system/power/notification_reporter.cc
deleted file mode 100644
index 90123a6..0000000
--- a/ash/system/power/notification_reporter.cc
+++ /dev/null
@@ -1,49 +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 "ash/system/power/notification_reporter.h"
-
-#include "chromeos/dbus/power/power_manager_client.h"
-#include "ui/message_center/message_center.h"
-#include "ui/message_center/public/cpp/notification.h"
-#include "ui/message_center/public/cpp/notification_types.h"
-
-namespace ash {
-
-NotificationReporter::NotificationReporter() {
-  message_center::MessageCenter::Get()->AddObserver(this);
-}
-
-NotificationReporter::~NotificationReporter() {
-  message_center::MessageCenter::Get()->RemoveObserver(this);
-}
-
-void NotificationReporter::OnNotificationAdded(
-    const std::string& notification_id) {
-  MaybeNotifyPowerManager(notification_id);
-}
-
-void NotificationReporter::OnNotificationUpdated(
-    const std::string& notification_id) {
-  MaybeNotifyPowerManager(notification_id);
-}
-
-void NotificationReporter::MaybeNotifyPowerManager(
-    const std::string& notification_id) {
-  // Guard against notification removals before observers are notified.
-  message_center::Notification* notification =
-      message_center::MessageCenter::Get()->FindVisibleNotificationById(
-          notification_id);
-  if (!notification)
-    return;
-
-  // If this is a high priority notification wake the display up if the
-  // system is in dark resume i.e. transition to full resume.
-  if (notification->priority() >
-      message_center::NotificationPriority::DEFAULT_PRIORITY) {
-    chromeos::PowerManagerClient::Get()->NotifyWakeNotification();
-  }
-}
-
-}  // namespace ash
diff --git a/ash/system/power/notification_reporter.h b/ash/system/power/notification_reporter.h
deleted file mode 100644
index e9fc47dc..0000000
--- a/ash/system/power/notification_reporter.h
+++ /dev/null
@@ -1,40 +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 ASH_SYSTEM_POWER_NOTIFICATION_REPORTER_H_
-#define ASH_SYSTEM_POWER_NOTIFICATION_REPORTER_H_
-
-#include <string>
-
-#include "ash/ash_export.h"
-#include "base/macros.h"
-#include "ui/message_center/message_center_observer.h"
-
-namespace ash {
-
-// This class notifies the power manager when a high priority notification i.e.
-// one that can wake up the device (alarms, push notifications etc.), is created
-// or updated. This is required for doing a full resume if the device woke up in
-// dark resume in response to a notification.
-class ASH_EXPORT NotificationReporter
-    : public message_center::MessageCenterObserver {
- public:
-  NotificationReporter();
-  ~NotificationReporter() override;
-
-  // Overridden from MessageCenterObserver:
-  void OnNotificationAdded(const std::string& notification_id) override;
-  void OnNotificationUpdated(const std::string& notification_id) override;
-
- private:
-  // Notifies power manager if the notification corresponding to
-  // |notification_id| has high priority.
-  void MaybeNotifyPowerManager(const std::string& notification_id);
-
-  DISALLOW_COPY_AND_ASSIGN(NotificationReporter);
-};
-
-}  // namespace ash
-
-#endif  // ASH_SYSTEM_POWER_NOTIFICATION_REPORTER_H_
diff --git a/ash/system/power/notification_reporter_unittest.cc b/ash/system/power/notification_reporter_unittest.cc
deleted file mode 100644
index 398b9d40..0000000
--- a/ash/system/power/notification_reporter_unittest.cc
+++ /dev/null
@@ -1,82 +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 "ash/system/power/notification_reporter.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "ash/shell.h"
-#include "ash/test/ash_test_base.h"
-#include "chromeos/dbus/power/fake_power_manager_client.h"
-#include "ui/message_center/fake_message_center.h"
-#include "ui/message_center/public/cpp/notification.h"
-
-namespace ash {
-
-using NotificationReporterTest = AshTestBase;
-
-TEST_F(NotificationReporterTest, CheckNotifyWakeNotification) {
-  // Create a high priority notification and check that the power manager got
-  // called.
-  message_center::Notification notification(
-      message_center::NOTIFICATION_TYPE_SIMPLE, "notification-id", {}, {}, {},
-      {}, {}, {}, {}, nullptr);
-  notification.set_priority(
-      static_cast<int>(message_center::NotificationPriority::HIGH_PRIORITY));
-  message_center::MessageCenter::Get()->AddNotification(
-      std::make_unique<message_center::Notification>(notification));
-  EXPECT_EQ(
-      1,
-      chromeos::FakePowerManagerClient::Get()->num_wake_notification_calls());
-
-  // Update the old notification. Check if the power manager got called again.
-  message_center::MessageCenter::Get()->UpdateNotification(
-      notification.id(),
-      std::make_unique<message_center::Notification>(notification));
-  EXPECT_EQ(
-      2,
-      chromeos::FakePowerManagerClient::Get()->num_wake_notification_calls());
-
-  // A low priority notification should not result in any calls to the power
-  // manager.
-  notification.set_priority(
-      static_cast<int>(message_center::NotificationPriority::LOW_PRIORITY));
-  message_center::MessageCenter::Get()->AddNotification(
-      std::make_unique<message_center::Notification>("different-id",
-                                                     notification));
-  EXPECT_EQ(
-      2,
-      chromeos::FakePowerManagerClient::Get()->num_wake_notification_calls());
-}
-
-TEST_F(NotificationReporterTest, CheckDismissedNotification) {
-  // Create a high priority notification and check that the power manager got
-  // called.
-  message_center::Notification notification(
-      message_center::NOTIFICATION_TYPE_SIMPLE, "notification-id", {}, {}, {},
-      {}, {}, {}, {}, nullptr);
-  notification.set_priority(
-      static_cast<int>(message_center::NotificationPriority::HIGH_PRIORITY));
-  message_center::MessageCenter::Get()->AddNotification(
-      std::make_unique<message_center::Notification>(notification));
-  EXPECT_EQ(
-      1,
-      chromeos::FakePowerManagerClient::Get()->num_wake_notification_calls());
-
-  // Remove the notification from the message center and then directly call the
-  // observer API. This shouldn't call the power manager as NotificationReporter
-  // won't be able to find the notification and consequently determine it's
-  // priority.
-  message_center::MessageCenter::Get()->RemoveNotification(notification.id(),
-                                                           false /* by_user */);
-  Shell::Get()->notification_reporter()->OnNotificationUpdated(
-      notification.id());
-  EXPECT_EQ(
-      1,
-      chromeos::FakePowerManagerClient::Get()->num_wake_notification_calls());
-}
-
-}  // namespace ash
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc
index a5f4919d..a1469d5f 100644
--- a/ash/system/unified/unified_system_tray.cc
+++ b/ash/system/unified/unified_system_tray.cc
@@ -15,7 +15,6 @@
 #include "ash/system/message_center/message_center_ui_delegate.h"
 #include "ash/system/model/clock_model.h"
 #include "ash/system/model/system_tray_model.h"
-#include "ash/system/network/network_icon_purger.h"
 #include "ash/system/network/network_tray_view.h"
 #include "ash/system/power/tray_power.h"
 #include "ash/system/status_area_widget.h"
@@ -123,7 +122,6 @@
       model_(std::make_unique<UnifiedSystemTrayModel>()),
       slider_bubble_controller_(
           std::make_unique<UnifiedSliderBubbleController>(this)),
-      network_icon_purger_(std::make_unique<NetworkIconPurger>()),
       current_locale_view_(new CurrentLocaleView(shelf)),
       ime_mode_view_(new ImeModeView(shelf)),
       managed_device_view_(new ManagedDeviceView(shelf)),
diff --git a/ash/system/unified/unified_system_tray.h b/ash/system/unified/unified_system_tray.h
index 37d6322..ab63233 100644
--- a/ash/system/unified/unified_system_tray.h
+++ b/ash/system/unified/unified_system_tray.h
@@ -26,7 +26,6 @@
 class UnifiedSliderBubbleController;
 class UnifiedSystemTrayBubble;
 class UnifiedSystemTrayModel;
-class NetworkIconPurger;
 
 // The UnifiedSystemTray is the system menu of Chromium OS, which is a clickable
 // rounded rectangle typically located on the bottom right corner of the screen,
@@ -130,8 +129,6 @@
   const std::unique_ptr<UnifiedSliderBubbleController>
       slider_bubble_controller_;
 
-  const std::unique_ptr<NetworkIconPurger> network_icon_purger_;
-
   CurrentLocaleView* const current_locale_view_;
   ImeModeView* const ime_mode_view_;
   ManagedDeviceView* const managed_device_view_;
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc
index c778b7e4..fb7787d 100644
--- a/ash/test/ash_test_base.cc
+++ b/ash/test/ash_test_base.cc
@@ -495,7 +495,7 @@
   return original_display.id() !=
          screen
              ->GetDisplayNearestPoint(
-                 Shell::Get()->aura_env()->last_mouse_location())
+                 aura::Env::GetInstance()->last_mouse_location())
              .id();
 }
 
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc
index 9baea85e..61dd8ce 100644
--- a/ash/test/ash_test_helper.cc
+++ b/ash/test/ash_test_helper.cc
@@ -132,7 +132,7 @@
   CreateShell(provide_local_state);
 
   // Reset aura::Env to eliminate test dependency (https://crbug.com/586514).
-  aura::test::EnvTestHelper env_helper(Shell::Get()->aura_env());
+  aura::test::EnvTestHelper env_helper(aura::Env::GetInstance());
   env_helper.ResetEnvForTesting();
 
   env_helper.SetInputStateLookup(std::unique_ptr<aura::InputStateLookup>());
diff --git a/ash/test/ui_controls_factory_ash.cc b/ash/test/ui_controls_factory_ash.cc
index 26d006d..28d9fa44 100644
--- a/ash/test/ui_controls_factory_ash.cc
+++ b/ash/test/ui_controls_factory_ash.cc
@@ -107,7 +107,7 @@
                                      int button_state,
                                      base::OnceClosure closure,
                                      int accelerator_state) override {
-    gfx::Point p(Shell::Get()->aura_env()->last_mouse_location());
+    gfx::Point p(aura::Env::GetInstance()->last_mouse_location());
     UIControlsAura* ui_controls = GetUIControlsAt(p);
     return ui_controls &&
            ui_controls->SendMouseEventsNotifyWhenDone(
diff --git a/ash/utility/screenshot_controller_unittest.cc b/ash/utility/screenshot_controller_unittest.cc
index c08f0ff..a6c616e5 100644
--- a/ash/utility/screenshot_controller_unittest.cc
+++ b/ash/utility/screenshot_controller_unittest.cc
@@ -261,12 +261,12 @@
   StartPartialScreenshotSession();
   EXPECT_FALSE(TestIfMouseWarpsAt(gfx::Point(499, 11)));
   EXPECT_EQ(gfx::Point(499, 11),
-            Shell::Get()->aura_env()->last_mouse_location());
+            aura::Env::GetInstance()->last_mouse_location());
 
   Cancel();
   EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 11)));
   EXPECT_EQ(gfx::Point(501, 11),
-            Shell::Get()->aura_env()->last_mouse_location());
+            aura::Env::GetInstance()->last_mouse_location());
 }
 
 TEST_F(PartialScreenshotControllerTest, CursorVisibilityTest) {
diff --git a/ash/voice_interaction/voice_interaction_controller.cc b/ash/voice_interaction/voice_interaction_controller.cc
index 6143ed8..01bca6f 100644
--- a/ash/voice_interaction/voice_interaction_controller.cc
+++ b/ash/voice_interaction/voice_interaction_controller.cc
@@ -144,6 +144,20 @@
     observer.OnArcPlayStoreEnabledChanged(enabled);
 }
 
+void VoiceInteractionController::NotifyLockedFullScreenStateChanged(
+    bool enabled) {
+  if (locked_full_screen_enabled_ == enabled)
+    return;
+
+  locked_full_screen_enabled_ = enabled;
+
+  observers_.ForAllPtrs([enabled](auto* observer) {
+    observer->OnLockedFullScreenStateChanged(enabled);
+  });
+  for (auto& observer : local_observers_)
+    observer.OnLockedFullScreenStateChanged(enabled);
+}
+
 void VoiceInteractionController::AddObserver(
     mojom::VoiceInteractionObserverPtr observer) {
   InitObserver(observer.get());
diff --git a/ash/voice_interaction/voice_interaction_controller.h b/ash/voice_interaction/voice_interaction_controller.h
index 39eef114..f8dcaa12 100644
--- a/ash/voice_interaction/voice_interaction_controller.h
+++ b/ash/voice_interaction/voice_interaction_controller.h
@@ -38,6 +38,7 @@
   void NotifyLocaleChanged(const std::string& locale) override;
   void NotifyLaunchWithMicOpen(bool launch_with_mic_open) override;
   void NotifyArcPlayStoreEnabledChanged(bool enabled) override;
+  void NotifyLockedFullScreenStateChanged(bool enabled) override;
   void AddObserver(mojom::VoiceInteractionObserverPtr observer) override;
 
   // Adding local observers in the same process.
diff --git a/ash/voice_interaction/voice_interaction_controller_unittest.cc b/ash/voice_interaction/voice_interaction_controller_unittest.cc
index 4bf26b3..fb0e922e 100644
--- a/ash/voice_interaction/voice_interaction_controller_unittest.cc
+++ b/ash/voice_interaction/voice_interaction_controller_unittest.cc
@@ -5,6 +5,7 @@
 #include "ash/voice_interaction/voice_interaction_controller.h"
 
 #include <memory>
+#include <utility>
 
 #include "ash/public/interfaces/voice_interaction_controller.mojom.h"
 #include "ash/shell.h"
@@ -47,6 +48,7 @@
   void OnArcPlayStoreEnabledChanged(bool enabled) override {
     arc_play_store_enabled_ = enabled;
   }
+  void OnLockedFullScreenStateChanged(bool enabled) override {}
 
   mojom::VoiceInteractionState voice_interaction_state() const {
     return state_;
diff --git a/ash/wm/cursor_manager_chromeos.cc b/ash/wm/cursor_manager_chromeos.cc
index 4a42840..ff9a5b17 100644
--- a/ash/wm/cursor_manager_chromeos.cc
+++ b/ash/wm/cursor_manager_chromeos.cc
@@ -33,7 +33,7 @@
     return false;
 
   // Do not hide cursor when clicking the key with mouse button pressed.
-  if (Shell::Get()->aura_env()->IsMouseButtonDown())
+  if (aura::Env::GetInstance()->IsMouseButtonDown())
     return false;
 
   // Clicking on a key when the accessibility virtual keyboard is enabled should
diff --git a/ash/wm/drag_window_resizer_unittest.cc b/ash/wm/drag_window_resizer_unittest.cc
index c3ad7b4..1578639 100644
--- a/ash/wm/drag_window_resizer_unittest.cc
+++ b/ash/wm/drag_window_resizer_unittest.cc
@@ -652,7 +652,7 @@
     resizer->Drag(CalculateDragPoint(*resizer, 399, 200), 0);
     EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(399, 200)));
     EXPECT_EQ("401,200",
-              Shell::Get()->aura_env()->last_mouse_location().ToString());
+              aura::Env::GetInstance()->last_mouse_location().ToString());
     resizer->CompleteDrag();
   }
 
@@ -669,7 +669,7 @@
     resizer->Drag(CalculateDragPoint(*resizer, 399, 200), 0);
     EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(399, 200)));
     EXPECT_EQ("401,200",
-              Shell::Get()->aura_env()->last_mouse_location().ToString());
+              aura::Env::GetInstance()->last_mouse_location().ToString());
     resizer->CompleteDrag();
   }
 
@@ -679,7 +679,7 @@
     window->SetBoundsInScreen(
         gfx::Rect(0, 0, 50, 60),
         display::Screen::GetScreen()->GetPrimaryDisplay());
-    Shell::Get()->aura_env()->SetLastMouseLocation(gfx::Point(0, 0));
+    aura::Env::GetInstance()->SetLastMouseLocation(gfx::Point(0, 0));
     // Grab (0, 0) of the window.
     std::unique_ptr<WindowResizer> resizer(
         CreateDragWindowResizer(window, gfx::Point(), HTCAPTION));
@@ -687,7 +687,7 @@
     resizer->Drag(CalculateDragPoint(*resizer, 399, 200), 0);
     EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(399, 200)));
     EXPECT_EQ("401,200",
-              Shell::Get()->aura_env()->last_mouse_location().ToString());
+              aura::Env::GetInstance()->last_mouse_location().ToString());
     resizer->CompleteDrag();
   }
 
@@ -704,7 +704,7 @@
     resizer->Drag(CalculateDragPoint(*resizer, 399, 200), 0);
     EXPECT_FALSE(TestIfMouseWarpsAt(gfx::Point(399, 200)));
     EXPECT_EQ("399,200",
-              Shell::Get()->aura_env()->last_mouse_location().ToString());
+              aura::Env::GetInstance()->last_mouse_location().ToString());
     resizer->CompleteDrag();
   }
 
@@ -721,7 +721,7 @@
     resizer->Drag(CalculateDragPoint(*resizer, 399, 200), 0);
     EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(399, 200)));
     EXPECT_EQ("401,200",
-              Shell::Get()->aura_env()->last_mouse_location().ToString());
+              aura::Env::GetInstance()->last_mouse_location().ToString());
     resizer->CompleteDrag();
   }
 }
diff --git a/ash/wm/immersive_fullscreen_controller_unittest.cc b/ash/wm/immersive_fullscreen_controller_unittest.cc
index 6ce22b7..b5dd235a 100644
--- a/ash/wm/immersive_fullscreen_controller_unittest.cc
+++ b/ash/wm/immersive_fullscreen_controller_unittest.cc
@@ -566,7 +566,7 @@
   event_generator->MoveMouseTo(x, y_top_edge + 1);
   EXPECT_TRUE(top_edge_hover_timer_running());
   EXPECT_EQ(y_top_edge + 1,
-            Shell::Get()->aura_env()->last_mouse_location().y());
+            aura::Env::GetInstance()->last_mouse_location().y());
 
   // The timer should continue running if the user moves the mouse to the top
   // edge even though the mouse is warped to the secondary display.
diff --git a/ash/wm/lock_layout_manager.cc b/ash/wm/lock_layout_manager.cc
index 982c588..4050f2c4 100644
--- a/ash/wm/lock_layout_manager.cc
+++ b/ash/wm/lock_layout_manager.cc
@@ -52,7 +52,7 @@
   wm::WMEvent event(wm::WM_EVENT_ADDED_TO_WORKSPACE);
   window_state->OnWMEvent(&event);
 
-  Shell::Get()->aura_env()->gesture_recognizer()->CancelActiveTouchesExcept(
+  aura::Env::GetInstance()->gesture_recognizer()->CancelActiveTouchesExcept(
       nullptr);
 
   // Disable virtual keyboard overscroll because it interferes with scrolling
diff --git a/ash/wm/mru_window_tracker.cc b/ash/wm/mru_window_tracker.cc
index fd2e5199..6fe34e03 100644
--- a/ash/wm/mru_window_tracker.cc
+++ b/ash/wm/mru_window_tracker.cc
@@ -25,8 +25,32 @@
 
 namespace {
 
-bool IsWindowConsideredActivatable(const aura::Window* window) {
+// A class that observes a window that should not be destroyed inside a certain
+// scope. This class is added to investigate crbug.com/937381 to see if it's
+// possible that a window is destroyed while building up the mru window list.
+// TODO(crbug.com/937381): Remove this class once we figure out the reason.
+class ScopedWindowClosingObserver : public aura::WindowObserver {
+ public:
+  explicit ScopedWindowClosingObserver(aura::Window* window) : window_(window) {
+    window_->AddObserver(this);
+  }
+  ~ScopedWindowClosingObserver() override {
+    window_->RemoveObserver(this);
+    window_ = nullptr;
+  }
+
+  // aura::WindowObserver:
+  void OnWindowDestroyed(aura::Window* window) override { CHECK(false); }
+
+ private:
+  aura::Window* window_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedWindowClosingObserver);
+};
+
+bool IsWindowConsideredActivatable(aura::Window* window) {
   DCHECK(window);
+  ScopedWindowClosingObserver observer(window);
   AshFocusRules* focus_rules = Shell::Get()->focus_rules();
 
   // Only toplevel windows can be activated.
diff --git a/ash/wm/native_cursor_manager_ash.cc b/ash/wm/native_cursor_manager_ash.cc
index e89b258..fcdc60c3 100644
--- a/ash/wm/native_cursor_manager_ash.cc
+++ b/ash/wm/native_cursor_manager_ash.cc
@@ -152,9 +152,9 @@
   delegate->CommitMouseEventsEnabled(enabled);
 
   if (enabled)
-    Shell::Get()->aura_env()->SetLastMouseLocation(disabled_cursor_location_);
+    aura::Env::GetInstance()->SetLastMouseLocation(disabled_cursor_location_);
   else
-    disabled_cursor_location_ = Shell::Get()->aura_env()->last_mouse_location();
+    disabled_cursor_location_ = aura::Env::GetInstance()->last_mouse_location();
 
   SetVisibility(delegate->IsCursorVisible(), delegate);
   NotifyMouseEventsEnableStateChange(enabled);
diff --git a/ash/wm/overview/overview_controller.cc b/ash/wm/overview/overview_controller.cc
index 4936e46..d51378a3 100644
--- a/ash/wm/overview/overview_controller.cc
+++ b/ash/wm/overview/overview_controller.cc
@@ -651,8 +651,19 @@
   std::vector<aura::Window*> windows;
   for (const std::unique_ptr<OverviewGrid>& grid :
        overview_session_->grid_list_for_testing()) {
-    for (const auto& overview_session_item : grid->window_list())
-      windows.push_back(overview_session_item->GetWindow());
+    for (const auto& overview_item : grid->window_list())
+      windows.push_back(overview_item->GetWindow());
+  }
+  return windows;
+}
+
+std::vector<aura::Window*>
+OverviewController::GetItemWindowListInOverviewGridsForTest() {
+  std::vector<aura::Window*> windows;
+  for (const std::unique_ptr<OverviewGrid>& grid :
+       overview_session_->grid_list_for_testing()) {
+    for (const auto& overview_item : grid->window_list())
+      windows.push_back(overview_item->item_widget()->GetNativeWindow());
   }
   return windows;
 }
diff --git a/ash/wm/overview/overview_controller.h b/ash/wm/overview/overview_controller.h
index 7b7cd77..d86b7fa5 100644
--- a/ash/wm/overview/overview_controller.h
+++ b/ash/wm/overview/overview_controller.h
@@ -107,6 +107,7 @@
   // Gets the windows list that are shown in the overview windows grids if the
   // overview mode is active for testing.
   std::vector<aura::Window*> GetWindowsListInOverviewGridsForTest();
+  std::vector<aura::Window*> GetItemWindowListInOverviewGridsForTest();
 
  private:
   class OverviewWallpaperController;
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index 1e1564d..e6cdccb 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -182,14 +182,17 @@
 std::unique_ptr<views::Widget> CreateDropTargetWidget(
     aura::Window* dragged_window,
     bool animate) {
+  aura::Window* parent = dragged_window->parent();
+  gfx::Rect bounds = dragged_window->bounds();
+  ::wm::ConvertRectToScreen(parent, &bounds);
   views::Widget::InitParams params;
   params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
   params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
   params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO;
   params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
   params.accept_events = false;
-  params.parent = dragged_window->parent();
-  params.bounds = dragged_window->bounds();
+  params.parent = parent;
+  params.bounds = bounds;
   auto widget = std::make_unique<views::Widget>();
   widget->set_focus_on_creation(false);
   widget->Init(params);
@@ -581,11 +584,7 @@
                            const base::flat_set<OverviewItem*>& ignored_items,
                            size_t index) {
   DCHECK(!GetOverviewItemContaining(window));
-
-  // When an overview item is dragged, this function might be called on the
-  // wrong grid. See http://crbug.com/916856.
-  if (index > window_list_.size())
-    index = 0u;
+  DCHECK_LE(index, window_list_.size());
 
   window_observer_.Add(window);
   window_state_observer_.Add(wm::GetWindowState(window));
@@ -634,27 +633,17 @@
   overview_session_->AddItem(drop_target_widget_->GetNativeWindow(),
                              /*reposition=*/true, /*animate=*/false,
                              /*ignored_items=*/{dragged_item}, position);
-  OverviewItem* drop_target = GetDropTarget();
-  // See the comment in RemoveDropTarget() for how |drop_target| can be null.
-  if (drop_target) {
-    // This part is necessary because |OverviewItem::OnSelectorItemDragStarted|
-    // is called on all overview items before the drop target exists among them.
-    // That is because |AddDropTargetForDraggingFromOverview| is only called for
-    // drag to snap, but |OnSelectorItemDragStarted| is called before the drag
-    // has been disambiguated between drag to close and drag to snap.
-    drop_target->OnSelectorItemDragStarted(dragged_item);
-  }
+  // This part is necessary because |OverviewItem::OnSelectorItemDragStarted| is
+  // called on all overview items before the drop target exists among them. That
+  // is because |AddDropTargetForDraggingFromOverview| is only called for drag
+  // to snap, but |OnSelectorItemDragStarted| is called before the drag has been
+  // disambiguated between drag to close and drag to snap.
+  GetDropTarget()->OnSelectorItemDragStarted(dragged_item);
 }
 
 void OverviewGrid::RemoveDropTarget() {
   DCHECK(drop_target_widget_);
-  OverviewItem* drop_target = GetDropTarget();
-  // TODO(http://crbug.com/916856): Disable tab and app dragging that doesn't
-  // happen in the primary display.
-  // The |drop_target_widget_| may be not in the same display as the dragged
-  // window/item, which will cause |drop_target| to be null.
-  if (drop_target)
-    overview_session_->RemoveItem(drop_target);
+  overview_session_->RemoveItem(GetDropTarget());
   drop_target_widget_.reset();
 }
 
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index 645a93b2..fa72cf7 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -970,7 +970,8 @@
           screen_rect, target_bounds, top_view_inset, kHeaderHeightDp);
   // Do not set transform for drop target, set bounds instead.
   if (overview_grid_->IsDropTargetWindow(window)) {
-    window->layer()->SetBounds(gfx::ToEnclosedRect(overview_item_bounds));
+    window->SetBoundsInScreen(gfx::ToEnclosedRect(overview_item_bounds),
+                              wm::GetWindowState(window)->GetDisplay());
     window->SetTransform(gfx::Transform());
     return;
   }
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index ab8b487..118eab5 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -144,7 +144,7 @@
   // AshTestBase:
   void SetUp() override {
     AshTestBase::SetUp();
-    Shell::Get()->aura_env()->set_throttle_input_on_resize_for_testing(false);
+    aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
     shelf_view_test_api_ = std::make_unique<ShelfViewTestAPI>(
         GetPrimaryShelf()->GetShelfViewForTesting());
     shelf_view_test_api_->SetAnimationDuration(1);
@@ -1240,6 +1240,109 @@
   EXPECT_FALSE(InOverviewSession());
 }
 
+// Tests that dragging a window from the top of a display creates a drop target
+// on that display.
+TEST_F(OverviewSessionTest, DropTargetOnCorrectDisplayForDraggingFromTop) {
+  UpdateDisplay("600x600,600x600");
+  EnterTabletMode();
+  // DisplayConfigurationObserver enables mirror mode when tablet mode is
+  // enabled. Disable mirror mode to test multiple displays.
+  display_manager()->SetMirrorMode(display::MirrorMode::kOff, base::nullopt);
+  base::RunLoop().RunUntilIdle();
+
+  const aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows();
+  ASSERT_EQ(2u, root_windows.size());
+
+  std::unique_ptr<aura::Window> primary_screen_window =
+      CreateTestWindow(gfx::Rect(0, 0, 600, 600));
+  primary_screen_window->SetProperty(aura::client::kAppType,
+                                     static_cast<int>(AppType::BROWSER));
+  ASSERT_EQ(root_windows[0], primary_screen_window->GetRootWindow());
+  std::unique_ptr<aura::Window> secondary_screen_window =
+      CreateTestWindow(gfx::Rect(600, 0, 600, 600));
+  secondary_screen_window->SetProperty(aura::client::kAppType,
+                                       static_cast<int>(AppType::BROWSER));
+  ASSERT_EQ(root_windows[1], secondary_screen_window->GetRootWindow());
+
+  ASSERT_FALSE(InOverviewSession());
+  {
+    std::unique_ptr<WindowResizer> resizer =
+        CreateWindowResizer(primary_screen_window.get(), gfx::Point(400, 0),
+                            HTCAPTION, ::wm::WINDOW_MOVE_SOURCE_TOUCH);
+    ASSERT_TRUE(InOverviewSession());
+    EXPECT_FALSE(GetDropTarget(1));
+    ASSERT_TRUE(GetDropTarget(0));
+    EXPECT_EQ(root_windows[0], GetDropTarget(0)->root_window());
+    resizer->CompleteDrag();
+  }
+  ASSERT_FALSE(InOverviewSession());
+  {
+    std::unique_ptr<WindowResizer> resizer =
+        CreateWindowResizer(secondary_screen_window.get(), gfx::Point(400, 0),
+                            HTCAPTION, ::wm::WINDOW_MOVE_SOURCE_TOUCH);
+    ASSERT_TRUE(InOverviewSession());
+    EXPECT_FALSE(GetDropTarget(0));
+    ASSERT_TRUE(GetDropTarget(1));
+    EXPECT_EQ(root_windows[1], GetDropTarget(1)->root_window());
+    resizer->CompleteDrag();
+  }
+  ASSERT_FALSE(InOverviewSession());
+}
+
+// Tests that dragging a window from overview creates a drop target on the same
+// display.
+TEST_F(OverviewSessionTest, DropTargetOnCorrectDisplayForDraggingFromOverview) {
+  UpdateDisplay("600x600,600x600");
+  EnterTabletMode();
+  // DisplayConfigurationObserver enables mirror mode when tablet mode is
+  // enabled. Disable mirror mode to test multiple displays.
+  display_manager()->SetMirrorMode(display::MirrorMode::kOff, base::nullopt);
+  base::RunLoop().RunUntilIdle();
+
+  const aura::Window::Windows root_windows = Shell::Get()->GetAllRootWindows();
+  ASSERT_EQ(2u, root_windows.size());
+
+  std::unique_ptr<aura::Window> primary_screen_window =
+      CreateTestWindow(gfx::Rect(0, 0, 600, 600));
+  ASSERT_EQ(root_windows[0], primary_screen_window->GetRootWindow());
+  std::unique_ptr<aura::Window> secondary_screen_window =
+      CreateTestWindow(gfx::Rect(600, 0, 600, 600));
+  ASSERT_EQ(root_windows[1], secondary_screen_window->GetRootWindow());
+
+  ToggleOverview();
+  OverviewItem* primary_screen_item =
+      GetWindowItemForWindow(0, primary_screen_window.get());
+  OverviewItem* secondary_screen_item =
+      GetWindowItemForWindow(1, secondary_screen_window.get());
+
+  EXPECT_FALSE(GetDropTarget(0));
+  EXPECT_FALSE(GetDropTarget(1));
+  gfx::PointF drag_point = primary_screen_item->target_bounds().CenterPoint();
+  overview_session()->InitiateDrag(primary_screen_item, drag_point);
+  EXPECT_FALSE(GetDropTarget(0));
+  EXPECT_FALSE(GetDropTarget(1));
+  drag_point.Offset(5.f, 0.f);
+  overview_session()->Drag(primary_screen_item, drag_point);
+  EXPECT_FALSE(GetDropTarget(1));
+  ASSERT_TRUE(GetDropTarget(0));
+  EXPECT_EQ(root_windows[0], GetDropTarget(0)->root_window());
+  overview_session()->CompleteDrag(primary_screen_item, drag_point);
+  EXPECT_FALSE(GetDropTarget(0));
+  EXPECT_FALSE(GetDropTarget(1));
+  drag_point = secondary_screen_item->target_bounds().CenterPoint();
+  overview_session()->InitiateDrag(secondary_screen_item, drag_point);
+  EXPECT_FALSE(GetDropTarget(0));
+  EXPECT_FALSE(GetDropTarget(1));
+  drag_point.Offset(5.f, 0.f);
+  overview_session()->Drag(secondary_screen_item, drag_point);
+  EXPECT_FALSE(GetDropTarget(0));
+  ASSERT_TRUE(GetDropTarget(1));
+  EXPECT_EQ(root_windows[1], GetDropTarget(1)->root_window());
+  overview_session()->CompleteDrag(secondary_screen_item, drag_point);
+  EXPECT_FALSE(GetDropTarget(0));
+  EXPECT_FALSE(GetDropTarget(1));
+}
+
 namespace {
 
 // A simple window delegate that returns the specified hit-test code when
@@ -3089,7 +3192,7 @@
 
 // Verify the correct behavior when dragging windows in overview mode.
 TEST_F(SplitViewOverviewSessionTest, OverviewDragControllerBehavior) {
-  Shell::Get()->aura_env()->set_throttle_input_on_resize_for_testing(false);
+  aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
 
   std::unique_ptr<aura::Window> window1 = CreateTestWindow();
   std::unique_ptr<aura::Window> window2 = CreateTestWindow();
diff --git a/ash/wm/overview/overview_window_drag_controller.cc b/ash/wm/overview/overview_window_drag_controller.cc
index 6b09d125..505a923 100644
--- a/ash/wm/overview/overview_window_drag_controller.cc
+++ b/ash/wm/overview/overview_window_drag_controller.cc
@@ -309,27 +309,23 @@
   if (!ShouldUpdateDragIndicatorsOrSnap(location_in_screen))
     return;
 
-  // Attempt to update the drag indicators and move the window grid only if the
-  // window is snappable.
-  if (!CanSnapInSplitview(item_->GetWindow())) {
-    snap_position_ = SplitViewController::NONE;
-    return;
-  }
-
-  snap_position_ = GetSnapPosition(location_in_screen);
   IndicatorState indicator_state;
-  switch (snap_position_) {
-    case SplitViewController::NONE:
-      indicator_state = CanSnapInSplitview(item_->GetWindow())
-                            ? IndicatorState::kDragArea
-                            : IndicatorState::kCannotSnap;
-      break;
-    case SplitViewController::LEFT:
-      indicator_state = IndicatorState::kPreviewAreaLeft;
-      break;
-    case SplitViewController::RIGHT:
-      indicator_state = IndicatorState::kPreviewAreaRight;
-      break;
+  if (CanSnapInSplitview(item_->GetWindow())) {
+    snap_position_ = GetSnapPosition(location_in_screen);
+    switch (snap_position_) {
+      case SplitViewController::NONE:
+        indicator_state = IndicatorState::kDragArea;
+        break;
+      case SplitViewController::LEFT:
+        indicator_state = IndicatorState::kPreviewAreaLeft;
+        break;
+      case SplitViewController::RIGHT:
+        indicator_state = IndicatorState::kPreviewAreaRight;
+        break;
+    }
+  } else {
+    snap_position_ = SplitViewController::NONE;
+    indicator_state = IndicatorState::kCannotSnap;
   }
   overview_session_->RearrangeDuringDrag(item_->GetWindow(), location_in_screen,
                                          indicator_state);
diff --git a/ash/wm/splitview/split_view_drag_indicators_unittest.cc b/ash/wm/splitview/split_view_drag_indicators_unittest.cc
index 4a0a1fe..92dcaae 100644
--- a/ash/wm/splitview/split_view_drag_indicators_unittest.cc
+++ b/ash/wm/splitview/split_view_drag_indicators_unittest.cc
@@ -111,7 +111,7 @@
 
 TEST_F(SplitViewDragIndicatorsTest, Dragging) {
   base::HistogramTester histogram_tester;
-  Shell::Get()->aura_env()->set_throttle_input_on_resize_for_testing(false);
+  aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
   UpdateDisplay("800x600");
   const int screen_width = 800;
   const float edge_inset = GetEdgeInset(screen_width);
diff --git a/ash/wm/system_gesture_event_filter_unittest.cc b/ash/wm/system_gesture_event_filter_unittest.cc
index e10938d7..5345dc8 100644
--- a/ash/wm/system_gesture_event_filter_unittest.cc
+++ b/ash/wm/system_gesture_event_filter_unittest.cc
@@ -464,7 +464,7 @@
   child->Show();
 
   ui::test::TestEventHandler event_handler;
-  Shell::Get()->aura_env()->AddPreTargetHandler(
+  aura::Env::GetInstance()->AddPreTargetHandler(
       &event_handler, ui::EventTarget::Priority::kSystem);
 
   GetEventGenerator()->MoveMouseTo(0, 0);
@@ -475,7 +475,7 @@
   EXPECT_EQ(event_handler.num_gesture_events(),
             delegate.GetGestureCountAndReset());
 
-  Shell::Get()->aura_env()->RemovePreTargetHandler(&event_handler);
+  aura::Env::GetInstance()->RemovePreTargetHandler(&event_handler);
 }
 
 }  // namespace ash
diff --git a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc
index 98c19c4b..77b41394 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.cc
@@ -409,7 +409,8 @@
     scale = (1.0f - scale) * y_diff / y_full + scale;
 
   gfx::Transform transform;
-  const gfx::Rect window_bounds = dragged_window_->bounds();
+  gfx::Rect window_bounds = dragged_window_->bounds();
+  ::wm::ConvertRectToScreen(dragged_window_->parent(), &window_bounds);
   transform.Translate(
       (location_in_screen.x() - window_bounds.x()) -
           (initial_location_in_screen_.x() - window_bounds.x()) * scale,
diff --git a/ash/wm/video_detector.cc b/ash/wm/video_detector.cc
index edfd63e..dd7a9055 100644
--- a/ash/wm/video_detector.cc
+++ b/ash/wm/video_detector.cc
@@ -33,14 +33,14 @@
       is_shutting_down_(false),
       binding_(this),
       weak_factory_(this) {
-  Shell::Get()->aura_env()->AddObserver(this);
+  aura::Env::GetInstance()->AddObserver(this);
   Shell::Get()->AddShellObserver(this);
   EstablishConnectionToViz();
 }
 
 VideoDetector::~VideoDetector() {
   Shell::Get()->RemoveShellObserver(this);
-  Shell::Get()->aura_env()->RemoveObserver(this);
+  aura::Env::GetInstance()->RemoveObserver(this);
 }
 
 void VideoDetector::AddObserver(Observer* observer) {
@@ -123,8 +123,7 @@
   binding_.Bind(mojo::MakeRequest(&observer));
   binding_.set_connection_error_handler(base::BindOnce(
       &VideoDetector::OnConnectionError, base::Unretained(this)));
-  Shell::Get()
-      ->aura_env()
+  aura::Env::GetInstance()
       ->context_factory_private()
       ->GetHostFrameSinkManager()
       ->AddVideoDetectorObserver(std::move(observer));
diff --git a/build/android/docs/coverage.md b/build/android/docs/coverage.md
index a9fbf91..e162994 100644
--- a/build/android/docs/coverage.md
+++ b/build/android/docs/coverage.md
@@ -8,19 +8,19 @@
 ## How Jacoco coverage works
 
 In order to use Jacoco code coverage, we need to create build time pre-instrumented
-files and runtime **.exec** files. Then we need to process them using the
+class files and runtime **.exec** files. Then we need to process them using the
 **build/android/generate_jacoco_report.py** script.
 
-## How to collect Jacoco coverage data
+## How to collect coverage data
 
 1. Use the following GN build arguments:
 
-   ```gn
-   target_os = "android"
-   jacoco_coverage = true
-   ```
+  ```gn
+  target_os = "android"
+  jacoco_coverage = true
+  ```
 
-Now when building, pre-instrumented files will be created in the build directory.
+   Now when building, pre-instrumented files will be created in the build directory.
 
 2. Run tests, with option `--coverage-dir <directory>`, to specify where to save
    the .exec file. For example, you can run chrome junit tests:
@@ -29,35 +29,59 @@
 3. The coverage results of junit and instrumentation tests will be merged
    automatically if they are in the same directory.
 
-4. Now we have generated .exec files already. We can create a html/xml/csv report
-   using `generate_jacoco_report.py`, for example:
+## How to generate coverage report
 
-   ```shell
-   build/android/generate_jacoco_report.py \
-       --format html \
-       --output-dir tmp/coverage_report/ \
-       --coverage-dir /tmp/coverage/ \
-       --metadata-dir out/Debug/ \
-   ```
+1. Now we have generated .exec files already. We can create a Jacoco html/xml/csv
+   report using `generate_jacoco_report.py`, for example:
+
+  ```shell
+  build/android/generate_jacoco_report.py \
+     --format html \
+     --output-dir tmp/coverage_report/ \
+     --coverage-dir /tmp/coverage/ \
+     --sources-json-dir out/Debug/ \
+  ```
    Then an index.html containing coverage info will be created in output directory:
 
-   ```
-   [INFO] Loading execution data file /tmp/coverage/testTitle.exec.
-   [INFO] Loading execution data file /tmp/coverage/testSelected.exec.
-   [INFO] Loading execution data file /tmp/coverage/testClickToSelect.exec.
-   [INFO] Loading execution data file /tmp/coverage/testClickToClose.exec.
-   [INFO] Loading execution data file /tmp/coverage/testThumbnail.exec.
-   [INFO] Analyzing 58 classes.
-   ```
+  ```
+  [INFO] Loading execution data file /tmp/coverage/testTitle.exec.
+  [INFO] Loading execution data file /tmp/coverage/testSelected.exec.
+  [INFO] Loading execution data file /tmp/coverage/testClickToSelect.exec.
+  [INFO] Loading execution data file /tmp/coverage/testClickToClose.exec.
+  [INFO] Loading execution data file /tmp/coverage/testThumbnail.exec.
+  [INFO] Analyzing 58 classes.
+  ```
 
    For xml and csv reports, we need to specify `--output-file` instead of `--output-dir` since
    only one file will be generated as xml or csv report.
-   ```
-   --format xml \
-   --output-file tmp/coverage_report/report.xml \
-   ```
+  ```shell
+  build/android/generate_jacoco_report.py \
+    --format xml \
+    --output-file tmp/coverage_report/report.xml \
+    --coverage-dir /tmp/coverage/ \
+    --sources-json-dir out/Debug/ \
+  ```
 
-   ```
-   --format csv \
-   --output-file tmp/coverage_report/report.csv \
-   ```
+   or
+
+  ```shell
+  build/android/generate_jacoco_report.py \
+    --format csv \
+    --output-file tmp/coverage_report/report.csv \
+    --coverage-dir /tmp/coverage/ \
+    --sources-json-dir out/Debug/ \
+  ```
+
+2. We can also generate JSON format report for
+   [coverage tool](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/code_coverage.md)
+   created by Chrome Ops - CATS team.
+   In this case, we need to change `--format` to json, for example:
+
+  ```shell
+  build/android/generate_jacoco_report.py \
+    --format json \
+    --output-file tmp/coverage_report/coverage.json \
+    --coverage-dir /tmp/coverage/ \
+    --sources-json-dir out/Debug/ \
+  ```
+
diff --git a/build/android/generate_jacoco_report.py b/build/android/generate_jacoco_report.py
index 27f6e7e..cb18c96 100755
--- a/build/android/generate_jacoco_report.py
+++ b/build/android/generate_jacoco_report.py
@@ -13,6 +13,8 @@
 import json
 import os
 import sys
+import tempfile
+import xml.etree.ElementTree as ET
 
 import devil_chromium
 from devil.utils import cmd_helper
@@ -53,28 +55,34 @@
   return files
 
 
-def _AddArguments(parser):
-  """Adds arguments related to parser.
+def _ParseArguments(parser):
+  """Parses the command line arguments.
 
   Args:
     parser: ArgumentParser object.
+
+  Returns:
+    The parsed arguments.
   """
   parser.add_argument(
       '--format',
       required=True,
-      choices=['html', 'xml', 'csv'],
-      help='Output report format. Choose one from html, xml and csv.')
+      choices=['html', 'xml', 'csv', 'json'],
+      help='Output report format. Choose one from html, xml, csv and json.'
+      'json format conforms to '
+      '//infra/appengine/findit/model/proto/code_coverage.proto')
   parser.add_argument('--output-dir', help='html report output directory.')
-  parser.add_argument('--output-file', help='xml or csv report output file.')
+  parser.add_argument(
+      '--output-file', help='xml, csv or json report output file.')
   parser.add_argument(
       '--coverage-dir',
       required=True,
-      help=('Root of the directory in which to search for '
-            'coverage data (.exec) files.'))
+      help='Root of the directory in which to search for '
+      'coverage data (.exec) files.')
   parser.add_argument(
-      '--metadata-dir',
-      help=('Root of the directory in which to search for '
-            '*-filtered.jar and *__jacoco_sources.txt files.'))
+      '--sources-json-dir',
+      help='Root of the directory in which to search for '
+      '*__jacoco_sources.json files.')
   parser.add_argument(
       '--class-files',
       nargs='+',
@@ -92,90 +100,190 @@
   parser.add_argument(
       '--cleanup',
       action='store_true',
-      help=('If set, removes coverage files generated at '
-            'runtime.'))
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  _AddArguments(parser)
+      help='If set, removes coverage files generated at '
+      'runtime.')
   args = parser.parse_args()
 
   if args.format == 'html':
     if not args.output_dir:
       parser.error('--output-dir needed for html report.')
   elif not args.output_file:
-    parser.error('--output-file needed for xml or csv report.')
+    parser.error('--output-file needed for xml, csv or json report.')
 
-  if not (args.metadata_dir or args.class_files):
-    parser.error('At least either --metadata-dir or --class-files needed.')
+  if not (args.sources_json_dir or args.class_files):
+    parser.error('At least either --sources-json-dir or --class-files needed.')
+
+  if args.format == 'json' and not args.sources_json_dir:
+    parser.error('--sources-json-dir needed for json report')
+
+  return args
+
+
+def _GenerateJsonCoverageMetadata(out_file_path, jacoco_xml_path, source_dirs):
+  """Generates a JSON representation based on Jacoco xml report.
+
+  JSON format conforms to the proto:
+  //infra/appengine/findit/model/proto/code_coverage.proto
+  Writes the results of the coverage analysis to the file specified by
+  |out_file_path|.
+
+  Args:
+    out_file_path: A string representing the location to write JSON metadata.
+    jacoco_xml_path: A string representing the file path to Jacoco xml report.
+    source_dirs: A list of source directories of Java source files.
+
+  Raises:
+    Exception: No Jacoco xml report found or
+      cannot find package directory according to src root.
+  """
+  if not os.path.exists(jacoco_xml_path):
+    raise Exception('No Jacoco xml report found on %s' % jacoco_xml_path)
+
+  data = {}
+  data['files'] = []
+
+  tree = ET.parse(jacoco_xml_path)
+  root = tree.getroot()
+
+  for package in root.iter('package'):
+    package_path = package.attrib['name']
+    print('Processing package %s' % package_path)
+
+    # Find package directory according to src root.
+    package_source_dir = ''
+    for source_dir in source_dirs:
+      if package_path in source_dir:
+        package_source_dir = source_dir
+        break
+    if not package_source_dir:
+      raise Exception('Cannot find package directory according to src root')
+
+    for sourcefile in package.iter('sourcefile'):
+      sourcefile_name = sourcefile.attrib['name']
+      path = os.path.join(package_source_dir, sourcefile_name)
+      print('Processing file %s' % path)
+
+      file_coverage = {}
+      file_coverage['path'] = path
+      file_coverage['lines'] = []
+      file_coverage['branches'] = []
+
+      # Calculate file's total lines.
+      abs_path = os.path.join(host_paths.DIR_SOURCE_ROOT, path)
+      if os.path.exists(abs_path):
+        with open(abs_path, 'r') as f:
+          file_coverage['total_lines'] = sum(1 for _ in f)
+
+      for line in sourcefile.iter('line'):
+        line_number = int(line.attrib['nr'])
+        covered_instructions = int(line.attrib['ci'])
+        missed_branches = int(line.attrib['mb'])
+        covered_branches = int(line.attrib['cb'])
+
+        is_branch = False
+        if missed_branches > 0 or covered_branches > 0:
+          is_branch = True
+
+        line_coverage = {}
+        line_coverage['first'] = line_number
+        line_coverage['last'] = line_number
+        line_coverage['count'] = covered_instructions
+        file_coverage['lines'].append(line_coverage)
+
+        if is_branch:
+          branch_coverage = {}
+          branch_coverage['line'] = line_number
+          branch_coverage['total'] = covered_branches + missed_branches
+          branch_coverage['covered'] = covered_branches
+          file_coverage['branches'].append(branch_coverage)
+
+      data['files'].append(file_coverage)
+
+  with open(out_file_path, 'w') as f:
+    json.dump(data, f)
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  args = _ParseArguments(parser)
 
   devil_chromium.Initialize()
 
   coverage_files = _GetFilesWithSuffix(args.coverage_dir, '.exec')
   if not coverage_files:
-    parser.error('Found no coverage file under %s' % args.coverage_dir)
+    parser.error('No coverage file found under %s' % args.coverage_dir)
   print('Found coverage files: %s' % str(coverage_files))
 
   class_files = []
-  sources = []
-  if args.metadata_dir:
-    sources_json_files = _GetFilesWithSuffix(args.metadata_dir,
+  source_dirs = []
+  if args.sources_json_dir:
+    sources_json_files = _GetFilesWithSuffix(args.sources_json_dir,
                                              _SOURCES_JSON_FILES_SUFFIX)
     for f in sources_json_files:
       with open(f, 'r') as json_file:
         data = json.load(json_file)
         class_files.append(data['input_path'])
-        sources.extend(data['source_dirs'])
+        source_dirs.extend(data['source_dirs'])
 
-  fixed_source_paths = set()
-
-  for path in sources:
+  # Fix source directories as direct parent of Java packages.
+  fixed_source_dirs = set()
+  for path in source_dirs:
     for partial in _PARTIAL_PACKAGE_NAMES:
       if partial in path:
-        fixed_path = os.path.join(host_paths.DIR_SOURCE_ROOT,
-                                  path[:path.index(partial)])
-        fixed_source_paths.add(fixed_path)
+        fixed_dir = os.path.join(host_paths.DIR_SOURCE_ROOT,
+                                 path[:path.index(partial)])
+        fixed_source_dirs.add(fixed_dir)
         break
 
-  sources = list(fixed_source_paths)
-
   if args.class_files:
     class_files += args.class_files
   if args.sources:
-    sources += args.sources
+    fixed_source_dirs.update(args.sources)
 
   cmd = [
       'java', '-jar',
       os.path.join(host_paths.DIR_SOURCE_ROOT, 'third_party', 'jacoco', 'lib',
                    'jacococli.jar'), 'report'
   ] + coverage_files
+
   for f in class_files:
     cmd += ['--classfiles', f]
-  for source in sources:
+  for source in fixed_source_dirs:
     cmd += ['--sourcefiles', source]
-  if args.format == 'html':
-    cmd += ['--html', args.output_dir]
-  elif args.format == 'xml':
-    cmd += ['--xml', args.output_file]
-  else:
-    cmd += ['--csv', args.output_file]
 
-  exit_code = cmd_helper.RunCmd(cmd)
-
-  if args.cleanup:
-    for f in coverage_files:
-      os.remove(f)
-
-  # Command tends to exit with status 0 when it actually failed.
-  if not exit_code:
+  # For json format, xml report will be generated first temporarily
+  # then parsed to json metadata to --output-file.
+  with tempfile.NamedTemporaryFile() as temp:
     if args.format == 'html':
-      if not os.path.exists(args.output_dir) or not os.listdir(args.output_dir):
-        print('No report generated at %s' % args.output_dir)
+      out_cmd = ['--html', args.output_dir]
+    elif args.format == 'xml':
+      out_cmd = ['--xml', args.output_file]
+    elif args.format == 'csv':
+      out_cmd = ['--csv', args.output_file]
+    else:
+      out_cmd = ['--xml', temp.name]
+
+    cmd += out_cmd
+
+    exit_code = cmd_helper.RunCmd(cmd)
+
+    if args.cleanup:
+      for f in coverage_files:
+        os.remove(f)
+
+    # Command tends to exit with status 0 when it actually failed.
+    if not exit_code:
+      if args.format == 'html':
+        if not os.path.exists(args.output_dir) or not os.listdir(
+            args.output_dir):
+          print('No report generated at %s' % args.output_dir)
+          exit_code = 1
+      elif not os.path.exists(out_cmd[1]):
+        print('No report generated at %s' % args.output_file)
         exit_code = 1
-    elif not os.path.exists(args.output_file):
-      print('No report generated at %s' % args.output_file)
-      exit_code = 1
+
+    if args.format == 'json':
+      _GenerateJsonCoverageMetadata(args.output_file, temp.name, source_dirs)
 
   return exit_code
 
diff --git a/build/android/gyp/create_stack_script.py b/build/android/gyp/create_stack_script.py
deleted file mode 100755
index 10c150d..0000000
--- a/build/android/gyp/create_stack_script.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-import argparse
-import os
-import sys
-import textwrap
-
-from util import build_utils
-
-SCRIPT_TEMPLATE = textwrap.dedent(
-    """\
-    #!/usr/bin/env python
-    #
-    # This file was generated by build/android/gyp/create_stack_script.py
-
-    from __future__ import print_function
-
-    import os
-    import sys
-
-    def main(argv):
-      script_directory = os.path.dirname(__file__)
-      resolve = lambda p: os.path.abspath(os.path.join(script_directory, p))
-      script_path = resolve('{script_path}')
-      script_args = {script_args}
-      script_path_args = {script_path_args}
-      for arg, path in script_path_args:
-        script_args.extend([arg, resolve(path)])
-      script_cmd = [script_path] + script_args + argv
-      print(' '.join(script_cmd))
-      os.execv(script_path, script_cmd)
-
-    if __name__ == '__main__':
-      sys.exit(main(sys.argv[1:]))
-    """)
-
-
-def main(args):
-
-  parser = argparse.ArgumentParser()
-  parser.add_argument(
-      '--script-path',
-      help='Path to the wrapped script.')
-  parser.add_argument(
-      '--script-output-path',
-      help='Path to the output script.')
-  group = parser.add_argument_group('Path arguments')
-  group.add_argument('--output-directory')
-  group.add_argument('--packed-libs')
-
-  args, script_args = parser.parse_known_args(build_utils.ExpandFileArgs(args))
-
-  def relativize(p):
-    return os.path.relpath(p, os.path.dirname(args.script_output_path))
-
-  script_path = relativize(args.script_path)
-
-  script_path_args = []
-  if args.output_directory:
-    script_path_args.append(
-        ('--output-directory', relativize(args.output_directory)))
-  if args.packed_libs:
-    for p in build_utils.ParseGnList(args.packed_libs):
-      script_path_args.append(('--packed-lib', relativize(p)))
-
-  with build_utils.AtomicOutput(args.script_output_path) as script:
-    script.write(SCRIPT_TEMPLATE.format(
-        script_path=script_path,
-        script_args=script_args,
-        script_path_args=script_path_args))
-
-  os.chmod(args.script_output_path, 0750)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/build/android/gyp/create_stack_script.pydeps b/build/android/gyp/create_stack_script.pydeps
deleted file mode 100644
index 7bddb156..0000000
--- a/build/android/gyp/create_stack_script.pydeps
+++ /dev/null
@@ -1,7 +0,0 @@
-# Generated by running:
-#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_stack_script.pydeps build/android/gyp/create_stack_script.py
-../../gn_helpers.py
-create_stack_script.py
-util/__init__.py
-util/build_utils.py
-util/md5_check.py
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 737495b..f1d72f7b 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -845,52 +845,29 @@
 }
 
 template("stack_script") {
-  action_with_pydeps(target_name) {
+  generate_wrapper(target_name) {
     forward_variables_from(invoker,
                            [
-                             "data_deps",
                              "deps",
                              "testonly",
                            ])
-    if (!defined(deps)) {
-      deps = []
-    }
-    if (!defined(data_deps)) {
-      data_deps = []
-    }
-
-    data_deps +=
-        [ "//third_party/android_platform/development/scripts:stack_py" ]
-
-    script = "//build/android/gyp/create_stack_script.py"
-
     _stack_target_name = invoker.stack_target_name
-    _stack_script = "//third_party/android_platform/development/scripts/stack"
 
-    _generated_script = "$root_build_dir/bin/stack_${_stack_target_name}"
-
-    outputs = [
-      _generated_script,
+    data_deps = [
+      "//third_party/android_platform/development/scripts:stack_py",
     ]
-    data = [
-      _generated_script,
-    ]
+    if (defined(invoker.data_deps)) {
+      data_deps += invoker.data_deps
+    }
 
-    args = [
+    executable = "//third_party/android_platform/development/scripts/stack"
+    wrapper_script = "$root_build_dir/bin/stack_${_stack_target_name}"
+
+    executable_args = [
       "--output-directory",
-      rebase_path(root_build_dir, root_build_dir),
-      "--script-path",
-      rebase_path(_stack_script, root_build_dir),
-      "--script-output-path",
-      rebase_path(_generated_script, root_build_dir),
+      "@WrappedPath(.)",
       "--arch=$target_cpu",
     ]
-    if (defined(invoker.packed_libraries)) {
-      args += [
-        "--packed-libs",
-        invoker.packed_libraries,
-      ]
-    }
   }
 }
 
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 55cd25d..d48a2856 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8913214486540616192
\ No newline at end of file
+8912934291927162032
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index bdb2ba08..06cf694 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8913219563458029600
\ No newline at end of file
+8912948016361816848
\ No newline at end of file
diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc
index 53c2f32..2eacbf7 100644
--- a/build/sanitizers/tsan_suppressions.cc
+++ b/build/sanitizers/tsan_suppressions.cc
@@ -183,10 +183,6 @@
     // http://crbug.com/633145
     "race:third_party/libjpeg_turbo/simd/jsimd_x86_64.c\n"
 
-    // http://crbug.com/v8/6065
-    "race:net::(anonymous namespace)::ProxyResolverV8TracingImpl::RequestImpl"
-    "::~RequestImpl()\n"
-
     // http://crbug.com/691029
     "deadlock:libGLX.so*\n"
 
@@ -201,9 +197,6 @@
     // http://crbug.com/795110
     "race:third_party/fontconfig/*\n"
 
-    // http://crbug.com/797998
-    "race:content::SandboxIPCHandler::HandleLocaltime\n"
-
     // http://crbug.com/927330
     "race:net::(anonymous namespace)::g_network_change_notifier\n"
 
diff --git a/build/util/android_chrome_version.py b/build/util/android_chrome_version.py
index 5628f1a..eb58b2f 100644
--- a/build/util/android_chrome_version.py
+++ b/build/util/android_chrome_version.py
@@ -90,14 +90,8 @@
 
 We choose 5 because it won't conflict with values in
 ANDROID_CHROME_APK_VERSION_CODE_DIFFS
-
-We also increment BUILD (branch) number to ensure that the version code is
-higher for the next build than any build with the same BUILD value (even if the
-other builds have a higher PATCH value). This is needed for release logistics
-when working with unreleased Android versions: upgrading android will install
-the chrome build (the "next" build) that uses the new android sdk.
 """
-NEXT_BUILD_VERSION_CODE_DIFF = 100005
+NEXT_BUILD_VERSION_CODE_DIFF = 5
 
 """For 64-bit architectures, some packages have multiple targets with version
 codes that differ by the second-to-last digit (the architecture digit). This is
diff --git a/build/util/android_chrome_version_test.py b/build/util/android_chrome_version_test.py
index 5e743d3..529ccd3 100644
--- a/build/util/android_chrome_version_test.py
+++ b/build/util/android_chrome_version_test.py
@@ -101,10 +101,10 @@
     webview_stable_version_code = output['WEBVIEW_STABLE_VERSION_CODE']
     webview_beta_version_code = output['WEBVIEW_BETA_VERSION_CODE']
 
-    self.assertEqual(chrome_version_code, '372100005')
-    self.assertEqual(monochrome_version_code, '372100007')
-    self.assertEqual(webview_stable_version_code, '372100005')
-    self.assertEqual(webview_beta_version_code, '372100006')
+    self.assertEqual(chrome_version_code, '372000005')
+    self.assertEqual(monochrome_version_code, '372000007')
+    self.assertEqual(webview_stable_version_code, '372000005')
+    self.assertEqual(webview_beta_version_code, '372000006')
 
   def testGenerateVersionCodesAndroidArchArm(self):
     """Assert it handles different architectures correctly.
diff --git a/buildtools/DEPS b/buildtools/DEPS
index 55313b8..218a4fe 100644
--- a/buildtools/DEPS
+++ b/buildtools/DEPS
@@ -14,7 +14,7 @@
   #
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:64b846c96daeb3eaf08e26d8a84d8451c6cb712b',
+  'gn_version': 'git_revision:81ee1967d3fcbc829bac1c005c3da59739c88df9',
 
   # When changing these, also update the svn revisions in deps_revisions.gni
   'clang_format_revision': '96636aa0e9f047f17447f2d45a094d0b59ed7917',
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index c1a65c4..0ccf3592 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -822,11 +822,6 @@
       # versions.
       ":clean_up_old_versions",
 
-      # keystone_registration_framework copies the framework into the framework
-      # bundle via a script that performs additional actions, rather than
-      # relying on a bundle_data to copy it.
-      ":keystone_registration_framework",
-
       # verify_chrome_framework_order depends on :chrome_framework and, for
       # non-component builds, will ensure the export symbol table is correct.
       ":verify_chrome_framework_order",
@@ -1251,33 +1246,11 @@
     }
   }
 
-  if (is_chrome_branded && enable_keystone_registration_framework) {
-    action("keystone_registration_framework") {
-      script = "//chrome/tools/build/mac/copy_keystone_framework.py"
-
-      framework_path = "//third_party/googlemac/Releases/Keystone/KeystoneRegistration.framework"
-      output_path = "$root_out_dir/$chrome_framework_name.framework/Versions/$chrome_framework_version/Frameworks/"
-
-      sources = [
-        framework_path,
-        script,
+  group("keystone_registration_framework") {
+    if (is_chrome_branded && enable_keystone_registration_framework) {
+      deps = [
+        "//third_party/googlemac/Releases/Keystone:keystone_registration",
       ]
-
-      args = [
-        rebase_path(framework_path, root_out_dir),
-        rebase_path(output_path, root_out_dir),
-      ]
-
-      if (!use_system_xcode) {
-        args += [ hermetic_xcode_path ]
-      }
-
-      outputs = [
-        "$output_path/KeystoneRegistration.framework",
-      ]
-    }
-  } else {
-    group("keystone_registration_framework") {
     }
   }
 
@@ -1387,6 +1360,7 @@
       ":chrome_framework_plugins",
       ":chrome_framework_resources",
       ":chrome_framework_services",
+      ":keystone_registration_framework",
       ":packed_resources",
       ":swiftshader_library",
       ":widevine_cdm_library",
diff --git a/chrome/VERSION b/chrome/VERSION
index ecb137bd..6cb0cf7 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=76
 MINOR=0
-BUILD=3798
+BUILD=3801
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 6fe72d0..b8c5c6b 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -561,7 +561,7 @@
   package_path = "org/chromium/chrome/browser"
 
   defines = []
-  if (enable_offline_pages) {
+  if (!notouch_build) {
     defines += [ "_ENABLE_OFFLINE_PAGES" ]
   }
 }
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 8c78b1d3..66ffb778 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1540,7 +1540,6 @@
   "java/src/org/chromium/chrome/browser/tasks/TaskRecognizer.java",
   "java/src/org/chromium/chrome/browser/tasks/TasksUma.java",
   "java/src/org/chromium/chrome/browser/tasks/tabgroup/TabGroupModelFilter.java",
-  "java/src/org/chromium/chrome/browser/tasks/tab_groups/LayoutTabGroupCreationButton.java",
   "java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java",
   "java/src/org/chromium/chrome/browser/toolbar/HomeButton.java",
   "java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java",
@@ -1629,6 +1628,8 @@
   "java/src/org/chromium/chrome/browser/util/IntentUtils.java",
   "java/src/org/chromium/chrome/browser/util/KeyNavigationUtil.java",
   "java/src/org/chromium/chrome/browser/util/MathUtils.java",
+  "java/src/org/chromium/chrome/browser/util/ObservableSupplier.java",
+  "java/src/org/chromium/chrome/browser/util/ObservableSupplierImpl.java",
   "java/src/org/chromium/chrome/browser/util/PlatformUtil.java",
   "java/src/org/chromium/chrome/browser/util/UrlUtilities.java",
   "java/src/org/chromium/chrome/browser/util/ViewUtils.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index d8a57fb..b841259 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -181,6 +181,7 @@
   "junit/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java",
   "junit/src/org/chromium/chrome/browser/usage_stats/EventTrackerTest.java",
   "junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java",
+  "junit/src/org/chromium/chrome/browser/util/ObservableSupplierImplTest.java",
   "junit/src/org/chromium/chrome/browser/util/UrlUtilitiesUnitTest.java",
   "junit/src/org/chromium/chrome/browser/util/test/ShadowUrlUtilities.java",
   "junit/src/org/chromium/chrome/browser/webapps/MockWebappDataStorageClockRule.java",
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index 6eea5be..2919c64a 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -336,7 +336,7 @@
 
       _deps += [
         "//android_webview:monochrome_webview_assets",
-        "//android_webview/apk:webview_license_activity_java",
+        "//android_webview/apk:apk_java",
         "//android_webview/glue",
         "//chrome/android:monochrome_java",
         "//chrome/android/monochrome:monochrome_license_provider_java",
diff --git a/chrome/android/features/autofill_assistant/java/res/drawable/autofill_assistant_form_input_divider.xml b/chrome/android/features/autofill_assistant/java/res/drawable/autofill_assistant_form_input_divider.xml
new file mode 100644
index 0000000..4cbcac6
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/java/res/drawable/autofill_assistant_form_input_divider.xml
@@ -0,0 +1,14 @@
+<?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. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item
+        android:top="4dp"
+        android:bottom="10dp">
+        <shape >
+            <size android:height="1dp" />
+            <solid android:color="@color/modern_grey_100" />
+        </shape>
+    </item>
+</layer-list>
diff --git a/chrome/android/features/autofill_assistant/java/res/drawable/ic_add_outline_white_24dp.xml b/chrome/android/features/autofill_assistant/java/res/drawable/ic_add_outline_white_24dp.xml
new file mode 100644
index 0000000..9ce09002
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/java/res/drawable/ic_add_outline_white_24dp.xml
@@ -0,0 +1,16 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    tools:targetApi="21">
+  <path
+      android:pathData="M13,7h-2v4L7,11v2h4v4h2v-4h4v-2h-4L13,7zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"
+      android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/chrome/android/features/autofill_assistant/java/res/drawable/ic_remove_outline_white_24dp.xml b/chrome/android/features/autofill_assistant/java/res/drawable/ic_remove_outline_white_24dp.xml
new file mode 100644
index 0000000..d785528
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/java/res/drawable/ic_remove_outline_white_24dp.xml
@@ -0,0 +1,16 @@
+<?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:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    tools:targetApi="21">
+  <path
+      android:pathData="M7,11v2h10v-2L7,11zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"
+      android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_form_counter.xml b/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_form_counter.xml
index f9315222..8374730 100644
--- a/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_form_counter.xml
+++ b/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_form_counter.xml
@@ -5,26 +5,51 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:minHeight="40dp"
     android:orientation="horizontal"
-    android:layout_gravity="center_horizontal">
-    <TextView
-        android:id="@+id/label"
+    android:gravity="center_vertical">
+    <LinearLayout
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_weight="1"/>
-    <Button
+        android:layout_weight="1"
+        android:orientation="vertical">
+        <TextView
+            android:id="@+id/label"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.BlackTitle2"/>
+        <TextView
+            android:id="@+id/subtext"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.BlackCaption"
+            android:visibility="gone"/>
+    </LinearLayout>
+    <ImageView
         android:id="@+id/decrease_button"
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:padding="4dp"
+        android:tint="@color/filled_button_bg"
+        app:srcCompat="@drawable/ic_remove_outline_white_24dp"
+        tools:ignore="ContentDescription"/>
+    <TextView
+        android:id="@+id/value"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="-"
-        tools:ignore="HardcodedText"/>
-    <Button
+        android:minWidth="20dp"
+        android:gravity="center"
+        android:textAppearance="@style/TextAppearance.BlackTitle2"/>
+    <ImageView
         android:id="@+id/increase_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="+"
-        tools:ignore="HardcodedText"/>
+        android:layout_width="32dp"
+        android:layout_height="32dp"
+        android:padding="4dp"
+        android:tint="@color/filled_button_bg"
+        app:srcCompat="@drawable/ic_add_outline_white_24dp"
+        tools:ignore="ContentDescription"/>
 </LinearLayout>
diff --git a/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_form_counter_input.xml b/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_form_counter_input.xml
index def484f4..1e09a14 100644
--- a/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_form_counter_input.xml
+++ b/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_form_counter_input.xml
@@ -5,22 +5,49 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical">
     <TextView
         android:id="@+id/label"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"/>
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="4dp"
+        android:textAppearance="@style/TextAppearance.BlackTitle2"/>
     <LinearLayout
         android:id="@+id/expandable_section"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:orientation="vertical"
         android:visibility="gone"/>
-    <TextView
-        android:id="@+id/expand_label"
+    <LinearLayout
+        android:id="@+id/expand_label_container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:visibility="gone"/>
+        android:gravity="center_vertical"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
+        android:orientation="horizontal"
+        android:visibility="gone"
+        tools:ignore="UseCompoundDrawables">
+        <TextView
+            android:id="@+id/expand_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.BlackCaption"/>
+        <TextView
+            android:id="@+id/minimize_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.BlackCaption"/>
+        <ImageView
+            android:id="@+id/chevron"
+            android:layout_width="16dp"
+            android:layout_height="16dp"
+            android:tint="@color/default_text_color_secondary_list"
+            app:srcCompat="@drawable/ic_expand_more_black_24dp"
+            tools:ignore="ContentDescription"/>
+    </LinearLayout>
 </LinearLayout>
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java
index f7425f3..fcca1a5 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantBottomBarCoordinator.java
@@ -69,16 +69,13 @@
         mContent = new AssistantBottomSheetContent(activity);
 
         // Instantiate child components.
-        int childSpacing = activity.getResources().getDimensionPixelSize(
-                R.dimen.autofill_assistant_bottombar_vertical_spacing);
         mHeaderCoordinator = new AssistantHeaderCoordinator(
                 activity, mContent.mBottomBarView, model.getHeaderModel());
         mInfoBoxCoordinator = new AssistantInfoBoxCoordinator(activity, model.getInfoBoxModel());
         mDetailsCoordinator = new AssistantDetailsCoordinator(activity, model.getDetailsModel());
         mPaymentRequestCoordinator =
                 new AssistantPaymentRequestCoordinator(activity, model.getPaymentRequestModel());
-        mFormCoordinator =
-                new AssistantFormCoordinator(activity, model.getFormModel(), childSpacing);
+        mFormCoordinator = new AssistantFormCoordinator(activity, model.getFormModel());
         mSuggestionsCoordinator =
                 new AssistantSuggestionsCarouselCoordinator(activity, model.getSuggestionsModel());
         mActionsCoordinator =
@@ -101,8 +98,11 @@
         // do not hide them because there is an incompatibility bug between the animateLayoutChanges
         // attribute set on mBottomBarView and the animations ran by the carousels
         // RecyclerView.
+        int childSpacing = activity.getResources().getDimensionPixelSize(
+                R.dimen.autofill_assistant_bottombar_vertical_spacing);
         setChildMarginTop(mDetailsCoordinator.getView(), childSpacing);
         setChildMarginTop(mPaymentRequestCoordinator.getView(), childSpacing);
+        setChildMarginTop(mFormCoordinator.getView(), childSpacing);
         setCarouselMarginTop(mSuggestionsCoordinator.getView(),
                 model.getSuggestionsModel().getChipsModel(), childSpacing);
         setCarouselMarginTop(mActionsCoordinator.getView(), model.getActionsModel().getChipsModel(),
@@ -169,6 +169,7 @@
         mInfoBoxCoordinator = null;
         mPaymentRequestCoordinator.destroy();
         mPaymentRequestCoordinator = null;
+        mHeaderCoordinator.destroy();
     }
 
     /**
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCoordinator.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCoordinator.java
index 79d1c72..dd4a691 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCoordinator.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCoordinator.java
@@ -5,11 +5,13 @@
 package org.chromium.chrome.browser.autofill_assistant.form;
 
 import android.content.Context;
+import android.support.v7.content.res.AppCompatResources;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
 import android.widget.ScrollView;
 
+import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.autofill_assistant.AbstractListObserver;
 
 /**
@@ -24,8 +26,7 @@
 
     private boolean mForceInvisible;
 
-    public AssistantFormCoordinator(
-            Context context, AssistantFormModel model, int verticalSpacingPx) {
+    public AssistantFormCoordinator(Context context, AssistantFormModel model) {
         mModel = model;
         mView = new ScrollView(context);
         mContainerView = new LinearLayout(context);
@@ -35,6 +36,9 @@
         mContainerView.setLayoutParams(new ViewGroup.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
         mContainerView.setOrientation(LinearLayout.VERTICAL);
+        mContainerView.setDividerDrawable(AppCompatResources.getDrawable(
+                context, R.drawable.autofill_assistant_form_input_divider));
+        mContainerView.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
         mView.addView(mContainerView);
 
         updateVisibility();
@@ -46,8 +50,6 @@
                     // Add the views to the linear layout (not the scroll view).
                     View view = input.createView(context, mContainerView);
                     mContainerView.addView(view);
-                    ((LinearLayout.LayoutParams) view.getLayoutParams()).topMargin =
-                            verticalSpacingPx;
                 }
                 updateVisibility();
             }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounter.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounter.java
index c6f4684a..bf1e876 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounter.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounter.java
@@ -8,13 +8,16 @@
 
 class AssistantFormCounter {
     private final String mLabel;
+    private final String mSubtext;
     private final ChoiceFormat mLabelChoiceFormat;
     private final int mMinValue;
     private final int mMaxValue;
     private int mValue;
 
-    AssistantFormCounter(String label, int initialValue, int minValue, int maxValue) {
+    AssistantFormCounter(
+            String label, String subtext, int initialValue, int minValue, int maxValue) {
         mLabel = label;
+        mSubtext = subtext;
         mLabelChoiceFormat = new ChoiceFormat(label);
         mValue = initialValue;
         mMinValue = minValue;
@@ -25,6 +28,10 @@
         return mLabel;
     }
 
+    String getSubtext() {
+        return mSubtext;
+    }
+
     ChoiceFormat getLabelChoiceFormat() {
         return mLabelChoiceFormat;
     }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounterInput.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounterInput.java
index b439067..46e55db 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounterInput.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormCounterInput.java
@@ -5,6 +5,11 @@
 package org.chromium.chrome.browser.autofill_assistant.form;
 
 import android.content.Context;
+import android.transition.ChangeBounds;
+import android.transition.Fade;
+import android.transition.Transition;
+import android.transition.TransitionManager;
+import android.transition.TransitionSet;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -18,21 +23,34 @@
 /** A form input that allows to modify one or multiple counters. */
 class AssistantFormCounterInput extends AssistantFormInput {
     private static final String QUOTED_VALUE = Pattern.quote("{value}");
+    private static final Transition EXPAND_TRANSITION =
+            new TransitionSet()
+                    .setOrdering(TransitionSet.ORDERING_TOGETHER)
+                    .addTransition(new Fade(Fade.OUT))
+                    .addTransition(new ChangeBounds())
+                    .addTransition(new Fade(Fade.IN));
 
     interface Delegate {
         void onCounterChanged(int counterIndex, int value);
     }
 
     private final String mLabel;
+    private final String mExpandText;
+    private final String mMinimizeText;
     private final List<AssistantFormCounter> mCounters;
     private final int mMinimizedCount;
     private final Delegate mDelegate;
 
-    AssistantFormCounterInput(String label, List<AssistantFormCounter> counters, int minimizedCount,
-            Delegate delegate) {
+    AssistantFormCounterInput(String label, String expandText, String minimizeText,
+            List<AssistantFormCounter> counters, int minimizedCount, Delegate delegate) {
         mLabel = label;
+        mExpandText = expandText;
+        mMinimizeText = minimizeText;
         mCounters = counters;
-        mMinimizedCount = minimizedCount;
+
+        // Don't show the expandable section if there is no text to show when minimized/expanded.
+        mMinimizedCount =
+                expandText.isEmpty() || minimizeText.isEmpty() ? Integer.MAX_VALUE : minimizedCount;
         mDelegate = delegate;
     }
 
@@ -59,27 +77,42 @@
             }
         }
 
-        // If some counters are in the expandable section, show the "Show more" label that will
-        // expand it when clicked.
+        // If some counters are in the expandable section, show the expand label that will expand
+        // the section when clicked.
         if (expandableSection.getChildCount() > 0) {
+            View expandLabelContainer = root.findViewById(R.id.expand_label_container);
             TextView expandLabel = root.findViewById(R.id.expand_label);
-            expandLabel.setVisibility(View.VISIBLE);
+            TextView minimizeLabel = root.findViewById(R.id.minimize_label);
+            View chevron = root.findViewById(R.id.chevron);
 
-            String expandString =
-                    context.getResources().getString(R.string.autofill_assistant_form_show_more);
-            String shrinkString =
-                    context.getResources().getString(R.string.autofill_assistant_form_show_less);
-            expandLabel.setText(expandString);
-            expandLabel.setOnClickListener(unusedView -> {
+            expandLabel.setText(mExpandText);
+            minimizeLabel.setText(mMinimizeText);
+            minimizeLabel.setVisibility(View.GONE);
+            expandLabelContainer.setVisibility(View.VISIBLE);
+
+            expandLabelContainer.setOnClickListener(unusedView -> {
+                expandLabel.setOnClickListener(null);
+                expandableSection.setVisibility(View.VISIBLE);
+                expandLabelContainer.setVisibility(View.GONE);
+                expandLabel.setVisibility(View.GONE);
+            });
+
+            expandLabelContainer.setOnClickListener(unusedView -> {
+                TransitionManager.beginDelayedTransition(
+                        (ViewGroup) expandableSection.getRootView(), EXPAND_TRANSITION);
                 boolean expanded = expandableSection.getVisibility() == View.VISIBLE;
                 if (expanded) {
                     // Shrink.
                     expandableSection.setVisibility(View.GONE);
-                    expandLabel.setText(expandString);
+                    expandLabel.setVisibility(View.VISIBLE);
+                    minimizeLabel.setVisibility(View.GONE);
+                    chevron.animate().rotation(0).start();
                 } else {
                     // Expand.
                     expandableSection.setVisibility(View.VISIBLE);
-                    expandLabel.setText(shrinkString);
+                    expandLabel.setVisibility(View.GONE);
+                    minimizeLabel.setVisibility(View.VISIBLE);
+                    chevron.animate().rotation(180).start();
                 }
             });
         }
@@ -94,17 +127,24 @@
         TextView labelView = view.findViewById(R.id.label);
         updateLabel(counter, labelView);
 
+        TextView subtextView = view.findViewById(R.id.subtext);
+        if (!counter.getSubtext().isEmpty()) {
+            subtextView.setVisibility(View.VISIBLE);
+            subtextView.setText(counter.getSubtext());
+        }
+
+        TextView valueTextView = view.findViewById(R.id.value);
         View decreaseButton = view.findViewById(R.id.decrease_button);
         View increaseButton = view.findViewById(R.id.increase_button);
-        updateCounterState(counter, decreaseButton, increaseButton);
+        updateCounterState(counter, valueTextView, decreaseButton, increaseButton);
 
         decreaseButton.setOnClickListener(unusedView
-                -> updateCounter(
-                        counter, counterIndex, labelView, -1, decreaseButton, increaseButton));
+                -> updateCounter(counter, counterIndex, labelView, -1, valueTextView,
+                        decreaseButton, increaseButton));
 
         increaseButton.setOnClickListener(unusedView
-                -> updateCounter(
-                        counter, counterIndex, labelView, +1, decreaseButton, increaseButton));
+                -> updateCounter(counter, counterIndex, labelView, +1, valueTextView,
+                        decreaseButton, increaseButton));
 
         return view;
     }
@@ -119,18 +159,21 @@
     }
 
     private void updateCounter(AssistantFormCounter counter, int counterIndex, TextView labelView,
-            int delta, View decreaseButton, View increaseButton) {
+            int delta, TextView valueTextView, View decreaseButton, View increaseButton) {
         counter.setValue(counter.getValue() + delta);
         counter.setValue(Math.max(counter.getMinValue(), counter.getValue()));
         counter.setValue(Math.min(counter.getMaxValue(), counter.getValue()));
-        updateCounterState(counter, decreaseButton, increaseButton);
+        updateCounterState(counter, valueTextView, decreaseButton, increaseButton);
 
         updateLabel(counter, labelView);
         mDelegate.onCounterChanged(counterIndex, counter.getValue());
     }
 
-    private void updateCounterState(
-            AssistantFormCounter counter, View decreaseButton, View increaseButton) {
+    // It is ok to suppress the warning here as we are only setting a number value to the TextView.
+    @SuppressWarnings("SetTextI18n")
+    private void updateCounterState(AssistantFormCounter counter, TextView valueTextView,
+            View decreaseButton, View increaseButton) {
+        valueTextView.setText(Integer.toString(counter.getValue()));
         decreaseButton.setEnabled(counter.getValue() > counter.getMinValue());
         increaseButton.setEnabled(counter.getValue() < counter.getMaxValue());
     }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java
index 8c8a68a..1f32b4f 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/form/AssistantFormInput.java
@@ -46,8 +46,8 @@
 
     @CalledByNative
     private static AssistantFormCounter createCounter(
-            String label, int initialValue, int minValue, int maxValue) {
-        return new AssistantFormCounter(label, initialValue, minValue, maxValue);
+            String label, String subtext, int initialValue, int minValue, int maxValue) {
+        return new AssistantFormCounter(label, subtext, initialValue, minValue, maxValue);
     }
 
     @CalledByNative
@@ -58,9 +58,10 @@
 
     @CalledByNative
     private static AssistantFormCounterInput createCounterInput(int inputIndex, String label,
-            List<AssistantFormCounter> counters, int minimizedCount,
-            AssistantFormDelegate delegate) {
-        return new AssistantFormCounterInput(label, counters, minimizedCount,
+            String expandText, String minimizeText, List<AssistantFormCounter> counters,
+            int minimizedCount, AssistantFormDelegate delegate) {
+        return new AssistantFormCounterInput(label, expandText, minimizeText, counters,
+                minimizedCount,
                 (counterIndex,
                         value) -> delegate.onCounterChanged(inputIndex, counterIndex, value));
     }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderCoordinator.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderCoordinator.java
index f8dc51f..0ee8c5e 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderCoordinator.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderCoordinator.java
@@ -20,8 +20,10 @@
 /**
  * Coordinator for the header of the Autofill Assistant.
  */
-public class AssistantHeaderCoordinator {
-    private ProfileDataCache mProfileCache;
+public class AssistantHeaderCoordinator implements ProfileDataCache.Observer {
+    private final ProfileDataCache mProfileCache;
+    private final ImageView mProfileView;
+    private final String mSignedInAccountName;
 
     public AssistantHeaderCoordinator(
             Context context, ViewGroup bottomBarView, AssistantHeaderModel model) {
@@ -36,7 +38,9 @@
         addPoodle(bottomBarView, poodle.getView());
 
         mProfileCache = new ProfileDataCache(context, R.dimen.autofill_assistant_profile_size);
-        setupProfileImage(bottomBarView);
+        mProfileView = bottomBarView.findViewById(R.id.profile_image);
+        mSignedInAccountName = ChromeSigninController.get().getSignedInAccountName();
+        setupProfileImage(context, bottomBarView);
 
         // Bind view and mediator through the model.
         AssistantHeaderViewBinder.ViewHolder viewHolder =
@@ -48,6 +52,23 @@
         model.set(AssistantHeaderModel.PROGRESS_VISIBLE, true);
     }
 
+    @Override
+    public void onProfileDataUpdated(String account) {
+        if (!mSignedInAccountName.equals(account)) {
+            return;
+        }
+        setProfileImageFor(mSignedInAccountName);
+    }
+
+    /**
+     * Cleanup resources when this goes out of scope.
+     */
+    public void destroy() {
+        if (mSignedInAccountName != null) {
+            mProfileCache.removeObserver(this);
+        }
+    }
+
     private void addPoodle(ViewGroup root, View poodleView) {
         View statusMessage = root.findViewById(R.id.status_message);
         ViewGroup parent = (ViewGroup) statusMessage.getParent();
@@ -55,19 +76,16 @@
     }
 
     // TODO(b/130415092): Use image from AGSA if chrome is not signed in.
-    private void setupProfileImage(ViewGroup root) {
-        String signedInAccountName = ChromeSigninController.get().getSignedInAccountName();
-        if (signedInAccountName != null) {
-            mProfileCache.addObserver(account -> {
-                if (!signedInAccountName.equals(account)) {
-                    return;
-                }
-                DisplayableProfileData profileData =
-                        mProfileCache.getProfileDataOrDefault(signedInAccountName);
-                ImageView profileView = root.findViewById(R.id.profile_image);
-                profileView.setImageDrawable(profileData.getImage());
-            });
-            mProfileCache.update(Collections.singletonList(signedInAccountName));
+    private void setupProfileImage(Context context, ViewGroup root) {
+        if (mSignedInAccountName != null) {
+            mProfileCache.addObserver(this);
+            mProfileCache.update(Collections.singletonList(mSignedInAccountName));
         }
     }
+
+    private void setProfileImageFor(String signedInAccountName) {
+        DisplayableProfileData profileData =
+                mProfileCache.getProfileDataOrDefault(signedInAccountName);
+        mProfileView.setImageDrawable(profileData.getImage());
+    }
 }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/payment/AssistantPaymentRequestBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/payment/AssistantPaymentRequestBinder.java
index 76ceb1e8..acbbf46 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/payment/AssistantPaymentRequestBinder.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/payment/AssistantPaymentRequestBinder.java
@@ -330,14 +330,15 @@
         }
         view.mTermsSection.setPaddings(view.mSectionToSectionPadding, 0);
 
-        // Hide the divider after the expanded section, if any.
-        boolean prevSectionIsExpanded = false;
+        // Hide dividers for currently invisible sections and after the expanded section, if any.
+        boolean prevSectionIsExpandedOrInvisible = false;
         for (int i = 0; i < view.mPaymentRequestExpanderAccordion.getChildCount(); i++) {
             View child = view.mPaymentRequestExpanderAccordion.getChildAt(i);
             if (child instanceof AssistantVerticalExpander) {
-                prevSectionIsExpanded = ((AssistantVerticalExpander) child).isExpanded();
+                prevSectionIsExpandedOrInvisible = ((AssistantVerticalExpander) child).isExpanded()
+                        || child.getVisibility() != View.VISIBLE;
             } else if (child.getTag() == view.mDividerTag) {
-                child.setVisibility(prevSectionIsExpanded ? View.GONE : View.VISIBLE);
+                child.setVisibility(prevSectionIsExpandedOrInvisible ? View.GONE : View.VISIBLE);
             }
         }
         return true;
diff --git a/chrome/android/features/autofill_assistant/java/strings/android_chrome_autofill_assistant_strings.grd b/chrome/android/features/autofill_assistant/java/strings/android_chrome_autofill_assistant_strings.grd
index ee5392d..13e8378 100644
--- a/chrome/android/features/autofill_assistant/java/strings/android_chrome_autofill_assistant_strings.grd
+++ b/chrome/android/features/autofill_assistant/java/strings/android_chrome_autofill_assistant_strings.grd
@@ -165,12 +165,6 @@
       <message name="IDS_AUTOFILL_ASSISTANT_SHEET_CLOSED" desc="Text announced when the Autofill Assistant sheet is closed.">
         Google Assistant in Chrome closed.
       </message>
-      <message name="IDS_AUTOFILL_ASSISTANT_FORM_SHOW_MORE" desc="Text shown when displaying a form with an expandable section that is minimized.">
-        Show more
-      </message>
-      <message name="IDS_AUTOFILL_ASSISTANT_FORM_SHOW_LESS" desc="Text shown when displaying a form with an expandable section that can be minimized.">
-        Show less
-      </message>
     </messages>
   </release>
 </grit>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_am.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_am.xtb
index ac42fbb0..13dd3b3b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_am.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_am.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
 <translation id="1135993792949700405">Chrome እርስዎ የመረጡትን የግል ውሂብ ወደ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ይልካል</translation>
+<translation id="1472675084647422956">ተጨማሪ አሳይ</translation>
 <translation id="1625889395409731085">ውጫዊ አገናኝ ይከፈት?</translation>
 <translation id="1699570257714336246">መረጃ ይጎድላል</translation>
 <translation id="3604604794717279723">ተቀብያለሁ</translation>
 <translation id="4437727785356380473">Google ረዳት በChrome ውስጥ ተዘግቷል።</translation>
 <translation id="4850886885716139402">አሳይ</translation>
 <translation id="5014174725590676422">በChrome ውስጥ Google ረዳት የመጀመሪያ ማሄድ ማያ ገጽ ይታያል</translation>
+<translation id="5138227688689900538">ያነሰ አሳይ</translation>
 <translation id="5188078772080029703">Chrome የጣቢያውን ዩአርኤልና ይዘት እና እንዲሁም የእርስዎን ኢሜይል እና በChrome ውስጥ የተቀመጠው የክሬዲት ካርድ አይነት ወደ Google ይልካል። ይህን በChrome ቅንብሮች ውስጥ ማጥፋት ይችላሉ። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google ረዳት በChrome ውስጥ ሙሉ ቁመት ላይ ተከፍቷል።</translation>
 <translation id="6555233628095991027">Google ረዳት በChrome ውስጥ ግማሽ ቁመት ላይ ተከፍቷል።</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ar.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ar.xtb
index f505a88e..376c989 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ar.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ar.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
 <translation id="1135993792949700405">‏سيُرسل Chrome البيانات الشخصية التي اختَرتها إلى <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">عرض المزيد</translation>
 <translation id="1625889395409731085">هل تريد فتح الرابط الخارجي؟</translation>
-<translation id="1699570257714336246">معلومات مفقودة</translation>
+<translation id="1699570257714336246">معلومات غير متوفرة</translation>
 <translation id="3604604794717279723">أوافق</translation>
 <translation id="4437727785356380473">‏تم غلق "مساعد Google" في Chrome.</translation>
 <translation id="4850886885716139402">عرض</translation>
 <translation id="5014174725590676422">‏يتم عرض شاشة التشغيل الأولى "لمساعد Google" على Chrome</translation>
+<translation id="5138227688689900538">عرض أقل</translation>
 <translation id="5188078772080029703">‏سيرسل Chrome عنوان URL للموقع الإلكتروني ومحتواه، بالإضافة إلى عنوان بريدك الإلكتروني ونوع بطاقة الائتمان التي تم حفظها في Chrome إلى Google. يمكنك إيقاف هذا الإعداد من خلال "إعدادات Chrome". <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">‏يتم فتح "مساعد Google" في Chrome بارتفاع كامل.</translation>
 <translation id="6555233628095991027">‏تم فتح "مساعد Google" في Chrome بنصف ارتفاع.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bg.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bg.xtb
index 9ec427ea..3be8077b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bg.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bg.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bg">
 <translation id="1135993792949700405">Chrome ще изпрати избраните от вас лични данни до <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Показване на още</translation>
 <translation id="1625889395409731085">Да се отвори ли външната връзка?</translation>
 <translation id="1699570257714336246">Липсва информация</translation>
 <translation id="3604604794717279723">Приемам</translation>
 <translation id="4437727785356380473">Google Асистент в Chrome бе затворен.</translation>
 <translation id="4850886885716139402">Изглед</translation>
 <translation id="5014174725590676422">Показан е екранът при първо стартиране на Google Асистент в Chrome</translation>
+<translation id="5138227688689900538">Показване на по-малко</translation>
 <translation id="5188078772080029703">Chrome ще ни изпрати URL адреса и съдържанието на сайта, както и имейла ви и типа на кредитната карта, запазени в браузъра. Можете да изключите тази функция от настройките на Chrome. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google Асистент в Chrome е отворен на цялата височина.</translation>
 <translation id="6555233628095991027">Google Асистент в Chrome е отворен на половината височина.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bn.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bn.xtb
index 8fbe2729..7c43fed 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bn.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bn.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="bn">
 <translation id="1135993792949700405">আপনার বেছে নেওয়া <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />-এ Chrome ব্যক্তিগত ডেটা পাঠাবে</translation>
+<translation id="1472675084647422956">আরও দেখান</translation>
 <translation id="1625889395409731085">এক্সটারনাল লিঙ্ক খুলতে চান?</translation>
 <translation id="1699570257714336246">সম্পূর্ণ তথ্য দেওয়া হয়নি</translation>
 <translation id="3604604794717279723">আমি সম্মতি দিচ্ছি</translation>
 <translation id="4437727785356380473">Chrome-এ Google অ্যাসিস্ট্যান্ট বন্ধ হয়ে গেছে।</translation>
 <translation id="4850886885716139402">দেখুন</translation>
 <translation id="5014174725590676422">Chrome প্রথমবার চালানোর সময়ে Google অ্যাসিস্ট্যান্ট কীভাবে কাজ করবে তা দেখানো হয়েছে</translation>
+<translation id="5138227688689900538">কম দেখুন</translation>
 <translation id="5188078772080029703">Chrome ব্রাউজারে সেভ করা সাইটের ইউআরএল এবং কন্টেন্ট সহ আপনার ইমেল আইডি ও ক্রেডিট কার্ড সংক্রান্ত তথ্য Chrome-এর মাধ্যমে Google-কে পাঠানো হবে। Chrome সেটিংসে গিয়ে আপনি এটি বন্ধ করতে পারবেন। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome-এ Google অ্যাসিস্ট্যান্ট পুরো স্ক্রিন জুড়ে খোলা আছে।</translation>
 <translation id="6555233628095991027">Chrome-এ Google অ্যাসিস্ট্যান্ট অর্ধেক স্ক্রিন জুড়ে খোলা আছে।</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb
index 3ce5261a..13f7c67 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ca.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ca">
 <translation id="1135993792949700405">Chrome enviarà a <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> les dades personals que hagis seleccionat</translation>
+<translation id="1472675084647422956">Mostra'n més</translation>
 <translation id="1625889395409731085">Vols obrir l'enllaç extern?</translation>
 <translation id="1699570257714336246">Falta informació</translation>
 <translation id="3604604794717279723">Accepto</translation>
 <translation id="4437727785356380473">L'Assistent de Google a Chrome s'ha tancat.</translation>
 <translation id="4850886885716139402">Mostra</translation>
 <translation id="5014174725590676422">Es mostra la pantalla de la primera execució de l'Assistent de Google a Chrome</translation>
+<translation id="5138227688689900538">Mostra'n menys</translation>
 <translation id="5188078772080029703">Chrome enviarà a Google l'URL i el contingut del lloc web, així com l'adreça electrònica i el tipus de targeta de crèdit que tens desats al navegador. Pots desactivar aquesta funció a la configuració de Chrome. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">L'Assistent de Google a Chrome ocupa tota la pantalla.</translation>
 <translation id="6555233628095991027">L'Assistent de Google a Chrome ocupa la meitat inferior de la pantalla.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
index 2f092ce7..aefbe76 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="cs">
 <translation id="1135993792949700405">Osobní údaje, které jste vybrali, Chrome odešle webu <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Zobrazit více</translation>
 <translation id="1625889395409731085">Otevřít externí odkaz?</translation>
 <translation id="1699570257714336246">Některé informace chybí</translation>
 <translation id="3604604794717279723">Přijímám</translation>
 <translation id="4437727785356380473">Asistent Google v Chromu byl zavřen.</translation>
 <translation id="4850886885716139402">Zobrazit</translation>
 <translation id="5014174725590676422">Je zobrazena obrazovka prvního spuštění Asistenta Google v Chromu</translation>
+<translation id="5138227688689900538">Zobrazit méně</translation>
 <translation id="5188078772080029703">Adresu URL a obsah webu a váš e-mail a typ platební karty uložený v Chromu odešle Chrome do Googlu. Tuto možnost můžete vypnout v nastavení. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Asistent Google v Chromu byl otevřen na celou výšku.</translation>
 <translation id="6555233628095991027">Asistent Google v Chromu je otevřený na poloviční výšku.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_da.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_da.xtb
index 7dd7976..6d835be 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_da.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_da.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="da">
 <translation id="1135993792949700405">Chrome sender de personoplysninger, du har valgt, til <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Vis mere</translation>
 <translation id="1625889395409731085">Vil du åbne et eksternt link?</translation>
 <translation id="1699570257714336246">Der mangler oplysninger</translation>
 <translation id="3604604794717279723">Jeg accepterer</translation>
 <translation id="4437727785356380473">Google Assistent i Chrome er lukket.</translation>
 <translation id="4850886885716139402">Vis</translation>
 <translation id="5014174725590676422">Skærmen for førstegangsbrug af Google Assistent i Chrome vises</translation>
+<translation id="5138227688689900538">Vis færre</translation>
 <translation id="5188078772080029703">Chrome sender websitets webadresse og indhold samt den mail og type betalingskort, der er gemt i Chrome, til Google. Du kan slå dette fra i indstillingerne for Chrome. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google Assistent i Chrome er åbnet i fuld højde.</translation>
 <translation id="6555233628095991027">Google Assistent i Chrome er åbnet i halv højde.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_de.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_de.xtb
index bac884c..e2709e1 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_de.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_de.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="de">
 <translation id="1135993792949700405">Chrome sendet die von Ihnen ausgewählten personenbezogenen Daten an <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Mehr anzeigen</translation>
 <translation id="1625889395409731085">Externen Link öffnen?</translation>
 <translation id="1699570257714336246">Fehlende Informationen</translation>
 <translation id="3604604794717279723">Ich stimme zu</translation>
 <translation id="4437727785356380473">Google Assistant für Chrome geschlossen.</translation>
 <translation id="4850886885716139402">Anzeigen</translation>
 <translation id="5014174725590676422">Bildschirm für die erste Ausführung von Google Assistant für Chrome wird angezeigt</translation>
+<translation id="5138227688689900538">Weniger anzeigen</translation>
 <translation id="5188078772080029703">Chrome sendet die URL und die Inhalte der Website an Google, ebenso wie Ihre E-Mail-Adresse und den Typ Ihrer Kreditkarte, die in Chrome gespeichert sind. Sie können dies in den Einstellungen von Chrome deaktivieren. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google Assistant für Chrome in voller Höhe geöffnet.</translation>
 <translation id="6555233628095991027">Google Assistant für Chrome mit halber Höhe geöffnet.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_el.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_el.xtb
index 9877b67c..77fcda7b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_el.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_el.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="el">
 <translation id="1135993792949700405">Το Chrome θα στείλει τα προσωπικά δεδομένα που επιλέξατε στον τομέα <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Εμφάνιση περισσότερων</translation>
 <translation id="1625889395409731085">Άνοιγμα εξωτερικού συνδέσμου;</translation>
 <translation id="1699570257714336246">Λείπουν πληροφορίες</translation>
 <translation id="3604604794717279723">Συμφωνώ</translation>
 <translation id="4437727785356380473">Ο Βοηθός Google στο Chrome έκλεισε.</translation>
 <translation id="4850886885716139402">Προβολή</translation>
 <translation id="5014174725590676422">Εμφανίζεται ο Βοηθός Google στην η οθόνη πρώτης εκτέλεσης του Chrome</translation>
+<translation id="5138227688689900538">Εμφάνιση λιγότερων</translation>
 <translation id="5188078772080029703">Το Chrome θα στείλει στην Google το URL και το περιεχόμενο του ιστοτόπου, καθώς και τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας και τον τύπο πιστωτικής κάρτας που είναι αποθηκευμένο στο Chrome. Μπορείτε να απενεργοποιήσετε αυτήν τη λειτουργία στις ρυθμίσεις του Chrome. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Ο Βοηθός Google στο Chrome άνοιξε στο πλήρες ύψος.</translation>
 <translation id="6555233628095991027">Ο Βοηθός Google στο Chrome άνοιξε στο μισό ύψος.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_en-GB.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_en-GB.xtb
index 3311dcf..a21cd9d 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_en-GB.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_en-GB.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="en-GB">
 <translation id="1135993792949700405">Chrome will send personal data that you selected to <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Show more</translation>
 <translation id="1625889395409731085">Open external link?</translation>
 <translation id="1699570257714336246">Information missing</translation>
 <translation id="3604604794717279723">I accept</translation>
 <translation id="4437727785356380473">Google Assistant in Chrome closed.</translation>
 <translation id="4850886885716139402">View</translation>
 <translation id="5014174725590676422">Google Assistant in Chrome first run screen is shown</translation>
+<translation id="5138227688689900538">Show less</translation>
 <translation id="5188078772080029703">Chrome will send the site’s URL and content as well as your email and credit card type saved in Chrome to Google. You can turn this off in Chrome settings. <ph name="BEGIN_LINK" />Learn more<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google Assistant in Chrome opened at full height.</translation>
 <translation id="6555233628095991027">Google Assistant in Chrome opened at half height.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es-419.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es-419.xtb
index 8b946bb..f04fbcc 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es-419.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es-419.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="es-419">
 <translation id="1135993792949700405">Chrome enviará los datos personales que hayas seleccionados a <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Mostrar más</translation>
 <translation id="1625889395409731085">¿Quieres abrir el vínculo externo?</translation>
 <translation id="1699570257714336246">Falta información</translation>
 <translation id="3604604794717279723">Acepto</translation>
 <translation id="4437727785356380473">Se cerró el Asistente de Google en Chrome.</translation>
 <translation id="4850886885716139402">Ver</translation>
 <translation id="5014174725590676422">Se muestra la pantalla de primera ejecución del Asistente de Google en Chrome</translation>
+<translation id="5138227688689900538">Mostrar menos</translation>
 <translation id="5188078772080029703">Chrome enviará a Google la URL y el contenido del sitio, además de tu correo electrónico y el tipo de tarjeta de crédito guardados en Chrome. Puedes desactivar esta opción en la configuración de Chrome. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">El Asistente de Google en Chrome se abrió por completo.</translation>
 <translation id="6555233628095991027">El Asistente de Google en Chrome se abrió a media altura.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
index b6e1371..d2d3ad5 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
 <translation id="1135993792949700405">Chrome enviará la información personal que hayas seleccionado a <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Mostrar más</translation>
 <translation id="1625889395409731085">¿Quieres abrir el enlace externo?</translation>
 <translation id="1699570257714336246">Falta información</translation>
 <translation id="3604604794717279723">Acepto</translation>
 <translation id="4437727785356380473">Se ha cerrado el Asistente de Google en Chrome.</translation>
 <translation id="4850886885716139402">Ver</translation>
 <translation id="5014174725590676422">Se muestra la primera pantalla de ejecución del Asistente de Google en Chrome</translation>
+<translation id="5138227688689900538">Mostrar menos</translation>
 <translation id="5188078772080029703">Chrome enviará a Google la URL y el contenido del sitio web, así como tu correo electrónico y el tipo de tarjeta de crédito guardada en Chrome. Puedes desactivar esta opción en los ajustes de Chrome. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Se ha abierto el Asistente de Google en Chrome para que ocupe toda la pantalla.</translation>
 <translation id="6555233628095991027">Se ha abierto el Asistente de Google en Chrome a media altura.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_et.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_et.xtb
index 64a1379..45d6921 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_et.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_et.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="et">
 <translation id="1135993792949700405">Chrome saadab teie valitud isiklikud andmed teenusele <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Kuva rohkem</translation>
 <translation id="1625889395409731085">Kas avada väline link?</translation>
 <translation id="1699570257714336246">Teave on puudu</translation>
 <translation id="3604604794717279723">Nõustun</translation>
 <translation id="4437727785356380473">Chrome'ile mõeldud Google'i assistent on suletud.</translation>
 <translation id="4850886885716139402">Kuva</translation>
 <translation id="5014174725590676422">Näidatud on Google'i assistendi esmakordse käivitamise kuva Chrome'is</translation>
+<translation id="5138227688689900538">Kuva vähem</translation>
 <translation id="5188078772080029703">Chrome saadab Google'ile saidi URL-i ja sisu ning teie e-posti aadressi ja Chrome'i salvestatud krediitkaardi tüübi. Selle saab Chrome'i seadetes välja lülitada. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome'i jaoks mõeldud Google'i assistent avanes täiskõrgusega.</translation>
 <translation id="6555233628095991027">Chrome'i jaoks mõeldud Google'i assistent avanes poole kõrgusega.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fa.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fa.xtb
index 7daeca7..a0a8f3b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fa.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fa.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fa">
 <translation id="1135993792949700405">‏Chrome داده‌های شخصی را که انتخاب کرده‌اید به <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ارسال می‌کند</translation>
+<translation id="1472675084647422956">بیشتر ببینید</translation>
 <translation id="1625889395409731085">پیوند خارجی باز شود؟</translation>
 <translation id="1699570257714336246">اطلاعات از دست می‌رود</translation>
 <translation id="3604604794717279723">موافقم</translation>
 <translation id="4437727785356380473">‏«دستیار Google» در Chrome بسته شد.</translation>
 <translation id="4850886885716139402">نما</translation>
 <translation id="5014174725590676422">‏صفحه اولین اجرای «دستیار Google» در Chrome نشان داده می‌شود</translation>
+<translation id="5138227688689900538">نمایش موارد کمتر</translation>
 <translation id="5188078772080029703">‏Chrome نشانی وب و محتوای سایت را به‌همراه ایمیل و نوع کارت ذخیره‌شده شما در Chrome، به Google ارسال می‌کند. می‌توانید این گزینه را در تنظیمات Chrome خاموش کنید. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">‏«دستیار Google» به‌صورت کامل در Chrome باز شد.</translation>
 <translation id="6555233628095991027">‏«دستیار Google» به‌صورت نیمه در Chrome باز شد.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fi.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fi.xtb
index 0a58821f..09a5a253 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fi.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fi.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fi">
 <translation id="1135993792949700405">Chrome lähettää valitsemaasi henkilökohtaista dataa: <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Näytä enemmän</translation>
 <translation id="1625889395409731085">Avataanko ulkoinen linkki?</translation>
 <translation id="1699570257714336246">Tietoja puuttuu</translation>
 <translation id="3604604794717279723">Hyväksyn</translation>
 <translation id="4437727785356380473">Chromen Google Assistant suljettu</translation>
 <translation id="4850886885716139402">Näytä</translation>
 <translation id="5014174725590676422">Chromen Google Assistantin ensimmäisen käyttökerran näyttö näkyy</translation>
+<translation id="5138227688689900538">Näytä vähemmän</translation>
 <translation id="5188078772080029703">Chrome lähettää Googlelle sivuston URL-osoitteen ja sisällön sekä Chromeen tallennetun sähköpostiosoitteen ja luottokorttityypin. Voit poistaa tämän käytöstä Chromen asetuksissa. <ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chromen Google Assistant avattu koko näytön korkeudelle.</translation>
 <translation id="6555233628095991027">Chromen Google Assistant avattu näytön puolivälin korkeudelle</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
index b754858..67f0bc7 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
 <translation id="1135993792949700405">Ipapadala ng Chrome sa <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ang napili mong personal na data</translation>
+<translation id="1472675084647422956">Magpakita ng higit pa</translation>
 <translation id="1625889395409731085">Buksan ang external na link?</translation>
 <translation id="1699570257714336246">May nawawalang impormasyon</translation>
 <translation id="3604604794717279723">Tinatanggap ko</translation>
 <translation id="4437727785356380473">Nakasara ang Google Assistant sa Chrome.</translation>
 <translation id="4850886885716139402">View</translation>
 <translation id="5014174725590676422">Ipinapakita ang screen ng unang pagtakbo ng Google Assistant sa Chrome</translation>
+<translation id="5138227688689900538">Magpakita ng mas kaunti</translation>
 <translation id="5188078772080029703">Ipapadala ng Chrome sa Google ang URL at content ng site pati na rin ang iyong email at uri ng credit card na naka-save sa Chrome. Puwede mo itong i-off sa mga setting ng Chrome. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Nakabukas ang Google Assistant sa Chrome nang buo ang taas.</translation>
 <translation id="6555233628095991027">Nakabukas ang Google Assistant sa Chrome nang kalahati ang taas.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fr.xtb
index 6cca942..e1ab8f7 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fr.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fr.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fr">
 <translation id="1135993792949700405">Chrome envoie les données à caractère personnel sélectionnées par vos soins à <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Plus</translation>
 <translation id="1625889395409731085">Ouvrir le lien externe ?</translation>
 <translation id="1699570257714336246">Informations manquantes</translation>
 <translation id="3604604794717279723">J'accepte</translation>
 <translation id="4437727785356380473">L'Assistant Google dans Chrome est fermé.</translation>
 <translation id="4850886885716139402">Afficher</translation>
 <translation id="5014174725590676422">L'écran de première utilisation de l'Assistant Google dans Chrome est affiché</translation>
+<translation id="5138227688689900538">Afficher moins</translation>
 <translation id="5188078772080029703">L'URL et le contenu du site sont envoyés à Google via Chrome, tout comme votre adresse e-mail et le type de votre carte de crédit enregistrés dans Chrome. Vous pouvez désactiver cette option dans les paramètres de Chrome. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">L'Assistant Google dans Chrome est ouvert à hauteur maximale.</translation>
 <translation id="6555233628095991027">L'Assistant Google dans Chrome est ouvert à mi-hauteur.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_gu.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_gu.xtb
index 1ea6271..f1b29a5 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_gu.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_gu.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="gu">
 <translation id="1135993792949700405">તમે પસંદ કરેલો વ્યક્તિગત ડેટા Chrome <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />ને મોકલશે</translation>
+<translation id="1472675084647422956">વધુ બતાવો</translation>
 <translation id="1625889395409731085">બાહ્ય લિંક ખોલીએ?</translation>
 <translation id="1699570257714336246">માહિતી ખૂટે છે</translation>
 <translation id="3604604794717279723">હું સ્વીકારું છું</translation>
 <translation id="4437727785356380473">Chromeમાં Google આસિસ્ટંટ બંધ કર્યું.</translation>
 <translation id="4850886885716139402">જુઓ</translation>
 <translation id="5014174725590676422">Chromeમાં Google આસિસ્ટંટની પહેલી સ્ક્રીન બતાવવામાં આવી છે</translation>
+<translation id="5138227688689900538">ઓછું બતાવો</translation>
 <translation id="5188078772080029703">Chrome સાઇટના URL અને કન્ટેન્ટ તેમજ તમારા ઇમેઇલ અને Chromeમાં સાચવેલા ક્રેડિટ કાર્ડના પ્રકારને Googleને મોકલશે. તમે આને Chrome સેટિંગમાં બંધ કરી શકો છો. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chromeમાં Google આસિસ્ટંટ સંપૂર્ણ ઊંચાઈએ ખુલ્યું.</translation>
 <translation id="6555233628095991027">Chromeમાં Google આસિસ્ટંટ અડધી ઊંચાઈએ ખુલ્યું.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hi.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hi.xtb
index 7bc02358..c0b07c3 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hi.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hi.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
 <translation id="1135993792949700405">Chrome वह निजी डेटा भेजेगा जिसे आपने <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> के लिए चुना है</translation>
+<translation id="1472675084647422956">और दिखाएं</translation>
 <translation id="1625889395409731085">बाहरी लिंक खोलना चाहते हैं?</translation>
 <translation id="1699570257714336246">जानकारी मौजूद नहीं है</translation>
 <translation id="3604604794717279723">मैं सहमत हूं</translation>
 <translation id="4437727785356380473">Chrome में Google Assistant की सुविधा बंद हो गई है.</translation>
 <translation id="4850886885716139402">देखें</translation>
 <translation id="5014174725590676422">'Chrome में Google Assistant' की सबसे पहली स्क्रीन दिखाई गई है</translation>
+<translation id="5138227688689900538">कम दिखाएं</translation>
 <translation id="5188078772080029703">Chrome साइट के यूआरएल और सामग्री के साथ ही आपका ईमेल और Chrome में सेव किया गया क्रेडिट कार्ड का प्रकार Google को भेजेगा. आप Chrome सेटिंग में जाकर इसे बंद कर सकते हैं. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome में Google Assistant सेवा पूरी ऊंचाई पर खुलती है.</translation>
 <translation id="6555233628095991027">Chrome में Google Assistant सेवा आधी ऊंचाई पर खुली है.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb
index a37a5cfb..17a39aed 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hr">
 <translation id="1135993792949700405">Chrome će poslati domeni <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> osobne podatke koje ste odabrali</translation>
+<translation id="1472675084647422956">Prikaži više</translation>
 <translation id="1625889395409731085">Želite li otvoriti eksternu vezu?</translation>
 <translation id="1699570257714336246">Nedostaju podaci</translation>
 <translation id="3604604794717279723">Prihvaćam</translation>
 <translation id="4437727785356380473">Zatvoren je Google asistent u Chromeu.</translation>
 <translation id="4850886885716139402">Prikaz</translation>
 <translation id="5014174725590676422">Prikazuje se zaslon prvog pokretanja Google asistenta u Chromeu</translation>
+<translation id="5138227688689900538">Pokaži manje</translation>
 <translation id="5188078772080029703">Chrome će Googleu poslati URL web-lokacije i njezin sadržaj, kao i vašu e-adresu i vrstu kreditne kartice spremljene u Chromeu. To možete isključiti u Chromeovim postavkama. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google asistent u Chromeu otvoren je u punoj visini.</translation>
 <translation id="6555233628095991027">Google asistent u Chromeu otvoren je na pola visine.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hu.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hu.xtb
index dfc7f63c..b6a3d8b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hu.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hu.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="hu">
 <translation id="1135993792949700405">Az Ön által kiválasztott személyes adatokat a Chrome elküldi a következő domainnek: <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Továbbiak megjelenítése</translation>
 <translation id="1625889395409731085">Megnyitja a külső linket?</translation>
 <translation id="1699570257714336246">Hiányzó információ</translation>
 <translation id="3604604794717279723">Elfogadom</translation>
 <translation id="4437727785356380473">A Google Segéd be van zárva a Chrome-ban.</translation>
 <translation id="4850886885716139402">Nézet</translation>
 <translation id="5014174725590676422">A képernyőn a Google Segéd a Chrome-ban szolgáltatás első futtatáskor megjelenő képernyője látható</translation>
+<translation id="5138227688689900538">Kevesebb megjelenítése</translation>
 <translation id="5188078772080029703">A Chrome elküldi a Google-nak a webhely URL-címét és tartalmát, valamint az Ön által a Chrome böngészőben elmentett e-mail-címet és hitelkártyatípust. Ezt a Chrome beállításai között kapcsolhatja ki. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">A Google Segéd teljes magasságban van megnyitva a Chrome-ban.</translation>
 <translation id="6555233628095991027">A Google Segéd félmagasságban van megnyitva a Chrome-ban.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb
index dbd69f3..8f657a4 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
 <translation id="1135993792949700405">Chrome akan mengirimkan data pribadi yang Anda pilih ke <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Tampilkan lainnya</translation>
 <translation id="1625889395409731085">Buka link eksternal?</translation>
 <translation id="1699570257714336246">Informasi tidak ada</translation>
 <translation id="3604604794717279723">Saya setuju</translation>
 <translation id="4437727785356380473">Asisten Google di Chrome ditutup.</translation>
 <translation id="4850886885716139402">Lihat</translation>
 <translation id="5014174725590676422">Layar penggunaan pertama Asisten Google di Chrome ditampilkan</translation>
+<translation id="5138227688689900538">Tampilkan lebih sedikit</translation>
 <translation id="5188078772080029703">Chrome akan mengirimkan URL dan konten situs serta email dan jenis kartu kredit Anda yang tersimpan di Chrome ke Google. Anda dapat menonaktifkan opsi ini di setelan Chrome. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Asisten Google di Chrome terbuka dengan ketinggian penuh.</translation>
 <translation id="6555233628095991027">Asisten Google di Chrome terbuka dengan ketinggian separuh.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_it.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_it.xtb
index 750cf03..aff7a17 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_it.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_it.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="it">
 <translation id="1135993792949700405">Chrome invierà i dati personali selezionati al sito <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Mostra altro</translation>
 <translation id="1625889395409731085">Aprire il link esterno?</translation>
 <translation id="1699570257714336246">Mancano informazioni</translation>
 <translation id="3604604794717279723">Accetto</translation>
 <translation id="4437727785356380473">Assistente Google in Chrome chiuso.</translation>
 <translation id="4850886885716139402">Visualizza</translation>
 <translation id="5014174725590676422">È mostrata la schermata della prima esecuzione dell'Assistente Google in Chrome</translation>
+<translation id="5138227688689900538">Mostra meno</translation>
 <translation id="5188078772080029703">Chrome invierà a Google l'URL e i contenuti del sito, nonché la tua email e il tipo di carta di credito salvati in Chrome. Puoi disattivare questa funzione nelle impostazioni di Chrome. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Assistente Google in Chrome aperto a schermo intero.</translation>
 <translation id="6555233628095991027">Assistente Google in Chrome aperto nella parte inferiore dello schermo.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb
index 4a65eaf..dc203f93 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="iw">
 <translation id="1135993792949700405">‏Chrome ישלח את המידע האישי שבחרת אל <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">הצג יותר</translation>
 <translation id="1625889395409731085">לפתוח את הקישור החיצוני?</translation>
 <translation id="1699570257714336246">חסר מידע</translation>
 <translation id="3604604794717279723">אני מסכים/ה</translation>
 <translation id="4437727785356380473">‏Google Assistant ב-Chrome נסגר.</translation>
 <translation id="4850886885716139402">הצגה</translation>
 <translation id="5014174725590676422">‏מוצג מסך ההפעלה הראשונה של Google Assistant ב-Chrome</translation>
+<translation id="5138227688689900538">פחות אפליקציות</translation>
 <translation id="5188078772080029703">‏Chrome ישלח אל Google את כתובת ה-URL של האתר ואת התוכן שלו, כמו גם את כתובת האימייל וסוג כרטיס האשראי ששמרת ב-Chrome. ניתן להשבית את האפשרות הזו בהגדרות Chrome. <ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">‏Google Assistant ב-Chrome נפתח בגובה מלא.</translation>
 <translation id="6555233628095991027">‏Google Assistant ב-Chrome נפתח בחצי גובה.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ja.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ja.xtb
index 89d8d6c..a55dab6 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ja.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ja.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ja">
 <translation id="1135993792949700405">ユーザーが選択した個人データが Chrome から <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> に送信されます</translation>
+<translation id="1472675084647422956">表示項目を増やす</translation>
 <translation id="1625889395409731085">外部リンクを開きますか?</translation>
 <translation id="1699570257714336246">情報が不足しています</translation>
 <translation id="3604604794717279723">同意する</translation>
 <translation id="4437727785356380473">Chrome の Google アシスタントを終了しました。</translation>
 <translation id="4850886885716139402">表示</translation>
 <translation id="5014174725590676422">Chrome の Google アシスタントの初回実行画面が表示されました</translation>
+<translation id="5138227688689900538">一部を表示</translation>
 <translation id="5188078772080029703">Chrome から Google に、サイトの URL とコンテンツ、および Chrome に保存されているメールアドレスとクレジット カードのタイプが送信されます。この機能は Chrome の設定で無効にできます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome の Google アシスタントが画面全体に開いています。</translation>
 <translation id="6555233628095991027">Chrome の Google アシスタントが画面の下半分に開いています。</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_kn.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_kn.xtb
index bc44baa..f701ace9 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_kn.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_kn.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="kn">
 <translation id="1135993792949700405">Chrome, ನೀವು ಆಯ್ಕೆ ಮಾಡಿರುವ ವೈಯಕ್ತಿಕ ಡೇಟಾವನ್ನು <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ಗೆ ಕಳುಹಿಸುತ್ತದೆ</translation>
+<translation id="1472675084647422956">ಇನ್ನಷ್ಟು ತೋರಿಸಿ</translation>
 <translation id="1625889395409731085">ಬಾಹ್ಯ ಲಿಂಕ್ ತೆರೆಯುವುದೇ?</translation>
 <translation id="1699570257714336246">ಮಾಹಿತಿ ಕಾಣೆಯಾಗಿದೆ</translation>
 <translation id="3604604794717279723">ನಾನು ಒಪ್ಪುತ್ತೇನೆ</translation>
 <translation id="4437727785356380473">Chrome ನಲ್ಲಿ Google ಅಸಿಸ್ಟೆಂಟ್ ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ.</translation>
 <translation id="4850886885716139402">ವೀಕ್ಷಣೆ</translation>
 <translation id="5014174725590676422">Chrome ನಲ್ಲಿನ Google ಅಸಿಸ್ಟೆಂಟ್‌ನ ಮೊದಲ ಬಾರಿ ರನ್ ಮಾಡಿದ ಸ್ಕ್ರೀನ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ</translation>
+<translation id="5138227688689900538">ಕಡಿಮೆ ತೋರಿಸಿ</translation>
 <translation id="5188078772080029703">Chrome, ಸೈಟ್‌ನ URL ಮತ್ತು ವಿಷಯವನ್ನು ಅಂತೆಯೇ Chrome ನಲ್ಲಿ ಉಳಿಸಲಾಗಿರುವ ನಿಮ್ಮ ಇಮೇಲ್ ಹಾಗೂ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಪ್ರಕಾರದ ಮಾಹಿತಿಯನ್ನು Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ. ನೀವು Chrome ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಇದನ್ನು ಆಫ್ ಮಾಡಬಹುದು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome ನಲ್ಲಿ Google ಅಸಿಸ್ಟೆಂಟ್ ಅನ್ನು ಪೂರ್ಣ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ.</translation>
 <translation id="6555233628095991027">Chrome ನಲ್ಲಿ Google ಅಸಿಸ್ಟೆಂಟ್ ಅನ್ನು ಅರ್ಧ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ko.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ko.xtb
index 2e50634..bbc3d0b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ko.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ko.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ko">
 <translation id="1135993792949700405">Chrome에서 사용자가 선택한 개인 정보가 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />에 전송됩니다.</translation>
+<translation id="1472675084647422956">자세히 보기</translation>
 <translation id="1625889395409731085">외부 링크를 여시겠습니까?</translation>
 <translation id="1699570257714336246">정보 누락</translation>
 <translation id="3604604794717279723">동의</translation>
 <translation id="4437727785356380473">Chrome의 Google 어시스턴트가 종료되었습니다</translation>
 <translation id="4850886885716139402">보기</translation>
 <translation id="5014174725590676422">Chrome의 Google 어시스턴트 첫 실행 화면이 표시됩니다.</translation>
+<translation id="5138227688689900538">간략히</translation>
 <translation id="5188078772080029703">사이트의 URL과 콘텐츠, Chrome에 저장된 이메일 및 신용카드 종류가 Google에 전송됩니다. 이 기능은 Chrome 설정에서 사용 중지할 수 있습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome의 Google 어시스턴트가 전체 높이로 열렸습니다</translation>
 <translation id="6555233628095991027">Chrome의 Google 어시스턴트가 절반 높이로 열렸습니다</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lt.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lt.xtb
index e42d2a5..e16b1797 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lt.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lt.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="lt">
 <translation id="1135993792949700405">„Chrome“ siųs pasirinktus asmens duomenis į <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Rodyti daugiau</translation>
 <translation id="1625889395409731085">Atidaryti išorinę nuorodą?</translation>
 <translation id="1699570257714336246">Trūksta informacijos</translation>
 <translation id="3604604794717279723">Sutinku</translation>
 <translation id="4437727785356380473">Programa „Google Assistant“ sistemoje „Chrome“ uždaryta.</translation>
 <translation id="4850886885716139402">Žiūrėti</translation>
 <translation id="5014174725590676422">Rodomas „Google“ padėjėjo sistemoje „Chrome“ pirmosios paleisties ekranas</translation>
+<translation id="5138227688689900538">Rodyti mažiau</translation>
 <translation id="5188078772080029703">„Chrome“ siųs „Google“ svetainės URL ir turinį bei jūsų el. pašto adresą ir kredito kortelės tipą, išsaugotus sistemoje „Chrome“. Šią funkciją galite išjungti „Chrome“ nustatymuose. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Programa „Google Assistant“ naršyklėje „Chrome“ atidaryta viso aukščio.</translation>
 <translation id="6555233628095991027">Programa „Google Assistant“ naršyklėje „Chrome“ atidaryta pusės aukščio.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lv.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lv.xtb
index 303bfc0..3faef39 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lv.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_lv.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="lv">
 <translation id="1135993792949700405">Chrome sūtīs jūsu atlasītos personas datus uz <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Rādīt vairāk</translation>
 <translation id="1625889395409731085">Vai atvērt ārējo saiti?</translation>
 <translation id="1699570257714336246">Trūkst informācijas</translation>
 <translation id="3604604794717279723">Piekrītu</translation>
 <translation id="4437727785356380473">Google asistents pārlūkprogrammā Chrome ir aizvērts.</translation>
 <translation id="4850886885716139402">Skatīt</translation>
 <translation id="5014174725590676422">Tiek rādīts Google asistenta pirmās palaišanas ekrāns pārlūkprogrammā Chrome.</translation>
+<translation id="5138227688689900538">Rādīt mazāk</translation>
 <translation id="5188078772080029703">Chrome nosūtīs vietnes URL un saturu, kā arī jūsu pārlūkā saglabāto e-pasta adresi un kredītkartes veidu uz Google. Šo iespēju varat izslēgt Chrome iestatījumos. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google asistents pārlūkprogrammā Chrome ir atvērts pilnā augstumā.</translation>
 <translation id="6555233628095991027">Google asistents pārlūkprogrammā Chrome ir atvērts pusekrāna augstumā.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ml.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ml.xtb
index 1a44b00..4484ff02 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ml.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ml.xtb
@@ -2,19 +2,21 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
 <translation id="1135993792949700405">നിങ്ങൾ തിരഞ്ഞെടുത്ത വ്യക്തിപരമായ ഡാറ്റ Chrome <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> എന്നതിലേക്ക് അയയ്ക്കും</translation>
+<translation id="1472675084647422956">കൂടുതൽ‍ കാണിക്കുക</translation>
 <translation id="1625889395409731085">ബാഹ്യ ലിങ്ക് തുറക്കണോ?</translation>
 <translation id="1699570257714336246">വിവരങ്ങൾ സമ്പൂർണ്ണമല്ല</translation>
 <translation id="3604604794717279723">ഞാന്‍ അംഗീകരിക്കുന്നു</translation>
-<translation id="4437727785356380473">Chrome-ലെ Google അസിസ്‌റ്റന്റ് അടച്ചു.</translation>
+<translation id="4437727785356380473">Chrome-ലെ Google അസിസ്‌റ്റൻ്റ് അടച്ചു.</translation>
 <translation id="4850886885716139402">കാണുക</translation>
 <translation id="5014174725590676422">Chrome-ലെ Google അസിസ്‌റ്റന്‍റ്, ആദ്യ റൺ സ്‌ക്രീൻ കാണിക്കുന്നു</translation>
+<translation id="5138227688689900538">കുറച്ച് കാണിക്കുക</translation>
 <translation id="5188078772080029703">സൈറ്റിൻ്റെ URL, ഉള്ളടക്കം എന്നിവയും നിങ്ങൾ Google-ലേക്ക് Chrome-ൽ സംരക്ഷിച്ചിരിക്കുന്ന ഇമെയിൽ, ക്രെഡിറ്റ് കാർഡ് തരം എന്നിവയും Chrome അയയ്‌ക്കും. Chrome ക്രമീകരണത്തിൽ നിങ്ങൾക്കിത് ഓഫാക്കാം. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
-<translation id="5267269112080050255">Chrome-ൽ Google അസിസ്‌റ്റന്റ് മുഴുവൻ ഉയരത്തിൽ തുറന്നു.</translation>
-<translation id="6555233628095991027">Chrome-ലെ Google അസിസ്‌റ്റന്റ് പകുതി ഉയരത്തിൽ തുറന്നു.</translation>
+<translation id="5267269112080050255">Chrome-ലെ Google അസിസ്‌റ്റൻ്റ് മുഴുവൻ ഉയരത്തിൽ തുറന്നു.</translation>
+<translation id="6555233628095991027">Chrome-ലെ Google അസിസ്‌റ്റൻ്റ് പകുതി ഉയരത്തിൽ തുറന്നു.</translation>
 <translation id="6973932557599545801">ക്ഷമിക്കണം, എനിക്ക് സഹായിക്കാൻ കഴിയില്ല, സ്വയം പൂരിപ്പിക്കുക.</translation>
 <translation id="7658239707568436148">റദ്ദാക്കൂ</translation>
 <translation id="7871791972254842204">പിന്നീട് <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> എന്നതിലെ നയങ്ങളും നിബന്ധനകളും വായിച്ച് അംഗീകരിക്കുക</translation>
-<translation id="8253702004019660079">Chrome-ലെ Google അസിസ്‌റ്റന്റ്.</translation>
+<translation id="8253702004019660079">Chrome-ലെ Google അസിസ്‌റ്റൻ്റ്.</translation>
 <translation id="8723954843026426558">നയങ്ങളും നിബന്ധനകളും, സ്വകാര്യതാ നയം, <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />-ന്‍റെ റദ്ദാക്കാനുള്ള അവകാശം എന്നിവ ഞാൻ അംഗീകരിക്കുന്നു.</translation>
 <translation id="9138504265731110181">വെബ്‌സൈറ്റിലെ തിരയൽ വേഗത്തിലാക്കി Google അസിസ്‌റ്റന്‍റ് നിങ്ങളുടെ സമയം ലാഭിക്കുന്നു</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_mr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_mr.xtb
index 07745d5c..6bd0664 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_mr.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_mr.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="mr">
 <translation id="1135993792949700405">Chrome तुम्ही निवडलेला वैयक्तिक डेटा <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ला पाठवेल</translation>
+<translation id="1472675084647422956">अधिक दर्शवा</translation>
 <translation id="1625889395409731085">बाह्य लिंक उघडायची आहे का?</translation>
 <translation id="1699570257714336246">माहिती नाही आहे</translation>
 <translation id="3604604794717279723">मी स्वीकारत आहे</translation>
 <translation id="4437727785356380473">Chrome मधील Google असिस्टंट बंद आहे.</translation>
 <translation id="4850886885716139402">पहा</translation>
 <translation id="5014174725590676422">Chrome मध्ये Google असिस्टंट पहिल्यांदा रन केलेली स्क्रीन दाखवली आहे</translation>
+<translation id="5138227688689900538">कमी दाखवा</translation>
 <translation id="5188078772080029703">Chrome साइटची URL आणि आशय तसेच Chrome मध्ये सेव्ह केलेला तुमचा ईमेल आणि क्रेडिट कार्डचा प्रकार Google ला पाठवेल. तुम्ही हे Chrome सेटिंग्जमधून बंद करू शकता. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome मधील Google असिस्टंट पूर्ण स्क्रीनवर उघडले.</translation>
 <translation id="6555233628095991027">Chrome मधील Google असिस्टंट अर्ध्या स्क्रीनवर उघडले आहे.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ms.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ms.xtb
index 3279cf8..89ccf9d 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ms.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ms.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
 <translation id="1135993792949700405">Chrome akan menghantar data peribadi yang anda pilih ke <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Tunjukkan lagi</translation>
 <translation id="1625889395409731085">Buka pautan luar?</translation>
 <translation id="1699570257714336246">Tiada maklumat</translation>
 <translation id="3604604794717279723">Saya terima</translation>
 <translation id="4437727785356380473">Google Assistant dalam Chrome ditutup.</translation>
 <translation id="4850886885716139402">Lihat</translation>
 <translation id="5014174725590676422">Google Assistant dalam skrin pelaksanaan pertama Chrome dipaparkan</translation>
+<translation id="5138227688689900538">Tunjukkan kurang</translation>
 <translation id="5188078772080029703">Chrome akan menghantar URL dan kandungan tapak serta e-mel dan jenis kad kredit anda yang disimpan dalam Chrome kepada Google. Anda boleh mematikan pilihan ini dalam tetapan Chrome. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google Assistant dalam Chrome dibuka pada ketinggian penuh.</translation>
 <translation id="6555233628095991027">Google Assistant dalam Chrome dibuka pada ketinggian separuh.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb
index 57b1c7f..d2749af 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_nl.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="nl">
 <translation id="1135993792949700405">Chrome verzendt de persoonsgegevens die je hebt geselecteerd naar <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Meer weergeven</translation>
 <translation id="1625889395409731085">Externe link openen?</translation>
 <translation id="1699570257714336246">Ontbrekende informatie</translation>
 <translation id="3604604794717279723">Ik ga akkoord</translation>
 <translation id="4437727785356380473">De Google Assistent in Chrome is gesloten.</translation>
 <translation id="4850886885716139402">Weergave</translation>
 <translation id="5014174725590676422">Het eerste uitvoeringsscherm van de Google Assistent in Chrome wordt weergegeven</translation>
+<translation id="5138227688689900538">Minder weergeven</translation>
 <translation id="5188078772080029703">Chrome verzendt zowel de URL en content van de URL als je e-mailadres en type creditcard die zijn opgeslagen in Chrome naar Google. Je kunt dit uitschakelen in de Chrome-instellingen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">De Google Assistent is op volledige hoogte geopend in Chrome.</translation>
 <translation id="6555233628095991027">De Google Assistent is op halve hoogte geopend in Chrome.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
index 7f71bdab..10eddb5 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
 <translation id="1135993792949700405">Chrome sender personopplysningene du har valgt, til <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Vis mer</translation>
 <translation id="1625889395409731085">Vil du åpne den eksterne linken?</translation>
 <translation id="1699570257714336246">Informasjon mangler</translation>
 <translation id="3604604794717279723">Godta</translation>
 <translation id="4437727785356380473">Google-assistenten i Chrome er lukket.</translation>
 <translation id="4850886885716139402">Visning</translation>
 <translation id="5014174725590676422">Skjermen for første kjøring av Google-assistenten i Chrome vises</translation>
+<translation id="5138227688689900538">Vis færre</translation>
 <translation id="5188078772080029703">Chrome sender nettstedets nettadresse og innhold, samt e-postadressen din og kredittkorttypen som er lagret i Chrome, til Google. Du kan slå av dette i Chrome-innstillingene. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google-assistenten i Chrome er åpnet i full høyde.</translation>
 <translation id="6555233628095991027">Google-assistenten i Chrome er åpnet i halv høyde.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pl.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pl.xtb
index d2b035c..379d65f3 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pl.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pl.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pl">
 <translation id="1135993792949700405">Chrome będzie wysyłać wybrane przez Ciebie dane osobowe do <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Pokaż więcej</translation>
 <translation id="1625889395409731085">Otworzyć link zewnętrzny?</translation>
 <translation id="1699570257714336246">Brak informacji</translation>
 <translation id="3604604794717279723">Zgadzam się</translation>
 <translation id="4437727785356380473">Zamknięto Asystenta Google w Chrome.</translation>
 <translation id="4850886885716139402">Widok</translation>
 <translation id="5014174725590676422">Wyświetlany jest ekran pierwszego uruchomienia Asystenta Google w Chrome</translation>
+<translation id="5138227688689900538">Pokaż mniej</translation>
 <translation id="5188078772080029703">Chrome wyśle do Google URL i zawartość strony oraz Twój e-mail i typ karty kredytowej zapisane w Chrome. Możesz wyłączyć tę opcję w ustawieniach Chrome. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Asystent Google w Chrome otwarty na pełną wysokość.</translation>
 <translation id="6555233628095991027">Asystent Google w Chrome otwarty na pół wysokości.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-BR.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-BR.xtb
index 4c7c9bf..ea418bba 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-BR.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-BR.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-BR">
 <translation id="1135993792949700405">O Chrome enviará dados pessoais selecionados por você para <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Mostrar mais</translation>
 <translation id="1625889395409731085">Abrir link externo?</translation>
 <translation id="1699570257714336246">Informações faltantes</translation>
 <translation id="3604604794717279723">Aceito</translation>
 <translation id="4437727785356380473">Google Assistente no Chrome fechado.</translation>
 <translation id="4850886885716139402">Visualizar</translation>
 <translation id="5014174725590676422">Exibição da tela de primeiro acesso do Google Assistente no Chrome</translation>
+<translation id="5138227688689900538">Mostrar menos</translation>
 <translation id="5188078772080029703">O Chrome enviará para o Google o URL e o conteúdo do site, assim como seu e-mail e tipo de cartão de crédito salvo no navegador. É possível desativar esse recurso nas configurações do Chrome. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google Assistente no Chrome aberto no tamanho máximo.</translation>
 <translation id="6555233628095991027">Google Assistente no Chrome aberto no tamanho médio.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-PT.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-PT.xtb
index b6ca03fa..b87833a2 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-PT.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_pt-PT.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-PT">
 <translation id="1135993792949700405">O Chrome envia os dados pessoais selecionados para <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />.</translation>
+<translation id="1472675084647422956">Mostrar mais</translation>
 <translation id="1625889395409731085">Pretende abrir o link externo?</translation>
 <translation id="1699570257714336246">Informações em falta</translation>
 <translation id="3604604794717279723">Aceito</translation>
 <translation id="4437727785356380473">Assistente Google no Chrome fechado.</translation>
 <translation id="4850886885716139402">Ver</translation>
 <translation id="5014174725590676422">É apresentado o primeiro ecrã de execução do Assistente Google no Chrome.</translation>
+<translation id="5138227688689900538">Mostrar menos</translation>
 <translation id="5188078772080029703">O Chrome envia o URL e o conteúdo do site, bem como o seu email e tipo de cartão de crédito guardados no Chrome para o Google. Pode desativar esta opção nas definições do Chrome. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" />.</translation>
 <translation id="5267269112080050255">Assistente Google no Chrome aberto à altura total.</translation>
 <translation id="6555233628095991027">Assistente Google no Chrome aberto a metade da altura.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ro.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ro.xtb
index deda00c..9cc7241 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ro.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ro.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
 <translation id="1135993792949700405">Chrome va trimite datele cu caracter personal selectate la <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Afișați mai multe</translation>
 <translation id="1625889395409731085">Deschizi linkul extern?</translation>
 <translation id="1699570257714336246">Informații lipsă</translation>
 <translation id="3604604794717279723">Accept</translation>
 <translation id="4437727785356380473">Asistentul Google în Chrome este închis.</translation>
 <translation id="4850886885716139402">Afișează</translation>
 <translation id="5014174725590676422">Se afișează ecranul pentru prima rulare a Asistentului Google în Chrome</translation>
+<translation id="5138227688689900538">Afișează mai puțin</translation>
 <translation id="5188078772080029703">Chrome va trimite la Google adresa URL a site-ului și conținutul său, precum și adresa ta de e-mail și tipul cardului de credit salvate în Chrome. Poți să dezactivezi această opțiune din setările Chrome. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Asistentul Google în Chrome este deschis la înălțimea completă.</translation>
 <translation id="6555233628095991027">Asistentul Google în Chrome a fost deschis la jumătate din înălțime.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
index f3561d3..e320a00c 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
 <translation id="1135993792949700405">Персональные данные, выбранные вами для автозаполнения, будут переданы <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />.</translation>
+<translation id="1472675084647422956">Показать больше...</translation>
 <translation id="1625889395409731085">Открыть внешнюю ссылку?</translation>
 <translation id="1699570257714336246">Данные отсутствуют</translation>
 <translation id="3604604794717279723">Принимаю</translation>
 <translation id="4437727785356380473">Окно Google Ассистента в Chrome закрыто.</translation>
 <translation id="4850886885716139402">Посмотреть</translation>
 <translation id="5014174725590676422">Показан экран первого запуска Google Ассистента в Chrome</translation>
+<translation id="5138227688689900538">Свернуть</translation>
 <translation id="5188078772080029703">URL сайта и его содержимое, а также адрес электронной почты и тип кредитной карты, сохраненные в Chrome, будут переданы в Google. Вы можете отключить эти параметры в настройках Chrome. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Окно Google Ассистента в Chrome открыто полностью.</translation>
 <translation id="6555233628095991027">Окно Google Ассистента в Chrome открыто наполовину.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sk.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sk.xtb
index c29a17b..c06a49c 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sk.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sk.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sk">
 <translation id="1135993792949700405">Chrome bude odosielať vybrané osobné údaje do domény <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Zobraziť viac</translation>
 <translation id="1625889395409731085">Chcete otvoriť externý odkaz?</translation>
 <translation id="1699570257714336246">Chýbajú informácie</translation>
 <translation id="3604604794717279723">Súhlasím</translation>
 <translation id="4437727785356380473">Asistent Google v Chrome sa zavrel.</translation>
 <translation id="4850886885716139402">Zobraziť</translation>
 <translation id="5014174725590676422">Zobrazuje sa obrazovka pri prvom spustení Asistenta Google v Chrome</translation>
+<translation id="5138227688689900538">Zobraziť menej</translation>
 <translation id="5188078772080029703">Chrome odošle Googlu webovú adresu a obsah webu spolu s vaším e‑mailom a typom kreditnej karty uloženej v Chome. Túto možnosť môžete vypnúť v nastaveniach. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Asistent Google v Chrome sa otvoril na celú výšku.</translation>
 <translation id="6555233628095991027">Asistent Google v Chrome sa otvoril na polovičnú výšku.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sl.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sl.xtb
index 2548c26..8afdf8f 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sl.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sl.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sl">
 <translation id="1135993792949700405">Chrome bo <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> pošiljal osebne podatke, ki ste jih izbrali</translation>
+<translation id="1472675084647422956">Pokaži več</translation>
 <translation id="1625889395409731085">Želite odpreti zunanjo povezavo?</translation>
 <translation id="1699570257714336246">Manjkajo podatki</translation>
 <translation id="3604604794717279723">Sprejmem</translation>
 <translation id="4437727785356380473">Pomočnik Google v Chromu je zaprt.</translation>
 <translation id="4850886885716139402">Pogled</translation>
 <translation id="5014174725590676422">Prikazan je zaslon za prvi zagon Pomočnika Google v Chromu</translation>
+<translation id="5138227688689900538">Pokaži manj</translation>
 <translation id="5188078772080029703">Chrome bo URL in vsebino spletnega mesta ter vaš e-poštni naslov in vrsto kreditne kartice, shranjena v Chromu, poslal Googlu. To lahko izklopite v nastavitvah Chroma. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Pomočnik Google v Chromu, odprt pri polni višini</translation>
 <translation id="6555233628095991027">Pomočnik Google v Chromu, odprt pri polovični višini</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sr.xtb
index 2a8b71a..bf2cd84f 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sr.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sr.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sr">
 <translation id="1135993792949700405">Chrome ће послати личне податке које сте изабрали на <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Прикажи више</translation>
 <translation id="1625889395409731085">Желите ли да отворите спољни линк?</translation>
 <translation id="1699570257714336246">Недостају информације</translation>
 <translation id="3604604794717279723">Прихватам</translation>
 <translation id="4437727785356380473">Google помоћник у Chrome-у је затворен.</translation>
 <translation id="4850886885716139402">Приказ</translation>
 <translation id="5014174725590676422">Приказује се екран за прво покретање Google помоћника у Chrome-у</translation>
+<translation id="5138227688689900538">Прикажи мање</translation>
 <translation id="5188078772080029703">Chrome ће послати Google-у URL и садржај сајта као и ваш имејл и тип кредитне картице сачуван у Chrome-у. Можете да искључите ово у Chrome подешавањима. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google помоћник у Chrome-у је отворен у пуној висини.</translation>
 <translation id="6555233628095991027">Google помоћник у Chrome-у је отворен на пола висине.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sv.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sv.xtb
index 4b68fd9a..1706da0d 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sv.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sv.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sv">
 <translation id="1135993792949700405">Chrome skickar valda personuppgifter till <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Visa fler</translation>
 <translation id="1625889395409731085">Vill du öppna extern länk?</translation>
 <translation id="1699570257714336246">Uppgifter saknas</translation>
 <translation id="3604604794717279723">Godkänn</translation>
 <translation id="4437727785356380473">Google-assistenten i Chrome är stängd.</translation>
 <translation id="4850886885716139402">Visa</translation>
 <translation id="5014174725590676422">Skärmen vid första användningen av Googe-assistenten i Chrome visas</translation>
+<translation id="5138227688689900538">Visa färre</translation>
 <translation id="5188078772080029703">Chrome skickar webbplatsens adress och innehåll tillsammans med den e-postadress och den kreditkortstyp som du har sparat i Chrome till Google. Du kan inaktivera detta i inställningarna i Chrome. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google-assistenten i Chrome öppnades och tar upp hela skärmen.</translation>
 <translation id="6555233628095991027">Google-assistenten i Chrome öppnades och tar upp halva skärmen.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb
index 7250069..498d02c 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
 <translation id="1135993792949700405">Chrome itatuma data ya binafsi uliyochagua kwa <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Onyesha zaidi</translation>
 <translation id="1625889395409731085">Ungependa kufungua kiungo cha nje?</translation>
 <translation id="1699570257714336246">Maelezo hayajakamilika</translation>
 <translation id="3604604794717279723">Ninakubali</translation>
 <translation id="4437727785356380473">Imefunga Mratibu wa Google katika Chrome.</translation>
 <translation id="4850886885716139402">Mwonekano</translation>
 <translation id="5014174725590676422">Inaonyesha skrini ya haraka ya programu ya Mratibu wa Google katika Chrome</translation>
+<translation id="5138227688689900538">Onyesha chache</translation>
 <translation id="5188078772080029703">Chrome itatuma kwa Google maudhui na URL ya tovuti, pamoja na anwani yako ya barua pepe na aina ya kadi ya mikopo uliyohifadhi katika Chrome. Unaweza kuzima hali hii katika mipangilio ya Chrome. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Programu ya Mratibu wa Google katika Chrome imefunguliwa katika urefu kamili.</translation>
 <translation id="6555233628095991027">Imefungua urefu nusu wa programu ya Mratibu wa Google katika Chrome.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
index b5f75cb..d156985 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ta.xtb
@@ -2,11 +2,13 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
 <translation id="1135993792949700405">Chrome நீங்கள் தேர்ந்தெடுத்த தனிப்பட்ட தரவை <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> டொமைனுக்கு அனுப்பும்</translation>
+<translation id="1472675084647422956">மேலும் காண்பி</translation>
 <translation id="1625889395409731085">புற இணைப்புகளைத் திறக்கவா?</translation>
 <translation id="3604604794717279723">ஏற்கிறேன்</translation>
 <translation id="4437727785356380473">'Chromeமில் Google அசிஸ்டண்ட்' மூடப்பட்டது.</translation>
 <translation id="4850886885716139402">காட்சி</translation>
 <translation id="5014174725590676422">’Chromeமில் Google அசிஸ்டண்ட்’ முதன்மைத் திரை காண்பிக்கப்படுகிறது</translation>
+<translation id="5138227688689900538">குறைவாகக் காட்டு</translation>
 <translation id="5188078772080029703">தளத்தின் URL, உள்ளடக்கம், Chromeமில் சேமிக்கப்பட்ட உங்கள் மின்னஞ்சல் முகவரி, கிரெடிட் கார்டு வகை ஆகியவற்றை Googleளுக்கு Chrome அனுப்பும். இதை Chrome அமைப்புகளில் முடக்கலாம். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">'Chromeமில் Google அசிஸ்டண்ட்' முழு உயரத்தில் திறக்கப்பட்டது.</translation>
 <translation id="6555233628095991027">'Chromeமில் Google அசிஸ்டண்ட்' பாதி உயரத்தில் திறக்கப்பட்டது.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
index ba9acfe0..88245fd6 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="te">
 <translation id="1135993792949700405">Chrome మీరు ఎంచుకున్న వ్యక్తిగత డేటాను <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />కు పంపుతుంది</translation>
+<translation id="1472675084647422956">మరిన్ని చూపించు</translation>
 <translation id="1625889395409731085">బాహ్య లింక్‌ను తెరవాలా?</translation>
 <translation id="1699570257714336246">సమాచారం సరిగ్గా లేదు</translation>
 <translation id="3604604794717279723">నేను ఆమోదిస్తున్నాను</translation>
 <translation id="4437727785356380473">Chromeలో Google అసిస్టెంట్ మూసివేయబడింది.</translation>
 <translation id="4850886885716139402">వీక్షణ</translation>
 <translation id="5014174725590676422">Chromeలో Google అసిస్టెంట్ మొదటి అమలు స్క్రీన్ చూపబడింది</translation>
+<translation id="5138227688689900538">తక్కువ చూపు</translation>
 <translation id="5188078772080029703">Chrome ఈ సైట్ యొక్క URL మరియు కంటెంట్‌తో పాటు Chromeలో సేవ్ చేసిన మీ ఇమెయిల్ మరియు క్రెడిట్ కార్డ్ రకాన్ని Googleకు పంపుతుంది. మీరు Chrome సెట్టింగ్‌లలో దీన్ని ఆఫ్ చేయవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chromeలో Google అసిస్టెంట్ పూర్తి ఎత్తులో తెరవబడింది.</translation>
 <translation id="6555233628095991027">Chromeలో Google అసిస్టెంట్ సగం ఎత్తులో తెరవబడింది.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_th.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_th.xtb
index f38e35d7..f1269ab2 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_th.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_th.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="th">
 <translation id="1135993792949700405">Chrome จะส่งข้อมูลส่วนตัวที่คุณเลือกไปยัง <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">แสดงเพิ่มเติม</translation>
 <translation id="1625889395409731085">เปิดลิงก์ภายนอกไหม</translation>
 <translation id="1699570257714336246">ข้อมูลไม่ครบ</translation>
 <translation id="3604604794717279723">ฉันยอมรับ</translation>
 <translation id="4437727785356380473">Google Assistant ใน Chrome ปิดอยู่</translation>
 <translation id="4850886885716139402">มุมมอง</translation>
 <translation id="5014174725590676422">กำลังแสดงหน้าจอเรียกใช้ Google Assistant ครั้งแรกใน Chrome</translation>
+<translation id="5138227688689900538">แสดงน้อยลง</translation>
 <translation id="5188078772080029703">Chrome จะส่ง URL และเนื้อหาของเว็บไซต์ รวมถึงอีเมลและประเภทบัตรเครดิตที่คุณบันทึกไว้ใน Chrome ไปยัง Google คุณปิดการดำเนินการนี้ได้ในการตั้งค่า Chrome <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google Assistant ใน Chrome เปิดอยู่ที่ระดับความสูงเต็มหน้าจอ</translation>
 <translation id="6555233628095991027">Google Assistant ใน Chrome เปิดอยู่ที่ระดับความสูงครึ่งหนึ่งของหน้าจอ</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_tr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_tr.xtb
index d0e3cc3..7ebc441 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_tr.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_tr.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="tr">
 <translation id="1135993792949700405">Chrome, seçtiğiniz kişisel verileri <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> sitesine gönderecektir</translation>
+<translation id="1472675084647422956">Daha fazla göster</translation>
 <translation id="1625889395409731085">Harici bağlantı açılsın mı?</translation>
 <translation id="1699570257714336246">Bilgi eksik</translation>
 <translation id="3604604794717279723">Kabul ediyorum</translation>
 <translation id="4437727785356380473">Chrome'da Google Asistan kapatıldı.</translation>
 <translation id="4850886885716139402">Görüntüle</translation>
 <translation id="5014174725590676422">Chrome'da Google Asistan'ın ilk kez çalışma ekranı aşağıda gösterilmiştir</translation>
+<translation id="5138227688689900538">Daha az göster</translation>
 <translation id="5188078772080029703">Chrome, sitenin URL'sinin ve içeriğinin yanı sıra Chrome'da kayıtlı e-posta adresinizi ve kredi kartınızın türünü de Google'a gönderecektir. Bu işlevi Chrome ayarlarından kapatabilirsiniz. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome'da Google Assistant tam yükseklikte açıldı.</translation>
 <translation id="6555233628095991027">Chrome'da Google Asistan yarım yükseklikte açıldı.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb
index 00304d6..f664cff 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uk.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="uk">
 <translation id="1135993792949700405">Chrome надсилатиме вибрані персональні дані на веб-сайт <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Показати більше</translation>
 <translation id="1625889395409731085">Відкрити зовнішнє посилання?</translation>
 <translation id="1699570257714336246">Немає інформації</translation>
 <translation id="3604604794717279723">Прийняти</translation>
 <translation id="4437727785356380473">Google Асистент у Chrome закрито.</translation>
 <translation id="4850886885716139402">Перегляд</translation>
 <translation id="5014174725590676422">Показано екран першого запуску Google Асистента в Chrome</translation>
+<translation id="5138227688689900538">Показати менше</translation>
 <translation id="5188078772080029703">Chrome надсилатиме в Google URL-адресу та вміст сайту, а також електронну адресу й тип кредитної картки, збереженої у веб-переглядачі. Ви можете вимкнути цю функцію в налаштуваннях Chrome. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Google Асистент відкрито в Chrome на повну висоту.</translation>
 <translation id="6555233628095991027">Google Асистент відкрито в Chrome на половину висоти.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb
index c4dcf46..0153e1a1 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="vi">
 <translation id="1135993792949700405">Chrome sẽ gửi dữ liệu cá nhân mà bạn đã chọn tới <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">Hiển thị thêm</translation>
 <translation id="1625889395409731085">Mở đường dẫn liên kết bên ngoài?</translation>
 <translation id="1699570257714336246">Thiếu thông tin</translation>
 <translation id="3604604794717279723">Tôi chấp nhận</translation>
 <translation id="4437727785356380473">Đã đóng Trợ lý Google trong Chrome.</translation>
 <translation id="4850886885716139402">Xem</translation>
 <translation id="5014174725590676422">Màn hình chạy đầu tiên của Trợ lý Google trong Chrome đã được hiển thị</translation>
+<translation id="5138227688689900538">Ẩn bớt</translation>
 <translation id="5188078772080029703">Chrome sẽ gửi URL và nội dung của trang web cũng như địa chỉ email và loại thẻ tín dụng bạn đã lưu trong Chrome cho Google. Bạn có thể tắt tính năng này trong phần cài đặt Chrome. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Trợ lý Google trong Chrome đã mở trên toàn màn hình.</translation>
 <translation id="6555233628095991027">Trợ lý Google trong Chrome đã mở ở nửa dưới của màn hình.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb
index b3b595c7..ff0b313 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-CN">
 <translation id="1135993792949700405">Chrome 会将您选择的个人数据发送到 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">显示更多</translation>
 <translation id="1625889395409731085">打开外部链接?</translation>
 <translation id="1699570257714336246">缺少信息</translation>
 <translation id="3604604794717279723">我接受</translation>
 <translation id="4437727785356380473">Chrome 中的 Google 助理已关闭。</translation>
 <translation id="4850886885716139402">视图</translation>
 <translation id="5014174725590676422">显示 Chrome 中的 Google 助理的首次运行屏幕</translation>
+<translation id="5138227688689900538">收起</translation>
 <translation id="5188078772080029703">Chrome 会将相应网站的网址和内容以及您在 Chrome 中保存的电子邮件地址和信用卡类型发送给 Google。您可在 Chrome 的“设置”中关闭此功能。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome 中的 Google 助理已全屏打开。</translation>
 <translation id="6555233628095991027">Chrome 中的 Google 助理已半屏打开。</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb
index 478d5bd8..9d48ba8 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb
@@ -2,12 +2,14 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-TW">
 <translation id="1135993792949700405">Chrome 會將你所選的個人資料傳送給 <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1472675084647422956">顯示更多</translation>
 <translation id="1625889395409731085">要開啟外部連結嗎?</translation>
 <translation id="1699570257714336246">缺少資訊</translation>
 <translation id="3604604794717279723">我接受</translation>
 <translation id="4437727785356380473">已關閉 Chrome 版 Google 助理。</translation>
 <translation id="4850886885716139402">檢視</translation>
 <translation id="5014174725590676422">目前顯示 Chrome 版 Google 助理首次執行的畫面</translation>
+<translation id="5138227688689900538">顯示較少</translation>
 <translation id="5188078772080029703">Chrome 會將網站的網址和內容,以及 Chrome 中儲存的電子郵件和信用卡類型資訊傳送給 Google。你可以在 Chrome 設定中關閉這項功能。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="5267269112080050255">Chrome 版 Google 助理已開啟,顯示於整個畫面。</translation>
 <translation id="6555233628095991027">Chrome 版 Google 助理已開啟,顯示在畫面下半部。</translation>
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
index 1259b8bf..70061a53 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
@@ -13,11 +13,10 @@
         android:id="@+id/background_view"
         android:background="@drawable/popup_bg"
         android:layout_margin="3dp"
-        android:visibility="gone"/>
+        android:visibility="visible"/>
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:elevation="4dp"
         android:layout_gravity="center"
         android:background="@drawable/tab_grid_card_background"
         android:layout_margin="8dp">
@@ -72,7 +71,6 @@
         android:id="@+id/close_button"
         android:layout_width="48dp"
         android:layout_height="48dp"
-        android:elevation="4dp"
         android:scaleType="center"
         android:layout_gravity="end"
         android:tint="@color/modern_grey_800"
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java
index 74745363..64781b6 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java
@@ -28,6 +28,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * A {@link TabListMediator.ThumbnailProvider} that will create a single Bitmap Thumbnail for all
@@ -106,18 +107,22 @@
                     final int index = i;
                     final String url = mTabs.get(i).getUrl();
                     final boolean isIncognito = mTabs.get(i).isIncognito();
+                    // getTabThumbnailWithCallback() might call the callback up to twice,
+                    // so use |lastFavicon| to avoid fetching the favicon the second time.
+                    // Fetching the favicon after getting the live thumbnail would lead to
+                    // visible flicker.
+                    final AtomicReference<Drawable> lastFavicon = new AtomicReference<>();
                     mTabContentManager.getTabThumbnailWithCallback(mTabs.get(i), thumbnail -> {
                         drawThumbnailBitmapOnCanvasWithFrame(thumbnail, index);
-                        mTabListFaviconProvider.getFaviconForUrlAsync(
-                                url, isIncognito, (Drawable favicon) -> {
-                                    drawFaviconDrawableOnCanvasWithFrame(favicon, index);
-                                    if (mThumbnailsToFetch.decrementAndGet() == 0) {
-                                        PostTask.postTask(UiThreadTaskTraits.USER_VISIBLE,
-                                                ()
-                                                        -> mFinalCallback.onResult(
-                                                                mMultiThumbnailBitmap));
-                                    }
-                                });
+                        if (lastFavicon.get() != null) {
+                            drawFaviconThenMaybeSendBack(lastFavicon.get(), index);
+                        } else {
+                            mTabListFaviconProvider.getFaviconForUrlAsync(
+                                    url, isIncognito, (Drawable favicon) -> {
+                                        lastFavicon.set(favicon);
+                                        drawFaviconThenMaybeSendBack(favicon, index);
+                                    });
+                        }
                     }, mForceUpdate && i == 0);
                 } else {
                     drawThumbnailBitmapOnCanvasWithFrame(null, i);
@@ -164,6 +169,14 @@
             favicon.draw(mCanvas);
         }
 
+        private void drawFaviconThenMaybeSendBack(Drawable favicon, int index) {
+            drawFaviconDrawableOnCanvasWithFrame(favicon, index);
+            if (mThumbnailsToFetch.decrementAndGet() == 0) {
+                PostTask.postTask(UiThreadTaskTraits.USER_VISIBLE,
+                        () -> mFinalCallback.onResult(mMultiThumbnailBitmap));
+            }
+        }
+
         private void fetch() {
             initializeAndStartFetching(mInitialTab);
         }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SilenceLintErrors.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SilenceLintErrors.java
index 0035890..4417758 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SilenceLintErrors.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SilenceLintErrors.java
@@ -25,6 +25,7 @@
             R.string.iph_tab_groups_tap_to_see_another_tab_accessibility_text,
             R.string.accessibility_bottom_tab_strip_expand_tab_sheet,
             R.string.accessibility_bottom_tab_grid_close_tab_sheet,
+            R.string.tabswitcher_create_group,
     };
 
     private SilenceLintErrors() {}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
index 250e20ef..1ecadf9 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -51,7 +51,6 @@
                         (int) res.getDimension(R.dimen.tab_list_selected_inset_kitkat));
                 Drawable elevationDrawable =
                         ResourcesCompat.getDrawable(res, R.drawable.popup_bg, theme);
-                holder.backgroundView.setVisibility(View.VISIBLE);
                 holder.backgroundView.setBackground(
                         item.get(TabProperties.IS_SELECTED) ? selectedDrawable : elevationDrawable);
             } else {
@@ -76,8 +75,7 @@
             if (fetcher == null) return;
             Callback<Bitmap> callback = result -> {
                 if (result == null) {
-                    holder.thumbnail.setImageResource(0);
-                    holder.thumbnail.setMinimumHeight(holder.thumbnail.getWidth());
+                    holder.resetThumbnail();
                 } else {
                     holder.thumbnail.setImageBitmap(result);
                 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java
index e5f6196..9b1bba9 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java
@@ -71,4 +71,9 @@
     public int getTabId() {
         return mTabId;
     }
+
+    public void resetThumbnail() {
+        thumbnail.setImageResource(0);
+        thumbnail.setMinimumHeight(thumbnail.getWidth());
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
index 1cc4f4cf..892ea19 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -83,8 +83,13 @@
         RecyclerViewAdapter adapter;
         if (mMode == TabListMode.GRID) {
             SimpleRecyclerViewMcpBase<PropertyModel, TabGridViewHolder, PropertyKey> mcp =
-                    new SimpleRecyclerViewMcpBase<>(
-                            null, TabGridViewBinder::onBindViewHolder, tabListModel);
+                    new SimpleRecyclerViewMcpBase<PropertyModel, TabGridViewHolder, PropertyKey>(
+                            null, TabGridViewBinder::onBindViewHolder, tabListModel) {
+                        @Override
+                        public void onViewRecycled(TabGridViewHolder viewHolder) {
+                            viewHolder.resetThumbnail();
+                        }
+                    };
             adapter = new RecyclerViewAdapter<>(mcp, TabGridViewHolder::create);
             mModelChangeProcessor = mcp;
         } else if (mMode == TabListMode.STRIP) {
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java
index 55de18d..63e184207 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedAppLifecycle.java
@@ -7,7 +7,7 @@
 import android.app.Activity;
 import android.support.annotation.IntDef;
 
-import com.google.android.libraries.feed.api.lifecycle.AppLifecycleListener;
+import com.google.android.libraries.feed.api.client.lifecycle.AppLifecycleListener;
 
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApplicationStatus;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java
index 73f86ff..50dfdfe 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java
@@ -44,12 +44,12 @@
 
     private static final String INITIAL_NON_CACHED_PAGE_SIZE = "initial_non_cached_page_size";
     /** Default value for initial non cached page size. */
-    public static final int INITIAL_NON_CACHED_PAGE_SIZE_DEFAULT = 10;
+    public static final long INITIAL_NON_CACHED_PAGE_SIZE_DEFAULT = 10;
 
     private static final String LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS =
             "logging_immediate_content_threshold_ms";
     /** Default value for logging immediate content threshold. */
-    public static final int LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS_DEFAULT = 1000;
+    public static final long LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS_DEFAULT = 1000;
 
     private static final String MANAGE_INTERESTS_ENABLED = "manage_interests_enabled";
     /** Default value for whether to use menu options to launch interest management page. */
@@ -57,15 +57,15 @@
 
     private static final String NON_CACHED_MIN_PAGE_SIZE = "non_cached_min_page_size";
     /** Default value for non cached minimum page size. */
-    public static final int NON_CACHED_MIN_PAGE_SIZE_DEFAULT = 5;
+    public static final long NON_CACHED_MIN_PAGE_SIZE_DEFAULT = 5;
 
     private static final String NON_CACHED_PAGE_SIZE = "non_cached_page_size";
     /** Default value for non cached page size. */
-    public static final int NON_CACHED_PAGE_SIZE_DEFAULT = 25;
+    public static final long NON_CACHED_PAGE_SIZE_DEFAULT = 25;
 
     private static final String SESSION_LIFETIME_MS = "session_lifetime_ms";
     /** Default value for session lifetime. */
-    public static final int SESSION_LIFETIME_MS_DEFAULT = 3600000;
+    public static final long SESSION_LIFETIME_MS_DEFAULT = 3600000;
 
     private static final String SNIPPETS_ENABLED = "snippets_enabled";
     /** Default value for whether to show article snippets. */
@@ -136,7 +136,7 @@
     static int getInitialNonCachedPageSize() {
         return ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
                 ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS, INITIAL_NON_CACHED_PAGE_SIZE,
-                INITIAL_NON_CACHED_PAGE_SIZE_DEFAULT);
+                (int) INITIAL_NON_CACHED_PAGE_SIZE_DEFAULT);
     }
 
     /**
@@ -148,7 +148,7 @@
         return (long) ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
                 ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS,
                 LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS,
-                LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS_DEFAULT);
+                (int) LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS_DEFAULT);
     }
 
     /** return Whether to show context menu option to launch to customization page. */
@@ -164,7 +164,7 @@
     static int getNonCachedMinPageSize() {
         return ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
                 ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS, NON_CACHED_MIN_PAGE_SIZE,
-                NON_CACHED_MIN_PAGE_SIZE_DEFAULT);
+                (int) NON_CACHED_MIN_PAGE_SIZE_DEFAULT);
     }
 
     /** @return Used to decide where to place the more button. */
@@ -172,7 +172,7 @@
     static int getNonCachedPageSize() {
         return ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
                 ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS, NON_CACHED_PAGE_SIZE,
-                NON_CACHED_PAGE_SIZE_DEFAULT);
+                (int) NON_CACHED_PAGE_SIZE_DEFAULT);
     }
 
     /** @return Time until feed stops restoring the UI. */
@@ -180,7 +180,7 @@
     static long getSessionLifetimeMs() {
         return (long) ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
                 ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS, SESSION_LIFETIME_MS,
-                SESSION_LIFETIME_MS_DEFAULT);
+                (int) SESSION_LIFETIME_MS_DEFAULT);
     }
 
     /**
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedDebuggingBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedDebuggingBridge.java
index b536fdfa..31ae060 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedDebuggingBridge.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedDebuggingBridge.java
@@ -4,7 +4,7 @@
 
 package org.chromium.chrome.browser.feed;
 
-import com.google.android.libraries.feed.api.requestmanager.RequestManager;
+import com.google.android.libraries.feed.api.client.requestmanager.RequestManager;
 import com.google.android.libraries.feed.api.scope.FeedProcessScope;
 import com.google.android.libraries.feed.common.logging.Dumper;
 
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java
index cc2d5ce..de50cb6 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java
@@ -6,6 +6,7 @@
 
 import android.support.annotation.NonNull;
 
+import com.google.android.libraries.feed.api.client.stream.Stream.ScrollListener;
 import com.google.android.libraries.feed.api.host.logging.ActionType;
 import com.google.android.libraries.feed.api.host.logging.BasicLoggingApi;
 import com.google.android.libraries.feed.api.host.logging.ContentLoggingData;
@@ -17,7 +18,6 @@
 import com.google.android.libraries.feed.api.host.logging.SpinnerType;
 import com.google.android.libraries.feed.api.host.logging.Task;
 import com.google.android.libraries.feed.api.host.logging.ZeroStateShowReason;
-import com.google.android.libraries.feed.api.stream.ScrollListener;
 import com.google.search.now.ui.action.FeedActionProto;
 
 import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
index 439ff51..fdbdb5c 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
@@ -17,6 +17,9 @@
 import android.view.View;
 import android.widget.ScrollView;
 
+import com.google.android.libraries.feed.api.client.scope.StreamScope;
+import com.google.android.libraries.feed.api.client.stream.Header;
+import com.google.android.libraries.feed.api.client.stream.Stream;
 import com.google.android.libraries.feed.api.host.action.ActionApi;
 import com.google.android.libraries.feed.api.host.stream.CardConfiguration;
 import com.google.android.libraries.feed.api.host.stream.SnackbarApi;
@@ -26,10 +29,7 @@
 import com.google.android.libraries.feed.api.host.stream.TooltipCallbackApi;
 import com.google.android.libraries.feed.api.host.stream.TooltipInfo;
 import com.google.android.libraries.feed.api.scope.FeedProcessScope;
-import com.google.android.libraries.feed.api.scope.FeedStreamScope;
-import com.google.android.libraries.feed.api.stream.Header;
 import com.google.android.libraries.feed.api.stream.NonDismissibleHeader;
-import com.google.android.libraries.feed.api.stream.Stream;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.VisibleForTesting;
@@ -372,9 +372,9 @@
 
         TooltipApi tooltipApi = new BasicTooltipApi();
 
-        FeedStreamScope streamScope =
+        StreamScope streamScope =
                 feedProcessScope
-                        .createFeedStreamScopeBuilder(chromeActivity, mImageLoader, actionApi,
+                        .createStreamScopeBuilder(chromeActivity, mImageLoader, actionApi,
                                 new BasicStreamConfiguration(),
                                 new BasicCardConfiguration(
                                         chromeActivity.getResources(), mUiConfig),
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPageMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPageMediator.java
index 5b1cefff..fb90075 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPageMediator.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPageMediator.java
@@ -10,9 +10,9 @@
 import android.view.View;
 import android.widget.ScrollView;
 
-import com.google.android.libraries.feed.api.stream.ContentChangedListener;
-import com.google.android.libraries.feed.api.stream.ScrollListener;
-import com.google.android.libraries.feed.api.stream.Stream;
+import com.google.android.libraries.feed.api.client.stream.Stream;
+import com.google.android.libraries.feed.api.client.stream.Stream.ContentChangedListener;
+import com.google.android.libraries.feed.api.client.stream.Stream.ScrollListener;
 
 import org.chromium.base.MemoryPressureListener;
 import org.chromium.base.VisibleForTesting;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java
index 238bd268..a6b73ff 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeFactory.java
@@ -6,6 +6,7 @@
 
 import android.support.annotation.Nullable;
 
+import com.google.android.libraries.feed.api.client.scope.ProcessScopeBuilder;
 import com.google.android.libraries.feed.api.host.config.ApplicationInfo;
 import com.google.android.libraries.feed.api.host.config.Configuration;
 import com.google.android.libraries.feed.api.host.config.DebugBehavior;
@@ -136,15 +137,13 @@
         NetworkClient networkClient = sTestNetworkClient == null ?
             new FeedNetworkBridge(profile) : sTestNetworkClient;
         sFeedLoggingBridge = new FeedLoggingBridge(profile);
-        sFeedProcessScope =
-                new FeedProcessScope
-                        .Builder(configHostApi, Executors.newSingleThreadExecutor(),
-                                sFeedLoggingBridge, networkClient, schedulerBridge,
-                                DebugBehavior.SILENT, ContextUtils.getApplicationContext(),
-                                applicationInfo, new StubFeedTooltiSupportedApi())
-                        .setContentStorage(contentStorage)
-                        .setJournalStorage(journalStorage)
-                        .build();
+        sFeedProcessScope = (FeedProcessScope) new ProcessScopeBuilder(configHostApi,
+                Executors.newSingleThreadExecutor(), sFeedLoggingBridge, networkClient,
+                schedulerBridge, DebugBehavior.SILENT, ContextUtils.getApplicationContext(),
+                applicationInfo, new StubFeedTooltiSupportedApi())
+                                    .setContentStorage(contentStorage)
+                                    .setJournalStorage(journalStorage)
+                                    .build();
         schedulerBridge.initializeFeedDependencies(sFeedProcessScope.getRequestManager());
 
         sFeedOfflineIndicator = new FeedOfflineBridge(profile, sFeedProcessScope.getKnownContent());
@@ -176,13 +175,11 @@
         ApplicationInfo applicationInfo =
                 new ApplicationInfo.Builder(ContextUtils.getApplicationContext()).build();
 
-        sFeedProcessScope =
-                new FeedProcessScope
-                        .Builder(configHostApi, Executors.newSingleThreadExecutor(),
-                                sFeedLoggingBridge, networkClient, sFeedScheduler,
-                                DebugBehavior.SILENT, ContextUtils.getApplicationContext(),
-                                applicationInfo, new StubFeedTooltiSupportedApi())
-                        .build();
+        sFeedProcessScope = (FeedProcessScope) new ProcessScopeBuilder(configHostApi,
+                Executors.newSingleThreadExecutor(), sFeedLoggingBridge, networkClient,
+                sFeedScheduler, DebugBehavior.SILENT, ContextUtils.getApplicationContext(),
+                applicationInfo, new StubFeedTooltiSupportedApi())
+                                    .build();
     }
 
     /** Use supplied NetworkClient instead of real one, for tests. */
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java
index 2974bdc..11d066fbd 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSchedulerBridge.java
@@ -6,8 +6,8 @@
 
 import android.support.annotation.NonNull;
 
+import com.google.android.libraries.feed.api.client.requestmanager.RequestManager;
 import com.google.android.libraries.feed.api.host.scheduler.SchedulerApi;
-import com.google.android.libraries.feed.api.requestmanager.RequestManager;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java
index f2ad96e..56d92cb 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java
@@ -7,7 +7,7 @@
 import android.app.Activity;
 import android.support.annotation.IntDef;
 
-import com.google.android.libraries.feed.api.stream.Stream;
+import com.google.android.libraries.feed.api.client.stream.Stream;
 
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApplicationStatus;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index 2f1d6b5..a0aebff2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -148,6 +148,7 @@
 import org.chromium.chrome.browser.util.AccessibilityUtil;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.browser.util.MathUtils;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 import org.chromium.chrome.browser.vr.ArDelegate;
 import org.chromium.chrome.browser.vr.ArDelegateProvider;
 import org.chromium.chrome.browser.vr.VrModuleProvider;
@@ -763,7 +764,7 @@
     public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
         return new AppMenuPropertiesDelegate(this, getActivityTabProvider(),
                 getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(),
-                getWindow().getDecorView());
+                getWindow().getDecorView(), null);
     }
 
     /**
@@ -1443,6 +1444,14 @@
     }
 
     /**
+     * @return {@link ObservableSupplier} for the {@link OverviewModeBehavior} for this activity
+     *         if it supports an overview mode, null otherwise.
+     */
+    public @Nullable ObservableSupplier<OverviewModeBehavior> getOverviewModeBehaviorSupplier() {
+        return null;
+    }
+
+    /**
      * @return Whether this Activity should initialize the BottomSheet and BottomSheetController.
      */
     protected boolean shouldInitializeBottomSheet() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index 1d6aa3c..65a7075f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -338,6 +338,7 @@
     public static final String WEB_PAYMENTS_RETURN_GOOGLE_PAY_IN_BASIC_CARD =
             "ReturnGooglePayInBasicCard";
     public static final String WEB_PAYMENTS_SINGLE_APP_UI_SKIP = "WebPaymentsSingleAppUiSkip";
+    public static final String OFFER_WIPE_DATA_ON_SIGNOUT = "OfferWipeDataOnSignout";
     public static final String SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH =
             "ServiceManagerForBackgroundPrefetch";
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index ba53734..9cb0df4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -149,6 +149,8 @@
 import org.chromium.chrome.browser.util.AccessibilityUtil;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.browser.util.IntentUtils;
+import org.chromium.chrome.browser.util.ObservableSupplier;
+import org.chromium.chrome.browser.util.ObservableSupplierImpl;
 import org.chromium.chrome.browser.vr.VrModuleProvider;
 import org.chromium.chrome.browser.widget.OverviewListLayout;
 import org.chromium.components.feature_engagement.EventConstants;
@@ -332,6 +334,8 @@
             implements OverviewModeObserver, OverviewModeController {
         private OverviewModeController mInternalOverviewModeController;
         private ObserverList<OverviewModeObserver> mOverviewModeObserverList = new ObserverList<>();
+        private final ObservableSupplierImpl<OverviewModeBehavior> mOverviewModeBehaviorSupplier =
+                new ObservableSupplierImpl<>();
 
         @Override
         public boolean overviewVisible() {
@@ -392,15 +396,17 @@
         }
 
         /**
-         * Provide a new internal implementation to use for {@link OverviewModeController}.
-         * @param newOverviewModeController The new internal implementation to use.
+         * Provide an internal implementation to use for {@link OverviewModeController}.
+         * @param overviewModeController The internal implementation to use.
          */
-        void overrideOverviewModeController(OverviewModeController newOverviewModeController) {
+        void overrideOverviewModeController(OverviewModeController overviewModeController) {
             if (mInternalOverviewModeController != null) {
                 mInternalOverviewModeController.removeOverviewModeObserver(this);
             }
-            mInternalOverviewModeController = newOverviewModeController;
+
+            mInternalOverviewModeController = overviewModeController;
             mInternalOverviewModeController.addOverviewModeObserver(this);
+            mOverviewModeBehaviorSupplier.set(overviewModeController);
         }
     }
 
@@ -756,7 +762,10 @@
                         TabManagementModuleProvider.getDelegate().createGridTabSwitcher(this);
                 mOverviewModeController.overrideOverviewModeController(
                         gridTabSwitcher.getOverviewModeController());
+            } else {
+                mOverviewModeController.overrideOverviewModeController(mLayoutManager);
             }
+            mOverviewModeController.addOverviewModeObserver(this);
 
             if (ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_ENGAGEMENT_REPORTING_ANDROID)) {
                 // The lifecycle of this object is managed by the lifecycle dispatcher.
@@ -917,6 +926,11 @@
     }
 
     @Override
+    public @Nullable ObservableSupplier<OverviewModeBehavior> getOverviewModeBehaviorSupplier() {
+        return mOverviewModeController.mOverviewModeBehaviorSupplier;
+    }
+
+    @Override
     protected AssistStatusHandler createAssistStatusHandler() {
         return new TabbedAssistStatusHandler(this);
     }
@@ -963,8 +977,6 @@
                         new LayoutManagerChromePhone(compositorViewHolder, mOverviewModeController);
             }
             mLayoutManager.setEnableAnimations(DeviceClassManager.enableAnimations());
-            mOverviewModeController.overrideOverviewModeController(mLayoutManager);
-            mOverviewModeController.addOverviewModeObserver(this);
 
             // TODO(yusufo): get rid of findViewById(R.id.url_bar).
             initializeCompositorContent(mLayoutManager, findViewById(R.id.url_bar),
@@ -1649,7 +1661,8 @@
     public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
         return new TabbedAppMenuPropertiesDelegate(this, getActivityTabProvider(),
                 getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(),
-                getWindow().getDecorView(), this);
+                getWindow().getDecorView(), this,
+                mOverviewModeController.mOverviewModeBehaviorSupplier);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
index 6b9d6ed0..f350f08 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -472,6 +472,10 @@
 
         if (isIntentForMhtmlFileOrContent(intent) && tabOpenType == TabOpenType.OPEN_NEW_TAB
                 && referrerUrl == null && extraHeaders == null) {
+            // TODO(https://crbug.com/963233): should MHTML intent be handled on touchless someday?
+            if (!OfflinePageUtils.isEnabled()) {
+                return false;
+            }
             handleMhtmlFileOrContentIntent(url, intent);
             return true;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/UrlConstants.java b/chrome/android/java/src/org/chromium/chrome/browser/UrlConstants.java
index ab1cd30..3fb08e1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/UrlConstants.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/UrlConstants.java
@@ -28,6 +28,8 @@
     public static final String CHROME_URL_SHORT_PREFIX = "chrome:";
     public static final String CHROME_NATIVE_URL_SHORT_PREFIX = "chrome-native:";
     public static final String FILE_URL_SHORT_PREFIX = "file:";
+    public static final String DEVTOOLS_URL_SHORT_PREFIX = "devtools:";
+    public static final String DEVTOOLS_FALLBACK_URL_SHORT_PREFIX = "chrome-devtools:";
 
     public static final String CHROME_URL_PREFIX = "chrome://";
     public static final String CHROME_NATIVE_URL_PREFIX = "chrome-native://";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinator.java
index e1a9230..bafeb358 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuCoordinator.java
@@ -17,6 +17,7 @@
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper;
 import org.chromium.chrome.browser.toolbar.ToolbarManager;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 
 /** A UI coordinator the app menu. */
 public class AppMenuCoordinator {
@@ -69,11 +70,14 @@
          *            It is assumed to have back_menu_id, forward_menu_id, bookmark_this_page_id.
          * @param decorView The decor {@link View}, e.g. from Window#getDecorView(), for the
          *         containing activity.
+         * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
+         *         {@link OverviewModeBehavior} associated with the containing activity.
          * @return AppMenuHandler for the given activity and menu resource id.
          */
         AppMenuHandler get(AppMenuPropertiesDelegate delegate, AppMenuDelegate appMenuDelegate,
                 int menuResourceId, View decorView,
-                ActivityLifecycleDispatcher activityLifecycleDispatcher);
+                ActivityLifecycleDispatcher activityLifecycleDispatcher,
+                @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier);
     }
 
     /**
@@ -91,10 +95,10 @@
     private AppMenuPropertiesDelegate mAppMenuPropertiesDelegate;
     private AppMenuHandler mAppMenuHandler;
 
-    private static AppMenuHandlerFactory sAppMenuHandlerFactory =
-            (delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher)
+    private static AppMenuHandlerFactory sAppMenuHandlerFactory = (delegate, appMenuDelegate,
+            menuResourceId, decorView, activityLifecycleDispatcher, overviewModeBehaviorSupplier)
             -> new AppMenuHandler(delegate, appMenuDelegate, menuResourceId, decorView,
-                    activityLifecycleDispatcher);
+                    activityLifecycleDispatcher, overviewModeBehaviorSupplier);
 
     /**
      * Construct a new AppMenuCoordinator.
@@ -105,10 +109,13 @@
      * @param appMenuDelegate The {@link AppMenuDelegate} for the containing activity.
      * @param decorView The decor {@link View}, e.g. from Window#getDecorView(), for the containing
      *         activity.
+     * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
+     *         {@link OverviewModeBehavior} associated with the containing activity.
      */
     public AppMenuCoordinator(Context context,
             ActivityLifecycleDispatcher activityLifecycleDispatcher,
-            MenuButtonDelegate buttonDelegate, AppMenuDelegate appMenuDelegate, View decorView) {
+            MenuButtonDelegate buttonDelegate, AppMenuDelegate appMenuDelegate, View decorView,
+            @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
         mContext = context;
         mButtonDelegate = buttonDelegate;
         mAppMenuDelegate = appMenuDelegate;
@@ -116,7 +123,7 @@
 
         mAppMenuHandler = sAppMenuHandlerFactory.get(mAppMenuPropertiesDelegate, mAppMenuDelegate,
                 mAppMenuPropertiesDelegate.getAppMenuLayoutId(), decorView,
-                activityLifecycleDispatcher);
+                activityLifecycleDispatcher, overviewModeBehaviorSupplier);
 
         // TODO(twellington): Move to UpdateMenuItemHelper or common UI coordinator parent?
         mAppMenuHandler.addObserver(new AppMenuObserver() {
@@ -143,20 +150,8 @@
     public void destroy() {
         // Prevent the menu window from leaking.
         if (mAppMenuHandler != null) mAppMenuHandler.destroy();
-    }
 
-    /**
-     * Called when native initialization has finished to provide additional activity-scoped objects
-     * only available after native initialization.
-     *
-     * @param overviewModeBehavior The {@link OverviewModeBehavior} for the containing activity
-     *         if the current activity supports an overview mode, or null otherwise.
-     */
-    public void onNativeInitialized(@Nullable OverviewModeBehavior overviewModeBehavior) {
-        // TODO(https://crbug.com/956260): Look into providing this during construction
-        // (e.g. through an AsyncSupplier that can notify when the dependency is available).
-        mAppMenuPropertiesDelegate.onNativeInitialized(overviewModeBehavior);
-        mAppMenuHandler.onNativeInitialized(overviewModeBehavior);
+        mAppMenuPropertiesDelegate.destroy();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuHandler.java
index 7b8283d..505547a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuHandler.java
@@ -19,6 +19,7 @@
 import android.view.WindowManager;
 import android.widget.PopupMenu;
 
+import org.chromium.base.Callback;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
@@ -26,6 +27,7 @@
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver;
 import org.chromium.chrome.browser.lifecycle.StartStopWithNativeObserver;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 import org.chromium.chrome.browser.widget.textbubble.TextBubble;
 
 import java.util.ArrayList;
@@ -47,7 +49,9 @@
     private final AppMenuCoordinator.AppMenuDelegate mAppMenuDelegate;
     private final View mDecorView;
     private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
-    private OverviewModeBehavior mOverviewModeBehavior;
+    private final @Nullable ObservableSupplier<OverviewModeBehavior> mOverviewModeBehaviorSupplier;
+    private @Nullable Callback<OverviewModeBehavior> mOverviewModeSupplierCallback;
+    private @Nullable OverviewModeBehavior mOverviewModeBehavior;
 
     /**
      * The resource id of the menu item to highlight when the menu next opens. A value of
@@ -71,10 +75,13 @@
      *            activity.
      * @param activityLifecycleDispatcher The {@link ActivityLifecycleDispatcher} for the containing
      *            activity.
+     * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
+     *            {@link OverviewModeBehavior} associated with the containing activity.
      */
     public AppMenuHandler(AppMenuPropertiesDelegate delegate,
             AppMenuCoordinator.AppMenuDelegate appMenuDelegate, int menuResourceId, View decorView,
-            ActivityLifecycleDispatcher activityLifecycleDispatcher) {
+            ActivityLifecycleDispatcher activityLifecycleDispatcher,
+            @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
         mAppMenuDelegate = appMenuDelegate;
         mDelegate = delegate;
         mDecorView = decorView;
@@ -85,6 +92,19 @@
         mActivityLifecycleDispatcher = activityLifecycleDispatcher;
         mActivityLifecycleDispatcher.register(this);
 
+        mOverviewModeBehaviorSupplier = overviewModeBehaviorSupplier;
+        if (mOverviewModeBehavior != null) {
+            mOverviewModeSupplierCallback = overviewModeBehavior -> {
+                if (mOverviewModeBehavior != null) {
+                    mOverviewModeBehavior.removeOverviewModeObserver(this);
+                }
+
+                mOverviewModeBehavior = overviewModeBehavior;
+                mOverviewModeBehavior.addOverviewModeObserver(this);
+            };
+            mOverviewModeBehaviorSupplier.addObserver(mOverviewModeSupplierCallback);
+        }
+
         assert mHardwareButtonMenuAnchor != null
                 : "Using AppMenu requires to have menu_anchor_stub view";
     }
@@ -97,6 +117,9 @@
         hideAppMenu();
 
         mActivityLifecycleDispatcher.unregister(this);
+        if (mOverviewModeBehaviorSupplier != null) {
+            mOverviewModeBehaviorSupplier.removeObserver(mOverviewModeSupplierCallback);
+        }
         if (mOverviewModeBehavior != null) {
             mOverviewModeBehavior.removeOverviewModeObserver(this);
         }
@@ -104,20 +127,6 @@
     }
 
     /**
-     * Called when native initialization has finished to provide additional activity-scoped objects
-     * only available after native initialization.
-     *
-     * @param overviewModeBehavior The {@link OverviewModeBehavior} for the containing activity
-     *         if the current activity supports an overview mode, or null otherwise.
-     */
-    void onNativeInitialized(@Nullable OverviewModeBehavior overviewModeBehavior) {
-        if (overviewModeBehavior != null) {
-            mOverviewModeBehavior = overviewModeBehavior;
-            mOverviewModeBehavior.addOverviewModeObserver(this);
-        }
-    }
-
-    /**
      * Notifies the menu that the contents of the menu item specified by {@code menuRowId} have
      * changed.  This should be called if icons, titles, etc. are changing for a particular menu
      * item while the menu is open.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
index 1e5063f..2f5e15a2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
@@ -18,6 +18,7 @@
 import android.view.MenuItem;
 import android.view.View;
 
+import org.chromium.base.Callback;
 import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.metrics.RecordHistogram;
@@ -40,6 +41,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.toolbar.ToolbarManager;
 import org.chromium.chrome.browser.translate.TranslateBridge;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.webapk.lib.client.WebApkValidator;
@@ -57,6 +59,8 @@
     protected final TabModelSelector mTabModelSelector;
     protected final ToolbarManager mToolbarManager;
     protected final View mDecorView;
+    private final @Nullable ObservableSupplier<OverviewModeBehavior> mOverviewModeBehaviorSupplier;
+    private @Nullable Callback<OverviewModeBehavior> mOverviewModeSupplierCallback;
 
     protected @Nullable OverviewModeBehavior mOverviewModeBehavior;
     protected BookmarkBridge mBookmarkBridge;
@@ -71,10 +75,13 @@
      * @param toolbarManager The {@link ToolbarManager} for the containing activity.
      * @param decorView The decor {@link View}, e.g. from Window#getDecorView(), for the containing
      *         activity.
+     * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
+     *         {@link OverviewModeBehavior} associated with the containing activity.
      */
     public AppMenuPropertiesDelegate(Context context, ActivityTabProvider activityTabProvider,
             MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
-            TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView) {
+            TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView,
+            @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
         mContext = context;
         mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext);
         mActivityTabProvider = activityTabProvider;
@@ -82,17 +89,23 @@
         mTabModelSelector = tabModelSelector;
         mToolbarManager = toolbarManager;
         mDecorView = decorView;
+
+        mOverviewModeBehaviorSupplier = overviewModeBehaviorSupplier;
+        if (mOverviewModeBehaviorSupplier != null) {
+            mOverviewModeSupplierCallback = overviewModeBehavior -> {
+                mOverviewModeBehavior = overviewModeBehavior;
+            };
+            mOverviewModeBehaviorSupplier.addObserver(mOverviewModeSupplierCallback);
+        }
     }
 
     /**
-     * Called when native initialization has finished to provide additional activity-scoped objects
-     * only available after native initialization.
-     *
-     * @param overviewModeBehavior The {@link OverviewModeBehavior} for the containing activity
-     *         if the current activity supports an overview mode, or null otherwise.
+     * Called when the containing activity is being destroyed.
      */
-    void onNativeInitialized(@Nullable OverviewModeBehavior overviewModeBehavior) {
-        mOverviewModeBehavior = overviewModeBehavior;
+    public void destroy() {
+        if (mOverviewModeBehaviorSupplier != null) {
+            mOverviewModeBehaviorSupplier.removeObserver(mOverviewModeSupplierCallback);
+        }
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTask.java
index 05d668f..841708d4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTask.java
@@ -99,7 +99,7 @@
         ThreadUtils.assertOnUiThread();
         mTaskStopped = true;
         recordTaskFinishedMetric();
-        if (isNativeLoaded()) {
+        if (isNativeLoadedInFullBrowserMode()) {
             return onStopTaskWithNative(context, taskParameters);
         } else {
             return onStopTaskBeforeNativeLoaded(context, taskParameters);
@@ -119,11 +119,14 @@
      */
     protected final void runWithNative(final Context context,
             final Runnable startWithNativeRunnable, final Runnable rescheduleRunnable) {
-        if (isNativeLoaded()) {
+        if (isNativeLoadedInFullBrowserMode()) {
             PostTask.postTask(UiThreadTaskTraits.DEFAULT, startWithNativeRunnable);
             return;
         }
 
+        boolean wasInServiceManagerOnlyMode = isNativeLoadedInServiceManagerOnlyMode();
+        boolean startServiceManagerOnly = supportsServiceManagerOnly();
+
         final BrowserParts parts = new EmptyBrowserParts() {
             @Override
             public void finishNativeInitialization() {
@@ -131,7 +134,7 @@
             }
             @Override
             public boolean startServiceManagerOnly() {
-                return supportsServiceManagerOnly();
+                return startServiceManagerOnly;
             }
             @Override
             public void onStartupFailure() {
@@ -145,7 +148,13 @@
                 // If task was stopped before we got here, don't start native initialization.
                 if (mTaskStopped) return;
 
-                BackgroundTaskSchedulerExternalUma.reportTaskStartedNative(mTaskId);
+                // Record transitions from No Native to Service Manager Only Mode and from No Native
+                // to Full Browser mode, but not cases in which Service Manager Only Mode was
+                // already started.
+                if (!wasInServiceManagerOnlyMode)
+                    BackgroundTaskSchedulerExternalUma.reportTaskStartedNative(
+                            mTaskId, startServiceManagerOnly);
+
                 try {
                     ChromeBrowserInitializer.getInstance(context).handlePreNativeStartup(parts);
 
@@ -227,11 +236,16 @@
         };
     }
 
-    /** Whether the native part of the browser is loaded. */
-    private boolean isNativeLoaded() {
+    /** Whether the native part of the browser is loaded in Full Browser Mode. */
+    private boolean isNativeLoadedInFullBrowserMode() {
         return getBrowserStartupController().isStartupSuccessfullyCompleted();
     }
 
+    /** Whether the native part of the browser is loaded in Service Manager Only Mode. */
+    private boolean isNativeLoadedInServiceManagerOnlyMode() {
+        return getBrowserStartupController().isServiceManagerSuccessfullyStarted();
+    }
+
     @VisibleForTesting
     protected BrowserStartupController getBrowserStartupController() {
         return BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java
index f8a40ed..c4ecc74c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java
@@ -22,8 +22,6 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabFavicon;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
-import org.chromium.chrome.browser.tasks.tab_groups.LayoutTabGroupCreationButton;
-import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.base.LocalizationUtils;
 import org.chromium.ui.resources.ResourceManager;
@@ -55,10 +53,6 @@
     /** Responsible for building incognito or dark theme titles. */
     protected TitleBitmapFactory mDarkTitleBitmapFactory;
 
-    // TODO(meiliang): This is for TabGroup feature, remove after experiment
-    private LayoutTabGroupCreationButton mLayoutTabGroupCreationButton;
-    private BitmapDynamicResource mTabGroupCreationButtonResource;
-
     /**
      * Builds an instance of the LayerTitleCache.
      */
@@ -84,35 +78,12 @@
      */
     public void setResourceManager(ResourceManager resourceManager) {
         mResourceManager = resourceManager;
-        if (FeatureUtilities.isTabGroupsAndroidEnabled()) {
-            createTabGroupCreationButtonResource();
-        }
-    }
-
-    private void createTabGroupCreationButtonResource() {
-        if (mResourceManager == null) return;
-        mTabGroupCreationButtonResource = new BitmapDynamicResource(sNextResourceId++);
-        DynamicResourceLoader loader = mResourceManager.getBitmapDynamicResourceLoader();
-        loader.registerResource(
-                mTabGroupCreationButtonResource.getResId(), mTabGroupCreationButtonResource);
-    }
-
-    /**
-     * @return The reference to {@link LayoutTabGroupCreationButton}.
-     */
-    public LayoutTabGroupCreationButton getLayoutTabGroupCreationButton() {
-        return mLayoutTabGroupCreationButton;
     }
 
     /**
      * Destroys the native reference.
      */
     public void shutDown() {
-        if (mTabGroupCreationButtonResource != null && mResourceManager != null) {
-            DynamicResourceLoader loader = mResourceManager.getBitmapDynamicResourceLoader();
-            loader.unregisterResource(mTabGroupCreationButtonResource.getResId());
-        }
-        mLayoutTabGroupCreationButton = null;
         if (mNativeLayerTitleCache == 0) return;
         nativeDestroy(mNativeLayerTitleCache);
         mNativeLayerTitleCache = 0;
@@ -120,11 +91,6 @@
 
     public void setTabModelSelector(TabModelSelector tabModelSelector) {
         mTabModelSelector = tabModelSelector;
-        if (FeatureUtilities.isTabGroupsAndroidEnabled()
-                && mTabGroupCreationButtonResource != null) {
-            mLayoutTabGroupCreationButton = new LayoutTabGroupCreationButton(
-                    mContext, mTabGroupCreationButtonResource, mTabModelSelector);
-        }
     }
 
     @CalledByNative
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/OverviewModeBehavior.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/OverviewModeBehavior.java
index 72f0881..947e891 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/OverviewModeBehavior.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/OverviewModeBehavior.java
@@ -12,7 +12,7 @@
     /**
      * An observer that is notified when the overview mode state changes.
      */
-    public interface OverviewModeObserver {
+    interface OverviewModeObserver {
         /**
          * Called when overview mode starts showing.
          * @param showToolbar Whether or not to show the normal toolbar when animating into overview
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
index 8ac40a5..08474cb6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
@@ -256,24 +256,28 @@
      * TODO(yusufo): Change the plumbing so that at the least a {@link android.net.Uri} is sent
      * over JNI of an uncompressed file on disk.
      * @param tab The tab to get the thumbnail for.
-     * @param callback The callback to send the {@link Bitmap} with.
+     * @param callback The callback to send the {@link Bitmap} with. Can be called up to twice when
+     *                 forceUpdate; otherwise always called exactly once.
+     * @param forceUpdate Whether to obtain the thumbnail from the live content.
      */
     public void getTabThumbnailWithCallback(
             Tab tab, Callback<Bitmap> callback, boolean forceUpdate) {
         if (mNativeTabContentManager == 0 || !mSnapshotsEnabled) return;
 
+        // Reading thumbnail from disk is faster than taking screenshot from live Tab, so fetch
+        // that first even if |forceUpdate|.
+        nativeGetTabThumbnailWithCallback(mNativeTabContentManager, tab.getId(), callback);
+
         if (forceUpdate) {
             cacheTabThumbnail(tab, (bitmap) -> {
+                // Null check to avoid having a Bitmap from nativeGetTabThumbnailWithCallback() but
+                // cleared here.
+                // If invalidation is not needed, cacheTabThumbnail() might not do anything and
+                // send back null.
                 if (bitmap != null) {
                     callback.onResult(bitmap);
-                    return;
                 }
-                // If invalidation is not needed, cacheTabThumbnail() might not do anything, so we
-                // need to fall back to reading from disk.
-                nativeGetTabThumbnailWithCallback(mNativeTabContentManager, tab.getId(), callback);
             });
-        } else {
-            nativeGetTabThumbnailWithCallback(mNativeTabContentManager, tab.getId(), callback);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java
index c164ff8d..b4ec4f2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java
@@ -45,11 +45,9 @@
 import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabList;
-import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
-import org.chromium.chrome.browser.tasks.tab_groups.LayoutTabGroupCreationButton;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.browser.util.MathUtils;
 import org.chromium.ui.UiUtils;
@@ -239,8 +237,6 @@
     private final ArrayList<Pair<CompositorAnimator, FloatProperty>> mLayoutAnimations =
             new ArrayList<>();
 
-    private LayoutTabGroupCreationButton mLayoutTabGroupCreationButton;
-
     private class StackLayoutGestureHandler implements GestureHandler {
         @Override
         public void onDown(float x, float y, boolean fromMouse, int buttons) {
@@ -303,13 +299,6 @@
 
             // Click event happens before the up event. mClicked is set to mute the up event.
             mClicked = true;
-
-            if (mLayoutTabGroupCreationButton != null
-                    && mLayoutTabGroupCreationButton.getCreateGroupButton().checkClicked(x, y)) {
-                mLayoutTabGroupCreationButton.getCreateGroupButton().handleClick(time());
-                return;
-            }
-
             PortraitViewport viewportParams = getViewportParameters();
             final int stackIndexDeltaAt = viewportParams.getStackIndexDeltaAt(x, y);
             if (stackIndexDeltaAt == 0) {
@@ -1407,11 +1396,6 @@
         return distance - 2 * getViewportParameters().getInnerMargin();
     }
 
-    private int getCenteredTabIndex() {
-        if (!mIsActiveLayout) return -1;
-        return mStacks.get(getTabStackIndex()).getCenteredTabIndex();
-    }
-
     @Override
     public void startHiding(int nextTabId, boolean hintAtTabSelection) {
         super.startHiding(nextTabId, hintAtTabSelection);
@@ -1611,23 +1595,6 @@
                 resourceManager, fullscreenManager);
         assert mSceneLayer != null;
 
-        int centerIndex = getCenteredTabIndex();
-        if (centerIndex != TabModel.INVALID_TAB_INDEX
-                && FeatureUtilities.isTabGroupsAndroidEnabled()
-                && layerTitleCache.getLayoutTabGroupCreationButton() != null) {
-            if (mLayoutTabGroupCreationButton == null) {
-                mLayoutTabGroupCreationButton = layerTitleCache.getLayoutTabGroupCreationButton();
-            }
-
-            Tab tab = mStacks.get(getTabStackIndex()).getTabList().getTabAt(centerIndex);
-            boolean ableToCreateGroup = mTabModelSelector.getTabModelFilterProvider()
-                                                .getCurrentTabModelFilter()
-                                                .getRelatedTabList(tab.getId())
-                                                .size()
-                    == 1;
-            mLayoutTabGroupCreationButton.updateLayout(tab, mLayoutTabs, ableToCreateGroup);
-        }
-
         mSceneLayer.pushLayers(getContext(), viewport, contentViewport, this, layerTitleCache,
                 tabContentManager, resourceManager, fullscreenManager);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/NonOverlappingStack.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/NonOverlappingStack.java
index c7e95060..5d39924a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/NonOverlappingStack.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/NonOverlappingStack.java
@@ -179,7 +179,11 @@
         updateScrollSnap();
     }
 
-    @Override
+    /**
+     * @return The index of the currently centered tab. If we're not currently snapped to a tab
+     *         (e.g. we're in the process of animating a scroll or the user is currently dragging),
+     *         returns the index of the tab closest to the center.
+     */
     public int getCenteredTabIndex() {
         return Math.round(-mScrollOffset / mSpacing);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/OverlappingStack.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/OverlappingStack.java
index ddf5f8b..51ddc2c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/OverlappingStack.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/OverlappingStack.java
@@ -80,11 +80,6 @@
     }
 
     @Override
-    public int getCenteredTabIndex() {
-        return -1;
-    }
-
-    @Override
     protected boolean evenOutTabs(float amount, boolean allowReverseDirection) {
         if (mStackTabs == null || mOverviewAnimationType != OverviewAnimationType.NONE
                 || mEvenOutProgress >= 1.0f || amount == 0) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java
index f0c5e001..0f1253c6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java
@@ -302,13 +302,6 @@
      */
     public abstract float getScaleAmount();
 
-    /**
-     * @return The index of the currently centered tab. If we're not currently snapped to a tab
-     *         (e.g. we're in the process of animating a scroll or the user is currently dragging),
-     *         returns the index of the tab closest to the center.
-     */
-    public abstract int getCenteredTabIndex();
-
     /*
      * Main Interaction Methods for the rest of the application
      *
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
index f25947d..1ce4c5b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
@@ -15,13 +15,11 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.compositor.LayerTitleCache;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton;
 import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.util.ColorUtils;
-import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.ui.resources.ResourceManager;
 
 /**
@@ -70,17 +68,6 @@
         nativeUpdateLayer(mNativePtr, tabListBgColor, viewport.left, viewport.top, viewport.width(),
                 viewport.height(), layerTitleCache, tabContentManager, resourceManager);
 
-        boolean isTabGroupEnabled = FeatureUtilities.isTabGroupsAndroidEnabled();
-
-        if (isTabGroupEnabled && layerTitleCache.getLayoutTabGroupCreationButton() != null) {
-            CompositorButton createGroupButton =
-                    layerTitleCache.getLayoutTabGroupCreationButton().getCreateGroupButton();
-            nativePutCreateGroupTextButtonLayer(mNativePtr,
-                    layerTitleCache.getLayoutTabGroupCreationButton().getButtonResourceId(),
-                    createGroupButton.getX() * dpToPx, createGroupButton.getY() * dpToPx,
-                    createGroupButton.isVisible());
-        }
-
         boolean isHTSEnabled =
                 ChromeFeatureList.isEnabled(ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID);
 
@@ -212,7 +199,4 @@
             int toolbarTextBoxResource, int toolbarTextBoxBackgroundColor,
             float toolbarTextBoxAlpha, float toolbarAlpha, float toolbarYOffset,
             float sideBorderScale, boolean insetVerticalBorder);
-
-    private native void nativePutCreateGroupTextButtonLayer(long nativeTabListSceneLayer,
-            int buttonResourceId, float x, float y, boolean isVisible);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
index 89b14451..7475f44 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
@@ -63,7 +63,7 @@
             @CustomTabsUiType final int uiType, List<String> menuEntries, boolean isOpenedByChrome,
             boolean showShare, boolean showStar, boolean showDownload, boolean isIncognito) {
         super(context, activityTabProvider, multiWindowModeStateDispatcher, tabModelSelector,
-                toolbarManager, decorView);
+                toolbarManager, decorView, null);
         mUiType = uiType;
         mMenuEntries = menuEntries;
         mIsOpenedByChrome = isOpenedByChrome;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
index c17abd5..ac81025 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
@@ -375,11 +375,13 @@
             return OverrideUrlLoadingResult.NO_OVERRIDE;
         }
 
-        // The "about:", "chrome:", and "chrome-native:" schemes are internal to the browser;
-        // don't want these to be dispatched to other apps.
+        // The "about:", "chrome:", "chrome-native:", "chrome-devtools:", and "devtools:" schemes
+        // are internal to the browser; don't want these to be dispatched to other apps.
         if (params.getUrl().startsWith(ContentUrlConstants.ABOUT_URL_SHORT_PREFIX)
                 || params.getUrl().startsWith(UrlConstants.CHROME_URL_SHORT_PREFIX)
-                || params.getUrl().startsWith(UrlConstants.CHROME_NATIVE_URL_SHORT_PREFIX)) {
+                || params.getUrl().startsWith(UrlConstants.CHROME_NATIVE_URL_SHORT_PREFIX)
+                || params.getUrl().startsWith(UrlConstants.DEVTOOLS_URL_SHORT_PREFIX)
+                || params.getUrl().startsWith(UrlConstants.DEVTOOLS_FALLBACK_URL_SHORT_PREFIX)) {
             if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Navigating to a chrome-internal page");
             return OverrideUrlLoadingResult.NO_OVERRIDE;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
index 39bbef1..239af73 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DuplicateDownloadInfoBar.java
@@ -23,6 +23,8 @@
 import org.chromium.chrome.browser.download.DownloadManagerService;
 import org.chromium.chrome.browser.download.DownloadMetrics;
 import org.chromium.chrome.browser.download.DownloadUtils;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modelutil.PropertyModel;
 
 import java.io.File;
 
@@ -163,4 +165,21 @@
             layout.setMessage(getDownloadMessageText(context, template));
         }
     }
+
+    @Override
+    public boolean supportsTouchlessMode() {
+        return true;
+    }
+
+    @Override
+    public PropertyModel createModel() {
+        PropertyModel model = super.createModel();
+
+        String template = getContext().getString(R.string.duplicate_download_request_infobar_text);
+
+        model.set(ModalDialogProperties.TITLE,
+                getDownloadMessageText(getContext(), template).toString());
+
+        return model;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java
index e110bae52..04913203 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java
@@ -146,7 +146,8 @@
                         .with(TouchlessDialogProperties.CANCEL_ACTION,
                                 view -> onCloseButtonClicked())
                         .with(TouchlessDialogProperties.ALT_ACTION, null)
-                        .with(ModalDialogProperties.TITLE, mMessage.toString())
+                        .with(ModalDialogProperties.TITLE,
+                                mMessage != null ? mMessage.toString() : "")
                         .with(ModalDialogProperties.TITLE_ICON, icon)
                         .with(ModalDialogProperties.CONTROLLER,
                                 new ModalDialogProperties.Controller() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index cf6203f..ca61c79 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -228,6 +228,13 @@
     }
 
     /**
+     * Returns false if offline pages features should be disabled.
+     */
+    public static boolean isEnabled() {
+        return org.chromium.chrome.browser.BuildConfig.ENABLE_OFFLINE_PAGES;
+    }
+
+    /**
      * Returns the number of free bytes on the storage.
      */
     public static long getFreeSpaceInBytes() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentApp.java
index 2938a96..0b310d91 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentApp.java
@@ -42,10 +42,13 @@
          * interaction until updateWith() or noUpdatedPaymentDetails().
          * https://w3c.github.io/payment-request/#paymentmethodchangeevent-interface
          *
-         * @param methodName         Method name. For example, "https://google.com/pay".
-         * @param stringifiedDetails JSON-serialzied object. For example, {"type": "debit"}.
+         * @param methodName         Method name. For example, "https://google.com/pay". Should not
+         *                           be null or empty.
+         * @param stringifiedDetails JSON-serialized object. For example, {"type": "debit"}. Should
+         *                           not be null.
+         * @return Whether the payment state was valid.
          */
-        void onPaymentMethodChange(String methodName, String stringifiedDetails);
+        boolean changePaymentMethodFromInvokedApp(String methodName, String stringifiedDetails);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentInstrument.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentInstrument.java
index d9f2191..a12077c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentInstrument.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentInstrument.java
@@ -13,6 +13,7 @@
 import org.chromium.payments.mojom.PaymentCurrencyAmount;
 import org.chromium.payments.mojom.PaymentDetailsModifier;
 import org.chromium.payments.mojom.PaymentItem;
+import org.chromium.payments.mojom.PaymentMethodChangeResponse;
 import org.chromium.payments.mojom.PaymentMethodData;
 
 import java.util.List;
@@ -121,7 +122,7 @@
      *         supported card types and networks in the data should be verified for 'basic-card'
      *         payment method.
      */
-    public boolean isValidForPaymentMethodData(String method, PaymentMethodData data) {
+    public boolean isValidForPaymentMethodData(String method, @Nullable PaymentMethodData data) {
         return getInstrumentMethodNames().contains(method);
     }
 
@@ -175,19 +176,33 @@
             InstrumentDetailsCallback callback);
 
     /**
-     * Update the payment information in response to payment method change event.
-     *
-     * @param total The updated total amount. The total amount can be null if there is no change to
-     *              the total amount or if merchant encountered an error in
-     *              |onPaymentMethodChange(methodName, stringifiedDetails)| call.
-     * @param error A human-readable error message that explains why merchant could not process the
-     *              |onPaymentMethodChange(methodName, stringifiedDetails)| call. The error message
-     *              can be null if there're no errors.
+     * DO NOT USE. DEPRECATED. Instead of this method, please override updateWith(response),
+     * noUpdatedPaymentDetails(), and isChangingPaymentMethod().
+     * TODO(rouslan): Remove this method when all dependencies stop using it.
+     * https://crbug.com/884680
      */
     public void onPaymentDetailsUpdate(
             @Nullable PaymentCurrencyAmount total, @Nullable String error) {}
 
     /**
+     * Update the payment information in response to payment method change event.
+     *
+     * @param response The merchant's response to the payment method change event.
+     */
+    public void updateWith(PaymentMethodChangeResponse response) {}
+
+    /** Called when the merchant ignored the payment method change event. */
+    public void noUpdatedPaymentDetails() {}
+
+    /**
+     * @return True after changePaymentMethodFromInvokedApp(), before update updateWith() or
+     * noUpdatedPaymentDetails().
+     */
+    public boolean isChangingPaymentMethod() {
+        return false;
+    }
+
+    /**
      * Abort invocation of the payment app.
      *
      * @param callback The callback to return abort result.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index 1daef94..43d31e2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -53,6 +53,7 @@
 import org.chromium.chrome.browser.widget.prefeditor.EditableOption;
 import org.chromium.components.payments.CurrencyFormatter;
 import org.chromium.components.payments.OriginSecurityChecker;
+import org.chromium.components.payments.PaymentDetailsConverter;
 import org.chromium.components.payments.PaymentHandlerHost;
 import org.chromium.components.payments.PaymentHandlerHost.PaymentHandlerHostDelegate;
 import org.chromium.components.payments.PaymentValidator;
@@ -107,7 +108,7 @@
                    PaymentAppFactory.PaymentAppCreatedCallback,
                    PaymentResponseHelper.PaymentResponseRequesterDelegate, FocusChangedObserver,
                    NormalizedAddressRequestDelegate, SettingsAutofillAndPaymentsObserver.Observer,
-                   PaymentHandlerHostDelegate {
+                   PaymentHandlerHostDelegate, PaymentDetailsConverter.MethodChecker {
     /**
      * A test-only observer for the PaymentRequest service implementation.
      */
@@ -860,18 +861,32 @@
         return result == null ? null : Collections.unmodifiableMap(result);
     }
 
+    /** Called by the payment app to get updated total based on the billing address, for example. */
     @Override
-    public boolean changePaymentMethod(String methodName, String stringifiedData) {
-        if (TextUtils.isEmpty(methodName) || stringifiedData == null || mClient == null
-                || mInvokedPaymentInstrument == null || mPaymentHandlerHost == null
-                || mPaymentHandlerHost.isChangingPaymentMethod()) {
+    public boolean changePaymentMethodFromInvokedApp(String methodName, String stringifiedDetails) {
+        if (TextUtils.isEmpty(methodName) || stringifiedDetails == null || mClient == null
+                || mInvokedPaymentInstrument == null) {
             return false;
         }
 
-        mClient.onPaymentMethodChange(methodName, stringifiedData);
+        mClient.onPaymentMethodChange(methodName, stringifiedDetails);
         return true;
     }
 
+    /**
+     * Called by the web-based payment handler to get updated total based on the billing address,
+     * for example.
+     */
+    @Override
+    public boolean changePaymentMethodFromPaymentHandler(
+            String methodName, String stringifiedData) {
+        if (mPaymentHandlerHost == null || mPaymentHandlerHost.isChangingPaymentMethod()) {
+            return false;
+        }
+
+        return changePaymentMethodFromInvokedApp(methodName, stringifiedData);
+    }
+
     @Override
     public boolean isInvokedInstrumentValidForPaymentMethodIdentifier(String methodName) {
         return mInvokedPaymentInstrument != null
@@ -899,9 +914,8 @@
         }
 
         if (!mRequestShipping && !mRequestPayerName && !mRequestPayerEmail && !mRequestPayerPhone
-                && mInvokedPaymentInstrument == null
-                && (mPaymentHandlerHost == null
-                        || !mPaymentHandlerHost.isChangingPaymentMethod())) {
+                && (mInvokedPaymentInstrument == null
+                        || !mInvokedPaymentInstrument.isChangingPaymentMethod())) {
             mJourneyLogger.setAborted(AbortReason.INVALID_DATA_FROM_RENDERER);
             disconnectFromClientWithDebugMessage(
                     "PaymentRequestUpdateEvent.updateWith() called without passing a promise into "
@@ -913,7 +927,7 @@
         if (!parseAndValidateDetailsOrDisconnectFromClient(details)) return;
 
         if (mInvokedPaymentInstrument != null
-                && !(mInvokedPaymentInstrument instanceof AutofillPaymentInstrument)) {
+                && mInvokedPaymentInstrument.isChangingPaymentMethod()) {
             // After a payment app has been invoked, all of the merchant's calls to update the price
             // via updateWith() should be forwarded to the invoked app, so it can reflect the
             // updated price in its UI.
@@ -923,12 +937,9 @@
             // opaque to Chrome sub-instruments inside, representing each card in the user account.
             // Hence Chrome forwards the updateWith() calls to the currently invoked
             // PaymentInstrument object.
-            if (mPaymentHandlerHost != null && mPaymentHandlerHost.isChangingPaymentMethod()) {
-                mPaymentHandlerHost.updateWith(details);
-                return;
-            }
-            mInvokedPaymentInstrument.onPaymentDetailsUpdate(
-                    details.total != null ? details.total.amount : null, details.error);
+            mInvokedPaymentInstrument.updateWith(
+                    PaymentDetailsConverter.convertToPaymentMethodChangeResponse(
+                            details, this /* methodChecker */));
             return;
         }
 
@@ -993,13 +1004,8 @@
         }
 
         if (mInvokedPaymentInstrument != null
-                && !(mInvokedPaymentInstrument instanceof AutofillPaymentInstrument)) {
-            if (mPaymentHandlerHost != null && mPaymentHandlerHost.isChangingPaymentMethod()) {
-                mPaymentHandlerHost.noUpdatedPaymentDetails();
-                return;
-            }
-
-            mInvokedPaymentInstrument.onPaymentDetailsUpdate(null, null);
+                && mInvokedPaymentInstrument.isChangingPaymentMethod()) {
+            mInvokedPaymentInstrument.noUpdatedPaymentDetails();
             return;
         }
 
@@ -1564,7 +1570,10 @@
         }
 
         if (mInvokedPaymentInstrument instanceof ServiceWorkerPaymentApp) {
-            if (mPaymentHandlerHost == null) mPaymentHandlerHost = new PaymentHandlerHost(this);
+            if (mPaymentHandlerHost == null) {
+                mPaymentHandlerHost = new PaymentHandlerHost(this /* delegate */);
+            }
+
             ((ServiceWorkerPaymentApp) mInvokedPaymentInstrument)
                     .setPaymentHandlerHost(mPaymentHandlerHost);
         }
@@ -2109,12 +2118,6 @@
         }
     }
 
-    /** Called by the payment app to get updated total based on the billing address, for example. */
-    @Override
-    public void onPaymentMethodChange(String methodName, String stringifiedDetails) {
-        if (mClient != null) mClient.onPaymentMethodChange(methodName, stringifiedDetails);
-    }
-
     @Override
     public void onFocusChanged(@PaymentRequestUI.DataType int dataType, boolean willFocus) {
         assert dataType == PaymentRequestUI.DataType.SHIPPING_ADDRESSES;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
index 89f7f68..5878446 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentApp.java
@@ -14,6 +14,7 @@
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.payments.mojom.PaymentDetailsModifier;
 import org.chromium.payments.mojom.PaymentItem;
+import org.chromium.payments.mojom.PaymentMethodChangeResponse;
 import org.chromium.payments.mojom.PaymentMethodData;
 
 import java.net.URI;
@@ -254,6 +255,7 @@
     // 'basic-card' payment method with the Capabilities in this payment app to determine whether
     // this payment app supports |requestMethodData|.
     private boolean matchBasiccardCapabilities(PaymentMethodData requestMethodData) {
+        assert requestMethodData != null;
         // Empty supported card types and networks in payment request method data indicates it
         // supports all card types and networks.
         if (requestMethodData.supportedTypes.length == 0
@@ -336,9 +338,10 @@
     }
 
     @Override
-    public boolean isValidForPaymentMethodData(String method, PaymentMethodData data) {
+    public boolean isValidForPaymentMethodData(String method, @Nullable PaymentMethodData data) {
         boolean isSupportedMethod = super.isValidForPaymentMethodData(method, data);
-        if (isSupportedMethod && BasicCardUtils.BASIC_CARD_METHOD_NAME.equals(method)) {
+        if (isSupportedMethod && BasicCardUtils.BASIC_CARD_METHOD_NAME.equals(method)
+                && data != null) {
             return matchBasiccardCapabilities(data);
         }
         return isSupportedMethod;
@@ -365,6 +368,23 @@
     }
 
     @Override
+    public void updateWith(PaymentMethodChangeResponse response) {
+        assert isChangingPaymentMethod();
+        mPaymentHandlerHost.updateWith(response);
+    }
+
+    @Override
+    public void noUpdatedPaymentDetails() {
+        assert isChangingPaymentMethod();
+        mPaymentHandlerHost.noUpdatedPaymentDetails();
+    }
+
+    @Override
+    public boolean isChangingPaymentMethod() {
+        return mPaymentHandlerHost != null && mPaymentHandlerHost.isChangingPaymentMethod();
+    }
+
+    @Override
     public void abortPaymentApp(AbortCallback callback) {
         ServiceWorkerPaymentAppBridge.abortPaymentApp(mWebContents, mRegistrationId, callback);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
index f644619..18e7952 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
@@ -53,6 +53,7 @@
 import org.chromium.chrome.browser.preferences.SearchUtils;
 import org.chromium.chrome.browser.preferences.website.Website.StoredDataClearedCallback;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.browser.util.UrlUtilities;
 import org.chromium.ui.widget.Toast;
 
@@ -349,6 +350,9 @@
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         menu.clear();
+        // We don't need the options menu in touchless mode (crbug/962562).
+        if (FeatureUtilities.isNoTouchModeEnabled()) return;
+
         inflater.inflate(R.menu.website_preferences_menu, menu);
 
         mSearchItem = menu.findItem(R.id.search);
@@ -855,7 +859,9 @@
         }
 
         // Configure/hide the third-party cookie toggle, as needed.
-        if (mCategory.showSites(SiteSettingsCategory.Type.COOKIES)) {
+        // We don't need this toggle in touchless. Refer to crbug/951850.
+        if (mCategory.showSites(SiteSettingsCategory.Type.COOKIES)
+                && !FeatureUtilities.isNoTouchModeEnabled()) {
             thirdPartyCookies.setOnPreferenceChangeListener(this);
             updateThirdPartyCookiesCheckBox();
         } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
index 7d9396d..ff9df9a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
@@ -17,6 +17,7 @@
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory.Type;
+import org.chromium.chrome.browser.util.FeatureUtilities;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -110,6 +111,10 @@
             if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SENSOR_CONTENT_SETTING)) {
                 getPreferenceScreen().removePreference(findPreference(Type.SENSORS));
             }
+            // We don't have clipboard support in touchless mode (crbug/963515).
+            if (FeatureUtilities.isNoTouchModeEnabled()) {
+                getPreferenceScreen().removePreference(findPreference(Type.CLIPBOARD));
+            }
         }
     }
 
@@ -138,7 +143,9 @@
             }
             websitePrefs.add(Type.BACKGROUND_SYNC);
             websitePrefs.add(Type.CAMERA);
-            websitePrefs.add(Type.CLIPBOARD);
+            if (!FeatureUtilities.isNoTouchModeEnabled()) {
+                websitePrefs.add(Type.CLIPBOARD);
+            }
             websitePrefs.add(Type.COOKIES);
             websitePrefs.add(Type.JAVASCRIPT);
             websitePrefs.add(Type.DEVICE_LOCATION);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
index 281ce63c..2f922c92 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
@@ -64,25 +64,27 @@
             NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_SNIPPET);
         }
 
-        // We explicitly open an offline page only for prefetched offline pages when Data Reduction
-        // Proxy is enabled. For all other sections the URL is opened and it is up to Offline Pages
-        // whether to open its offline page (e.g. when offline).
-        if (DataReductionProxySettings.getInstance().isDataReductionProxyEnabled()
-                && article.isPrefetched()) {
-            assert article.getOfflinePageOfflineId() != null;
-            assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB
-                    || windowOpenDisposition == WindowOpenDisposition.NEW_WINDOW
-                    || windowOpenDisposition == WindowOpenDisposition.NEW_BACKGROUND_TAB;
-            OfflinePageUtils.getLoadUrlParamsForOpeningOfflineVersion(article.mUrl,
-                    article.getOfflinePageOfflineId(), LaunchLocation.SUGGESTION,
-                    (loadUrlParams) -> {
-                        if (loadUrlParams == null) return;
-                        // Extra headers are not read in loadUrl, but verbatim headers are.
-                        loadUrlParams.setVerbatimHeaders(loadUrlParams.getExtraHeadersString());
-                        openDownloadSuggestion(windowOpenDisposition, article, loadUrlParams);
-                    });
+        if (OfflinePageUtils.isEnabled()) {
+            // We explicitly open an offline page only for prefetched offline pages when Data
+            // Reduction Proxy is enabled. For all other sections the URL is opened and it is up to
+            // Offline Pages whether to open its offline page (e.g. when offline).
+            if (DataReductionProxySettings.getInstance().isDataReductionProxyEnabled()
+                    && article.isPrefetched()) {
+                assert article.getOfflinePageOfflineId() != null;
+                assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB
+                        || windowOpenDisposition == WindowOpenDisposition.NEW_WINDOW
+                        || windowOpenDisposition == WindowOpenDisposition.NEW_BACKGROUND_TAB;
+                OfflinePageUtils.getLoadUrlParamsForOpeningOfflineVersion(article.mUrl,
+                        article.getOfflinePageOfflineId(), LaunchLocation.SUGGESTION,
+                        (loadUrlParams) -> {
+                            if (loadUrlParams == null) return;
+                            // Extra headers are not read in loadUrl, but verbatim headers are.
+                            loadUrlParams.setVerbatimHeaders(loadUrlParams.getExtraHeadersString());
+                            openDownloadSuggestion(windowOpenDisposition, article, loadUrlParams);
+                        });
 
-            return;
+                return;
+            }
         }
 
         LoadUrlParams loadUrlParams = new LoadUrlParams(article.mUrl, PageTransition.AUTO_BOOKMARK);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
index b93bbe91..c7399b99 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java
@@ -473,21 +473,28 @@
         mTab.getActivity().setOverlayMode(useOverlayMode);
     }
 
+    private ChromeFullscreenManager getFullscreenManager() {
+        // Following get* methods use this method instead of |FullscreenManager.from()|
+        // because the latter can return null if invoked while the tab is in detached state.
+        ChromeActivity activity = mTab.getActivity();
+        return activity != null ? activity.getFullscreenManager() : null;
+    }
+
     @Override
     public int getTopControlsHeight() {
-        FullscreenManager manager = FullscreenManager.from(mTab);
+        FullscreenManager manager = getFullscreenManager();
         return manager != null ? manager.getTopControlsHeight() : 0;
     }
 
     @Override
     public int getBottomControlsHeight() {
-        FullscreenManager manager = FullscreenManager.from(mTab);
+        FullscreenManager manager = getFullscreenManager();
         return manager != null ? manager.getBottomControlsHeight() : 0;
     }
 
     @Override
     public boolean controlsResizeView() {
-        FullscreenManager manager = FullscreenManager.from(mTab);
+        FullscreenManager manager = getFullscreenManager();
         return manager != null ? ((ChromeFullscreenManager) manager).controlsResizeView() : false;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
index fe68c3a..b71d35b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -13,11 +13,13 @@
 import org.chromium.chrome.browser.appmenu.AppMenuCoordinator;
 import org.chromium.chrome.browser.appmenu.AppMenuIconRowFooter;
 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.datareduction.DataReductionMainMenuItem;
 import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.toolbar.ToolbarManager;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 
 /**
  * An {@link AppMenuPropertiesDelegate} for ChromeTabbedActivity.
@@ -28,9 +30,10 @@
     public TabbedAppMenuPropertiesDelegate(Context context, ActivityTabProvider activityTabProvider,
             MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
             TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView,
-            AppMenuCoordinator.AppMenuDelegate appMenuDelegate) {
+            AppMenuCoordinator.AppMenuDelegate appMenuDelegate,
+            ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
         super(context, activityTabProvider, multiWindowModeStateDispatcher, tabModelSelector,
-                toolbarManager, decorView);
+                toolbarManager, decorView, overviewModeBehaviorSupplier);
         mAppMenuDelegate = appMenuDelegate;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/tab_groups/LayoutTabGroupCreationButton.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/tab_groups/LayoutTabGroupCreationButton.java
deleted file mode 100644
index ac35106..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/tab_groups/LayoutTabGroupCreationButton.java
+++ /dev/null
@@ -1,125 +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.
-
-package org.chromium.chrome.browser.tasks.tab_groups;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.text.TextPaint;
-
-import org.chromium.base.ApiCompatibilityUtils;
-import org.chromium.base.metrics.RecordUserAction;
-import org.chromium.chrome.R;
-import org.chromium.chrome.browser.UrlConstants;
-import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton;
-import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
-import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tabmodel.TabLaunchType;
-import org.chromium.chrome.browser.tabmodel.TabModel;
-import org.chromium.chrome.browser.tabmodel.TabModelSelector;
-import org.chromium.chrome.browser.tabmodel.TabModelUtils;
-import org.chromium.content_public.browser.LoadUrlParams;
-import org.chromium.ui.resources.dynamics.BitmapDynamicResource;
-
-/**
- * This class is used only when TabGroup feature is enabled. This class is responsible for creating
- * the "Create group" text bitmap for TabSwitcher, and it detects and handles the click event.
- */
-public class LayoutTabGroupCreationButton {
-    private int mFocusedTabId;
-    private final CompositorButton mCreateGroupButton;
-
-    public LayoutTabGroupCreationButton(
-            Context context, BitmapDynamicResource resource, TabModelSelector tabModelSelector) {
-        float pxToDp = 1.f / context.getResources().getDisplayMetrics().density;
-        Bitmap buttonBitmap = createBitmapForButton(context);
-        resource.setBitmap(buttonBitmap);
-
-        CompositorButton.CompositorOnClickHandler buttonClickHandler = (time) -> {
-            TabModel currentTabModel = tabModelSelector.getCurrentModel();
-            Tab parentTab = TabModelUtils.getTabById(currentTabModel, mFocusedTabId);
-            currentTabModel.commitAllTabClosures();
-            tabModelSelector.openNewTab(new LoadUrlParams(UrlConstants.NTP_URL),
-                    TabLaunchType.FROM_CHROME_UI, parentTab,
-                    tabModelSelector.isIncognitoSelected());
-            RecordUserAction.record("TabGroup.Created.TabSwitcher");
-        };
-
-        mCreateGroupButton = new CompositorButton(context, buttonBitmap.getWidth() * pxToDp,
-                buttonBitmap.getHeight() * pxToDp, buttonClickHandler);
-
-        mCreateGroupButton.setResources(
-                resource.getResId(), resource.getResId(), resource.getResId(), resource.getResId());
-        mCreateGroupButton.setClickSlop(
-                context.getResources().getDimension(R.dimen.compositor_button_slop) * pxToDp);
-    }
-
-    private Bitmap createBitmapForButton(Context context) {
-        Resources res = context.getResources();
-        String text = context.getResources().getString(R.string.tabswitcher_create_group);
-        float textSize = res.getDimension(R.dimen.compositor_tab_title_text_size);
-
-        TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
-        textPaint.setColor(ApiCompatibilityUtils.getColor(res, R.color.modern_blue_600));
-        textPaint.setTextAlign(Paint.Align.LEFT);
-        textPaint.setTextSize(textSize);
-        textPaint.setFakeBoldText(true);
-        textPaint.density = res.getDisplayMetrics().density;
-
-        int width = (int) textPaint.measureText(text);
-        Paint.FontMetrics textFontMetrics = textPaint.getFontMetrics();
-        int height = (int) Math.ceil(textFontMetrics.bottom - textFontMetrics.top);
-
-        Bitmap createGroupTextButtonBitmap =
-                Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(createGroupTextButtonBitmap);
-        canvas.drawText(text, 0, -textFontMetrics.top, textPaint);
-
-        return createGroupTextButtonBitmap;
-    }
-
-    public CompositorButton getCreateGroupButton() {
-        return mCreateGroupButton;
-    }
-
-    /**
-     * @return The created tab group text bitmap dynamic resource id.
-     */
-    public int getButtonResourceId() {
-        return mCreateGroupButton.getResourceId();
-    }
-
-    /**
-     * This method updates the Layout.
-     * @param tab The current focused tab.
-     * @param layoutTabs A list of LayoutTab.
-     * @param ableToCreateGroup Whether create group is allowed.
-     */
-    public void updateLayout(Tab tab, LayoutTab[] layoutTabs, boolean ableToCreateGroup) {
-        if (tab == null || layoutTabs == null) return;
-
-        int centerIndex = 0;
-        for (int i = 0; i < layoutTabs.length; ++i) {
-            if (layoutTabs[i].getId() == tab.getId()) {
-                centerIndex = i;
-                break;
-            }
-        }
-
-        final int verticalOffset = 25;
-        float x = (layoutTabs[centerIndex].getX()
-                          + layoutTabs[centerIndex].getFinalContentWidth() / 2)
-                - mCreateGroupButton.getWidth() / 2;
-        float y = (layoutTabs[centerIndex].getY() + layoutTabs[centerIndex].getFinalContentHeight()
-                + verticalOffset);
-
-        mCreateGroupButton.setX(x);
-        mCreateGroupButton.setY(y);
-        mCreateGroupButton.setVisible(ableToCreateGroup);
-        mFocusedTabId = tab.getId();
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index 32109ad..2028147 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -62,6 +62,7 @@
 import org.chromium.chrome.browser.ntp.IncognitoNewTabPage;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
 import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper;
 import org.chromium.chrome.browser.omnibox.LocationBar;
 import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener;
@@ -625,7 +626,8 @@
 
                 OfflinePageBridge bridge = OfflinePageBridge.getForProfile(tab.getProfile());
                 if (bridge == null
-                        || !bridge.isShowingDownloadButtonInErrorPage(tab.getWebContents())) {
+                        || !bridge.isShowingDownloadButtonInErrorPage(tab.getWebContents())
+                        || !OfflinePageUtils.isEnabled()) {
                     return;
                 }
 
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 d37eb312..a5f61f4 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
@@ -32,6 +32,7 @@
     private @Nullable AppMenuCoordinator mAppMenuCoordinator;
     private @Nullable ImmersiveModeManager mImmersiveModeManager;
     private SystemUiCoordinator mSystemUiCoordinator;
+    private @Nullable EmptyBackgroundViewWrapper mEmptyBackgroundViewWrapper;
 
     /**
      * Create a new {@link RootUiCoordinator} for the given activity.
@@ -51,6 +52,7 @@
         if (mSystemUiCoordinator != null) mSystemUiCoordinator.destroy();
         if (mImmersiveModeManager != null) mImmersiveModeManager.destroy();
         if (mAppMenuCoordinator != null) mAppMenuCoordinator.destroy();
+        if (mEmptyBackgroundViewWrapper != null) mEmptyBackgroundViewWrapper.destroy();
     }
 
     @Override
@@ -63,7 +65,8 @@
         if (mActivity.supportsAppMenu()) {
             mAppMenuCoordinator = new AppMenuCoordinator(mActivity,
                     mActivity.getLifecycleDispatcher(), mActivity.getToolbarManager(), mActivity,
-                    mActivity.getWindow().getDecorView());
+                    mActivity.getWindow().getDecorView(),
+                    mActivity.getOverviewModeBehaviorSupplier());
             mActivity.getToolbarManager().onAppMenuInitialized(
                     mAppMenuCoordinator.getAppMenuHandler(),
                     mAppMenuCoordinator.getAppMenuPropertiesDelegate());
@@ -73,9 +76,9 @@
 
         mImmersiveModeManager = AppHooks.get().createImmersiveModeManager(
                 mActivity.getWindow().getDecorView().findViewById(android.R.id.content));
-        mSystemUiCoordinator =
-                new SystemUiCoordinator(mActivity.getWindow(), mActivity.getTabModelSelector(),
-                        mImmersiveModeManager, mActivity.getActivityType());
+        mSystemUiCoordinator = new SystemUiCoordinator(mActivity.getWindow(),
+                mActivity.getTabModelSelector(), mImmersiveModeManager, mActivity.getActivityType(),
+                mActivity.getOverviewModeBehaviorSupplier());
 
         if (mImmersiveModeManager != null && mActivity.getToolbarManager() != null) {
             mActivity.getToolbarManager().setImmersiveModeManager(mImmersiveModeManager);
@@ -84,21 +87,17 @@
 
     @Override
     public void onFinishNativeInitialization() {
-        mSystemUiCoordinator.onNativeInitialized(mActivity.getOverviewModeBehavior());
-        if (mAppMenuCoordinator != null) {
-            mAppMenuCoordinator.onNativeInitialized(mActivity.getOverviewModeBehavior());
-        }
-
-        // TODO(twellington): Move to a TabbedRootUiCoordinator or delegate?
+        // TODO(https://crbug.com/931496): Move to a TabbedRootUiCoordinator or delegate?
+        // TODO(twellington): Supply TabModelSelector as well and move initialization earlier.
         if (mActivity.getActivityType() == ChromeActivity.ActivityType.TABBED
                 && DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity)) {
             AppMenuHandler appMenuHandler =
                     mAppMenuCoordinator == null ? null : mAppMenuCoordinator.getAppMenuHandler();
-            EmptyBackgroundViewWrapper bgViewWrapper =
-                    new EmptyBackgroundViewWrapper(mActivity.getTabModelSelector(),
-                            mActivity.getTabCreator(false), mActivity, appMenuHandler,
-                            mActivity.getSnackbarManager(), mActivity.getOverviewModeBehavior());
-            bgViewWrapper.initialize();
+            mEmptyBackgroundViewWrapper = new EmptyBackgroundViewWrapper(
+                    mActivity.getTabModelSelector(), mActivity.getTabCreator(false), mActivity,
+                    appMenuHandler, mActivity.getSnackbarManager(),
+                    mActivity.getOverviewModeBehaviorSupplier());
+            mEmptyBackgroundViewWrapper.initialize();
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java
index 0ff4a1f..439a5bef 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/NavigationBarColorController.java
@@ -16,6 +16,7 @@
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.BuildInfo;
+import org.chromium.base.Callback;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
@@ -27,6 +28,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
 import org.chromium.chrome.browser.ui.ImmersiveModeManager;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 import org.chromium.chrome.browser.vr.VrModeObserver;
 import org.chromium.chrome.browser.vr.VrModuleProvider;
 import org.chromium.ui.UiUtils;
@@ -43,10 +45,11 @@
     // May be null if we return from the constructor early. Otherwise will be set.
     private final @Nullable TabModelSelector mTabModelSelector;
     private final @Nullable TabModelSelectorObserver mTabModelSelectorObserver;
+    private @Nullable ObservableSupplier<OverviewModeBehavior> mOverviewModeBehaviorSupplier;
+    private @Nullable Callback<OverviewModeBehavior> mOverviewModeSupplierCallback;
     private @Nullable OverviewModeBehavior mOverviewModeBehavior;
     private @Nullable OverviewModeObserver mOverviewModeObserver;
 
-    private boolean mInitialized;
     private boolean mUseLightNavigation;
     private boolean mOverviewModeHiding;
 
@@ -56,9 +59,12 @@
      * @param tabModelSelector The {@link TabModelSelector} used to determine which tab model is
      *                         selected.
      * @param immersiveModeManager The {@link ImmersiveModeManager} for the containing activity.
+     * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
+     *         {@link OverviewModeBehavior} associated with the containing activity.
      */
     NavigationBarColorController(Window window, TabModelSelector tabModelSelector,
-            @Nullable ImmersiveModeManager immersiveModeManager) {
+            @Nullable ImmersiveModeManager immersiveModeManager,
+            ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
         assert Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1;
 
         mWindow = window;
@@ -89,7 +95,6 @@
             return;
         }
 
-        mInitialized = true;
         mUseLightNavigation = true;
 
         mTabModelSelector = tabModelSelector;
@@ -101,6 +106,10 @@
         };
         mTabModelSelector.addObserver(mTabModelSelectorObserver);
 
+        mOverviewModeBehaviorSupplier = overviewModeBehaviorSupplier;
+        mOverviewModeSupplierCallback = this::setOverviewModeBehavior;
+        mOverviewModeBehaviorSupplier.addObserver(mOverviewModeSupplierCallback);
+
         // TODO(https://crbug.com/806054): Observe tab loads to restrict black bottom nav to
         // incognito NTP.
 
@@ -114,6 +123,9 @@
      */
     public void destroy() {
         if (mTabModelSelector != null) mTabModelSelector.removeObserver(mTabModelSelectorObserver);
+        if (mOverviewModeBehaviorSupplier != null) {
+            mOverviewModeBehaviorSupplier.removeObserver(mOverviewModeSupplierCallback);
+        }
         if (mOverviewModeBehavior != null) {
             mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver);
         }
@@ -124,8 +136,10 @@
      * @param overviewModeBehavior The {@link OverviewModeBehavior} used to determine whether
      *                             overview mode is showing.
      */
-    public void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) {
-        if (!mInitialized) return;
+    private void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) {
+        if (mOverviewModeBehavior != null) {
+            mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver);
+        }
 
         mOverviewModeBehavior = overviewModeBehavior;
         mOverviewModeObserver = new EmptyOverviewModeObserver() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java
index b6bf6898..4677bf9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/system/SystemUiCoordinator.java
@@ -12,6 +12,7 @@
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.ui.ImmersiveModeManager;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 
 /**
  * A UI coordinator that manages the system status bar and bottom navigation bar.
@@ -29,30 +30,20 @@
      * @param tabModelSelector The {@link TabModelSelector} for the containing activity.
      * @param immersiveModeManager The {@link ImmersiveModeManager} for the containing activity.
      * @param activityType The {@link org.chromium.chrome.browser.ChromeActivity.ActivityType} of
-     *         the containing activity
+     *         the containing activity.
+     * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
+     *         {@link OverviewModeBehavior} associated with the containing activity.
      */
     public SystemUiCoordinator(Window window, TabModelSelector tabModelSelector,
             @Nullable ImmersiveModeManager immersiveModeManager,
-            @ChromeActivity.ActivityType int activityType) {
+            @ChromeActivity.ActivityType int activityType,
+            @Nullable ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
+        // TODO(https://crbug.com/931496): Move to a TabbedSystemUiCoordinator or delegate?
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
                 && activityType == ChromeActivity.ActivityType.TABBED) {
+            assert overviewModeBehaviorSupplier != null;
             mNavigationBarColorController = new NavigationBarColorController(
-                    window, tabModelSelector, immersiveModeManager);
-        }
-    }
-
-    /**
-     * Called when native initialization has finished to provide additional activity-scoped objects
-     * only available after native initialization.
-     *
-     * @param overviewModeBehavior The {@link OverviewModeBehavior} for the containing activity
-     *         if the current activity supports an overview mode, or null otherwise.
-     */
-    public void onNativeInitialized(@Nullable OverviewModeBehavior overviewModeBehavior) {
-        if (mNavigationBarColorController != null) {
-            assert overviewModeBehavior != null;
-
-            mNavigationBarColorController.setOverviewModeBehavior(overviewModeBehavior);
+                    window, tabModelSelector, immersiveModeManager, overviewModeBehaviorSupplier);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
index 2288815..6d364d29f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
@@ -699,6 +699,7 @@
     /**
      * @return Whether no-touch-mode is enabled.
      */
+    @CalledByNative
     public static boolean isNoTouchModeEnabled() {
         return TouchlessDelegate.TOUCHLESS_MODE_ENABLED;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/ObservableSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/util/ObservableSupplier.java
new file mode 100644
index 0000000..0599af4c
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/util/ObservableSupplier.java
@@ -0,0 +1,43 @@
+// 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.
+
+package org.chromium.chrome.browser.util;
+
+import org.chromium.base.Callback;
+import org.chromium.base.Supplier;
+
+/**
+ * ObservableSupplier wraps an asynchronously provided object E, notifying observers when the
+ * dependency is available. This allows classes dependent on E to be provided with a
+ * ObservableSupplier during construction and register a Callback<E> to be notified when the needed
+ * dependency is available.
+ *
+ * This class must only be accessed from a single thread.
+ *
+ * For classes owning the ObservableSupplier and providing it as a dependency to others, see
+ * {@link ObservableSupplierImpl}.
+ *
+ * For classes using a ObservableSupplier to receive a dependency:
+ *   - To be notified when the object is available, call {@link #addObserver(Callback)} with a
+ *     Callback to be notified when the object is available.
+ *   - If the object is already available, the Callback will be called immediately.
+ *   - The Callback may be called multiple times if the object wrapped by the ObservableSupplier
+ *     changes.
+ *
+ * @param <E> The type of the wrapped object.
+ */
+public interface ObservableSupplier<E> extends Supplier<E> {
+    /**
+     * @param obs An observer to be notified when the object owned by this supplier is available.
+     *       If the object is already available, the callback will be notified at the end of the
+     *       current message loop (so long as the object hasn't changed).
+     * @return The current object or null if it hasn't been set yet.
+     */
+    E addObserver(Callback<E> obs);
+
+    /**
+     * @param obs The observer to remove.
+     */
+    void removeObserver(Callback<E> obs);
+}
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/ObservableSupplierImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/util/ObservableSupplierImpl.java
new file mode 100644
index 0000000..864ce4e
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/util/ObservableSupplierImpl.java
@@ -0,0 +1,81 @@
+// 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.
+
+package org.chromium.chrome.browser.util;
+
+import android.os.Handler;
+import android.support.annotation.Nullable;
+
+import org.chromium.base.Callback;
+import org.chromium.base.ObserverList;
+
+/**
+ * Concrete implementation of {@link ObservableSupplier} to be used by classes owning the
+ * ObservableSupplier and providing it as a dependency to others.
+ *
+ * This class must only be accessed from a single thread.
+ *
+ * To use:
+ *   1. Create a new ObservableSupplierImpl<E> to pass as a dependency
+ *   2. Call {@link #set(Object)} when the real object becomes available. {@link #set(Object)} may
+ *      be called multiple times. Observers will be notified each time a new object is set.
+ *
+ * @param <E> The type of the wrapped object.
+ */
+public class ObservableSupplierImpl<E> implements ObservableSupplier<E> {
+    private final Thread mThread = Thread.currentThread();
+    private final Handler mHandler = new Handler();
+
+    private E mObject;
+    private final ObserverList<Callback<E>> mObservers = new ObserverList<>();
+
+    @Override
+    public E addObserver(Callback<E> obs) {
+        checkThread();
+        mObservers.addObserver(obs);
+
+        if (mObject != null) {
+            final E currentObject = mObject;
+            mHandler.post(() -> {
+                if (mObject != currentObject || !mObservers.hasObserver(obs)) return;
+                obs.onResult(mObject);
+            });
+        }
+
+        return mObject;
+    }
+
+    @Override
+    public void removeObserver(Callback<E> obs) {
+        checkThread();
+        mObservers.removeObserver(obs);
+    }
+
+    /**
+     * Set the object supplied by this supplier. This will notify registered callbacks that the
+     * dependency is available.
+     * @param object The object to supply.
+     */
+    public void set(E object) {
+        checkThread();
+        if (object == mObject) return;
+
+        mObject = object;
+
+        for (Callback<E> observer : mObservers) {
+            observer.onResult(mObject);
+        }
+    }
+
+    @Override
+    public @Nullable E get() {
+        checkThread();
+        return mObject;
+    }
+
+    private void checkThread() {
+        assert mThread == Thread.currentThread()
+            : "ObservableSupplierImpl must only be used on a single Thread.";
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java
index d7afe63f..24529dd8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java
@@ -10,6 +10,7 @@
 import android.view.View.OnAttachStateChangeListener;
 import android.view.ViewStub;
 
+import org.chromium.base.Callback;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.appmenu.AppMenuHandler;
 import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
@@ -23,6 +24,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 
 import java.util.List;
 
@@ -35,34 +37,42 @@
     private final TabCreator mTabCreator;
     private final TabModelObserver mTabModelObserver;
     private final TabModelSelectorObserver mTabModelSelectorObserver;
-    private final OverviewModeBehavior mOverviewModeBehavior;
     private final SnackbarManager mSnackbarManager;
 
+    private final ObservableSupplier<OverviewModeBehavior> mOverviewModeBehaviorSupplier;
+    private final Callback<OverviewModeBehavior> mOverviewModeSupplierCallback;
+    private @Nullable OverviewModeBehavior mOverviewModeBehavior;
+
     private EmptyBackgroundViewTablet mBackgroundView;
     private final @Nullable AppMenuHandler mMenuHandler;
 
     /**
      * Creates a {@link EmptyBackgroundViewWrapper} instance that will lazily inflate.
-     * @param selector             A {@link TabModelSelector} that will be used to query system
-     *                             state.
-     * @param tabCreator           A {@link TabCreator} that will be used to open the New Tab Page.
-     * @param activity             An {@link Activity} that represents a parent of the
-     *                             {@link android.view.ViewStub}.
-     * @param menuHandler          A {@link AppMenuHandler} to handle menu touch events.
-     * @param snackbarManager      The {@link SnackbarManager} to show the undo snackbar when the
-     *                             empty background is visible.
-     * @param overviewModeBehavior A {@link OverviewModeBehavior} instance to detect when the app
-     *                             is in overview mode.
+     * @param selector A {@link TabModelSelector} that will be used to query system state.
+     * @param tabCreator A {@link TabCreator} that will be used to open the New Tab Page.
+     * @param activity An {@link Activity} that represents a parent of th
+     *         {@link android.view.ViewStub}.
+     * @param menuHandler A {@link AppMenuHandler} to handle menu touch events.
+     * @param snackbarManager The {@link SnackbarManager} to show the undo snackbar when the empty
+     *         background is visible.
+     * @param overviewModeBehaviorSupplier An {@link ObservableSupplier} for the
+     *         {@link OverviewModeBehavior} associated with the containing activity.
      */
     public EmptyBackgroundViewWrapper(TabModelSelector selector, TabCreator tabCreator,
             Activity activity, @Nullable AppMenuHandler menuHandler,
-            SnackbarManager snackbarManager, OverviewModeBehavior overviewModeBehavior) {
+            SnackbarManager snackbarManager,
+            ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
         mActivity = activity;
         mMenuHandler = menuHandler;
         mTabModelSelector = selector;
         mTabCreator = tabCreator;
         mSnackbarManager = snackbarManager;
-        mOverviewModeBehavior = overviewModeBehavior;
+
+        mOverviewModeBehaviorSupplier = overviewModeBehaviorSupplier;
+        mOverviewModeSupplierCallback =
+                overviewModeBehavior -> mOverviewModeBehavior = overviewModeBehavior;
+        mOverviewModeBehaviorSupplier.addObserver(mOverviewModeSupplierCallback);
+
         mTabModelObserver = new EmptyTabModelObserver() {
             @Override
             public void didAddTab(Tab tab, @TabLaunchType int type) {
@@ -103,6 +113,13 @@
     }
 
     /**
+     * Called when the containing activity is being destroyed.
+     */
+    public void destroy() {
+        mOverviewModeBehaviorSupplier.removeObserver(mOverviewModeSupplierCallback);
+    }
+
+    /**
      * Initialize the wrapper to listen for the proper notifications.
      */
     public void initialize() {
@@ -161,7 +178,8 @@
         // 1. There are no tabs in the normal TabModel AND
         // 2. Overview mode is not showing AND
         // 3. We're in the normal TabModel OR there are no tabs present in either model
-        return model.getCount() == 0 && !mOverviewModeBehavior.overviewVisible()
+        return model.getCount() == 0
+                && (mOverviewModeBehavior == null || !mOverviewModeBehavior.overviewVisible())
                 && (!incognitoSelected || isIncognitoEmpty);
     }
 }
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index 2d37a0c..0d59c78 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">ሙሉ የMIDI መሣሪያዎች መቆጣጠርን ያስችላል</translation>
 <translation id="1449080968331948513">ውሂብ ቆጣቢ አሁን በቀላል ሁነታ ላይ ነው ያለው</translation>
 <translation id="145097072038377568">በAndroid ቅንብሮች ውስጥ ጠፍቷል።</translation>
+<translation id="146329143005354472">ወደ የእኔ መተግበሪያዎች አክል</translation>
 <translation id="1477626028522505441">በአገልጋይ ችግሮች ምክንያት <ph name="FILE_NAME" />ን ማውረድ አልተሳካም።</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 ተጨማሪ)}one{ (+ # ተጨማሪ)}other{ (+ # ተጨማሪ)}}</translation>
 <translation id="1501480321619201731">ቡድን ሰርዝ</translation>
@@ -132,7 +133,7 @@
 <translation id="1960290143419248813">የChrome ዝማኔዎች ከአሁን በኋላ ለዚህ የAndroid ዝማኔዎች አይደገፉም</translation>
 <translation id="1966710179511230534">እባክዎ የመግቢያ ዝርዝሮችዎን ያዘምኑ።</translation>
 <translation id="1974060860693918893">የላቀ</translation>
-<translation id="1984705450038014246">የChrome ውሂብዎን ያሳምሩ</translation>
+<translation id="1984705450038014246">የChrome ውሂብዎን ያስምሩ</translation>
 <translation id="1984937141057606926">የተፈቀደ፣ ከሶስተኛ ወገን በቀር</translation>
 <translation id="1986685561493779662">ስሙ አስቀድሞ አለ</translation>
 <translation id="1987739130650180037"><ph name="MESSAGE" /> <ph name="LINK_NAME" /> አዝራር</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">ጣቢያ</translation>
 <translation id="2874939134665556319">ቀዳሚ ትራክ</translation>
 <translation id="2876369937070532032">የእርስዎ ደኅንነት አደጋ ላይ ሲወድቅ እርስዎ የሚጎበኙዋቸውን አንዳንድ ገጾች ዩአርኤሎች ወደ Google ይልካል።</translation>
-<translation id="2876764156902388290">Chrome ይህን ገጽ ለእርስዎ ለማሳየት ያነሰ ውሂብ በመጠቀም ላይ ነው</translation>
 <translation id="2888126860611144412">ስለChrome</translation>
 <translation id="2891154217021530873">ገጹን መጫን አቁም</translation>
 <translation id="2893180576842394309">Google ፍለጋን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ሲል ታሪክዎን ሊጠቀም ይችላል።</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index 8eaf81a3..90bc20a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -24,7 +24,7 @@
 <translation id="1175310183703641346">‏لن تتم مزامنة الإشارات المرجعية والسجلّ وكلمات المرور والإعدادات الأخرى مع حسابك على Google بعد الآن.</translation>
 <translation id="1178581264944972037">الإيقاف مؤقتًا</translation>
 <translation id="1181037720776840403">إزالة</translation>
-<translation id="1188239144602654184">إدخال الواقع المعزّز</translation>
+<translation id="1188239144602654184">إطلاق الواقع المعزّز</translation>
 <translation id="1197267115302279827">نقل الإشارات المرجعية</translation>
 <translation id="119944043368869598">محو الكل</translation>
 <translation id="1201402288615127009">التالي</translation>
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">‏السماح بالتحكم الكامل لأجهزة MIDI</translation>
 <translation id="1449080968331948513">يُشار إلى ميزة "توفير البيانات" الآن باسم "الوضع البسيط"</translation>
 <translation id="145097072038377568">‏تم إيقافه في إعدادات Android.</translation>
+<translation id="146329143005354472">إضافة إلى "تطبيقاتي"</translation>
 <translation id="1477626028522505441">تعذّر تنزيل الملف <ph name="FILE_NAME" /> بسبب مشاكل بالخادم.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (أكثر من عنصر واحد آخر)}zero{ (أكثر من # عناصر أخرى)}two{ (أكثر من عنصرين (#) آخرين)}few{ (أكثر من # عناصر أخرى)}many{ (أكثر من # عنصرًا آخر)}other{ (أكثر من # عنصر آخر)}}</translation>
 <translation id="1501480321619201731">حذف مجموعة</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">الموقع</translation>
 <translation id="2874939134665556319">المقطع الصوتي السابق</translation>
 <translation id="2876369937070532032">‏يتم إرسال عناوين URL لبعض الصفحات التي تزورها إلى Google، عندما يكون أمانك في خطر</translation>
-<translation id="2876764156902388290">‏يستخدم Chrome بيانات أقل لعرض هذه الصفحة لك</translation>
 <translation id="2888126860611144412">‏لمحة عن Chrome</translation>
 <translation id="2891154217021530873">إيقاف تحميل الصفحة</translation>
 <translation id="2893180576842394309">‏قد تستخدم Google سجلّك لتخصيص البحث وخدمات Google الأخرى.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index eb883fc..3c7a740 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Разр. на пълния контрол над MIDI</translation>
 <translation id="1449080968331948513">„Икономия на данни“ вече е „олекотен режим“</translation>
 <translation id="145097072038377568">Изключено от настройките на Android</translation>
+<translation id="146329143005354472">Добавяне към „Моите приложения“</translation>
 <translation id="1477626028522505441">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради проблеми в сървъра.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ още 1)}other{ (+ още #)}}</translation>
 <translation id="1501480321619201731">Изтриване на групата</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Сайт</translation>
 <translation id="2874939134665556319">Предишен запис</translation>
 <translation id="2876369937070532032">Когато сигурността ви е застрашена, изпраща до Google URL адресите на някои от страниците, които посещавате.</translation>
-<translation id="2876764156902388290">Chrome използва по-малко данни, за да ви покаже тази страница</translation>
 <translation id="2888126860611144412">Всичко за Chrome</translation>
 <translation id="2891154217021530873">Спиране на зареждането на страницата</translation>
 <translation id="2893180576842394309">Възможно е да използваме историята ви, за да персонализираме търсенето и други услуги на Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
index bf0d19b..b892011 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI ডিভাইসগুলির পূর্ণ নিয়ন্ত্রণের অনুমতি দিন</translation>
 <translation id="1449080968331948513">ডেটা সেভার এখন লাইট মোড হয়ে গেছে</translation>
 <translation id="145097072038377568">Android সেটিংসে বন্ধ করা অাছে</translation>
+<translation id="146329143005354472">আমার অ্যাপে যোগ করুন</translation>
 <translation id="1477626028522505441">সার্ভার সমস্যার কারণে <ph name="FILE_NAME" /> ডাউনলোড করা যায়নি।</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ আরও ১টি)}one{ (+ আরও #টি)}other{ (+ আরও #টি)}}</translation>
 <translation id="1501480321619201731">আইটেমের গ্রুপ মুছুন</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">সাইট</translation>
 <translation id="2874939134665556319">পূর্ববর্তী ট্র্যাক</translation>
 <translation id="2876369937070532032">নিরাপত্তা সংক্রান্ত কোনও ঝুঁকি থাকলে, আপনার দেখা কিছু পৃষ্ঠার ইউআরএল Google-কে পাঠায়</translation>
-<translation id="2876764156902388290">Chrome আপনাকে এই পৃষ্ঠাটি দেখানোর জন্য কম ডেটা ব্যবহার করছে</translation>
 <translation id="2888126860611144412">Chrome সম্বন্ধে</translation>
 <translation id="2891154217021530873">পৃষ্ঠা লোড করা বন্ধ করুন</translation>
 <translation id="2893180576842394309">সার্চ এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Google আপনার ইতিহাস ব্যবহার করতে পারে</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index 2a353a9..2f98bef 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Permet control total disp. MIDI</translation>
 <translation id="1449080968331948513">Ara l'extensió Economitzador de dades funciona en mode bàsic</translation>
 <translation id="145097072038377568">Aquest permís està desactivat a la configuració d'Android</translation>
+<translation id="146329143005354472">Afegeix a Les meves aplicacions</translation>
 <translation id="1477626028522505441">No s'ha pogut baixar <ph name="FILE_NAME" /> a causa de problemes amb el servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (i 1 més)}other{ (i # més)}}</translation>
 <translation id="1501480321619201731">Suprimeix el grup</translation>
@@ -211,7 +212,7 @@
 <translation id="2496180316473517155">Historial de navegació</translation>
 <translation id="2498359688066513246">Ajuda i suggeriments </translation>
 <translation id="2501278716633472235">Torna</translation>
-<translation id="2513403576141822879">Per trobar més opcions relacionades amb la privadesa, la seguretat i la recollida de dades, consulta <ph name="BEGIN_LINK" />Sincronització i serveis de Google<ph name="END_LINK" /></translation>
+<translation id="2513403576141822879">Per trobar més opcions de configuració relacionades amb la privadesa, la seguretat i la recollida de dades, consulta <ph name="BEGIN_LINK" />Sincronització i serveis de Google<ph name="END_LINK" /></translation>
 <translation id="2523184218357549926">Envia a Google els URL de les pàgines que visites</translation>
 <translation id="2532336938189706096">Visualització web</translation>
 <translation id="2534155362429831547"><ph name="NUMBER_OF_ITEMS" /> elements suprimits</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Lloc web</translation>
 <translation id="2874939134665556319">Pista anterior</translation>
 <translation id="2876369937070532032">Envia a Google els URL d'algunes de les pàgines que visites quan la teva seguretat està en risc</translation>
-<translation id="2876764156902388290">Chrome utilitza menys dades per mostrar-te aquesta pàgina</translation>
 <translation id="2888126860611144412">Sobre Chrome</translation>
 <translation id="2891154217021530873">Atura la càrrega de la pàgina</translation>
 <translation id="2893180576842394309">És possible que Google utilitzi el teu historial per personalitzar la Cerca i altres serveis de Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index 828478d..43dcb41 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Povolit úplné ovládání zařízení MIDI</translation>
 <translation id="1449080968331948513">Spořič dat je teď ve zjednodušeném režimu</translation>
 <translation id="145097072038377568">Vypnuto v Nastavení pro Android</translation>
+<translation id="146329143005354472">Přidat do seznamu Moje aplikace</translation>
 <translation id="1477626028522505441">Stažení souboru <ph name="FILE_NAME" /> se nezdařilo z důvodu problémů se serverem.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 další)}few{ (+ # další)}many{ (+ # dalších)}other{ (+ # dalších)}}</translation>
 <translation id="1501480321619201731">Smazat skupinu</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Stránky</translation>
 <translation id="2874939134665556319">Předchozí skladba</translation>
 <translation id="2876369937070532032">Když je ohrožena vaše bezpečnost, odesílá adresy URL některých navštívených stránek do Googlu</translation>
-<translation id="2876764156902388290">Chrome tuto stránku zobrazuje s menším využitím dat</translation>
 <translation id="2888126860611144412">O aplikaci Chrome</translation>
 <translation id="2891154217021530873">Zastavit načítání stránky</translation>
 <translation id="2893180576842394309">Google vaši historii může používat k personalizaci Vyhledávání a dalších služeb Google</translation>
@@ -917,7 +917,7 @@
 <translation id="7649070708921625228">Nápověda</translation>
 <translation id="7658239707568436148">Zrušit</translation>
 <translation id="7665369617277396874">Přidat účet</translation>
-<translation id="766587987807204883">Zde se zobrazují články, které si můžete číst i offline.</translation>
+<translation id="766587987807204883">Zde se zobrazují články, které si můžete číst i offline</translation>
 <translation id="7682724950699840886">Vyzkoušejte tyto tipy: Zajistěte, aby v zařízení byl dostatek místa a zkuste export zopakovat.</translation>
 <translation id="7698359219371678927">Vytvořit e-mail v aplikaci <ph name="APP_NAME" /></translation>
 <translation id="7704317875155739195">Automaticky doplňovat vyhledávací dotazy a adresy URL</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index 893c284..953dfdc 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Tillad fuld kontrol over MIDI-enheder</translation>
 <translation id="1449080968331948513">Datasparefunktionen er nu i Lite-tilstand</translation>
 <translation id="145097072038377568">Deaktiveret i indstillingerne for Android</translation>
+<translation id="146329143005354472">Føj til Mine apps</translation>
 <translation id="1477626028522505441">Download af <ph name="FILE_NAME" /> mislykkedes på grund af serverproblemer.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 anden)}one{ (+ # anden)}other{ (+ # andre)}}</translation>
 <translation id="1501480321619201731">Slet gruppe</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Website</translation>
 <translation id="2874939134665556319">Forrige nummer</translation>
 <translation id="2876369937070532032">Sender webadresser på nogle sider, som du besøger, til Google, når din sikkerhed er truet</translation>
-<translation id="2876764156902388290">Chrome anvender færre data til at vise dig denne side</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
 <translation id="2891154217021530873">Stop sideindlæsning</translation>
 <translation id="2893180576842394309">Google kan bruge din historik til at tilpasse Søgning og andre Google-tjenester</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index 72d2e76..31f6ff8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Volle Kontr. über MIDI-Ger. erl.</translation>
 <translation id="1449080968331948513">Der Datensparmodus ist jetzt im Lite-Modus</translation>
 <translation id="145097072038377568">In den Android-Einstellungen deaktiviert</translation>
+<translation id="146329143005354472">Zu "Meine Apps" hinzufügen</translation>
 <translation id="1477626028522505441"><ph name="FILE_NAME" /> konnte aufgrund von Serverproblemen nicht heruntergeladen werden.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 weitere)}other{ (+ # weitere)}}</translation>
 <translation id="1501480321619201731">Gruppe löschen</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Website</translation>
 <translation id="2874939134665556319">Vorheriger Titel</translation>
 <translation id="2876369937070532032">URLs einiger von mir besuchter Seiten an Google senden, wenn meine Sicherheit gefährdet ist</translation>
-<translation id="2876764156902388290">Chrome nutzt weniger Daten zum Anzeigen dieser Seite</translation>
 <translation id="2888126860611144412">Über Google Chrome</translation>
 <translation id="2891154217021530873">Laden der Seite anhalten</translation>
 <translation id="2893180576842394309">Anhand Ihres Verlaufs kann Google die Google-Suche und andere Google-Dienste personalisieren</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index 8517de2d..060cfd55 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Να επιτρέπεται πλήρης έλεγχος σε MIDI</translation>
 <translation id="1449080968331948513">Η Εξοικονόμηση δεδομένων βρίσκεται πλέον σε λειτουργία Lite</translation>
 <translation id="145097072038377568">Έχει απενεργοποιηθεί στις Ρυθμίσεις Android</translation>
+<translation id="146329143005354472">Προσθήκη στη λίστα Οι εφαρμογές μου</translation>
 <translation id="1477626028522505441">Η λήψη του αρχείου <ph name="FILE_NAME" /> απέτυχε λόγω προβλημάτων στον διακομιστή.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 ακόμη)}other{ (+ # ακόμη)}}</translation>
 <translation id="1501480321619201731">Διαγραφή ομάδας</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Ιστότοπος</translation>
 <translation id="2874939134665556319">Προηγούμενο κομμάτι</translation>
 <translation id="2876369937070532032">Στέλνει URL από ορισμένες σελίδες που επισκέπτεστε στο Google, όταν η ασφάλειά σας βρίσκεται σε κίνδυνο</translation>
-<translation id="2876764156902388290">Το Chrome χρησιμοποιεί λιγότερα δεδομένα για να εμφανίσει αυτήν τη σελίδα</translation>
 <translation id="2888126860611144412">Σχετικά με το Chrome</translation>
 <translation id="2891154217021530873">Διακοπή φόρτωσης σελίδας</translation>
 <translation id="2893180576842394309">Η Google μπορεί να χρησιμοποιήσει το ιστορικό σας για την εξατομίκευση της Αναζήτησης και άλλων υπηρεσιών Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index 32ef18c657..a361c82f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Allow full control of MIDI devices</translation>
 <translation id="1449080968331948513">Data Saver is now Lite mode</translation>
 <translation id="145097072038377568">Turned off in Android Settings</translation>
+<translation id="146329143005354472">Add to My apps</translation>
 <translation id="1477626028522505441"><ph name="FILE_NAME" /> download failed due to server issues.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 more)}other{ (+ # more)}}</translation>
 <translation id="1501480321619201731">Delete group</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Previous track</translation>
 <translation id="2876369937070532032">Sends URLs of some pages that you visit to Google, when your security is at risk</translation>
-<translation id="2876764156902388290">Chrome is using less data to show you this page</translation>
 <translation id="2888126860611144412">About Chrome</translation>
 <translation id="2891154217021530873">Stop page loading</translation>
 <translation id="2893180576842394309">Google may use your history to personalise Search and other Google services</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index 01f0992..4d30434 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Control de dispositivos MIDI</translation>
 <translation id="1449080968331948513">El "Ahorro de datos" está en modo lite</translation>
 <translation id="145097072038377568">Desactivado en la configuración de Android</translation>
+<translation id="146329143005354472">Agregar a Mis apps</translation>
 <translation id="1477626028522505441"><ph name="FILE_NAME" /> no se pudo descargar debido a problemas del servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (1 más)}other{ (# más)}}</translation>
 <translation id="1501480321619201731">Borrar grupo</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Sitio</translation>
 <translation id="2874939134665556319">Pista anterior</translation>
 <translation id="2876369937070532032">Enviar a Google las URL de algunas páginas que visitas, cuando tu seguridad esté en riesgo</translation>
-<translation id="2876764156902388290">Chrome usa menos datos para mostrarte esta página</translation>
 <translation id="2888126860611144412">Acerca de Chrome</translation>
 <translation id="2891154217021530873">Detener la carga de la página</translation>
 <translation id="2893180576842394309">Es posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation>
@@ -917,7 +917,7 @@
 <translation id="7649070708921625228">Ayuda</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7665369617277396874">Agregar cuenta</translation>
-<translation id="766587987807204883">Los artículos aparecerán aquí, y puedes leerlos incluso cuando estás sin conexión</translation>
+<translation id="766587987807204883">Los artículos aparecen aquí, y puedes leerlos incluso cuando estás sin conexión</translation>
 <translation id="7682724950699840886">Intenta las siguientes sugerencias: Antes de exportar las contraseñas nuevamente, asegúrate de que haya espacio suficiente en tu dispositivo.</translation>
 <translation id="7698359219371678927">Crear correo electrónico en <ph name="APP_NAME" /></translation>
 <translation id="7704317875155739195">Autocompletar búsquedas y URL</translation>
@@ -1003,7 +1003,7 @@
 <translation id="8310344678080805313">Pestañas estándar</translation>
 <translation id="8313455859591948645">Editar la página de inicio</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> y más sitios</translation>
-<translation id="8327155640814342956">Para obtener la mejor experiencia de navegación, abre Chrome para actualizarlo</translation>
+<translation id="8327155640814342956">A fin de obtener la mejor experiencia de navegación, abre Chrome para actualizarlo</translation>
 <translation id="8339163506404995330">No se traducirán las páginas en <ph name="LANGUAGE" /></translation>
 <translation id="8349013245300336738">Ordenar por cantidad de datos utilizados</translation>
 <translation id="8372893542064058268">Permite la sincronización en segundo plano para un sitio específico.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index 84bd1461..5d5ccae 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Control total dispositivos MIDI</translation>
 <translation id="1449080968331948513">Ahorro de Datos ahora se llama modo básico</translation>
 <translation id="145097072038377568">Ajustes de Android desactivados</translation>
+<translation id="146329143005354472">Añadir a Mis aplicaciones</translation>
 <translation id="1477626028522505441">No se ha podido descargar <ph name="FILE_NAME" /> debido a problemas con el servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (y 1 más)}other{ (y # más)}}</translation>
 <translation id="1501480321619201731">Eliminar grupo</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Sitio</translation>
 <translation id="2874939134665556319">Pista anterior</translation>
 <translation id="2876369937070532032">Envía a Google las URL de algunas de las páginas que visitas cuando tu seguridad corre peligro</translation>
-<translation id="2876764156902388290">Chrome está utilizando menos datos para mostrarte esta página</translation>
 <translation id="2888126860611144412">Información de Chrome</translation>
 <translation id="2891154217021530873">Detener la carga de la página</translation>
 <translation id="2893180576842394309">Es posible que Google utilice tu historial para personalizar la Búsqueda y otros servicios de Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
index 7bc9576b..d08d8db4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI-seadm. täieliku juht. lub.</translation>
 <translation id="1449080968331948513">Andmemahu säästja uus nimetus on lihtsustatud režiim</translation>
 <translation id="145097072038377568">Android-seadetes välja lülitatud</translation>
+<translation id="146329143005354472">Lisa jaotisesse Minu rakendused</translation>
 <translation id="1477626028522505441">Faili <ph name="FILE_NAME" /> allalaadimine ebaõnnestus serveriprobleemide tõttu.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(ja veel 1)}other{(ja veel #)}}</translation>
 <translation id="1501480321619201731">Kustuta grupp</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Sait</translation>
 <translation id="2874939134665556319">Eelmine lugu</translation>
 <translation id="2876369937070532032">Saadab mõnede teie külastatud lehtede URL-id Google'ile, kui teie turvalisus ohtu satub</translation>
-<translation id="2876764156902388290">Chrome kasutab selle lehe kuvamiseks vähem andmeid</translation>
 <translation id="2888126860611144412">Teave Chrome'i kohta</translation>
 <translation id="2891154217021530873">Peata lehe laadimine</translation>
 <translation id="2893180576842394309">Google võib kasutada teie ajalugu otsingu ja muude Google'i teenuste isikupärastamiseks</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index 373e9c8..c843512 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">‏اجازه کنترل کامل دستگاه‌های MIDI</translation>
 <translation id="1449080968331948513">اکنون نام «صرفه‌جویی داده» به «حالت ساده» تغییر کرده است</translation>
 <translation id="145097072038377568">‏در تنظیمات Android مسدود شد</translation>
+<translation id="146329143005354472">افزودن به برنامه‌های من</translation>
 <translation id="1477626028522505441">به‌دلیل مشکلاتی در سرور، بارگیری <ph name="FILE_NAME" /> انجام نشد.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ ۱ مورد دیگر)}one{ (+ # مورد دیگر)}other{ (+ # مورد دیگر)}}</translation>
 <translation id="1501480321619201731">حذف گروه</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">سایت</translation>
 <translation id="2874939134665556319">آهنگ قبلی</translation>
 <translation id="2876369937070532032">‏اگر امنیتتان درخطر باشد، نشانی وب برخی از صفحه‌هایی را که بازدید می‌کنید به Google می‌فرستد</translation>
-<translation id="2876764156902388290">‏Chrome از داده کمتری برای نمایش این صفحه به شما استفاده می‌کند</translation>
 <translation id="2888126860611144412">‏درباره Chrome</translation>
 <translation id="2891154217021530873">توقف بارگیری صفحه</translation>
 <translation id="2893180576842394309">‏Google ممکن است از سابقه مرور شما برای شخصی کردن جستجو و سایر سرویس‌های Google استفاده کند</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index 4935f96..a44a489 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Salli MIDI-laitteiden täysi käyttöoik.</translation>
 <translation id="1449080968331948513">Data Saver on nyt Yksinkertaistettu tila</translation>
 <translation id="145097072038377568">Poistettu käytöstä Android-asetuksissa</translation>
+<translation id="146329143005354472">Lisää Omiin sovelluksiin</translation>
 <translation id="1477626028522505441">Tiedoston <ph name="FILE_NAME" /> lataus epäonnistui palvelinongelman vuoksi.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 muu)}other{ (+ # muuta)}}</translation>
 <translation id="1501480321619201731">Poista ryhmä</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Sivusto</translation>
 <translation id="2874939134665556319">Edellinen kappale</translation>
 <translation id="2876369937070532032">Lähettää joidenkin avattujen sivujen URL-osoitteet Googlelle, kun turvallisuutesi on vaarassa</translation>
-<translation id="2876764156902388290">Chrome käyttää vähemmän dataa tämän sivun näyttämiseen.</translation>
 <translation id="2888126860611144412">Tietoja Chromesta</translation>
 <translation id="2891154217021530873">Pysäytä sivun lataus</translation>
 <translation id="2893180576842394309">Google voi muokata Hakua ja muita Googlen palveluita historiasi perusteella</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index 40450198..0161d80 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Payagan ganap na kontrol sa MIDI device</translation>
 <translation id="1449080968331948513">Ang Data Saver ay tinatawag na ngayong Lite mode</translation>
 <translation id="145097072038377568">Naka-off sa Mga Setting ng Android</translation>
+<translation id="146329143005354472">Idagdag sa Aking mga app</translation>
 <translation id="1477626028522505441">Hindi na-download ang <ph name="FILE_NAME" /> dahil sa mga isyu sa server.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 pa)}one{ (+ # pa)}other{ (+ # pa)}}</translation>
 <translation id="1501480321619201731">I-delete ang pangkat</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Nakaraang track</translation>
 <translation id="2876369937070532032">Ipadala ang mga URL ng ilang page na binibisita mo sa Google kapag nanganganib ang iyong seguridad</translation>
-<translation id="2876764156902388290">Gumagamit ang Chrome ng mas kaunting data upang ipakita sa iyo ang page na ito</translation>
 <translation id="2888126860611144412">Tungkol sa Chrome</translation>
 <translation id="2891154217021530873">Ihinto ang pag-load ng page</translation>
 <translation id="2893180576842394309">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search at iba pang serbisyo ng Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index adb5534..3b9e1338 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Autoriser le contrôle complet des appareils MIDI</translation>
 <translation id="1449080968331948513">L'économiseur de données est passé en mode simplifié</translation>
 <translation id="145097072038377568">Désactivée dans les paramètres Android</translation>
+<translation id="146329143005354472">Ajouter à mes applications</translation>
 <translation id="1477626028522505441">Échec du téléchargement du fichier "<ph name="FILE_NAME" />" en raison de problèmes liés au serveur.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 autre)}one{ (+ # autre)}other{ (+ # autres)}}</translation>
 <translation id="1501480321619201731">Supprimer le groupe</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Piste précédente</translation>
 <translation id="2876369937070532032">Envoyer à Google les URL des pages que vous consultez présentant un risque pour votre sécurité</translation>
-<translation id="2876764156902388290">Chrome utilise moins de données pour afficher cette page</translation>
 <translation id="2888126860611144412">À propos de Chrome</translation>
 <translation id="2891154217021530873">Arrêter le chargement de la page</translation>
 <translation id="2893180576842394309">Google peut utiliser votre historique pour personnaliser la recherche et d'autres services Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
index 99a1964..6978250d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI ઉપકરણોના પૂર્ણ નિયંત્રણની મંજૂરી આપો</translation>
 <translation id="1449080968331948513">ડેટા સેવર હવે લાઇટ મોડ છે</translation>
 <translation id="145097072038377568">Android સેટિંગ્સમાં બંધ કરી</translation>
+<translation id="146329143005354472">મારી ઍપમાં ઉમેરો</translation>
 <translation id="1477626028522505441">સર્વર સમસ્યાઓને કારણે <ph name="FILE_NAME" /> ડાઉનલોડ નિષ્ફળ થયું.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 વધુ)}one{ (+ # વધુ)}other{ (+ # વધુ)}}</translation>
 <translation id="1501480321619201731">જૂથ ડિલીટ કરો</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">સાઇટ</translation>
 <translation id="2874939134665556319">પાછલું ટ્રૅક</translation>
 <translation id="2876369937070532032">તમારી સુરક્ષા જોખમમાં હોય ત્યારે, તમે મુલાકાત લેતા હો તે કેટલાક પેજના URLs Googleને મોકલે છે</translation>
-<translation id="2876764156902388290">તમને આ પેજ બતાવવા માટે Chrome ઓછો ડેટા વાપરી રહ્યું છે</translation>
 <translation id="2888126860611144412">Chrome વિશે</translation>
 <translation id="2891154217021530873">પૃષ્ઠ લોડ કરવાનું રોકો</translation>
 <translation id="2893180576842394309">Google, શોધ અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા ઇતિહાસનો ઉપયોગ કરી શકે છે</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index 72f183c..c641250 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -68,9 +68,10 @@
 <translation id="1416550906796893042">ऐप्‍लिकेशन वर्शन</translation>
 <translation id="1430915738399379752">प्रिंट करें</translation>
 <translation id="1445680696957526815">Chrome के घटक एक-दूसरे से असंगत हैं. संभवत: Chrome अपग्रेड हो रहा है, कृपया कुछ ही देर में फिर से प्रयास करें. अगर समस्या बनी रहती है, तो Chrome को अनइंस्टॉल करके और फिर से इंस्टॉल करके देखें.</translation>
-<translation id="1446450296470737166">MIDI डिवाइस के पूर्ण नियंत्रण की अनुमति दें</translation>
+<translation id="1446450296470737166">MIDI डिवाइस के पूरे नियंत्रण की अनुमति दें</translation>
 <translation id="1449080968331948513">डेटा बचाने का टूल अब लाइट मोड है</translation>
 <translation id="145097072038377568">Android सेटिंग में बंद कर दिया गया है</translation>
+<translation id="146329143005354472">मेरे ऐप्लिकेशन में जोड़ें</translation>
 <translation id="1477626028522505441">सर्वर संबधी समस्‍याओं के कारण <ph name="FILE_NAME" /> डाउनलोड विफल रहा.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 और)}one{ (+ # और)}other{ (+ # और)}}</translation>
 <translation id="1501480321619201731">समूह मिटाएं</translation>
@@ -252,13 +253,12 @@
 <translation id="281504910091592009">अपने <ph name="BEGIN_LINK" />Google खाते<ph name="END_LINK" /> में सेव किए गए पासवर्ड देखें और उन्हें प्रबंधित करें</translation>
 <translation id="2818669890320396765">अपने सभी डिवाइस पर अपने बुकमार्क पाने के लिए, साइन इन करें और 'सिंक करें' को चालू करें</translation>
 <translation id="2822354292072154809">क्या आप वाकई <ph name="CHOSEN_OBJECT_NAME" /> की सभी साइट अनुमतियां रीसेट करना चाहते हैं?</translation>
-<translation id="2836148919159985482">पूर्ण स्क्रीन से बाहर निकलने के लिए वापस जाएं बटन स्पर्श करें.</translation>
+<translation id="2836148919159985482">फ़ुल स्क्रीन से बाहर निकलने के लिए वापस जाएं बटन स्पर्श करें.</translation>
 <translation id="2842985007712546952">मूल फ़ोल्‍डर</translation>
 <translation id="2845873210977809562">खुले हुए टैब बंद किए गए</translation>
 <translation id="2870560284913253234">साइट</translation>
 <translation id="2874939134665556319">पिछला ट्रैक</translation>
 <translation id="2876369937070532032">आपकी सुरक्षा को ख़तरा होने पर उन पेज के यूआरएल भेजता है जिन पर आप Google के ज़रिए जाते हैं.</translation>
-<translation id="2876764156902388290">Chrome आपको यह पेज दिखाने के लिए कम डेटा का उपयोग कर रहा है</translation>
 <translation id="2888126860611144412">Chrome के बारे में</translation>
 <translation id="2891154217021530873">पेज को लोड करना रोकें</translation>
 <translation id="2893180576842394309">खोज और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए, Google आपके इतिहास का इस्तेमाल कर सकता है</translation>
@@ -387,7 +387,7 @@
 <translation id="3955193568934677022">साइटों को सुरक्षित सामग्री चलाने दें (हम इस सेटिंग को चालू रखने का सुझाव देते हैं)</translation>
 <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{तैयार होने पर Chrome आपका पेज लोड करेगा}one{तैयार होने पर Chrome आपके पेज लोड करेगा}other{तैयार होने पर Chrome आपके पेज लोड करेगा}}</translation>
 <translation id="3963007978381181125">लंबा पासवर्ड सुरक्षित करने के तरीके में Google Pay से भुगतान करने की विधि और पते शामिल नहीं हैं. सिर्फ़ वह इंसान आपका सुरक्षित किया हुआ डेटा पढ़ सकता है जिसके पास आपका लंबा पासवर्ड है. Google की ओर से लंबा पासवर्ड भेजा या संग्रहित नहीं किया जाता है. अगर आप अपना लंबा पासवर्ड भूल जाते हैं या इस सेटिंग को बदलना चाहते हैं, तो आपको सिंक रीसेट करना होगा. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
-<translation id="3967822245660637423">डाउनलोड पूर्ण</translation>
+<translation id="3967822245660637423">डाउनलोड पूरा हुआ</translation>
 <translation id="397583555483684758">समन्‍वयन ने काम करना बंद कर दिया है</translation>
 <translation id="3976396876660209797">इस शॉर्टकट को निकालें और इसे फिर से बनाएं</translation>
 <translation id="3985215325736559418">क्या आप <ph name="FILE_NAME" /> को फिर से डाउनलोड करना चाहते हैं?</translation>
@@ -486,7 +486,7 @@
 <translation id="4684427112815847243">सब कुछ सिंक करें</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> अन्य}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> अन्य}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> अन्य}}</translation>
 <translation id="4698034686595694889"><ph name="APP_NAME" /> में ऑफ़लाइन देखें</translation>
-<translation id="4698413471314543145">Chrome चलाने के लिए आवश्‍यक जटिल कार्यक्षमता अनुबलब्ध है; या तो आपका Chrome इंस्‍टॉलेशन अपूर्ण है, या वह Android के इस वर्शन के साथ संगत नहीं है.</translation>
+<translation id="4698413471314543145">Chrome चलाने के लिए आवश्‍यक जटिल काम की क्षमता अनुबलब्ध है; या तो आपका Chrome इंस्‍टॉलेशन अपूर्ण है, या वह Android के इस वर्शन के साथ संगत नहीं है.</translation>
 <translation id="4699172675775169585">कैश इमेज और फ़ाइलें</translation>
 <translation id="4714588616299687897">अपना 60% तक डेटा बचाएं</translation>
 <translation id="4719927025381752090">अनुवाद करना ऑफ़र करें</translation>
@@ -568,7 +568,7 @@
 <translation id="5233638681132016545">नया टैब</translation>
 <translation id="526421993248218238">यह पेज लोड नहीं हो पा रहा है</translation>
 <translation id="5271967389191913893">डाउनलोड की जाने वाली सामग्री को डिवाइस नहीं खोल सकता.</translation>
-<translation id="528192093759286357">पूर्ण स्क्रीन से बाहर निकलने के लिए ऊपर से खींचें और वापस जाएं स्पर्श करें.</translation>
+<translation id="528192093759286357">फ़ुल स्क्रीन से बाहर निकलने के लिए ऊपर से खींचें और वापस जाएं स्पर्श करें.</translation>
 <translation id="5284584623296338184">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग में किए गए बदलाव अब आपके Google खाते में सिंक नहीं किए जाएंगे. हालांकि, आपका मौजूदा डेटा आपके Google खाते में संग्रहित रहेगा.</translation>
 <translation id="5300589172476337783">दिखाएं</translation>
 <translation id="5301954838959518834">ठीक है, समझ लिया</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index fa4be7a..2707a53e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Omogući potpuni nadzor za MIDI</translation>
 <translation id="1449080968331948513">Ušteda podataka sada je u Jednostavnom načinu</translation>
 <translation id="145097072038377568">Isključeno u postavkama Androida</translation>
+<translation id="146329143005354472">Dodaj u Moje aplikacije</translation>
 <translation id="1477626028522505441">Preuzimanje datoteke <ph name="FILE_NAME" /> nije uspjelo zbog poteškoća s poslužiteljem.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ još 1)}one{ (+ još #)}few{ (+ još #)}other{ (+ još #)}}</translation>
 <translation id="1501480321619201731">Izbriši grupu</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Web lokacija</translation>
 <translation id="2874939134665556319">Prethodna pjesma</translation>
 <translation id="2876369937070532032">Googleu šalje URL-ove nekih stranica koje posjećujete kada je ugrožena vaša sigurnost</translation>
-<translation id="2876764156902388290">Chrome koristi manje podataka za prikaz ove stranice</translation>
 <translation id="2888126860611144412">O Chromeu</translation>
 <translation id="2891154217021530873">Zaustavljanje učitavanja stranice</translation>
 <translation id="2893180576842394309">Google može upotrebljavati vašu povijest za prilagodbu Pretraživanja i drugih Googleovih usluga</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index cf358d11..370d4d9c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI-eszközök teljes vezérlése</translation>
 <translation id="1449080968331948513">Az Adatforgalom-csökkentő neve mostantól Egyszerűsített mód</translation>
 <translation id="145097072038377568">Kikapcsolva az Android beállításaiban</translation>
+<translation id="146329143005354472">Hozzáadás a saját alkalmazásokhoz</translation>
 <translation id="1477626028522505441">A következő fájl letöltése szerverproblémák miatt nem sikerült: <ph name="FILE_NAME" />.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 további)}other{ (+ # további)}}</translation>
 <translation id="1501480321619201731">Csoport törlése</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Webhely</translation>
 <translation id="2874939134665556319">Előző szám</translation>
 <translation id="2876369937070532032">Elküldi egyes felkeresett oldalak URL-jét a Google-nak, ha veszélyben van az Ön biztonsága</translation>
-<translation id="2876764156902388290">A Chrome kevesebb adatot használ az oldal megjelenítéséhez.</translation>
 <translation id="2888126860611144412">A Chrome névjegye</translation>
 <translation id="2891154217021530873">Oldal betöltésének leállítása</translation>
 <translation id="2893180576842394309">A Google felhasználhatja az Ön előzményeit a Keresés és más Google-szolgáltatások személyre szabására</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index 8d3314d..0a48355 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Izinkan kontrol penuh perangkat MIDI</translation>
 <translation id="1449080968331948513">Penghemat Data sekarang menjadi Mode ringan</translation>
 <translation id="145097072038377568">Dinonaktifkan di Setelan Android</translation>
+<translation id="146329143005354472">Tambahkan ke Aplikasi saya</translation>
 <translation id="1477626028522505441">Download <ph name="FILE_NAME" /> gagal karena masalah server.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 lainnya)}other{ (+ # lainnya)}}</translation>
 <translation id="1501480321619201731">Hapus grup</translation>
@@ -132,7 +133,7 @@
 <translation id="1960290143419248813">Update Chrome tidak lagi didukung untuk versi Android ini</translation>
 <translation id="1966710179511230534">Perbarui detail ID masuk Anda.</translation>
 <translation id="1974060860693918893">Lanjutan</translation>
-<translation id="1984705450038014246">Menyinkronkan data Chrome Anda</translation>
+<translation id="1984705450038014246">Sinkronkan data Chrome Anda</translation>
 <translation id="1984937141057606926">Diizinkan, kecuali pihak ketiga</translation>
 <translation id="1986685561493779662">Nama sudah ada</translation>
 <translation id="1987739130650180037">Tombol <ph name="MESSAGE" /> <ph name="LINK_NAME" /></translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Situs</translation>
 <translation id="2874939134665556319">Lagu sebelumnya</translation>
 <translation id="2876369937070532032">Mengirimkan URL beberapa halaman yang Anda kunjungi ke Google, jika keamanan Anda berisiko</translation>
-<translation id="2876764156902388290">Chrome menggunakan data lebih sedikit untuk menampilkan halaman ini kepada Anda</translation>
 <translation id="2888126860611144412">Tentang Chrome</translation>
 <translation id="2891154217021530873">Hentikan pemuatan halaman</translation>
 <translation id="2893180576842394309">Google dapat menggunakan histori Anda untuk mempersonalisasi Penelusuran dan layanan Google lainnya</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index 31595a8a..b3eb2457 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Controllo completo dispos. MIDI</translation>
 <translation id="1449080968331948513">La funzionalità Risparmio dati si chiama ora modalità Lite</translation>
 <translation id="145097072038377568">Disattivata in Impostazioni Android</translation>
+<translation id="146329143005354472">Aggiungi a Le mie app</translation>
 <translation id="1477626028522505441">Download di <ph name="FILE_NAME" /> non riuscito a causa di problemi del server.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 altro)}other{ (+ altri #)}}</translation>
 <translation id="1501480321619201731">Elimina gruppo</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Sito</translation>
 <translation id="2874939134665556319">Traccia precedente</translation>
 <translation id="2876369937070532032">Invia a Google gli URL di alcune pagine che visiti quando la tua sicurezza è a rischio</translation>
-<translation id="2876764156902388290">Chrome usa meno dati per mostrarti questa pagina</translation>
 <translation id="2888126860611144412">Informazioni su Chrome</translation>
 <translation id="2891154217021530873">Interrompe il caricamento della pagina</translation>
 <translation id="2893180576842394309">Google può utilizzare la tua cronologia per personalizzare la Ricerca e altri servizi Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index 6381e8c..cfefcfa 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">‏התר שליטה מלאה על מכשירי MIDI</translation>
 <translation id="1449080968331948513">‏Data Saver נקרא עכשיו 'מצב טעינה מהירה'</translation>
 <translation id="145097072038377568">‏כבוי בהגדרות Android</translation>
+<translation id="146329143005354472">הוספה לאפליקציות שלי</translation>
 <translation id="1477626028522505441">הורדת <ph name="FILE_NAME" /> נכשלה עקב בעיות בשרת.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (ועוד 1)}two{ (ועוד #)}many{ (ועוד #)}other{ (ועוד #)}}</translation>
 <translation id="1501480321619201731">מחיקת קבוצה</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">אתר</translation>
 <translation id="2874939134665556319">הרצועה הקודמת</translation>
 <translation id="2876369937070532032">‏שולחת ל-Google כתובות URL של חלק מהדפים שאליהם נכנסת, אם מתגלה סיכון אבטחה</translation>
-<translation id="2876764156902388290">‏Chrome צורך פחות נתונים כדי להציג לך את הדף הזה</translation>
 <translation id="2888126860611144412">‏מידע כללי על Chrome</translation>
 <translation id="2891154217021530873">הפסק את טעינת הדף</translation>
 <translation id="2893180576842394309">‏Google עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש ושירותי Google אחרים</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index 6119c1d..1fc0d169 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI機器のフルコントロールを許可</translation>
 <translation id="1449080968331948513">データセーバーは現在ライトモードです</translation>
 <translation id="145097072038377568">Android の設定で無効</translation>
+<translation id="146329143005354472">マイアプリに追加</translation>
 <translation id="1477626028522505441">サーバーで問題が発生したため、<ph name="FILE_NAME" /> をダウンロードできませんでした。</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(他 1 件)}other{(他 # 件)}}</translation>
 <translation id="1501480321619201731">グループを削除</translation>
@@ -95,7 +96,7 @@
 <translation id="1671236975893690980">ダウンロードを待機しています...</translation>
 <translation id="1672586136351118594">次回から表示しない</translation>
 <translation id="1692118695553449118">同期は有効です</translation>
-<translation id="169515064810179024">サイトによるモーション センターへのアクセスをブロックする</translation>
+<translation id="169515064810179024">サイトによるモーション センサーへのアクセスをブロックする</translation>
 <translation id="1717218214683051432">モーション センサー</translation>
 <translation id="1718835860248848330">1 時間以内</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" />に更新</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">サイト</translation>
 <translation id="2874939134665556319">前のトラック</translation>
 <translation id="2876369937070532032">セキュリティ上のリスクがある場合に、アクセスした一部のページの URL を Google に送信します</translation>
-<translation id="2876764156902388290">Chrome ではデータ使用量を削減してこのページを表示しています</translation>
 <translation id="2888126860611144412">Chrome について</translation>
 <translation id="2891154217021530873">ページの読み込みを停止</translation>
 <translation id="2893180576842394309">検索やその他の Google サービスをカスタマイズするために、Google で履歴が使用されることがあります</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
index f598075..7bb761c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI ಸಾಧನಗಳ ಪೂರ್ಣ ನಿಯಂತ್ರಣ ಅನುಮತಿಸಿ</translation>
 <translation id="1449080968331948513">ಡೇಟಾ ಸೇವರ್ ಈಗ ಲೈಟ್ ಮೋಡ್‌ನಲ್ಲಿದೆ</translation>
 <translation id="145097072038377568">Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="146329143005354472">ನನ್ನ ಆ್ಯಪ್‌ಗಳಿಗೆ ಸೇರಿಸಿ</translation>
 <translation id="1477626028522505441">ಸರ್ವರ್ ಸಮಸ್ಯೆಗಳ ಕಾರಣದಿಂದಾಗಿ <ph name="FILE_NAME" /> ಡೌನ್‌ಲೋಡ್ ವಿಫಲವಾಗಿದೆ.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 ಹೆಚ್ಚು)}one{ (+ # ಹೆಚ್ಚು)}other{ (+ # ಹೆಚ್ಚು)}}</translation>
 <translation id="1501480321619201731">ಗುಂಪನ್ನು ಅಳಿಸಿ</translation>
@@ -259,7 +260,6 @@
 <translation id="2870560284913253234">ಸೈಟ್</translation>
 <translation id="2874939134665556319">ಹಿಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
 <translation id="2876369937070532032">ನಿಮ್ಮ ಭದ್ರತೆಯು ಅಪಾಯದಲ್ಲಿದ್ದಾಗ, ನೀವು ಭೇಟಿ ನೀಡುವ ಕೆಲವು ಪುಟಗಳ URL ಗಳನ್ನು Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ</translation>
-<translation id="2876764156902388290">ಈ ಪುಟವನ್ನು ನಿಮಗೆ ತೋರಿಸಲು Chrome ಕಡಿಮೆ ಡೇಟಾವನ್ನು ಬಳಕೆ ಮಾಡುತ್ತಿದೆ</translation>
 <translation id="2888126860611144412">Chrome ಕುರಿತು</translation>
 <translation id="2891154217021530873">ಪುಟ ಲೋಡ್ ಮಾಡುವುದನ್ನು ನಿಲ್ಲಿಸಿ</translation>
 <translation id="2893180576842394309">ಹುಡುಕಾಟ ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು Google ಬಳಸಬಹುದು.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index ff6cd42b5..5b0ed07 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI 기기의 전체 제어 허용</translation>
 <translation id="1449080968331948513">데이터 절약 모드가 이제 라이트 모드로 변경되었습니다.</translation>
 <translation id="145097072038377568">Android 설정에서 사용이 중지됨</translation>
+<translation id="146329143005354472">내 앱에 추가</translation>
 <translation id="1477626028522505441">서버 문제로 인해 <ph name="FILE_NAME" />을(를) 다운로드할 수 없습니다.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (1개 더보기)}other{ (#개 더보기)}}</translation>
 <translation id="1501480321619201731">그룹 삭제</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">사이트</translation>
 <translation id="2874939134665556319">이전 트랙</translation>
 <translation id="2876369937070532032">보안상의 위험이 있을 때 일부 방문 페이지의 URL을 Google로 전송함</translation>
-<translation id="2876764156902388290">Chrome에서 이 페이지를 표시할 때 데이터가 더 적게 사용됩니다.</translation>
 <translation id="2888126860611144412">Chrome 정보</translation>
 <translation id="2891154217021530873">페이지 로딩 중지</translation>
 <translation id="2893180576842394309">Google에서 내 방문 기록을 사용하여 Google 검색 및 다른 Google 서비스를 맞춤설정할 수 있습니다.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index fad0c58cf..ff26122f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Leisti visiškai valdyti MIDI įr.</translation>
 <translation id="1449080968331948513">Duomenų taupymo priemonė dabar veikia supaprastintu režimu</translation>
 <translation id="145097072038377568">Išjungta „Android“ nustatymuose</translation>
+<translation id="146329143005354472">Pridėti prie skilties „Mano programos“</translation>
 <translation id="1477626028522505441">Nepavyko atsisiųsti „<ph name="FILE_NAME" />“ dėl serverio problemų.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (ir dar 1)}one{ (ir dar #)}few{ (ir dar #)}many{ (ir dar #)}other{ (ir dar #)}}</translation>
 <translation id="1501480321619201731">Ištrinti grupę</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Svetainė</translation>
 <translation id="2874939134665556319">Ankstesnis takelis</translation>
 <translation id="2876369937070532032">Siunčia „Google“ kai kurių puslapių, kuriuose lankotės, URL, kai kyla pavojus jūsų saugai</translation>
-<translation id="2876764156902388290">„Chrome“ naudoja mažiau duomenų, kad parodytų jums šį puslapį</translation>
 <translation id="2888126860611144412">Apie „Chrome“</translation>
 <translation id="2891154217021530873">Sustabdyti puslapio įkėlimą</translation>
 <translation id="2893180576842394309">„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką ir kitas „Google“ paslaugas</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
index 7c42fd9..54da100 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Pilnīga MIDI ierīču pārvaldība</translation>
 <translation id="1449080968331948513">Datu lietojuma samazinātājs tagad tiek saukts par vienkāršoto režīmu</translation>
 <translation id="145097072038377568">Izslēgts Android iestatījumos</translation>
+<translation id="146329143005354472">Pievienot sadaļai Manas lietotnes</translation>
 <translation id="1477626028522505441">Neizdevās lejupielādēt failu <ph name="FILE_NAME" />, jo radās servera problēmas.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (un vēl 1)}zero{ (un vēl #)}one{ (un vēl #)}other{ (un vēl #)}}</translation>
 <translation id="1501480321619201731">Dzēst grupu</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Vietne</translation>
 <translation id="2874939134665556319">Iepriekšējais ieraksts</translation>
 <translation id="2876369937070532032">Nosūta Google serveriem dažu apmeklēto lapu vietrāžus URL, ja jūsu drošība ir apdraudēta</translation>
-<translation id="2876764156902388290">Chrome izmanto mazāk datu, lai parādītu jums šo lapu.</translation>
 <translation id="2888126860611144412">Par Chrome</translation>
 <translation id="2891154217021530873">Pārtraukt lapas ielādi</translation>
 <translation id="2893180576842394309">Google var izmantot jūsu vēsturi, lai personalizētu Meklēšanu un citus Google pakalpojumus.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
index d5774348..d8c05017 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI ഉപകരണങ്ങളുടെ പൂർണ്ണ നിയന്ത്രണം അനുവദിക്കുക</translation>
 <translation id="1449080968331948513">ഡാറ്റ സേവർ ഇപ്പോൾ ലൈറ്റ് മോഡ് ആണ്</translation>
 <translation id="145097072038377568">Android ക്രമീകരണത്തിൽ ഓഫാക്കിയിരിക്കുന്നു</translation>
+<translation id="146329143005354472">എൻ്റെ ആപ്പുകളിലേക്ക് ചേർക്കുക</translation>
 <translation id="1477626028522505441">സെർവർ പ്രശ്‌നങ്ങൾ കാരണം <ph name="FILE_NAME" /> ഡൗൺലോഡ് ചെയ്യാനായില്ല.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ ഒരെണ്ണം കൂടി)}other{ (+ # എണ്ണം കൂടി)}}</translation>
 <translation id="1501480321619201731">ഗ്രൂപ്പ് ഇല്ലാതാക്കൂ</translation>
@@ -95,6 +96,7 @@
 <translation id="1671236975893690980">ഡൗൺലോഡ് തീർച്ചപ്പെടുത്തിയിട്ടില്ല...</translation>
 <translation id="1672586136351118594">വീണ്ടും കാണിക്കരുത്</translation>
 <translation id="1692118695553449118">സമന്വയം ഓണാണ്</translation>
+<translation id="169515064810179024">ചലന സെൻസറുകൾ ആക്‌സസ് ചെയ്യുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="1717218214683051432">ചലന സെൻസറുകൾ</translation>
 <translation id="1718835860248848330">കഴിഞ്ഞ മണിക്കൂര്‍‌</translation>
 <translation id="1733116627827457509"><ph name="FILE_SIZE" /> - <ph name="TIME_SINCE_UPDATE" /> അപ്‌ഡേറ്റ് ചെയ്‌തു</translation>
@@ -246,6 +248,7 @@
 <translation id="2777555524387840389"><ph name="SECONDS" /> സെക്കൻഡ് ശേഷിക്കുന്നു</translation>
 <translation id="2779651927720337254">പരാജയപ്പെട്ടു</translation>
 <translation id="2781151931089541271">ഒരു സെക്കൻഡ് ശേഷിക്കുന്നു</translation>
+<translation id="2801022321632964776">Chrome-ൻ്റെ ഏറ്റവും പുതിയ പതിപ്പിൽ നിങ്ങളുടെ ഭാഷ ലഭ്യമാക്കാൻ അപ്‌ഡേറ്റ് ചെയ്യൂ</translation>
 <translation id="2810645512293415242">ഡാറ്റ ലാഭിക്കുന്നതിനും വേഗത്തിൽ ലോഡ് ചെയ്യുന്നതിനുമായി ലളിതവൽക്കരിച്ചിരിക്കുന്ന പേജ്.</translation>
 <translation id="281504910091592009">നിങ്ങളുടെ <ph name="BEGIN_LINK" />Google അക്കൗണ്ടിൽ<ph name="END_LINK" /> സംരക്ഷിച്ച പാസ്‌വേഡുകൾ കാണുക, മാനേജ് ചെയ്യുക</translation>
 <translation id="2818669890320396765">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്‌മാർക്കുകൾ ലഭിക്കാൻ, സൈൻ ഇൻ ചെയ്‌ത് സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation>
@@ -256,7 +259,6 @@
 <translation id="2870560284913253234">സൈറ്റ്</translation>
 <translation id="2874939134665556319">മുമ്പത്തെ ട്രാക്ക്</translation>
 <translation id="2876369937070532032">നിങ്ങളുടെ സുരക്ഷ അപകടത്തിലാകുമ്പോൾ നിങ്ങൾ സന്ദർശിക്കുന്ന ചില പേജുകളുടെ URL-കൾ Google-ലേക്ക് അയയ്ക്കുന്നു</translation>
-<translation id="2876764156902388290">ഈ പേജ് കാണിക്കുന്നതിന് Chrome കുറച്ച് ഡാറ്റയാണ് ഉപയോഗിക്കുന്നത്</translation>
 <translation id="2888126860611144412">Chrome-നെ കുറിച്ച്</translation>
 <translation id="2891154217021530873">പേജ് ലോഡുചെയ്യുന്നത് നിർത്തുക</translation>
 <translation id="2893180576842394309">തിരയലും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം</translation>
@@ -306,6 +308,7 @@
 <translation id="3259831549858767975">പേജിൽ എല്ലാം ചെറുതായി നൽകുക</translation>
 <translation id="3269093882174072735">ചിത്രം ലോഡ് ചെയ്യുക</translation>
 <translation id="3269956123044984603">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിൽ നിന്നുള്ള ടാബുകൾ ലഭിക്കാൻ, Android അക്കൗണ്ട് ക്രമീകരണത്തിൽ "ഡാറ്റ സ്വയം സമന്വയിപ്പിക്കുക" ഓണാക്കുക.</translation>
+<translation id="3277252321222022663">സെൻസറുകൾ ആക്‌സസ് ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുക (ശുപാർശ ചെയ്യുന്നത്)</translation>
 <translation id="3282568296779691940">Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="3288003805934695103">പേജ് റീലോഡുചെയ്യുന്നു</translation>
 <translation id="32895400574683172">അറിയിപ്പുകൾ അനുവദിച്ചിരിക്കുന്നു</translation>
@@ -540,6 +543,7 @@
 <translation id="5016205925109358554">Serif</translation>
 <translation id="5039804452771397117">അനുവദിക്കൂ</translation>
 <translation id="5040262127954254034">സ്വകാര്യത</translation>
+<translation id="5048398596102334565">നിങ്ങളുടെ ചലന സെൻസറുകൾ ആക്‌സസ് ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുക (ശുപാർശ ചെയ്യുന്നത്)</translation>
 <translation id="5063480226653192405">ഉപയോഗം</translation>
 <translation id="5073204694187207510">പൂർണ്ണസ്ക്രീൻ ഗ്രിഡ് മറയ്ക്കുക</translation>
 <translation id="5082793167783849073">ഒരു ഗ്രൂപ്പ് സൃഷ്‌ടിച്ചുകൊണ്ട്, വേഗത്തിൽ പേജുകൾ താരതമ്യം ചെയ്യൂ. ആരംഭിക്കാൻ ഒരു ലിങ്ക് സ്‌പർശിച്ച് പിടിക്കുക.</translation>
@@ -729,6 +733,7 @@
 <translation id="6406506848690869874">Sync</translation>
 <translation id="641643625718530986">പ്രിന്‍റ് ചെയ്യുക…</translation>
 <translation id="6416782512398055893"><ph name="MBS" /> MB ഡൗൺലോഡ് ചെയ്‌തു</translation>
+<translation id="6427112570124116297">വെബ് വിവർത്തനം ചെയ്യുക</translation>
 <translation id="6433501201775827830">നിങ്ങളുടെ തിരയൽ യന്ത്രം തിരഞ്ഞെടുക്കുക</translation>
 <translation id="6437478888915024427">പേജ് വിവരം</translation>
 <translation id="6441734959916820584">പേര് വളരെ വലുതാണ്</translation>
@@ -841,6 +846,7 @@
 <translation id="7189598951263744875">പങ്കിടുക...</translation>
 <translation id="7191430249889272776">ടാബ് പശ്ചാത്തലത്തിൽ തുറന്നു.</translation>
 <translation id="723171743924126238">ചിത്രങ്ങൾ തിരഞ്ഞെടുക്കുക</translation>
+<translation id="7233236755231902816">നിങ്ങളുടെ ഭാഷയിൽ വെബ് കാണാൻ Chrome-ൻ്റെ ഏറ്റവും പുതിയ പതിപ്പ് നേടൂ</translation>
 <translation id="7243308994586599757">സ്‌ക്രീനിന്റെ ചുവടെ ഓപ്‌ഷനുകൾ ലഭ്യമാണ്</translation>
 <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> എണ്ണം തിരഞ്ഞെടുത്തു</translation>
 <translation id="7253272406652746122">നിങ്ങളുടെ ഉപകരണത്തിലെ ക്രമീകരണം ആപ്പിലെ, 'അക്കൗണ്ടുകൾ' എന്ന പേജിൽ നിന്ന് ഒരു Google അക്കൗണ്ട് ചേർക്കുക.</translation>
@@ -895,7 +901,7 @@
 <translation id="756809126120519699">Chrome ഡാറ്റ മായ്‌ച്ചു</translation>
 <translation id="757524316907819857">പരിരക്ഷിത ഉള്ളടക്കം പ്ലേ ചെയ്യുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> ഫയൽ ഡൗൺലോഡ് ചെയ്‌തു}other{<ph name="FILES_DOWNLOADED_MANY" /> ഫയലുകൾ ഡൗൺലോഡ് ചെയ്‌തു}}</translation>
-<translation id="7588219262685291874">ഉപകരണത്തിന്റെ ബാറ്ററി ലാഭിക്കൽ ഓണായിരിക്കുമ്പോൾ ഇരുണ്ട തീം ഓണാക്കുക</translation>
+<translation id="7588219262685291874">ഉപകരണത്തിൻ്റെ ബാറ്ററി ലാഭിക്കൽ ഓണായിരിക്കുമ്പോൾ ഇരുണ്ട തീം ഓണാക്കുക</translation>
 <translation id="7589445247086920869">നിലവിലെ തിരയൽ യന്ത്രത്തിന് ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="7593557518625677601">Chrome സമന്വയം ആരംഭിക്കാൻ Android ക്രമീകരണം തുറന്ന് Android സിസ്‌റ്റം സമന്വയിപ്പിക്കൽ വീണ്ടും പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="7596558890252710462">ഓപ്പറേറ്റിംഗ് സിസ്റ്റം</translation>
@@ -911,7 +917,7 @@
 <translation id="7649070708921625228">സഹായം</translation>
 <translation id="7658239707568436148">റദ്ദാക്കൂ</translation>
 <translation id="7665369617277396874">അക്കൗണ്ട് ചേർക്കുക</translation>
-<translation id="766587987807204883">ഇവിടെ ദൃശ്യമാകുന്ന ലേഖനങ്ങൾ, നിങ്ങൾ ഓഫ്‌ലൈൻ ആകുന്ന സമയത്ത് പോലും വായിക്കാം</translation>
+<translation id="766587987807204883">ഇവിടെ ദൃശ്യമാകുന്ന ലേഖനങ്ങൾ നിങ്ങൾ ഓഫ്‌ലൈൻ ആകുന്ന സമയത്ത് പോലും വായിക്കാം</translation>
 <translation id="7682724950699840886">ഈ നുറുങ്ങുകൾ പരീക്ഷിക്കൂ: നിങ്ങളുടെ ഉപകരണത്തിൽ ആവശ്യമായ ഇടം ഉണ്ടെന്ന് ഉറപ്പാക്കി, വീണ്ടും എക്‌സ്‌പോർട്ട് ചെയ്യാൻ ശ്രമിക്കുക.</translation>
 <translation id="7698359219371678927"><ph name="APP_NAME" /> ആപ്പിൽ ഇമെയിൽ സൃഷ്‌ടിക്കുക</translation>
 <translation id="7704317875155739195">സ്വമേധയാ പൂർത്തിയാക്കുന്ന തിരയലുകളും URL-കളും</translation>
@@ -997,6 +1003,7 @@
 <translation id="8310344678080805313">സ്റ്റാൻഡേർഡ് ടാബുകൾ</translation>
 <translation id="8313455859591948645">ആരംഭ പേജ് എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> ഡൊമെയ്‌നും കൂടുതൽ സൈറ്റുകളും</translation>
+<translation id="8327155640814342956">മികച്ച ബ്രൗസിംഗ് അനുഭവത്തിന് Chrome അപ്‌ഡേറ്റ് ചെയ്യുക</translation>
 <translation id="8339163506404995330"><ph name="LANGUAGE" /> ഭാഷയിലുള്ള പേജുകൾ വിവർത്തനം ചെയ്യില്ല</translation>
 <translation id="8349013245300336738">ഉപയോഗിച്ച ഡാറ്റയുടെ അളവിനനുസരിച്ച് അടുക്കുക</translation>
 <translation id="8372893542064058268">ഒരു പ്രത്യേക സൈറ്റിന് വേണ്ടി പശ്ചാത്തലം സമന്വയിപ്പിക്കൽ അനുവദിക്കുക.</translation>
@@ -1054,6 +1061,7 @@
 <translation id="8788968922598763114">അവസാനം അടച്ച ടാബ് വീണ്ടും തുറക്കുക</translation>
 <translation id="8801436777607969138">ഒരു നിർദ്ദിഷ്‌ട സൈറ്റിനായി JavaScript ബ്ലോക്ക് ചെയ്യുക.</translation>
 <translation id="8812260976093120287">ചില വെബ്‌സൈറ്റുകളിൽ, നിങ്ങളുടെ ഉപകരണത്തിൽ ഉപയോഗിക്കാവുന്നതും മുകളിൽ പറഞ്ഞിരിക്കുന്നതുമായ പേയ്‌മെന്റ് ആപ്പുകൾ വഴി പണമടയ്‌ക്കാം.</translation>
+<translation id="8816026460808729765">സെൻസറുകൾ ആക്‌സസ് ചെയ്യുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="8816439037877937734"><ph name="APP_NAME" /> Chrome-ൽ തുറക്കും. തുടരുന്നതിലൂടെ, നിങ്ങൾ Chrome-ന്റെ <ph name="BEGIN_LINK1" />സേവന നിബന്ധനകളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />സ്വകാര്യതാ അറിയിപ്പും<ph name="END_LINK2" /> <ph name="BEGIN_LINK3" />Family Link ഉപയോഗിച്ച് മാനേജ് ചെയ്യപ്പെടുന്ന Google അക്കൗണ്ടുകളുടെ സ്വകാര്യതാ അറിയിപ്പും<ph name="END_LINK3" /> അംഗീകരിക്കുന്നു.</translation>
 <translation id="8820817407110198400">ബുക്ക്‌മാര്‍ക്കുകള്‍</translation>
 <translation id="8833831881926404480">ഒരു സൈറ്റ് നിങ്ങളുടെ സ്‌ക്രീൻ പങ്കിടുന്നു</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
index 2048d13..02529f9b7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI डिव्हाइसेसच्या पूर्ण नियंत्रणास अनुमती द्या</translation>
 <translation id="1449080968331948513">डेटा सेव्हर आता लाइट मोडमध्ये आहे</translation>
 <translation id="145097072038377568">Android सेटिंग्ज मध्‍ये बंद करा</translation>
+<translation id="146329143005354472">माझी अ‍ॅप्स मध्ये जोडा</translation>
 <translation id="1477626028522505441">सर्व्हर समस्यांमुळे <ph name="FILE_NAME" /> डाउनलोड अयशस्वी झाले.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ आणखी १)}other{ (+ आणखी #)}}</translation>
 <translation id="1501480321619201731">गट हटवा</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">साइट</translation>
 <translation id="2874939134665556319">मागील ट्रॅक</translation>
 <translation id="2876369937070532032">तुमची सुरक्षा धोक्यात असते तेव्हा, तुम्ही भेट दिलेल्या काही पेजचे URL Google ला पाठवते</translation>
-<translation id="2876764156902388290">तुम्हाला हे पेज दाखवण्यासाठी Chrome कमी डेटा वापरत आहे</translation>
 <translation id="2888126860611144412">Chrome बद्दल</translation>
 <translation id="2891154217021530873">पृष्ठ लोड करणे थांबवा</translation>
 <translation id="2893180576842394309">शोध आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी Google कदाचित तुमच्या इतिहासाचा वापर करू शकते.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
index 37949022..197ecd3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Benarkan kawalan penuh peranti MIDI</translation>
 <translation id="1449080968331948513">Penjimat Data kini tersedia dalam Mod Ringkas</translation>
 <translation id="145097072038377568">Dimatikan dalam Tetapan Android</translation>
+<translation id="146329143005354472">Tambahkan pada Apl saya</translation>
 <translation id="1477626028522505441">Muat turun <ph name="FILE_NAME" /> gagal disebabkan oleh masalah pelayan.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(+1 lagi)}other{(+ # lagi)}}</translation>
 <translation id="1501480321619201731">Padamkan kumpulan</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Tapak</translation>
 <translation id="2874939134665556319">Lagu sebelumnya</translation>
 <translation id="2876369937070532032">Menghantar URL sesetengah halaman yang anda lawati kepada Google, apabila keselamatan anda terancam</translation>
-<translation id="2876764156902388290">Chrome menggunakan kurang data untuk menunjukkan halaman ini kepada anda</translation>
 <translation id="2888126860611144412">Perihal Chrome</translation>
 <translation id="2891154217021530873">Hentikan pemuatan halaman</translation>
 <translation id="2893180576842394309">Google boleh menggunakan sejarah anda untuk memperibadikan Carian dan perkhidmatan Google yang lain</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index 43291d0a..5197402 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Volledig beheer van MIDI-apparaten toestaan</translation>
 <translation id="1449080968331948513">De Lite-versie van Databesparing is ingeschakeld</translation>
 <translation id="145097072038377568">Uitgeschakeld in Android-instellingen</translation>
+<translation id="146329143005354472">Toevoegen aan 'Mijn apps'</translation>
 <translation id="1477626028522505441">Downloaden van <ph name="FILE_NAME" /> is mislukt door serverproblemen.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (en nog 1)}other{ (en nog #)}}</translation>
 <translation id="1501480321619201731">Groep verwijderen</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Vorig nummer</translation>
 <translation id="2876369937070532032">Verzendt URL's van bepaalde pagina's die je bezoekt naar Google wanneer je beveiliging risico loopt</translation>
-<translation id="2876764156902388290">Chrome gebruikt minder data om deze pagina weer te geven</translation>
 <translation id="2888126860611144412">Over Chrome</translation>
 <translation id="2891154217021530873">Stoppen met het laden van de pagina</translation>
 <translation id="2893180576842394309">Google kan je geschiedenis gebruiken om Google Zoeken en andere Google-services te personaliseren</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index 8de1aa85a..49cefe5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Full kontroll over MIDI-enheter</translation>
 <translation id="1449080968331948513">Datasparing heter nå «forenklet modus»</translation>
 <translation id="145097072038377568">Slått av i Android-innstillingene</translation>
+<translation id="146329143005354472">Legg til i Mine apper</translation>
 <translation id="1477626028522505441">Nedlastingen av <ph name="FILE_NAME" /> ble avbrutt på grunn av tjenerproblemer.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 til)}other{ (+ # til)}}</translation>
 <translation id="1501480321619201731">Slett gruppen</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Nettsted</translation>
 <translation id="2874939134665556319">Forrige spor</translation>
 <translation id="2876369937070532032">Sender Google nettadressene til noen av sidene du besøker, når sikkerheten din står i fare</translation>
-<translation id="2876764156902388290">Chrome bruker mindre data for å vise deg denne siden</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
 <translation id="2891154217021530873">Stopp innlastingen av siden</translation>
 <translation id="2893180576842394309">Google kan bruke loggen din for å gi Søk og andre Google-tjenester et personlig preg</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 618132c..005429b1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Pełne sterowanie urządzeniami MIDI</translation>
 <translation id="1449080968331948513">Oszczędzanie danych to teraz wersja uproszczona</translation>
 <translation id="145097072038377568">Wyłączone w ustawieniach Androida</translation>
+<translation id="146329143005354472">Dodaj do Moich aplikacji</translation>
 <translation id="1477626028522505441">Nie udało się pobrać pliku <ph name="FILE_NAME" /> z powodu problemów z serwerem.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (i jeszcze 1)}few{ (i jeszcze #)}many{ (i jeszcze #)}other{ (i jeszcze #)}}</translation>
 <translation id="1501480321619201731">Usuń grupę</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Witryna</translation>
 <translation id="2874939134665556319">Poprzedni utwór</translation>
 <translation id="2876369937070532032">Gdy Twoje bezpieczeństwo jest zagrożone, wysyła do Google adresy URL odwiedzanych stron</translation>
-<translation id="2876764156902388290">Chrome wyświetla tę stronę przy użyciu mniejszej ilości danych</translation>
 <translation id="2888126860611144412">Chrome – informacje</translation>
 <translation id="2891154217021530873">Zatrzymaj wczytywanie strony</translation>
 <translation id="2893180576842394309">Google może korzystać z Twojej historii, by personalizować wyniki wyszukiwania i działanie innych usług.</translation>
@@ -860,7 +860,7 @@
 <translation id="7352939065658542140">FILM</translation>
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Udostępnij 1 wybrany element}few{Udostępnij # wybrane elementy}many{Udostępnij # wybranych elementów}other{Udostępnij # wybranego elementu}}</translation>
 <translation id="7359002509206457351">Dostęp do form płatności</translation>
-<translation id="7365126855094612066">Przez okres trwania sesji strona będzie mogła:
+<translation id="7365126855094612066">W czasie trwania sesji strona będzie mogła:
 • tworzyć mapę 3D Twojego otoczenia,
 • śledzić ruch kamery.
 
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index bed28222..e9d9adc 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Permitir controle total de dispositivos MIDI</translation>
 <translation id="1449080968331948513">A Economia de dados está no Modo Lite agora</translation>
 <translation id="145097072038377568">Desativada nas configurações do Android</translation>
+<translation id="146329143005354472">Adicionar a "Meus apps"</translation>
 <translation id="1477626028522505441">Falha no download do arquivo <ph name="FILE_NAME" /> devido a problemas de servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (e mais 1)}one{ (e mais #)}other{ (e mais #)}}</translation>
 <translation id="1501480321619201731">Excluir grupo</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Faixa anterior</translation>
 <translation id="2876369937070532032">Quando há risco de segurança, envia para o Google os URLs de algumas páginas que você visita</translation>
-<translation id="2876764156902388290">O Chrome está usando menos dados para mostrar esta página</translation>
 <translation id="2888126860611144412">Sobre o Google Chrome</translation>
 <translation id="2891154217021530873">Para de carregar a página</translation>
 <translation id="2893180576842394309">O Google pode usar seu histórico para personalizar a Pesquisa e outros serviços que ele oferece</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index 1b6d3603..c959e88 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Perm. controlo total dispo. MIDI</translation>
 <translation id="1449080968331948513">A Poupança de dados é agora o Modo Lite</translation>
 <translation id="145097072038377568">Desativada nas Definições do Android</translation>
+<translation id="146329143005354472">Adicionar a As minhas aplicações</translation>
 <translation id="1477626028522505441">A transferência de <ph name="FILE_NAME" /> falhou devido a problemas do servidor.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (e mais 1)}other{ (e mais #)}}</translation>
 <translation id="1501480321619201731">Eliminar grupo</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Faixa anterior</translation>
 <translation id="2876369937070532032">Quando a sua segurança está em risco, envia para a Google URLs de algumas páginas que visita.</translation>
-<translation id="2876764156902388290">O Chrome está a utilizar menos dados para lhe mostrar esta página.</translation>
 <translation id="2888126860611144412">Acerca do Chrome</translation>
 <translation id="2891154217021530873">Parar carregamento da página</translation>
 <translation id="2893180576842394309">A Google pode utilizar o seu histórico para personalizar a Pesquisa e outros serviços Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index 0cc1f871..f2014eb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Control complet dispozitive MIDI</translation>
 <translation id="1449080968331948513">Economizorul de date este acum Modul Lite</translation>
 <translation id="145097072038377568">Dezactivată din Setări Android</translation>
+<translation id="146329143005354472">Adaugă în Aplicațiile mele</translation>
 <translation id="1477626028522505441">Descărcarea fișierului <ph name="FILE_NAME" /> nu a reușit din cauza unor probleme de server.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (și încă unul)}few{ (și încă #)}other{ (și încă #)}}</translation>
 <translation id="1501480321619201731">Șterge grupul</translation>
@@ -132,7 +133,7 @@
 <translation id="1960290143419248813">Actualizările Chrome nu mai sunt acceptate pentru această versiune de Android</translation>
 <translation id="1966710179511230534">Actualizați detaliile de conectare.</translation>
 <translation id="1974060860693918893">Avansate</translation>
-<translation id="1984705450038014246">Sincronizează datele Chrome</translation>
+<translation id="1984705450038014246">Sincronizează datele din Chrome</translation>
 <translation id="1984937141057606926">Permise, cu excepția celor terță parte</translation>
 <translation id="1986685561493779662">Numele există deja</translation>
 <translation id="1987739130650180037"><ph name="MESSAGE" /> Butonul <ph name="LINK_NAME" /></translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Melodia anterioară</translation>
 <translation id="2876369937070532032">Trimite la Google adrese URL ale unor pagini pe care le accesezi, când securitatea este în pericol</translation>
-<translation id="2876764156902388290">Chrome folosește mai puține date pentru a afișa această pagină</translation>
 <translation id="2888126860611144412">Despre Chrome</translation>
 <translation id="2891154217021530873">Oprește încărcarea paginii</translation>
 <translation id="2893180576842394309">Google poate folosi istoricul pentru a personaliza Căutarea și alte servicii Google</translation>
@@ -861,8 +861,8 @@
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Trimite un element selectat}few{Trimite # elemente selectate}other{Trimite # de elemente selectate}}</translation>
 <translation id="7359002509206457351">Acces la metodele de plată</translation>
 <translation id="7365126855094612066">Pe durata acestei sesiuni, site-ul va putea să:
-• creeze o hartă 3D a mediului tău
-• urmărească mișcarea camerei
+• creeze o hartă 3D a mediului tău;
+• urmărească mișcarea camerei.
 
 Acest site NU primește acces la cameră. Imaginile camerei sunt vizibile doar pentru tine.</translation>
 <translation id="7375125077091615385">Tip:</translation>
@@ -1003,7 +1003,7 @@
 <translation id="8310344678080805313">File standard</translation>
 <translation id="8313455859591948645">Editează pagina de pornire</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> și alte site-uri</translation>
-<translation id="8327155640814342956">Pentru o experiență de navigare mai bună, deschide Chrome actualizat</translation>
+<translation id="8327155640814342956">Pentru o experiență de navigare mai bună, deschide pentru a actualiza Chrome</translation>
 <translation id="8339163506404995330">Paginile în <ph name="LANGUAGE" /> nu vor fi traduse</translation>
 <translation id="8349013245300336738">Sortează după volumul de date folosite</translation>
 <translation id="8372893542064058268">Permite sincronizarea în fundal pentru un anumit site.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index 906d62c..eb946f67 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Полный доступ к управлению MIDI-устройствами</translation>
 <translation id="1449080968331948513">Функция "Экономия трафика" теперь называется "Упрощенный режим".</translation>
 <translation id="145097072038377568">Отключено в настройках Android</translation>
+<translation id="146329143005354472">Добавить в "Мои приложения"</translation>
 <translation id="1477626028522505441">Не удалось скачать файл <ph name="FILE_NAME" /> из-за неполадок на сервере.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (и ещё 1)}one{ (и ещё #)}few{ (и ещё #)}many{ (и ещё #)}other{ (и ещё #)}}</translation>
 <translation id="1501480321619201731">Удалить группу</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Сайт</translation>
 <translation id="2874939134665556319">Предыдущий трек</translation>
 <translation id="2876369937070532032">При угрозе безопасности отправлять в Google URL некоторых страниц, которые вы открываете</translation>
-<translation id="2876764156902388290">Для отображения этой страницы Chrome расходует меньше трафика</translation>
 <translation id="2888126860611144412">О браузере Chrome</translation>
 <translation id="2891154217021530873">Остановить загрузку страницы</translation>
 <translation id="2893180576842394309">Google может использовать вашу историю, чтобы персонализировать Поиск и другие сервисы.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index 524a59e..8261fe6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Povoliť úplné ovlád. zar. MIDI</translation>
 <translation id="1449080968331948513">Šetrič dát je teraz zjednodušený režim</translation>
 <translation id="145097072038377568">Vypnuté v nastaveniach Androidu</translation>
+<translation id="146329143005354472">Pridať do Mojich aplikácií</translation>
 <translation id="1477626028522505441">Súbor <ph name="FILE_NAME" /> sa nepodarilo stiahnuť z dôvodu problémov so serverom.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 ďalšia)}few{ (+ # ďalšie)}many{ (+ # more)}other{ (+ # ďalších)}}</translation>
 <translation id="1501480321619201731">Odstrániť skupinu</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Web</translation>
 <translation id="2874939134665556319">Predchádzajúca skladba</translation>
 <translation id="2876369937070532032">Pri ohrození zabezpečenia odosiela Googlu webové adresy niektorých navštívených stránok</translation>
-<translation id="2876764156902388290">Chrome spotrebúva na zobrazenie tejto stránky menej dát</translation>
 <translation id="2888126860611144412">O prehliadači Chrome</translation>
 <translation id="2891154217021530873">Zastaviť načítavanie stránky</translation>
 <translation id="2893180576842394309">Google môže pomocou vašej histórie prispôsobiť Vyhľadávanie a ďalšie služby Googlu</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index 0821a2c7..d35baf8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Dovolitev popolnega nadzora nad napravami MIDI</translation>
 <translation id="1449080968331948513">Funkcija »Varčevanje s podatki« se zdaj imenuje »Lahki način«.</translation>
 <translation id="145097072038377568">Izklopljeno v nastavitvah za Android</translation>
+<translation id="146329143005354472">Dodaj v Moje aplikacije</translation>
 <translation id="1477626028522505441">Prenos datoteke <ph name="FILE_NAME" /> ni uspel zaradi težav s strežnikom.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (in še 1)}one{ (in še #)}two{ (in še #)}few{ (in še #)}other{ (in še #)}}</translation>
 <translation id="1501480321619201731">Izbriši skupino</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Spletno mesto</translation>
 <translation id="2874939134665556319">Prejšnja skladba</translation>
 <translation id="2876369937070532032">Googlu pošlje URL-je nekaterih strani, ki jih obiščete, kadar je ogrožena vaša varnost</translation>
-<translation id="2876764156902388290">Chrome uporablja manj podatkov za prikaz te strani</translation>
 <translation id="2888126860611144412">O brskalniku Chrome</translation>
 <translation id="2891154217021530873">Ustavi nalaganje strani</translation>
 <translation id="2893180576842394309">Google lahko vašo zgodovino uporabi za prilagajanje Iskanja Google in drugih Googlovih storitev</translation>
@@ -1061,7 +1061,7 @@
 <translation id="8788968922598763114">Vnovično odpiranje nazadnje zaprtega zavihka</translation>
 <translation id="8801436777607969138">Preprečevanje JavaScripta za določeno spletno mesto.</translation>
 <translation id="8812260976093120287">Na nekaterih spletnih mestih je mogoče plačevati z zgoraj navedenimi podprtimi aplikacijami v napravi.</translation>
-<translation id="8816026460808729765">Preprečevanje spletnim mestom dostop do tipal</translation>
+<translation id="8816026460808729765">Preprečevanje spletnim mestom dostopa do tipal</translation>
 <translation id="8816439037877937734">Aplikacija <ph name="APP_NAME" /> se bo odprla v Chromu. Če nadaljujete, se strinjate s Chromovimi <ph name="BEGIN_LINK1" />pogoji storitve<ph name="END_LINK1" /> in <ph name="BEGIN_LINK2" />pravilnikom o zasebnosti<ph name="END_LINK2" /> ter <ph name="BEGIN_LINK3" />obvestilom o zasebnosti za Google Račune, upravljane s Family Linkom<ph name="END_LINK3" />.</translation>
 <translation id="8820817407110198400">Zaznamki</translation>
 <translation id="8833831881926404480">Spletno mesto souporablja vaš zaslon.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index e0cd7f1..0015598d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Пуна контрола над MIDI уређајима</translation>
 <translation id="1449080968331948513">Уштеда података је сада Lite режим</translation>
 <translation id="145097072038377568">Искључено је у Android подешавањима</translation>
+<translation id="146329143005354472">Додај у Моје апликације</translation>
 <translation id="1477626028522505441">Преузимање датотеке <ph name="FILE_NAME" /> није успело због проблема на серверу.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (и још 1)}one{ (и још #)}few{ (и још #)}other{ (и још #)}}</translation>
 <translation id="1501480321619201731">Избриши групу</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Сајт</translation>
 <translation id="2874939134665556319">Претходна песма</translation>
 <translation id="2876369937070532032">Шаље URL-ове неких страница које посећујете Google-у када је безбедност угрожена</translation>
-<translation id="2876764156902388290">Chrome користи мање података за приказивање ове странице</translation>
 <translation id="2888126860611144412">О Chrome прегледачу</translation>
 <translation id="2891154217021530873">Заустави учитавање странице</translation>
 <translation id="2893180576842394309">Google може да користи историју за персонализацију Претраге и других Google услуга</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 0df1e818..1a75a85 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Tillåt fullst. kontroll av MIDI</translation>
 <translation id="1449080968331948513">Databesparing heter nu Begränsat läge</translation>
 <translation id="145097072038377568">Inaktiverad i Android-inställningarna</translation>
+<translation id="146329143005354472">Lägg till i Mina appar</translation>
 <translation id="1477626028522505441">Det gick inte att ladda ned <ph name="FILE_NAME" /> på grund av serverfel.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 till)}other{ (+ # till)}}</translation>
 <translation id="1501480321619201731">Ta bort grupp</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Webbplats</translation>
 <translation id="2874939134665556319">Föregående spår</translation>
 <translation id="2876369937070532032">Webbadresser till vissa sidor som du besöker skickas till Google när din säkerhet är utsatt för risk.</translation>
-<translation id="2876764156902388290">Mängden data som krävs för att visa den här sidan har reducerats i Chrome</translation>
 <translation id="2888126860611144412">Om Chrome</translation>
 <translation id="2891154217021530873">Avbryt inläsningen av sidan</translation>
 <translation id="2893180576842394309">Google kan anpassa Sök och andra Google-tjänster utifrån historiken</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index 65027980..04ae0c7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Ruhusu udhibiti kamili wa vifaa vya MIDI</translation>
 <translation id="1449080968331948513">Sasa hali ya 'Kiokoa Data' inaitwa 'Hali Nyepesi'</translation>
 <translation id="145097072038377568">Imezimwa katika Mipangilio ya Android</translation>
+<translation id="146329143005354472">Ongeza kwenye 'Programu zangu'</translation>
 <translation id="1477626028522505441">Kipakuliwa cha <ph name="FILE_NAME" /> hakijafaulu kwa sababu ya matatizo ya seva.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 zaidi)}other{ (+ # zaidi)}}</translation>
 <translation id="1501480321619201731">Futa kikundi</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Tovuti</translation>
 <translation id="2874939134665556319">Wimbo uliotangulia</translation>
 <translation id="2876369937070532032">Hutuma kwa Google URL za baadhi ya kurasa ambazo umetembelea wakati usalama wako uko hatarini</translation>
-<translation id="2876764156902388290">Chrome inatumia kiasi kidogo cha data kukuonyesha ukurasa huu</translation>
 <translation id="2888126860611144412">Kuhusu Chrome</translation>
 <translation id="2891154217021530873">Simamisha upakiaji wa ukurasa</translation>
 <translation id="2893180576842394309">Google inaweza kutumia historia yako ili kuweka mapendeleo kwenye huduma ya Tafuta na Google na huduma nyingine za Google.</translation>
@@ -308,7 +308,7 @@
 <translation id="3259831549858767975">Fanya kila kitu kwenye ukurasa kiwe kidogo zaidi</translation>
 <translation id="3269093882174072735">Pakia picha</translation>
 <translation id="3269956123044984603">Ili upate vichupo vyako kutoka kwenye vifaa vyako vingine, washa kipengele cha "Kusawazisha data kiotomatiki" katika mipangilio ya akaunti ya Android.</translation>
-<translation id="3277252321222022663">Ruhusu tovuti zfikie vitambuzi (inapendekezwa)</translation>
+<translation id="3277252321222022663">Ruhusu tovuti zifikie vitambuzi (inapendekezwa)</translation>
 <translation id="3282568296779691940">Ingia katika Chrome</translation>
 <translation id="3288003805934695103">Kupakia upya ukurasa</translation>
 <translation id="32895400574683172">Arifa zinaruhusiwa</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
index bed523da..a250f94 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -70,6 +70,7 @@
 <translation id="1446450296470737166">MIDI சாதனங்களுக்கு முழுக் கட்டுப்பாட்டை அனுமதி</translation>
 <translation id="1449080968331948513">‘தரவு சேமிப்பான்’ இப்போது ’லைட் பயன்முறை’ எனப் பெயர்மாற்றப்பட்டுள்ளது</translation>
 <translation id="145097072038377568">Android அமைப்புகளில் முடக்கப்பட்டுள்ளது.</translation>
+<translation id="146329143005354472">எனது ஆப்ஸில் சேர்</translation>
 <translation id="1477626028522505441">சேவையகச் சிக்கல்களால் <ph name="FILE_NAME" />ஐப் பதிவிறக்க முடியவில்லை.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ மேலும் 1)}other{ (+ மேலும் #)}}</translation>
 <translation id="1501480321619201731">குழுவை நீக்கு</translation>
@@ -255,7 +256,6 @@
 <translation id="2870560284913253234">தளம்</translation>
 <translation id="2874939134665556319">முந்தைய ட்ராக்</translation>
 <translation id="2876369937070532032">ஆபத்தான தளங்களைப் பார்ப்பதால் உங்கள் பாதுகாப்பிற்கு ஆபத்து ஏற்படும்போது நீங்கள் பார்வையிடும் சில பக்கங்களின் URLகளை Googleளுக்கு அனுப்பும்</translation>
-<translation id="2876764156902388290">இந்தப் பக்கத்தை உங்களுக்குக் காட்டுவதற்காக, குறைவான தரவையே Chrome பயன்படுத்துகிறது</translation>
 <translation id="2888126860611144412">Chrome அறிமுகம்</translation>
 <translation id="2891154217021530873">பக்கத்தை ஏற்றுவதை நிறுத்து</translation>
 <translation id="2893180576842394309">‘தேடல்’ மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
index 93e642e..108ca13a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI పరికరాల పూర్తి నియం. అనుమ.</translation>
 <translation id="1449080968331948513">డేటా సేవర్ ఇప్పుడు లైట్ మోడ్‌లో ఉంది</translation>
 <translation id="145097072038377568">Android సెట్టింగ్‌ల్లో ఆఫ్ చేయబడింది</translation>
+<translation id="146329143005354472">నా యాప్‌లకు జోడించు</translation>
 <translation id="1477626028522505441">సర్వర్ సమస్యల కారణంగా <ph name="FILE_NAME" /> డౌన్‌లోడ్ విఫలమైంది.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ మరో 1)}other{ (+ మరో #)}}</translation>
 <translation id="1501480321619201731">సమూహాన్ని తొలగించు</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">సైట్</translation>
 <translation id="2874939134665556319">మునుపటి ట్రాక్</translation>
 <translation id="2876369937070532032">మీ భద్రతకు ప్రమాదం పొంచి ఉన్నప్పుడు, మీరు సందర్శించే కొన్ని పేజీల URLలను Googleకు పంపుతుంది</translation>
-<translation id="2876764156902388290">Chrome ఈ పేజీని మీకు చూపడానికి తక్కువ డేటాని ఉపయోగిస్తోంది</translation>
 <translation id="2888126860611144412">Chrome పరిచయం</translation>
 <translation id="2891154217021530873">పేజీ లోడ్ కాకుండా ఆపివేయండి</translation>
 <translation id="2893180576842394309">శోధన, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుంది</translation>
@@ -860,7 +860,7 @@
 <translation id="7352939065658542140">వీడియో</translation>
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{ఎంచుకోబడిన 1 అంశాన్ని భాగస్వామ్యం చేస్తుంది}other{ఎంచుకోబడిన # అంశాలను భాగస్వామ్యం చేస్తుంది}}</translation>
 <translation id="7359002509206457351">మీ చెల్లింపు పద్ధతులను యాక్సెస్ చేయనీయడం</translation>
-<translation id="7365126855094612066">ఈ సెషన్ వ్యవధి కోసం, సైట్ వీటిని చేయగలుగుతుంది:
+<translation id="7365126855094612066">ఈ సెషన్ సమయంలో, సైట్ వీటిని చేయగలుగుతుంది:
 • మీ పరిసరాలకు సంబంధించిన 3D మ్యాప్‌ను సృష్టించండి
 • కెమెరా మోషన్‌ను ట్రాక్ చేయండి
 
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 62925f0..9de1a3b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">ควบคุมอุปกรณ์ MIDI ได้สมบูรณ์</translation>
 <translation id="1449080968331948513">โปรแกรมประหยัดอินเทอร์เน็ตเปลี่ยนชื่อเป็นโหมด Lite แล้ว</translation>
 <translation id="145097072038377568">ปิดในการตั้งค่า Android</translation>
+<translation id="146329143005354472">เพิ่มลงในแอปของฉัน</translation>
 <translation id="1477626028522505441">การดาวน์โหลด <ph name="FILE_NAME" /> ล้มเหลวเพราะเซิร์ฟเวอร์มีปัญหา</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (และอีก 1 รายการ)}other{ (และอีก # รายการ)}}</translation>
 <translation id="1501480321619201731">ลบกลุ่ม</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">เว็บไซต์</translation>
 <translation id="2874939134665556319">แทร็กก่อนหน้า</translation>
 <translation id="2876369937070532032">ส่ง URL ของหน้าบางส่วนที่คุณเข้าชมไปให้ Google เมื่อการรักษาความปลอดภัยมีความเสี่ยง</translation>
-<translation id="2876764156902388290">Chrome ใช้อินเทอร์เน็ตน้อยลงเพื่อแสดงหน้านี้</translation>
 <translation id="2888126860611144412">เกี่ยวกับ Chrome</translation>
 <translation id="2891154217021530873">หยุดการโหลดหน้า</translation>
 <translation id="2893180576842394309">Google อาจใช้ประวัติการเข้าชมเพื่อปรับเปลี่ยน Search และบริการอื่นๆ ของ Google ให้เข้ากับคุณ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index e307828..2f8c9c7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">MIDI cihazlarının tam denetimine izin verme</translation>
 <translation id="1449080968331948513">Veri Tasarrufu'nun yeni adı Basit mod'dur</translation>
 <translation id="145097072038377568">Android Ayarları'ndan kapatıldı</translation>
+<translation id="146329143005354472">Uygulamalarım'a ekle</translation>
 <translation id="1477626028522505441">Sunucu sorunları nedeniyle <ph name="FILE_NAME" /> dosyası indirilemedi.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 daha)}other{ (+ # daha)}}</translation>
 <translation id="1501480321619201731">Grubu sil</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Site</translation>
 <translation id="2874939134665556319">Önceki parça</translation>
 <translation id="2876369937070532032">Güvenliğiniz risk altında olduğunda ziyaret ettiğiniz bazı sayfaların URL'lerini Google'a gönderir</translation>
-<translation id="2876764156902388290">Chrome bu sayfayı göstermek için daha az veri kullanıyor</translation>
 <translation id="2888126860611144412">Chrome hakkında</translation>
 <translation id="2891154217021530873">Sayfa yüklemeyi durdur</translation>
 <translation id="2893180576842394309">Google; Arama ve diğer Google hizmetlerini kişiselleştirmek için geçmişinizi kullanabilir</translation>
@@ -901,7 +901,7 @@
 <translation id="756809126120519699">Chrome verileri temizlendi</translation>
 <translation id="757524316907819857">Sitelerin korumalı içeriği oynatmasını engellenir</translation>
 <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> dosya indirildi}other{<ph name="FILES_DOWNLOADED_MANY" /> dosya indirildi}}</translation>
-<translation id="7588219262685291874">Cihazınızın Pil Tasarrufu özelliği açık olduğunda koyu temayı açın</translation>
+<translation id="7588219262685291874">Cihazın Pil Tasarrufu özelliği açık olduğunda koyu tema açılır</translation>
 <translation id="7589445247086920869">Geçerli arama motorunu engelle</translation>
 <translation id="7593557518625677601">Chrome Senkronizasyonu'nu başlatmak için Android ayarlarını açın ve Android sistem senkronizasyonunu yeniden etkinleştirin</translation>
 <translation id="7596558890252710462">İşletim sistemi</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index b60c6a2..73a65fc 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Повний контроль пристроїв MIDI</translation>
 <translation id="1449080968331948513">Заощадження трафіку зараз працює в спрощеному режимі</translation>
 <translation id="145097072038377568">Вимкнено в налаштуваннях Android</translation>
+<translation id="146329143005354472">Внести в список "Мої додатки"</translation>
 <translation id="1477626028522505441">Файл <ph name="FILE_NAME" /> не завантажено через проблеми із сервером.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ ще 1)}one{ (+ і ще #)}few{ (+ і ще #)}many{ (+ і ще #)}other{ (+ і ще #)}}</translation>
 <translation id="1501480321619201731">Видалити групу</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Сайт</translation>
 <translation id="2874939134665556319">Попередня композиція</translation>
 <translation id="2876369937070532032">Надсилає в Google URL-адреси деяких відвіданих сторінок, коли ваша безпека під загрозою</translation>
-<translation id="2876764156902388290">Chrome використовує менше даних, щоб показати цю сторінку</translation>
 <translation id="2888126860611144412">Про Chrome</translation>
 <translation id="2891154217021530873">Припинити завантаження сторінки</translation>
 <translation id="2893180576842394309">Google може використовувати вашу історію, щоб персоналізувати Пошук та інші сервіси Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index 4243419..70047c1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">Cho phép kiểm soát hoàn toàn thiết bị MIDI</translation>
 <translation id="1449080968331948513">Trình tiết kiệm dữ liệu hiện có tên mới là Chế độ thu gọn</translation>
 <translation id="145097072038377568">Tắt trong Cài đặt Android</translation>
+<translation id="146329143005354472">Thêm vào Ứng dụng của tôi</translation>
 <translation id="1477626028522505441">Tải xuống <ph name="FILE_NAME" /> không thành công do sự cố máy chủ.</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{ (+ 1 mục khác)}other{ (+ # mục khác)}}</translation>
 <translation id="1501480321619201731">Xóa nhóm</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">Trang web</translation>
 <translation id="2874939134665556319">Bản nhạc trước</translation>
 <translation id="2876369937070532032">Gửi URL của một số trang mà bạn truy cập cho Google khi bạn gặp rủi ro về bảo mật</translation>
-<translation id="2876764156902388290">Chrome đang sử dụng ít dữ liệu hơn để hiển thị cho bạn trang này</translation>
 <translation id="2888126860611144412">Giới thiệu về Chrome</translation>
 <translation id="2891154217021530873">Ngừng tải trang</translation>
 <translation id="2893180576842394309">Google có thể sử dụng lịch sử của bạn để điều chỉnh tính năng Tìm kiếm và các dịch vụ khác của Google cho phù hợp với bạn</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index e493fbc9..f2a2c1e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">允许全面控制 MIDI 设备</translation>
 <translation id="1449080968331948513">流量节省程序现处于精简模式</translation>
 <translation id="145097072038377568">已在 Android 设置中停用</translation>
+<translation id="146329143005354472">添加到“我的应用”</translation>
 <translation id="1477626028522505441">未能成功下载 <ph name="FILE_NAME" />,因为服务器出现了问题。</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(以及另外 1 项)}other{(以及另外 # 项)}}</translation>
 <translation id="1501480321619201731">删除群组</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">网站</translation>
 <translation id="2874939134665556319">上一曲</translation>
 <translation id="2876369937070532032">当您面临安全风险时,将您所访问的部分网页的网址发送给 Google</translation>
-<translation id="2876764156902388290">Chrome 向您显示此网页时消耗的数据流量更少</translation>
 <translation id="2888126860611144412">关于 Chrome</translation>
 <translation id="2891154217021530873">停止加载网页</translation>
 <translation id="2893180576842394309">Google 可能会利用您的历史记录为您提供个性化的 Google 搜索和其他 Google 服务</translation>
@@ -862,9 +862,9 @@
 <translation id="7359002509206457351">查询付款方式</translation>
 <translation id="7365126855094612066">在此会话期间,该网站将能够:
 • 为您的环境创建一个 3D 地图
-• 跟踪相机动作
+• 跟踪相机运动
 
-该网站未获得相机的使用权限。只有您可以看到该相机拍摄的图像。</translation>
+该网站不会获得相机的使用权限。只有您可以看到该相机拍摄的图像。</translation>
 <translation id="7375125077091615385">类型:</translation>
 <translation id="7396940094317457632"><ph name="FILE_NAME" />。</translation>
 <translation id="7400418766976504921">网址</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index 9741530..b85adc3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -71,6 +71,7 @@
 <translation id="1446450296470737166">允許完整控制 MIDI 裝置</translation>
 <translation id="1449080968331948513">數據節省模式現在稱為精簡模式</translation>
 <translation id="145097072038377568">已在 Android 設定中關閉</translation>
+<translation id="146329143005354472">新增至我的應用程式</translation>
 <translation id="1477626028522505441">伺服器發生問題,因此無法下載 <ph name="FILE_NAME" />。</translation>
 <translation id="1497775360237967938">{DETAIL_COUNT,plural, =1{(還有 1 個)}other{(還有 # 個)}}</translation>
 <translation id="1501480321619201731">刪除群組</translation>
@@ -258,7 +259,6 @@
 <translation id="2870560284913253234">網站</translation>
 <translation id="2874939134665556319">上一首曲目</translation>
 <translation id="2876369937070532032">當網站具有安全性風險時,Chrome 會將你造訪的部分網頁網址傳送給 Google</translation>
-<translation id="2876764156902388290">Chrome 正以較少的數據用量顯示這個網頁</translation>
 <translation id="2888126860611144412">關於 Chrome</translation>
 <translation id="2891154217021530873">停止載入網頁</translation>
 <translation id="2893180576842394309">Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務和其他各項 Google 服務</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java
index cf5d51b..d36db8d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/AppMenuTest.java
@@ -27,7 +27,9 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ChromeTabUtils;
@@ -62,9 +64,10 @@
          */
         public AppMenuHandlerForTest(AppMenuPropertiesDelegate delegate,
                 AppMenuCoordinator.AppMenuDelegate appMenuDelegate, int menuResourceId,
-                View decorView, ActivityLifecycleDispatcher activityLifecycleDispatcher) {
-            super(delegate, appMenuDelegate, menuResourceId, decorView,
-                    activityLifecycleDispatcher);
+                View decorView, ActivityLifecycleDispatcher activityLifecycleDispatcher,
+                ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
+            super(delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher,
+                    overviewModeBehaviorSupplier);
         }
 
         @Override
@@ -79,10 +82,11 @@
         InstrumentationRegistry.getInstrumentation().setInTouchMode(false);
 
         AppMenuCoordinator.setAppMenuHandlerFactoryForTesting(
-                (delegate, appMenuDelegate, menuResourceId, decorView,
-                        activityLifecycleDispatcher) -> {
+                (delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher,
+                        overviewModeBehaviorSupplier) -> {
                     mAppMenuHandler = new AppMenuHandlerForTest(delegate, appMenuDelegate,
-                            menuResourceId, decorView, activityLifecycleDispatcher);
+                            menuResourceId, decorView, activityLifecycleDispatcher,
+                            overviewModeBehaviorSupplier);
                     return mAppMenuHandler;
                 });
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
index 423a34a..f5e234d7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/DataSaverAppMenuTest.java
@@ -20,8 +20,10 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
+import org.chromium.chrome.browser.util.ObservableSupplier;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
@@ -52,9 +54,10 @@
          */
         public AppMenuHandlerForTest(AppMenuPropertiesDelegate delegate,
                 AppMenuCoordinator.AppMenuDelegate appMenuDelegate, int menuResourceId,
-                View decorView, ActivityLifecycleDispatcher activityLifecycleDispatcher) {
-            super(delegate, appMenuDelegate, menuResourceId, decorView,
-                    activityLifecycleDispatcher);
+                View decorView, ActivityLifecycleDispatcher activityLifecycleDispatcher,
+                ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
+            super(delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher,
+                    overviewModeBehaviorSupplier);
             mDelegate = delegate;
         }
 
@@ -83,10 +86,11 @@
     @Before
     public void setUp() throws Exception {
         AppMenuCoordinator.setAppMenuHandlerFactoryForTesting(
-                (delegate, appMenuDelegate, menuResourceId, decorView,
-                        activityLifecycleDispatcher) -> {
+                (delegate, appMenuDelegate, menuResourceId, decorView, activityLifecycleDispatcher,
+                        overviewModeBehaviorSupplier) -> {
                     mAppMenuHandler = new AppMenuHandlerForTest(delegate, appMenuDelegate,
-                            menuResourceId, decorView, activityLifecycleDispatcher);
+                            menuResourceId, decorView, activityLifecycleDispatcher,
+                            overviewModeBehaviorSupplier);
                     return mAppMenuHandler;
                 });
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java
index c9ad451a..ca7a590 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedAppLifecycleTest.java
@@ -14,8 +14,8 @@
 import android.app.Activity;
 import android.support.test.filters.SmallTest;
 
+import com.google.android.libraries.feed.api.client.lifecycle.AppLifecycleListener;
 import com.google.android.libraries.feed.api.host.network.NetworkClient;
-import com.google.android.libraries.feed.api.lifecycle.AppLifecycleListener;
 
 import org.junit.Assert;
 import org.junit.Before;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java
index 674072c..d14f631b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java
@@ -253,21 +253,21 @@
         Assert.assertEquals(FeedConfiguration.FEED_SERVER_METHOD_DEFAULT,
                 configuration.getValueOrDefault(ConfigKey.FEED_SERVER_METHOD, ""));
         Assert.assertEquals(FeedConfiguration.FEED_SERVER_RESPONSE_LENGTH_PREFIXED_DEFAULT,
-                configuration.getValueOrDefault(ConfigKey.FEED_SERVER_RESPONSE_LENGTH_PREFIXED, 0));
+                configuration.getValueOrDefault(
+                        ConfigKey.FEED_SERVER_RESPONSE_LENGTH_PREFIXED, false));
         Assert.assertFalse(configuration.getValueOrDefault(ConfigKey.FEED_UI_ENABLED, true));
-        Assert.assertEquals(Integer.valueOf(FeedConfiguration.INITIAL_NON_CACHED_PAGE_SIZE_DEFAULT),
+        Assert.assertEquals((long) FeedConfiguration.INITIAL_NON_CACHED_PAGE_SIZE_DEFAULT,
                 configuration.getValueOrDefault(ConfigKey.INITIAL_NON_CACHED_PAGE_SIZE, 0));
-        Assert.assertEquals(
-                Long.valueOf(FeedConfiguration.LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS_DEFAULT),
+        Assert.assertEquals((long) FeedConfiguration.LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS_DEFAULT,
                 configuration.getValueOrDefault(
                         ConfigKey.LOGGING_IMMEDIATE_CONTENT_THRESHOLD_MS, 0l));
         Assert.assertFalse(
                 configuration.getValueOrDefault(ConfigKey.MANAGE_INTERESTS_ENABLED, true));
-        Assert.assertEquals(Integer.valueOf(FeedConfiguration.NON_CACHED_MIN_PAGE_SIZE_DEFAULT),
+        Assert.assertEquals((long) FeedConfiguration.NON_CACHED_MIN_PAGE_SIZE_DEFAULT,
                 configuration.getValueOrDefault(ConfigKey.NON_CACHED_MIN_PAGE_SIZE, 0));
-        Assert.assertEquals(Integer.valueOf(FeedConfiguration.NON_CACHED_PAGE_SIZE_DEFAULT),
+        Assert.assertEquals((long) FeedConfiguration.NON_CACHED_PAGE_SIZE_DEFAULT,
                 configuration.getValueOrDefault(ConfigKey.NON_CACHED_PAGE_SIZE, 0));
-        Assert.assertEquals(Long.valueOf(FeedConfiguration.SESSION_LIFETIME_MS_DEFAULT),
+        Assert.assertEquals((long) FeedConfiguration.SESSION_LIFETIME_MS_DEFAULT,
                 configuration.getValueOrDefault(ConfigKey.SESSION_LIFETIME_MS, 0l));
         Assert.assertFalse(configuration.getValueOrDefault(ConfigKey.SNIPPETS_ENABLED, true));
         Assert.assertFalse(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedSchedulerBridgeConformanceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedSchedulerBridgeConformanceTest.java
index 0cf73ea9..42d2461 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedSchedulerBridgeConformanceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedSchedulerBridgeConformanceTest.java
@@ -7,7 +7,7 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.rule.UiThreadTestRule;
 
-import com.google.android.libraries.feed.api.requestmanager.RequestManager;
+import com.google.android.libraries.feed.api.client.requestmanager.RequestManager;
 import com.google.android.libraries.feed.testing.conformance.scheduler.SchedulerConformanceTest;
 
 import org.junit.After;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java
index 0b24434d..04779a0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java
@@ -23,6 +23,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.DeviceConditions;
@@ -35,6 +36,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.ChromeRestriction;
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
@@ -56,6 +58,7 @@
 
 /** Unit tests for auto-fetch-on-net-error-page. */
 @RunWith(ChromeJUnit4ClassRunner.class)
+@Restriction({ChromeRestriction.RESTRICTION_TYPE_REQUIRES_TOUCH})
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         "enable-features=AutoFetchOnNetErrorPage", "disable-features=NewNetErrorPageUI"})
 public class OfflinePageAutoFetchTest {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
index 621bf15..b089091 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfigurationTest.java
@@ -15,11 +15,13 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ServicificationBackgroundService;
 import org.chromium.chrome.browser.offlinepages.OfflineTestUtil;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.ChromeRestriction;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
@@ -27,6 +29,7 @@
 
 /** Integration tests for {@link PrefetchConfiguration}. */
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Restriction({ChromeRestriction.RESTRICTION_TYPE_REQUIRES_TOUCH})
 @RunWith(ChromeJUnit4ClassRunner.class)
 public class PrefetchConfigurationTest {
     @Before
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java
index 7d34575b..2026bbf8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFeedFlowTest.java
@@ -23,6 +23,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
@@ -39,6 +40,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.ChromeRestriction;
 import org.chromium.components.background_task_scheduler.TaskIds;
 import org.chromium.components.background_task_scheduler.TaskParameters;
 import org.chromium.components.download.NetworkStatusListenerAndroid;
@@ -68,6 +70,7 @@
  * Instrumentation tests for Prefetch, using the Feed as the suggestion provider.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
+@Restriction({ChromeRestriction.RESTRICTION_TYPE_REQUIRES_TOUCH})
 @RetryOnFailure
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 public class PrefetchFeedFlowTest implements WebServer.RequestHandler {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java
index 6fb074ce..c1a40ec 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchFlowTest.java
@@ -20,6 +20,7 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
@@ -31,6 +32,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.ChromeRestriction;
 import org.chromium.components.background_task_scheduler.TaskIds;
 import org.chromium.components.background_task_scheduler.TaskParameters;
 import org.chromium.components.download.NetworkStatusListenerAndroid;
@@ -55,6 +57,7 @@
  * PrefetchFeedFlowTest.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
+@Restriction({ChromeRestriction.RESTRICTION_TYPE_REQUIRES_TOUCH})
 @RetryOnFailure
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 public class PrefetchFlowTest implements WebServer.RequestHandler {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java
index 13f21da..05fb6890 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java
@@ -21,7 +21,7 @@
 import android.app.Activity;
 import android.support.test.filters.SmallTest;
 
-import com.google.android.libraries.feed.api.stream.Stream;
+import com.google.android.libraries.feed.api.client.stream.Stream;
 
 import org.junit.After;
 import org.junit.Before;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/util/ObservableSupplierImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/util/ObservableSupplierImplTest.java
new file mode 100644
index 0000000..5f6788d
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/util/ObservableSupplierImplTest.java
@@ -0,0 +1,190 @@
+// 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.
+
+package org.chromium.chrome.browser.util;
+
+import android.os.Handler;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Unit tests for {@link ObservableSupplierImpl}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class ObservableSupplierImplTest {
+    private static final String TEST_STRING_1 = "Test";
+    private static final String TEST_STRING_2 = "Test2";
+
+    private int mCallCount;
+    private String mLastSuppliedString;
+    private ObservableSupplierImpl<String> mSupplier = new ObservableSupplierImpl<>();
+
+    @Test
+    public void testObserverNotification_SetMultiple() {
+        Callback<String> supplierObserver = result -> {
+            mCallCount++;
+            mLastSuppliedString = result;
+        };
+
+        mSupplier.addObserver(supplierObserver);
+        checkState(0, null, null, "before setting first string.");
+
+        mSupplier.set(TEST_STRING_1);
+        checkState(1, TEST_STRING_1, TEST_STRING_1, "after setting first string.");
+
+        mSupplier.set(TEST_STRING_2);
+        checkState(2, TEST_STRING_2, TEST_STRING_2, "after setting second string.");
+
+        mSupplier.set(null);
+        checkState(3, null, null, "after setting third string.");
+    }
+
+    @Test
+    public void testObserverNotification_SetSame() {
+        Callback<String> supplierObserver = result -> {
+            mCallCount++;
+            mLastSuppliedString = result;
+        };
+
+        mSupplier.addObserver(supplierObserver);
+        checkState(0, null, null, "before setting first string.");
+
+        mSupplier.set(TEST_STRING_1);
+        checkState(1, TEST_STRING_1, TEST_STRING_1, "after setting first string.");
+
+        mSupplier.set(TEST_STRING_1);
+        checkState(1, TEST_STRING_1, TEST_STRING_1, "after resetting first string.");
+    }
+
+    @Test
+    public void testObserverNotification_RemoveObserver() {
+        Callback<String> supplierObserver = result -> {
+            mCallCount++;
+            mLastSuppliedString = result;
+        };
+
+        mSupplier.addObserver(supplierObserver);
+        checkState(0, null, null, "before setting first string.");
+
+        mSupplier.set(TEST_STRING_1);
+        checkState(1, TEST_STRING_1, TEST_STRING_1, "after setting first string.");
+
+        mSupplier.removeObserver(supplierObserver);
+
+        mSupplier.set(TEST_STRING_2);
+        checkState(1, TEST_STRING_1, TEST_STRING_2, "after setting second string.");
+    }
+
+    @Test
+    public void testObserverNotification_RegisterObserverAfterSet() {
+        Handler handler = new Handler();
+        handler.post(() -> {
+            mSupplier.set(TEST_STRING_1);
+            checkState(0, null, TEST_STRING_1, "after setting first string.");
+
+            Callback<String> supplierObserver = new Callback<String>() {
+                @Override
+                public void onResult(String result) {
+                    mCallCount++;
+                    mLastSuppliedString = result;
+                }
+            };
+
+            mSupplier.addObserver(supplierObserver);
+
+            checkState(0, null, TEST_STRING_1, "after setting observer.");
+        });
+
+        handler.post(() -> checkState(1, TEST_STRING_1, TEST_STRING_1, "in second message loop."));
+    }
+
+    @Test
+    public void testObserverNotification_RegisterObserverAfterSetThenSetAgain() {
+        Handler handler = new Handler();
+        handler.post(() -> {
+            mSupplier.set(TEST_STRING_1);
+            checkState(0, null, TEST_STRING_1, "after setting first string.");
+
+            Callback<String> supplierObserver = new Callback<String>() {
+                @Override
+                public void onResult(String result) {
+                    mCallCount++;
+                    mLastSuppliedString = result;
+                }
+            };
+
+            mSupplier.addObserver(supplierObserver);
+
+            checkState(0, null, TEST_STRING_1, "after setting observer.");
+
+            mSupplier.set(TEST_STRING_2);
+            checkState(1, TEST_STRING_2, TEST_STRING_2, "after setting second string.");
+        });
+
+        handler.post(() -> checkState(1, TEST_STRING_2, TEST_STRING_2, "in second message loop."));
+    }
+
+    @Test
+    public void testObserverNotification_RegisterObserverAfterSetThenRemove() {
+        Handler handler = new Handler();
+        handler.post(() -> {
+            mSupplier.set(TEST_STRING_1);
+            checkState(0, null, TEST_STRING_1, "after setting first string.");
+
+            Callback<String> supplierObserver = new Callback<String>() {
+                @Override
+                public void onResult(String result) {
+                    mCallCount++;
+                    mLastSuppliedString = result;
+                }
+            };
+
+            mSupplier.addObserver(supplierObserver);
+
+            checkState(0, null, TEST_STRING_1, "after setting observer.");
+
+            mSupplier.removeObserver(supplierObserver);
+        });
+
+        handler.post(() -> checkState(0, null, TEST_STRING_1, "in second message loop."));
+    }
+
+    @Test
+    public void testObserverNotification_RemoveObserverInsideCallback() {
+        Callback<String> supplierObserver = new Callback<String>() {
+            @Override
+            public void onResult(String result) {
+                mCallCount++;
+                mLastSuppliedString = result;
+                mSupplier.removeObserver(this);
+            }
+        };
+
+        mSupplier.addObserver(supplierObserver);
+        checkState(0, null, null, "before setting first string.");
+
+        mSupplier.set(TEST_STRING_1);
+        checkState(1, TEST_STRING_1, TEST_STRING_1, "after setting first string.");
+
+        mSupplier.set(TEST_STRING_2);
+        checkState(1, TEST_STRING_1, TEST_STRING_2, "after setting second string.");
+    }
+
+    private void checkState(int expectedCallCount, String expectedLastSuppliedString,
+            String expectedStringFromGet, String assertDescription) {
+        Assert.assertEquals(
+                "Incorrect call count " + assertDescription, expectedCallCount, mCallCount);
+        Assert.assertEquals("Incorrect last supplied string " + assertDescription,
+                expectedLastSuppliedString, mLastSuppliedString);
+        Assert.assertEquals(
+                "Incorrect #get() " + assertDescription, expectedStringFromGet, mSupplier.get());
+    }
+}
diff --git a/chrome/android/monochrome/java/src/com/android/webview/chromium/LicenseContentProvider.java b/chrome/android/monochrome/java/src/com/android/webview/chromium/LicenseContentProvider.java
index 5bc5c683..83fd70f 100644
--- a/chrome/android/monochrome/java/src/com/android/webview/chromium/LicenseContentProvider.java
+++ b/chrome/android/monochrome/java/src/com/android/webview/chromium/LicenseContentProvider.java
@@ -12,7 +12,6 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
-import android.util.Log;
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.library_loader.ProcessInitException;
@@ -20,19 +19,15 @@
 import org.chromium.components.aboutui.CreditUtils;
 
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
 
 /**
- * Content provider for the OSS licenses file.
+ * Content provider for the OSS licenses file used on Monochrome and Trichrome.
  */
-@TargetApi(Build.VERSION_CODES.KITKAT)
+@TargetApi(Build.VERSION_CODES.N)
 public class LicenseContentProvider
         extends ContentProvider implements ContentProvider.PipeDataWriter<String> {
     public static final String LICENSES_URI_SUFFIX = "LicenseContentProvider/webview_licenses";
     public static final String LICENSES_CONTENT_TYPE = "text/html";
-    private static final String TAG = "LicenseCP";
 
     @Override
     public boolean onCreate() {
@@ -50,22 +45,17 @@
     @Override
     public void writeDataToPipe(
             ParcelFileDescriptor output, Uri uri, String mimeType, Bundle opts, String filename) {
-        try (OutputStream out = new FileOutputStream(output.getFileDescriptor());) {
-            ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        ChromeBrowserInitializer.getInstance(getContext())
-                                .handleSynchronousStartup();
-                    } catch (ProcessInitException e) {
-                        Log.e(TAG, "Fail to initialize the Chrome Browser.", e);
-                    }
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    ChromeBrowserInitializer.getInstance(getContext()).handleSynchronousStartup();
+                } catch (ProcessInitException e) {
+                    throw new RuntimeException(e);
                 }
-            });
-            out.write(CreditUtils.nativeGetJavaWrapperCredits());
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to write the license file", e);
-        }
+            }
+        });
+        CreditUtils.nativeWriteCreditsHtml(output.detachFd());
     }
 
     @Override
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 75b228f..ab62d89 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-76.0.3783.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-76.0.3798.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/android/touchless/java/res/values-v17/dimens.xml b/chrome/android/touchless/java/res/values-v17/dimens.xml
index e8774cd..f97d0ee 100644
--- a/chrome/android/touchless/java/res/values-v17/dimens.xml
+++ b/chrome/android/touchless/java/res/values-v17/dimens.xml
@@ -16,6 +16,7 @@
     <dimen name="notouch_key_functions_tooltip_item_horizontal_margin">4dp</dimen>
 
     <dimen name="focus_ring_stroke_width">2dp</dimen>
+    <dimen name="touchless_preferences_highlight_padding">8dp</dimen>
 
     <!-- Open last tab placeholder dimensions. -->
     <dimen name="open_last_tab_placeholder_image_size">24dp</dimen>
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
index 16d0e4d..b2533f4 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/SiteSuggestionsAdapter.java
@@ -13,6 +13,7 @@
 import static org.chromium.chrome.browser.touchless.SiteSuggestionsCoordinator.SHOULD_FOCUS_VIEW;
 import static org.chromium.chrome.browser.touchless.SiteSuggestionsCoordinator.SUGGESTIONS_KEY;
 
+import android.graphics.Bitmap;
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 import android.support.graphics.drawable.VectorDrawableCompat;
@@ -56,7 +57,7 @@
     }
 
     private class SiteSuggestionInteractionDelegate
-            implements ContextMenuManager.Delegate, View.OnCreateContextMenuListener {
+            implements TouchlessContextMenuManager.Delegate, View.OnCreateContextMenuListener {
         private PropertyModel mSuggestion;
 
         SiteSuggestionInteractionDelegate(PropertyModel model) {
@@ -95,11 +96,22 @@
 
         @Override
         public boolean isItemSupported(int menuItemId) {
-            return menuItemId == ContextMenuManager.ContextMenuItemId.REMOVE;
+            return menuItemId == ContextMenuManager.ContextMenuItemId.REMOVE
+                    || menuItemId == ContextMenuManager.ContextMenuItemId.ADD_TO_MY_APPS;
         }
 
         @Override
         public void onContextMenuCreated() {}
+
+        @Override
+        public String getTitle() {
+            return mSuggestion.get(SiteSuggestionModel.TITLE_KEY);
+        }
+
+        @Override
+        public Bitmap getIconBitmap() {
+            return mSuggestion.get(SiteSuggestionModel.ICON_KEY);
+        }
     }
 
     private PropertyModel mModel;
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessAddToHomescreenManager.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessAddToHomescreenManager.java
index 8fe926ac..8ff0687e 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessAddToHomescreenManager.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessAddToHomescreenManager.java
@@ -4,24 +4,28 @@
 
 package org.chromium.chrome.browser.touchless;
 
-import android.content.Context;
+import android.app.Activity;
 import android.graphics.Bitmap;
 
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.webapps.AddToHomescreenDialog;
+import org.chromium.chrome.browser.webapps.TouchlessAddToHomescreenDialog;
+import org.chromium.ui.modaldialog.ModalDialogManager;
 
 /**
  * Add to homescreen manager specifically for touchless devices.
  */
 class TouchlessAddToHomescreenManager implements AddToHomescreenDialog.Delegate {
-    private final Context mContext;
+    private final Activity mActivity;
+    private final ModalDialogManager mDialogManager;
     private final String mUrl;
     private final String mTitle;
     private final Bitmap mIconBitmap;
 
-    public TouchlessAddToHomescreenManager(
-            Context context, String url, String title, Bitmap iconBitmap) {
-        mContext = context;
+    public TouchlessAddToHomescreenManager(Activity activity, ModalDialogManager dialogManager,
+            String url, String title, Bitmap iconBitmap) {
+        mActivity = activity;
+        mDialogManager = dialogManager;
         mUrl = url;
         mTitle = title;
         mIconBitmap = iconBitmap;
@@ -29,7 +33,8 @@
 
     // Starts the process of showing the dialog and adding the shortcut.
     public void start() {
-        AddToHomescreenDialog dialog = new AddToHomescreenDialog(mContext, this);
+        AddToHomescreenDialog dialog =
+                new TouchlessAddToHomescreenDialog(mActivity, mDialogManager, this);
         dialog.show();
         dialog.onUserTitleAvailable(mTitle, mUrl, false);
         dialog.onIconAvailable(mIconBitmap);
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
index 19b38419..313011ce 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
@@ -4,7 +4,7 @@
 
 package org.chromium.chrome.browser.touchless;
 
-import android.content.Context;
+import android.app.Activity;
 import android.graphics.Bitmap;
 import android.support.annotation.DrawableRes;
 import android.support.annotation.StringRes;
@@ -43,16 +43,18 @@
         Bitmap getIconBitmap();
     }
 
-    private final Context mContext;
+    private final Activity mActivity;
+    private final ModalDialogManager mDialogManager;
     private PropertyModel mTouchlessMenuModel;
     private ModalDialogManager mModalDialogManager;
 
-    public TouchlessContextMenuManager(Context context,
+    public TouchlessContextMenuManager(Activity activity, ModalDialogManager dialogManager,
             NativePageNavigationDelegate navigationDelegate,
             TouchEnabledDelegate touchEnabledDelegate, Runnable closeContextMenuCallback,
             String userActionPrefix) {
         super(navigationDelegate, touchEnabledDelegate, closeContextMenuCallback, userActionPrefix);
-        mContext = context;
+        mActivity = activity;
+        mDialogManager = dialogManager;
     }
 
     /**
@@ -100,8 +102,9 @@
         if (itemId == ContextMenuItemId.ADD_TO_MY_APPS) {
             Delegate touchlessDelegate = (Delegate) delegate;
             TouchlessAddToHomescreenManager touchlessAddToHomescreenManager =
-                    new TouchlessAddToHomescreenManager(mContext, touchlessDelegate.getUrl(),
-                            touchlessDelegate.getTitle(), touchlessDelegate.getIconBitmap());
+                    new TouchlessAddToHomescreenManager(mActivity, mDialogManager,
+                            touchlessDelegate.getUrl(), touchlessDelegate.getTitle(),
+                            touchlessDelegate.getIconBitmap());
             touchlessAddToHomescreenManager.start();
             return false;
         }
@@ -126,7 +129,11 @@
             case ContextMenuItemId.OPEN_IN_NEW_WINDOW:
                 return false;
             case ContextMenuItemId.ADD_TO_MY_APPS:
-                return delegate.isItemSupported(itemId);
+                if (delegate instanceof Delegate) {
+                    return delegate.isItemSupported(itemId);
+                } else {
+                    return false;
+                }
         }
 
         assert false : "Encountered unexpected touchless context menu item type";
@@ -139,9 +146,9 @@
      */
     private PropertyModel buildMenuItem(@ContextMenuItemId int itemId, OnClickListener listener) {
         return new PropertyModel.Builder(DialogListItemProperties.ALL_KEYS)
-                .with(DialogListItemProperties.TEXT, mContext.getResources(),
+                .with(DialogListItemProperties.TEXT, mActivity.getResources(),
                         getResourceIdForMenuItem(itemId))
-                .with(DialogListItemProperties.ICON, mContext, getIconIdForMenuItem(itemId))
+                .with(DialogListItemProperties.ICON, mActivity, getIconIdForMenuItem(itemId))
                 .with(DialogListItemProperties.CLICK_LISTENER, listener)
                 .build();
     }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessExploreSitesPage.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessExploreSitesPage.java
index 8d9a7c20..3bc5fdd5 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessExploreSitesPage.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessExploreSitesPage.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.touchless;
 
-import android.content.Context;
 import android.view.View;
 
 import org.chromium.chrome.browser.ChromeActivity;
@@ -20,7 +19,7 @@
  */
 public class TouchlessExploreSitesPage extends ExploreSitesPage {
     private final ModalDialogManager mModalDialogManager;
-    private Context mContext;
+    private ChromeActivity mActivity;
     private TouchlessContextMenuManager mTouchlessContextMenuManager;
 
     /**
@@ -33,14 +32,15 @@
 
     @Override
     protected void initialize(ChromeActivity activity, final NativePageHost host) {
-        mContext = activity;
+        mActivity = activity;
         super.initialize(activity, host);
     }
 
     @Override
     protected ContextMenuManager createContextMenuManager(NativePageNavigationDelegate navDelegate,
             Runnable closeContextMenuCallback, String contextMenuUserActionPrefix) {
-        mTouchlessContextMenuManager = new TouchlessContextMenuManager(mContext, navDelegate,
+        mTouchlessContextMenuManager = new TouchlessContextMenuManager(mActivity,
+                mActivity.getModalDialogManager(), navDelegate,
                 (enabled) -> {}, closeContextMenuCallback, contextMenuUserActionPrefix);
         return mTouchlessContextMenuManager;
     }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java
index 2878135..03ad3258 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPage.java
@@ -125,8 +125,9 @@
         // is reparented.
         Runnable closeContextMenuCallback = () -> mTab.getActivity().closeContextMenu();
         mContextMenuManager = new TouchlessContextMenuManager(activity,
-                suggestionsUiDelegate.getNavigationDelegate(), mRecyclerView::setTouchEnabled,
-                closeContextMenuCallback, NewTabPage.CONTEXT_MENU_USER_ACTION_PREFIX);
+                activity.getModalDialogManager(), suggestionsUiDelegate.getNavigationDelegate(),
+                mRecyclerView::setTouchEnabled, closeContextMenuCallback,
+                NewTabPage.CONTEXT_MENU_USER_ACTION_PREFIX);
         mTab.getWindowAndroid().addContextMenuCloseListener(mContextMenuManager);
 
         UiConfig uiConfig = new UiConfig(mRecyclerView);
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediator.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediator.java
index 077d6a97..f7d6a8f 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediator.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediator.java
@@ -75,20 +75,19 @@
     }
 
     @Override
+    public void onContentChanged(Tab tab) {
+        // This is the main entry point for #saveStateAndRemoveObserver when loading a native page.
+        // This is still called when loading renderer pages, but after the next navigation entry is
+        // committed, see https://crbug.com/963584.
+        saveStateAndRemoveObserver(tab);
+    }
+
+    @Override
     public void onPageLoadStarted(Tab tab, String url) {
-        if (mScrollPosition != null) {
-            NewTabPage.saveStringToNavigationEntry(
-                    tab, NAVIGATION_ENTRY_SCROLL_POSITION_KEY, mScrollPosition.serialize());
-        }
-        if (mFocus != null) {
-            Parcel parcel = Parcel.obtain();
-            mFocus.writeToParcel(parcel, 0);
-            byte[] bytes = parcel.marshall();
-            parcel.recycle();
-            String serializedString = Base64.encodeToString(bytes, Base64.DEFAULT);
-            NewTabPage.saveStringToNavigationEntry(
-                    tab, NAVIGATION_ENTRY_FOCUS_KEY, serializedString);
-        }
+        // This is the main entry point for #saveStateAndRemoveObserver when loading a renderer
+        // page. This is still called when loading native pages, but after we should have completely
+        // cleaned up ourselves and observers, see https://crbug.com/963584.
+        saveStateAndRemoveObserver(tab);
     }
 
     public PropertyModel getModel() {
@@ -97,8 +96,7 @@
 
     void destroy() {
         if (!mTab.isHidden()) recordNTPHidden();
-
-        mTab.removeObserver(this);
+        // Should already have been removed from mTab's observer list.
     }
 
     /**
@@ -117,4 +115,33 @@
         NewTabPageUma.recordTimeSpentOnNtp(mLastShownTimeNs);
         SuggestionsMetrics.recordSurfaceHidden();
     }
+
+    /**
+     * Saves focus and scroll state to the current navigation entry.
+     * @param tab The current tab.
+     */
+    private void saveStateAndRemoveObserver(Tab tab) {
+        // This method ends up being called when the NTP is loaded, so ignore those cases.
+        if (mScrollPosition == null && mFocus == null) {
+            return;
+        }
+
+        if (mScrollPosition != null) {
+            NewTabPage.saveStringToNavigationEntry(
+                    tab, NAVIGATION_ENTRY_SCROLL_POSITION_KEY, mScrollPosition.serialize());
+        }
+        if (mFocus != null) {
+            Parcel parcel = Parcel.obtain();
+            mFocus.writeToParcel(parcel, 0);
+            byte[] bytes = parcel.marshall();
+            parcel.recycle();
+            String serializedString = Base64.encodeToString(bytes, Base64.DEFAULT);
+            NewTabPage.saveStringToNavigationEntry(
+                    tab, NAVIGATION_ENTRY_FOCUS_KEY, serializedString);
+        }
+
+        // Observations need to be removed now to avoid saving state to the wrong entry when loading
+        // a renderer page from on onContentChange notification, see https://crbug.com/963584.
+        tab.removeObserver(this);
+    }
 }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java
index ce8b3035..2298460 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java
@@ -4,19 +4,54 @@
 
 package org.chromium.chrome.browser.touchless;
 
+import android.app.Fragment;
 import android.os.Bundle;
 import android.view.Menu;
+import android.widget.ListView;
 
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.preferences.Preferences;
+import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties;
+import org.chromium.ui.modelutil.PropertyModel;
 
 /**
  * The Chrome settings activity for touchless devices.
  */
 public class TouchlessPreferences extends Preferences {
+    private TouchlessModelCoordinator mTouchlessModelCoordinator;
+    private PropertyModel mDialogModel;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         getSupportActionBar().setDisplayHomeAsUpEnabled(false);
+        mTouchlessModelCoordinator = AppHooks.get().createTouchlessModelCoordinator(this);
+        mDialogModel =
+                new PropertyModel.Builder(TouchlessDialogProperties.MINIMAL_DIALOG_KEYS).build();
+        mTouchlessModelCoordinator.addModelToQueue(mDialogModel);
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        int padding = getResources().getDimensionPixelSize(
+                org.chromium.chrome.touchless.R.dimen.touchless_preferences_highlight_padding);
+        Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content);
+        ListView listView = fragment.getView().findViewById(android.R.id.list);
+        listView.setPadding(padding, 0, padding, 0);
+        listView.setDividerHeight(padding);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        TouchlessDialogProperties.ActionNames actionNames =
+                new TouchlessDialogProperties.ActionNames();
+        actionNames.select = R.string.select;
+        actionNames.cancel = R.string.back;
+        actionNames.alt = 0;
+        mDialogModel.set(TouchlessDialogProperties.ACTION_NAMES, actionNames);
     }
 
     @Override
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHMediator.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHMediator.java
index 4db876d..df458d8 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHMediator.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHMediator.java
@@ -27,6 +27,7 @@
     private final KeyFunctionsIPHTabObserver mKeyFunctionsIPHTabObserver;
     private FutureTask mHideTask;
     private int mPageLoadCount;
+    private DisplayLockHandle mDisplayLockHandle;
 
     private static final long DISPLAY_DURATION_MS = 3000;
 
@@ -62,16 +63,18 @@
             if (totalSessionCount > INTRODUCTORY_SESSIONS && mPageLoadCount > 1) return;
         }
 
-        // This ensures that no other in-product help UI is currently shown.
-        DisplayLockHandle displayLockHandle =
-                TrackerFactory.getTrackerForProfile(Profile.getLastUsedProfile())
-                        .acquireDisplayLock();
-        if (displayLockHandle == null) return;
+        // If we are already showing this IPH, we should release the lock.
+        if (mDisplayLockHandle != null) mDisplayLockHandle.release();
+        mDisplayLockHandle = TrackerFactory.getTrackerForProfile(Profile.getLastUsedProfile())
+                                     .acquireDisplayLock();
+        // If another IPH UI is currently shown, return.
+        if (mDisplayLockHandle == null) return;
 
         if (mHideTask != null) mHideTask.cancel(false);
         mHideTask = new FutureTask<Void>(() -> {
             mModel.set(KeyFunctionsIPHProperties.IS_VISIBLE, false);
-            displayLockHandle.release();
+            mDisplayLockHandle.release();
+            mDisplayLockHandle = null;
             return null;
         });
         PostTask.postDelayedTask(UiThreadTaskTraits.DEFAULT, mHideTask, DISPLAY_DURATION_MS);
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHView.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHView.java
index 5f435e4..af40f68 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHView.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHView.java
@@ -37,15 +37,16 @@
         mTooltipView = hostView;
     }
 
-    void show(boolean isCursorVisible) {
-        if (isCursorVisible) {
-            mNavigationModeImageView.setImageResource(R.drawable.ic_spatial_navigation);
-        } else {
-            mNavigationModeImageView.setImageResource(R.drawable.ic_cursor_navigation);
-        }
+    void show() {
         mTooltipView.show(this);
     }
 
+    void setCursorVisibility(boolean isCursorVisible) {
+        mNavigationModeImageView.setImageResource(isCursorVisible
+                        ? R.drawable.ic_spatial_navigation
+                        : R.drawable.ic_cursor_navigation);
+    }
+
     void hide() {
         mTooltipView.hide();
     }
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHViewBinder.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHViewBinder.java
index 35a2d57..c55fa29 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHViewBinder.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/ui/iph/KeyFunctionsIPHViewBinder.java
@@ -16,10 +16,14 @@
         if (KeyFunctionsIPHProperties.TOOLTIP_VIEW == propertyKey) {
             keyFunctionsIPHView.setTooltipView(model.get(KeyFunctionsIPHProperties.TOOLTIP_VIEW));
         } else if (KeyFunctionsIPHProperties.IS_VISIBLE == propertyKey) {
-            if (model.get(KeyFunctionsIPHProperties.IS_VISIBLE))
-                keyFunctionsIPHView.show(model.get(KeyFunctionsIPHProperties.IS_CURSOR_VISIBLE));
-            else
+            if (model.get(KeyFunctionsIPHProperties.IS_VISIBLE)) {
+                keyFunctionsIPHView.show();
+            } else {
                 keyFunctionsIPHView.hide();
+            }
+        } else if (KeyFunctionsIPHProperties.IS_CURSOR_VISIBLE == propertyKey) {
+            keyFunctionsIPHView.setCursorVisibility(
+                    model.get(KeyFunctionsIPHProperties.IS_CURSOR_VISIBLE));
         }
     }
 }
diff --git a/chrome/android/touchless/java/strings/translations/touchless_strings_ml.xtb b/chrome/android/touchless/java/strings/translations/touchless_strings_ml.xtb
index 22e3256b..04c7a51 100644
--- a/chrome/android/touchless/java/strings/translations/touchless_strings_ml.xtb
+++ b/chrome/android/touchless/java/strings/translations/touchless_strings_ml.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
-<translation id="146329143005354472">എന്റെ ആപ്പുകളിലേക്ക് ചേർക്കുക</translation>
+<translation id="146329143005354472">എൻ്റെ ആപ്പുകളിലേക്ക് ചേർക്കുക</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="2169830938017475061">ഇപ്പോൾ</translation>
 <translation id="3669009212293447190">കൂടുതൽ ലേഖനങ്ങൾ</translation>
diff --git a/chrome/android/touchless/javatests/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediatorTest.java b/chrome/android/touchless/javatests/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediatorTest.java
new file mode 100644
index 0000000..8844f625
--- /dev/null
+++ b/chrome/android/touchless/javatests/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediatorTest.java
@@ -0,0 +1,90 @@
+// 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.
+
+package org.chromium.chrome.browser.touchless;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.UrlConstants;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.test.ChromeActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.ChromeTabUtils;
+import org.chromium.content_public.browser.LoadUrlParams;
+import org.chromium.content_public.browser.NavigationController;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.net.test.EmbeddedTestServer;
+
+/**
+ * Instrumentation tests for {@link TouchlessNewTabPageMediator}.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+public class TouchlessNewTabPageMediatorTest {
+    @Rule
+    public ChromeActivityTestRule<NoTouchActivity> mActivityTestRule =
+            new ChromeActivityTestRule<>(NoTouchActivity.class);
+
+    private EmbeddedTestServer mTestServer;
+    private Tab mInitialTab;
+    private NavigationController mNavigationController;
+
+    @Before
+    public void setUp() throws InterruptedException {
+        mActivityTestRule.startMainActivityFromLauncher();
+        mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
+        mInitialTab = mActivityTestRule.getActivity().getActivityTab();
+        mNavigationController = mInitialTab.getWebContents().getNavigationController();
+
+        // NTP is going to load by default.
+        ChromeTabUtils.waitForTabPageLoaded(mInitialTab, (String) null);
+    }
+
+    @After
+    public void tearDown() {
+        // If setUp() fails, tearDown() still needs to be able to execute without exceptions.
+        if (mTestServer != null) {
+            mTestServer.stopAndDestroyServer();
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void testRendererPageLoad() throws InterruptedException {
+        String rendererUrl = mTestServer.getURL("/chrome/test/data/android/google.html");
+        verifyScrollPosition((String pos) -> Assert.assertEquals("", pos));
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> { mInitialTab.loadUrl(new LoadUrlParams(rendererUrl)); });
+        ChromeTabUtils.waitForTabPageLoaded(mInitialTab, (String) null);
+        verifyScrollPosition((String pos) -> Assert.assertNotEquals("", pos));
+    }
+
+    @Test
+    @SmallTest
+    public void testNativePageLoad() throws InterruptedException {
+        verifyScrollPosition((String pos) -> Assert.assertEquals("", pos));
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> { mInitialTab.loadUrl(new LoadUrlParams(UrlConstants.EXPLORE_URL)); });
+        ChromeTabUtils.waitForTabPageLoaded(mInitialTab, (String) null);
+        verifyScrollPosition((String pos) -> Assert.assertNotEquals("", pos));
+    }
+
+    private void verifyScrollPosition(Callback<String> verification) {
+        TestThreadUtils.runOnUiThreadBlocking(
+                ()
+                        -> verification.onResult(mNavigationController.getEntryExtraData(
+                                0, "TouchlessScrollPosition")));
+    }
+}
diff --git a/chrome/android/touchless/touchless_java_sources.gni b/chrome/android/touchless/touchless_java_sources.gni
index efa2219..dc1ead3 100644
--- a/chrome/android/touchless/touchless_java_sources.gni
+++ b/chrome/android/touchless/touchless_java_sources.gni
@@ -67,6 +67,7 @@
 touchless_test_java_sources = [
   "touchless/javatests/src/org/chromium/chrome/browser/touchless/NoTouchActivityTest.java",
   "touchless/javatests/src/org/chromium/chrome/browser/touchless/TouchlessNavigationRecorderTest.java",
+  "touchless/javatests/src/org/chromium/chrome/browser/touchless/TouchlessNewTabPageMediatorTest.java",
 ]
 
 touchless_junit_test_java_sources = [ "touchless/junit/src/org/chromium/chrome/browser/touchless/ScrollPositionInfoTest.java" ]
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index ea97110..a2aa421 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -444,7 +444,6 @@
     "//services/image_annotation/public/cpp:manifest",
     "//services/preferences/public/cpp:manifest",
     "//services/service_manager/public/cpp",
-    "//services/ws/common",
     "//third_party/blink/public/common",
   ]
 
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc
index 634c1a2..3338e9f 100644
--- a/chrome/app/chrome_content_browser_overlay_manifest.cc
+++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -62,8 +62,6 @@
 #include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
 #include "chromeos/services/network_config/public/mojom/constants.mojom.h"
 #include "media/capture/video/chromeos/mojo/cros_image_capture.mojom.h"
-#include "services/ws/common/switches.h"
-#include "services/ws/public/mojom/constants.mojom.h"
 #if BUILDFLAG(ENABLE_CROS_ASSISTANT)
 #include "chromeos/services/assistant/public/cpp/manifest.h"  // nogncheck
 #endif
@@ -99,195 +97,174 @@
 #include "third_party/blink/public/mojom/page/spatial_navigation.mojom.h"
 #endif
 
-namespace {
-
-service_manager::Manifest MaybeAddTestInterfaces(
-    service_manager::Manifest manifest) {
-#if defined(OS_CHROMEOS)
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          ws::switches::kUseTestConfig)) {
-    manifest.required_capabilities["ui"].insert("test");
-  }
-#endif
-  return manifest;
-}
-
-}  // namespace
-
 const service_manager::Manifest& GetChromeContentBrowserOverlayManifest() {
   static base::NoDestructor<service_manager::Manifest> manifest {
-    MaybeAddTestInterfaces(
-        service_manager::ManifestBuilder()
-            .ExposeCapability("gpu",
-                              service_manager::Manifest::InterfaceList<
-                                  metrics::mojom::CallStackProfileCollector>())
-            .ExposeCapability("profiling_client",
-                              service_manager::Manifest::InterfaceList<
-                                  heap_profiling::mojom::ProfilingClient>())
-            .ExposeCapability(
-                "renderer", service_manager::Manifest::InterfaceList<
-                                chrome::mojom::AvailableOfflineContentProvider,
-                                chrome::mojom::CacheStatsRecorder,
-                                chrome::mojom::NetBenchmarking,
-                                data_reduction_proxy::mojom::DataReductionProxy,
-                                metrics::mojom::CallStackProfileCollector,
+    service_manager::ManifestBuilder()
+        .ExposeCapability("gpu",
+                          service_manager::Manifest::InterfaceList<
+                              metrics::mojom::CallStackProfileCollector>())
+        .ExposeCapability("profiling_client",
+                          service_manager::Manifest::InterfaceList<
+                              heap_profiling::mojom::ProfilingClient>())
+        .ExposeCapability("renderer",
+                          service_manager::Manifest::InterfaceList<
+                              chrome::mojom::AvailableOfflineContentProvider,
+                              chrome::mojom::CacheStatsRecorder,
+                              chrome::mojom::NetBenchmarking,
+                              data_reduction_proxy::mojom::DataReductionProxy,
+                              metrics::mojom::CallStackProfileCollector,
 #if defined(OS_WIN)
-                                mojom::ModuleEventSink,
+                              mojom::ModuleEventSink,
 #endif
-                                rappor::mojom::RapporRecorder,
-                                safe_browsing::mojom::SafeBrowsing>())
-            .RequireCapability("apps", "app_service")
-            .RequireCapability("ash", "system_ui")
-            // Used by ShelfTestApi and ShelfIntegrationTestApi
-            .RequireCapability("ash", "test")
-            .RequireCapability("ash", "display")
-            // Only used in the classic Ash case
-            .RequireCapability("ash_pref_connector", "pref_connector")
-            .RequireCapability("assistant", "assistant")
-            .RequireCapability("cellular_setup", "cellular_setup")
-            // Only used in the classic Ash case
-            .RequireCapability("chrome", "input_device_controller")
-            .RequireCapability("chrome_printing", "converter")
-            .RequireCapability("content_system", "profiling_client")
-            .RequireCapability("cups_ipp_parser", "ipp_parser")
-            .RequireCapability("device", "device:fingerprint")
-            .RequireCapability("device", "device:geolocation_config")
-            .RequireCapability("device", "device:geolocation_control")
-            .RequireCapability("device", "device:ip_geolocator")
-            .RequireCapability("device_sync", "device_sync")
-            .RequireCapability("file_util", "analyze_archive")
-            .RequireCapability("file_util", "zip_file")
-            .RequireCapability("heap_profiling", "heap_profiler")
-            .RequireCapability("heap_profiling", "profiling")
-            .RequireCapability("identity", "identity_accessor")
-            .RequireCapability(image_annotation::mojom::kServiceName,
-                               image_annotation::mojom::kAnnotationCapability)
-            .RequireCapability("ime", "input_engine")
-            // Only used in the classic Ash case
-            .RequireCapability("local_state", "pref_client")
-            .RequireCapability("media_gallery_util", "parse_media")
-            .RequireCapability("mirroring", "mirroring")
-            .RequireCapability("multidevice_setup", "multidevice_setup")
-            .RequireCapability("nacl_broker", "browser")
-            .RequireCapability("nacl_loader", "browser")
-            .RequireCapability("noop", "noop")
-            .RequireCapability("patch", "patch_file")
-            .RequireCapability("pdf_compositor", "compositor")
-            .RequireCapability("preferences", "pref_client")
-            .RequireCapability("preferences", "pref_control")
-            .RequireCapability("profile_import", "import")
-            .RequireCapability("proxy_resolver", "factory")
-            .RequireCapability(quarantine::mojom::kServiceName,
-                               quarantine::mojom::kQuarantineFileCapability)
-            .RequireCapability("removable_storage_writer",
-                               "removable_storage_writer")
-            .RequireCapability("secure_channel", "secure_channel")
-            .RequireCapability("ui", "ime_registrar")
-            .RequireCapability("ui", "input_device_controller")
-            .RequireCapability("ui", "window_manager")
-            .RequireCapability("unzip", "unzip_file")
-            .RequireCapability("util_win", "util_win")
-            .RequireCapability("wifi_util_win", "wifi_credentials")
-            .RequireCapability("video_capture", "capture")
-            .RequireCapability("xr_device_service", "xr_device_provider")
-            .RequireCapability("xr_device_service", "xr_device_test_hook")
+                              rappor::mojom::RapporRecorder,
+                              safe_browsing::mojom::SafeBrowsing>())
+        .RequireCapability("apps", "app_service")
+        .RequireCapability("ash", "system_ui")
+        // Used by ShelfTestApi and ShelfIntegrationTestApi
+        .RequireCapability("ash", "test")
+        .RequireCapability("ash", "display")
+        // Only used in the classic Ash case
+        .RequireCapability("ash_pref_connector", "pref_connector")
+        .RequireCapability("assistant", "assistant")
+        .RequireCapability("cellular_setup", "cellular_setup")
+        // Only used in the classic Ash case
+        .RequireCapability("chrome", "input_device_controller")
+        .RequireCapability("chrome_printing", "converter")
+        .RequireCapability("content_system", "profiling_client")
+        .RequireCapability("cups_ipp_parser", "ipp_parser")
+        .RequireCapability("device", "device:fingerprint")
+        .RequireCapability("device", "device:geolocation_config")
+        .RequireCapability("device", "device:geolocation_control")
+        .RequireCapability("device", "device:ip_geolocator")
+        .RequireCapability("device_sync", "device_sync")
+        .RequireCapability("file_util", "analyze_archive")
+        .RequireCapability("file_util", "zip_file")
+        .RequireCapability("heap_profiling", "heap_profiler")
+        .RequireCapability("heap_profiling", "profiling")
+        .RequireCapability("identity", "identity_accessor")
+        .RequireCapability(image_annotation::mojom::kServiceName,
+                           image_annotation::mojom::kAnnotationCapability)
+        .RequireCapability("ime", "input_engine")
+        // Only used in the classic Ash case
+        .RequireCapability("local_state", "pref_client")
+        .RequireCapability("media_gallery_util", "parse_media")
+        .RequireCapability("mirroring", "mirroring")
+        .RequireCapability("multidevice_setup", "multidevice_setup")
+        .RequireCapability("nacl_broker", "browser")
+        .RequireCapability("nacl_loader", "browser")
+        .RequireCapability("noop", "noop")
+        .RequireCapability("patch", "patch_file")
+        .RequireCapability("pdf_compositor", "compositor")
+        .RequireCapability("preferences", "pref_client")
+        .RequireCapability("preferences", "pref_control")
+        .RequireCapability("profile_import", "import")
+        .RequireCapability("proxy_resolver", "factory")
+        .RequireCapability(quarantine::mojom::kServiceName,
+                           quarantine::mojom::kQuarantineFileCapability)
+        .RequireCapability("removable_storage_writer",
+                           "removable_storage_writer")
+        .RequireCapability("secure_channel", "secure_channel")
+        .RequireCapability("ui", "ime_registrar")
+        .RequireCapability("ui", "input_device_controller")
+        .RequireCapability("ui", "window_manager")
+        .RequireCapability("unzip", "unzip_file")
+        .RequireCapability("util_win", "util_win")
+        .RequireCapability("wifi_util_win", "wifi_credentials")
+        .RequireCapability("video_capture", "capture")
+        .RequireCapability("xr_device_service", "xr_device_provider")
+        .RequireCapability("xr_device_service", "xr_device_test_hook")
 #if defined(OS_CHROMEOS)
-            .RequireCapability(
-                chromeos::network_config::mojom::kServiceName,
-                chromeos::network_config::mojom::kNetworkConfigCapability)
-            // This is required for remoting, which runs in the browser and
-            // injects events.
-            .RequireCapability(ws::mojom::kServiceName, "privileged")
-            .ExposeInterfaceFilterCapability_Deprecated(
-                "navigation:frame", "cellular_setup",
-                service_manager::Manifest::InterfaceList<
-                    chromeos::cellular_setup::mojom::CellularSetup>())
-            .ExposeInterfaceFilterCapability_Deprecated(
-                "navigation:frame", "multidevice_setup",
-                service_manager::Manifest::InterfaceList<
-                    chromeos::multidevice_setup::mojom::MultiDeviceSetup,
-                    chromeos::multidevice_setup::mojom::
-                        PrivilegedHostDeviceSetter>())
+        .RequireCapability(
+            chromeos::network_config::mojom::kServiceName,
+            chromeos::network_config::mojom::kNetworkConfigCapability)
+        .ExposeInterfaceFilterCapability_Deprecated(
+            "navigation:frame", "cellular_setup",
+            service_manager::Manifest::InterfaceList<
+                chromeos::cellular_setup::mojom::CellularSetup>())
+        .ExposeInterfaceFilterCapability_Deprecated(
+            "navigation:frame", "multidevice_setup",
+            service_manager::Manifest::InterfaceList<
+                chromeos::multidevice_setup::mojom::MultiDeviceSetup,
+                chromeos::multidevice_setup::mojom::
+                    PrivilegedHostDeviceSetter>())
 #endif
-            .ExposeInterfaceFilterCapability_Deprecated(
-                "navigation:frame", "renderer",
-                service_manager::Manifest::InterfaceList<
-                    autofill::mojom::AutofillDriver,
-                    autofill::mojom::PasswordManagerDriver,
-                    blink::mojom::BadgeService,
-                    blink::mojom::InstalledAppProvider,
+        .ExposeInterfaceFilterCapability_Deprecated(
+            "navigation:frame", "renderer",
+            service_manager::Manifest::InterfaceList<
+                autofill::mojom::AutofillDriver,
+                autofill::mojom::PasswordManagerDriver,
+                blink::mojom::BadgeService, blink::mojom::InstalledAppProvider,
 #if defined(BROWSER_MEDIA_CONTROLS_MENU)
-                    blink::mojom::MediaControlsMenuHost,
+                blink::mojom::MediaControlsMenuHost,
 #endif
-                    blink::mojom::ShareService,
+                blink::mojom::ShareService,
 #if defined(ENABLE_SPATIAL_NAVIGATION_HOST)
-                    blink::mojom::SpatialNavigationHost,
+                blink::mojom::SpatialNavigationHost,
 #endif
-                    blink::mojom::TextSuggestionHost,
-                    chrome::mojom::OfflinePageAutoFetcher,
-                    chrome::mojom::PrerenderCanceler,
+                blink::mojom::TextSuggestionHost,
+                chrome::mojom::OfflinePageAutoFetcher,
+                chrome::mojom::PrerenderCanceler,
 #if defined(OS_CHROMEOS)
-                    chromeos::ime::mojom::InputEngineManager,
-                    chromeos::kiosk_next_home::mojom::
-                        KioskNextHomeInterfaceBroker,
-                    chromeos::machine_learning::mojom::PageHandler,
-                    chromeos::media_perception::mojom::MediaPerception,
-                    chromeos::supervision::mojom::OnboardingController,
-                    cros::mojom::CrosImageCapture,
+                chromeos::ime::mojom::InputEngineManager,
+                chromeos::kiosk_next_home::mojom::KioskNextHomeInterfaceBroker,
+                chromeos::machine_learning::mojom::PageHandler,
+                chromeos::media_perception::mojom::MediaPerception,
+                chromeos::supervision::mojom::OnboardingController,
+                cros::mojom::CrosImageCapture,
 #endif
-                    contextual_search::mojom::ContextualSearchJsApiService,
-                    dom_distiller::mojom::DistillabilityService,
-                    dom_distiller::mojom::DistillerJavaScriptService,
+                contextual_search::mojom::ContextualSearchJsApiService,
+                dom_distiller::mojom::DistillabilityService,
+                dom_distiller::mojom::DistillerJavaScriptService,
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-                    extensions::KeepAlive,
-                    extensions::mime_handler::BeforeUnloadControl,
-                    extensions::mime_handler::MimeHandlerService,
+                extensions::KeepAlive,
+                extensions::mime_handler::BeforeUnloadControl,
+                extensions::mime_handler::MimeHandlerService,
 #endif
-                    image_annotation::mojom::Annotator,
-                    media::mojom::MediaEngagementScoreDetailsProvider,
-                    media_router::mojom::MediaRouter,
-                    page_load_metrics::mojom::PageLoadMetrics,
-                    translate::mojom::ContentTranslateDriver,
+                image_annotation::mojom::Annotator,
+                media::mojom::MediaEngagementScoreDetailsProvider,
+                media_router::mojom::MediaRouter,
+                page_load_metrics::mojom::PageLoadMetrics,
+                translate::mojom::ContentTranslateDriver,
 
-                    // WebUI-only interfaces go below this line. These should be
-                    // brokered through a dedicated interface, but they're here
-                    // for for now.
-                    downloads::mojom::PageHandlerFactory,
-                    feed_internals::mojom::PageHandler,
+                // WebUI-only interfaces go below this line. These should be
+                // brokered through a dedicated interface, but they're here
+                // for for now.
+                downloads::mojom::PageHandlerFactory,
+                feed_internals::mojom::PageHandler,
 #if defined(OS_ANDROID)
-                    explore_sites_internals::mojom::PageHandler,
+                explore_sites_internals::mojom::PageHandler,
 #else
-                    app_management::mojom::PageHandlerFactory,
+                app_management::mojom::PageHandlerFactory,
 #endif
 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
     defined(OS_CHROMEOS)
-                    mojom::DiscardsDetailsProvider,
-                    performance_manager::mojom::WebUIGraphDump,
+                mojom::DiscardsDetailsProvider,
+                performance_manager::mojom::WebUIGraphDump,
 #endif
 #if defined(OS_CHROMEOS)
-                    add_supervision::mojom::AddSupervisionHandler,
+                add_supervision::mojom::AddSupervisionHandler,
 #endif
-                    mojom::BluetoothInternalsHandler,
-                    mojom::InterventionsInternalsPageHandler,
-                    mojom::OmniboxPageHandler, mojom::ResetPasswordHandler,
-                    mojom::SiteEngagementDetailsProvider,
-                    mojom::UsbInternalsPageHandler,
-                    snippets_internals::mojom::PageHandlerFactory,
-                    web_ui_test::mojom::TestRunner>())
-            .PackageService(identity::GetManifest())
-            .PackageService(image_annotation::GetManifest())
-            .PackageService(prefs::GetManifest())
+                mojom::BluetoothInternalsHandler,
+                mojom::InterventionsInternalsPageHandler,
+                mojom::OmniboxPageHandler, mojom::ResetPasswordHandler,
+                mojom::SiteEngagementDetailsProvider,
+                mojom::UsbInternalsPageHandler,
+                snippets_internals::mojom::PageHandlerFactory,
+                web_ui_test::mojom::TestRunner>())
+        .PackageService(identity::GetManifest())
+        .PackageService(image_annotation::GetManifest())
+        .PackageService(prefs::GetManifest())
 #if defined(OS_CHROMEOS)
-            .PackageService(chromeos::device_sync::GetManifest())
-            .PackageService(chromeos::multidevice_setup::GetManifest())
+        .PackageService(chromeos::device_sync::GetManifest())
+        .PackageService(chromeos::multidevice_setup::GetManifest())
 #if BUILDFLAG(ENABLE_CROS_ASSISTANT)
-            .PackageService(chromeos::assistant::GetManifest())
+        .PackageService(chromeos::assistant::GetManifest())
 #endif
 #endif  // defined(OS_CHROMEOS)
 #if !defined(OS_ANDROID)
-            .PackageService(apps::GetManifest())
+        .PackageService(apps::GetManifest())
 #endif
-            .Build())
+        .Build()
   };
   return *manifest;
 }
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index ef5a52e..9be53a6 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3258,6 +3258,12 @@
   <message name="IDS_USB_PRINTER_NOTIFICATION_CONNECTED_MESSAGE" desc="Message displayed when the USB printer is connected successfully.">
     <ph name="PRINTER_NAME">$1<ex> Google InkJet 1234</ex></ph> is connected and ready
   </message>
+  <message name="IDS_USB_PRINTER_NOTIFICATION_CONFIGURATION_REQUIRED_TITLE" desc="Title of the USB printer needs configuration notification.">
+    USB printer needs configuration
+  </message>
+  <message name="IDS_USB_PRINTER_NOTIFICATION_CONFIGURATION_REQUIRED_MESSAGE" desc="Message displayed when the USB printer is connected but needs configuration.">
+    <ph name="PRINTER_NAME">$1<ex> Google InkJet 1234</ex></ph> is connected but needs configuration
+  </message>
 
   <!-- RequestPin dialog messages -->
   <message name="IDS_REQUEST_PIN_DIALOG_HEADER" desc="The text displayed in the certificate provider PIN request dialog.">
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb
index cf75803..cf2dcd1 100644
--- a/chrome/app/resources/chromium_strings_am.xtb
+++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">የእርስዎ <ph name="DEVICE_TYPE" /> የተዘመነ ነው።</translation>
 <translation id="8697124171261953979">እንዲሁም Chromiumን ሲጀምሩት ወይም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገጽ ይቆጣጠራል።</translation>
 <translation id="8704119203788522458">ይሄ የእርስዎ Chromium ነው</translation>
-<translation id="8704255848199359374">ይህ በ Google ፍለጋ ውስጥ ጥቅም ላይ ጋር ተመሳሳይ የፊደል አራሚ ይጠቀማል። በአሳሽ ውስጥ የሚተይቡት ጽሑፍ ወደ Google ይላካል። ይህን ባህሪ ሁልጊዜ በቅንብሮች ውስጥ መለወጥ ይችላሉ።</translation>
 <translation id="8748383401829947534">ሁሉንም የChromium ቅጂዎች ያቋርጡ።</translation>
 <translation id="8796602469536043152">Chromium ለዚህ ጣቢያ የእርስዎን ካሜራ እና ማይክሮፎን ለመድረስ ፈቃድ ያስፈልገዋል</translation>
 <translation id="8803635938069941624">የChromium OS ውል</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index e22241c..a697301 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">جهاز <ph name="DEVICE_TYPE" /> مُحدّث.</translation>
 <translation id="8697124171261953979">‏كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chromium أو إجراء بحث من المربع متعدد الاستخدامات.</translation>
 <translation id="8704119203788522458">‏هذا هو Chromium الخاص بك</translation>
-<translation id="8704255848199359374">‏يستخدم هذا المتصفِّح المدقق الإملائي نفسه الذي يتم استخدامه في "بحث Google". يتم إرسال النص الذي تكتبه في المتصفِّح إلى Google. يمكنك دائمًا تغيير هذا السلوك في الإعدادات.</translation>
 <translation id="8748383401829947534">‏الخروج من جميع نُسخ Chromium.</translation>
 <translation id="8796602469536043152">‏يحتاج Chromium إلى إذن للوصول إلى الكاميرا والميكروفون من أجل موقع الويب هذا.</translation>
 <translation id="8803635938069941624">‏بنود نظام تشغيل Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb
index 73f26eb..66a9f80 100644
--- a/chrome/app/resources/chromium_strings_bg.xtb
+++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -250,7 +250,6 @@
 <translation id="8667808506758191620">Устройството ви <ph name="DEVICE_TYPE" /> е актуално.</translation>
 <translation id="8697124171261953979">То също контролира коя страница се показва при стартиране на Chromium или при търсене от полето за всичко.</translation>
 <translation id="8704119203788522458">Това е вашият Chromium</translation>
-<translation id="8704255848199359374">Използва се същата програма за проверка на правописа като в Google Търсене. Текстът, който въвеждате в браузъра, се изпраща до Google. Винаги можете да промените това поведение от настройките.</translation>
 <translation id="8748383401829947534">Затваряне на всички копия на Chromium.</translation>
 <translation id="8796602469536043152">Chromium се нуждае от разрешение за достъп до камерата и микрофона ви за този сайт</translation>
 <translation id="8803635938069941624">Общи условия на Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb
index 316ae84..8e98b5d 100644
--- a/chrome/app/resources/chromium_strings_bn.xtb
+++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -254,7 +254,6 @@
 <translation id="8667808506758191620">আপনার <ph name="DEVICE_TYPE" /> আপ টু ডেট রয়েছে।</translation>
 <translation id="8697124171261953979">আপনি Chromium শুরু করলে বা Omnibox থেকে সার্চ করলে কোন পৃষ্ঠাটি দেখানো হবে তাও এটি নিয়ন্ত্রণ করে।</translation>
 <translation id="8704119203788522458">এটি হল আপনার Chromium</translation>
-<translation id="8704255848199359374">Google সার্চে যে বানান পরীক্ষক ব্যবহৃত হয় এটিও সেটিই ব্যবহার করে। আপনি ব্রাউজারে যে টেক্সট লেখেন, সেটি Google-এ পাঠানো হয়। সেটিংসে গিয়ে এই আচরণটি পরিবর্তন করতে পারেন।</translation>
 <translation id="8748383401829947534">Chromium-এর সবকটি কপি বন্ধ করুন।</translation>
 <translation id="8796602469536043152">এই সাইটটির জন্য Chromium কে আপনার ক্যামেরা এবং মাইক্রোফোনে অ্যাক্সেস দিতে হবে</translation>
 <translation id="8803635938069941624">Chromium OS শর্তাদি</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb
index f5c9b3ec..912ccfb 100644
--- a/chrome/app/resources/chromium_strings_ca.xtb
+++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">El dispositiu <ph name="DEVICE_TYPE" /> està actualitzat.</translation>
 <translation id="8697124171261953979">També controla la pàgina que es mostra quan inicieu Chromium o quan feu una cerca des de l'omnibox.</translation>
 <translation id="8704119203788522458">Aquest és el vostre Chromium</translation>
-<translation id="8704255848199359374">Fa servir el mateix corrector ortogràfic que s'utilitza a la Cerca de Google. El text que escrius al navegador s'envia a Google. Pots canviar aquest comportament sempre que vulguis a la configuració.</translation>
 <translation id="8748383401829947534">Tanca totes les còpies de Chromium.</translation>
 <translation id="8796602469536043152">Per visitar aquest lloc web, Chromium necessita permís per accedir a la càmera i al micròfon</translation>
 <translation id="8803635938069941624">Condicions de Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb
index a61d9ac..bd979015 100644
--- a/chrome/app/resources/chromium_strings_cs.xtb
+++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">Vaše zařízení <ph name="DEVICE_TYPE" /> je aktuální.</translation>
 <translation id="8697124171261953979">Také řídí, která stránka se zobrazí po spuštění prohlížeče Chromium nebo při vyhledávání v omniboxu.</translation>
 <translation id="8704119203788522458">Toto je váš prohlížeč Chromium</translation>
-<translation id="8704255848199359374">Tato funkce využívá stejnou službu kontroly pravopisu, jaká se používá ve vyhledávání Google. Text, který v prohlížeči zadáte, se odešle do Googlu. Toto chování můžete kdykoliv změnit v nastavení.</translation>
 <translation id="8748383401829947534">Ukončete všechny kopie prohlížeče Chromium</translation>
 <translation id="8796602469536043152">Chromium pro tento web potřebuje oprávnění k přístupu k fotoaparátu a mikrofonu</translation>
 <translation id="8803635938069941624">Smluvní podmínky systému Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb
index ebafaa43..c8fc91bbe 100644
--- a/chrome/app/resources/chromium_strings_da.xtb
+++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">Din <ph name="DEVICE_TYPE" /> er opdateret.</translation>
 <translation id="8697124171261953979">Den styrer også, hvilken side der vises, når du åbner Chromium eller søger via omnifeltet.</translation>
 <translation id="8704119203788522458">Dette er din Chromium-browser</translation>
-<translation id="8704255848199359374">Dette anvender den samme stavekontrol, som anvendes i Google Søgning. Tekst, som du angiver i browseren, sendes til Google. Du kan altid ændre dette i indstillingerne.</translation>
 <translation id="8748383401829947534">Luk alle kopier af Chromium.</translation>
 <translation id="8796602469536043152">Chromium skal have tilladelse til at bruge dit kamera og din mikrofon på dette website</translation>
 <translation id="8803635938069941624">Vilkår for Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb
index b74be3b..1dd8c36 100644
--- a/chrome/app/resources/chromium_strings_de.xtb
+++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -51,7 +51,7 @@
 <translation id="2718390899429598676">Chromium verschlüsselt Ihre Daten zur Erhöhung der Sicherheit.</translation>
 <translation id="2770231113462710648">Standardbrowser ändern in:</translation>
 <translation id="2799223571221894425">Neu starten</translation>
-<translation id="2838154144102149890">Zum Aktualisieren muss Chromium auf diesem Computer geschlossen werden. Andere Nutzer, die an diesem Computer angemeldet sind, verlieren dann eventuell nicht gespeicherte Änderungen.</translation>
+<translation id="2838154144102149890">Zum Aktualisieren muss Chromium auf diesem Computer geschlossen werden. Nicht gespeicherte Änderungen von anderen Nutzern, die auf diesem Computer angemeldet sind, gehen dann eventuell verloren.</translation>
 <translation id="2847479871509788944">Aus Chromium entfernen...</translation>
 <translation id="2886012850691518054">Optional: Unterstützen Sie Google bei der Verbesserung von Chromium durch automatisches Senden von Nutzungsstatistiken und Absturzberichten.</translation>
 <translation id="2898082584336937987">Installieren Sie Chromium auf Ihrem Smartphone. Wir senden Ihnen eine SMS an: <ph name="PHONE_NUMBER" />.</translation>
@@ -186,7 +186,7 @@
 <translation id="6810143991807788455">Helfen Sie uns mit Ihrem Feedback zu den aktuellen Einstellungen bei der Verbesserung von Chromium.</translation>
 <translation id="6857782730669500492">Chromium – <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay (in Chromium kopiert)</translation>
-<translation id="6868056391275687737">Andere Instanzen von Chromium werden ausgeführt. Bitte schließen Sie diese, um zu aktualisieren.</translation>
+<translation id="6868056391275687737">Andere Instanzen von Chromium sind noch aktiv. Bitte schließen Sie diese, um den Browser zu aktualisieren.</translation>
 <translation id="6893813176749746474">Chromium wurde aktualisiert, Sie haben den Browser jedoch mindestens 30 Tage nicht verwendet.</translation>
 <translation id="6964305034639999644">Link in Chromium-Inkognito-Fenster öffnen</translation>
 <translation id="6970811910055250180">Ihr Gerät wird aktualisiert...</translation>
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">Ihr <ph name="DEVICE_TYPE" /> ist auf dem neuesten Stand.</translation>
 <translation id="8697124171261953979">Die Erweiterung legt auch fest, welche Seite beim Start von Chromium oder bei der Suche über die Omnibox angezeigt wird.</translation>
 <translation id="8704119203788522458">Dies ist Ihr persönlicher Chromium-Browser</translation>
-<translation id="8704255848199359374">Es wird dieselbe Rechtschreibprüfung wie in der Google-Suche verwendet. Der in den Browser eingegebene Text wird an Google gesendet. Sie können dies jederzeit in den Einstellungen ändern.</translation>
 <translation id="8748383401829947534">Alle Instanzen von Chromium schließen.</translation>
 <translation id="8796602469536043152">Chromium benötigt für diese Website die Berechtigung, auf Ihre Kamera und Ihr Mikrofon zuzugreifen</translation>
 <translation id="8803635938069941624">Chromium OS-Nutzungsbedingungen</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb
index 177b74a0..d3cd2eb6 100644
--- a/chrome/app/resources/chromium_strings_el.xtb
+++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">Το <ph name="DEVICE_TYPE" /> είναι ενημερωμένο.</translation>
 <translation id="8697124171261953979">Επίσης, ελέγχει τη σελίδα που εμφανίζεται κατά την εκκίνηση του Chromium ή όταν κάνετε αναζήτηση από το κύριο πλαίσιο.</translation>
 <translation id="8704119203788522458">Ορίστε το δικό σας Chromium</translation>
-<translation id="8704255848199359374">Αυτό χρησιμοποιεί τον ίδιο ορθογραφικό έλεγχο που χρησιμοποιείται στην Αναζήτηση Google. Το κείμενο που πληκτρολογείτε στο πρόγραμμα περιήγησης αποστέλλεται στην Google. Μπορείτε ανά πάσα στιγμή να αλλάξετε αυτήν τη συμπεριφορά στις ρυθμίσεις.</translation>
 <translation id="8748383401829947534">Κλείσιμο όλων των αντιγράφων του Chromium.</translation>
 <translation id="8796602469536043152">Το Chromium χρειάζεται άδεια, για να αποκτήσει πρόσβαση στην κάμερα και στο μικρόφωνο για αυτόν τον ιστότοπο</translation>
 <translation id="8803635938069941624">Όροι του Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb
index 0feba159..7bb7103bb 100644
--- a/chrome/app/resources/chromium_strings_en-GB.xtb
+++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">Your <ph name="DEVICE_TYPE" /> is up to date.</translation>
 <translation id="8697124171261953979">It also controls what page is shown when you start Chromium or search from the Omnibox.</translation>
 <translation id="8704119203788522458">This is your Chromium</translation>
-<translation id="8704255848199359374">This uses the same spellchecker that's used in Google search. Text that you type in the browser is sent to Google. You can always change this behaviour in settings.</translation>
 <translation id="8748383401829947534">Quit all copies of Chromium.</translation>
 <translation id="8796602469536043152">Chromium needs permission to access your camera and microphone for this site</translation>
 <translation id="8803635938069941624">Chromium OS terms</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb
index 7f304afef..1748d34 100644
--- a/chrome/app/resources/chromium_strings_es-419.xtb
+++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -250,8 +250,7 @@
 <translation id="8667808506758191620">Tu <ph name="DEVICE_TYPE" /> está actualizado.</translation>
 <translation id="8697124171261953979">También controla qué página se muestra al iniciar Chromium o al realizar búsquedas desde el cuadro multifunción.</translation>
 <translation id="8704119203788522458">Este es tu Chromium</translation>
-<translation id="8704255848199359374">Se usará el mismo corrector ortográfico que se emplea en la Búsqueda de Google. El texto que escribas en el navegador se enviará a Google. Puedes modificar este comportamiento en la configuración en cualquier momento.</translation>
-<translation id="8748383401829947534">Sal de todas las copias de Chromium.</translation>
+<translation id="8748383401829947534">Sal de todas las copias de Chromium</translation>
 <translation id="8796602469536043152">Chromium necesita permiso para acceder a tu cámara y micrófono para este sitio</translation>
 <translation id="8803635938069941624">Condiciones del Sistema operativo Chromium</translation>
 <translation id="8821041990367117597">Chromium no pudo sincronizar los datos porque los datos de acceso de la cuenta están obsoletos.</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb
index b27e6755..5512cce216 100644
--- a/chrome/app/resources/chromium_strings_es.xtb
+++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">El dispositivo <ph name="DEVICE_TYPE" /> está actualizado.</translation>
 <translation id="8697124171261953979">También controla qué página se muestra al iniciar Chromium o al hacer búsquedas desde el omnibox.</translation>
 <translation id="8704119203788522458">Aquí tienes tu navegador Chromium</translation>
-<translation id="8704255848199359374">Utiliza el mismo corrector ortográfico que se usa en la Búsqueda de Google. El texto que escribas en el navegador se enviará a Google. Puedes cambiar esta opción en los ajustes.</translation>
 <translation id="8748383401829947534">Cerrar todas las instancias de Chromium.</translation>
 <translation id="8796602469536043152">Chromium necesita permiso para acceder a la cámara y al micrófono en este sitio web</translation>
 <translation id="8803635938069941624">Condiciones de Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb
index 348e44ea..741b5cf18 100644
--- a/chrome/app/resources/chromium_strings_et.xtb
+++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">Teie <ph name="DEVICE_TYPE" /> on ajakohane.</translation>
 <translation id="8697124171261953979">Lisaks juhib see seda, mis leht kuvatakse Chromiumi käivitamisel või omnikastikeses otsingu tegemisel.</translation>
 <translation id="8704119203788522458">See on teie Chromium</translation>
-<translation id="8704255848199359374">See kasutab sama õigekirjakontrolli, mida kasutatakse Google'i otsingus. Brauseris sisestatav tekst saadetakse Google'ile. Seda käitumist saab seadetes alati muuta.</translation>
 <translation id="8748383401829947534">Sulgege kõik Chromiumi eksemplarid.</translation>
 <translation id="8796602469536043152">Chromium vajab selle saidi puhul luba, et teie kaamerale ja mikrofonile juurde pääseda</translation>
 <translation id="8803635938069941624">Chromium OS-i tingimused</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb
index 3c4c9347..e48be54 100644
--- a/chrome/app/resources/chromium_strings_fa.xtb
+++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -254,7 +254,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> شما به‌ روز است.</translation>
 <translation id="8697124171261953979">‏این برنامه همچنین صفحه‌ای را که هنگام راه‌اندازی Chromium یا جستجو از Omnibox نشان داده می‌شود، کنترل می‌کند.</translation>
 <translation id="8704119203788522458">‏این Chromium شماست</translation>
-<translation id="8704255848199359374">‏این مورد از همان غلط‌گیر املایی‌ای استفاده می‌کند که در جستجوی Google استفاده می‌شود. نوشتاری که در مرورگر تایپ کرده‌اید برای Google ارسال می‌شود. هروقت بخواهید می‌توانید این رفتار را در تنظیمات تغییر دهید.</translation>
 <translation id="8748383401829947534">‏از همه نسخه‌های Chromium خارج شوید.</translation>
 <translation id="8796602469536043152">‏Chromium به مجوز دسترسی به دوربین و میکروفون برای این سایت نیاز دارد</translation>
 <translation id="8803635938069941624">‏شرایط Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb
index bb12324e..cbc8d10 100644
--- a/chrome/app/resources/chromium_strings_fi.xtb
+++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> on ajan tasalla.</translation>
 <translation id="8697124171261953979">Määrittää myös Chromiumin ja omnibox-hakujen aloitussivun.</translation>
 <translation id="8704119203788522458">Tämä on oma Chromiumisi</translation>
-<translation id="8704255848199359374">Tämä käyttää samaa oikeinkirjoituksen tarkistusta kuin Google Haku. Selaimeen kirjoittamasi teksti lähetetään Googlelle. Voit muuttaa tätä milloin tahansa asetuksista.</translation>
 <translation id="8748383401829947534">Lopeta kaikki Chromium-kopiot</translation>
 <translation id="8796602469536043152">Chromium tarvitsee oikeuden käyttää kameraasi ja mikrofoniasi tällä sivustolla.</translation>
 <translation id="8803635938069941624">Chromium-käyttöjärjestelmän käyttöehdot</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index b1d08a3..8a118bfe 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">Napapanahon ang iyong <ph name="DEVICE_TYPE" />.</translation>
 <translation id="8697124171261953979">Kinokontrol din nito kung anong pahina ang ipinapakita kapag sinimulan mo ang Chromium o naghanap mula sa Omnibox.</translation>
 <translation id="8704119203788522458">Ito ang iyong Chromium</translation>
-<translation id="8704255848199359374">Ginagamit nito ang parehong spellchecker na ginagamit sa paghahanap sa Google. Ipinapadala sa Google ang text na tina-type mo sa browser. Puwede mong baguhin palagi ang gawi na ito sa mga setting.</translation>
 <translation id="8748383401829947534">Ihinto ang lahat ng kopya ng Chromium.</translation>
 <translation id="8796602469536043152">Kailangan ng Chromium ng pahintulot na i-access ang iyong camera at mikropono para sa site na ito</translation>
 <translation id="8803635938069941624">Mga tuntunin ng Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb
index 584de27..b22ad7c 100644
--- a/chrome/app/resources/chromium_strings_fr.xtb
+++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -257,7 +257,6 @@
 <translation id="8667808506758191620">Votre <ph name="DEVICE_TYPE" /> est à jour.</translation>
 <translation id="8697124171261953979">Elle contrôle également la page qui s'affiche au démarrage de Chromium ou lorsque vous effectuez une recherche dans l'omnibox.</translation>
 <translation id="8704119203788522458">Voici votre Chromium</translation>
-<translation id="8704255848199359374">Le correcteur orthographique utilisé est le même que celui employé dans la recherche Google. Le texte que vous saisissez dans le navigateur est envoyé à Google. Vous pouvez toujours modifier ce comportement dans les paramètres.</translation>
 <translation id="8748383401829947534">Fermez toutes les copies de Chromium.</translation>
 <translation id="8796602469536043152">Chromium a besoin de votre autorisation pour accéder à votre appareil photo et à votre micro pour ce site</translation>
 <translation id="8803635938069941624">Conditions d'utilisation de Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb
index aa82faa..38886a86 100644
--- a/chrome/app/resources/chromium_strings_gu.xtb
+++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">તમારું <ph name="DEVICE_TYPE" /> અપ ટૂ ડેટ છે.</translation>
 <translation id="8697124171261953979">જ્યારે તમે Chromium શરૂ કરો અથવા ઑમ્નિબૉક્સ પરથી શોધ કરો ત્યારે કયું પૃષ્ઠ બતાવવામાં આવે તે તેનું પણ નિયંત્રણ કરે છે.</translation>
 <translation id="8704119203788522458">આ તમારું Chromium છે</translation>
-<translation id="8704255848199359374">આ પણ Google શોધમાં જે જોડણી તપાસનારનો ઉપયોગ થાય છે તેનો જ ઉપયોગ કરે છે. તમે બાઉઝરમાં ટાઇપ કરો છો તે ટેક્સ્ટ Googleને મોકલવામાં આવે છે. તમે સેટિંગમાં આ વર્તણૂકને હંમેશાં બદલી શકો છો.</translation>
 <translation id="8748383401829947534">Chromiumની બધી કૉપિ બંધ કરો.</translation>
 <translation id="8796602469536043152">Chromiumને આ સાઇટ માટે તમારા કૅમેરા અને માઇક્રોફોનના ઍક્સેસની પરવાનગીની જરૂર પડે છે</translation>
 <translation id="8803635938069941624">Chromium OS શરતો</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index 4863151..a4e1456b 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -130,7 +130,7 @@
 <translation id="5416696090975899932">अगर क्रोमियम के साथ आने वाला पीडीएफ़ व्यूअर मौजूद न हो, तो क्रोमियम प्रिंट की झलक नहीं दिखा पाएगा.</translation>
 <translation id="5427571867875391349">क्रोमियम को अपने डिफ़ॉल्ट ब्राउज़र के रूप में सेट करें</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - क्रोमियम बीटा</translation>
-<translation id="5466153949126434691">क्रोमियम अपने आप अपडेट हो जाता है ताकि आपके पास हमेशा सबसे नवीनतम वर्शन रहे. जब यह डाउनलोड पूर्ण हो जाता है, तो क्रोमियम फिर से प्रारंभ होगा और आप आगे बढ़ जाएंगे.</translation>
+<translation id="5466153949126434691">क्रोमियम अपने आप अपडेट हो जाता है ताकि आपके पास हमेशा सबसे नवीनतम वर्शन रहे. जब यह डाउनलोड पूरा हो जाता है, तो क्रोमियम फिर से शुरू होगा और आप आगे बढ़ जाएंगे.</translation>
 <translation id="5479196819031988440">क्रोमियम OS यह पेज नहीं खोल सकता.</translation>
 <translation id="5480860683791598150">इस साइट से आपकी जगह की जानकारी शेयर करने के लिए क्रोमियम को आपकी जगह की जानकारी का एक्सेस चाहिए</translation>
 <translation id="549669000822060376">कृपया क्रोमियम द्वारा नवीनतम सिस्टम अपडेट इंस्टॉल करने के दौरान प्रतीक्षा करें.</translation>
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">आपका <ph name="DEVICE_TYPE" /> अद्यतित है.</translation>
 <translation id="8697124171261953979">इससे यह भी नियंत्रित होता है कि जब आप क्रोमियम शुरू करते हैं या ऑम्निबॉक्स से खोजते हैं तब कौन सा पेज दिखाया जाए.</translation>
 <translation id="8704119203788522458">यह आपका क्रोमियम है</translation>
-<translation id="8704255848199359374">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो कुछ भी लिखते हैं उसे Google को भेज दिया जाता है. आप सेटिंग में जाकर इसे कभी भी बदल सकते हैं.</translation>
 <translation id="8748383401829947534">क्रोमियम की सभी कॉपी से बाहर निकलें.</translation>
 <translation id="8796602469536043152">क्रोमियम को इस साइट के लिए आपका कैमरा और माइक्रोफ़ोन एक्सेस करने की अनुमति चाहिए</translation>
 <translation id="8803635938069941624">क्रोमियम OS शर्तें</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb
index de9504f..786881a 100644
--- a/chrome/app/resources/chromium_strings_hr.xtb
+++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> je ažuriran.</translation>
 <translation id="8697124171261953979">Upravlja i time koja se stranica prikazuje prilikom pokretanja Chromiuma ili pretraživanja putem višenamjenskog okvira.</translation>
 <translation id="8704119203788522458">To je vaš Chromium</translation>
-<translation id="8704255848199359374">Upotrebljava istu provjeru pravopisa koja se upotrebljava na Google pretraživanju. Tekst koji unesete u preglednik šalje se Googleu. To ponašanje možete promijeniti u postavkama kad god želite.</translation>
 <translation id="8748383401829947534">Zatvorite sve primjerke Chromiuma.</translation>
 <translation id="8796602469536043152">Chromium treba dopuštenje za pristup kameri i mikrofonu za ovu web-lokaciju</translation>
 <translation id="8803635938069941624">Uvjeti OS-a Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb
index 2de2a1a..ed646c5 100644
--- a/chrome/app/resources/chromium_strings_hu.xtb
+++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -254,7 +254,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> eszköze naprakész.</translation>
 <translation id="8697124171261953979">Továbbá azt is szabályozza, hogy melyik oldal jelenik meg a Chromium indításakor vagy a cím- és keresősávban indított kereséskor.</translation>
 <translation id="8704119203788522458">Ez az Ön Chromiumja</translation>
-<translation id="8704255848199359374">A szolgáltatás ugyanazt a helyesírás-ellenőrzést használja, mint a Google Keresés. A rendszer elküldi a böngészőben begépelt szövegeket a Google-nak. A beállítások között ezt bármikor módosíthatja.</translation>
 <translation id="8748383401829947534">A Chromium összes példányát be kell zárnia.</translation>
 <translation id="8796602469536043152">A Chromiumnak engedélyre van szüksége ahhoz, hogy hozzáférjen a kamerához és a mikrofonhoz ennél a webhelynél</translation>
 <translation id="8803635938069941624">Chromium OS – Szerződési Feltételek</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb
index 4d9acd7..8aaa0dc 100644
--- a/chrome/app/resources/chromium_strings_id.xtb
+++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -186,7 +186,7 @@
 <translation id="6810143991807788455">Bantu menjadikan Chromium lebih baik dengan melaporkan setelan saat ini</translation>
 <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay (disalin ke Chromium)</translation>
-<translation id="6868056391275687737">Salinan Chromium lain sedang berjalan. Untuk mengupdate, tutup salinan tersebut.</translation>
+<translation id="6868056391275687737">Salinan Chromium lain sedang berjalan. Untuk menjalankan update, tutup salinan tersebut.</translation>
 <translation id="6893813176749746474">Chromium telah diperbarui, tetapi Anda belum menggunakannya selama setidaknya 30 hari.</translation>
 <translation id="6964305034639999644">Buka link di jendela sa&amp;maran Chromium</translation>
 <translation id="6970811910055250180">Memperbarui perangkat Anda...</translation>
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> Anda sudah diperbarui.</translation>
 <translation id="8697124171261953979">Juga mengontrol halaman apa yang ditampilkan saat Anda memulai Chromium atau menelusuri dari Omnibox.</translation>
 <translation id="8704119203788522458">Ini Chromium Anda</translation>
-<translation id="8704255848199359374">Tindakan ini akan menggunakan pemeriksa ejaan yang sama dengan yang digunakan di penelusuran Google. Teks yang Anda ketikkan di browser dikirim ke Google. Anda dapat mengubah perilaku ini di setelan.</translation>
 <translation id="8748383401829947534">Tutup semua salinan Chromium.</translation>
 <translation id="8796602469536043152">Chromium memerlukan izin akses ke kamera dan mikrofon untuk situs ini</translation>
 <translation id="8803635938069941624">Persyaratan Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb
index 30c57da..93e0725 100644
--- a/chrome/app/resources/chromium_strings_it.xtb
+++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">Il dispositivo <ph name="DEVICE_TYPE" /> è aggiornato.</translation>
 <translation id="8697124171261953979">Controlla anche la pagina visualizzata all'avvio di Chromium o quando esegui ricerche dalla Omnibox.</translation>
 <translation id="8704119203788522458">Questo è il tuo account Chromium</translation>
-<translation id="8704255848199359374">Viene usato lo stesso controllo ortografico utilizzato nella Ricerca Google. Il testo digitato nel browser viene inviato a Google. Puoi modificare questo comportamento in qualsiasi momento nelle impostazioni.</translation>
 <translation id="8748383401829947534">Chiudi tutte le copie di Chromium.</translation>
 <translation id="8796602469536043152">Per questo sito Chromium ha bisogno dell'autorizzazione ad accedere alla fotocamera e al microfono</translation>
 <translation id="8803635938069941624">Termini di Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index 101e701..ed375a5 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -254,7 +254,6 @@
 <translation id="8667808506758191620">ה-<ph name="DEVICE_TYPE" /> שלך מעודכן.</translation>
 <translation id="8697124171261953979">‏הגדרה זו גם קובעת איזה דף מוצג כשאתה מפעיל את Chromium או מבצע חיפוש מסרגל הכתובות.</translation>
 <translation id="8704119203788522458">‏זהו ה-Chromium שלך</translation>
-<translation id="8704255848199359374">‏התכונה משתמשת בבדיקת האיות שבה נעשה שימוש בחיפוש Google. הטקסט המוקלד בדפדפן נשלח אל Google. אפשר לשנות תמיד את ההתנהגות הזאת בהגדרות.</translation>
 <translation id="8748383401829947534">‏סגירת כל העותקים של Chromium.</translation>
 <translation id="8796602469536043152">‏Chromium זקוק להרשאת גישה אל המצלמה והמיקרופון בשביל האתר הזה</translation>
 <translation id="8803635938069941624">‏תנאים עבור מערכת ההפעלה של Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb
index 3bb5049..ef28658 100644
--- a/chrome/app/resources/chromium_strings_ja.xtb
+++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">お使いの <ph name="DEVICE_TYPE" /> は最新です。</translation>
 <translation id="8697124171261953979">この拡張機能では、Chromium の起動時、またはアドレスバーからの検索時に表示されるページも制御されます。</translation>
 <translation id="8704119203788522458">自分好みに設定</translation>
-<translation id="8704255848199359374">Google 検索と同じスペルチェックが使用されます。ブラウザに入力したテキストは Google に送信されます。この動作はいつでも設定で変更できます。</translation>
 <translation id="8748383401829947534">Chromium のすべてのコピーを終了します。</translation>
 <translation id="8796602469536043152">このサイトを利用するには、Chromium でカメラとマイクの使用を許可する必要があります</translation>
 <translation id="8803635938069941624">Chromium OS 利用規約</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb
index d3e12e1..a7cc23d 100644
--- a/chrome/app/resources/chromium_strings_kn.xtb
+++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -250,7 +250,6 @@
 <translation id="8667808506758191620">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ನವೀಕೃತವಾಗಿದೆ.</translation>
 <translation id="8697124171261953979">ನೀವು Chromium ಪ್ರಾರಂಭಿಸಿದಾಗ ಅಥವಾ ಓಮ್ನಿಬಾಕ್ಸ್‌ನಿಂದ ಹುಡುಕಿದಾಗ ತೋರಿಸಬೇಕಾದ ಪುಟವನ್ನು ಕೂಡಾ ಇದು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation>
 <translation id="8704119203788522458">ಇದು ನಿಮ್ಮ Chromium</translation>
-<translation id="8704255848199359374">ಇದು Google ಹುಡುಕಾಟದಲ್ಲಿ ಬಳಸಲಾದ ಅದೇ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಬಳಸುತ್ತದೆ. ನೀವು ಬ್ರೌಸರ್‌ನಲ್ಲಿ ಟೈಪ್ ಮಾಡುವ ಪಠ್ಯವನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ. ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನೀವು ಈ ವರ್ತನೆಯನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ ಬದಲಾಯಿಸಬಹುದು.</translation>
 <translation id="8748383401829947534">Chromium ನ ಎಲ್ಲಾ ನಕಲುಗಳನ್ನು ತ್ಯಜಿಸಿ.</translation>
 <translation id="8796602469536043152">ಈ ಸೈಟ್‌ಗಾಗಿ ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್‌ಗೆ ಪ್ರವೇಶಿಸಲು Chromium ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="8803635938069941624">Chromium OS ನಿಯಮಗಳು</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 198fe9d..705319a 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" />이(가) 최신 버전입니다.</translation>
 <translation id="8697124171261953979">또한 Chromium을 시작하거나 검색주소창에서 검색할 때 표시되는 페이지를 설정합니다.</translation>
 <translation id="8704119203788522458">나만의 Chromium</translation>
-<translation id="8704255848199359374">Google 검색과 동일한 맞춤법 검사기가 사용됩니다. 브라우저에 입력되는 텍스트는 Google로 전송됩니다. 설정에서 언제든지 이 동작을 변경할 수 있습니다.</translation>
 <translation id="8748383401829947534">모든 Chromium 버전 종료</translation>
 <translation id="8796602469536043152">이 사이트에서 카메라와 마이크에 액세스하려면 Chromium에 권한이 필요합니다</translation>
 <translation id="8803635938069941624">Chromium OS 용어</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb
index a8e4842..c6812727 100644
--- a/chrome/app/resources/chromium_strings_lt.xtb
+++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">Jūsų „<ph name="DEVICE_TYPE" />“ atnaujintas.</translation>
 <translation id="8697124171261953979">Ji taip pat kontroliuoja, koks puslapis rodomas, kai paleidžiate „Chromium“ arba ieškote „Omnibox“.</translation>
 <translation id="8704119203788522458">Tai jūsų „Chromium“</translation>
-<translation id="8704255848199359374">Naudojamas tas pats rašybos tikrinimas kaip ir „Google“ paieškoje. Tekstas, kurį įvedate naršyklėje, nusiunčiamas „Google“. Šį veikimą visada galite pakeisti nustatymuose.</translation>
 <translation id="8748383401829947534">Uždarykite visas „Chromium“ kopijas.</translation>
 <translation id="8796602469536043152">„Chromium“ reikia leidimo, kad galėtų naudoti fotoaparatą ir mikrofoną šioje svetainėje</translation>
 <translation id="8803635938069941624">„Chromium“ OS sąlygos</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb
index e166e25b..4787d6f 100644
--- a/chrome/app/resources/chromium_strings_lv.xtb
+++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -254,7 +254,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> ierīce ir atjaunināta.</translation>
 <translation id="8697124171261953979">Tas nosaka arī to, kāda lapa tiks rādīta, kad atvērsiet pārlūku Chromium vai meklēsiet, izmantojot universālo lodziņu.</translation>
 <translation id="8704119203788522458">Šis ir jūsu Chromium</translation>
-<translation id="8704255848199359374">Šeit tiek izmantota tā pati pareizrakstības pārbaude, kāda tiek izmantota Google meklēšanā. Pārlūkprogrammā ievadītais teksts tiek nosūtīts Google serveriem. Jebkurā brīdī varat mainīt šo darbību iestatījumos.</translation>
 <translation id="8748383401829947534">Aizveriet visas Chromium kopijas.</translation>
 <translation id="8796602469536043152">Pārlūkam Chromium ir nepieciešama atļauja piekļūt jūsu kamerai un mikrofonam šajā vietnē.</translation>
 <translation id="8803635938069941624">Chromium OS noteikumi</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb
index 7379d70..ee36fea 100644
--- a/chrome/app/resources/chromium_strings_ml.xtb
+++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -53,7 +53,7 @@
 <translation id="2718390899429598676">അധിക സുരക്ഷക്കായി, Chromium നിങ്ങളുടെ ഡാറ്റ എന്‍‌ക്രിപ്റ്റ് ചെയ്യും.</translation>
 <translation id="2770231113462710648">ഡിഫോൾട്ട് ബ്രൗസര്‍‌ ഇനിപ്പറയുന്നതിലേക്ക് മാറ്റുക:</translation>
 <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation>
-<translation id="2838154144102149890">അപ്‌ഡേറ്റ് ചെയ്യാൻ, ഈ കമ്പ്യൂട്ടറിൽ Chromium റൺ ചെയ്യുന്നത് നിർത്തേണ്ടതുണ്ട്. ഈ കമ്പ്യൂട്ടറിൽ ലോഗിൻ ചെയ്‌തിരിക്കുന്ന മറ്റ് ഉപയോക്താക്കളുടെ സംരക്ഷിക്കാത്ത മാറ്റങ്ങൾ നഷ്‌ടപ്പെടാൻ ഇത് കാരണമായേക്കാം.</translation>
+<translation id="2838154144102149890">അപ്ഡേറ്റ് ചെയ്യാൻ, ഈ കമ്പ്യൂട്ടറിൽ Chromium റൺ ചെയ്യുന്നത് നിർത്തേണ്ടതുണ്ട്. ഈ കമ്പ്യൂട്ടറിൽ ലോഗിൻ ചെയ്‌തിരിക്കുന്ന മറ്റ് ഉപയോക്താക്കളുടെ സംരക്ഷിക്കാത്ത മാറ്റങ്ങൾ നഷ്‌ടപ്പെടാൻ ഇത് കാരണമായേക്കാം.</translation>
 <translation id="2847479871509788944">Chromium-ൽ നിന്ന് നീക്കംചെയ്യുക...</translation>
 <translation id="2886012850691518054">ഓപ്‌ഷണൽ: ഉപയോഗ സ്ഥിതിവിവരക്കണക്കുകളും ക്രാഷ് റിപ്പോർട്ടുകളും Google-ലേക്ക് സ്വയമേവ അയയ്‌ക്കുന്നതിലൂടെ Chromium-ത്തിനെ മികച്ചതാക്കി മാറ്റാൻ സഹായിക്കുക.</translation>
 <translation id="2898082584336937987">നിങ്ങളുടെ ഫോണിൽ Chromium ഇൻസ്‌റ്റാൾ ചെയ്യുക. ഫോണിലേക്ക് ഞങ്ങളൊരു SMS അയയ്‌ക്കും: <ph name="PHONE_NUMBER" /></translation>
@@ -188,7 +188,7 @@
 <translation id="6810143991807788455">നിലവിലെ ക്രമീകരണങ്ങൾ റിപ്പോർട്ട് ചെയ്യുന്നതിലൂടെ Chromium മികച്ചതാക്കാൻ സഹായിക്കുക</translation>
 <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay (Chromium-ത്തിലേക്ക് പകർത്തി)</translation>
-<translation id="6868056391275687737">Chromium-ത്തിൻ്റെ മറ്റ് പകർപ്പുകൾ റൺ ചെയ്യുന്നുണ്ട്. അപ്‌ഡേറ്റ് ചെയ്യാൻ, അവ അടയ്ക്കുക.</translation>
+<translation id="6868056391275687737">Chromium-ത്തിൻ്റെ മറ്റ് പകർപ്പുകൾ റൺ ചെയ്യുന്നുണ്ട്. അപ്ഡേറ്റ് ചെയ്യാൻ അവ അടയ്ക്കുക.</translation>
 <translation id="6893813176749746474">Chromium അപ്‌ഡേറ്റുചെയ്‌തു, എന്നാൽ കുറഞ്ഞത് 30 ദിവസം പോലും നിങ്ങൾ ഇത് ഉപയോഗിച്ചില്ല.</translation>
 <translation id="6964305034639999644">Chromium അദൃശ്യ വിൻഡോയിൽ ലിങ്ക് തുറക്കുക</translation>
 <translation id="6970811910055250180">നിങ്ങളുടെ ഉപകരണം അപ്‌ഡേറ്റ് ചെയ്യുന്നു...</translation>
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> അപ്‌ ടു ഡേറ്റാണ്.</translation>
 <translation id="8697124171261953979">നിങ്ങൾ Chromium ആരംഭിക്കുമ്പോൾ അല്ലെങ്കിൽ ഓമ്‌നിബോക്‌സിൽ നിന്ന് തിരയുമ്പോൾ ദൃശ്യമാകുന്ന പേജും അത് നിയന്ത്രിയ്ക്കുന്നു.</translation>
 <translation id="8704119203788522458">ഇത് നിങ്ങളുടെ Chromium ആണ്</translation>
-<translation id="8704255848199359374">Google തിരയലിൽ ഉപയോഗിക്കുന്ന അതേ അക്ഷരത്തെറ്റ് പരിശോധന ഇത് ഉപയോഗിക്കുന്നു. ബ്രൗസറിൽ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന ടെക്‌സ്‌റ്റ് Google-ന് അയയ്ക്കുന്നു. ക്രമീകരണത്തിൽ എപ്പോഴും ഈ രീതി മാറ്റാനാകും.</translation>
 <translation id="8748383401829947534">Chromium-ത്തിൻ്റെ മുഴുവൻ പകർപ്പുകളും അവസാനിപ്പിക്കുക.</translation>
 <translation id="8796602469536043152">ഈ സൈറ്റിനായി, Chromium-ത്തിന് നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്‌സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation>
 <translation id="8803635938069941624">Chromium OS നിബന്ധനകൾ</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb
index e6511bb..e98a23d4 100644
--- a/chrome/app/resources/chromium_strings_mr.xtb
+++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">तुमचे <ph name="DEVICE_TYPE" /> अद्ययावत आहे.</translation>
 <translation id="8697124171261953979">तुम्ही Chromium सुरू करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
 <translation id="8704119203788522458">हे तुमचे Chromium आहे</translation>
-<translation id="8704255848199359374">Google शोध मध्ये वापरत असेलेले स्पेल चेकर वापरा. तुम्ही ब्राउझरमध्ये टाइप करत असलेला मजकूर Google कडे पाठवला जातो. तुम्ही हे वर्तन कधीही सेटिंग्ज मध्ये बदलू शकता.</translation>
 <translation id="8748383401829947534">Chromium च्या सर्व प्रती बंद करा.</translation>
 <translation id="8796602469536043152">या साइटसाठी Chromium ला तुमचा कॅमेरा आणि मायक्रोफोन अॅक्सेस करण्याची परवानगी हवी आहे</translation>
 <translation id="8803635938069941624">Chromium OS अटी</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index 4431f6c..37e3e4d 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> anda sudah dikemas kini.</translation>
 <translation id="8697124171261953979">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chromium atau membuat carian dari Kotak Omni.</translation>
 <translation id="8704119203788522458">Ini Chromium anda</translation>
-<translation id="8704255848199359374">Ini menggunakan penyemak ejaan yang sama seperti yang digunakan dalam carian Google. Teks yang anda taip dalam penyemak imbas akan dihantar kepada Google. Anda boleh menukar gelagat ini dalam tetapan pada bila-bila masa.</translation>
 <translation id="8748383401829947534">Tutup semua salinan Chromium.</translation>
 <translation id="8796602469536043152">Chromium memerlukan kebenaran untuk mengakses kamera dan mikrofon anda bagi tapak ini</translation>
 <translation id="8803635938069941624">Syarat Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb
index 5c30bb7..98998113f 100644
--- a/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">Je <ph name="DEVICE_TYPE" /> is up-to-date.</translation>
 <translation id="8697124171261953979">Hiermee wordt ook gecontroleerd welke pagina wordt weergegeven wanneer je Chromium start of vanuit de omnibox zoekt.</translation>
 <translation id="8704119203788522458">Personaliseer jouw Chromium</translation>
-<translation id="8704255848199359374">Hiervoor wordt dezelfde spellingcontrole gebruikt als voor Google Zoeken. Tekst die je in de browser typt wordt naar Google gestuurd. Je kunt dit altijd wijzigen in de instellingen.</translation>
 <translation id="8748383401829947534">Sluit alle exemplaren van Chromium.</translation>
 <translation id="8796602469536043152">Chromium heeft toegangsrechten voor je camera en microfoon nodig voor deze site</translation>
 <translation id="8803635938069941624">Voorwaarden van Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index 55ee649..3a94b18 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" />-enheten er oppdatert.</translation>
 <translation id="8697124171261953979">Den styrer også hvilken side som vises når du starter Chromium eller søker fra multifunksjonsfeltet.</translation>
 <translation id="8704119203788522458">Dette er din Chromium</translation>
-<translation id="8704255848199359374">Da brukes den samme stavekontrollen som i Google Søk. Tekst du skriver inn i nettleseren, sendes til Google. Du kan når som helst endre dette i innstillingene.</translation>
 <translation id="8748383401829947534">Avslutt alle kopier av Chromium.</translation>
 <translation id="8796602469536043152">Chromium trenger tilgang til kameraet ditt og mikrofonen din for dette nettstedet</translation>
 <translation id="8803635938069941624">Vilkår for Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb
index 721f248e..bfd1b92 100644
--- a/chrome/app/resources/chromium_strings_pl.xtb
+++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -51,7 +51,7 @@
 <translation id="2718390899429598676">Dla większego bezpieczeństwa Chromium szyfruje dane.</translation>
 <translation id="2770231113462710648">Zmień przeglądarkę domyślną na:</translation>
 <translation id="2799223571221894425">Uruchom ponownie</translation>
-<translation id="2838154144102149890">Aby można było przeprowadzić aktualizację, musisz wyłączyć Chromium na tym komputerze. Wskutek tego inni zalogowani na tym komputerze użytkownicy mogą utracić niezapisane dane.</translation>
+<translation id="2838154144102149890">Aby można było przeprowadzić aktualizację, musisz wyłączyć Chromium na tym komputerze. Może to spowodować, że inni zalogowani na nim użytkownicy utracą niezapisane dane.</translation>
 <translation id="2847479871509788944">Usuń z Chromium...</translation>
 <translation id="2886012850691518054">Opcjonalnie: pomóż nam udoskonalać Chromium, wysyłając do Google statystyki użytkowania i raporty o awariach.</translation>
 <translation id="2898082584336937987">Zainstaluj Chromium na telefonie. Wyślemy SMS-a na Twój telefon: <ph name="PHONE_NUMBER" /></translation>
@@ -254,7 +254,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> używa aktualnej wersji oprogramowania.</translation>
 <translation id="8697124171261953979">Kontroluje także to, jaka strona wyświetla się po uruchomieniu Chromium lub wyszukiwaniu w omniboksie.</translation>
 <translation id="8704119203788522458">Oto Twoja przeglądarka Chromium</translation>
-<translation id="8704255848199359374">Będzie stosowany ten sam mechanizm sprawdzania pisowni, który jest używany w wyszukiwarce Google. Tekst wpisywany w przeglądarce jest wysyłany do Google. Zawsze możesz to zmienić w ustawieniach.</translation>
 <translation id="8748383401829947534">Zamknij wszystkie kopie Chromium.</translation>
 <translation id="8796602469536043152">Chromium potrzebuje uprawnień dostępu do aparatu i mikrofonu na tej stronie</translation>
 <translation id="8803635938069941624">Warunki korzystania z systemu operacyjnego Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb
index 76e45d2..92a75aa 100644
--- a/chrome/app/resources/chromium_strings_pt-BR.xtb
+++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -251,7 +251,6 @@
 <translation id="8667808506758191620">Seu dispositivo <ph name="DEVICE_TYPE" /> está atualizado.</translation>
 <translation id="8697124171261953979">Controla também qual página deve ser exibida quando você inicia o Chromium ou faz uma pesquisa na Omnibox.</translation>
 <translation id="8704119203788522458">Este é seu Chromium</translation>
-<translation id="8704255848199359374">Esta opção usa o mesmo recurso de verificação ortográfica da Pesquisa Google. O texto digitado no navegador é enviado para o Google. É possível alterar esse comportamento nas configurações a qualquer momento.</translation>
 <translation id="8748383401829947534">Saia de todas as cópias do Chromium.</translation>
 <translation id="8796602469536043152">O Chromium precisa de permissão para este site acessar sua câmera e seu microfone</translation>
 <translation id="8803635938069941624">Termos do Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb
index 131c090..b8838357 100644
--- a/chrome/app/resources/chromium_strings_pt-PT.xtb
+++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">O seu <ph name="DEVICE_TYPE" /> está atualizado.</translation>
 <translation id="8697124171261953979">Também controla a página apresentada quando inicia o Chromium ou pesquisa a partir da Caixa geral.</translation>
 <translation id="8704119203788522458">Este é o seu Chromium</translation>
-<translation id="8704255848199359374">Utiliza o mesmo corretor ortográfico utilizado na Pesquisa Google. O texto que introduzir no navegador é enviado à Google. Pode sempre alterar este comportamento nas definições.</translation>
 <translation id="8748383401829947534">Saia de todas as cópias do Chromium</translation>
 <translation id="8796602469536043152">O Chromium necessita de autorização de acesso à câmara e ao microfone para este site.</translation>
 <translation id="8803635938069941624">Termos do SO Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb
index 0d13491..e9de94b 100644
--- a/chrome/app/resources/chromium_strings_ro.xtb
+++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">Dispozitivul <ph name="DEVICE_TYPE" /> este actualizat.</translation>
 <translation id="8697124171261953979">Stabilește și ce pagină se afișează când porniți Chromium sau când căutați din caseta polivalentă.</translation>
 <translation id="8704119203788522458">Acesta este browserul dvs. Chromium</translation>
-<translation id="8704255848199359374">Folosește același verificator ortografic folosit în Căutarea Google. Textul pe care îl introduci în browser este trimis la Google. Poți schimba acest comportament în setări.</translation>
 <translation id="8748383401829947534">Închideți toate copiile de Chromium.</translation>
 <translation id="8796602469536043152">Chromium are nevoie de permisiune ca să acceseze camera foto și microfonul pentru acest site</translation>
 <translation id="8803635938069941624">Termeni pentru sistemul de operare Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb
index b79d8bb..c4bb8d53 100644
--- a/chrome/app/resources/chromium_strings_ru.xtb
+++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -252,7 +252,6 @@
 <translation id="8667808506758191620">На устройстве <ph name="DEVICE_TYPE" /> используется последняя версия Chromium OS.</translation>
 <translation id="8697124171261953979">Кроме того, расширение изменило стартовую страницу Chromium и поисковую систему, используемую по умолчанию при вводе запроса в омнибокс.</translation>
 <translation id="8704119203788522458">Ваш персональный Chromium</translation>
-<translation id="8704255848199359374">Используется та же технология проверки правописания, что и в Google Поиске. Текст, введенный в браузере, отправляется на серверы Google. Этот параметр можно изменить в разделе настроек.</translation>
 <translation id="8748383401829947534">Закройте все экземпляры Chromium</translation>
 <translation id="8796602469536043152">Для этого сайта Chromium запрашивает доступ к камере и микрофону.</translation>
 <translation id="8803635938069941624">Условия использования Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb
index ceed9db..d9ed5da8 100644
--- a/chrome/app/resources/chromium_strings_sk.xtb
+++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620">Vaše zariadenie <ph name="DEVICE_TYPE" /> je aktuálne.</translation>
 <translation id="8697124171261953979">Tiež určuje, ktorá stránka sa zobrazí pri spustení prehliadača Chromium alebo pri vyhľadávaní pomocou všeobecného poľa.</translation>
 <translation id="8704119203788522458">Toto je váš prehliadač Chromium</translation>
-<translation id="8704255848199359374">Využíva rovnaký nástroj na kontrolu pravopisu, aký sa používa vo Vyhľadávaní Google. Text, ktorý napíšete v prehliadači, sa odosiela Googlu. Toto správanie môžete zmeniť v nastaveniach.</translation>
 <translation id="8748383401829947534">Zavretie všetkých okien prehliadača Chromium</translation>
 <translation id="8796602469536043152">Chromium potrebuje povolenie pre tento web na prístup k fotoaparátu a mikrofónu</translation>
 <translation id="8803635938069941624">Zmluvné podmienky systému OS Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb
index a7175be..2610bd2 100644
--- a/chrome/app/resources/chromium_strings_sl.xtb
+++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -259,7 +259,6 @@
 <translation id="8667808506758191620">Naprava <ph name="DEVICE_TYPE" /> je posodobljena.</translation>
 <translation id="8697124171261953979">Določa tudi, katera stran je prikazana, ko zaženete Chromium ali iščete v naslovni vrstici.</translation>
 <translation id="8704119203788522458">To je vaš Chromium</translation>
-<translation id="8704255848199359374">Uporabljeno je isto preverjanje črkovanja kot v Iskanju Google. Besedilo, ki ga vnesete v brskalniku, je poslano Googlu. To lahko kadar koli spremenite v nastavitvah.</translation>
 <translation id="8748383401829947534">Zapiranje vseh kopij Chromiuma.</translation>
 <translation id="8796602469536043152">Chromium potrebuje dovoljenje za dostop do fotoaparata in mikrofona za to spletno mesto</translation>
 <translation id="8803635938069941624">Pogoji za Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb
index 9c5ab4ac..6b3d2cc 100644
--- a/chrome/app/resources/chromium_strings_sr.xtb
+++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> је ажуриран.</translation>
 <translation id="8697124171261953979">Контролише и страницу која се приказује када покренете Chromium или претражујете из омнибокса.</translation>
 <translation id="8704119203788522458">Ово је ваш Chromium</translation>
-<translation id="8704255848199359374">Користи исту проверу правописа као Google претрага. Текст који унесете у прегледач се шаље Google-у. То увек можете да промените у подешавањима.</translation>
 <translation id="8748383401829947534">Затворите све копије Chromium-а.</translation>
 <translation id="8796602469536043152">Chromium тражи дозволу да приступи камери и микрофону за овај сајт</translation>
 <translation id="8803635938069941624">Chromium ОС услови</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index c346a2d4..cd0ef3b 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -258,7 +258,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> är uppdaterad.</translation>
 <translation id="8697124171261953979">Det styr också vilken sida som visas när du startar Chromium eller söker i adressfältet.</translation>
 <translation id="8704119203788522458">Det här är Chromium</translation>
-<translation id="8704255848199359374">Detta använder samma stavningskontroll som Google Sök. Text som du anger i webbläsaren skickas till Google. Du kan när som helst ändra detta i inställningarna.</translation>
 <translation id="8748383401829947534">Avsluta alla kopior av Chromium.</translation>
 <translation id="8796602469536043152">Du behöver ge Chromium behörighet att använda kameran och mikrofonen på webbplatsen</translation>
 <translation id="8803635938069941624">Villkor för Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb
index d2c67f7..4790c83d 100644
--- a/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -257,7 +257,6 @@
 <translation id="8667808506758191620">Kifaa chako cha <ph name="DEVICE_TYPE" /> kimesasishwa.</translation>
 <translation id="8697124171261953979">Pia inadhibiti ukurasa unaoonyeshwa unapoanzisha Chromium au unapotafuta kutoka Sanduku Kuu.</translation>
 <translation id="8704119203788522458">Hii ni Chromium yako</translation>
-<translation id="8704255848199359374">Huduma hii hutumia kikagua maendelezo sawa na kinachotumika kwenye Huduma ya Tafuta na Google. Maandishi unayoandika kwenye kivinjari yanatumwa kwa Google. Unaweza kubadilisha hali hii katika mipangilio wakati wowote.</translation>
 <translation id="8748383401829947534">Funga nakala zote za Chromium.</translation>
 <translation id="8796602469536043152">Chromium inahitaji ruhusa ya kufikia kamera na maikrofoni yako katika tovuti hii</translation>
 <translation id="8803635938069941624">Masharti ya Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb
index 6854360..6799326 100644
--- a/chrome/app/resources/chromium_strings_ta.xtb
+++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">உங்கள் <ph name="DEVICE_TYPE" /> புதுப்பித்த நிலையில் உள்ளது.</translation>
 <translation id="8697124171261953979">Chromiumமைத் தொடங்கும்போது அல்லது சர்வபுலத்திலிருந்து தேடலை மேற்கொள்ளும்போது காண்பிக்கப்படும் பக்கத்தையும் இது கட்டுப்படுத்துகிறது.</translation>
 <translation id="8704119203788522458">இது உங்கள் Chromium ஆகும்</translation>
-<translation id="8704255848199359374">இது Google தேடலில் பயன்படுத்தப்படும் அதே 'எழுத்துப் பிழை சரிபார்க்கும்' அம்சத்தைப் பயன்படுத்துகிறது. உலாவியில் நீங்கள் உள்ளிடும் உரை Googleளுக்கு அனுப்பப்படும். இதை அமைப்புகளில் எப்போது வேண்டுமானாலும் மாற்றலாம்.</translation>
 <translation id="8748383401829947534">Chromiumமின் அனைத்து நேர்வுகளில் இருந்தும் வெளியேறுதல்.</translation>
 <translation id="8796602469536043152">இந்தத் தளத்திற்காகக் கேமராவையும் மைக்ரோஃபோனையும் அணுக Chromiumமுக்கு அனுமதி தேவை</translation>
 <translation id="8803635938069941624">Chromium OS விதிமுறைகள்</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb
index d878d0f..1c48903 100644
--- a/chrome/app/resources/chromium_strings_te.xtb
+++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -252,7 +252,6 @@
 <translation id="8667808506758191620">మీ <ph name="DEVICE_TYPE" /> ఆధునికంగా ఉంది.</translation>
 <translation id="8697124171261953979">ఇది మీరు Chromiumను ప్రారంభించేటప్పుడు లేదా ఓమ్నిబాక్స్ నుండి వెతికేటప్పుడు చూపబడే పేజీని కూడా నియంత్రిస్తుంది.</translation>
 <translation id="8704119203788522458">ఇది మీ Chromium</translation>
-<translation id="8704255848199359374">ఇది Google శోధనలో ఉపయోగించే అదే స్పెల్ చెకర్‌ను ఉపయోగిస్తుంది. మీరు బ్రౌజర్‌లో టైప్ చేసే వచనాన్ని Googleకు పంపుతుంది. మీరు ఈ ప్రవర్తనను తర్వాత ఎప్పుడైనా సెట్టింగ్‌లలో మార్చవచ్చు.</translation>
 <translation id="8748383401829947534">Chromium యొక్క అన్ని కాపీల నుండి నిష్క్రమించండి.</translation>
 <translation id="8796602469536043152">ఈ సైట్ కోసం మీ కెమెరా మరియు మైక్రోఫోన్‌ను యాక్సెస్ చేయడానికి Chromiumకు అనుమతి అవసరం</translation>
 <translation id="8803635938069941624">Chromium OS నిబంధనలు</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb
index d352ffa8..20d92a8 100644
--- a/chrome/app/resources/chromium_strings_th.xtb
+++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> ของคุณเป็นเวอร์ชันล่าสุดแล้ว</translation>
 <translation id="8697124171261953979">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณเปิด Chromium หรือทำการค้นหาจากแถบอเนกประสงค์ด้วย</translation>
 <translation id="8704119203788522458">นี่คือ Chromium ของคุณ</translation>
-<translation id="8704255848199359374">การดำเนินการนี้จะใช้โปรแกรมตรวจตัวสะกดแบบเดียวกับ Google Search ข้อความที่คุณพิมพ์ในเบราว์เซอร์จะส่งไปยัง Google คุณปรับเปลี่ยนลักษณะการทำงานนี้ได้ทุกเมื่อในการตั้งค่า</translation>
 <translation id="8748383401829947534">ปิด Chromium ทุกสำเนา</translation>
 <translation id="8796602469536043152">Chromium ต้องการสิทธิ์เข้าถึงไมโครโฟนและกล้องถ่ายรูปของคุณสำหรับเว็บไซต์นี้</translation>
 <translation id="8803635938069941624">ข้อกำหนดของ Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb
index 11f2145..f9035ac1 100644
--- a/chrome/app/resources/chromium_strings_tr.xtb
+++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -254,7 +254,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> cihazınız güncel.</translation>
 <translation id="8697124171261953979">Ayrıca Chromium'u başlattığınızda veya Çok Amaçlı Adres Çubuğu'ndan arama yaptığınızda gösterilecek sayfayı da denetler.</translation>
 <translation id="8704119203788522458">Bu sizin Chromium'unuz</translation>
-<translation id="8704255848199359374">Bu işlev, Google Arama'da kullanılan yazım denetiminin aynısını kullanır. Tarayıcıda yazdığınız metin Google'a gönderilir. Bu davranışı istediğiniz zaman ayarlardan değiştirebilirsiniz.</translation>
 <translation id="8748383401829947534">Tüm Chromium kopyalarından çık.</translation>
 <translation id="8796602469536043152">Chromium'un bu sitede kameranıza ve mikrofonunuza erişmesi için izin gerekiyor</translation>
 <translation id="8803635938069941624">Chromium OS şartları</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb
index 4ef2191..6395b72 100644
--- a/chrome/app/resources/chromium_strings_uk.xtb
+++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">Ваш пристрій <ph name="DEVICE_TYPE" /> оновлено.</translation>
 <translation id="8697124171261953979">Розширення також змінило сторінку, яка відкривається під час запуску Chromium або пошуку в універсальному вікні пошуку.</translation>
 <translation id="8704119203788522458">Це ваш Chromium</translation>
-<translation id="8704255848199359374">Використовується та сама технологія перевірки орфографії, що й у Пошуку Google. Текст, який ви вводите у веб-переглядачі, надсилається в Google. Це завжди можна змінити в налаштуваннях.</translation>
 <translation id="8748383401829947534">Закрийте всі копії Chromium.</translation>
 <translation id="8796602469536043152">Chromium потрібен дозвіл на використання камери й мікрофона, щоб надати цьому сайту доступ до них</translation>
 <translation id="8803635938069941624">Умови ОС Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb
index d7e96b33..e63f481d 100644
--- a/chrome/app/resources/chromium_strings_vi.xtb
+++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620"><ph name="DEVICE_TYPE" /> của bạn đã cập nhật.</translation>
 <translation id="8697124171261953979">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chromium hoặc tìm kiếm từ Thanh địa chỉ.</translation>
 <translation id="8704119203788522458">Đây là Chromium của bạn</translation>
-<translation id="8704255848199359374">Dịch vụ này sử dụng cùng một trình kiểm tra lỗi chính tả dùng trong Google Tìm kiếm. Chrome gửi cho Google văn bản mà bạn nhập vào trình duyệt. Bạn luôn có thể thay đổi hành động này trong các tùy chọn cài đặt.</translation>
 <translation id="8748383401829947534">Thoát khỏi tất cả các bản sao của Chromium.</translation>
 <translation id="8796602469536043152">Chromium cần có quyền truy cập vào máy ảnh và micrô của bạn cho trang web này</translation>
 <translation id="8803635938069941624">Điều khoản Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb
index f3a7573..c947841 100644
--- a/chrome/app/resources/chromium_strings_zh-CN.xtb
+++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">您的 <ph name="DEVICE_TYPE" /> 是最新版本。</translation>
 <translation id="8697124171261953979">它还能够控制您启动Chromium后或通过多功能框进行搜索时系统显示的页面。</translation>
 <translation id="8704119203788522458">这是您的专属Chromium</translation>
-<translation id="8704255848199359374">这项服务会使用 Google 搜索所用的拼写检查工具。您在浏览器中输入的文字会被发送给 Google。您随时可在“设置”中更改此行为。</translation>
 <translation id="8748383401829947534">退出 Chromium 的所有副本。</translation>
 <translation id="8796602469536043152">Chromium 需要获得相应权限,才能允许此网站使用您的摄像头和麦克风</translation>
 <translation id="8803635938069941624">Chromium操作系统条款</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index ea88aecb..9cf74b8 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -256,7 +256,6 @@
 <translation id="8667808506758191620">您的 <ph name="DEVICE_TYPE" /> 已搭載最新版作業系統。</translation>
 <translation id="8697124171261953979">這個擴充功能也會控管 Chromium 啟動時或你使用網址列搜尋時所顯示的網頁。</translation>
 <translation id="8704119203788522458">這是你專屬的 Chromium</translation>
-<translation id="8704255848199359374">這會使用與 Google 搜尋相同的拼字檢查技術。系統會將你在瀏覽器中輸入的文字傳送給 Google。你隨時可以在設定中變更這項行為。</translation>
 <translation id="8748383401829947534">請關閉所有 Chromium 瀏覽器。</translation>
 <translation id="8796602469536043152">Chromium 需要相關權限,才能讓這個網站使用你的攝影機和麥克風</translation>
 <translation id="8803635938069941624">Chromium 作業系統條款</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 0fd5971..5a0bae8 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -338,6 +338,7 @@
         ከሆኑ <ph name="LINK_START" />የተኪ ቅንብሮችዎን<ph name="LINK_END" /> ያስተካክሉ።</translation>
 <translation id="1512210426710821809">ይህን መቀልበስ የሚቻልበት ብቸኛው መንገድ <ph name="IDS_SHORT_PRODUCT_OS_NAME" />ን ዳግም መጫን ነው</translation>
 <translation id="151501797353681931">ከSafari የመጣ</translation>
+<translation id="1515163294334130951">አስጀምር</translation>
 <translation id="1521442365706402292">ሰርተፊኬቶችን አቀናብር</translation>
 <translation id="152234381334907219">በጭራሽ አልተቀመጠም</translation>
 <translation id="1524430321211440688">የቁልፍ ሰሌዳ</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">በጣም ጮክ ያለ</translation>
 <translation id="1673137583248014546"><ph name="URL" /> የደህንነት ቁልፍዎን ስሪት እና ሞዴል ማየት ይፈልጋል</translation>
 <translation id="1679068421605151609">የአዘጋጅ መሳሪያዎች</translation>
+<translation id="1679806121152819234">PluginVm</translation>
 <translation id="167983332380191032">የአስተዳደር አገልግሎት የኤችቲቲፒ ስህተትን ልኳል።</translation>
 <translation id="1680849702532889074">የእርስዎን የLinux መተግበሪያ መጫን ወቅት ስህተት አጋጥሟል።</translation>
 <translation id="16815041330799488">ጣቢያዎች ወደ ቅንጥብ ሰሌዳው የተቀዱ ጽሑፍን እና ምስሎችን እንዲመለከቱ አትፍቀድ</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">መሣሪያውን ከጎራው ጋር ማቀላቀል አልተቻለም። ማከል ከሚችሉት የመሣሪያዎች ብዛት አለመብለጥዎን ያረጋግጡ።</translation>
 <translation id="1744108098763830590">የጀርባ ገጽ</translation>
 <translation id="1745520510852184940">ሁልጊዜ ይህን አድርግ</translation>
+<translation id="1746402432151920942">ጥበቃ የሚደረግለት የሚዲያ ለዪ</translation>
 <translation id="175196451752279553">የተ&amp;ዘጋውን ትር ዳግም ክፈት</translation>
 <translation id="1753905327828125965">በይበልጥ የተጎበኙ</translation>
 <translation id="1756681705074952506">የግቤት ስልት</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">አልተገባም</translation>
 <translation id="1832511806131704864">የስልክ ለውጥ ዘምኗል</translation>
 <translation id="1834503245783133039">ማውረድ አልተሳካም፦ <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">የMIDI መሣሪያዎች</translation>
 <translation id="1838374766361614909">ፍለጋን ያፅዱ</translation>
 <translation id="1841545962859478868">የመሣሪያው አስተዳዳሪ የሚከተሉትን ሊከታተል ይችላል፦</translation>
 <translation id="1841616161104323629">የሚጎድል የመሣሪያ መዝገብ።</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">ችግር ሪፖርት አድርግ</translation>
 <translation id="2220572644011485463">ፒን ወይም የይለፍ ቃል</translation>
 <translation id="2224444042887712269">ይህ ቅንብር የ<ph name="OWNER_EMAIL" /> ነው።</translation>
+<translation id="2224471211857467033">የተደራሽነት ክስተቶች</translation>
 <translation id="2224551243087462610">የአቃፊ ስም አርትዕ</translation>
 <translation id="2226449515541314767">ይህ ጣቢያ የMIDI መሳሪያዎች ሙሉ ቁጥጥር እንዳይኖረው ታግዷል።</translation>
 <translation id="2226720438730111184">ምን እየተከሰተ እንዳለ ይንገሩን</translation>
@@ -962,7 +967,6 @@
 <translation id="2496180316473517155">ታሪክ አሰሳ</translation>
 <translation id="2497229222757901769">የመዳፊት ፍጥነት</translation>
 <translation id="2497852260688568942">ስምረት በእርስዎ አስተዳዳሪ ተሰናክሏል</translation>
-<translation id="249819058197909513">ለዚህ መተግበሪያ ዳግም አታስጠንቅቅ</translation>
 <translation id="2498539833203011245">አሳንስ</translation>
 <translation id="2498765460639677199">ግዙፍ</translation>
 <translation id="2499747912851752301">የይለፍ ቃላትን ወደ ውጭ በመላክ ላይ...</translation>
@@ -1050,7 +1054,6 @@
 <translation id="2630681426381349926">ለመጀመር ከWi-Fi ጋር ይገናኙ</translation>
 <translation id="2631120081682787498">ይህን ትር ለመዝጋት እንደሚፈልጉ እርግጠኛ ነዎት?</translation>
 <translation id="2631498379019108537">በመደርደሪያው ውስጥ የግቤት አማራጮችን አሳይ</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> <ph name="USAGE" /> ሜባ የዲስክ ቦታ እየተጠቀመ ነው።</translation>
 <translation id="2633212996805280240">«<ph name="EXTENSION_NAME" />» ይወገድ?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ጭነቱን ሊያጠናቅቅ አልቻለም፣ ግን ከዲስክ ምስሉ መሄዱን ይቀጥላል።</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1396,7 +1399,6 @@
 <translation id="3157931365184549694">እነበረበት መልስ</translation>
 <translation id="3158033540161634471">የጣት አሻራዎን ያዋቅሩ</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (በሃርድዌር የሚደገፍ)</translation>
-<translation id="316125635462764134">መተግበሪያ አስወግድ</translation>
 <translation id="3161522574479303604">ሁሉም ቋንቋዎች</translation>
 <translation id="3163201441334626963">ያልታወቀ ምርት <ph name="PRODUCT_ID" /> ከ<ph name="VENDOR_ID" /> ሻጭ</translation>
 <translation id="3165390001037658081">አንዳንድ የአገልግሎት አቅራቢዎች ይህን ባህሪ ሊያግዱት ይችላሉ።</translation>
@@ -1897,6 +1899,7 @@
 <translation id="3916445069167113093">የዚህ አይነት ፋይል ኮምፒውተርዎን ሊጎዳ ይችላል። <ph name="FILE_NAME" />ን ለማንኛውም ማስቀመጥ ይፈልጋሉ?</translation>
 <translation id="3918972485393593704">ዝርዝሮችን ለGoogle ሪፖርት አድርግ</translation>
 <translation id="3919145445993746351">በሁሉም ኮምፒውተሮችዎ ላይ ቅጥያዎችዎን ለማግኘት ስምረትን ያብሩ</translation>
+<translation id="391999873395511996">ምናባዊውን ማሽን በማውረድ ላይ።</translation>
 <translation id="3920504717067627103">የሰርቲፊኬት መምሪያዎች</translation>
 <translation id="392089482157167418">ChromeVoxን (የሚነገር ግብረመልስ) አንቃ</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1948,7 +1951,6 @@
 <translation id="3983586614702900908">ያልታወቀ አቅራቢ መሣሪያዎች</translation>
 <translation id="3984159763196946143">የማሳያ ሁነታውን መጀመር አልተቻለም</translation>
 <translation id="3984431586879874039">ይህ ጣቢያ የደህንነት ቁልፍዎ እንዲመለከት ይፈቀድለት?</translation>
-<translation id="3987348946546879621">የተቀመጠ ውሂብ</translation>
 <translation id="3987938432087324095">ይቅርታ፣ ይህንን አልሰማሁትም።</translation>
 <translation id="3988996860813292272">የሰዓት ሰቅ ይምረጡ</translation>
 <translation id="399179161741278232">ከውጭ የመጣ</translation>
@@ -1979,7 +1981,6 @@
 <translation id="4037889604535939429">ሰውን ያርትዑ</translation>
 <translation id="4042264909745389898">የGoogle Chrome OS ውል</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{ከገጽ ውጣ}one{ከገጾች ውጣ}other{ከገጾች ውጣ}}</translation>
-<translation id="404299405565920089">በመተግበሪያዎች እና ድር ጣቢያዎች ላይ ሁሉም የተገባባቸው የGoogle መለያዎች እዚህ ላይ ሊቀናበሩ ይችላሉ። የእርስዎ ፈቃድ ያላቸው መተግበሪያዎች እና የድር ጣቢያዎች በአግባቡ እንዲሠሩ የሚያስፈልጋቸውን የመለያ መረጃ መድረስ ይችላሉ።</translation>
 <translation id="4044612648082411741">የእርስዎን የዕውቅና ማረጋገጫ ይለፍ ቃል ያስገቡ</translation>
 <translation id="404493185430269859">ነባሪ የፍለጋ ፕሮግራም</translation>
 <translation id="4046123991198612571">ቀጣይ ትራክ</translation>
@@ -2092,7 +2093,6 @@
 <translation id="4242533952199664413">ቅንብሮችን ክፈት</translation>
 <translation id="4242577469625748426">የመምሪያ ቅንብሮች በዚህ መሣሪያ ላይ መጫን አልተሳካም፦ <ph name="VALIDATION_ERROR" />።</translation>
 <translation id="4244238649050961491">ተጨማሪ የስቲለስ መተግበሪያዎችን ያግኙ</translation>
-<translation id="424546999567421758">ከፍተኛ የዲስክ መጠቀም ተገኝቷል</translation>
 <translation id="424726838611654458">ሁልጊዜ በAdobe Reader ክፈት</translation>
 <translation id="4247901771970415646">ከ<ph name="USERNAME" /> ጋር ማሳመር አይቻልም</translation>
 <translation id="4249248555939881673">የአውታረ መረብ ግንኙነትን በመጠበቅ ላይ...</translation>
@@ -2200,7 +2200,6 @@
 <translation id="4421932782753506458">ለስላሳ</translation>
 <translation id="4422347585044846479">ለእዚህ ገጽ ዕልባት አርትዕ</translation>
 <translation id="4423376891418188461">ቅንብሮችን ወደነበሩበት መልስ</translation>
-<translation id="4423482519432579560">&amp;ፊደል አራሚ</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />፣ የእርስዎ አስተዳዳሪ የይለፍ ቃልዎን እንዲቀይሩ ይፈልግብዎታል።</translation>
 <translation id="4430019312045809116">ድምፅ</translation>
 <translation id="4430369329743628066">ዕልባት ታክሏል</translation>
@@ -2660,8 +2659,6 @@
 <translation id="5187295959347858724">አሁን ወደ <ph name="SHORT_PRODUCT_NAME" /> ገብተዋል። ዕልባቶችዎ፣ ታሪክዎ እና ሌሎች ቅንብሮችዎ ከGoogle መለያዎ ጋር እየተመሳሰሉ ናቸው።</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> በርካታ ፋይሎችን ለማውረድ ይፈልጋል</translation>
-<translation id="5192316339598592690">በአንድ ጊዜ መለያዎችን በፍጥነት ይቀይሩና ወደ መተግበሪያዎች እና ድር ጣቢያዎች ይግቡ።
-    መተግበሪያዎች እና ጣቢያዎች አንዳንድ የGoogle መለያ መረጃዎን ለመጠቀም ፈቃድ ሊጠይቁዎት ይችላሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">እባክዎ መሣሪያን ፓወርዋሽ ያድርጉትና እንደገና ይሞክሩ።</translation>
 <translation id="5204967432542742771">የይለፍ ቃል ያስገቡ</translation>
 <translation id="5206215183583316675">«<ph name="CERTIFICATE_NAME" />» ይሰረዝ?</translation>
@@ -3340,7 +3337,6 @@
 <translation id="622537739776246443">መገለጫ ይሰረዛል</translation>
 <translation id="6225475702458870625">የውሂብ ግንኙነት ከእርስዎ <ph name="PHONE_NAME" /> ይገኛል</translation>
 <translation id="6226777517901268232">የግል ቁልፍ ፋይል (ከተፈለገ)</translation>
-<translation id="6228516488918914827">ይበልጥ ፈጣን ገጽ ተጭኗል</translation>
 <translation id="6228691855869374890">ይህ ጣቢያ የMIDI መሳሪያዎችን ሙሉ በሙሉ ይቆጣጠራል።</translation>
 <translation id="6229890768313448549">የGoogle Play አገልግሎት ውል ሊጫን አልቻለም። እባክዎ እንደገና ይሞክሩ።</translation>
 <translation id="6231881193380278751">ገጹን በራስ-ለማደስ በዩአርኤል ውስጥ የመጠይቅ ልኬት ያክሉ፦ chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3545,7 +3541,6 @@
 <translation id="6545665334409411530">የድግግሞሽ ፍጥነት</translation>
 <translation id="6545834809683560467">በአድራሻ አሞሌ ወይም በመተግበሪያ ማስጀመሪያ ሳጥኑ ውስጥ የተተየቡ ፍለጋዎችን እና ዩአርኤሎችን ለማጠናቀቅ የመገመቻ አገልግሎት ይጠቀሙ።</translation>
 <translation id="6545867563032584178">ማይክሮፎን በMac System Preferences ውስጥ ጠፍቷል</translation>
-<translation id="6547316139431024316">ለዚህ ቅጥያ ዳግም አታስጠንቅቅ</translation>
 <translation id="6547354035488017500">ቢያንስ 512 ሜባ ባዶ ቦታ ያስለቅቁ ወይም የእርስዎ መሣሪያ ምላሽ የማይሰጥ ይሆናል። ቦታ ለማስለቀቅ ፋይሎችን ከመሣሪያ ማከማቻው ይሰርዙ።</translation>
 <translation id="6550675742724504774">አማራጮች</translation>
 <translation id="6551508934388063976">ትእዛዝ አይገኝም። አዲስ መስኮት ለመክፈት Crtl-N ይጫኑ።</translation>
@@ -4680,7 +4675,6 @@
 <translation id="827097179112817503">መነሻ አዝራር አሳይ</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 እልባት ተሰርዟል}one{# እልባቶች ተሰርዘዋል}other{# እልባቶች ተሰርዘዋል}}</translation>
 <translation id="8272443605911821513">በ«ተጨማሪ መሣሪያዎች» ምናሌው ውስጥ ቅጥያዎች የሚለውን ጠቅ በማድረግ ቅጥያዎችዎን ያቀናብሩ።</translation>
-<translation id="8272966760965438857">የGoogle መለያዎችዎን በአንዲት ቦታ ላይ ያቀናብሯቸው</translation>
 <translation id="8274332263553132018">ፋይል Cast ያድርጉ</translation>
 <translation id="8274924778568117936">ዝማኔው እስኪጨርስ ድረስ የእርስዎን <ph name="DEVICE_TYPE" /> አያጥፉት ወይም አይዝጉት። መጫኑ ከተጠናቀቀ በኋላ የእርስዎ <ph name="DEVICE_TYPE" /> ዳግም ይነሳል።</translation>
 <translation id="8275038454117074363">ከውጭ አስመጣ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 3c0063f..7ba3179 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -338,6 +338,7 @@
         خادم وكيل، فعليك بتعديل <ph name="LINK_START" />إعدادات الخادم الوكيل<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">الوسيلة الوحيدة للتراجع عن هذا الإجراء هي إعادة تثبيت <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">‏تم الاستيراد من Safari</translation>
+<translation id="1515163294334130951">تشغيل</translation>
 <translation id="1521442365706402292">تنظيم الشهادات</translation>
 <translation id="152234381334907219">المواقع التي لن تحفظ كلمات المرور أبدًا</translation>
 <translation id="1524430321211440688">لوحة المفاتيح</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">المستوى الأعلى</translation>
 <translation id="1673137583248014546">يريد <ph name="URL" /> الاطّلاع على العلامة التجارية لمفتاح الأمان وطرازه.</translation>
 <translation id="1679068421605151609">أدوات مطوّري البرامج</translation>
+<translation id="1679806121152819234">‏الجهاز الافتراضي (VM) للمكوّن الإضافي</translation>
 <translation id="167983332380191032">‏أرسلت خدمة الإدارة خطأ HTTP.</translation>
 <translation id="1680849702532889074">‏لقد حدث خطأ أثناء تثبيت تطبيق Linux.</translation>
 <translation id="16815041330799488">عدم السماح لمواقع الويب بالاطّلاع على النصوص والصور التي تم نسخها إلى الحافظة</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">يتعذَّر ضم الجهاز إلى النطاق. يُرجى التأكُّد من أنك لم تتجاوز عدد الأجهزة التي يمكنك إضافتها.</translation>
 <translation id="1744108098763830590">صفحة الخلفية</translation>
 <translation id="1745520510852184940">أجرِ ذلك دائمًا</translation>
+<translation id="1746402432151920942">معرّف الوسائط المحمية</translation>
 <translation id="175196451752279553">إ&amp;عادة فتح علامة التبويب المغلقة</translation>
 <translation id="1753905327828125965">الأكثر زيارة</translation>
 <translation id="1756681705074952506">أسلوب الإدخال</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">لم يتم تسجيل الدخول</translation>
 <translation id="1832511806131704864">تم تحديث تغيير الهاتف</translation>
 <translation id="1834503245783133039">تعذّر التنزيل: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">‏أجهزة MIDI</translation>
 <translation id="1838374766361614909">محو البحث</translation>
 <translation id="1841545962859478868">قد يراقب مشرف الجهاز ما يلي:</translation>
 <translation id="1841616161104323629">سجِلّ الجهاز مفقود.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">الإبلاغ عن مشكلة</translation>
 <translation id="2220572644011485463">رقم التعريف الشخصي أو كلمة المرور</translation>
 <translation id="2224444042887712269">ينتمي هذا الإعداد إلى <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">أحداث إمكانية الوصول</translation>
 <translation id="2224551243087462610">تعديل اسم المجلد</translation>
 <translation id="2226449515541314767">‏تم حظر هذا الموقع من التحكم تحكمًا كاملاً في أجهزة MIDI.</translation>
 <translation id="2226720438730111184">أخبرنا بما يحدث</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">سجلّ التصفّح</translation>
 <translation id="2497229222757901769">سرعة الماوس</translation>
 <translation id="2497852260688568942">تم إيقاف المزامنة من قِبل المشرف</translation>
-<translation id="249819058197909513">لا أريد التحذير مرة أخرى بشأن هذا التطبيق</translation>
 <translation id="2498539833203011245">تصغير</translation>
 <translation id="2498765460639677199">ضخم</translation>
 <translation id="2499747912851752301">جارٍ تصدير كلمات المرور...</translation>
@@ -1050,7 +1054,6 @@
 <translation id="2630681426381349926">‏الاتصال بشبكة Wi-Fi للبدء</translation>
 <translation id="2631120081682787498">هل تريد حقًا إغلاق علامة التبويب هذه؟</translation>
 <translation id="2631498379019108537">إظهار خيارات الإدخال في الرف</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> يستخدم <ph name="USAGE" /> ميغابايت من مساحة القرص.</translation>
 <translation id="2633212996805280240">هل تريد إزالة "<ph name="EXTENSION_NAME" />"؟</translation>
 <translation id="263325223718984101">تعذر على <ph name="PRODUCT_NAME" /> إكمال التثبيت، ولكن ستتم متابعة تشغيله من صورته على القرص.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1396,7 +1399,6 @@
 <translation id="3157931365184549694">استعادة</translation>
 <translation id="3158033540161634471">إعداد بصمة الإصبع</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (مستندة إلى الأجهزة)</translation>
-<translation id="316125635462764134">إزالة التطبيق</translation>
 <translation id="3161522574479303604">كل اللغات</translation>
 <translation id="3163201441334626963">المنتج غير معروف <ph name="PRODUCT_ID" /> من المورّد‬ <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">قد يحظر بعض مشغلي شبكات الجوّال هذه الميزة.</translation>
@@ -1896,6 +1898,7 @@
 <translation id="3916445069167113093">هذا النوع من الملفات قد يلحق الضرر بالكمبيوتر. هل تريد الاحتفاظ بـ <ph name="FILE_NAME" /> على أيّ حال؟</translation>
 <translation id="3918972485393593704">‏إبلاغ Google بالتفاصيل</translation>
 <translation id="3919145445993746351">للحصول على الإضافات على جميع أجهزة الكمبيوتر، يُرجى تفعيل المزامنة</translation>
+<translation id="391999873395511996">جارٍ تنزيل الآلة الافتراضية.</translation>
 <translation id="3920504717067627103">سياسات الشهادة</translation>
 <translation id="392089482157167418">‏تفعيل ChromeVox (التعليقات المنطوقة)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1944,7 +1947,6 @@
 <translation id="3983586614702900908">أجهزة من مورد غير معروف</translation>
 <translation id="3984159763196946143">تعذَّر بدء الوضع التجريبي</translation>
 <translation id="3984431586879874039">هل تريد السماح لهذا الموقع الإلكتروني بالاطّلاع على مفتاح الأمان؟</translation>
-<translation id="3987348946546879621">البيانات المحفوظة</translation>
 <translation id="3987938432087324095">عذرًا، لم يتم التعرف على ذلك.</translation>
 <translation id="3988996860813292272">تحديد منطقة زمنية</translation>
 <translation id="399179161741278232">المستوردة</translation>
@@ -1975,7 +1977,6 @@
 <translation id="4037889604535939429">تعديل الشخص</translation>
 <translation id="4042264909745389898">‏بنود نظام التشغيل Google Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{الخروج من الصفحة}zero{الخروج من صفحة}two{الخروج من الصفحتين}few{الخروج من صفحات}many{الخروج من صفحة}other{الخروج من صفحة}}</translation>
-<translation id="404299405565920089">‏يمكن إدارة جميع حساباتك على Google التي تمّ تسجيل الدخول إليها من التطبيقات والمواقع الإلكترونية هنا. يمكن للتطبيقات والمواقع الإلكترونية التي حصلت على إذن منك الوصول إلى معلومات الحساب التي تحتاج إليها للعمل بشكلٍ صحيح.</translation>
 <translation id="4044612648082411741">إدخال كلمة المرور للشهادة</translation>
 <translation id="404493185430269859">محرك البحث التلقائي</translation>
 <translation id="4046123991198612571">المقطع الصوتي التالي</translation>
@@ -2090,7 +2091,6 @@
 <translation id="4242533952199664413">فتح الإعدادات</translation>
 <translation id="4242577469625748426">تعذّر تثبيت إعدادات السياسة على الجهاز: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">العثور على المزيد من تطبيقات قلم الشاشة</translation>
-<translation id="424546999567421758">تم اكتشاف استخدام مرتفع للقرص</translation>
 <translation id="424726838611654458">‏الفتح دائمًا باستخدام Adobe Reader</translation>
 <translation id="4247901771970415646">تتعذّر المزامنة مع <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">في انتظار الاتصال بالشبكة...</translation>
@@ -2198,7 +2198,6 @@
 <translation id="4421932782753506458">الانتفاش</translation>
 <translation id="4422347585044846479">تعديل إشارة هذه الصفحة</translation>
 <translation id="4423376891418188461">استعادة الإعدادات</translation>
-<translation id="4423482519432579560">ال&amp;تدقيق الإملائي</translation>
 <translation id="442397852638519243">يا <ph name="USER_NAME" />، يطلب منك مشرفك تغيير كلمة المرور.</translation>
 <translation id="4430019312045809116">مستوى الصوت</translation>
 <translation id="4430369329743628066">تمت إضافة إشارة</translation>
@@ -2658,8 +2657,6 @@
 <translation id="5187295959347858724">‏لقد سجّلت الدخول إلى <ph name="SHORT_PRODUCT_NAME" />. تتم الآن مزامنة الإشارات المرجعية والسجلّ والإعدادات الأخرى مع حسابك على Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">يريد <ph name="ORIGIN" /> تنزيل ملفات متعددة.</translation>
-<translation id="5192316339598592690">‏يمكنك التبديل بين الحسابات بسرعة وتسجيل الدخول إلى التطبيقات ومواقع الويب دفعة واحدة.
-    يمكن أن تطالبك التطبيقات والمواقع الإلكترونية بالحصول على إذن لاستخدام بعض معلومات حسابك على Google. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">‏يُرجى إجراء powerwash للجهاز وإعادة المحاولة.</translation>
 <translation id="5204967432542742771">إدخال كلمة المرور</translation>
 <translation id="5206215183583316675">هل تريد حذف "<ph name="CERTIFICATE_NAME" />"؟</translation>
@@ -3339,7 +3336,6 @@
 <translation id="622537739776246443">سيتم حذف الملف الشخصي</translation>
 <translation id="6225475702458870625">اتصال البيانات متاح من جهاز <ph name="PHONE_NAME" /> التابع لك</translation>
 <translation id="6226777517901268232">ملف مفتاح خاص (اختياري)</translation>
-<translation id="6228516488918914827">تم تحميل الصفحة بشكل أسرع.</translation>
 <translation id="6228691855869374890">‏يتضمن هذا الموقع إمكانية تحكم شامل في أجهزة MIDI.</translation>
 <translation id="6229890768313448549">‏لا يمكن تحميل بنود خدمة Google Play. يُرجى إعادة المحاولة.</translation>
 <translation id="6231881193380278751">‏أضف معلمة طلب بحث في عنوان URL لإجراء تحديث تلقائي لصفحة: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3544,7 +3540,6 @@
 <translation id="6545665334409411530">معدل التكرار</translation>
 <translation id="6545834809683560467">‏يمكنك استخدام خدمة التوقع لمساعدتك في إكمال عبارات البحث وعناوين URL التي تكتبها في شريط العناوين أو في مربع بحث تطبيقات Launcher</translation>
 <translation id="6545867563032584178">‏تم إيقاف الميكروفون في إعدادات نظام Mac المفضلة</translation>
-<translation id="6547316139431024316">لا أريد التحذير مرة أخرى بشأن هذه الإضافة</translation>
 <translation id="6547354035488017500">احرص على تفريغ مساحة قدرها 512 ميغابايت على الأقل أو سيصبح جهازك غير مستجيب. لتفريغ مساحة، يمكنك حذف الملفات من مساحة تخزين الجهاز.</translation>
 <translation id="6550675742724504774">خيارات</translation>
 <translation id="6551508934388063976">‏الأمر غير متوفر. اضغط على control-N لفتح نافذة جديدة.</translation>
@@ -4498,7 +4493,7 @@
 احتفظ بملف المفتاح في مكان آمن، حيث ستحتاج إليه لإنشاء إصدارات جديدة من إضافتك.</translation>
 <translation id="8000066093800657092">لا شبكة</translation>
 <translation id="8000467600002607205">{NUM_TABS,plural, =1{إغلاق علامة تبويب واحدة}zero{إغلاق علامات التبويب}two{إغلاق علامتيِّ التبويب}few{إغلاق علامات التبويب}many{إغلاق علامات التبويب}other{إغلاق علامات التبويب}}</translation>
-<translation id="8002274832045662704">إعداد الطابعة المتقدِّمة</translation>
+<translation id="8002274832045662704">إعدادات الطابعة المتقدِّمة</translation>
 <translation id="8004582292198964060">المتصفّح</translation>
 <translation id="8005600846065423578">السماح دائمًا لـ <ph name="HOST" /> بالاطلاع على الحافظة</translation>
 <translation id="8008356846765065031">تم قطع الاتصال بالإنترنت. يُرجى التحقق من الاتصال بالإنترنت.</translation>
@@ -4675,7 +4670,6 @@
 <translation id="827097179112817503">عرض زر الصفحة الرئيسية</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{تم حذف إشارة مرجعية واحدة}zero{تم حذف # إشارة مرجعية}two{تم حذف إشارتين مرجعيتين (#)}few{تم حذف # إشارات مرجعية}many{تم حذف # إشارةً مرجعيةً}other{تم حذف # إشارة مرجعية}}</translation>
 <translation id="8272443605911821513">يمكنك إدارة الإضافات من خلال النقر على "الإضافات" في قائمة "المزيد من الأدوات".</translation>
-<translation id="8272966760965438857">‏إدارة حساباتك على Google في مكان واحد</translation>
 <translation id="8274332263553132018">إرسال الملف</translation>
 <translation id="8274924778568117936">لا توقف تشغيل جهاز <ph name="DEVICE_TYPE" /> أو تُغلقه لحين الانتهاء من التحديث. ستتم إعادة تشغيل جهاز <ph name="DEVICE_TYPE" /> بعد اكتمال التثبيت.</translation>
 <translation id="8275038454117074363">الاستيراد</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 9977bad..930c4c0 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">В случай че използвате прокси сървър, проверете настройките му или се свържете със системния си администратор, за да се уверите, че сървърът работи. Ако смятате, че не трябва да ползвате прокси сървър, коригирайте <ph name="LINK_START" />съответните настройки<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Единственият начин да отмените това е да инсталирате отново <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Импортирани от Safari</translation>
+<translation id="1515163294334130951">Стартиране</translation>
 <translation id="1521442365706402292">Управление на сертификати</translation>
 <translation id="152234381334907219">Незапазвани никога</translation>
 <translation id="1524430321211440688">Клавиатура</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">Най-силно</translation>
 <translation id="1673137583248014546"><ph name="URL" /> иска да разбере марката и модела на ключа ви за сигурност</translation>
 <translation id="1679068421605151609">Инструменти за програмисти</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Услугата за управление изпрати HTTP грешка.</translation>
 <translation id="1680849702532889074">Възникна грешка при инсталирането на приложението за Linux.</translation>
 <translation id="16815041330799488">Забраняване на сайтовете да преглеждат текста и изображенията, копирани в буферната памет</translation>
@@ -960,7 +962,6 @@
 <translation id="2496180316473517155">История на сърфирането</translation>
 <translation id="2497229222757901769">Скорост на мишката</translation>
 <translation id="2497852260688568942">Синхронизирането е деактивирано от администратора ви</translation>
-<translation id="249819058197909513">Без повторно предупреждение за това приложение</translation>
 <translation id="2498539833203011245">Намаляване</translation>
 <translation id="2498765460639677199">Огромен</translation>
 <translation id="2499747912851752301">Паролите се експортират...</translation>
@@ -1048,7 +1049,6 @@
 <translation id="2630681426381349926">Свържете се с Wi-Fi, за да започнете</translation>
 <translation id="2631120081682787498">Наистина ли искате да затворите този раздел?</translation>
 <translation id="2631498379019108537">Опциите за въвеждане да се показват в лавицата</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> използва <ph name="USAGE" /> МБ място на диска.</translation>
 <translation id="2633212996805280240">Да се премахне ли „<ph name="EXTENSION_NAME" />“?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> не успя да завърши инсталацията, но ще продължи да работи от образа си на диска.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1394,7 +1394,6 @@
 <translation id="3157931365184549694">Възстановяване</translation>
 <translation id="3158033540161634471">Настройте отпечатъка си</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (с хардуерно съхраняване)</translation>
-<translation id="316125635462764134">Премахване на приложението</translation>
 <translation id="3161522574479303604">Всички езици</translation>
 <translation id="3163201441334626963">Неизвестен продукт <ph name="PRODUCT_ID" /> от доставчик <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Някои оператори може да блокират тази функция.</translation>
@@ -1897,6 +1896,7 @@
 <translation id="3916445069167113093">Този тип файл може да навреди на компютъра ви. Искате ли да запазите „<ph name="FILE_NAME" />“ въпреки това?</translation>
 <translation id="3918972485393593704">Изпращане на подробностите до Google</translation>
 <translation id="3919145445993746351">За да получите разширенията си на всичките си компютри, включете синхронизирането</translation>
+<translation id="391999873395511996">Виртуалната машина се изтегля.</translation>
 <translation id="3920504717067627103">Правила за сертификата</translation>
 <translation id="392089482157167418">Активиране на ChromeVox (обратна връзка с говор)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1948,7 +1948,6 @@
 <translation id="3983586614702900908">устройства от неизвестен доставчик</translation>
 <translation id="3984159763196946143">Демонстрационният режим не можа да стартира</translation>
 <translation id="3984431586879874039">Да се разреши ли на сайта достъп до данни за ключа ви за сигурност?</translation>
-<translation id="3987348946546879621">Спестихте данни</translation>
 <translation id="3987938432087324095">За съжаление, не разбрахме това.</translation>
 <translation id="3988996860813292272">Избиране на часова зона</translation>
 <translation id="399179161741278232">Импортирани</translation>
@@ -1979,7 +1978,6 @@
 <translation id="4037889604535939429">Редактиране на подстраницата за човека</translation>
 <translation id="4042264909745389898">Общи условия на Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Изход от страницата}other{Изход от страниците}}</translation>
-<translation id="404299405565920089">Оттук можете да управлявате всички профили в Google, в които сте влезли от приложения и уебсайтове. Приложенията и сайтовете, на които сте дали разрешение, имат достъп до информацията за профила, която им е необходима, за да работят правилно.</translation>
 <translation id="4044612648082411741">Въведете паролата си за сертификата</translation>
 <translation id="404493185430269859">Основна търсеща машина</translation>
 <translation id="4046123991198612571">Следващ запис</translation>
@@ -2094,7 +2092,6 @@
 <translation id="4242533952199664413">Отваряне на настройките</translation>
 <translation id="4242577469625748426">Настройките за правила не бяха инсталирани успешно на устройството: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Намиране на още приложения за писалка</translation>
-<translation id="424546999567421758">Установено е използване на много място на диска</translation>
 <translation id="424726838611654458">Отваряне винаги в Adobe Reader</translation>
 <translation id="4247901771970415646">Не може да се синхронизира с/ъс <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Изчаква се връзка с мрежата...</translation>
@@ -2202,7 +2199,6 @@
 <translation id="4421932782753506458">Пухчо</translation>
 <translation id="4422347585044846479">Редактиране на отметката за тази страница</translation>
 <translation id="4423376891418188461">Възстановяване на настройките</translation>
-<translation id="4423482519432579560">&amp;Проверка на правописа</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, администраторът ви изисква да промените паролата си.</translation>
 <translation id="4430019312045809116">Звук</translation>
 <translation id="4430369329743628066">Отметката бе добавена</translation>
@@ -2662,8 +2658,6 @@
 <translation id="5187295959347858724">Вече влязохте в <ph name="SHORT_PRODUCT_NAME" />. Вашите отметки, история и други настройки се синхронизират с профила ви в Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> иска да изтегли няколко файла</translation>
-<translation id="5192316339598592690">Превключвайте бързо между профилите си и влизайте еднократно в различни приложения и уебсайтове.
-    Приложенията и сайтовете могат да искат от вас разрешение да използват част от информацията в профила ви в Google. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Моля, извършете Powerwash на устройството и опитайте отново.</translation>
 <translation id="5204967432542742771">Въведете парола</translation>
 <translation id="5206215183583316675">Да се изтрие ли „<ph name="CERTIFICATE_NAME" />“?</translation>
@@ -3343,7 +3337,6 @@
 <translation id="622537739776246443">Потребителският профил ще бъде изтрит</translation>
 <translation id="6225475702458870625">От устройството ви <ph name="PHONE_NAME" /> е налице връзка за пренос на данни</translation>
 <translation id="6226777517901268232">Файл с частен ключ (незадължително)</translation>
-<translation id="6228516488918914827">Заредена е по-бърза страница</translation>
 <translation id="6228691855869374890">Този сайт има пълен контрол над MIDI устройствата.</translation>
 <translation id="6229890768313448549">Общите условия на Google Play не могат да се заредят. Моля, опитайте отново.</translation>
 <translation id="6231881193380278751">За да се опреснява страницата автоматично, добавете към URL адреса параметър на заявката: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3541,6 @@
 <translation id="6545665334409411530">Честота на повтаряне</translation>
 <translation id="6545834809683560467">Използване на услуга за предвиждания за помощ при завършването на заявките за търсене и URL адресите, въвеждани в адресната лента или в полето за търсене в стартовия панел за приложения</translation>
 <translation id="6545867563032584178">Микрофонът е изключен в системните предпочитания за Mac</translation>
-<translation id="6547316139431024316">Без повторно предупреждение за това разширение</translation>
 <translation id="6547354035488017500">Освободете поне 512 МБ място или устройството ви ще спре да реагира. За целта изтрийте файлове от хранилището му.</translation>
 <translation id="6550675742724504774">Опции</translation>
 <translation id="6551508934388063976">Командата не е налице. Натиснете „control-N“, за да отворите нов прозорец.</translation>
@@ -4679,7 +4671,6 @@
 <translation id="827097179112817503">Показване на бутона за начална страница</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Изтрихте 1 отметка}other{Изтрихте # отметки}}</translation>
 <translation id="8272443605911821513">Управлявайте разширенията си, като кликнете върху „Разширения“ в менюто „Още инструменти“.</translation>
-<translation id="8272966760965438857">Управлявайте профилите си в Google от едно място</translation>
 <translation id="8274332263553132018">Предаване на файл</translation>
 <translation id="8274924778568117936">Не изключвайте, нито затваряйте устройството си <ph name="DEVICE_TYPE" />, докато актуализирането не завърши. <ph name="DEVICE_TYPE" /> ще се рестартира след завършване на инсталирането.</translation>
 <translation id="8275038454117074363">Импортиране</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index cef17aa..d75d463c 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -338,6 +338,7 @@
 ব্যবহার করছেন, তাহলে আপনার <ph name="LINK_START" />প্রক্সি সেটিংস<ph name="LINK_END" /> অ্যাডজাস্ট করুন৷</translation>
 <translation id="1512210426710821809">এটি আগের অবস্থায় ফিরিয়ে আনার একমাত্র উপায় হল <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> আবার ইনস্টল করা।</translation>
 <translation id="151501797353681931">Safari থেকে আমদানি করা</translation>
+<translation id="1515163294334130951">লঞ্চ করুন</translation>
 <translation id="1521442365706402292">শংসাপত্রগুলি পরিচালনা করুন</translation>
 <translation id="152234381334907219">কখনও সংরক্ষিত হয়নি</translation>
 <translation id="1524430321211440688">কীবোর্ড</translation>
@@ -439,6 +440,7 @@
 <translation id="167160931442925455">অত্যন্ত বেশি আওয়াজ</translation>
 <translation id="1673137583248014546"><ph name="URL" /> আপনার নিরাপত্তা কী এবং মডেল দেখতে চায়</translation>
 <translation id="1679068421605151609">ডেভেলপার টুল</translation>
+<translation id="1679806121152819234">প্লাগ-ইন VM</translation>
 <translation id="167983332380191032">ম্যানেজমেন্ট পরিষেবা HTTP সমস্যা পাঠিয়েছে।</translation>
 <translation id="1680849702532889074">আপনার Linux অ্যাপ ইনস্টলেশনের সময় সমস্যা হয়েছে।</translation>
 <translation id="16815041330799488">ক্লিপবোর্ডে কপি করা টেক্সট এবং ছবি কোনও সাইটকে দেখার অনুমতি দেবেন না</translation>
@@ -961,7 +963,6 @@
 <translation id="2496180316473517155">ব্রাউজিং ইতিহাস</translation>
 <translation id="2497229222757901769">মাউসের গতি</translation>
 <translation id="2497852260688568942">আপনার প্রশাসকের দ্বারা সিঙ্ক অক্ষম করা হয়েছে</translation>
-<translation id="249819058197909513">এই অ্যাপ্লিকেশানটির জন্য আবার সতর্ক করবেন না</translation>
 <translation id="2498539833203011245">ছোট করুন</translation>
 <translation id="2498765460639677199">অতি বৃহত্</translation>
 <translation id="2499747912851752301">পাসওয়ার্ড এক্সপোর্ট করা হচ্ছে...</translation>
@@ -1050,7 +1051,6 @@
 <translation id="2630681426381349926">শুরু করার জন্য ওয়াই-ফাই এর সাথে সংযুক্ত হোন</translation>
 <translation id="2631120081682787498">আপনি কি এই ট্যাবটি বন্ধ করতে চান?</translation>
 <translation id="2631498379019108537">শেল্ফে ইনপুট বিকল্পগুলি দেখান</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> ডিস্কের <ph name="USAGE" /> এমবি স্থান ব্যবহার করছে৷</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" সরাবেন?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ইনস্টলেশন সম্পূর্ণ করতে পারেনি, তবে এটির ডিস্ক ইমেজ থেকে চালনা চলতে থাকবে৷</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">পুনরুদ্ধার করুন</translation>
 <translation id="3158033540161634471">আপনার আঙ্গুলের ছাপ সেট-আপ করুন</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (হার্ডওয়্যার-সাহায্যপ্রাপ্ত)</translation>
-<translation id="316125635462764134">অ্যাপ্লিকেশান সরান</translation>
 <translation id="3161522574479303604">সকল ভাষা</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> বিক্রেতার থেকে অজানা পণ্য <ph name="PRODUCT_ID" /></translation>
 <translation id="3165390001037658081">কিছু পরিষেবা প্রদানকারী এই বৈশিষ্ট্যকে অবরুদ্ধ করতে পারে।</translation>
@@ -1710,7 +1709,7 @@
 <translation id="3664511988987167893">এক্সটেনশনের আইকন</translation>
 <translation id="3665589677786828986">Chrome শনাক্ত করেছে যে অন্য কোনো প্রোগ্রাম আপনার কিছু সেটিংয়ের ক্ষতি করেছে এবং সেগুলিকে তাদের মূল ডিফল্টে রিসেট করেছে।</translation>
 <translation id="3668570675727296296">ভাষা সেটিংস</translation>
-<translation id="366867565525278777">স্টোরেজের জন্য যথেষ্ট জায়গা নেই বলে ইনস্টল করা যায়নি। কমপক্ষে <ph name="INSTALL_SIZE" /> জায়গা খালি থাকা প্রয়োজন। জায়গা খালি করতে, ডিভাইসের স্টোরেজ থেকে কিছু ফাইল মুছুন।</translation>
+<translation id="366867565525278777">স্টোরেজের জায়গা নেই বলে ইনস্টল করা যায়নি। কমপক্ষে <ph name="INSTALL_SIZE" /> জায়গা খালি থাকা প্রয়োজন। জায়গা খালি করতে, ডিভাইসের স্টোরেজ থেকে কিছু ফাইল মুছুন।</translation>
 <translation id="3668801437375206837">ব্লুটুথ সমস্যাকে আরও ভালভাবে নির্ধারন করতে, Googlers তাদের ফিডব্যাক রিপোর্টের সাথে অতিরিক্ত ব্লুটুথ লগও অন্তর্ভুক্ত করতে পারে। এই বিকল্পটি বেছে নিলে PII যতখানি সম্ভব বাদ দিয়ে আপনার বর্তমান সেশন থেকে btsnoop এবং HCI লগ এই রিপোর্টে অন্তর্ভুক্ত করা হয়। শুধুমাত্র Listnr-এ Chrome OS প্রোডাক্ট গ্রুপের ম্যানেজাররা এই লগ অ্যাক্সেস করতে পারবেন। ৯০ দিন পরে লগ স্থায়ীভাবে মুছে ফেলা হবে।</translation>
 <translation id="3668823961463113931">হ্যান্ডলার</translation>
 <translation id="3670113805793654926">যেকোনও ভেন্ডর থেকে ডিভাইস</translation>
@@ -1895,6 +1894,7 @@
 <translation id="3916445069167113093"> এই প্রকারের ফাইল আপনার কম্পিউটারের ক্ষতি করতে পারে৷ আপনি কি যেকোনো ভাবে <ph name="FILE_NAME" /> রাখতে চান?</translation>
 <translation id="3918972485393593704">Google এ বিশদে অভিযোগ করুন</translation>
 <translation id="3919145445993746351">আপনার সব কম্পিউটারে এক্সটেনশন পেতে, সিঙ্ক চালু করুন</translation>
+<translation id="391999873395511996">ভার্চুয়াল মেশিন ডাউনলোড করা হচ্ছে।</translation>
 <translation id="3920504717067627103">সার্টিফিকেটের নীতিসমূহ</translation>
 <translation id="392089482157167418">ChromeVox (কথ্য প্রতিবার্তা) চালু করুন</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1945,7 +1945,6 @@
 <translation id="3983586614702900908">একটি অজানা বিক্রেতা থেকে ডিভাইসগুলি</translation>
 <translation id="3984159763196946143">ডেমো মোড শুরু করা যায়নি</translation>
 <translation id="3984431586879874039">এই সাইটকে আপনার নিরাপত্তা কী দেখতে দিতে চান?</translation>
-<translation id="3987348946546879621">ডেটা বাঁচানো হয়েছে</translation>
 <translation id="3987938432087324095">বোঝা গেল না।</translation>
 <translation id="3988996860813292272">সময় অঞ্চল বেছে নিন</translation>
 <translation id="399179161741278232">আমদানিকৃত</translation>
@@ -1976,7 +1975,6 @@
 <translation id="4037889604535939429">ব্যক্তির সম্পাদনা করুন</translation>
 <translation id="4042264909745389898">Google Chrome OS শর্তাদি</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{পৃষ্ঠাটি ছেড়ে যান}one{পৃষ্ঠাগুলি ছেড়ে যান}other{পৃষ্ঠাগুলি ছেড়ে যান}}</translation>
-<translation id="404299405565920089">অ্যাপ এবং ওয়েবসাইটে আপনার সাইন-ইন করা সমস্ত Google অ্যাকাউন্ট এখানে ম্যানেজ করা যাবে। সঠিকভাবে কাজ করার জন্য যেসব অ্যাপ এবং ওয়েবসাইটকে আপনি অ্যাকাউন্ট সংক্রান্ত তথ্য অ্যাক্সেস করার অনুমতি দিয়েছেন, সেগুলি সেই তথ্য অ্যাক্সেস করতে পারবে।</translation>
 <translation id="4044612648082411741">আপনার সার্টিফিকেটের পাসওয়ার্ড লিখুন</translation>
 <translation id="404493185430269859">ডিফল্ট সার্চ ইঞ্জিন</translation>
 <translation id="4046123991198612571">পরবর্তী ট্র্যাক</translation>
@@ -2091,7 +2089,6 @@
 <translation id="4242533952199664413">সেটিংস খুলুন</translation>
 <translation id="4242577469625748426">ডিভাইসে নীতি সেটিংস ইনস্টল করা যায়নি: <ph name="VALIDATION_ERROR" />৷</translation>
 <translation id="4244238649050961491">আরও স্টাইলাস স্টাইলাস অ্যাপ খুঁজুন</translation>
-<translation id="424546999567421758">খুব বেশি পরিমান ডিস্কের ব্যবহার শনাক্ত করা হয়েছে</translation>
 <translation id="424726838611654458">সর্বদা Adobe Reader এ খুলুন</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" />-এর সাথে সিঙ্ক করা যাবে না</translation>
 <translation id="4249248555939881673">নেটওয়ার্ক সংযোগের জন্য অপেক্ষা করা হচ্ছে...</translation>
@@ -2199,7 +2196,6 @@
 <translation id="4421932782753506458">ফুঁয়োফুঁয়ো</translation>
 <translation id="4422347585044846479">এই পৃষ্ঠার বুকমার্ক সম্পাদনা করুন</translation>
 <translation id="4423376891418188461">সেটিংস পুনরুদ্ধার করুন</translation>
-<translation id="4423482519432579560">&amp;বানান পরীক্ষা</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, আপনার প্রশাসক চায় যে আপনি আপনার পাসওয়ার্ড পরিবর্তন করুন।</translation>
 <translation id="4430019312045809116">ভলিউম</translation>
 <translation id="4430369329743628066">বুকমার্ক যুক্ত হয়েছে</translation>
@@ -2659,8 +2655,6 @@
 <translation id="5187295959347858724">আপনি এখন <ph name="SHORT_PRODUCT_NAME" />এ সাইন-ইন করেছেন৷ আপনার বুকমার্ক, ইতিহাস এবং অন্য সেটিংস আপনার Google অ্যাকাউন্টে সিঙ্ক করা হচ্ছে৷</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> একাধিক ফাইল ডাউনলোড করতে চায়</translation>
-<translation id="5192316339598592690">অ্যাকাউন্ট দ্রুত পাল্টান এবং অ্যাপ ও ওয়েবসাইটে একই সাথে সাইন-ইন করুন।
-    অ্যাপ ও সাইট আপনার Google অ্যাকাউন্টের কিছু তথ্য ব্যবহার করার অনুমতি চাইতে পারে। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">ডিভাইস পাওয়ারওয়াশ করে আবার চেষ্টা করুন।</translation>
 <translation id="5204967432542742771">পাসওয়ার্ড প্রবেশ করান</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" মুছবেন?</translation>
@@ -3341,7 +3335,6 @@
 <translation id="622537739776246443">প্রোফাইল মুছে ফেলা হবে</translation>
 <translation id="6225475702458870625">আপনার <ph name="PHONE_NAME" /> থেকে ডেটা সংযোগ পাওয়া যাচ্ছে</translation>
 <translation id="6226777517901268232">ব্যক্তিগত কী ফাইল (ঐচ্ছিক)</translation>
-<translation id="6228516488918914827">আরও দ্রুত পৃষ্ঠা লোড হয়েছে</translation>
 <translation id="6228691855869374890">এই সাইটির MIDI ডিভাইসগুলির উপর সম্পূর্ণ নিয়ন্ত্রণ আছে৷</translation>
 <translation id="6229890768313448549">Google Play পরিষেবার শর্তাদি লোড করা যাবে না। পুনরায় চেষ্টা করুন।</translation>
 <translation id="6231881193380278751">পৃষ্ঠাটি অটো-রিফ্রেশ করতে URL-এ কোনো কোয়েরি param যোগ করুন: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3546,7 +3539,6 @@
 <translation id="6545665334409411530">পুনরাবৃত্তির হার</translation>
 <translation id="6545834809683560467">সার্চগুলি এবং অ্যাড্রেস বারে টাইপ করা ইউআরএলগুলি অথবা অ্যাপ লঞ্চার সার্চ বাক্স সম্পূর্ণ করার বিষয়ে সহায়তা করার জন্য একটি পূর্বানুমান পরিষেবা ব্যবহার করুন</translation>
 <translation id="6545867563032584178">Mac-এর সিস্টেম অভিরুচিতে মাইক্রোফোন বন্ধ করা আছে</translation>
-<translation id="6547316139431024316">এই এক্সটেনশনটি জন্য আবার সতর্ক করবেন না</translation>
 <translation id="6547354035488017500">কমপক্ষে ৫১২ MB জায়গা ফাঁকা করুন, নাহলে আপনার ডিভাইস সাড়া দেবে না। জায়গা খালি করার জন্য, ডিভাইসের স্টোরেজ থেকে ফাইল মুছুন।</translation>
 <translation id="6550675742724504774">বিকল্পসমূহ</translation>
 <translation id="6551508934388063976">কম্যান্ড উপলভ্য নেই৷ একটি নতুন উইন্ডো খুলতে control-N টিপুন৷</translation>
@@ -4675,7 +4667,6 @@
 <translation id="827097179112817503">হোম বোতাম দেখান</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{১টি বুকমার্ক মোছা হয়েছে}one{#টি বুকমার্ক মোছা হয়েছে}other{#টি বুকমার্ক মোছা হয়েছে}}</translation>
 <translation id="8272443605911821513">"আরও টুলগুলির মেনুতে" এক্সটেনশনগুলি ক্লিক করে আপনার এক্সটেনশনগুলি পরিচালনা করুন৷</translation>
-<translation id="8272966760965438857">এক জায়গায় আপনার সব Google অ্যাকাউন্ট ম্যানেজ করুন</translation>
 <translation id="8274332263553132018">ফাইল কাস্ট করুন</translation>
 <translation id="8274924778568117936">আপডেটটি সম্পূর্ণ না হওয়া পর্যন্ত <ph name="DEVICE_TYPE" />টি বন্ধ করবেন না। ইনস্টলেশন হয়ে গেলে <ph name="DEVICE_TYPE" />টি নিজে থেকেই রিস্টার্ট হবে।</translation>
 <translation id="8275038454117074363">আমদানি</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index dfea3bf..827fd964 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -338,6 +338,7 @@
     servidor intermediari, ajusteu la <ph name="LINK_START" />configuració del servidor intermediari<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">L'única manera de desfer aquesta acció és tornar a instal·lar <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importat de Safari</translation>
+<translation id="1515163294334130951">Inicia</translation>
 <translation id="1521442365706402292">Administra certificats</translation>
 <translation id="152234381334907219">Contrasenyes que no es desen mai</translation>
 <translation id="1524430321211440688">Teclat</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Volum màxim</translation>
 <translation id="1673137583248014546"><ph name="URL" /> vol veure la marca i el model de la teva clau de seguretat</translation>
 <translation id="1679068421605151609">Eines per a desenvolupadors</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">El servei de gestió ha enviat un error d'HTTP.</translation>
 <translation id="1680849702532889074">S'ha produït un error en instal·lar l'aplicació per a Linux.</translation>
 <translation id="16815041330799488">No permetis que els llocs web vegin el text i les imatges copiats al porta-retalls</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">No es pot connectar el dispositiu al domini. Comprova que no hagis superat el nombre de dispositius que hi pots afegir.</translation>
 <translation id="1744108098763830590">pàgina en segon pla</translation>
 <translation id="1745520510852184940">Fes-ho sempre</translation>
+<translation id="1746402432151920942">Identificador de contingut multimèdia protegit</translation>
 <translation id="175196451752279553">T&amp;orna a obrir la pestanya tancada</translation>
 <translation id="1753905327828125965">Els més visitats</translation>
 <translation id="1756681705074952506">Mètode d'introducció de text</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Sessió no iniciada</translation>
 <translation id="1832511806131704864">Canvi de telèfon actualitzat</translation>
 <translation id="1834503245783133039">Error en la baixada: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Dispositius MIDI</translation>
 <translation id="1838374766361614909">Esborra la cerca</translation>
 <translation id="1841545962859478868">És possible que l'administrador del dispositiu supervisi el següent:</translation>
 <translation id="1841616161104323629">Falta el registre del dispositiu.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Informa d'un problema</translation>
 <translation id="2220572644011485463">PIN o contrasenya</translation>
 <translation id="2224444042887712269">Aquesta configuració pertany a <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Esdeveniments d'accessibilitat</translation>
 <translation id="2224551243087462610">Edita el nom de la carpeta</translation>
 <translation id="2226449515541314767">S'ha impedit que aquest lloc tingui control total dels dispositius MIDI.</translation>
 <translation id="2226720438730111184">Indica'ns el problema</translation>
@@ -962,7 +967,6 @@
 <translation id="2496180316473517155">Historial de navegació</translation>
 <translation id="2497229222757901769">Velocitat del ratolí</translation>
 <translation id="2497852260688568942">L'administrador ha desactivat la sincronització</translation>
-<translation id="249819058197909513">No em tornis a avisar per a aquesta aplicació</translation>
 <translation id="2498539833203011245">Minimitza</translation>
 <translation id="2498765460639677199">Enorme</translation>
 <translation id="2499747912851752301">S'estan exportant les contrasenyes...</translation>
@@ -1049,7 +1053,6 @@
 <translation id="2630681426381349926">Connecteu-vos a la xarxa Wi-Fi per començar</translation>
 <translation id="2631120081682787498">Confirmes que vols tancar aquesta pestanya?</translation>
 <translation id="2631498379019108537">Mostra opcions d'introducció al prestatge</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> està utilitzant <ph name="USAGE" /> MB d'espai de disc.</translation>
 <translation id="2633212996805280240">Voleu eliminar "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> no ha pogut completar la instal·lació, però es continuarà executant des de la imatge de disc.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1393,7 +1396,6 @@
 <translation id="3157931365184549694">Restaura</translation>
 <translation id="3158033540161634471">Configura l'empremta digital</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (emmagatzemat en maquinari)</translation>
-<translation id="316125635462764134">Suprimeix l'aplicació</translation>
 <translation id="3161522574479303604">Tots els idiomes</translation>
 <translation id="3163201441334626963">Producte desconegut <ph name="PRODUCT_ID" /> del proveïdor <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Alguns operadors de telefonia mòbil poden bloquejar aquesta funció.</translation>
@@ -1893,6 +1895,7 @@
 <translation id="3916445069167113093">Aquest tipus de fitxer pot malmetre el vostre equip. Voleu mantenir <ph name="FILE_NAME" /> igualment?</translation>
 <translation id="3918972485393593704">Informa dels detalls a Google</translation>
 <translation id="3919145445993746351">Per accedir a les extensions des de tots els ordinadors, activa la sincronització</translation>
+<translation id="391999873395511996">S'està baixant la màquina virtual.</translation>
 <translation id="3920504717067627103">Normes de certificats</translation>
 <translation id="392089482157167418">Activa ChromeVox (comentaris de veu)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1943,7 +1946,6 @@
 <translation id="3983586614702900908">dispositius d'un proveïdor desconegut</translation>
 <translation id="3984159763196946143">No s'ha pogut iniciar el mode de demostració</translation>
 <translation id="3984431586879874039">Vols permetre que aquest lloc web vegi la teva clau de seguretat?</translation>
-<translation id="3987348946546879621">Dades estalviades</translation>
 <translation id="3987938432087324095">No ho he entès.</translation>
 <translation id="3988996860813292272">Selecciona la zona horària</translation>
 <translation id="399179161741278232">Importats</translation>
@@ -1974,7 +1976,6 @@
 <translation id="4037889604535939429">Edita la persona</translation>
 <translation id="4042264909745389898">Condicions de Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Surt de la pàgina}other{Surt de les pàgines}}</translation>
-<translation id="404299405565920089">Aquí pots gestionar tots els teus Comptes de Google amb la sessió iniciada en aplicacions i llocs web. Les aplicacions i els llocs web que tinguin el teu permís podran accedir a la informació del compte que necessitin per funcionar correctament.</translation>
 <translation id="4044612648082411741">Introdueix la contrasenya del certificat</translation>
 <translation id="404493185430269859">Motor de cerca predeterminat</translation>
 <translation id="4046123991198612571">Pista següent</translation>
@@ -2089,7 +2090,6 @@
 <translation id="4242533952199664413">Obre la configuració</translation>
 <translation id="4242577469625748426">No s'ha pogut instal·lar la configuració de la política al dispositiu: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Cerca més aplicacions de llapis òptic</translation>
-<translation id="424546999567421758">Ús de disc elevat detectat</translation>
 <translation id="424726838611654458">Obre sempre a Adobe Reader</translation>
 <translation id="4247901771970415646">No es pot sincronitzar amb <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">S'està esperant la connexió de xarxa...</translation>
@@ -2197,7 +2197,6 @@
 <translation id="4421932782753506458">Gatet</translation>
 <translation id="4422347585044846479">Editeu l'adreça d'interès d'aquesta pàgina</translation>
 <translation id="4423376891418188461">Restaura la configuració</translation>
-<translation id="4423482519432579560">&amp;Corrector ortogràfic</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, l'administrador necessita que canviïs la contrasenya.</translation>
 <translation id="4430019312045809116">Volum</translation>
 <translation id="4430369329743628066">S'ha afegit a les adreces d'interès</translation>
@@ -2657,8 +2656,6 @@
 <translation id="5187295959347858724">Ara teniu la sessió iniciada a <ph name="SHORT_PRODUCT_NAME" />. Les vostres adreces d'interès, l'historial i altres opcions de configuració s'estan sincronitzant amb el vostre compte de Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vol baixar diversos fitxers</translation>
-<translation id="5192316339598592690">Canvia de compte ràpidament i inicia la sessió en aplicacions i llocs web a la vegada.
-    Pot ser que les aplicacions i els llocs web et demanin permís per utilitzar part de la teva informació del Compte de Google. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Fes un Powerwash del dispositiu i torna-ho a provar.</translation>
 <translation id="5204967432542742771">Escriviu la contrasenya</translation>
 <translation id="5206215183583316675">Vols suprimir "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3339,7 +3336,6 @@
 <translation id="622537739776246443">El perfil se suprimirà</translation>
 <translation id="6225475702458870625">Connexió de dades disponible des del teu <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Fitxer de clau privada (opcional)</translation>
-<translation id="6228516488918914827">S'ha carregat una pàgina més ràpidament</translation>
 <translation id="6228691855869374890">Aquest lloc té un control complet dels dispositius MIDI.</translation>
 <translation id="6229890768313448549">Les Condicions del servei de Google Play no es poden carregar. Torna-ho a provar.</translation>
 <translation id="6231881193380278751">Afegiu un paràmetre de consulta a l'URL per actualitzar la pàgina de manera automàtica: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3544,7 +3540,6 @@
 <translation id="6545665334409411530">Freqüència de repetició</translation>
 <translation id="6545834809683560467">Utilitza un servei de predicció per completar fàcilment les cerques i els URL introduïts a la barra d'adreces o al quadre de cerca del menú d'aplicacions.</translation>
 <translation id="6545867563032584178">El micròfon està desactivat a les preferències del sistema de Mac</translation>
-<translation id="6547316139431024316">No em tornis a avisar per a aquesta extensió</translation>
 <translation id="6547354035488017500">Si no alliberes almenys 512 MB d'espai, el dispositiu deixarà de respondre. Per fer-ho, suprimeix fitxers de l'emmagatzematge del dispositiu.</translation>
 <translation id="6550675742724504774">Opcions</translation>
 <translation id="6551508934388063976">L'ordre no està disponible. Premeu Ctrl + N per obrir una finestra nova.</translation>
@@ -4672,7 +4667,6 @@
 <translation id="827097179112817503">Mostra el botó Pàgina d'inici</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{S'ha suprimit 1 adreça d'interès}other{S'han suprimit # adreces d'interès}}</translation>
 <translation id="8272443605911821513">Per gestionar les extensions, feu clic a Extensions al menú Més eines.</translation>
-<translation id="8272966760965438857">Gestiona els teus Comptes de Google des d'un sol lloc</translation>
 <translation id="8274332263553132018">Emet el fitxer</translation>
 <translation id="8274924778568117936">No apaguis ni tanquis el dispositiu <ph name="DEVICE_TYPE" /> fins que l'actualització no hagi finalitzat. <ph name="DEVICE_TYPE" /> es reiniciarà un cop finalitzi la instal·lació.</translation>
 <translation id="8275038454117074363">Importa</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index f473441..86a32bb 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -338,6 +338,7 @@
    upravte svá <ph name="LINK_START" />nastavení proxy serveru<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Jediný způsob, jak tuto akci vrátit zpět, je přeinstalovat systém <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="151501797353681931">Importováno z prohlížeče Safari</translation>
+<translation id="1515163294334130951">Spustit</translation>
 <translation id="1521442365706402292">Správa certifikátů</translation>
 <translation id="152234381334907219">Neuloženo</translation>
 <translation id="1524430321211440688">Klávesnice</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Nejhlasitější</translation>
 <translation id="1673137583248014546"><ph name="URL" /> chce zjistit model a značku vašeho bezpečnostního klíče</translation>
 <translation id="1679068421605151609">Nástroje pro vývojáře</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Služba správy odeslala chybu protokolu HTTP.</translation>
 <translation id="1680849702532889074">Při instalaci vaší aplikace pro Linux došlo k chybě.</translation>
 <translation id="16815041330799488">Nepovolovat webům přístup k textu a obrázkům zkopírovaným do schránky</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Zařízení do domény nelze přidat. Zkontrolujte, zda jste nepřekročili maximální počet zařízení, která můžete přidat.</translation>
 <translation id="1744108098763830590">stránka na pozadí</translation>
 <translation id="1745520510852184940">Vždy provádět tuto akci</translation>
+<translation id="1746402432151920942">Identifikátor chráněného média</translation>
 <translation id="175196451752279553">Znovu ot&amp;evřít zavřenou kartu</translation>
 <translation id="1753905327828125965">Nejnavštěvovanější</translation>
 <translation id="1756681705074952506">Metoda zadávání dat</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Nejste přihlášeni</translation>
 <translation id="1832511806131704864">Změna telefonu aktualizována</translation>
 <translation id="1834503245783133039">Stažení se nezdařilo: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Zařízení MIDI</translation>
 <translation id="1838374766361614909">Vymazat vyhledávání</translation>
 <translation id="1841545962859478868">Správce zařízení může sledovat toto:</translation>
 <translation id="1841616161104323629">Chybí záznam zařízení.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Nahlásit problém</translation>
 <translation id="2220572644011485463">PIN nebo heslo</translation>
 <translation id="2224444042887712269">Toto nastavení patří uživateli <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Události přístupnosti</translation>
 <translation id="2224551243087462610">Upravit název složky</translation>
 <translation id="2226449515541314767">U tohoto webu byla zablokována úplná kontrola zařízení MIDI.</translation>
 <translation id="2226720438730111184">Sdělte nám, co se děje</translation>
@@ -962,7 +967,6 @@
 <translation id="2496180316473517155">Historie procházení</translation>
 <translation id="2497229222757901769">Rychlost myši</translation>
 <translation id="2497852260688568942">Synchronizace je administrátorem zakázána.</translation>
-<translation id="249819058197909513">Pro tuto aplikaci již upozornění nezobrazovat</translation>
 <translation id="2498539833203011245">Minimalizovat</translation>
 <translation id="2498765460639677199">Obrovské</translation>
 <translation id="2499747912851752301">Exportování hesel...</translation>
@@ -1050,7 +1054,6 @@
 <translation id="2630681426381349926">Chcete-li začít, připojte se k síti Wi-Fi</translation>
 <translation id="2631120081682787498">Opravdu tuto kartu chcete zavřít?</translation>
 <translation id="2631498379019108537">Zobrazovat na poličce možnosti vstupu</translation>
-<translation id="2633199387167390344">Aplikace nebo rozšíření <ph name="NAME" /> používá <ph name="USAGE" /> MB místa na disku.</translation>
 <translation id="2633212996805280240">Odstranit rozšíření <ph name="EXTENSION_NAME" />?</translation>
 <translation id="263325223718984101">Aplikace <ph name="PRODUCT_NAME" /> nemůže dokončit svou instalaci, ale bude se i nadále spouštět z bitové kopie disku.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1088,7 +1091,7 @@
 <translation id="2677748264148917807">Odejít</translation>
 <translation id="2678063897982469759">Znovu aktivovat</translation>
 <translation id="268053382412112343">&amp;Historie</translation>
-<translation id="2682498795777673382">Aktualita od rodiče</translation>
+<translation id="2682498795777673382">Novinka od rodiče</translation>
 <translation id="2683638487103917598">Složka je seřazena</translation>
 <translation id="2684004000387153598">Chcete-li pokračovat, klikněte na OK a poté kliknutím na Přidat uživatele vytvořte nový profil pro svou novou e-mailovou adresu.</translation>
 <translation id="2688196195245426394">Při registraci zařízení na serveru došlo k chybě: <ph name="CLIENT_ERROR" />.</translation>
@@ -1304,7 +1307,7 @@
 <translation id="3012917896646559015">Požádejte prosím bezodkladně výrobce hardwaru, aby počítač poslal k opravě.</translation>
 <translation id="3013291976881901233">Zařízení MIDI</translation>
 <translation id="3015639418649705390">Restartovat</translation>
-<translation id="3016329696181678353">Tiskárnu <ph name="PRINTER_NAME" /> se automaticky nakonfigurovat nepodařilo. Zadejte rozšířené podrobnosti o tiskárně.</translation>
+<translation id="3016329696181678353">Tiskárnu <ph name="PRINTER_NAME" /> se nepodařilo nakonfigurovat automaticky. Zadejte rozšířené podrobnosti o tiskárně.</translation>
 <translation id="3016641847947582299">Komponenta byla aktualizována</translation>
 <translation id="3016780570757425217">Přístup k údajům o vaší poloze</translation>
 <translation id="3020183492814296499">Zkratky</translation>
@@ -1396,7 +1399,6 @@
 <translation id="3157931365184549694">Obnovit</translation>
 <translation id="3158033540161634471">Nastavení otisku prstu</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardwarový)</translation>
-<translation id="316125635462764134">Odstranit aplikaci</translation>
 <translation id="3161522574479303604">Všechny jazyky</translation>
 <translation id="3163201441334626963">Neznámý produkt <ph name="PRODUCT_ID" /> od dodavatele <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Někteří operátoři mohou tuto funkci blokovat.</translation>
@@ -1895,6 +1897,7 @@
 <translation id="3916445069167113093">Tento typ souboru může poškodit počítač. Chcete soubor <ph name="FILE_NAME" /> i přesto uložit?</translation>
 <translation id="3918972485393593704">Nahlásit podrobnosti do Googlu</translation>
 <translation id="3919145445993746351">Chcete-li svá rozšíření mít na všech svých počítačích, zapněte synchronizaci</translation>
+<translation id="391999873395511996">Probíhá stahování virtuálního počítače.</translation>
 <translation id="3920504717067627103">Zásady certifikátů</translation>
 <translation id="392089482157167418">Zapnout funkci ChromeVox (hlasovou odezvu)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1945,7 +1948,6 @@
 <translation id="3983586614702900908">zařízení od neznámého dodavatele</translation>
 <translation id="3984159763196946143">Ukázkový režim nelze spustit</translation>
 <translation id="3984431586879874039">Povolit tomuto webu přístup k vašemu bezpečnostnímu klíči?</translation>
-<translation id="3987348946546879621">Byla uspořena data</translation>
 <translation id="3987938432087324095">Pardon, nerozumím.</translation>
 <translation id="3988996860813292272">Vyberte časové pásmo</translation>
 <translation id="399179161741278232">Importované</translation>
@@ -1976,7 +1978,6 @@
 <translation id="4037889604535939429">Úprava osoby</translation>
 <translation id="4042264909745389898">Smluvní podmínky systému Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Opustit stránku}few{Opustit stránky}many{Opustit stránky}other{Opustit stránky}}</translation>
-<translation id="404299405565920089">Tady můžete spravovat všechny svoje přihlášené účty z aplikací a webů. Aplikace a weby s příslušným oprávněním mají přístup k informacím ve vašem účtu, aby mohly fungovat správně.</translation>
 <translation id="4044612648082411741">Zadejte heslo certifikátu</translation>
 <translation id="404493185430269859">Výchozí vyhledávač</translation>
 <translation id="4046123991198612571">Další skladba</translation>
@@ -2091,7 +2092,6 @@
 <translation id="4242533952199664413">Otevřít Nastavení</translation>
 <translation id="4242577469625748426">Instalace nastavení zásady v zařízení se nezdařila: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Najít další aplikace pro dotyková pera</translation>
-<translation id="424546999567421758">Bylo zjištěno vysoké využití disku</translation>
 <translation id="424726838611654458">Vždy otevřít v aplikaci Adobe Reader</translation>
 <translation id="4247901771970415646">Synchronizace na účet <ph name="USERNAME" /> se nezdařila</translation>
 <translation id="4249248555939881673">Čeká se na připojení k síti...</translation>
@@ -2199,7 +2199,6 @@
 <translation id="4421932782753506458">Kotě</translation>
 <translation id="4422347585044846479">Upravit záložku pro tuto stránku</translation>
 <translation id="4423376891418188461">Obnovit nastavení</translation>
-<translation id="4423482519432579560">&amp;Kontrola pravopisu</translation>
 <translation id="442397852638519243">Zpráva pro uživatele <ph name="USER_NAME" />: váš administrátor vyžaduje, abyste si změnili heslo.</translation>
 <translation id="4430019312045809116">Hlasitost</translation>
 <translation id="4430369329743628066">Byla přidána záložka</translation>
@@ -2659,8 +2658,6 @@
 <translation id="5187295959347858724">Nyní jste přihlášeni do prohlížeče <ph name="SHORT_PRODUCT_NAME" />. Vaše záložky, historie a další nastavení se synchronizují s účtem Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> se pokouší stáhnout několik souborů</translation>
-<translation id="5192316339598592690">Rychle přepínejte účty a přihlašujte se do aplikací a na weby okamžitě.
-    Aplikace a weby vás mohou žádat o oprávnění k použití některých údajů z vašeho účtu Google. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Vymažte zařízení pomocí funkce Powerwash a zkuste to znovu.</translation>
 <translation id="5204967432542742771">Zadejte heslo</translation>
 <translation id="5206215183583316675">Smazat certifikát <ph name="CERTIFICATE_NAME" />?</translation>
@@ -2949,7 +2946,7 @@
 <translation id="5620568081365989559">Nástroj DevTools požaduje úplný přístup ke složce <ph name="FOLDER_PATH" />. Dejte pozor, abyste mu nezpřístupnili žádné citlivé informace.</translation>
 <translation id="5620612546311710611">statistiky využití</translation>
 <translation id="5620655347161642930">Exportovat hesla...</translation>
-<translation id="5623282979409330487">Tento web používá vaše senzory pohybu.</translation>
+<translation id="5623282979409330487">Tento web používá senzory pohybu.</translation>
 <translation id="5623842676595125836">Protokol</translation>
 <translation id="5624120631404540903">Spravovat hesla</translation>
 <translation id="5626134646977739690">Jméno:</translation>
@@ -3339,7 +3336,6 @@
 <translation id="622537739776246443">Profil bude smazán</translation>
 <translation id="6225475702458870625">Je k dispozici datové připojení z vašeho zařízení <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Soubor soukromého klíče (volitelné)</translation>
-<translation id="6228516488918914827">Byla načtena rychlejší stránka</translation>
 <translation id="6228691855869374890">Tento web má úplnou kontrolu nad zařízeními MIDI.</translation>
 <translation id="6229890768313448549">Smluvní podmínky služby Google Play nelze načíst. Zkuste to prosím znovu.</translation>
 <translation id="6231881193380278751">Přidejte do adresy URL parametr dotazu pro automatickou aktualizaci stránky: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3544,7 +3540,6 @@
 <translation id="6545665334409411530">Rychlost opakování</translation>
 <translation id="6545834809683560467">Používat službu předpovídání, která pomáhá dokončovat vyhledávací dotazy a adresy URL zadávané do adresního řádku nebo do vyhledávacího pole spouštěče aplikací</translation>
 <translation id="6545867563032584178">Mikrofon je vypnutý v předvolbách systému Macu</translation>
-<translation id="6547316139431024316">Pro toto rozšíření již upozornění nezobrazovat</translation>
 <translation id="6547354035488017500">Uvolněte alespoň 512 MB místa, jinak zařízení přestane reagovat. Místo uvolníte smazáním souborů z úložiště zařízení.</translation>
 <translation id="6550675742724504774">Možnosti</translation>
 <translation id="6551508934388063976">Příkaz není k dispozici. Stisknutím kombinace kláves Ctrl+N otevřete nové okno prohlížeče.</translation>
@@ -4672,7 +4667,6 @@
 <translation id="827097179112817503">Zobrazit tlačítko Domovská stránka</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Byla smazána 1 záložka}few{Byly smazány # záložky}many{Bylo smazáno # záložky}other{Bylo smazáno # záložek}}</translation>
 <translation id="8272443605911821513">Chcete-li spravovat rozšíření, klikněte v nabídce Nástroje na příkaz Rozšíření.</translation>
-<translation id="8272966760965438857">Spravujte své účty Google na jednom místě</translation>
 <translation id="8274332263553132018">Odešlete soubor</translation>
 <translation id="8274924778568117936">V průběhu aktualizace <ph name="DEVICE_TYPE" /> nevypínejte ani nezavírejte. Po dokončení instalace se <ph name="DEVICE_TYPE" /> restartuje.</translation>
 <translation id="8275038454117074363">Importovat</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 7cb63daa..1366625d 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -338,6 +338,7 @@
     proxyserver, skal du justere dine <ph name="LINK_START" />proxyindstillinger<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Den eneste måde at fortryde dette på er ved at geninstallere <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importeret fra Safari</translation>
+<translation id="1515163294334130951">Start</translation>
 <translation id="1521442365706402292">Administrer certifikater</translation>
 <translation id="152234381334907219">Gemmes aldrig</translation>
 <translation id="1524430321211440688">Tastatur</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">Højest</translation>
 <translation id="1673137583248014546"><ph name="URL" /> ønsker at se din sikkerhedsnøgles fabrikat og model</translation>
 <translation id="1679068421605151609">Udviklerværktøjer</translation>
+<translation id="1679806121152819234">PluginVm</translation>
 <translation id="167983332380191032">Administrationstjenesten sendte en HTTP-fejl.</translation>
 <translation id="1680849702532889074">Der opstod en fejl ved installationen af Linux-appen.</translation>
 <translation id="16815041330799488">Tillad ikke, at websites kan se tekst og billeder, der er kopieret til udklipsholderen</translation>
@@ -960,7 +962,6 @@
 <translation id="2496180316473517155">Browserhistorik</translation>
 <translation id="2497229222757901769">Musehastighed</translation>
 <translation id="2497852260688568942">Synkronisering er deaktiveret af din administrator.</translation>
-<translation id="249819058197909513">Advar ikke om denne app igen</translation>
 <translation id="2498539833203011245">Minimer</translation>
 <translation id="2498765460639677199">Kæmpestor</translation>
 <translation id="2499747912851752301">Eksporterer adgangskoder...</translation>
@@ -1049,7 +1050,6 @@
 <translation id="2630681426381349926">Opret forbindelse til Wi-Fi for at komme i gang</translation>
 <translation id="2631120081682787498">Er du sikker på, at du vil lukke denne fane?</translation>
 <translation id="2631498379019108537">Vis indtastningsmuligheder på hylden</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> bruger <ph name="USAGE" /> MB diskplads.</translation>
 <translation id="2633212996805280240">Vil du fjerne "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101">Installationen af <ph name="PRODUCT_NAME" /> kunne ikke gennemføres, men vil fortsætte kørslen fra dets diskbillede.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1395,7 +1395,6 @@
 <translation id="3157931365184549694">Gendan</translation>
 <translation id="3158033540161634471">Konfigurer dit fingeraftryk</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardwarebaserede)</translation>
-<translation id="316125635462764134">Fjern appen</translation>
 <translation id="3161522574479303604">Alle sprog</translation>
 <translation id="3163201441334626963">Ukendt produkt, <ph name="PRODUCT_ID" />, fra leverandøren <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Nogle mobilselskaber blokerer muligvis denne funktion.</translation>
@@ -1896,6 +1895,7 @@
 <translation id="3916445069167113093">Denne filtype kan beskadige din computer. Vil du beholde <ph name="FILE_NAME" /> alligevel?</translation>
 <translation id="3918972485393593704">Rapportér detaljer til Google</translation>
 <translation id="3919145445993746351">Aktivér synkronisering for at få dine udvidelser på alle dine computere</translation>
+<translation id="391999873395511996">Downloader den virtuelle maskine.</translation>
 <translation id="3920504717067627103">Certifikatpolitikker</translation>
 <translation id="392089482157167418">Aktivér ChromeVox (talefeedback)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1947,7 +1947,6 @@
 <translation id="3983586614702900908">enheder fra en ukendt leverandør</translation>
 <translation id="3984159763196946143">Demotilstand kunne ikke startes</translation>
 <translation id="3984431586879874039">Vil du tillade, at dette website ser din sikkerhedsnøgle?</translation>
-<translation id="3987348946546879621">Sparede data</translation>
 <translation id="3987938432087324095">Det forstod jeg ikke.</translation>
 <translation id="3988996860813292272">Vælg tidszone</translation>
 <translation id="399179161741278232">Importeret</translation>
@@ -1978,7 +1977,6 @@
 <translation id="4037889604535939429">Rediger personen</translation>
 <translation id="4042264909745389898">Vilkår for Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Forlad side}one{Forlad side}other{Forlad sider}}</translation>
-<translation id="404299405565920089">Alle dine Google-konti, der er logget ind i apps og på websites, kan administreres her. Apps og websites, der har din tilladelse, kan få adgang til de kontooplysninger, de skal bruge for at fungere korrekt.</translation>
 <translation id="4044612648082411741">Angiv adgangskoden til dit certifikat</translation>
 <translation id="404493185430269859">Standardsøgemaskine</translation>
 <translation id="4046123991198612571">Næste nummer</translation>
@@ -2093,7 +2091,6 @@
 <translation id="4242533952199664413">Åbn Indstillinger</translation>
 <translation id="4242577469625748426">Det lykkedes ikke at installere politikindstillinger på enheden: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Find flere apps til styluspenne</translation>
-<translation id="424546999567421758">Et højt forbrug af diskplads er blevet registreret</translation>
 <translation id="424726838611654458">Altid åben i Adobe Reader</translation>
 <translation id="4247901771970415646">Der kan ikke synkroniseres med <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Venter på netværksforbindelse...</translation>
@@ -2201,7 +2198,6 @@
 <translation id="4421932782753506458">Pjuske</translation>
 <translation id="4422347585044846479">Rediger bogmærke for denne side</translation>
 <translation id="4423376891418188461">Gendan indstillinger</translation>
-<translation id="4423482519432579560">&amp;Stavekontrol</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, din administrator kræver, at du ændrer din adgangskode.</translation>
 <translation id="4430019312045809116">Lydstyrke</translation>
 <translation id="4430369329743628066">Bogmærket er tilføjet</translation>
@@ -2661,8 +2657,6 @@
 <translation id="5187295959347858724">Du er nu logget ind på <ph name="SHORT_PRODUCT_NAME" />. Dine bogmærker, din historik og dine andre indstillinger synkroniseres med din Google-konto.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vil downloade flere filer</translation>
-<translation id="5192316339598592690">Skift hurtigt konto, og log ind på apps og websites på én gang.
-    Apps og websites kan bede dig om tilladelse til at anvende nogle af dine Google-kontooplysninger. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Udfør en powerwash på enheden, og prøv igen.</translation>
 <translation id="5204967432542742771">Angiv adgangskode</translation>
 <translation id="5206215183583316675">Vil du slette "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3342,7 +3336,6 @@
 <translation id="622537739776246443">Profilen slettes</translation>
 <translation id="6225475702458870625">Dataforbindelse er tilgængelig via <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Privat nøglefil (valgfrit)</translation>
-<translation id="6228516488918914827">Hurtigere sideindlæsning</translation>
 <translation id="6228691855869374890">Dette website har fuld kontrol over MIDI-enheder.</translation>
 <translation id="6229890768313448549">Servicevilkårene for Google Play kan ikke indlæses. Prøv igen.</translation>
 <translation id="6231881193380278751">Tilføj en forespørgselsparameter i webadressen for at opdatere siden automatisk: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3547,7 +3540,6 @@
 <translation id="6545665334409411530">Gentagelseshastighed</translation>
 <translation id="6545834809683560467">Brug en forslagstjeneste til at færdiggøre søgninger og webadresser, der angives i adresselinjen eller søgefeltet i applisten</translation>
 <translation id="6545867563032584178">Mikrofonen er deaktiveret i Systemindstillinger for Mac</translation>
-<translation id="6547316139431024316">Advar ikke om denne udvidelse igen</translation>
 <translation id="6547354035488017500">Din enhed holder op med at svare, hvis du ikke frigør mindst 512 MB. Slet filer fra lageret på enheden for at frigøre plads.</translation>
 <translation id="6550675742724504774">Valgmuligheder</translation>
 <translation id="6551508934388063976">Kommandoen er utilgængelig. Tryk på Ctrl+N for at åbne et nyt vindue.</translation>
@@ -4677,7 +4669,6 @@
 <translation id="827097179112817503">Vis knappen Startside</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 bogmærke er slettet}one{# bogmærke er slettet}other{# bogmærker er slettet}}</translation>
 <translation id="8272443605911821513">Administrer dine udvidelser ved at klikke på Udvidelser i menuen "Flere værktøjer".</translation>
-<translation id="8272966760965438857">Administrer dine Google-konti på ét sted</translation>
 <translation id="8274332263553132018">Cast fil</translation>
 <translation id="8274924778568117936">Undgå at slukke eller lukke din <ph name="DEVICE_TYPE" />, før opdateringen er færdig. Din <ph name="DEVICE_TYPE" /> genstarter, når installationen er fuldført.</translation>
 <translation id="8275038454117074363">Importer</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 8eae4f9..bc1eabec 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">Wenn Sie einen Proxy-Server verwenden, überprüfen Sie Ihre Proxy-Einstellungen oder erkundigen Sie sich bei Ihrem Netzwerkadministrator, ob der Proxy-Server funktioniert. Wenn Sie keinen Proxy-Server verwenden möchten, ändern Sie Ihre <ph name="LINK_START" />Proxy-Einstellungen<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Dies kann nur durch eine Neuinstallation von <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> rückgängig gemacht werden</translation>
 <translation id="151501797353681931">Von Safari importiert</translation>
+<translation id="1515163294334130951">Starten</translation>
 <translation id="1521442365706402292">Zertifikate verwalten</translation>
 <translation id="152234381334907219">Nie speichern für...</translation>
 <translation id="1524430321211440688">Tastatur</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">Am lautesten</translation>
 <translation id="1673137583248014546"><ph name="URL" /> möchte den Hersteller und das Modell Ihres Sicherheitsschlüssels aufrufen</translation>
 <translation id="1679068421605151609">Entwicklertools</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Der Verwaltungsdienst hat einen HTTP-Fehler gemeldet.</translation>
 <translation id="1680849702532889074">Bei der Installation Ihrer Linux-Anwendung ist ein Fehler aufgetreten.</translation>
 <translation id="16815041330799488">Websites keinen Zugriff auf Texte und Bilder gewähren, die sich in der Zwischenablage befinden</translation>
@@ -959,7 +961,6 @@
 <translation id="2496180316473517155">Browserverlauf</translation>
 <translation id="2497229222757901769">Mausgeschwindigkeit</translation>
 <translation id="2497852260688568942">Die Synchronisierung wurde von Ihrem Administrator deaktiviert</translation>
-<translation id="249819058197909513">Für diese App keine Warnung mehr</translation>
 <translation id="2498539833203011245">Minimieren</translation>
 <translation id="2498765460639677199">Riesig</translation>
 <translation id="2499747912851752301">Passwörter werden exportiert…</translation>
@@ -1046,7 +1047,6 @@
 <translation id="2630681426381349926">Verbindung zu WLAN herstellen</translation>
 <translation id="2631120081682787498">Möchten Sie diesen Tab wirklich schließen?</translation>
 <translation id="2631498379019108537">Eingabeoptionen in der Ablage anzeigen</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> nutzt <ph name="USAGE" /> MB an Festplattenspeicher.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" entfernen?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> konnte die Installation nicht abschließen, wird jedoch weiterhin über das Datenträgerabbild ausgeführt.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1392,7 +1392,6 @@
 <translation id="3157931365184549694">Wiederherstellen</translation>
 <translation id="3158033540161634471">Fingerabdruck einrichten</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardwaregestützt)</translation>
-<translation id="316125635462764134">App entfernen</translation>
 <translation id="3161522574479303604">Alle Sprachen</translation>
 <translation id="3163201441334626963">Unbekanntes Produkt <ph name="PRODUCT_ID" /> von Anbieter <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Einige Mobilfunkanbieter blockieren diese Funktion möglicherweise.</translation>
@@ -1708,7 +1707,7 @@
 <translation id="3664511988987167893">Erweiterungssymbol</translation>
 <translation id="3665589677786828986">Chrome hat festgestellt, dass einige Ihrer Einstellungen von einem anderen Programm manipuliert wurden, und hat sie auf die ursprünglichen Standardwerte zurückgesetzt.</translation>
 <translation id="3668570675727296296">Spracheinstellungen</translation>
-<translation id="366867565525278777">Die Installation ist fehlgeschlagen, weil nicht genügend Speicherplatz vorhanden ist. Es sind mindestens <ph name="INSTALL_SIZE" /> erforderlich. Löschen Sie Dateien aus dem Gerätespeicher, um Speicherplatz freizugeben.</translation>
+<translation id="366867565525278777">Bei der Installation ist ein Fehler aufgetreten, da nicht genügend Speicherplatz verfügbar ist. Erforderlicher Speicherplatz: mindestens <ph name="INSTALL_SIZE" />. Löschen Sie Dateien aus dem Gerätespeicher, um Speicherplatz freizugeben.</translation>
 <translation id="3668801437375206837">Damit Bluetooth-Probleme besser diagnostiziert werden können, haben Google-Mitarbeiter die Möglichkeit, Feedbackberichte durch zusätzliche Bluetooth-Protokolle zu ergänzen. Wenn diese Option ausgewählt ist, enthält Ihr Bericht btsnoop- und HCI-Protokolle der aktuellen Sitzung. Personenidentifizierbare Informationen werden dabei so gut wie möglich entfernt. Nur die Administratoren der entsprechenden Chrome OS-Produktgruppe in Listnr haben Zugriff auf die Protokolle. Diese werden nach 90 Tagen dauerhaft gelöscht.</translation>
 <translation id="3668823961463113931">Handler</translation>
 <translation id="3670113805793654926">Geräte von allen Anbietern</translation>
@@ -1893,6 +1892,7 @@
 <translation id="3916445069167113093">Dateien dieses Typs können Schäden an Ihrem Computer verursachen. Möchten Sie <ph name="FILE_NAME" /> trotzdem behalten?</translation>
 <translation id="3918972485393593704">Details an Google senden</translation>
 <translation id="3919145445993746351">Wenn Ihre Erweiterungen auf allen Computern verfügbar sein sollen, aktivieren Sie die Synchronisierung</translation>
+<translation id="391999873395511996">Virtuelle Maschine wird heruntergeladen.</translation>
 <translation id="3920504717067627103">Zertifikatrichtlinien</translation>
 <translation id="392089482157167418">ChromeVox aktivieren (gesprochenes Feedback)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1944,7 +1944,6 @@
 <translation id="3983586614702900908">Geräte von einem unbekannten Anbieter</translation>
 <translation id="3984159763196946143">Demomodus konnte nicht gestartet werden</translation>
 <translation id="3984431586879874039">Zulassen, dass diese Website Ihren Sicherheitsschlüssel ausliest?</translation>
-<translation id="3987348946546879621">Datennutzung reduziert</translation>
 <translation id="3987938432087324095">Dies wurde nicht verstanden.</translation>
 <translation id="3988996860813292272">Zeitzone auswählen</translation>
 <translation id="399179161741278232">Importiert</translation>
@@ -1975,7 +1974,6 @@
 <translation id="4037889604535939429">Person bearbeiten</translation>
 <translation id="4042264909745389898">Nutzungsbedingungen von Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Seite verlassen}other{Seiten verlassen}}</translation>
-<translation id="404299405565920089">Hier können alle Ihre angemeldeten Google-Konten von Apps und Websites verwaltet werden. Apps und Websites, denen Sie die entsprechende Berechtigung erteilt haben, können auf die Kontoinformationen zugreifen, die sie benötigen, um ordnungsgemäß zu funktionieren.</translation>
 <translation id="4044612648082411741">Sie müssen Ihr Zertifikatspasswort eingeben</translation>
 <translation id="404493185430269859">Standardsuchmaschine</translation>
 <translation id="4046123991198612571">Nächster Titel</translation>
@@ -2066,7 +2064,7 @@
 <translation id="4181602000363099176">20-fach</translation>
 <translation id="4181841719683918333">Sprachen</translation>
 <translation id="4184885522552335684">Zum Verschieben des Bildschirms ziehen</translation>
-<translation id="4194570336751258953">Tippen-statt-Klicken aktivieren</translation>
+<translation id="4194570336751258953">Touchpad-Klick aktivieren</translation>
 <translation id="4195643157523330669">In neuem Tab öffnen</translation>
 <translation id="4195814663415092787">Zuletzt angesehene Seiten öffnen</translation>
 <translation id="4198146608511578238">Halten Sie einfach das Launcher-Symbol gedrückt, um mit Ihrem Google Assistant zu sprechen.</translation>
@@ -2090,7 +2088,6 @@
 <translation id="4242533952199664413">Einstellungen öffnen</translation>
 <translation id="4242577469625748426">Fehler beim Installieren der Richtlinieneinstellungen auf dem Gerät: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Mehr Eingabestift-Apps suchen</translation>
-<translation id="424546999567421758">Hohe Festplattennutzung festgestellt</translation>
 <translation id="424726838611654458">Immer mit Adobe Reader öffnen</translation>
 <translation id="4247901771970415646">Synchronisierung mit <ph name="USERNAME" /> nicht möglich</translation>
 <translation id="4249248555939881673">Auf Netzwerkverbindung warten...</translation>
@@ -2198,7 +2195,6 @@
 <translation id="4421932782753506458">Miez</translation>
 <translation id="4422347585044846479">Lesezeichen für diese Seite bearbeiten</translation>
 <translation id="4423376891418188461">Einstellungen wiederherstellen</translation>
-<translation id="4423482519432579560">&amp;Rechtschreibprüfung</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, Ihr Administrator fordert Sie zum Ändern Ihres Passworts auf.</translation>
 <translation id="4430019312045809116">Lautstärke</translation>
 <translation id="4430369329743628066">Lesezeichen hinzugefügt</translation>
@@ -2658,8 +2654,6 @@
 <translation id="5187295959347858724">Sie sind jetzt in <ph name="SHORT_PRODUCT_NAME" /> angemeldet. Ihre Lesezeichen, der Verlauf sowie andere Einstellungen werden mit Ihrem Google-Konto synchronisiert.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> möchte mehrere Dateien herunterladen</translation>
-<translation id="5192316339598592690">Wechseln Sie schnell zwischen Konten und melden Sie sich gleichzeitig bei Apps und Websites an.
-    Apps und Websites können Sie um Erlaubnis bitten, einige Ihrer Google-Kontoinformationen zu verwenden. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Bitte führen einen Powerwash auf dem Gerät durch und versuchen Sie es noch einmal.</translation>
 <translation id="5204967432542742771">Passwort eingeben</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" löschen?</translation>
@@ -3338,7 +3332,6 @@
 <translation id="622537739776246443">Profil wird gelöscht</translation>
 <translation id="6225475702458870625">Datenverbindung von Ihrem <ph name="PHONE_NAME" /> verfügbar</translation>
 <translation id="6226777517901268232">Private Schlüsseldatei (optional)</translation>
-<translation id="6228516488918914827">Schnellere Seite zur Vorschau geladen</translation>
 <translation id="6228691855869374890">Diese Website hat vollständige Kontrolle über MIDI-Geräte.</translation>
 <translation id="6229890768313448549">Fehler beim Laden der Google Play-Nutzungsbedingungen. Bitte versuchen Sie es erneut.</translation>
 <translation id="6231881193380278751">Abfrageparameter in URL zum automatischen Aktualisieren der Seite hinzufügen: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3543,7 +3536,6 @@
 <translation id="6545665334409411530">Wiederholungsrate</translation>
 <translation id="6545834809683560467">Funktion zur Vervollständigung von Suchanfragen und URLs verwenden, die in die Adressleiste oder die Suchleiste des App Launchers eingegeben werden</translation>
 <translation id="6545867563032584178">Mikrofon wurde in den Mac-Systemeinstellungen ausgeschaltet</translation>
-<translation id="6547316139431024316">Für diese Erweiterung keine Warnung mehr</translation>
 <translation id="6547354035488017500">Geben Sie mindestens 512 MB Speicherplatz frei oder Ihr Gerät reagiert nicht mehr. Löschen Sie Dateien aus dem Gerätespeicher, um Speicherplatz freizugeben.</translation>
 <translation id="6550675742724504774">Optionen</translation>
 <translation id="6551508934388063976">Befehl nicht verfügbar. Drücken Sie Strg+N, um ein neues Fenster zu öffnen.</translation>
@@ -4019,7 +4011,7 @@
 <translation id="7289225569524511578">Hintergrund-App öffnen</translation>
 <translation id="7290242001003353852">Dieser Anmeldedienst wird von <ph name="SAML_DOMAIN" /> gehostet und greift auf Ihre Kamera zu.</translation>
 <translation id="7290594223351252791">Registrierung bestätigen</translation>
-<translation id="7295614427631867477">Hinweis: Für Android, Play und zugehörige Apps gelten eigene Richtlinien für die Erhebung und Nutzung von Daten.</translation>
+<translation id="7295614427631867477">Hinweis: Unter Android, bei Google Play und in zugehörigen Apps gelten eigene Richtlinien für die Erhebung und Nutzung von Daten.</translation>
 <translation id="729583233778673644">AES- und RC4-Verschlüsselung erlauben. Mit dieser Option ist ein höheres Risiko verbunden, da RC4-Verschlüsselungen nicht sicher sind.</translation>
 <translation id="7296774163727375165">Nutzungsbedingungen für <ph name="DOMAIN" /></translation>
 <translation id="7297443947353982503">Nutzername/Passwort falsch oder Fehler bei EAP-Authentifizierung</translation>
@@ -4673,7 +4665,6 @@
 <translation id="827097179112817503">Schaltfläche "Startseite" anzeigen</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 Lesezeichen gelöscht}other{# Lesezeichen gelöscht}}</translation>
 <translation id="8272443605911821513">Zum Verwalten Ihrer Erweiterungen klicken Sie im Menü "Mehr Tools" auf "Erweiterungen".</translation>
-<translation id="8272966760965438857">Google Konten an einem zentralen Ort verwalten</translation>
 <translation id="8274332263553132018">Datei streamen</translation>
 <translation id="8274924778568117936">Schalten Sie Ihr <ph name="DEVICE_TYPE" /> nicht aus bzw. schließen Sie es nicht, bis das Update abgeschlossen ist. Nach Abschluss der Installation wird Ihr <ph name="DEVICE_TYPE" /> neu gestartet.</translation>
 <translation id="8275038454117074363">Importieren</translation>
@@ -5055,7 +5046,7 @@
 <translation id="8877448029301136595">[übergeordnetes Verzeichnis]</translation>
 <translation id="8879284080359814990">Tab "Anzeigen al&amp;s"</translation>
 <translation id="8883847527783433352">Mit einem anderen Konto synchronisieren</translation>
-<translation id="8884570509232205463">Ihr Gerät wird jetzt um <ph name="UNLOCK_TIME" /> gesperrt.</translation>
+<translation id="8884570509232205463">Das Gerät wird jetzt um <ph name="UNLOCK_TIME" /> gesperrt.</translation>
 <translation id="8885197664446363138">Smart Lock ist nicht verfügbar.</translation>
 <translation id="8888253246822647887">Ihre App wird geöffnet, wenn das Upgrade abgeschlossen ist. Upgrades können ein paar Minuten dauern.</translation>
 <translation id="8888432776533519951">Farbe:</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index fe68dd4..a8e9f5f 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -338,6 +338,7 @@
         διακομιστή μεσολάβησης, προσαρμόστε τις <ph name="LINK_START" />ρυθμίσεις του<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Ο μόνος τρόπος να αναιρέσετε αυτήν την ενέργεια είναι να επανεγκαταστήσετε το <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="151501797353681931">Εισήχθησαν Από το Safari</translation>
+<translation id="1515163294334130951">Έναρξη</translation>
 <translation id="1521442365706402292">Διαχείριση πιστοποιητικών</translation>
 <translation id="152234381334907219">Δεν έγινε ποτέ αποθήκευση</translation>
 <translation id="1524430321211440688">Πληκτρολόγιο</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Μέγιστη ένταση</translation>
 <translation id="1673137583248014546">Το <ph name="URL" /> θέλει να δει την κατασκευή και το μοντέλο του Κλειδιού ασφαλείας σας</translation>
 <translation id="1679068421605151609">Εργαλεία για Προγραμματιστές</translation>
+<translation id="1679806121152819234">Προσθήκη VM</translation>
 <translation id="167983332380191032">Η υπηρεσία διαχείρισης έστειλε σφάλμα HTTP.</translation>
 <translation id="1680849702532889074">Παρουσιάστηκε σφάλμα κατά την εγκατάσταση της εφαρμογής σας Linux.</translation>
 <translation id="16815041330799488">Να μην επιτρέπεται στους ιστοτόπους να βλέπουν κείμενο και εικόνες που αντιγράψατε στο πρόχειρο</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Ιστορικό περιήγησης</translation>
 <translation id="2497229222757901769">Ταχύτητα ποντικιού</translation>
 <translation id="2497852260688568942">Ο συγχρονισμός έχει απενεργοποιηθεί από τον διαχειριστή σας</translation>
-<translation id="249819058197909513">Να μη γίνει ξανά προειδοποίηση γι' αυτήν την εφαρμογή</translation>
 <translation id="2498539833203011245">Ελαχιστοποίηση</translation>
 <translation id="2498765460639677199">Τεράστιο</translation>
 <translation id="2499747912851752301">Εξαγωγή κωδικών πρόσβασης…</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Συνδεθείτε στο δίκτυο Wi-Fi για να ξεκινήσετε</translation>
 <translation id="2631120081682787498">Είστε βέβαιοι ότι θέλετε να κλείσετε αυτήν την καρτέλα;</translation>
 <translation id="2631498379019108537">Εμφάνιση επιλογών εισαγωγής στο ράφι</translation>
-<translation id="2633199387167390344">Η εφαρμογή <ph name="NAME" /> χρησιμοποιεί <ph name="USAGE" /> MB από το χώρο του δίσκου.</translation>
 <translation id="2633212996805280240">Να γίνει κατάργηση του "<ph name="EXTENSION_NAME" />";</translation>
 <translation id="263325223718984101">Το <ph name="PRODUCT_NAME" /> δεν ήταν δυνατό να ολοκληρώσει την εγκατάσταση, όμως θα συνεχίσει να εκτελείται από το είδωλο δίσκου.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Επαναφορά</translation>
 <translation id="3158033540161634471">Ρύθμιση του δακτυλικού αποτυπώματός σας</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (βασιζόμενο σε υλικό)</translation>
-<translation id="316125635462764134">Κατάργηση εφαρμογής</translation>
 <translation id="3161522574479303604">Όλες οι γλώσσες</translation>
 <translation id="3163201441334626963">Άγνωστο προϊόν <ph name="PRODUCT_ID" /> από τον προμηθευτή <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Ορισμένες εταιρείες κινητής τηλεφωνίας ενδέχεται να αποκλείσουν αυτήν τη λειτουργία.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Αυτός ο τύπος αρχείου ενδέχεται να βλάψει τον υπολογιστή σας. Θέλετε να διατηρήσετε το αρχείο <ph name="FILE_NAME" /> ούτως ή άλλως;</translation>
 <translation id="3918972485393593704">Αναφορά λεπτομερειών στην Google</translation>
 <translation id="3919145445993746351">Για τη λήψη των επεκτάσεων σε όλους τους υπολογιστές σας, ενεργοποιήστε τον συγχρονισμό.</translation>
+<translation id="391999873395511996">Λήψη του εικονικού μηχανήματος.</translation>
 <translation id="3920504717067627103">Πολιτικές πιστοποιητικού</translation>
 <translation id="392089482157167418">Ενεργοποίηση του ChromeVox (προφορικά σχόλια)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">συσκευές από έναν άγνωστο προμηθευτή</translation>
 <translation id="3984159763196946143">Δεν ήταν δυνατή η έναρξη της λειτουργίας επίδειξης</translation>
 <translation id="3984431586879874039">Να επιτραπεί σε αυτόν τον ιστότοπο να δει το κλειδί ασφαλείας σας;</translation>
-<translation id="3987348946546879621">Εξοικονόμηση δεδομένων</translation>
 <translation id="3987938432087324095">Λυπάμαι, δεν το κατάλαβα.</translation>
 <translation id="3988996860813292272">Επιλογή ζώνης ώρας</translation>
 <translation id="399179161741278232">Έγινε εισαγωγή</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Επεξεργασία ατόμου</translation>
 <translation id="4042264909745389898">Όροι Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Έξοδος από τη σελίδα}other{Έξοδος από τις σελίδες}}</translation>
-<translation id="404299405565920089">Μπορείτε να διαχειριστείτε από εδώ όλους τους Λογαριασμούς Google στους οποίους έχετε συνδεθεί από εφαρμογές και ιστοτόπους. Οι εφαρμογές και οι ιστότοποι που διαθέτουν την άδειά σας μπορούν να αποκτήσουν πρόσβαση στις πληροφορίες λογαριασμού που χρειάζονται για την εύρυθμη λειτουργία τους.</translation>
 <translation id="4044612648082411741">Εισαγάγετε τον κωδικό πρόσβασης του πιστοποιητικού σας</translation>
 <translation id="404493185430269859">Προεπιλεγμένη μηχανή αναζήτησης</translation>
 <translation id="4046123991198612571">Επόμενο κομμάτι</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Ανοίξτε τις ρυθμίσεις</translation>
 <translation id="4242577469625748426">Αποτυχία εγκατάστασης ρυθμίσεων πολιτικής στη συσκευή: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Εύρεση περισσότερων εφαρμογών γραφίδας</translation>
-<translation id="424546999567421758">Εντοπίστηκε υψηλή χρήση του δίσκου</translation>
 <translation id="424726838611654458">Να είναι πάντα ανοικτό στο Adobe Reader</translation>
 <translation id="4247901771970415646">Δεν είναι δυνατός ο συγχρονισμός με τον χρήστη <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Αναμονή για σύνδεση δικτύου…</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Χνουδωτός</translation>
 <translation id="4422347585044846479">Επεξεργασία σελιδοδείκτη για αυτή τη σελίδα</translation>
 <translation id="4423376891418188461">Επαναφορά ρυθμίσεων</translation>
-<translation id="4423482519432579560">&amp;Ορθογραφικός έλεγχος</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, ο διαχειριστής σας απαιτεί να αλλάξετε τον κωδικό πρόσβασης.</translation>
 <translation id="4430019312045809116">Ένταση</translation>
 <translation id="4430369329743628066">Προστέθηκε σελιδοδείκτης</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Είστε πλέον συνδεδεμένοι στο <ph name="SHORT_PRODUCT_NAME" />. Οι σελιδοδείκτες, το ιστορικό και διάφορες άλλες ρυθμίσεις συγχρονίζονται με τον Λογαριασμό σας Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">Ο ιστότοπος <ph name="ORIGIN" /> θέλει να κατεβάσει πολλά αρχεία</translation>
-<translation id="5192316339598592690">Μεταβείτε γρήγορα από έναν λογαριασμό σε άλλον και συνδεθείτε εύκολα σε εφαρμογές και ιστοτόπους.
-    Οι εφαρμογές και οι ιστότοποι μπορεί να ζητήσουν άδεια για να χρησιμοποιήσουν ορισμένες από τις πληροφορίες του Λογαριασμού σας Google. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Κάντε powerwash στη συσκευή και δοκιμάστε ξανά.</translation>
 <translation id="5204967432542742771">Εισαγωγή κωδικού πρόσβασης</translation>
 <translation id="5206215183583316675">Να διαγραφεί το "<ph name="CERTIFICATE_NAME" />";</translation>
@@ -3344,7 +3338,6 @@
 <translation id="622537739776246443">Το προφίλ θα διαγραφεί</translation>
 <translation id="6225475702458870625">Διαθέσιμη σύνδεση δεδομένων από <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Αρχείο ιδιωτικού κλειδιού (προαιρετικό)</translation>
-<translation id="6228516488918914827">Ταχύτερη φόρτωση σελίδας</translation>
 <translation id="6228691855869374890">Αυτός ο ιστότοπος έχει τον πλήρη έλεγχο των συσκευών MIDI.</translation>
 <translation id="6229890768313448549">Δεν είναι δυνατή η φόρτωση των Όρων Παροχής Υπηρεσιών του Google Play. Δοκιμάστε ξανά.</translation>
 <translation id="6231881193380278751">Προσθέστε μια παράμετρο ερωτήματος στη διεύθυνση URL για αυτόματη ανανέωση της σελίδας: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3549,7 +3542,6 @@
 <translation id="6545665334409411530">Ρυθμός επανάληψης</translation>
 <translation id="6545834809683560467">Χρησιμοποιήστε την υπηρεσία προβλέψεων για να συμπληρώσετε τις αναζητήσεις και τις διευθύνσεις URL που πληκτρολογείτε στη γραμμή διευθύνσεων ή το πλαίσιο αναζήτησης της Εφαρμογής εκκίνησης.</translation>
 <translation id="6545867563032584178">Το μικρόφωνο έχει απενεργοποιηθεί στις προτιμήσεις συστήματος Mac.</translation>
-<translation id="6547316139431024316">Να μη γίνει ξανά προειδοποίηση γι' αυτήν την επέκταση</translation>
 <translation id="6547354035488017500">Ελευθερώστε χώρο 512 MB τουλάχιστον, διαφορετικά η συσκευή σας θα σταματήσει να ανταποκρίνεται. Για να ελευθερώσετε χώρο, διαγράψτε αρχεία από τον αποθηκευτικό χώρο της συσκευής.</translation>
 <translation id="6550675742724504774">Επιλογές</translation>
 <translation id="6551508934388063976">Μη διαθέσιμη εντολή. Πατήστε control-N για να ανοίξετε ένα νέο παράθυρο.</translation>
@@ -4680,7 +4672,6 @@
 <translation id="827097179112817503">Εμφάνιση κουμπιού Αρχικής σελίδας</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 σελιδοδείκτης διαγράφηκε}other{# σελιδοδείκτες διαγράφηκαν}}</translation>
 <translation id="8272443605911821513">Διαχειριστείτε τις επεκτάσεις σας κάνοντας κλικ στο στοιχείο "Επεκτάσεις" στο μενού "Περισσότερα εργαλεία".</translation>
-<translation id="8272966760965438857">Διαχειριστείτε τους Λογαριασμούς σας Google σε ένα σημείο</translation>
 <translation id="8274332263553132018">Μετάδοση αρχείου</translation>
 <translation id="8274924778568117936">Μην απενεργοποιήσετε ή κλείσετε τη συσκευή <ph name="DEVICE_TYPE" /> μέχρι να ολοκληρωθεί η ενημέρωση. Θα γίνει επανεκκίνηση της συσκευής <ph name="DEVICE_TYPE" /> μόλις ολοκληρωθεί η εγκατάσταση.</translation>
 <translation id="8275038454117074363">Εισαγωγή</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index c182c7de..add3c3464 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -338,6 +338,7 @@
     proxy server, adjust your <ph name="LINK_START" />proxy settings<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">The only way to undo this is to re-install <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Imported From Safari</translation>
+<translation id="1515163294334130951">Launch</translation>
 <translation id="1521442365706402292">Manage certificates</translation>
 <translation id="152234381334907219">Never Saved</translation>
 <translation id="1524430321211440688">Keyboard</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Loudest</translation>
 <translation id="1673137583248014546"><ph name="URL" /> wants to see the make and model of your Security Key</translation>
 <translation id="1679068421605151609">Developer Tools</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Management service sent HTTP error.</translation>
 <translation id="1680849702532889074">An error occurred during installation of your Linux application.</translation>
 <translation id="16815041330799488">Do not allow sites to see text and images copied to the clipboard</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Can't join the device to the domain. Make sure that you haven’t exceeded the number of devices that you can add.</translation>
 <translation id="1744108098763830590">background page</translation>
 <translation id="1745520510852184940">Always Do This</translation>
+<translation id="1746402432151920942">Protected Media Identifier</translation>
 <translation id="175196451752279553">R&amp;eopen closed tab</translation>
 <translation id="1753905327828125965">Most Visited</translation>
 <translation id="1756681705074952506">Input method</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Not signed in</translation>
 <translation id="1832511806131704864">Phone change updated</translation>
 <translation id="1834503245783133039">Download unsuccessful: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">MIDI Devices</translation>
 <translation id="1838374766361614909">Clear search</translation>
 <translation id="1841545962859478868">The device admin may monitor the following:</translation>
 <translation id="1841616161104323629">Missing device record.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Report an issue</translation>
 <translation id="2220572644011485463">PIN or password</translation>
 <translation id="2224444042887712269">This setting belongs to <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Accessibility Events</translation>
 <translation id="2224551243087462610">Edit folder name</translation>
 <translation id="2226449515541314767">This site has been blocked from having full control of MIDI devices.</translation>
 <translation id="2226720438730111184">Tell us what's happening</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Browsing history</translation>
 <translation id="2497229222757901769">Mouse speed</translation>
 <translation id="2497852260688568942">Sync is disabled by your administrator</translation>
-<translation id="249819058197909513">Don't warn again for this app</translation>
 <translation id="2498539833203011245">Minimise</translation>
 <translation id="2498765460639677199">Huge</translation>
 <translation id="2499747912851752301">Exporting passwords…</translation>
@@ -1050,7 +1054,6 @@
 <translation id="2630681426381349926">Connect to Wi-Fi to begin</translation>
 <translation id="2631120081682787498">Are you sure that you want to close this tab?</translation>
 <translation id="2631498379019108537">Show input options in the shelf</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> is using <ph name="USAGE" /> MB of disk space.</translation>
 <translation id="2633212996805280240">Remove "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> couldn't complete installation, but will continue to run from its disk image.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1396,7 +1399,6 @@
 <translation id="3157931365184549694">Restore</translation>
 <translation id="3158033540161634471">Set up your fingerprint</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardware-backed)</translation>
-<translation id="316125635462764134">Remove app</translation>
 <translation id="3161522574479303604">All languages</translation>
 <translation id="3163201441334626963">Unknown product <ph name="PRODUCT_ID" /> from vendor <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Some operators might block this feature.</translation>
@@ -1897,6 +1899,7 @@
 <translation id="3916445069167113093">This type of file can harm your computer. Do you want to keep <ph name="FILE_NAME" /> anyway?</translation>
 <translation id="3918972485393593704">Report details to Google</translation>
 <translation id="3919145445993746351">To get your extensions on all your computers, turn on sync</translation>
+<translation id="391999873395511996">Downloading the virtual machine.</translation>
 <translation id="3920504717067627103">Certificate Policies</translation>
 <translation id="392089482157167418">Enable ChromeVox (spoken feedback)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1948,7 +1951,6 @@
 <translation id="3983586614702900908">devices from an unknown vendor</translation>
 <translation id="3984159763196946143">Couldn't start demo mode</translation>
 <translation id="3984431586879874039">Allow this site to see your security key?</translation>
-<translation id="3987348946546879621">Saved data</translation>
 <translation id="3987938432087324095">Sorry, didn't catch that.</translation>
 <translation id="3988996860813292272">Select Time Zone</translation>
 <translation id="399179161741278232">Imported</translation>
@@ -1979,7 +1981,6 @@
 <translation id="4037889604535939429">Edit person</translation>
 <translation id="4042264909745389898">Google Chrome OS terms</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Exit Page}other{Exit Pages}}</translation>
-<translation id="404299405565920089">All of your signed-in Google accounts from apps and websites can be managed here. Apps and websites that have your permission can access the account information that they need to work properly.</translation>
 <translation id="4044612648082411741">Enter your certificate password</translation>
 <translation id="404493185430269859">Default search engine</translation>
 <translation id="4046123991198612571">Next track</translation>
@@ -2094,7 +2095,6 @@
 <translation id="4242533952199664413">Open settings</translation>
 <translation id="4242577469625748426">Failed to install policy settings on the device: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Find more stylus apps</translation>
-<translation id="424546999567421758">High disk usage detected</translation>
 <translation id="424726838611654458">Always open in Adobe Reader</translation>
 <translation id="4247901771970415646">Can't sync to <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Waiting for network connection...</translation>
@@ -2202,7 +2202,6 @@
 <translation id="4421932782753506458">Fluffy</translation>
 <translation id="4422347585044846479">Edit bookmark for this page</translation>
 <translation id="4423376891418188461">Restore Settings</translation>
-<translation id="4423482519432579560">&amp;Spellcheck</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, your administrator requires you to change your password.</translation>
 <translation id="4430019312045809116">volume</translation>
 <translation id="4430369329743628066">Bookmark added</translation>
@@ -2662,8 +2661,6 @@
 <translation id="5187295959347858724">You're now signed in to <ph name="SHORT_PRODUCT_NAME" />. Your bookmarks, history and other settings are being synced to your Google Account.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> wants to download multiple files</translation>
-<translation id="5192316339598592690">Switch accounts quickly and sign in to apps and websites all at once.
-    Apps and sites can ask you for permission to use some of your Google account info. <ph name="LINK_BEGIN" />Find out more<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Please powerwash the device and try again.</translation>
 <translation id="5204967432542742771">Enter password</translation>
 <translation id="5206215183583316675">Delete "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3342,7 +3339,6 @@
 <translation id="622537739776246443">Profile will be deleted</translation>
 <translation id="6225475702458870625">Data connection available from your <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Private key file (optional)</translation>
-<translation id="6228516488918914827">Faster page loaded</translation>
 <translation id="6228691855869374890">This site has full control of MIDI devices.</translation>
 <translation id="6229890768313448549">Google Play Terms of Service cannot be loaded. Please retry.</translation>
 <translation id="6231881193380278751">Add a QueryParam in URL to auto-refresh the page: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3547,7 +3543,6 @@
 <translation id="6545665334409411530">Repeat rate</translation>
 <translation id="6545834809683560467">Use a prediction service to help complete searches and URLs typed in the address bar or the app launcher search box</translation>
 <translation id="6545867563032584178">Microphone is turned off in Mac System Preferences</translation>
-<translation id="6547316139431024316">Don't warn again for this extension</translation>
 <translation id="6547354035488017500">Free up at least 512 MB of space or your device will become unresponsive. To free up space, delete files from device storage.</translation>
 <translation id="6550675742724504774">Options</translation>
 <translation id="6551508934388063976">Command unavailable. Press control-N to open a new window.</translation>
@@ -4678,7 +4673,6 @@
 <translation id="827097179112817503">Show Home button</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 bookmark deleted}other{# bookmarks deleted}}</translation>
 <translation id="8272443605911821513">Manage your extensions by clicking Extensions in the "More tools" menu.</translation>
-<translation id="8272966760965438857">Manage your Google accounts in one place</translation>
 <translation id="8274332263553132018">Cast file</translation>
 <translation id="8274924778568117936">Don’t turn off or close your <ph name="DEVICE_TYPE" /> until the update finishes. Your <ph name="DEVICE_TYPE" /> will restart after installation completes.</translation>
 <translation id="8275038454117074363">Import</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 9daef3b..fb20ea3 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">Si utilizas un servidor proxy, comprueba la configuración de proxy o comunícate con el administrador de red para asegurarte de que el servidor proxy funcione. Si crees que no necesitas un servidor proxy, modifica la <ph name="LINK_START" />configuración de proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">La única forma de deshacer esta acción es volver a instalar <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importar de Safari</translation>
+<translation id="1515163294334130951">Iniciar</translation>
 <translation id="1521442365706402292">Gestionar certificados</translation>
 <translation id="152234381334907219">Nunca guardado</translation>
 <translation id="1524430321211440688">Teclado</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">Máximo</translation>
 <translation id="1673137583248014546"><ph name="URL" /> desea ver la marca y el modelo de tu llave de seguridad</translation>
 <translation id="1679068421605151609">Herramientas del programador</translation>
+<translation id="1679806121152819234">VM del complemento</translation>
 <translation id="167983332380191032">El servicio de administración envió un error de HTTP.</translation>
 <translation id="1680849702532889074">Se produjo un error durante la instalación de la app de Linux.</translation>
 <translation id="16815041330799488">No permitir que los sitios vean el texto ni las imágenes copiados en el portapapeles</translation>
@@ -878,7 +880,7 @@
 <translation id="236117173274098341">Optimizar</translation>
 <translation id="236141728043665931">Bloquear siempre el acceso al micrófono</translation>
 <translation id="2365507699358342471">Este sitio puede ver el texto y las imágenes que se copiaron en el portapapeles.</translation>
-<translation id="2367199180085172140">Agregar uso compartido del archivo</translation>
+<translation id="2367199180085172140">Agregar archivos compartidos</translation>
 <translation id="2367972762794486313">Mostrar aplicaciones</translation>
 <translation id="2371076942591664043">Abrir al &amp;finalizar</translation>
 <translation id="2375406435414127095">Conéctate a tu teléfono</translation>
@@ -960,7 +962,6 @@
 <translation id="2496180316473517155">Historial de navegación</translation>
 <translation id="2497229222757901769">Velocidad del mouse</translation>
 <translation id="2497852260688568942">Tu administrador inhabilitó la sincronización</translation>
-<translation id="249819058197909513">No volver a advertirme sobre esta aplicación</translation>
 <translation id="2498539833203011245">Minimizar</translation>
 <translation id="2498765460639677199">Enorme</translation>
 <translation id="2499747912851752301">Exportando contraseñas…</translation>
@@ -1048,7 +1049,6 @@
 <translation id="2630681426381349926">Conéctate a una red Wi-Fi para comenzar</translation>
 <translation id="2631120081682787498">¿Realmente quieres cerrar esta pestaña?</translation>
 <translation id="2631498379019108537">Mostrar opciones de entrada en la biblioteca</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> está utilizando <ph name="USAGE" /> MB de espacio en el disco.</translation>
 <translation id="2633212996805280240">¿Quieres eliminar "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> no pudo completar la instalación, pero se continuará ejecutando desde la imagen de disco.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1086,7 +1086,7 @@
 <translation id="2677748264148917807">Abandonar</translation>
 <translation id="2678063897982469759">Permitir nuevamente</translation>
 <translation id="268053382412112343">Hi&amp;storial</translation>
-<translation id="2682498795777673382">Actualización de uno de tus padres</translation>
+<translation id="2682498795777673382">Actualización por parte de uno de tus padres</translation>
 <translation id="2683638487103917598">Se ordenó la carpeta</translation>
 <translation id="2684004000387153598">Para continuar, haz clic en Aceptar y, luego, en Agregar un usuario para crear un nuevo perfil para tu dirección de correo electrónico.</translation>
 <translation id="2688196195245426394">Se produjo un error al registrar el dispositivo en el servidor: <ph name="CLIENT_ERROR" />.</translation>
@@ -1394,7 +1394,6 @@
 <translation id="3157931365184549694">Restaurar</translation>
 <translation id="3158033540161634471">Configura tu huella</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (copia de seguridad en hardware)</translation>
-<translation id="316125635462764134">Eliminar aplicación</translation>
 <translation id="3161522574479303604">Todos los idiomas</translation>
 <translation id="3163201441334626963">Producto desconocido <ph name="PRODUCT_ID" /> del proveedor <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Es posible que algunos proveedores bloqueen esta función.</translation>
@@ -1710,7 +1709,7 @@
 <translation id="3664511988987167893">Ícono de extensión</translation>
 <translation id="3665589677786828986">Chrome detectó que otro programa dañó algunas opciones de configuración, por lo que la restableció a los valores predeterminados.</translation>
 <translation id="3668570675727296296">Configuración de idiomas</translation>
-<translation id="366867565525278777">No se pudo instalar debido a la falta de espacio de almacenamiento. Se necesita al menos <ph name="INSTALL_SIZE" /> de espacio libre. Para liberar espacio, borra archivos del almacenamiento del dispositivo.</translation>
+<translation id="366867565525278777">No se pudo instalar debido a la falta de espacio de almacenamiento. Se necesita, al menos, <ph name="INSTALL_SIZE" /> de espacio libre. Para liberar espacio, borra archivos del almacenamiento del dispositivo.</translation>
 <translation id="3668801437375206837">Para diagnosticar mejor los problemas de Bluetooth, los empleados de Google pueden incluir registros de Bluetooth adicionales en sus informes de respuesta. Si se selecciona esta opción, tu informe incluirá registros de btsnoop y HCI de tu sesión actual editados para quitar la mayor cantidad posible de información de identificación personal. Solo los gerentes del grupo del producto Sistema operativo Chrome tienen acceso a estos registros en Listnr. Los registros se borrarán definitivamente después de 90 días.</translation>
 <translation id="3668823961463113931">Controladores</translation>
 <translation id="3670113805793654926">Dispositivos de cualquier proveedor</translation>
@@ -1865,7 +1864,7 @@
 <translation id="3869917919960562512">Índice incorrecto.</translation>
 <translation id="3870931306085184145">No hay contraseñas guardadas para <ph name="DOMAIN" /></translation>
 <translation id="3871092408932389764">Muy bajo</translation>
-<translation id="3871350334636688135">A las 24 horas de que restablezcas tu dispositivo, el administrador realizará una actualización única que borrará tus datos locales. Guarda estos datos en el almacenamiento de nube antes de que se cumpla este plazo.</translation>
+<translation id="3871350334636688135">A las 24 horas de que restablezcas tu dispositivo, el administrador realizará una actualización única que borrará tus datos locales. Guarda estos datos en el almacenamiento en la nube antes de que se cumpla este plazo.</translation>
 <translation id="3872220884670338524">Más acciones (cuenta guardada para <ph name="USERNAME" /> en <ph name="DOMAIN" />)</translation>
 <translation id="3872991219937722530">Libera espacio en el disco o el dispositivo dejará de funcionar.</translation>
 <translation id="3873315167136380065">A fin de activar esta opción, <ph name="BEGIN_LINK" />restablece la sincronización<ph name="END_LINK" /> para quitar la frase de contraseña de sincronización</translation>
@@ -1895,6 +1894,7 @@
 <translation id="3916445069167113093">Este tipo de archivo puede dañar tu computadora. ¿Quieres descargar <ph name="FILE_NAME" /> de todos modos?</translation>
 <translation id="3918972485393593704">Informar detalles a Google</translation>
 <translation id="3919145445993746351">Para que tus extensiones estén en todas tus computadoras, activa la sincronización</translation>
+<translation id="391999873395511996">Se está descargando la máquina virtual.</translation>
 <translation id="3920504717067627103">Directivas del certificado</translation>
 <translation id="392089482157167418">Habilitar ChromeVox (comentarios por voz)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1946,7 +1946,6 @@
 <translation id="3983586614702900908">dispositivos de un proveedor desconocido</translation>
 <translation id="3984159763196946143">No se pudo iniciar el modo de demostración</translation>
 <translation id="3984431586879874039">¿Quieres permitir que este sitio vea tu llave de seguridad?</translation>
-<translation id="3987348946546879621">Consumo de datos reducido</translation>
 <translation id="3987938432087324095">No entendí.</translation>
 <translation id="3988996860813292272">Seleccionar zona horaria</translation>
 <translation id="399179161741278232">Importado</translation>
@@ -1977,7 +1976,6 @@
 <translation id="4037889604535939429">Editar persona</translation>
 <translation id="4042264909745389898">Condiciones del Sistema operativo Google Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Salir de la página}other{Salir de las páginas}}</translation>
-<translation id="404299405565920089">Aquí puedes administrar todas las Cuentas de Google con las que hayas accedido en apps y sitios web. Las apps y los sitios web que tienen tu permiso pueden acceder a la información de la cuenta que necesitan para funcionar correctamente.</translation>
 <translation id="4044612648082411741">Ingresar la contraseña del certificado</translation>
 <translation id="404493185430269859">Motor de búsqueda predeterminado</translation>
 <translation id="4046123991198612571">Siguiente pista</translation>
@@ -2092,7 +2090,6 @@
 <translation id="4242533952199664413">Abrir la configuración</translation>
 <translation id="4242577469625748426">Se produjo un error al instalar la configuración de la política en el dispositivo: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Encontrar más apps para la pluma stylus</translation>
-<translation id="424546999567421758">Se detectó un uso elevado del disco</translation>
 <translation id="424726838611654458">Abrir siempre en Adobe Reader</translation>
 <translation id="4247901771970415646">No se puede sincronizar con <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Esperando la conexión de red...</translation>
@@ -2200,7 +2197,6 @@
 <translation id="4421932782753506458">Peludito</translation>
 <translation id="4422347585044846479">Editar marcador para esta página</translation>
 <translation id="4423376891418188461">Restaurar configuración</translation>
-<translation id="4423482519432579560">&amp;Corrección ortográfica</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, tu administrador te solicita que cambies la contraseña.</translation>
 <translation id="4430019312045809116">Volumen</translation>
 <translation id="4430369329743628066">Se agregó el marcador</translation>
@@ -2660,8 +2656,6 @@
 <translation id="5187295959347858724">Accediste a <ph name="SHORT_PRODUCT_NAME" />. Tus favoritos, historial y demás parámetros de configuración se están sincronizando con tu cuenta de Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> quiere descargar varios archivos</translation>
-<translation id="5192316339598592690">Cambia las cuentas rápidamente y accede a sitios web y apps a la vez.
-    Las apps y los sitios pueden solicitarte permiso para usar algunos datos de tu Cuenta de Google. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Aplica la función "Powerwash" en el dispositivo y vuelve a intentarlo.</translation>
 <translation id="5204967432542742771">Ingresar contraseña</translation>
 <translation id="5206215183583316675">¿Deseas borrar el certificado "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3340,7 +3334,6 @@
 <translation id="622537739776246443">Se borrará el perfil</translation>
 <translation id="6225475702458870625">Conexión de datos disponibles de tu <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Archivo de clave privada (opcional)</translation>
-<translation id="6228516488918914827">Se cargó una página más rápida</translation>
 <translation id="6228691855869374890">El sitio tiene el control total de los dispositivos MIDI</translation>
 <translation id="6229890768313448549">No se pueden cargar las Condiciones del servicio de Google Play. Vuelve a intentarlo.</translation>
 <translation id="6231881193380278751">Agregar un parámetro de consulta en la URL para actualizar automáticamente la página: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3545,7 +3538,6 @@
 <translation id="6545665334409411530">Frecuencia de repetición</translation>
 <translation id="6545834809683560467">Utilizar un servicio de predicción que ayude a completar las búsquedas y URL que se escriben en la barra de direcciones o en el cuadro de búsqueda del Selector de aplicaciones.</translation>
 <translation id="6545867563032584178">El micrófono está desactivado en las Preferencias del Sistema de Mac</translation>
-<translation id="6547316139431024316">No volver a advertirme sobre esta extensión</translation>
 <translation id="6547354035488017500">Libera al menos 512 MB de espacio o tu dispositivo dejará de funcionar. Para liberar espacio, borra archivos del almacenamiento del dispositivo.</translation>
 <translation id="6550675742724504774">Opciones</translation>
 <translation id="6551508934388063976">El comando no está disponible. Presiona Ctrl + N para abrir una ventana nueva.</translation>
@@ -4676,7 +4668,6 @@
 <translation id="827097179112817503">Mostrar el botón de la Página principal</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 favorito borrado}other{# favoritos borrados}}</translation>
 <translation id="8272443605911821513">Para administrar tus extensiones, haz clic en Extensiones en el menú "Más herramientas".</translation>
-<translation id="8272966760965438857">Administra tus Cuentas de Google en un solo lugar</translation>
 <translation id="8274332263553132018">Transmitir archivo</translation>
 <translation id="8274924778568117936">No apagues ni cierres el dispositivo <ph name="DEVICE_TYPE" /> hasta que finalice la actualización. Cuando el proceso termine, el dispositivo <ph name="DEVICE_TYPE" /> se reiniciará.</translation>
 <translation id="8275038454117074363">Importar</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 51ac3364..5ca839b 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -338,6 +338,7 @@
     usar un servidor proxy, cambia tu <ph name="LINK_START" />configuración de proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">La única forma de deshacer esta acción es volver a instalar <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importado desde Safari</translation>
+<translation id="1515163294334130951">Iniciar</translation>
 <translation id="1521442365706402292">Gestionar certificados</translation>
 <translation id="152234381334907219">Contraseñas que nunca se guardan</translation>
 <translation id="1524430321211440688">Teclado</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">El más alto</translation>
 <translation id="1673137583248014546"><ph name="URL" /> quiere ver la marca y el modelo de tu llave de seguridad</translation>
 <translation id="1679068421605151609">Herramientas para desarrolladores</translation>
+<translation id="1679806121152819234">Complemento de VM</translation>
 <translation id="167983332380191032">El servicio de gestión ha enviado un error de HTTP.</translation>
 <translation id="1680849702532889074">No se ha podido instalar la aplicación de Linux.</translation>
 <translation id="16815041330799488">No permitir que los sitios web vean el texto y las imágenes que se hayan copiado en el portapapeles</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">No se puede vincular el dispositivo con el dominio. Comprueba que no hayas superado el número de dispositivos que puedes añadir.</translation>
 <translation id="1744108098763830590">página en segundo plano</translation>
 <translation id="1745520510852184940">Hacer esto siempre</translation>
+<translation id="1746402432151920942">Identificador de contenido multimedia protegido</translation>
 <translation id="175196451752279553">Volv&amp;er a abrir pestaña cerrada</translation>
 <translation id="1753905327828125965">Más visitado</translation>
 <translation id="1756681705074952506">Método de introducción</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">No has iniciado sesión.</translation>
 <translation id="1832511806131704864">Cambio de teléfono actualizado</translation>
 <translation id="1834503245783133039">No se ha podido completar la descarga: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Dispositivos MIDI</translation>
 <translation id="1838374766361614909">Borrar búsqueda</translation>
 <translation id="1841545962859478868">Es posible que el administrador del dispositivo supervise lo siguiente:</translation>
 <translation id="1841616161104323629">Falta el registro del dispositivo.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Notificar un problema</translation>
 <translation id="2220572644011485463">PIN o contraseña</translation>
 <translation id="2224444042887712269">Esta opción pertenece a <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Eventos de accesibilidad</translation>
 <translation id="2224551243087462610">Editar nombre de carpeta</translation>
 <translation id="2226449515541314767">Se ha bloqueado este sitio para que no tenga un control absoluto de los dispositivos MIDI.</translation>
 <translation id="2226720438730111184">Indícanos el problema</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Historial de navegación</translation>
 <translation id="2497229222757901769">Velocidad del ratón</translation>
 <translation id="2497852260688568942">El administrador ha inhabilitado la sincronización</translation>
-<translation id="249819058197909513">No volver a advertirme sobre esta aplicación</translation>
 <translation id="2498539833203011245">Minimizar</translation>
 <translation id="2498765460639677199">Enorme</translation>
 <translation id="2499747912851752301">Exportando contraseñas...</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Conéctate a una red Wi-Fi para empezar</translation>
 <translation id="2631120081682787498">¿Seguro que quieres cerrar esta pestaña?</translation>
 <translation id="2631498379019108537">Mostrar opciones de entrada en la estantería</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> utiliza <ph name="USAGE" /> MB del espacio en disco.</translation>
 <translation id="2633212996805280240">¿Quieres eliminar "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> no ha podido completar la instalación, pero se seguirá ejecutando desde la imagen de disco.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Restaurar</translation>
 <translation id="3158033540161634471">Configura la huella digital</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (respaldado por hardware)</translation>
-<translation id="316125635462764134">Eliminar aplicación</translation>
 <translation id="3161522574479303604">Todos los idiomas</translation>
 <translation id="3163201441334626963">Producto <ph name="PRODUCT_ID" /> del proveedor <ph name="VENDOR_ID" /> desconocido</translation>
 <translation id="3165390001037658081">Es posible que algunos operadores bloqueen esta función.</translation>
@@ -1896,6 +1898,7 @@
 <translation id="3916445069167113093">Este tipo de archivo puede dañar tu ordenador. ¿Quieres descargar <ph name="FILE_NAME" /> de todos modos?</translation>
 <translation id="3918972485393593704">Enviar informe detallado a Google</translation>
 <translation id="3919145445993746351">Para obtener las extensiones en todos tus ordenadores, activa la sincronización</translation>
+<translation id="391999873395511996">Descargando la máquina virtual.</translation>
 <translation id="3920504717067627103">Políticas de certificados</translation>
 <translation id="392089482157167418">Habilitar ChromeVox (mensajes de voz)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1946,7 +1949,6 @@
 <translation id="3983586614702900908">dispositivos de un proveedor desconocido</translation>
 <translation id="3984159763196946143">No se ha podido iniciar el modo de demostración</translation>
 <translation id="3984431586879874039">¿Quieres permitir que este sitio web vea tu llave de seguridad?</translation>
-<translation id="3987348946546879621">Se ha reducido el uso de datos</translation>
 <translation id="3987938432087324095">No he entendido nada.</translation>
 <translation id="3988996860813292272">Seleccionar la zona horaria</translation>
 <translation id="399179161741278232">Importados</translation>
@@ -1977,7 +1979,6 @@
 <translation id="4037889604535939429">Cambiar persona</translation>
 <translation id="4042264909745389898">Condiciones de Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Salir de la página}other{Salir de las páginas}}</translation>
-<translation id="404299405565920089">En esta página puedes gestionar todas las cuentas de Google que hayas usado para iniciar sesión en sitios web y aplicaciones. Las aplicaciones y los sitios web a los que hayas dado permiso pueden acceder a la información que necesiten de tu cuenta para funcionar correctamente.</translation>
 <translation id="4044612648082411741">Introduce la contraseña del certificado</translation>
 <translation id="404493185430269859">Motor de búsqueda predeterminado</translation>
 <translation id="4046123991198612571">Pista siguiente</translation>
@@ -2092,7 +2093,6 @@
 <translation id="4242533952199664413">Abrir Configuración</translation>
 <translation id="4242577469625748426">Se ha producido un error al instalar la configuración de política en el dispositivo (<ph name="VALIDATION_ERROR" />).</translation>
 <translation id="4244238649050961491">Buscar más aplicaciones para el lápiz óptico</translation>
-<translation id="424546999567421758">Se ha detectado un uso elevado del disco</translation>
 <translation id="424726838611654458">Abrir siempre en Adobe Reader</translation>
 <translation id="4247901771970415646">No se puede sincronizar con <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Esperando conexión de red...</translation>
@@ -2200,7 +2200,6 @@
 <translation id="4421932782753506458">Gatito</translation>
 <translation id="4422347585044846479">Editar marcador para esta página</translation>
 <translation id="4423376891418188461">Restaurar configuración</translation>
-<translation id="4423482519432579560">&amp;Corrector ortográfico</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, tu administrador solicita que cambies la contraseña.</translation>
 <translation id="4430019312045809116">Volumen</translation>
 <translation id="4430369329743628066">Añadida a Marcadores</translation>
@@ -2660,8 +2659,6 @@
 <translation id="5187295959347858724">Has iniciado sesión en <ph name="SHORT_PRODUCT_NAME" />. Tus marcadores, tu historial y otros ajustes se están sincronizando con tu cuenta de Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> quiere descargar varios archivos</translation>
-<translation id="5192316339598592690">Cambia de cuenta rápidamente e inicia sesión en aplicaciones y sitios web al mismo tiempo.
-    Las aplicaciones y los sitios web pueden pedirte permiso para usar parte de la información de tu cuenta de Google. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Realiza un powerwash e inténtalo de nuevo.</translation>
 <translation id="5204967432542742771">Escribe tu contraseña</translation>
 <translation id="5206215183583316675">¿Quieres eliminar el certificado <ph name="CERTIFICATE_NAME" />?</translation>
@@ -3340,7 +3337,6 @@
 <translation id="622537739776246443">Se eliminará el perfil</translation>
 <translation id="6225475702458870625">Conexión de datos disponible desde tu <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Archivo de clave privada (opcional)</translation>
-<translation id="6228516488918914827">Se ha cargado la página de forma más rápida</translation>
 <translation id="6228691855869374890">Este sitio tiene un control absoluto de los dispositivos MIDI.</translation>
 <translation id="6229890768313448549">Las Condiciones de Servicio de Google Play no se pueden cargar. Vuelve a intentarlo.</translation>
 <translation id="6231881193380278751">Añade un parámetro de consulta en la URL para actualizar la página automáticamente: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3545,7 +3541,6 @@
 <translation id="6545665334409411530">Frecuencia de repetición</translation>
 <translation id="6545834809683560467">Utilizar un servicio de predicción para completar las búsquedas y las URL introducidas en la barra de direcciones o en el cuadro de búsqueda del menú de aplicaciones</translation>
 <translation id="6545867563032584178">El micrófono está desactivado en las Preferencias del Sistema de Mac</translation>
-<translation id="6547316139431024316">No volver a advertirme sobre esta extensión</translation>
 <translation id="6547354035488017500">Libera al menos 512 MB de espacio o el dispositivo no responderá. Para ello, elimina archivos del almacenamiento del dispositivo.</translation>
 <translation id="6550675742724504774">Configuración</translation>
 <translation id="6551508934388063976">El comando no está disponible. Pulsa Ctrl+N para abrir una ventana nueva.</translation>
@@ -4676,7 +4671,6 @@
 <translation id="827097179112817503">Mostrar el botón de página principal</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Se ha eliminado 1 marcador}other{Se han eliminado # marcadores}}</translation>
 <translation id="8272443605911821513">Para administrar tus extensiones, haz clic en la opción Extensiones del menú Más herramientas.</translation>
-<translation id="8272966760965438857">Gestiona tus cuentas de Google en un mismo lugar</translation>
 <translation id="8274332263553132018">Enviar archivo</translation>
 <translation id="8274924778568117936">No apagues ni cierres tu <ph name="DEVICE_TYPE" /> hasta que termine de actualizarse. Tu <ph name="DEVICE_TYPE" /> se reiniciará cuando se complete la instalación.</translation>
 <translation id="8275038454117074363">Importar</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 1ea52e6..b967535a 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -338,6 +338,7 @@
     kasutama, siis korrigeerige oma <ph name="LINK_START" />puhverserveri seadeid<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Ainus viis selle tagasivõtmiseks on <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> uuesti installida.</translation>
 <translation id="151501797353681931">Imporditud Safarist</translation>
+<translation id="1515163294334130951">Käivita</translation>
 <translation id="1521442365706402292">Halda serte</translation>
 <translation id="152234381334907219">Ei ole kunagi salvestatud</translation>
 <translation id="1524430321211440688">Klaviatuur</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Kõige valjem</translation>
 <translation id="1673137583248014546"><ph name="URL" /> soovib näha teie turvavõtme tootjat ja mudelit</translation>
 <translation id="1679068421605151609">Arendaja tööriistad</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Haldusteenus edastas HTTP vea.</translation>
 <translation id="1680849702532889074">Linuxi rakenduse installimisel ilmnes viga.</translation>
 <translation id="16815041330799488">Ära luba saitidel näha lõikelauale kopeeritud teksti ega kujutisi</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Sirvimise ajalugu</translation>
 <translation id="2497229222757901769">Hiire kiirus</translation>
 <translation id="2497852260688568942">Administraator on sünkroonimise keelanud</translation>
-<translation id="249819058197909513">Ära hoiata uuesti selle rakenduse puhul</translation>
 <translation id="2498539833203011245">Minimeerimine</translation>
 <translation id="2498765460639677199">Väga suur</translation>
 <translation id="2499747912851752301">Paroolide eksportimine …</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Alustamiseks looge WiFi-ühendus</translation>
 <translation id="2631120081682787498">Kas soovite kindlasti selle vahelehe sulgeda?</translation>
 <translation id="2631498379019108537">Kuva riiulil olevad sisestusvalikud</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> kasutab <ph name="USAGE" /> MB kettaruumi.</translation>
 <translation id="2633212996805280240">Kas eemaldada „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ei suutnud installimist lõpule viia, kuid jätkab käitamist kettakujutiselt.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Taasta</translation>
 <translation id="3158033540161634471">Sõrmejälje seadistamine</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (riistvaratoega)</translation>
-<translation id="316125635462764134">Eemalda rakendus</translation>
 <translation id="3161522574479303604">Kõik keeled</translation>
 <translation id="3163201441334626963">Tundmatu toode <ph name="PRODUCT_ID" /> teenusepakkujalt <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Mõned operaatorid võivad selle funktsooni blokeerida.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Seda tüüpi fail võib teie arvutit kahjustada. Kas soovite faili <ph name="FILE_NAME" /> ikkagi alles hoida?</translation>
 <translation id="3918972485393593704">Teavita üksikasjadest Google'it</translation>
 <translation id="3919145445993746351">Oma laienduste nägemiseks kõigis arvutites lülitage sisse sünkroonimine</translation>
+<translation id="391999873395511996">Virtuaalseadme allalaadimine.</translation>
 <translation id="3920504717067627103">Sertifikaadi eeskirjad</translation>
 <translation id="392089482157167418">Luba ChromeVox (kõnena esitatud tagasiside)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">tundmatu müüja seadmed</translation>
 <translation id="3984159763196946143">Demorežiimi ei saanud käivitada</translation>
 <translation id="3984431586879874039">Kas lubada saidil teie turvavõtit näha?</translation>
-<translation id="3987348946546879621">Andmemahtu säästeti</translation>
 <translation id="3987938432087324095">Kahjuks ei kuulnud seda.</translation>
 <translation id="3988996860813292272">Ajavööndi valimine</translation>
 <translation id="399179161741278232">Imporditud</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Isiku muutmine</translation>
 <translation id="4042264909745389898">Google Chrome OS-i tingimused</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Välju lehelt}other{Välju lehtedelt}}</translation>
-<translation id="404299405565920089">Siin saab hallata kõiki teie Google'i kontosid, kuhu olete rakendustes ja veebisaitidel sisse loginud. Rakendused ja veebisaidid, millel on teie luba, pääsevad juurde konto teabele, mida on vaja ootuspäraseks toimimiseks.</translation>
 <translation id="4044612648082411741">Sisestage oma sertifikaadi parool</translation>
 <translation id="404493185430269859">Vaikeotsingumootor</translation>
 <translation id="4046123991198612571">Järgmine lugu</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Ava seaded</translation>
 <translation id="4242577469625748426">Reegli seadeid ei õnnestunud seadmesse installida: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Otsi rohkem elektronpliiatsi rakendusi</translation>
-<translation id="424546999567421758">Tuvastati suur kettakasutus</translation>
 <translation id="424726838611654458">Ava alati programmis Adobe Reader</translation>
 <translation id="4247901771970415646">Kasutajaga <ph name="USERNAME" /> ei saa sünkroonida</translation>
 <translation id="4249248555939881673">Võrguühenduse ootamine ...</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Miisu</translation>
 <translation id="4422347585044846479">Muuda selle lehekülje järjehoidjat</translation>
 <translation id="4423376891418188461">Taasta seaded</translation>
-<translation id="4423482519432579560">&amp;Õigekirjakontroll</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, administraator nõuab, et muudaksite parooli.</translation>
 <translation id="4430019312045809116">Helitugevus</translation>
 <translation id="4430369329743628066">Järjehoidja on lisatud</translation>
@@ -2377,7 +2373,7 @@
 <translation id="4724450788351008910">Kuulumine muudetud</translation>
 <translation id="4725511304875193254">Corgi</translation>
 <translation id="4726710629007580002">Laienduse installimisel ilmnesid hoiatused:</translation>
-<translation id="4727847987444062305">Hallatud külastajaseanss</translation>
+<translation id="4727847987444062305">Hallatav külastajaseanss</translation>
 <translation id="4728558894243024398">Platvorm</translation>
 <translation id="4733082559415072992"><ph name="URL" /> soovib kasutada teie seadme asukohta</translation>
 <translation id="4733793249294335256">Asukoht</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Olete nüüd teenusesse <ph name="SHORT_PRODUCT_NAME" /> sisse logitud. Järjehoidjad, ajalugu ja muud seaded sünkroonitakse teie Google'i kontoga.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> soovib alla laadida mitu faili</translation>
-<translation id="5192316339598592690">Võimaldab kiiresti kontosid vahetada ja korraga kõigisse rakendustesse ja veebisaitidele sisse logida.
-    Rakendused ja saidid võivad teie Google'i konto teatud teabe kasutamiseks küsida teie luba. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Käitage seadmes funktsiooni Powerwash ja proovige uuesti.</translation>
 <translation id="5204967432542742771">Sisestage parool</translation>
 <translation id="5206215183583316675">Kas kustutada „<ph name="CERTIFICATE_NAME" />”?</translation>
@@ -3343,7 +3337,6 @@
 <translation id="622537739776246443">Profiil kustutatakse</translation>
 <translation id="6225475702458870625">Andmesideühendus on teie telefonis <ph name="PHONE_NAME" /> saadaval</translation>
 <translation id="6226777517901268232">Privaatvõtme fail (valikuline)</translation>
-<translation id="6228516488918914827">Lehe kiirem laadimine</translation>
 <translation id="6228691855869374890">See sait juhib MIDI-seadmeid täielikult.</translation>
 <translation id="6229890768313448549">Google Play teenusetingimusi ei saa laadida. Proovige uuesti.</translation>
 <translation id="6231881193380278751">Lehe automaatseks värskendamiseks lisage päringu parameeter URL-i: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3541,6 @@
 <translation id="6545665334409411530">Kordussagedus</translation>
 <translation id="6545834809683560467">Kasuta ennustusteenust, mis aitab lõpetada otsingud, ja URL-e, mis sisestatakse aadressiribale või rakenduste käivitaja otsingukasti</translation>
 <translation id="6545867563032584178">Mikrofon on Maci süsteemieelistustes välja lülitatud</translation>
-<translation id="6547316139431024316">Ära hoiata uuesti selle laienduse puhul</translation>
 <translation id="6547354035488017500">Vabastage vähemalt 512 MB kettaruumi, muidu seade ei reageeri. Kettaruumi vabastamiseks kustutage seadme salvestusruumist faile.</translation>
 <translation id="6550675742724504774">Valikud</translation>
 <translation id="6551508934388063976">Käsk pole saadaval. Uue akna avamiseks vajutage klahve Ctrl + N.</translation>
@@ -4679,7 +4671,6 @@
 <translation id="827097179112817503">Kuva nupp Avaleht</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 järjehoidja on kustutatud}other{# järjehoidjat on kustutatud}}</translation>
 <translation id="8272443605911821513">Hallake oma laiendusi, klõpsates menüüs „Rohkem tööriistu” valikul Laiendused.</translation>
-<translation id="8272966760965438857">Hallake oma Google’i kontosid ühes kohas</translation>
 <translation id="8274332263553132018">Faili ülekandmine</translation>
 <translation id="8274924778568117936">Ärge lülitage välja ega sulgege oma seadet <ph name="DEVICE_TYPE" />, kuni värskendus lõpule viiakse. Seade <ph name="DEVICE_TYPE" /> taaskäivitatakse pärast installimise lõpetamist.</translation>
 <translation id="8275038454117074363">Impordi</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 52591aaf..35f2cff 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">اگر از یک سرور پروکسی استفاده می‌کنید، تنظمیات پروکسی خود را بررسی کنید یا با سرپرست شبکه خود تماس بگیرید و اطمینان حاصل کنید که سرور پروکسی کار می‌کند. اگر فکر نمی‌کنید که در حال استفاده از سرور پروکسی باشید، <ph name="LINK_START" />تنظیمات پروکسی<ph name="LINK_END" /> خود را تنظیم نمایید. </translation>
 <translation id="1512210426710821809">تنها راه برای واگرد این مورد، نصب مجدد <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> است</translation>
 <translation id="151501797353681931">‏وارد شده از Safari</translation>
+<translation id="1515163294334130951">راه‌اندازی</translation>
 <translation id="1521442365706402292">مدیریت گواهی‌ها</translation>
 <translation id="152234381334907219">هرگز ذخیره نمی‌شود</translation>
 <translation id="1524430321211440688">صفحه‌کلید</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">بلندترین</translation>
 <translation id="1673137583248014546"><ph name="URL" /> می‌خواهد به ساخت و مدل «کلید امنیتی» شما دسترسی پیدا کند</translation>
 <translation id="1679068421605151609">ابزار برنامه‌نویس</translation>
+<translation id="1679806121152819234">‏افزایه VM</translation>
 <translation id="167983332380191032">‏سرویس مدیریت خطای HTTP (اچ‌تی‌تی‌پی) ارسال کرد.</translation>
 <translation id="1680849702532889074">‏هنگام نصب برنامه Linux خطایی روی داد.</translation>
 <translation id="16815041330799488">به سایت‌ها اجازه داده نشود به نوشتار و تصاویر کپی‌شده در بریده‌دان دسترسی پیدا کنند</translation>
@@ -483,6 +485,7 @@
 <translation id="1744060673522309905">نمی‌توان دستگاه را به دامنه وصل کرد. مطمئن شوید بیشتر از تعداد مجاز دستگاه اضافه نکرده‌اید.</translation>
 <translation id="1744108098763830590">صفحه پس‌زمینه</translation>
 <translation id="1745520510852184940">این کار همیشه انجام شود</translation>
+<translation id="1746402432151920942">شناسه رسانه محافظت‌شده</translation>
 <translation id="175196451752279553">با&amp;ز کردن مجدد برگه بسته</translation>
 <translation id="1753905327828125965">بیشترین موارد بازدید شده</translation>
 <translation id="1756681705074952506">روش ورودی</translation>
@@ -540,6 +543,7 @@
 <translation id="1830550083491357902">وارد سیستم نشده است</translation>
 <translation id="1832511806131704864">تغییر تلفن به‌روزرسانی شد</translation>
 <translation id="1834503245783133039">بارگیری ناموفق بود: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">‏دستگاه‌های MIDI</translation>
 <translation id="1838374766361614909">پاک کردن جستجو</translation>
 <translation id="1841545962859478868">سرپرست دستگاه ممکن است موارد زیر را پایش کند</translation>
 <translation id="1841616161104323629">ثبت دستگاه موجود نیست.</translation>
@@ -783,6 +787,7 @@
 <translation id="2220529011494928058">گزارش یک مشکل</translation>
 <translation id="2220572644011485463">پین یا گذرواژه</translation>
 <translation id="2224444042887712269">این تنظیم به <ph name="OWNER_EMAIL" /> متعلق است.</translation>
+<translation id="2224471211857467033">رویدادهای دسترس‌پذیری</translation>
 <translation id="2224551243087462610">ویرایش نام پوشه</translation>
 <translation id="2226449515541314767">‏این سایت از داشتن کنترل کامل دستگاه‌های MIDI ممانعت شده است.</translation>
 <translation id="2226720438730111184">به ما بگویید چه اتفاقی افتاده است</translation>
@@ -960,7 +965,6 @@
 <translation id="2496180316473517155">سابقه مرور</translation>
 <translation id="2497229222757901769">سرعت موشواره</translation>
 <translation id="2497852260688568942">سرپرستتان همگام‌سازی را غیرفعال کرده است</translation>
-<translation id="249819058197909513">دیگر برای این برنامه هشدار داده نشود</translation>
 <translation id="2498539833203011245">کوچک کردن</translation>
 <translation id="2498765460639677199">بسیار بزرگ</translation>
 <translation id="2499747912851752301">در حال صادر کردن گذرواژه‌ها…</translation>
@@ -1047,7 +1051,6 @@
 <translation id="2630681426381349926">‏برای شروع به Wi-Fi متصل شوید</translation>
 <translation id="2631120081682787498">مطمئنید می‌خواهید این برگه را ببندید؟</translation>
 <translation id="2631498379019108537">نمایش گزینه‌های ورودی در قفسه</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> از <ph name="USAGE" /> مگابایت فضای دیسک را استفاده می‌کند.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" حذف شود؟</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> نمی‌تواند نصب را کامل انجام دهد، اما از تصویر دیسک خود همچنان اجرا می‌کند.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1393,7 +1396,6 @@
 <translation id="3157931365184549694">بازیابی</translation>
 <translation id="3158033540161634471">ثبت اثرانگشت</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (پشتیبان‌گیری‌شده در سخت‌افزار)</translation>
-<translation id="316125635462764134">حذف برنامه</translation>
 <translation id="3161522574479303604">همه زبان‌ها</translation>
 <translation id="3163201441334626963">محصول نامشخص <ph name="PRODUCT_ID" /> از فروشنده <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">برخی شرکت‌های مخابراتی ممکن است این قابلیت را مسدود کنند.</translation>
@@ -1894,6 +1896,7 @@
 <translation id="3916445069167113093">این نوع فایل می‌تواند به رایانهٔ شما آسیب برساند. آیا با این وجود می‌خواهید <ph name="FILE_NAME" /> را نگه دارید؟</translation>
 <translation id="3918972485393593704">‏گزارش جزئیات به Google</translation>
 <translation id="3919145445993746351">برای دریافت افزونه‌ها در همه رایانه‌هایتان، همگام‌سازی را روشن کنید</translation>
+<translation id="391999873395511996">درحال بارگیری دستگاه مجازی.</translation>
 <translation id="3920504717067627103">سیاست مربوط به گواهی</translation>
 <translation id="392089482157167418">‏فعال کردن ChromeVox (بازخورد گفتاری)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1945,7 +1948,6 @@
 <translation id="3983586614702900908">دستگاه‌های ارائه‌دهنده ناشناس</translation>
 <translation id="3984159763196946143">حالت نمایشی شروع نشد</translation>
 <translation id="3984431586879874039">به این سایت اجازه می‌دهید کلید امنیتی‌تان را ببیند؟</translation>
-<translation id="3987348946546879621">داده‌های ذخیره‌‌شده</translation>
 <translation id="3987938432087324095">متأسفم، متوجه نشدم.</translation>
 <translation id="3988996860813292272">انتخاب منطقه زمانی</translation>
 <translation id="399179161741278232">وارد شده</translation>
@@ -1976,7 +1978,6 @@
 <translation id="4037889604535939429">ویرایش شخص</translation>
 <translation id="4042264909745389898">‏شرایط سیستم‌عامل Google Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{خروج از صفحه}one{خروج از صفحه‌ها}other{خروج از صفحه‌ها}}</translation>
-<translation id="404299405565920089">‏می‌توانید همه حساب‌های Google خود را که از برنامه‌ها و وب‌سایت‌ها به سیستم وارد شده‌اند، از اینجا مدیریت کنید. برنامه‌ها و وب‌سایت‌هایی که از شما مجوز دارند، می‌توانند به اطلاعات حسابی که جهت کارکرد مناسب نیاز دارند دستری پیدا کنند.</translation>
 <translation id="4044612648082411741">گذرواژه گواهی‌تان را وارد کنید</translation>
 <translation id="404493185430269859">موتور جستجوی پیش‌‌فرض</translation>
 <translation id="4046123991198612571">آهنگ بعدی</translation>
@@ -2091,7 +2092,6 @@
 <translation id="4242533952199664413">باز کردن تنظیمات</translation>
 <translation id="4242577469625748426">تنظیمات خط‌مشی روی دستگاه نصب نشد: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">پیدا کردن برنامه‌های قلم بیشتر</translation>
-<translation id="424546999567421758">مصرف بالای دیسک شناسایی شد</translation>
 <translation id="424726838611654458">‏همیشه در Adobe Reader باز شود</translation>
 <translation id="4247901771970415646">همگام‌سازی با <ph name="USERNAME" /> نمی‌تواند انجام شود</translation>
 <translation id="4249248555939881673">در انتظار اتصال شبکه...</translation>
@@ -2199,7 +2199,6 @@
 <translation id="4421932782753506458">پشمالو</translation>
 <translation id="4422347585044846479">ویرایش نشانک برای این صفحه</translation>
 <translation id="4423376891418188461">بازیابی تنظیمات</translation>
-<translation id="4423482519432579560">&amp;غلط‌گیر املا</translation>
 <translation id="442397852638519243">سرپرستتان (<ph name="USER_NAME" />)، از شما می‌خواهد که گذرواژه‌تان را عوض کنید.</translation>
 <translation id="4430019312045809116">میزان صدا</translation>
 <translation id="4430369329743628066">نشانک اضافه شد</translation>
@@ -2659,8 +2658,6 @@
 <translation id="5187295959347858724">‏شما اکنون به سیستم <ph name="SHORT_PRODUCT_NAME" /> وارد شدید. نشانک‌ها، سابقه و سایر تنظیمات شما با حساب Google  شما همگام‌سازی می‌شوند.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> می‌خواهد چند فایل را بارگیری کند</translation>
-<translation id="5192316339598592690">‏به‌سرعت به حساب دیگری بروید و به‌طور هم‌زمان به سیستم برنامه‌ها و وب‌سایت‌ها وارد شوید.
-    برنامه‌ها و سایت‌ها می‌توانند از شما بخواهند به آن‌ها اجازه دهید از بعضی از اطلاعات حساب Google شما استفاده کنند. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">لطفاً دستگاه را پاورواش کنید و دوباره امتحان کنید.</translation>
 <translation id="5204967432542742771">گذرواژه را وارد کنید</translation>
 <translation id="5206215183583316675">«<ph name="CERTIFICATE_NAME" />» حذف شود؟</translation>
@@ -3339,7 +3336,6 @@
 <translation id="622537739776246443">نمایه حذف خواهد شد</translation>
 <translation id="6225475702458870625">اتصال داده از <ph name="PHONE_NAME" /> دردسترس است</translation>
 <translation id="6226777517901268232">فایل کلید خصوصی (اختیاری)</translation>
-<translation id="6228516488918914827">صفحه سریع‌تر بارگیری شد</translation>
 <translation id="6228691855869374890">‏این سایت کنترل کامل دستگاه‌های MIDI را دارد.</translation>
 <translation id="6229890768313448549">‏شرایط و ضوابط Google Play نمی‌تواند بارگیری شود. لطفاً دوباره امتحان کنید.</translation>
 <translation id="6231881193380278751">‏افزودن پارامتر جستار در نشانی وب برای بازخوانی خودکار صفحه: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3544,7 +3540,6 @@
 <translation id="6545665334409411530">سرعت تکرار</translation>
 <translation id="6545834809683560467">استفاده از یک سرویس پیش‌بینی برای کمک به تکمیل جستجوها و نشانی‌های وب تایپ شده در نوار آدرس یا کادر جستجوی راه‌انداز برنامه</translation>
 <translation id="6545867563032584178">‏در «تنظیمات برگزیده سیستم Mac»، میکروفون خاموش است</translation>
-<translation id="6547316139431024316">برای این برنامه افزودنی دیگر هشدار داده نشود</translation>
 <translation id="6547354035488017500">اگر حداقل ۵۱۲ مگابایت از حافظه دستگاه را خالی نکنید، پاسخ‌گویی دستگاه متوقف خواهد شد. برای آزاد کردن فضا، فایل‌ها را از حافظه دستگاه حذف کنید.</translation>
 <translation id="6550675742724504774">گزینه‌ها</translation>
 <translation id="6551508934388063976">‏فرمان در دسترس نیست. برای باز کردن پنجره‌ای جدید، Control-N را فشار دهید.</translation>
@@ -4675,7 +4670,6 @@
 <translation id="827097179112817503">نمایش دکمه صفحه اصلی</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{۱ نشانک حذف شد}one{# نشانک حذف شد}other{# نشانک حذف شد}}</translation>
 <translation id="8272443605911821513">با کلیک کردن روی افزونه‌ها در منوی «ابزارهای بیشتر»، برنامه‌های افزودنی خود را مدیریت کنید.</translation>
-<translation id="8272966760965438857">‏مدیریت حساب‌ها Google در یک مکان</translation>
 <translation id="8274332263553132018">ارسال محتوای فایل</translation>
 <translation id="8274924778568117936">تا وقتی به‌روزرسانی به پایان نرسیده است، <ph name="DEVICE_TYPE" /> را خاموش نکنید یا نبندید. بعد از کامل شدن نصب، <ph name="DEVICE_TYPE" /> راه‌اندازی مجدد می‌شود.</translation>
 <translation id="8275038454117074363">وارد کردن</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index afeb5a45..51aae707 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -338,6 +338,7 @@
     välityspalvelinta, muokkaa <ph name="LINK_START" />välityspalvelimen asetuksia<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Tämä voidaan kumota vain asentamalla <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> uudelleen.</translation>
 <translation id="151501797353681931">Tuotu Safarista</translation>
+<translation id="1515163294334130951">Käynnistä</translation>
 <translation id="1521442365706402292">Hallinnoi varmenteita</translation>
 <translation id="152234381334907219">Tallentamaton</translation>
 <translation id="1524430321211440688">Näppäimistö</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Äänekkäin</translation>
 <translation id="1673137583248014546"><ph name="URL" /> haluaa nähdä suojausavaimesi merkin ja mallin.</translation>
 <translation id="1679068421605151609">Kehittäjän työkalut</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Ylläpitopalvelu lähetti HTTP-virheen.</translation>
 <translation id="1680849702532889074">Linux-sovelluksen asennuksessa tapahtui virhe.</translation>
 <translation id="16815041330799488">Älä anna sivustojen nähdä leikepöydälle kopioitua tekstiä ja kuvia</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Selaushistoria</translation>
 <translation id="2497229222757901769">Hiiren nopeus</translation>
 <translation id="2497852260688568942">Järjestelmänvalvoja on poistanut synkronoinnin käytöstä.</translation>
-<translation id="249819058197909513">Älä varoita uudelleen tästä sovelluksesta</translation>
 <translation id="2498539833203011245">Pienennä</translation>
 <translation id="2498765460639677199">Valtava</translation>
 <translation id="2499747912851752301">Viedään salasanoja…</translation>
@@ -1052,7 +1053,6 @@
 <translation id="2630681426381349926">Aloita yhdistämällä Wi-Fi-verkkoon</translation>
 <translation id="2631120081682787498">Haluatko varmasti sulkea välilehden?</translation>
 <translation id="2631498379019108537">Näytä syöttöasetukset hyllyssä</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> käyttää <ph name="USAGE" /> Mt levytilaa.</translation>
 <translation id="2633212996805280240">Poistetaanko <ph name="EXTENSION_NAME" />?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ei voinut suorittaa asennusta loppuun, vaan toimii edelleen levyvedoksen kautta.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1398,7 +1398,6 @@
 <translation id="3157931365184549694">Palauta</translation>
 <translation id="3158033540161634471">Määritä sormenjälki</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (laitteiston tukema)</translation>
-<translation id="316125635462764134">Poista sovellus</translation>
 <translation id="3161522574479303604">Kaikki kielet</translation>
 <translation id="3163201441334626963">Tuntematon tuote <ph name="PRODUCT_ID" /> toimittajalta <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Jotkin operaattorit saattavat estää tämän ominaisuuden.</translation>
@@ -1899,6 +1898,7 @@
 <translation id="3916445069167113093">Tämäntyyppinen tiedosto voi vahingoittaa tietokonettasi. Haluatko säilyttää tiedoston <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Raportoi tiedot Googlelle</translation>
 <translation id="3919145445993746351">Ota synkronointi käyttöön, niin voit käyttää laajennuksia kaikilla tietokoneilla</translation>
+<translation id="391999873395511996">Ladataan virtuaalikonetta.</translation>
 <translation id="3920504717067627103">Varmennekäytännöt</translation>
 <translation id="392089482157167418">Ota ChromeVox käyttöön (äänipalaute)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1947,7 +1947,6 @@
 <translation id="3983586614702900908">tuntemattoman myyjän laitteet</translation>
 <translation id="3984159763196946143">Demotilan käynnistys epäonnistui</translation>
 <translation id="3984431586879874039">Saako tämä sivusto nähdä suojausavaimesi?</translation>
-<translation id="3987348946546879621">Datan säästö</translation>
 <translation id="3987938432087324095">En saanut selvää.</translation>
 <translation id="3988996860813292272">Valitse aikavyöhyke</translation>
 <translation id="399179161741278232">Tuotu</translation>
@@ -1978,7 +1977,6 @@
 <translation id="4037889604535939429">Muokkaa henkilöä</translation>
 <translation id="4042264909745389898">Google Chrome ‑käyttöjärjestelmän käyttöehdot</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Sulje sivu}other{Sulje sivut}}</translation>
-<translation id="404299405565920089">Täällä voit ylläpitää kaikkia Google-tilejä, joille olet kirjautunut sovelluksissa tai verkkosivustoilla. Sallimasi sovellukset ja verkkosivustot voivat käyttää tilitietoja, joita ne tarvitsevat toimiakseen.</translation>
 <translation id="4044612648082411741">Anna varmenteen salasana.</translation>
 <translation id="404493185430269859">Oletushakukone</translation>
 <translation id="4046123991198612571">Seuraava kappale</translation>
@@ -2093,7 +2091,6 @@
 <translation id="4242533952199664413">Avaa asetukset</translation>
 <translation id="4242577469625748426">Käytäntöasetuksien asentaminen laitteelle epäonnistui: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Hae lisää näyttökynäsovelluksia</translation>
-<translation id="424546999567421758">Kohde käyttää paljon levytilaa</translation>
 <translation id="424726838611654458">Avaa aina Adobe Readerissa</translation>
 <translation id="4247901771970415646">Synkronointi tilille <ph name="USERNAME" /> epäonnistui</translation>
 <translation id="4249248555939881673">Odotetaan verkkoyhteyttä…</translation>
@@ -2201,7 +2198,6 @@
 <translation id="4421932782753506458">Pörrö</translation>
 <translation id="4422347585044846479">Muokkaa tämän sivun kirjanmerkkiä</translation>
 <translation id="4423376891418188461">Palauta asetukset</translation>
-<translation id="4423482519432579560">&amp;Oikoluku</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, järjestelmänvalvojasi vaatii sinua vaihtamaan salasanasi.</translation>
 <translation id="4430019312045809116">Äänenvoimakkuus</translation>
 <translation id="4430369329743628066">Kirjanmerkki lisättiin</translation>
@@ -2661,8 +2657,6 @@
 <translation id="5187295959347858724">Olet kirjautunut tuotteeseen <ph name="SHORT_PRODUCT_NAME" />. Kirjanmerkkisi, historiasi ja muut asetuksesi synkronoidaan Google-tiliisi.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> haluaa ladata useita tiedostoja</translation>
-<translation id="5192316339598592690">Vaihda tiliä nopeasti ja kirjaudu sovelluksiin ja sivustoille yhdellä kertaa.
-    Sovellukset ja sivustot voivat pyytää lupaa joidenkin Google-tilisi tietojen käyttöön. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Suorita powerwash ja yritä uudelleen.</translation>
 <translation id="5204967432542742771">Anna salasana</translation>
 <translation id="5206215183583316675">Poistetaanko <ph name="CERTIFICATE_NAME" />?</translation>
@@ -3343,7 +3337,6 @@
 <translation id="622537739776246443">Profiili poistetaan</translation>
 <translation id="6225475702458870625">Datayhteys käytettävissä puhelimella <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Yksityinen avaintiedosto (valinnainen)</translation>
-<translation id="6228516488918914827">Sivu ladattu nopeammin</translation>
 <translation id="6228691855869374890">Tällä sivustolla on MIDI-laitteiden täysi käyttöoikeus.</translation>
 <translation id="6229890768313448549">Google Playn käyttöehtojen lataaminen epäonnistui. Yritä uudelleen.</translation>
 <translation id="6231881193380278751">Lisää URL-osoitteeseen kyselyn param-arvo, jotta sivu päivitetään automaattisesti: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3541,6 @@
 <translation id="6545665334409411530">Toistonopeus</translation>
 <translation id="6545834809683560467">Käytä ennakointipalvelua, niin osoitepalkkiin tai sovelluksien käynnistysohjelman hakukenttään kirjoitetut hakulausekkeet ja URL-osoitteet täydennetään</translation>
 <translation id="6545867563032584178">Mikrofoni on poistettu käytöstä Macin järjestelmäasetuksista</translation>
-<translation id="6547316139431024316">Älä varoita uudelleen tästä laajennuksesta</translation>
 <translation id="6547354035488017500">Vapauta vähintään 512 Mt tilaa, tai laite ei enää vastaa. Voit vapauttaa tilaa poistamalla laitteelle tallennettuja tiedostoja.</translation>
 <translation id="6550675742724504774">Asetukset</translation>
 <translation id="6551508934388063976">Komento ei ole käytettävissä. Avaa uusi ikkuna painamalla control-N.</translation>
@@ -4678,7 +4670,6 @@
 <translation id="827097179112817503">Näytä Etusivu-painike</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 kirjanmerkki poistettiin}other{# kirjanmerkkiä poistettiin}}</translation>
 <translation id="8272443605911821513">Hallinnoi laajennuksiasi valitsemalla Lisätyökalut-valikossa Laajennukset.</translation>
-<translation id="8272966760965438857">Ylläpidä Google-tilejäsi yhdessä paikassa</translation>
 <translation id="8274332263553132018">Suoratoista tiedosto</translation>
 <translation id="8274924778568117936">Pidä <ph name="DEVICE_TYPE" /> päällä, kunnes päivitys on valmis. <ph name="DEVICE_TYPE" /> käynnistyy uudelleen, kun asennus on valmis.</translation>
 <translation id="8275038454117074363">Tuo</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 303f5b66..f8186c9 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -338,6 +338,7 @@
     ng proxy server, ayusin ang iyong <ph name="LINK_START" />mga setting ng proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Ang tanging paraan upang ma-undo ito ay muling i-install ang <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Na-import Mula sa Safari</translation>
+<translation id="1515163294334130951">Ilunsad</translation>
 <translation id="1521442365706402292">Pamahalaan ang mga sertipiko</translation>
 <translation id="152234381334907219">Hindi Kailanman Na-save</translation>
 <translation id="1524430321211440688">Keyboard</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Pinakamalakas</translation>
 <translation id="1673137583248014546">Gustong tingnan ng <ph name="URL" /> ang manufacturer at modelo ng iyong Security Key</translation>
 <translation id="1679068421605151609">Mga Tool ng Developer</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Nagpadala ang serbisyo ng pamamahala ng HTTP error.</translation>
 <translation id="1680849702532889074">Nagkaroon ng error habang ini-install ang iyong Linux application.</translation>
 <translation id="16815041330799488">Huwag payagan ang mga site na makita ang text at mga larawang kinopya sa clipboard</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Hindi maisama ang device sa domain. Tiyaking hindi mo nalampasan ang bilang ng mga device na maaari mong idagdag.</translation>
 <translation id="1744108098763830590">pahina ng background</translation>
 <translation id="1745520510852184940">Palagi Itong Gawin</translation>
+<translation id="1746402432151920942">Pinoprotektahang Pagkakakilanlan ng Media</translation>
 <translation id="175196451752279553">M&amp;uling buksan ang nakasarang tab</translation>
 <translation id="1753905327828125965">Most Visited</translation>
 <translation id="1756681705074952506">Pamamaraan ng pag-input</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Hindi naka-sign in</translation>
 <translation id="1832511806131704864">Na-update na ang pagbabago sa telepono</translation>
 <translation id="1834503245783133039">Hindi na-download: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Mga MIDI Device</translation>
 <translation id="1838374766361614909">I-clear ang paghahanap</translation>
 <translation id="1841545962859478868">Maaaring subaybayan ng admin ng device ang mga sumusunod:</translation>
 <translation id="1841616161104323629">Nawawala ang tala ng device.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Mag-ulat ng isyu</translation>
 <translation id="2220572644011485463">PIN o password</translation>
 <translation id="2224444042887712269">Ang setting na ito ay kay <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Mga Event sa Pagiging Accessible</translation>
 <translation id="2224551243087462610">I-edit ang pangalan ng folder</translation>
 <translation id="2226449515541314767">Na-block ang site na ito mula sa pagkakaroon ng buong kontrol sa mga MIDI device.</translation>
 <translation id="2226720438730111184">Sabihin sa Amin Kung Ano ang Nangyayari</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">History ng Pag-browse</translation>
 <translation id="2497229222757901769">Bilis ng mouse</translation>
 <translation id="2497852260688568942">Na-disable ng iyong administrator ang pag-sync</translation>
-<translation id="249819058197909513">Huwag muling magbabala para sa app na ito</translation>
 <translation id="2498539833203011245">I-minimize</translation>
 <translation id="2498765460639677199">Napakalaki</translation>
 <translation id="2499747912851752301">Ine-export ang mga password...</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Kumonekta sa Wi-Fi upang magsimula</translation>
 <translation id="2631120081682787498">Sigurado ka bang gusto mong isara ang tab na ito?</translation>
 <translation id="2631498379019108537">Ipakita ang mga opsyon sa pag-input sa shelf</translation>
-<translation id="2633199387167390344">Gumagamit ang <ph name="NAME" /> ng <ph name="USAGE" /> MB ng disk space.</translation>
 <translation id="2633212996805280240">Alisin ang "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101">Hindi makumpleto ng <ph name="PRODUCT_NAME" /> ang pag-install, ngunit patuloy na gagana mula sa larawan ng disk nito.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Ipanumbalik</translation>
 <translation id="3158033540161634471">I-set up ang iyong fingerprint</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardware-backed)</translation>
-<translation id="316125635462764134">Alisin ang app</translation>
 <translation id="3161522574479303604">Lahat ng wika</translation>
 <translation id="3163201441334626963">Hindi kilalang produkto na <ph name="PRODUCT_ID" /> mula sa vendor na <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Maaaring i-block ng ilang carrier ang feature na ito.</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">Maaaring makapinsala sa iyong computer ang uri ng file na ito. Gusto mo pa rin bang panatilihin ang <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Iulat ang mga detalye sa Google</translation>
 <translation id="3919145445993746351">Para makuha ang iyong mga extension sa lahat ng computer mo, i-on ang pag-sync</translation>
+<translation id="391999873395511996">Dina-download ang virtual machine.</translation>
 <translation id="3920504717067627103">Mga Patakaran ng Certificate</translation>
 <translation id="392089482157167418">I-enable ang ChromeVox (pasalitang feedback)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">mga device mula sa isang hindi kilalang vendor</translation>
 <translation id="3984159763196946143">Hindi masimulan ang demo mode</translation>
 <translation id="3984431586879874039">Payagan ang site na ito na makita ang iyong security key?</translation>
-<translation id="3987348946546879621">Nakatipid ng data</translation>
 <translation id="3987938432087324095">Paumanhin, hindi ko naunawaan iyon.</translation>
 <translation id="3988996860813292272">Pumili ng timezone</translation>
 <translation id="399179161741278232">Na-import</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">I-edit ang tao</translation>
 <translation id="4042264909745389898">Mga tuntunin ng Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Umalis sa Page}one{Umalis sa Mga Page}other{Umalis sa Mga Page}}</translation>
-<translation id="404299405565920089">Maaaring pamahalaan dito ang lahat ng iyong naka-sign in na Google Account mula sa mga app at website. Maaaring i-access ng mga app at website na mayroon ng iyong pahintulot ang impormasyon ng account na kinakailangan ng mga ito para gumana nang maayos ang mga ito.</translation>
 <translation id="4044612648082411741">Ilagay ang password ng iyong certificate</translation>
 <translation id="404493185430269859">Default na search engine</translation>
 <translation id="4046123991198612571">Susunod na track</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">Buksan ang mga setting</translation>
 <translation id="4242577469625748426">Nabigong i-install ang mga setting ng patakaran sa device: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Maghanap ng higit pang app ng stylus</translation>
-<translation id="424546999567421758">Natukoy ang mataas na paggamit ng disk</translation>
 <translation id="424726838611654458">Palaging buksan sa Adobe Reader</translation>
 <translation id="4247901771970415646">Hindi ma-sync sa <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Naghihintay ng koneksyon sa network...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">Mingming</translation>
 <translation id="4422347585044846479">I-edit ang bookmark para sa pahinang ito</translation>
 <translation id="4423376891418188461">I-restore ang Mga Setting</translation>
-<translation id="4423482519432579560">&amp;Spellcheck</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, hinihiling sa iyo ng administrator mo na palitan ang iyong password.</translation>
 <translation id="4430019312045809116">Volume</translation>
 <translation id="4430369329743628066">Naidagdag na ang bookmark</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">Naka-sign in ka na ngayon sa <ph name="SHORT_PRODUCT_NAME" />. Ang iyong mga bookmark, kasaysayan, at ibang mga setting ay sini-sync sa iyong Google Account.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">Gustong mag-download ng <ph name="ORIGIN" /> ng maraming file</translation>
-<translation id="5192316339598592690">Mabilis na lumipat ng account at mag-sign in sa mga app at website nang sabay-sabay.
-    Puwedeng humiling sa iyo ang mga app at site ng pahintulot na gamitin ang ilan sa impormasyon ng Google Account mo. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Paki-powerwash ang device at subukang muli.</translation>
 <translation id="5204967432542742771">Ipasok ang password</translation>
 <translation id="5206215183583316675">I-delete ang "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3343,7 +3340,6 @@
 <translation id="622537739776246443">Ide-delete ang profile</translation>
 <translation id="6225475702458870625">Available ang koneksyon sa data mula sa iyong <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Pribadong key file (opsyonal)</translation>
-<translation id="6228516488918914827">Mas mabilis na na-load ang page</translation>
 <translation id="6228691855869374890">May buong kontrol sa mga MIDI device ang site na ito.</translation>
 <translation id="6229890768313448549">Hindi ma-load ang Mga Tuntunin ng Serbisyo ng Google Play. Pakisubukang muli.</translation>
 <translation id="6231881193380278751">Magdagdag ng query param sa URL upang awtomatikong i-refresh ang page: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3544,6 @@
 <translation id="6545665334409411530">Rate ng pag-uulit</translation>
 <translation id="6545834809683560467">Gumamit ng serbisyo sa paghula upang makatulong sa pagkumpleto ng mga paghahanap at URL na itina-type sa address bar o sa box para sa paghahanap ng app launcher</translation>
 <translation id="6545867563032584178">Naka-off ang mikropono sa System Preferences ng Mac</translation>
-<translation id="6547316139431024316">Huwag muling magbabala para sa extension na ito</translation>
 <translation id="6547354035488017500">Magbakante ng hindi bababa sa 512 MB ng espasyo ng iyong device, kung hindi ay hindi gagana nang maayos ang iyong device. Upang magbakante ng espasyo, mag-delete ng mga file mula sa storage ng device.</translation>
 <translation id="6550675742724504774">Mga Pagpipilian</translation>
 <translation id="6551508934388063976">Hindi available ang command. Pindutin ang control-N upang magbukas ng bagong window.</translation>
@@ -4679,7 +4674,6 @@
 <translation id="827097179112817503">Ipakita ang button ng home</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Na-delete ang 1 bookmark}one{Na-delete ang # bookmark}other{Na-delete ang # na bookmark}}</translation>
 <translation id="8272443605911821513">Pamahalaan ang iyong mga extension sa pamamagitan ng pag-click sa Mga Extension sa menu ng "Higit pang mga tool."</translation>
-<translation id="8272966760965438857">Pamahalaan ang iyong Mga Google Account sa iisang lugar</translation>
 <translation id="8274332263553132018">I-cast ang file</translation>
 <translation id="8274924778568117936">Huwag i-off o isara ang iyong <ph name="DEVICE_TYPE" /> hanggang sa matapos ang pag-update. Magre-restart ang <ph name="DEVICE_TYPE" /> mo pagkatapos ng pag-install.</translation>
 <translation id="8275038454117074363">I-import</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 69078d4..b52412c3 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -338,6 +338,7 @@
     serveur proxy, réglez vos <ph name="LINK_START" />paramètres de proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">La seule façon d'annuler cette action consiste à réinstaller <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importés depuis Safari</translation>
+<translation id="1515163294334130951">Lancer</translation>
 <translation id="1521442365706402292">Gérer les certificats</translation>
 <translation id="152234381334907219">Jamais enregistrés</translation>
 <translation id="1524430321211440688">Clavier</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Volume maximal</translation>
 <translation id="1673137583248014546"><ph name="URL" /> souhaite voir la marque et le modèle de votre clé de sécurité</translation>
 <translation id="1679068421605151609">Outils de développement</translation>
+<translation id="1679806121152819234">VM Plug-in</translation>
 <translation id="167983332380191032">Le service de gestion a renvoyé une erreur HTTP.</translation>
 <translation id="1680849702532889074">Une erreur s'est produite pendant l'installation de votre application Linux.</translation>
 <translation id="16815041330799488">Interdire aux sites de voir le texte et les images copiés dans le presse-papiers</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Historique de navigation</translation>
 <translation id="2497229222757901769">Vitesse de la souris</translation>
 <translation id="2497852260688568942">Votre administrateur a désactivé la synchronisation</translation>
-<translation id="249819058197909513">Ne plus m'avertir pour cette application</translation>
 <translation id="2498539833203011245">Réduire</translation>
 <translation id="2498765460639677199">Très grande</translation>
 <translation id="2499747912851752301">Exportation des mots de passe…</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Se connecter au réseau Wi-Fi pour commencer</translation>
 <translation id="2631120081682787498">Voulez-vous vraiment fermer cet onglet ?</translation>
 <translation id="2631498379019108537">Afficher les options de saisie sur l'étagère</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> utilise actuellement <ph name="USAGE" /> Mo d'espace disque.</translation>
 <translation id="2633212996805280240">Désinstaller "<ph name="EXTENSION_NAME" />" ?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> n'a pas pu terminer l'installation, mais va poursuivre son exécution à partir de son image disque.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Restaurer</translation>
 <translation id="3158033540161634471">Configurer votre empreinte digitale</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (matériel requis)</translation>
-<translation id="316125635462764134">Supprimer l'application</translation>
 <translation id="3161522574479303604">Toutes les langues</translation>
 <translation id="3163201441334626963">Produit inconnu <ph name="PRODUCT_ID" /> du fournisseur <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Certains opérateurs peuvent bloquer cette fonctionnalité.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Ce type de fichier risque d'endommager votre ordinateur. Voulez-vous vraiment enregistrer <ph name="FILE_NAME" /> ?</translation>
 <translation id="3918972485393593704">Envoyer les informations à Google</translation>
 <translation id="3919145445993746351">Pour synchroniser vos extensions sur tous vos ordinateurs, activez la synchronisation</translation>
+<translation id="391999873395511996">Téléchargement de la machine virtuelle…</translation>
 <translation id="3920504717067627103">Stratégies de certificat</translation>
 <translation id="392089482157167418">Activer ChromeVox (commentaires audio)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">appareils d'un fournisseur inconnu</translation>
 <translation id="3984159763196946143">Impossible de démarrer le mode démonstration</translation>
 <translation id="3984431586879874039">Autoriser ce site à lire les informations de votre clé de sécurité ?</translation>
-<translation id="3987348946546879621">Données économisées</translation>
 <translation id="3987938432087324095">Pardon, je n'ai pas compris.</translation>
 <translation id="3988996860813292272">Sélectionner un fuseau horaire</translation>
 <translation id="399179161741278232">Importés</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Modifier le profil utilisateur</translation>
 <translation id="4042264909745389898">Conditions d'utilisation de Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Quitter la page}one{Quitter la page}other{Quitter les pages}}</translation>
-<translation id="404299405565920089">Vous pouvez gérer ici tous vos comptes Google auxquels vous êtes connecté depuis des applications et des sites Web. Les applications et les sites Web qui disposent de votre autorisation peuvent accéder aux informations de compte dont ils ont besoin pour fonctionner correctement.</translation>
 <translation id="4044612648082411741">Saisissez le mot de passe du certificat.</translation>
 <translation id="404493185430269859">Moteur de recherche par défaut</translation>
 <translation id="4046123991198612571">Piste suivante</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Ouvrir les paramètres</translation>
 <translation id="4242577469625748426">Échec de l'installation des paramètres des règles sur l'appareil : <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Trouver plus d'applications de stylet</translation>
-<translation id="424546999567421758">Utilisation intensive du disque détectée</translation>
 <translation id="424726838611654458">Toujours ouvrir dans Adobe Reader</translation>
 <translation id="4247901771970415646">Impossible de synchroniser avec <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Connexion réseau en attente…</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Félix</translation>
 <translation id="4422347585044846479">Modifier le favori de cette page</translation>
 <translation id="4423376891418188461">Rétablir les paramètres</translation>
-<translation id="4423482519432579560">&amp;Vérification orthographique</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, votre administrateur exige que vous changiez votre mot de passe.</translation>
 <translation id="4430019312045809116">Volume</translation>
 <translation id="4430369329743628066">Favori ajouté</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Vous êtes maintenant connecté à <ph name="SHORT_PRODUCT_NAME" />. Vos favoris, votre historique et d'autres paramètres sont synchronisés avec votre compte Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> souhaite télécharger plusieurs fichiers</translation>
-<translation id="5192316339598592690">Changez rapidement de compte et connectez-vous simultanément aux applications et aux sites Web.
-    Certaines applications et certains sites peuvent vous demander l'autorisation d'utiliser des informations de votre compte Google. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Veuillez effectuer un Powerwash de l'appareil, puis réessayer.</translation>
 <translation id="5204967432542742771">Mot de passe</translation>
 <translation id="5206215183583316675">Supprimer "<ph name="CERTIFICATE_NAME" />" ?</translation>
@@ -3344,7 +3338,6 @@
 <translation id="622537739776246443">Le profil va être supprimé</translation>
 <translation id="6225475702458870625">Connexion de données disponible sur votre <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Fichier de clé privée (facultatif)</translation>
-<translation id="6228516488918914827">Page chargée plus rapidement</translation>
 <translation id="6228691855869374890">Le contrôle total des appareils MIDI est activé pour ce site.</translation>
 <translation id="6229890768313448549">Impossible de charger les conditions d'utilisation de Google Play. Veuillez réessayer.</translation>
 <translation id="6231881193380278751">Ajoutez un paramètre de requête dans l'URL pour une actualisation automatique de la page : chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3549,7 +3542,6 @@
 <translation id="6545665334409411530">Fréquence de répétition</translation>
 <translation id="6545834809683560467">Utiliser un service de prédiction afin de compléter les requêtes de recherche et les URL saisies dans la barre d'adresse ou dans le champ de recherche du lanceur d'applications</translation>
 <translation id="6545867563032584178">Micro désactivé dans les préférences système Mac</translation>
-<translation id="6547316139431024316">Ne plus m'avertir pour cette extension</translation>
 <translation id="6547354035488017500">Si vous ne libérez pas au moins 512 Mo en supprimant des fichiers de l'espace de stockage, votre appareil ne répondra plus.</translation>
 <translation id="6550675742724504774">Options</translation>
 <translation id="6551508934388063976">Commande indisponible. Appuyez sur CTRL + N pour ouvrir une nouvelle fenêtre.</translation>
@@ -4680,7 +4672,6 @@
 <translation id="827097179112817503">Afficher le bouton Accueil</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 favori supprimé}one{# favori supprimé}other{# favoris supprimés}}</translation>
 <translation id="8272443605911821513">Cliquer sur "Extensions" dans le menu "Autres outils" pour gérer les extensions</translation>
-<translation id="8272966760965438857">Gérez tous vos comptes Google au même endroit</translation>
 <translation id="8274332263553132018">Caster le fichier</translation>
 <translation id="8274924778568117936">N'éteignez pas et ne fermez pas votre <ph name="DEVICE_TYPE" /> avant la fin de la mise à jour. Votre <ph name="DEVICE_TYPE" /> redémarrera une fois l'installation terminée.</translation>
 <translation id="8275038454117074363">Importer</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index c6cd542..4707a3c1 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">જો તમે પ્રૉક્સી સર્વર વાપરી રહ્યાં છો, તો તમારી પ્રૉક્સી સેટિંગ તપાસો અથવા પ્રૉક્સી સર્વર કામ કરી રહ્યું છે તેની ખાતરી કરવા માટે તમારા નેટવર્ક એડમિનનો સંપર્ક કરો. જો તમે માનતા નથી કે તમે પ્રૉક્સી સર્વરનો ઉપયોગ કરતા હોવા જોઈએ, તો તમારી <ph name="LINK_START" />પ્રૉક્સી સેટિંગ<ph name="LINK_END" />ને વ્યવસ્થિત કરો.</translation>
 <translation id="1512210426710821809">આને રદ કરવાની એકમાત્ર રીત છે <ph name="IDS_SHORT_PRODUCT_OS_NAME" />ને ફરીથી ઇન્સ્ટૉલ કરો</translation>
 <translation id="151501797353681931">સફારીમાંથી આયાત કરેલું</translation>
+<translation id="1515163294334130951">શરૂ કરો</translation>
 <translation id="1521442365706402292">પ્રમાણપત્રો મેનેજ કરો</translation>
 <translation id="152234381334907219">ક્યારેય ન સચવાયેલું</translation>
 <translation id="1524430321211440688">કીબોર્ડ</translation>
@@ -436,6 +437,7 @@
 <translation id="167160931442925455">સૌથી વધુ મોટો અવાજ</translation>
 <translation id="1673137583248014546"><ph name="URL" /> તમારી સુરક્ષા કીની બનાવટ અને મૉડલ જોવા માગે છે</translation>
 <translation id="1679068421605151609">વિકાસકર્તા સાધનો</translation>
+<translation id="1679806121152819234">પ્લગ-ઇન VM</translation>
 <translation id="167983332380191032">મેનેજમેન્ટ સેવાએ HTTP ભૂલ મોકલી.</translation>
 <translation id="1680849702532889074">તમારી Linux ઍપ્લિકેશનના ઇન્સ્ટૉલેશન દરમિયાન ભૂલ આવી.</translation>
 <translation id="16815041330799488">સાઇટને ક્લિપબોર્ડ પર કૉપિ કરેલ ટેક્સ્ટ અને છબીઓ જોવાની મંજૂરી આપશો નહીં</translation>
@@ -482,6 +484,7 @@
 <translation id="1744060673522309905">ઉપકરણ ડોમેન સાથે જોડી શકાતું નથી. તમને જેટલા ઉપકરણો ઉમેરવાની મંજૂરી હોય તે સંખ્યા વાટાવી નથી તેની ખાતરી કરો.</translation>
 <translation id="1744108098763830590">પૃષ્ઠભૂમિ પૃષ્ઠ</translation>
 <translation id="1745520510852184940">હંમેશાં આ કરો</translation>
+<translation id="1746402432151920942">સંરક્ષિત મીડિયા ઓળખકર્તા</translation>
 <translation id="175196451752279553">બંધ કરેલું ટેબ ફરિથી ખોલો</translation>
 <translation id="1753905327828125965">સૌથી વધુ જોવાયેલ</translation>
 <translation id="1756681705074952506">ઇનપુટ પદ્ધતિ</translation>
@@ -539,6 +542,7 @@
 <translation id="1830550083491357902">સાઇન ઇન નથી</translation>
 <translation id="1832511806131704864">ફોન ફેરફાર અપડેટ કર્યો</translation>
 <translation id="1834503245783133039">ડાઉનલોડ અસફળ: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">MIDI ડિવાઇસ</translation>
 <translation id="1838374766361614909">શોધ સાફ કરો</translation>
 <translation id="1841545962859478868">ઉપકરણ વ્યવસ્થાપક નીચે આપેલનું નિરીક્ષણ કરી શકે છે:</translation>
 <translation id="1841616161104323629">ડિવાઇસ રેકોર્ડ ખૂટે છે.</translation>
@@ -782,6 +786,7 @@
 <translation id="2220529011494928058">સમસ્યાની જાણ કરો</translation>
 <translation id="2220572644011485463">PIN અથવા પાસવર્ડ</translation>
 <translation id="2224444042887712269">આ સેટિંગ <ph name="OWNER_EMAIL" /> ની છે.</translation>
+<translation id="2224471211857467033">ઍક્સેસિબિલિટી ઇવેન્ટ</translation>
 <translation id="2224551243087462610">ફોલ્ડરના નામમાં ફેરફાર કરો</translation>
 <translation id="2226449515541314767">આ સાઇટને MIDI ઉપકરણોના સંપૂર્ણ નિયંત્રણ કરવાથી અવરોધિત કરવામાં આવી છે.</translation>
 <translation id="2226720438730111184">શું થઈ રહ્યું છે તે અમને કહો</translation>
@@ -959,7 +964,6 @@
 <translation id="2496180316473517155">બ્રાઉઝિંગ ઇતિહાસ</translation>
 <translation id="2497229222757901769">માઉસની ગતિ</translation>
 <translation id="2497852260688568942">સમન્વયન, તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરવામાં આવ્યું છે</translation>
-<translation id="249819058197909513">આ ઍપ્લિકેશન માટે ફરીથી ચેતવણી આપશો નહીં</translation>
 <translation id="2498539833203011245">નાનું કરો</translation>
 <translation id="2498765460639677199">વિશાળ</translation>
 <translation id="2499747912851752301">બધા પાસવર્ડની નિકાસ કરી રહ્યાં છીએ…</translation>
@@ -1047,7 +1051,6 @@
 <translation id="2630681426381349926">શરૂ કરવા માટે વાઇ-ફાઇથી કનેક્ટ કરો</translation>
 <translation id="2631120081682787498">શું તમે ખરેખર આ ટૅબ બંધ કરવા માગો છો?</translation>
 <translation id="2631498379019108537">શેલ્ફમાં ઇનપુટ વિકલ્પો બતાવો</translation>
-<translation id="2633199387167390344"><ph name="NAME" />, <ph name="USAGE" /> MB ડિસ્ક સ્થાનનો ઉપયોગ કરી રહ્યાં છે.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" ને દૂર કરીએ?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ઇન્સ્ટોલેશન પૂર્ણ કરી શક્યું નથી, પરંતુ તેની ડિસ્ક છબીથી ચાલુ રહી શકે છે.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1393,7 +1396,6 @@
 <translation id="3157931365184549694">પુનઃસ્થાપિત કરો</translation>
 <translation id="3158033540161634471">તમારી ફિંગરપ્રિન્ટ સેટઅપ કરો</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (હાર્ડવેર સમર્થિત)</translation>
-<translation id="316125635462764134">ઍપ્લિકેશન દૂર કરો</translation>
 <translation id="3161522574479303604">બધી ભાષાઓ</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> વિક્રેતાનું અજાણ્યું ઉત્પાદન <ph name="PRODUCT_ID" /></translation>
 <translation id="3165390001037658081">કેટલાક કૅરિઅર આ સુવિધાને અવરોધિત કરી શકે છે.</translation>
@@ -1894,6 +1896,7 @@
 <translation id="3916445069167113093">આ પ્રકારની ફાઇલ તમારા કમ્પ્યુટરને નુકસાન પહોંચાડી શકે છે. શું તમે તો પણ <ph name="FILE_NAME" /> ને રાખવા માગો છો?</translation>
 <translation id="3918972485393593704">Googleને વિગતોની જાણ કરો</translation>
 <translation id="3919145445993746351">તમારા બધા કમ્પ્યુટર પર તમારા એક્સ્ટેંશન મેળવવા માટે સિંક કરવાનું ચાલુ કરો</translation>
+<translation id="391999873395511996">વર્ચ્યુઅલ મશીન ડાઉનલોડ કરી રહ્યાં છીએ.</translation>
 <translation id="3920504717067627103">પ્રમાણપત્ર નીતિઓ</translation>
 <translation id="392089482157167418">ChromeVox ચાલુ કરો (બોલાયેલો પ્રતિસાદ)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1945,7 +1948,6 @@
 <translation id="3983586614702900908">અજાણ્યા વિક્રેતા પાસેથી ઉપકરણો</translation>
 <translation id="3984159763196946143">ડેમો મોડ શરૂ કરી શકાયો નથી</translation>
 <translation id="3984431586879874039">આ સાઇટને તમારો સુરક્ષા કોડ જોવાની મંજૂરી આપીએ?</translation>
-<translation id="3987348946546879621">બચાવેલ ડેટા</translation>
 <translation id="3987938432087324095">માફ કરશો, તે સમજાયું ન હતું.</translation>
 <translation id="3988996860813292272">સમયઝોન પસંદ કરો</translation>
 <translation id="399179161741278232">આયાત કરેલા</translation>
@@ -1976,7 +1978,6 @@
 <translation id="4037889604535939429">વ્યક્તિની માહિતીમાં ફેરફાર કરો</translation>
 <translation id="4042264909745389898">Google Chrome OS શરતો</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{પેજમાંથી બહાર નીકળો}one{પેજમાંથી બહાર નીકળો}other{પેજમાંથી બહાર નીકળો}}</translation>
-<translation id="404299405565920089">ઍપ અને વેબસાઇટમાંથી સાઇન ઇન કરેલ તમારા બધા Google એકાઉન્ટને અહીં મેનેજ કરી શકાય છે. તમારી પરવાનગી ધરાવતી ઍપ અને વેબસાઇટ, તેમને યોગ્ય રીતે કામ કરવા માટે જરૂરી હોય તેવી એકાઉન્ટની માહિતી ઍક્સેસ કરી શકે છે.</translation>
 <translation id="4044612648082411741">તમારો પ્રમાણપત્ર પાસવર્ડ દાખલ કરો</translation>
 <translation id="404493185430269859">ડિફોલ્ટ શોધ એન્જિન</translation>
 <translation id="4046123991198612571">આગલો ટ્રૅક</translation>
@@ -2091,7 +2092,6 @@
 <translation id="4242533952199664413">સેટિંગ્સ ખોલો</translation>
 <translation id="4242577469625748426">આ ઉપકરણ પર નીતિ સેટિંગ્સ ઇન્સ્ટોલ કરવામાં નિષ્ફળ ગયું: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">વધુ સ્ટાઇલસ ઍપ મેમરીનો શોધો</translation>
-<translation id="424546999567421758">ઉચ્ચ ડિસ્ક વપરાશ મળ્યો</translation>
 <translation id="424726838611654458">હંમેશાં Adobe Reader માં ખોલો</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" /> સાથે સિંક કરી શકાતું નથી</translation>
 <translation id="4249248555939881673">નેટવર્ક કનેક્શનની રાહ જોઈ રહ્યાં છે...</translation>
@@ -2199,7 +2199,6 @@
 <translation id="4421932782753506458">ફ્લફી</translation>
 <translation id="4422347585044846479">આ પેજ માટે બુકમાર્કમાં ફેરફાર કરો</translation>
 <translation id="4423376891418188461">સેટિંગ્સ પુનઃસ્થાપિત કરો</translation>
-<translation id="4423482519432579560">&amp;જોડણી તપાસો</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, તમારા વ્યવસ્થાપક માટે આવશ્યક છે કે તમે તમારો પાસવર્ડ બદલો.</translation>
 <translation id="4430019312045809116">વૉલ્યૂમ</translation>
 <translation id="4430369329743628066">બુકમાર્ક ઉમેરાયો</translation>
@@ -2659,8 +2658,6 @@
 <translation id="5187295959347858724">તમે હવે <ph name="SHORT_PRODUCT_NAME" /> પર સાઇન ઇન થયેલા છો. તમારા બુકમાર્ક, ઇતિહાસ, અને બીજા સેટિંગ તમારા Google એકાઉન્ટ સાથે સિંક થાય છે.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> એકથી વધુ ફાઇલો ડાઉનલોડ કરવા માગે છે</translation>
-<translation id="5192316339598592690">ઝડપથી એકાઉન્ટ સ્વિચ કરો અને ઍપ તથા વેબસાઇટમાં સાઇન ઇન કરો, બધું એકસાથે કરો.
-    ઍપ અને સાઇટ તમારા Google એકાઉન્ટની કેટલીક માહિતીનો ઉપયોગ કરવા માટે તમારી પરવાનગી માગી શકે છે. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">કૃપા કરીને ડિવાઇસને પાવરવોશ કરો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="5204967432542742771">પાસવર્ડ દાખલ કરો</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ને ડિલીટ કરી દઈએ?</translation>
@@ -3341,7 +3338,6 @@
 <translation id="622537739776246443">પ્રોફાઇલ ડિલીટ કરવામાં આવશે</translation>
 <translation id="6225475702458870625">તમારા <ph name="PHONE_NAME" /> પરથી ડેટા કનેક્શન ઉપલબ્ધ</translation>
 <translation id="6226777517901268232">ખાનગી કી ફાઇલ (વૈકલ્પિક)</translation>
-<translation id="6228516488918914827">પેજ વધુ ઝડપથી લોડ થયું</translation>
 <translation id="6228691855869374890">આ સાઇટનું MIDI ઉપકરણો પર સંપૂર્ણ નિયંત્રણ હોય છે.</translation>
 <translation id="6229890768313448549">Google Play સેવાની શરતો લોડ કરી શકાતી નથી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation>
 <translation id="6231881193380278751">પેજને ઑટો રિફ્રેશ કરવા માટે URLમાં એક ક્વેરી પરમ ઉમેરો: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3546,7 +3542,6 @@
 <translation id="6545665334409411530">પુનરાવર્તન રેટ</translation>
 <translation id="6545834809683560467">શોધ અને ઍડ્રેસ બાર અથવા ઍપ લૉન્ચર શોધ બૉક્સમાં લખેલી URLને પૂર્ણ કરવામાં સહાય માટે પૂર્વાનુમાન સેવાનો ઉપયોગ કરો</translation>
 <translation id="6545867563032584178">Mac સિસ્ટમ પસંદગીઓમાં માઇક્રોફોન બંધ કરેલું છે</translation>
-<translation id="6547316139431024316">આ એક્સ્ટેન્શન માટે ફરીથી ચેતવણી આપશો નહીં</translation>
 <translation id="6547354035488017500">ઓછામાં ઓછું 512 MB સ્થાન ખાલી કરો અથવા તમારું ડિવાઇસ કામ નહિ કરે. સ્થાન ખાલી કરવા માટે, ડ્રાઇવ સ્ટોરેજમાંથી ફાઇલો ડિલીટ કરો.</translation>
 <translation id="6550675742724504774">વિકલ્પો</translation>
 <translation id="6551508934388063976">આદેશ અનુપલબ્ધ. એક નવી વિંડોમાં ખોલવા માટે કંટ્રોલ-N દબાવો.</translation>
@@ -4671,7 +4666,6 @@
 <translation id="827097179112817503">હોમ બટન દર્શાવો</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 બુકમાર્ક કાઢી નાખ્યું}one{# બુકમાર્ક કાઢી નાખ્યા}other{# બુકમાર્ક કાઢી નાખ્યા}}</translation>
 <translation id="8272443605911821513">"વધુ સાધનો" મેનૂમાં એક્સટેન્શન્સને ક્લિક કરીને તમારા એક્સટેન્શન્સનું સંચાલન કરો.</translation>
-<translation id="8272966760965438857">તમારાં Google એકાઉન્ટ એક જ સ્થળે મેનેજ કરો</translation>
 <translation id="8274332263553132018">ફાઇલ કાસ્ટ કરો</translation>
 <translation id="8274924778568117936">અપડેટ પૂર્ણ ન થાય ત્યાં સુધી તમારું <ph name="DEVICE_TYPE" /> બંધ કરતા નહીં. ઇન્સ્ટૉલેશન પૂર્ણ થયા બાદ તમારું <ph name="DEVICE_TYPE" /> ફરી શરૂ થશે.</translation>
 <translation id="8275038454117074363">આયાત કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 3458013..4f6949b 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -28,7 +28,7 @@
 <translation id="1035590878859356651">इस पेज को बुकमार्क करें...</translation>
 <translation id="1036348656032585052">बंद करें</translation>
 <translation id="1036511912703768636">इनमें से कोई भी USB डिवाइस ऐक्‍सेस करें</translation>
-<translation id="1036982837258183574">पूर्ण स्क्रीन से बाहर निकलने के लिए |<ph name="ACCELERATOR" />| दबाएं</translation>
+<translation id="1036982837258183574">फ़ुल स्क्रीन से बाहर निकलने के लिए |<ph name="ACCELERATOR" />| दबाएं</translation>
 <translation id="1038168778161626396">केवल कूटलेखन</translation>
 <translation id="1039337018183941703">अमान्‍य या खराब फ़ाइल</translation>
 <translation id="1041175011127912238">इस पेज से जवाब नहीं मिल रहा है</translation>
@@ -248,7 +248,7 @@
 <translation id="1377600615067678409">अभी के लिए छोड़ें</translation>
 <translation id="1378613616312864539"><ph name="NAME" /> इस सेटिंग को नियंत्रित कर रहा है</translation>
 <translation id="1380436189840894976">फिर भी गुप्त मोड छोड़ना चाहते हैं?</translation>
-<translation id="1383861834909034572">पूर्ण होने पर खुल रहा है</translation>
+<translation id="1383861834909034572">पूरा होने पर खुल रहा है</translation>
 <translation id="1383876407941801731">खोजें</translation>
 <translation id="1386387014181100145">कैसे हैं.</translation>
 <translation id="138784436342154190">डिफ़ॉल्ट स्टार्टअप पेज को बहाल करना चाहते हैं?</translation>
@@ -338,6 +338,7 @@
     proxy server, adjust your <ph name="LINK_START" />proxy settings<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">इसे पहले जैसा करने का अकेला तरीका <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> को फिर से इंस्टॉल करना है</translation>
 <translation id="151501797353681931">Safari से आयातित</translation>
+<translation id="1515163294334130951">लॉन्च करें</translation>
 <translation id="1521442365706402292">प्रमाणपत्र प्रबंधित करें</translation>
 <translation id="152234381334907219">कभी नहीं सेव किया गया</translation>
 <translation id="1524430321211440688">कीबोर्ड</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">सबसे तेज़</translation>
 <translation id="1673137583248014546"><ph name="URL" /> आपकी सुरक्षा कुंजी के निर्माता और मॉडल को देखना चाहता है</translation>
 <translation id="1679068421605151609">डेवलपर टूल</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">प्रबंधक सेवा ने एचटीटीपी गड़बड़ी भेजी है.</translation>
 <translation id="1680849702532889074">आपका Linux ऐप्लिकेशन इंस्टॉल करते समय कोई गड़बड़ी हुई.</translation>
 <translation id="16815041330799488">साइटों को क्लिपबोर्ड पर कॉपी किए गए लेख और इमेज न देखने दें</translation>
@@ -551,7 +553,7 @@
 <translation id="1842766183094193446">क्या आप वाकई 'डेमो मोड' चालू करना चाहते हैं?</translation>
 <translation id="1846308012215045257"><ph name="PLUGIN_NAME" /> को चलाने के लिए कंट्रोल दबाए रखते हुए क्लिक करें</translation>
 <translation id="1848219224579402567">लिड बंद होने पर साइन आउट करें</translation>
-<translation id="1849186935225320012">इस पेज के पास MIDI डिवाइस का पूर्ण नियंत्रण है.</translation>
+<translation id="1849186935225320012">इस पेज के पास MIDI डिवाइस का पूरा नियंत्रण है.</translation>
 <translation id="1850508293116537636">&amp;घड़ी की दिशा में घुमाएं</translation>
 <translation id="1852141627593563189">नुकसान पहुंचाने वाला सॉफ़्टवेयर ढूंढें</translation>
 <translation id="1852799913675865625">फ़ाइल पढ़ने का प्रयास करते समय कोई गड़बड़ी आई: <ph name="ERROR_TEXT" /></translation>
@@ -567,7 +569,7 @@
 <translation id="1865678028973512614">फ़ाइलें मिटाएं</translation>
 <translation id="1865769994591826607">केवल समान-साइट कनेक्शन</translation>
 <translation id="186612162884103683">"<ph name="EXTENSION" />" चेक किए गए स्‍थानों में चित्रों, वीडियो, और ध्‍वनि फ़ाइलों को पढ़ और लिख सकता है.</translation>
-<translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> आपकी स्थापना पूर्ण करने के लिए तैयार है</translation>
+<translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> आपके इंस्टालेशन पूरा करने के लिए तैयार हैं</translation>
 <translation id="1868193363684582383">"Ok Google"</translation>
 <translation id="1871615898038944731">आपका <ph name="DEVICE_TYPE" /> अप टू डेट है</translation>
 <translation id="1875312262568496299">शुरू करें</translation>
@@ -581,7 +583,7 @@
 <translation id="1887850431809612466">हार्डवेयर पुनरीक्षण</translation>
 <translation id="1889984860246851556">प्रॉक्सी सेटिंग खोलें</translation>
 <translation id="1890674179660343635">&lt;span&gt;आईडी: &lt;/span&gt;<ph name="EXTENSION_ID" /></translation>
-<translation id="189210018541388520">पूर्ण स्‍क्रीन खोलें</translation>
+<translation id="189210018541388520">पूरी स्‍क्रीन खोलें</translation>
 <translation id="189358972401248634">अन्य भाषाएं</translation>
 <translation id="1895658205118569222">बंद करें</translation>
 <translation id="1895934970388272448">यह प्रोसेस पूरा करने के लिए आपको अपने प्रिंटर पर रजिस्ट्रेशन की पुष्टि करनी होगी - इसे अभी चुनें.</translation>
@@ -723,7 +725,7 @@
 <translation id="2138398485845393913">"<ph name="DEVICE_NAME" />" से कनेक्शन अब भी प्रगति में है</translation>
 <translation id="214169863967063661">प्रकटन सेटिंग खोलें</translation>
 <translation id="2142328300403846845">लिंक को इस रूप में खोलें</translation>
-<translation id="2143765403545170146">टूलबार को हमेशा पूर्ण स्क्रीन में दिखाएं</translation>
+<translation id="2143765403545170146">टूलबार को हमेशा फ़ुल स्क्रीन में दिखाएं</translation>
 <translation id="2143778271340628265">मैन्‍युअल प्रॉक्सी कॉन्फ़िगरेशन</translation>
 <translation id="2144536955299248197">प्रमाणपत्र व्यूअर: <ph name="CERTIFICATE_NAME" /></translation>
 <translation id="2148219725039824548">शेयर माउंट करने में गड़बड़ी. बताया गया शेयर नेटवर्क पर नहीं मिला.</translation>
@@ -737,8 +739,8 @@
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> जैसा लगता है</translation>
 <translation id="2156283799932971644">आप Google को कुछ 'सिस्टम जानकारी' और 'पेज सामग्री' भेजकर 'सुरक्षित ब्राउज़िंग' को बेहतर बना सकते हैं.</translation>
 <translation id="2156294658807918600">सर्विस वर्कर: <ph name="SCRIPT_URL" /></translation>
-<translation id="215753907730220065">पूर्ण स्क्रीन से बाहर निकलें</translation>
-<translation id="2157875535253991059">यह पेज अब पूर्ण स्‍क्रीन है.</translation>
+<translation id="215753907730220065">फ़ुल स्क्रीन से बाहर निकलें</translation>
+<translation id="2157875535253991059">यह पेज अब फ़ुल स्‍क्रीन है.</translation>
 <translation id="216169395504480358">वाई-फ़ाई  जोड़ें...</translation>
 <translation id="2162155940152307086">सिंक की सेटिंग छोड़ते ही सिंक फिर से शुरू हो जाएगा</translation>
 <translation id="2163470535490402084">अपने <ph name="DEVICE_TYPE" /> में साइन इन करने के लिए कृपया इंटरनेट से कनेक्ट करें.</translation>
@@ -787,7 +789,7 @@
 <translation id="2220572644011485463">पिन या पासवर्ड</translation>
 <translation id="2224444042887712269">यह सेटिंग <ph name="OWNER_EMAIL" /> से संबंधित है.</translation>
 <translation id="2224551243087462610">फ़ोल्डर के नाम में बदलाव करें</translation>
-<translation id="2226449515541314767">इस साइट को MIDI डिवाइस का पूर्ण नियंत्रण रखने से अवरोधित कर दिया गया है.</translation>
+<translation id="2226449515541314767">इस साइट को MIDI डिवाइस का पूरा नियंत्रण रखने से ब्लॉक कर दिया गया है.</translation>
 <translation id="2226720438730111184">हमें बताएं कि क्या हो रहा है</translation>
 <translation id="2229161054156947610">1 घंटा से ज़्यादा शेष है</translation>
 <translation id="222931766245975952">फ़ाइल छोटी हो गई</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">ब्राउज़िंग इतिहास...</translation>
 <translation id="2497229222757901769">माउस की गति</translation>
 <translation id="2497852260688568942">सिंक को आपके व्यवस्थापक ने अक्षम कर दिया है</translation>
-<translation id="249819058197909513">इस ऐप्लिकेशन के लिए दोबारा चेतावनी न दें</translation>
 <translation id="2498539833203011245">छोटा करें</translation>
 <translation id="2498765460639677199">विशाल</translation>
 <translation id="2499747912851752301">पासवर्ड निर्यात किए जा रहे हैं...</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">शुरू करने के लिए वाई-फ़ाई  से कनेक्ट करें</translation>
 <translation id="2631120081682787498">क्या आप वाकई इस टैब को बंद करना चाहते हैं?</translation>
 <translation id="2631498379019108537">अलमारी में इनपुट विकल्प दिखाएं</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> डिस्क मेमोरी के <ph name="USAGE" /> एमबी का उपयोग कर रहा है.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" निकालें?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> इंस्टॉल नहीं कर सका, लेकिन इसकी डिस्क इमेज से चलना जारी रहेगा.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1076,7 +1076,7 @@
 <translation id="2662876636500006917">Chrome Web Store</translation>
 <translation id="2663302507110284145">भाषा</translation>
 <translation id="2665394472441560184">एक नया शब्द जोड़ें</translation>
-<translation id="2665717534925640469">यह पेज अब पूर्ण स्‍क्रीन है और आपका माउस कर्सर अक्षम कर दिया गया है.</translation>
+<translation id="2665717534925640469">यह पेज अब फ़ुल स्‍क्रीन है और आपका माउस कर्सर बंद कर दिया गया है.</translation>
 <translation id="2665919335226618153">हे भगवान! फ़ॉर्मेटिंग के दौरान गड़बड़ी आई.</translation>
 <translation id="2666990579225592931">मेहमान विंडो खोलें</translation>
 <translation id="2667463864537187133">वर्तनी जाँच प्रबंधित करें</translation>
@@ -1193,7 +1193,7 @@
 <translation id="2828650939514476812">वाई-फ़ाई नेटवर्क से कनेक्‍ट करें</translation>
 <translation id="2836269494620652131">खराबी</translation>
 <translation id="2836635946302913370">आपके व्यवस्थापक द्वारा इस उपयोगकर्ता नाम से प्रवेश करना अक्षम कर दिया गया है.</translation>
-<translation id="283669119850230892">नेटवर्क <ph name="NETWORK_ID" /> का उपयोग करने के लिए, सबसे पहले नीचे इंटरनेट से अपना कनेक्‍शन पूर्ण करें.</translation>
+<translation id="283669119850230892">नेटवर्क <ph name="NETWORK_ID" /> का उपयोग करने के लिए, सबसे पहले नीचे इंटरनेट से अपना कनेक्‍शन पूरा करें.</translation>
 <translation id="2838379631617906747">इंस्‍टॉल कर रहा है</translation>
 <translation id="2841013758207633010">समय</translation>
 <translation id="2841837950101800123">प्रदाता</translation>
@@ -1280,7 +1280,7 @@
 <translation id="2979639724566107830">नई विंडो में खोलें</translation>
 <translation id="2981113813906970160">बड़ा माउस कर्सर दिखाएं</translation>
 <translation id="2982970937345031">अनाम रूप से रिपोर्ट करें</translation>
-<translation id="2986010903908656993">इस पेज को MIDI डिवाइस का पूर्ण नियंत्रण रखने से अवरोधित कर दिया गया है.</translation>
+<translation id="2986010903908656993">इस पेज को MIDI डिवाइस का पूरा नियंत्रण रखने से ब्लॉक कर दिया गया है.</translation>
 <translation id="2989474696604907455">अटैचमेंट नहीं</translation>
 <translation id="2989786307324390836">DER-एन्कोड की गई बाइनरी, एकल प्रमाणपत्र</translation>
 <translation id="2992931425024192067">सभी सूचना सामग्री दिखाएं</translation>
@@ -1326,7 +1326,7 @@
 <translation id="3039491566278747710">डिवाइस पर ऑफ़लाइन नीति इंस्टॉल नहीं की जा सकी.</translation>
 <translation id="3040310857793999281">म्यूट करना टॉगल करें</translation>
 <translation id="3045447014237878114">इस साइट ने कई फ़ाइलें अपने आप डाउनलोड की हैं</translation>
-<translation id="3046910703532196514">वेबपेज, पूर्ण</translation>
+<translation id="3046910703532196514">वेबपेज, पूरा हुआ</translation>
 <translation id="304747341537320566">बोली इंजन</translation>
 <translation id="3047644958362961983">यह जानकारी आपकी Assistant से जुड़ी समस्या को बेहतर तरीके से समझने में हमारी सहायता करती है. इसे 90 दिनों तक स्टोर किया जाता है और इसका एक्सेस उचित इंजीनियर और फ़ीडबैक टीमों तक सीमित होता है.</translation>
 <translation id="3053013834507634016">प्रमाणपत्र कुंजी उपयोग</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">पुनर्स्थापित करें</translation>
 <translation id="3158033540161634471">अपना फ़िंगरप्रिंट सेट अप करें</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (हार्डवेयर समर्थित)</translation>
-<translation id="316125635462764134">ऐप्लिकेशन हटाएं</translation>
 <translation id="3161522574479303604">सभी भाषाएं</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> की ओर से अज्ञात <ph name="PRODUCT_ID" /> उत्पाद</translation>
 <translation id="3165390001037658081">कुछ वाहक इस सुविधा को बंद कर सकते हैं.</translation>
@@ -1452,7 +1451,7 @@
 <translation id="3270965368676314374">अपने कंप्यूटर के फ़ोटो, संगीत और दूसरे मीडिया पढ़ें, बदलें और मिटाएं</translation>
 <translation id="327147043223061465">सभी कुकी और साइट डेटा देखें</translation>
 <translation id="3271648667212143903"><ph name="ORIGIN" /> कनेक्ट करना चाहती है</translation>
-<translation id="3274763671541996799">आप पूर्ण स्‍क्रीन में देख रहे हैं.</translation>
+<translation id="3274763671541996799">आप फ़ुल स्‍क्रीन में देख रहे हैं.</translation>
 <translation id="3275778913554317645">विंडो के रूप में खोलें</translation>
 <translation id="3278001907972365362">आपके Google खाता (खातों) पर ध्यान देना होगा</translation>
 <translation id="3279230909244266691">इस प्रोसेस में कुछ मिनट लग सकते हैं. वर्चुअल मशीन को शुरू किया जा रहा है.</translation>
@@ -1473,7 +1472,7 @@
 <translation id="3298789223962368867">गलत यूआरएल डाला गया.</translation>
 <translation id="32991397311664836">डिवाइस:</translation>
 <translation id="33022249435934718">GDI हैंडल</translation>
-<translation id="3303260552072730022">किसी एक्‍सटेंशन ने पूर्ण स्‍क्रीन ट्रिगर किया है.</translation>
+<translation id="3303260552072730022">किसी एक्‍सटेंशन ने फ़ुल स्‍क्रीन ट्रिगर किया है.</translation>
 <translation id="3303818374450886607">प्रतियां</translation>
 <translation id="3303855915957856445">कोई खोज नतीजे नहीं मिले</translation>
 <translation id="3305389145870741612">स्‍वरूपण प्रक्रिया में कुछ सेकंड लग सकते हैं. कृपया प्रतीक्षा करें.</translation>
@@ -1509,7 +1508,7 @@
 <translation id="3349933790966648062">मेमोरी फ़ुटप्रिंट</translation>
 <translation id="3350117557200012647">दूसरे डिवाइस से जोड़ने के मोड में जाएं</translation>
 <translation id="3355936511340229503">कनेक्शन गड़बड़ी</translation>
-<translation id="3356580349448036450">पूर्ण</translation>
+<translation id="3356580349448036450">पूरा हुआ</translation>
 <translation id="3359256513598016054">प्रमाणपत्र नीति बाध्यताएं</translation>
 <translation id="3360297538363969800">प्रिंट करना पूरा नहीं हो सका. कृपया अपना प्रिंटर जाँचें और फिर से कोशिश करें.</translation>
 <translation id="3365598184818502391">Ctrl या फिर Alt का इस्तेमाल करें</translation>
@@ -1570,7 +1569,7 @@
 <translation id="3449839693241009168">आदेशों को <ph name="EXTENSION_NAME" /> पर भेजने के लिए <ph name="SEARCH_KEY" /> दबाएं</translation>
 <translation id="3450157232394774192">निष्क्रिय स्थिति उपयोग प्रतिशत</translation>
 <translation id="3453612417627951340">अनुमति की ज़रुरत है</translation>
-<translation id="3454157711543303649">सक्रियण पूर्ण</translation>
+<translation id="3454157711543303649">चालू करना पूरा हुआ</translation>
 <translation id="345693547134384690">नए टैब में &amp;छवि खोलें</translation>
 <translation id="3459509316159669723">प्रिंट करना</translation>
 <translation id="3459697287128633276">Google Play स्टोर एक्सेस करने को अपना खाता चालू करने के लिए, कृपया अपनी पहचान देने वाली सेवा के ज़रिए पुष्टि करें.</translation>
@@ -1744,7 +1743,7 @@
 <translation id="3705722231355495246">-</translation>
 <translation id="3706463572498736864">हर शीट पर मौजूद पेज की संख्या</translation>
 <translation id="370665806235115550">लोड हो रही हैं...</translation>
-<translation id="3709244229496787112">डाउनलोड पूर्ण होने से पहले ही ब्राउज़र बंद हो गया था.</translation>
+<translation id="3709244229496787112">डाउनलोड पूरा होने से पहले ही ब्राउज़र बंद हो गया था.</translation>
 <translation id="3711931198657368127">चिपकाएं और <ph name="URL" /> पर जाएं</translation>
 <translation id="3712217561553024354">इस डिवाइस को आपके Google खाते वाले ऐसे दूसरे डिवाइस ढूंढने दें जिनमें मोबाइल डेटा कनेक्शन है</translation>
 <translation id="3712897371525859903">पेज को इस रूप में सेव करें...</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">इस प्रकार की फ़ाइल आपके कंप्‍यूटर को नुकसान पहुंचा सकती है. क्‍या फिर भी आप <ph name="FILE_NAME" /> को रखना चाहते हैं?</translation>
 <translation id="3918972485393593704">Google को जानकारी भेजें</translation>
 <translation id="3919145445993746351">अपने सभी कंप्यूटर पर अपने एक्सटेंशन पाने के लिए, सिंक चालू करें</translation>
+<translation id="391999873395511996">वर्चुअल मशीन डाउनलोड हो रही है.</translation>
 <translation id="3920504717067627103">प्रमाणपत्र नीतियां</translation>
 <translation id="392089482157167418">ChromeVox (कंप्यूटर का बोलकर दिया गया जवाब) चालू करें</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1935,7 +1935,7 @@
 <translation id="3960566196862329469">ONC</translation>
 <translation id="3965965397408324205"><ph name="PROFILE_NAME" /> से बाहर निकलें</translation>
 <translation id="3966072572894326936">कोई अन्य फ़ोल्डर चुनें</translation>
-<translation id="3967822245660637423">डाउनलोड पूर्ण</translation>
+<translation id="3967822245660637423">डाउनलोड पूरा हुआ</translation>
 <translation id="3967919079500697218">स्क्रीनशॉट लेने की क्षमता को आपके व्यवस्थापक द्वारा अक्षम कर दिया गया है.</translation>
 <translation id="3970114302595058915">आईडी</translation>
 <translation id="397105322502079400">गणना की जा रही है...</translation>
@@ -1948,7 +1948,6 @@
 <translation id="3983586614702900908">किसी अज्ञात विक्रेता के डिवाइस</translation>
 <translation id="3984159763196946143">डेमो मोड शुरू नहीं किया जा सका</translation>
 <translation id="3984431586879874039">इस साइट को अपनी सुरक्षा कुंजी देखने देना चाहते हैं?</translation>
-<translation id="3987348946546879621">बचाया गया डेटा</translation>
 <translation id="3987938432087324095">माफ़ करें, यह समझ में नहीं आया.</translation>
 <translation id="3988996860813292272">समय क्षेत्र चुनें</translation>
 <translation id="399179161741278232">आयातित</translation>
@@ -1979,7 +1978,6 @@
 <translation id="4037889604535939429">व्यक्ति की जानकारी बदलें</translation>
 <translation id="4042264909745389898">Google Chrome OS की शर्तें</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{पेज से बाहर निकलें}one{पेज से बाहर निकलें}other{पेज से बाहर निकलें}}</translation>
-<translation id="404299405565920089">ऐप्लिकेशन और वेबसाइटों पर आपके वे सभी खाते प्रबंधित किए जाते हैं जिन पर आपने साइन इन किया हुआ है. जिन ऐप्लिकेशन और वेबसाइटों को मंज़ूरी मिली हुई है, वे उस खाता जानकारी को एक्सेस कर सकते हैं, जो काम को ठीक तरीके से करने के लिए ज़रूरी है.</translation>
 <translation id="4044612648082411741">अपना प्रमाणपत्र पासवर्ड डालें</translation>
 <translation id="404493185430269859">डिफ़ॉल्ट सर्च इंजन</translation>
 <translation id="4046123991198612571">अगला ट्रैक</translation>
@@ -2094,7 +2092,6 @@
 <translation id="4242533952199664413">सेटिंग खोलें</translation>
 <translation id="4242577469625748426">डिवाइस पर नीति सेटिंग इंस्टॉल करने में विफल रहा: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">और ज़्यादा स्टाइलस ऐप ढूंढें</translation>
-<translation id="424546999567421758">ज़्यादा डिस्क उपयोग का पता चला</translation>
 <translation id="424726838611654458">हमेशा Adobe Reader में खोलें</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" /> से सिंक नहीं किया जा सकता</translation>
 <translation id="4249248555939881673">नेटवर्क कनेक्शन के लिए प्रतीक्षारत...</translation>
@@ -2202,7 +2199,6 @@
 <translation id="4421932782753506458">फ्लफ़ी</translation>
 <translation id="4422347585044846479">इस पेज के लिए बुकमार्क में बदलाव करें</translation>
 <translation id="4423376891418188461">सेटिंग फिर से स्थापित करें</translation>
-<translation id="4423482519432579560">&amp;वर्तनीजांच</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, आपके व्यवस्थापक के लिए ज़रूरी है कि आप अपना पासवर्ड बदलें.</translation>
 <translation id="4430019312045809116">मात्रा</translation>
 <translation id="4430369329743628066">बुकमार्क जोड़ा गया</translation>
@@ -2636,7 +2632,7 @@
 <translation id="5139955368427980650">&amp;खोलें</translation>
 <translation id="5142961317498132443">पहचान करना</translation>
 <translation id="5143374789336132547">एक्सटेंशन <ph name="EXTENSION_NAME" /> ने यह बदल दिया है कि जब आप होम बटन क्लिक करते हैं तब कौन सा पेज दिखाया जाए.</translation>
-<translation id="5143712164865402236">पूर्ण स्क्रीन में प्रवेश करें</translation>
+<translation id="5143712164865402236">फ़ुल स्क्रीन में प्रवेश करें</translation>
 <translation id="514575469079499857">जगह तय करने के लिए अपने आईपी पते का इस्तेमाल करें (डिफ़ॉल्ट)</translation>
 <translation id="5150254825601720210">Netscape प्रमाणपत्र SSL सर्वर नाम</translation>
 <translation id="5151354047782775295">डिस्क स्पेस खाली करें अन्यथा चयनित डेटा अपने आप हट जाएगा</translation>
@@ -2662,8 +2658,6 @@
 <translation id="5187295959347858724">आप अब <ph name="SHORT_PRODUCT_NAME" /> में प्रवेश हो गए हैं. आपके बुकमार्क, इतिहास, और अन्‍य सेटिंग आपके Google खाते में समन्‍वयित की जा रही हैं.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> एक से ज़्यादा फ़ाइलें डाउनलोड करना चाहते हैं</translation>
-<translation id="5192316339598592690">तेज़ी से खाते बदलें. साथ ही, ऐप्लिकेशन और वेबसाइटों में एक ही बार में साइन इन करें.
-    ऐप्लिकेशन और साइटें आपके Google खाते की कुछ जानकारी इस्तेमाल करने की अनुमति मांग सकती हैं. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">कृपया डिवाइस को पावरवॉश करें और फिर से कोशिश करें.</translation>
 <translation id="5204967432542742771">पासवर्ड डालें</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" मिटाएं?</translation>
@@ -2696,7 +2690,7 @@
 <translation id="5244474230056479698"><ph name="EMAIL" /> से समन्वयित हो रहा है</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> क्रैश हो गया है. ऐप्‍लिकेशन को रीस्टार्ट करने के लिए इस गुब्‍बारे पर क्‍लिक करें .</translation>
 <translation id="5247051749037287028">दिखाई देने वाला नाम (वैकल्पिक)</translation>
-<translation id="5249624017678798539">डाउनलोड पूर्ण होने से पहले ही ब्राउज़र क्रैश हो गया था.</translation>
+<translation id="5249624017678798539">डाउनलोड पूरा होने से पहले ही ब्राउज़र क्रैश हो गया था.</translation>
 <translation id="5250372599208556903">आपको स्थानीय सामग्री देने के लिए, <ph name="SEARCH_ENGINE_NAME" /> आपके स्थान की जानकारी का इस्तेमाल करता है. आप इसे <ph name="SETTINGS_LINK" /> में बदल सकते हैं.</translation>
 <translation id="5252456968953390977">रोमिंग</translation>
 <translation id="5252653240322147470">पिन <ph name="MAXIMUM" /> से कम अंकों का होना चाहिए</translation>
@@ -3202,7 +3196,7 @@
 <translation id="6016551720757758985">पिछले वर्शन पर वापस लौटने के साथ ही पावरवॉश की पुष्‍टि करें</translation>
 <translation id="6016972670657536680">भाषा और कीबोर्ड बटन चुनें. इस समय चुनी गई भाषा <ph name="LANGUAGE" /> है.</translation>
 <translation id="6020431688553761150">इस संसाधन को एक्सेस करने के लिए सर्वर ने आपको अनुमति नहीं दी.</translation>
-<translation id="6022526133015258832">पूर्ण स्‍क्रीन खोलें</translation>
+<translation id="6022526133015258832">पूरी स्‍क्रीन खोलें</translation>
 <translation id="6022659036123304283">Chrome को अपने मुताबिक बनाएं</translation>
 <translation id="6022705094403139349">अपनी 'सुरक्षा चाबी' जोड़ने के लिए तैयार हैं?</translation>
 <translation id="6023643151125006053">इस डिवाइस (क्रमांक: <ph name="SERIAL_NUMBER" />) को <ph name="SAML_DOMAIN" /> के एडमिन ने लॉक कर दिया था.</translation>
@@ -3320,7 +3314,7 @@
 <translation id="6185132558746749656">डिवाइस स्थान</translation>
 <translation id="6195693561221576702">यह डिवाइस ऑफ़लाइन डेमो मोड में सेट अप नहीं किया जा सकता.</translation>
 <translation id="6196640612572343990">तीसरे पक्ष की कुकी ब्लॉक करें</translation>
-<translation id="6196854373336333322">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह   ऑनलाइन किए जाने वाले कार्यों को बदल सकता है, रोक सकता है या उसे छिप कर सुन सकता है. अगर आप सुनिश्चित नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation>
+<translation id="6196854373336333322">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह   ऑनलाइन किए जाने वाले काम को बदल सकता है, रोक सकता है या उसे छिप कर सुन सकता है. अगर आप सुनिश्चित नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation>
 <translation id="6198102561359457428">साइन आउट करें और फिर से साइन इन करें...</translation>
 <translation id="6198252989419008588">पिन बदलें</translation>
 <translation id="6201792273624501289">Linux ऐप्लिकेशन</translation>
@@ -3342,8 +3336,7 @@
 <translation id="622537739776246443">प्रोफ़ाइल मिटा दी जाएगी</translation>
 <translation id="6225475702458870625">आपके <ph name="PHONE_NAME" /> से डेटा कनेक्शन उपलब्ध है</translation>
 <translation id="6226777517901268232">निजी कुंजी फ़ाइल (वैकल्पिक)</translation>
-<translation id="6228516488918914827">पेज ज़्यादा तेज़ी से लोड हुआ</translation>
-<translation id="6228691855869374890">इस साइट के पास MIDI डिवाइस का पूर्ण नियंत्रण है.</translation>
+<translation id="6228691855869374890">इस साइट के पास MIDI डिवाइस का पूरा नियंत्रण है.</translation>
 <translation id="6229890768313448549">Google Play सेवा की शर्तें लोड नहीं की जा सकतीं. कृपया फिर से कोशिश करें.</translation>
 <translation id="6231881193380278751">पेज को अपने आप रीफ्रेश करने के लिए URL में एक क्‍वेरी पैरामीटर जोड़ें: chrome://device-log/?refresh=&lt;sec&gt;</translation>
 <translation id="6232017090690406397">बैटरी</translation>
@@ -3449,7 +3442,7 @@
 <translation id="6396988158856674517">साइटों को हलचल पकड़ने वाले सेंसर का इस्तेमाल करने से रोकें</translation>
 <translation id="6397094776139756010">सिंक करने और मनमुताबिक बनाने के विकल्प</translation>
 <translation id="6398715114293939307">Google Play स्टोर निकालें</translation>
-<translation id="6398765197997659313">पूर्ण स्क्रीन से बाहर निकलें</translation>
+<translation id="6398765197997659313">फ़ुल स्क्रीन से बाहर निकलें</translation>
 <translation id="6399774419735315745">जासूस</translation>
 <translation id="6404511346730675251">बुकमार्क में बदलाव करें</translation>
 <translation id="6406303162637086258">ब्राउज़र पुनर्प्रारंभ को सिम्युलेट करें</translation>
@@ -3547,7 +3540,6 @@
 <translation id="6545665334409411530">दोहराने की दर</translation>
 <translation id="6545834809683560467">ऐप्लिकेशन चलाने के साधन के खोज बॉक्स या पता में लिखे गए URL और खोजों को पूरा करने में सहायता के लिए पूर्वानुमान सेवा का उपयोग करें</translation>
 <translation id="6545867563032584178">Mac सिस्टम प्राथमिकताओं में माइक्रोफ़ोन बंद किया गया है</translation>
-<translation id="6547316139431024316">इस एक्सटेंशन के लिए फिर से चेतावनी न दें</translation>
 <translation id="6547354035488017500">डिवाइस की मेमोरी से कम से कम 512 एमबी जगह खाली करें. ऐसा न करने पर आपका डिवाइस काम नहीं करेगा. जगह खाली करने के लिए, डिवाइस की मेमोरी से फ़ाइलें मिटाएं.</translation>
 <translation id="6550675742724504774">विकल्प</translation>
 <translation id="6551508934388063976">निर्देश मौजूद नहीं है. नई विंडों खोलने के लिए control-N दबाएं.</translation>
@@ -3611,7 +3603,7 @@
 <translation id="6649563841575838401">संग्रह का फ़ॉर्मेट काम नहीं करता या फ़ाइल में गड़बड़ी है.</translation>
 <translation id="665061930738760572">&amp;नई विंडो में खोलें</translation>
 <translation id="6651237644330755633">वेबसाइटों की पहचान करने के लिए इस प्रमाणपत्र पर विश्वास करें</translation>
-<translation id="665355505818177700">Chrome <ph name="MS_AD_NAME" /> एकीकरण सिर्फ़ x86_64 प्लैटफ़ॉर्म पर काम करता है. किसी ARM या x86 प्लैटफ़ॉर्म पर बने Chromebook इस कार्यक्षमता की सुविधा नहीं देते हैं.</translation>
+<translation id="665355505818177700">Chrome <ph name="MS_AD_NAME" /> एकीकरण सिर्फ़ x86_64 प्लैटफ़ॉर्म पर काम करता है. किसी ARM या x86 प्लैटफ़ॉर्म पर बने Chromebook इस काम की क्षमता की सुविधा नहीं देते हैं.</translation>
 <translation id="6655190889273724601">डेवलपर मोड</translation>
 <translation id="6655458902729017087">खाते छिपाएं</translation>
 <translation id="6657585470893396449">पासवर्ड</translation>
@@ -4009,7 +4001,7 @@
 <translation id="7270858098575133036">जब साइट MIDI डिवाइस को एक्सेस करने के लिए सिस्टम के खास संदेशों का उपयोग करना चाहे, तो इसके लिए पूछें</translation>
 <translation id="7272674038937250585">कोई विवरण नहीं दिया गया है</translation>
 <translation id="7273110280511444812">पिछली बार <ph name="DATE" /> को अनुलग्न किया गया</translation>
-<translation id="727441411541283857"><ph name="PERCENTAGE" />% - पूर्ण होने में <ph name="TIME" /> शेष</translation>
+<translation id="727441411541283857"><ph name="PERCENTAGE" />% - पूरा होने में <ph name="TIME" /> बचा</translation>
 <translation id="727952162645687754">डाउनलोड गड़बड़ी</translation>
 <translation id="7279701417129455881">कुकी अवरोधन प्रबंधित करें...</translation>
 <translation id="7280041992884344566">जिस समय Chrome नुकसान पहुंचाने वाला सॉफ़्टवेयर खोज रहा था, तब कोई गड़बड़ी हुई</translation>
@@ -4052,7 +4044,7 @@
 <translation id="7339763383339757376">PKCS #7, एकल प्रमाणपत्र</translation>
 <translation id="7339785458027436441">लिखते समय वर्तनी की जाँच करें</translation>
 <translation id="7339898014177206373">नई विंडो</translation>
-<translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> अब पूर्ण स्‍क्रीन है.</translation>
+<translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> अब फ़ुल स्‍क्रीन है.</translation>
 <translation id="7340650977506865820">साइट आपकी स्क्रीन शेयर कर रही है</translation>
 <translation id="7341834142292923918">इस साइट का एक्सेस चाहिए</translation>
 <translation id="7345706641791090287">अपने पासवर्ड की पुष्टि करें</translation>
@@ -4086,7 +4078,7 @@
 <translation id="7384292194278095697">यह डिवाइस अब समर्थित नहीं है</translation>
 <translation id="7385854874724088939">प्रिंट करने की कोशिश करते समय कुछ गड़बड़ी हो गई.  कृपया अपना प्रिंटर जाँचें और फिर से कोशिश करें.</translation>
 <translation id="7385896526023870365">इस एक्सटेंशन में कोई भी दूसरा साइट एक्सेस नहीं है.</translation>
-<translation id="7388044238629873883">आप करीब पूर्ण कर चुके हैं!</translation>
+<translation id="7388044238629873883">आप करीब पूरा कर चुके हैं!</translation>
 <translation id="7388222713940428051">मेहमान विंडो खोलें</translation>
 <translation id="7392118418926456391">वायरस स्कैन विफल रहा</translation>
 <translation id="7392915005464253525">बंद की गई विंडो पु&amp;न: खोलें</translation>
@@ -4275,7 +4267,7 @@
 <translation id="7701869757853594372">उपयोगकर्ता हैंडल</translation>
 <translation id="7702574632857388784"><ph name="FILE_NAME" /> को सूची से हटाएं</translation>
 <translation id="7702907602086592255">डोमेन</translation>
-<translation id="7704305437604973648">कार्य</translation>
+<translation id="7704305437604973648">Tasks</translation>
 <translation id="7704317875155739195">खोजों और यूआरएल को अपने आप पूरा करें</translation>
 <translation id="7704521324619958564">Play स्टोर खोलें</translation>
 <translation id="7704628569466676326">अपनी 'सुरक्षा चाबी' को इस डिवाइस से जोड़ें ताकि आप अपने खाते में साइन इन करने के लिए इसका इस्तेमाल कर सकें</translation>
@@ -4668,7 +4660,7 @@
 <translation id="8261378640211443080">यह एक्सटेंशन <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं है और यह आपकी जानकारी के बिना जोड़ा गया हो सकता है.</translation>
 <translation id="8261506727792406068">मिटाएं</translation>
 <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> ने आपका माउस कर्सर अक्षम कर दिया है.</translation>
-<translation id="8264718194193514834">"<ph name="EXTENSION_NAME" />" ने पूर्ण स्क्रीन ट्रिगर की है.</translation>
+<translation id="8264718194193514834">"<ph name="EXTENSION_NAME" />" ने पूरी स्क्रीन ट्रिगर की है.</translation>
 <translation id="8267961145111171918"><ph name="BEGIN_PARAGRAPH1" />यह इस डिवाइस और इसके इस्तेमाल के तरीके के बारे में सामान्य जानकारी है (जैसे कि बैटरी लेवल, सिस्टम और ऐप्लिकेशन गतिविधि और गड़बड़ियां). इस डेटा का इस्तेमाल Android को बेहतर बनाने के लिए किया जाएगा. इकट्ठी की गई कुछ जानकारी से Google ऐप्लिकेशन और 'Android डेवलपर' जैसे पार्टनर को भी मदद मिलेगी और वे अपने ऐप्लिकेशन और उत्पादों को बेहतर बना सकेंगे.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />इस सुविधा को बंद करने के बाद भी यह डिवाइस, सिस्टम अपडेट और सुरक्षा जैसी ज़रूरी सेवाएं पाने के लिए जानकारी भेज सकेगा.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />सेटिंग &gt; बेहतर &gt; Google को निदान और इस्तेमाल का डेटा अपने आप भेजें पर जाकर मालिक इस सुविधा को नियंत्रित कर सकता है.<ph name="END_PARAGRAPH3" />
@@ -4677,7 +4669,6 @@
 <translation id="827097179112817503">होम बटन दिखाएं</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 बुकमार्क हटाया गया}one{# बुकमार्क हटाए गए}other{# बुकमार्क हटाए गए}}</translation>
 <translation id="8272443605911821513">मेन्यू में "ज़्यादा टूल" एक्सटेंशन पर क्लिक करके अपने एक्सटेंशन प्रबंधित करें.</translation>
-<translation id="8272966760965438857">अपने Google खातों को एक ही जगह से प्रबंधित करें</translation>
 <translation id="8274332263553132018">फ़ाइल कास्ट करें</translation>
 <translation id="8274924778568117936">अपडेट पूरा होने तक अपना <ph name="DEVICE_TYPE" /> बंद न करें. इंस्टॉल हो जाने के बाद आपका <ph name="DEVICE_TYPE" /> रीस्टार्ट होगा.</translation>
 <translation id="8275038454117074363">आयात करें</translation>
@@ -4711,7 +4702,7 @@
 <translation id="833986336429795709">यह लिंक खोलने के लिए कोई ऐप्लिकेशन चुनें</translation>
 <translation id="8342861492835240085">कोई संग्रह चुनें</translation>
 <translation id="8343956361364550006">सबसे बढ़िया वीडियो या ऐनिमेशन के लिए उच्च बैंडविड्थ का इस्तेमाल करें. हो सकता है कि धीमे कनेक्शन वाले अन्य लोगों को आपकी सामग्री दिखाई न दे.</translation>
-<translation id="8351419472474436977">इस एक्सटेंशन ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह   ऑनलाइन किए जाने वाले कार्यों को बदल सकता है, खंडित कर सकता है या उसे छिप कर सुन सकता है. अगर आप सुनिश्चित नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation>
+<translation id="8351419472474436977">इस एक्सटेंशन ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह   ऑनलाइन किए जाने वाले काम को बदल सकता है, खंडित कर सकता है या उसे छिप कर सुन सकता है. अगर आप सुनिश्चित नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation>
 <translation id="835238322900896202">अनइंस्टॉल करते समय एक गड़बड़ी हुई. कृपया 'टर्मिनल' के ज़रिए अनइंस्टॉल करें.</translation>
 <translation id="8352772353338965963">एक से ज़्यादा साइन-इन के लिए कोई खाता जोड़ें. सभी साइन इन किए गए खातों को पासवर्ड के बिना एक्सेस किया जा सकता है, इसलिए इस सुविधा का इस्तेमाल सिर्फ़ विश्वसनीय खातों के साथ किया जाना चाहिए.</translation>
 <translation id="8353683614194668312">यह निम्न कर सकता है:</translation>
@@ -4815,7 +4806,7 @@
 <translation id="8523493869875972733">बदलावों को बनाए रखें</translation>
 <translation id="8523849605371521713">पॉलिसी द्वारा जोड़ा गया</translation>
 <translation id="8524783101666974011">अपने Google खाते में कार्ड सेव करें</translation>
-<translation id="8525306231823319788">पूर्ण स्‍क्रीन</translation>
+<translation id="8525306231823319788">फ़ुल स्‍क्रीन</translation>
 <translation id="8528074251912154910">भाषाएं जोड़ें</translation>
 <translation id="8528962588711550376">प्रवेश कर रहा है.</translation>
 <translation id="8529925957403338845">इंस्टैंट टेदरिंग कनेक्शन नहीं किया जा सका</translation>
@@ -4908,7 +4899,7 @@
 <translation id="8665180165765946056">बैकअप पूरा हुआ</translation>
 <translation id="866611985033792019">ईमेल उपयोगकर्ताओं की पहचान करने के लिए इस प्रमाणपत्र पर विश्वास करें</translation>
 <translation id="8666584013686199826">जब कोई साइट यूएसबी डिवाइस एक्सेस करना चाहे, तो इसके लिए पूछें</translation>
-<translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> अब पूर्ण स्‍क्रीन है और आपका माउस कर्सर अक्षम कर दिया गया है.</translation>
+<translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> अब फ़ुल स्‍क्रीन है और आपका माउस कर्सर बंद कर दिया गया है.</translation>
 <translation id="8669284339312441707">वॉर्मर</translation>
 <translation id="867085395664725367">सर्वर में कुछ समय के लिए गड़बड़ी हुई.</translation>
 <translation id="8673026256276578048">वेब पर खोजें...</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index dec34f6..5069d27 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -338,6 +338,7 @@
     proxy poslužitelj, prilagodite svoje <ph name="LINK_START" />postavke proxy poslužitelja<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">To možete poništiti jedino tako da ponovo instalirate <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Uvezeno iz preglednika Safari</translation>
+<translation id="1515163294334130951">Pokreni</translation>
 <translation id="1521442365706402292">Upravljanje potvrdama</translation>
 <translation id="152234381334907219">Nikad spremljeno</translation>
 <translation id="1524430321211440688">Tipkovnica</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Najglasnije</translation>
 <translation id="1673137583248014546"><ph name="URL" /> želi vidjeti marku i model vašeg sigurnosnog ključa</translation>
 <translation id="1679068421605151609">Alati za razvojne programere</translation>
+<translation id="1679806121152819234">Dodatak VM</translation>
 <translation id="167983332380191032">Usluga upravljanja poslala je HTTP pogrešku.</translation>
 <translation id="1680849702532889074">Došlo je do pogreške tijekom instalacije Linux aplikacije.</translation>
 <translation id="16815041330799488">Ne dopuštaj web-lokacijama uvid u tekst i slike kopirane u međuspremnik</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Uređaj nije moguće pridružiti domeni. Provjerite jeste li premašili broj uređaja koji možete dodati.</translation>
 <translation id="1744108098763830590">pozadinska stranica</translation>
 <translation id="1745520510852184940">Učini to uvijek</translation>
+<translation id="1746402432151920942">Identifikator zaštićenog medija</translation>
 <translation id="175196451752279553">P&amp;onovo otvori zatvorenu karticu</translation>
 <translation id="1753905327828125965">Najposjećenije</translation>
 <translation id="1756681705074952506">Način unosa</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Nije prijavljen</translation>
 <translation id="1832511806131704864">Promjena telefona ažurirana je</translation>
 <translation id="1834503245783133039">Preuzimanje nije uspjelo: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">MIDI uređaji</translation>
 <translation id="1838374766361614909">Brisanje pretraživanja</translation>
 <translation id="1841545962859478868">Administrator uređaja može nadzirati sljedeće:</translation>
 <translation id="1841616161104323629">Zapis uređaja nije prisutan.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Prijavite poteškoću</translation>
 <translation id="2220572644011485463">PIN ili zaporka</translation>
 <translation id="2224444042887712269">Ova postavka pripada korisniku <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Događaji Pristupačnosti</translation>
 <translation id="2224551243087462610">Uredi naziv mape</translation>
 <translation id="2226449515541314767">Za tu je web-lokaciju blokiran potpuni nadzor nad MIDI uređajima.</translation>
 <translation id="2226720438730111184">Recite nam što se događa</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Povijest pregledavanja</translation>
 <translation id="2497229222757901769">Brzina miša</translation>
 <translation id="2497852260688568942">Administrator je onemogućio sinkronizaciju</translation>
-<translation id="249819058197909513">Ne upozoravaj više u vezi s ovom aplikacijom</translation>
 <translation id="2498539833203011245">Minimiziraj</translation>
 <translation id="2498765460639677199">Ogroman</translation>
 <translation id="2499747912851752301">Izvoz zaporki...</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Povežite se s Wi-Fijem da biste počeli</translation>
 <translation id="2631120081682787498">Jeste li sigurni da želite zatvoriti tu karticu?</translation>
 <translation id="2631498379019108537">Prikaži opcije unosa na polici</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> upotrebljava <ph name="USAGE" /> MB prostora na disku.</translation>
 <translation id="2633212996805280240">Ukloniti uslugu "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101">Program <ph name="PRODUCT_NAME" /> nije uspio dovršiti instalaciju, ali nastavit će rad iz diskovne slike.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Vrati</translation>
 <translation id="3158033540161634471">Postavljanje otiska prsta</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (s hardverskom podlogom)</translation>
-<translation id="316125635462764134">Ukloni aplikaciju</translation>
 <translation id="3161522574479303604">Svi jezici</translation>
 <translation id="3163201441334626963">Nepoznati proizvod <ph name="PRODUCT_ID" /> dobavljača <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Neki mobilni operateri mogu blokirati tu značajku.</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">Ova vrsta datoteke može oštetiti vaše računalo. Želite li ipak zadržati datoteku <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Prijavi pojedinosti Googleu</translation>
 <translation id="3919145445993746351">Da biste imali svoja proširenja na svim svojim računalima, uključite sinkronizaciju</translation>
+<translation id="391999873395511996">Preuzimanje virtualnog računala.</translation>
 <translation id="3920504717067627103">Pravila certifikata</translation>
 <translation id="392089482157167418">Omogući ChromeVox (govorne povratne informacije)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">uređaji nepoznatog dobavljača</translation>
 <translation id="3984159763196946143">Pokretanje demo-načina nije uspjelo</translation>
 <translation id="3984431586879874039">Želite li dopustiti web-lokaciji prikaz vašeg sigurnosnog ključa?</translation>
-<translation id="3987348946546879621">Spremljeni podaci</translation>
 <translation id="3987938432087324095">Žao mi je, ne razumijem.</translation>
 <translation id="3988996860813292272">Odaberite vremensku zonu</translation>
 <translation id="399179161741278232">Uvezeno</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">Uređivanje osobe</translation>
 <translation id="4042264909745389898">Uvjeti za OS Google Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Zatvori stranicu}one{Zatvori stranicu}few{Zatvori stranice}other{Zatvori stranica}}</translation>
-<translation id="404299405565920089">Ovdje možete upravljati svim Google računima kojima ste prijavljeni na aplikacije i web-lokacije. Aplikacije i web-lokacije koje imaju vaše dopuštenje mogu pristupiti podacima o računu koji su im potrebni za pravilan rad.</translation>
 <translation id="4044612648082411741">Unesite zaporku za certifikat</translation>
 <translation id="404493185430269859">Zadana tražilica</translation>
 <translation id="4046123991198612571">Sljedeća pjesma</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">Otvori postavke</translation>
 <translation id="4242577469625748426">Instalacija postavki pravila nije uspjela na uređaju: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Pronađite više aplikacija pisaljke</translation>
-<translation id="424546999567421758">Otkrivena je intenzivna upotreba diska</translation>
 <translation id="424726838611654458">Uvijek otvaraj u Adobe Readeru</translation>
 <translation id="4247901771970415646">Nije moguće sinkronizirati s korisničkim imenom <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Čekanje mrežne veze...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">Pahuljica</translation>
 <translation id="4422347585044846479">Uredi oznaku za ovu stranicu</translation>
 <translation id="4423376891418188461">Vrati postavke</translation>
-<translation id="4423482519432579560">&amp;Provjera pravopisa</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, vaš administrator traži da promijenite zaporku.</translation>
 <translation id="4430019312045809116">Glasnoća</translation>
 <translation id="4430369329743628066">Oznaka je dodana</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">Sada ste prijavljeni na uslugu <ph name="SHORT_PRODUCT_NAME" />. Vaše oznake, povijest i druge postavke sinkroniziraju se s vašim Google računom.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> želi preuzeti više datoteka</translation>
-<translation id="5192316339598592690">Brzo se prebacujte između računa i prijavljujte u aplikacije i na web-lokacije u jednom koraku.
-    Aplikacije i web-lokacije mogu vas tražiti dopuštenje za upotrebu nekih podataka s vašeg Google računa. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Izvršite powerwash uređaja i pokušajte ponovo.</translation>
 <translation id="5204967432542742771">Unesite zaporku</translation>
 <translation id="5206215183583316675">Želite li izbrisati "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3343,7 +3340,6 @@
 <translation id="622537739776246443">Profil će se izbrisati</translation>
 <translation id="6225475702458870625">Dostupna je podatkovna veza s vašeg telefona <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Datoteka privatnog ključa (neobavezno)</translation>
-<translation id="6228516488918914827">Stranica se učitala brže</translation>
 <translation id="6228691855869374890">Ta web-lokacija ima potpuni nadzor nad MIDI uređajima.</translation>
 <translation id="6229890768313448549">Učitavanje Uvjeta pružanja usluge Google Playa nije uspjelo. Pokušajte ponovo.</translation>
 <translation id="6231881193380278751">Dodajte parametar upita u URL da biste automatski osvježili stranicu: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3544,6 @@
 <translation id="6545665334409411530">Stopa ponavljanja</translation>
 <translation id="6545834809683560467">Upotrijebi uslugu predviđanja za dovršavanje pretraživanja i URL-ova upisanih u adresnu traku ili okvir za pretraživanje pokretača aplikacija</translation>
 <translation id="6545867563032584178">Mikrofon je isključen u Postavkama sustava na Macu</translation>
-<translation id="6547316139431024316">Ne upozoravaj više u vezi s ovim proširenjem</translation>
 <translation id="6547354035488017500">Oslobodite najmanje 512 MB prostora ili će uređaj prestati reagirati. Da biste oslobodili prostor, izbrišite datoteke iz pohrane uređaja.</translation>
 <translation id="6550675742724504774">Opcije</translation>
 <translation id="6551508934388063976">Naredba nije dostupna. Pritisnite tipke Ctrl – N za otvaranje novog prozora.</translation>
@@ -4679,7 +4674,6 @@
 <translation id="827097179112817503">Prikaži gumb početne stranice</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Izbrisana je 1 oznaka}one{Izbrisana je # oznaka}few{Izbrisane su # oznake}other{Izbrisano je # oznaka}}</translation>
 <translation id="8272443605911821513">Upravljajte proširenjima klikom na Proširenja u izborniku "Više alata".</translation>
-<translation id="8272966760965438857">Upravljajte svojim Google računima na jednom mjestu</translation>
 <translation id="8274332263553132018">Emitiraj datoteku</translation>
 <translation id="8274924778568117936">Ne isključujte i ne zatvarajte uređaj <ph name="DEVICE_TYPE" /> dok ažuriranje ne završi. Uređaj <ph name="DEVICE_TYPE" /> ponovo će se pokrenuti kada instaliranje završi.</translation>
 <translation id="8275038454117074363">Uvezi</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index afe412a..5be81be2 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -338,6 +338,7 @@
     módosítsa a <ph name="LINK_START" />proxybeállításokat<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">A visszavonás egyetlen módja a(z) <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> újratelepítése.</translation>
 <translation id="151501797353681931">A Safariból importálva</translation>
+<translation id="1515163294334130951">Indítás</translation>
 <translation id="1521442365706402292">Tanúsítványok beállítása</translation>
 <translation id="152234381334907219">Soha nem került mentésre</translation>
 <translation id="1524430321211440688">Billentyűzet</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Leghangosabb</translation>
 <translation id="1673137583248014546">A(z) <ph name="URL" /> szeretné látni a biztonsági kulcs márkáját és típusát</translation>
 <translation id="1679068421605151609">Fejlesztői eszközök</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">A kezelési szolgáltatás HTTP-hibát küldött</translation>
 <translation id="1680849702532889074">Hiba történt a Linux-alkalmazás telepítése során.</translation>
 <translation id="16815041330799488">Annak tiltása a webhelyek számára, hogy lássák a vágólapra másolt szövegeket és képeket</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Böngészés előzményei</translation>
 <translation id="2497229222757901769">Egér sebessége</translation>
 <translation id="2497852260688568942">A szinkronizálást letiltotta a rendszergazda</translation>
-<translation id="249819058197909513">Nem kérek többé figyelmeztetést ennél az alkalmazásnál</translation>
 <translation id="2498539833203011245">Kis méret</translation>
 <translation id="2498765460639677199">Óriási</translation>
 <translation id="2499747912851752301">Jelszavak exportálása…</translation>
@@ -1052,7 +1053,6 @@
 <translation id="2630681426381349926">A folytatáshoz csatlakozzon egy Wi-Fi hálózathoz</translation>
 <translation id="2631120081682787498">Biztosan bezárja ezt a lapot?</translation>
 <translation id="2631498379019108537">Beviteli lehetőségek megjelenítése a polcon</translation>
-<translation id="2633199387167390344">A(z) <ph name="NAME" /> <ph name="USAGE" /> MB lemezterületet használ.</translation>
 <translation id="2633212996805280240">Eltávolítja a következőt: "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101">A(z) <ph name="PRODUCT_NAME" /> nem tudta befejezni a telepítést, de tovább fut a lemezképéről.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1398,7 +1398,6 @@
 <translation id="3157931365184549694">Visszaállítás</translation>
 <translation id="3158033540161634471">Az ujjlenyomat beállítása</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardverrel támogatott)</translation>
-<translation id="316125635462764134">Az alkalmazás eltávolítása</translation>
 <translation id="3161522574479303604">Minden nyelv</translation>
 <translation id="3163201441334626963">Ismeretlen termék (<ph name="PRODUCT_ID" />) a következő forgalmazótól: <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Egyes szolgáltatók letilthatják ezt a funkciót.</translation>
@@ -1899,6 +1898,7 @@
 <translation id="3916445069167113093">Az ilyen fájlok kárt okozhatnak számítógépében. Ennek ellenére is szeretné megtartani a(z) <ph name="FILE_NAME" /> fájlt?</translation>
 <translation id="3918972485393593704">Részletek jelentése a Google-nak</translation>
 <translation id="3919145445993746351">Ha az összes számítógépén szeretné elérni bővítményeit, kapcsolja be a szinkronizálást.</translation>
+<translation id="391999873395511996">A virtuális gép letöltése…</translation>
 <translation id="3920504717067627103">Tanúsítvány-irányelvek</translation>
 <translation id="392089482157167418">A ChromeVox (beszélt visszajelzés) engedélyezése</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">ismeretlen szolgáltatótól származó eszközök</translation>
 <translation id="3984159763196946143">Nem sikerült elindítani a demó módot</translation>
 <translation id="3984431586879874039">Engedélyezi a webhelynek, hogy lássa a biztonsági hardverkulcsot?</translation>
-<translation id="3987348946546879621">Megspórolt adatforgalom</translation>
 <translation id="3987938432087324095">Elnézést, de nem értettem.</translation>
 <translation id="3988996860813292272">Időzóna kiválasztásaƒƒ</translation>
 <translation id="399179161741278232">Importált</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Személy adatainak szerkesztése</translation>
 <translation id="4042264909745389898">Google Chrome OS – Szerződési Feltételek</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Oldal elhagyása}other{Oldalak elhagyása}}</translation>
-<translation id="404299405565920089">Itt kezelheti az alkalmazásokba és webhelyekre bejelentkezett összes Google-fiókját. Az engedélyével rendelkező alkalmazások és webhelyek hozzáférhetnek a megfelelő működésükhöz szükséges fiókadatokhoz.</translation>
 <translation id="4044612648082411741">A tanúsítvány jelszavának megadása</translation>
 <translation id="404493185430269859">Alapértelmezett keresőmotor</translation>
 <translation id="4046123991198612571">Következő szám</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Beállítások megnyitása</translation>
 <translation id="4242577469625748426">Az irányelv-beállítások telepítése az eszközre sikertelen: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">További érintőceruza-alkalmazások keresése</translation>
-<translation id="424546999567421758">Magas lemezfelhasználás észlelve</translation>
 <translation id="424726838611654458">Megnyitás mindig az Adobe Readerben</translation>
 <translation id="4247901771970415646">Nem lehet vele szinkronizálni: <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Várakozás a hálózati kapcsolatra...</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Bolyhos</translation>
 <translation id="4422347585044846479">Könyvjelző szerkesztése ehhez az oldalhoz</translation>
 <translation id="4423376891418188461">A beállítások visszaállítása</translation>
-<translation id="4423482519432579560">&amp;Helyesírás-ellenőrzés</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, az Ön rendszergazdája jelszómódosításra kéri.</translation>
 <translation id="4430019312045809116">Hangerő</translation>
 <translation id="4430369329743628066">Könyvjelző hozzáadva</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Bejelentkezett a <ph name="SHORT_PRODUCT_NAME" /> szolgáltatásba. A rendszer most szinkronizálja a könyvjelzőket, előzményeket és egyéb beállításokat Google Fiókjával.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">A(z) <ph name="ORIGIN" /> több fájlt szeretne letölteni</translation>
-<translation id="5192316339598592690">Gyorsan válthat a fiókok között, és egyszerre bejelentkezhet alkalmazásokba és webhelyeken.
-    Az alkalmazások és webhelyek bizonyos Google-fiókadatainak használatára kérhetnek engedélyt. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation>
 <translation id="5204673965307125349">Hajtson végre powerwash műveletet az eszközön, majd próbálja újra.</translation>
 <translation id="5204967432542742771">Írja be a jelszót</translation>
 <translation id="5206215183583316675">Törli a következőt: „<ph name="CERTIFICATE_NAME" />”?</translation>
@@ -3345,7 +3339,6 @@
 <translation id="622537739776246443">A profil törölve lesz</translation>
 <translation id="6225475702458870625">Rendelkezésre áll adatkapcsolat <ph name="PHONE_NAME" /> eszközéről</translation>
 <translation id="6226777517901268232">Privátkulcs-fájl (nem kötelező)</translation>
-<translation id="6228516488918914827">Gyorsabb oldal betöltve</translation>
 <translation id="6228691855869374890">Ez a webhely teljes hozzáféréssel rendelkezik a MIDI-eszközökhöz.</translation>
 <translation id="6229890768313448549">A Google Play Általános Szerződési Feltételeit nem sikerült betölteni. Próbálja újra.</translation>
 <translation id="6231881193380278751">Adjon meg egy lekérdezési paramétert az URL-ben az oldal automatikus frissítéséhez: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3550,7 +3543,6 @@
 <translation id="6545665334409411530">Ismétlési sebesség</translation>
 <translation id="6545834809683560467">A várható kifejezés szolgáltatás használata a keresések és URL-címek kiegészítésére a címsávban, illetve az alkalmazásindító keresőmezőjében</translation>
 <translation id="6545867563032584178">A mikrofon ki van kapcsolva a Mac Rendszerbeállításokban</translation>
-<translation id="6547316139431024316">Nem kérek többé figyelmeztetést ennél a bővítménynél</translation>
 <translation id="6547354035488017500">Szabadítson fel legalább 512 MB tárhelyet, máskülönben eszköze lefagy. Tárhely felszabadításához töröljön fájlokat az eszköz tárhelyéről.</translation>
 <translation id="6550675742724504774">Beállítások</translation>
 <translation id="6551508934388063976">A parancs nem érhető el. Új ablak megnyitásához nyomja meg a Ctrl+N billentyűkódot.</translation>
@@ -4681,7 +4673,6 @@
 <translation id="827097179112817503">A „kezdőoldal” gomb megjelenítése</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 könyvjelző törölve}other{# könyvjelző törölve}}</translation>
 <translation id="8272443605911821513">Bővítményeit a „További eszközök” menü Bővítmények elemére kattintva kezelheti.</translation>
-<translation id="8272966760965438857">Egyetlen helyen kezelheti Google-fiókjait</translation>
 <translation id="8274332263553132018">Fájl átküldése</translation>
 <translation id="8274924778568117936">A frissítés befejezéséig ne kapcsolja ki vagy csukja le <ph name="DEVICE_TYPE" /> eszközét. <ph name="DEVICE_TYPE" /> eszköze a telepítést követően újraindul.</translation>
 <translation id="8275038454117074363">Importálás</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index fc187714..3c55032 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -338,6 +338,7 @@
     server proxy, sesuaikan <ph name="LINK_START" />setelan proxy<ph name="LINK_END" /> Anda.</translation>
 <translation id="1512210426710821809">Satu-satunya cara untuk mengurungkan tindakan ini adalah dengan menginstal ulang <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Diimpor Dari Safari</translation>
+<translation id="1515163294334130951">Luncurkan</translation>
 <translation id="1521442365706402292">Kelola sertifikat</translation>
 <translation id="152234381334907219">Jangan Pernah Disimpan</translation>
 <translation id="1524430321211440688">Keyboard</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Paling keras</translation>
 <translation id="1673137583248014546"><ph name="URL" /> ingin melihat merek dan model Kunci Keamanan Anda</translation>
 <translation id="1679068421605151609">Developer Tools</translation>
+<translation id="1679806121152819234">VM Plugin</translation>
 <translation id="167983332380191032">Layanan pengelolaan mengirim error HTTP.</translation>
 <translation id="1680849702532889074">Terjadi error saat menginstal aplikasi Linux.</translation>
 <translation id="16815041330799488">Jangan izinkan situs melihat teks dan gambar yang disalin ke papan klip</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Tidak dapat menggabungkan perangkat ke domain. Pastikan Anda tidak melampaui jumlah perangkat yang dapat ditambahkan.</translation>
 <translation id="1744108098763830590">halaman background</translation>
 <translation id="1745520510852184940">Selalu Lakukan Tindakan Ini</translation>
+<translation id="1746402432151920942">ID Media yang Dilindungi</translation>
 <translation id="175196451752279553">Buka k&amp;embali tab yang tertutup</translation>
 <translation id="1753905327828125965">Sering Dibuka</translation>
 <translation id="1756681705074952506">Metode masukan</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Belum masuk</translation>
 <translation id="1832511806131704864">Perubahan ponsel diperbarui</translation>
 <translation id="1834503245783133039">Download tidak berhasil: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Perangkat MIDI</translation>
 <translation id="1838374766361614909">Hapus penelusuran</translation>
 <translation id="1841545962859478868">Admin perangkat dapat memantau hal-hal berikut:</translation>
 <translation id="1841616161104323629">Data perangkat hilang.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Laporkan masalah</translation>
 <translation id="2220572644011485463">PIN atau sandi</translation>
 <translation id="2224444042887712269">Setelan ini adalah milik <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Peristiwa Aksesibilitas</translation>
 <translation id="2224551243087462610">Edit nama folder</translation>
 <translation id="2226449515541314767">Situs ini diblokir agar tidak memiliki kontrol penuh atas perangkat MIDI.</translation>
 <translation id="2226720438730111184">Beri Tahu Kami Apa Yang Terjadi</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Histori penjelajahan</translation>
 <translation id="2497229222757901769">Kecepatan mouse</translation>
 <translation id="2497852260688568942">Sinkronisasi dinonaktifkan oleh administrator</translation>
-<translation id="249819058197909513">Jangan peringatkan lagi untuk aplikasi ini</translation>
 <translation id="2498539833203011245">Perkecil</translation>
 <translation id="2498765460639677199">Raksasa</translation>
 <translation id="2499747912851752301">Mengekspor sandi...</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Sambungkan ke Wi-Fi untuk memulai</translation>
 <translation id="2631120081682787498">Yakin ingin menutup tab ini?</translation>
 <translation id="2631498379019108537">Tampilkan opsi masukan di rak</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> menggunakan <ph name="USAGE" /> MB ruang disk.</translation>
 <translation id="2633212996805280240">Hapus "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> tidak dapat menyelesaikan pemasangan, tetapi akan terus dijalankan dari citra diskanya.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1395,7 +1398,6 @@
 <translation id="3157931365184549694">Pulihkan</translation>
 <translation id="3158033540161634471">Siapkan sidik jari Anda</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (dilindungi hardware)</translation>
-<translation id="316125635462764134">Buang aplikasi</translation>
 <translation id="3161522574479303604">Semua bahasa</translation>
 <translation id="3163201441334626963">Produk <ph name="PRODUCT_ID" /> tak dikenal dari vendor <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Beberapa operator mungkin memblokir fitur ini.</translation>
@@ -1711,7 +1713,7 @@
 <translation id="3664511988987167893">Ikon Ekstensi</translation>
 <translation id="3665589677786828986">Chrome mendeteksi bahwa beberapa setelan Anda dirusak oleh program lain dan menyetelnya ulang ke setelan default aslinya.</translation>
 <translation id="3668570675727296296">Setelan bahasa</translation>
-<translation id="366867565525278777">Gagal menginstal karena ruang penyimpanan tidak cukup. Diperlukan ruang kosong minimal <ph name="INSTALL_SIZE" />. Untuk mengosongkan ruang, hapus file dari penyimpanan perangkat.</translation>
+<translation id="366867565525278777">Gagal menginstal karena ruang penyimpanan tidak cukup. Diperlukan ruang kosong minimal sebesar <ph name="INSTALL_SIZE" />. Untuk mengosongkan ruang, hapus file dari penyimpanan perangkat.</translation>
 <translation id="3668801437375206837">Untuk mendiagnosis masalah Bluetooth dengan lebih baik, Googler dapat menyertakan log Bluetooth tambahan dengan laporan umpannya. Jika opsi ini dicentang, laporan Anda akan menyertakan log HCI dan btsnoop dari sesi Anda saat ini, yang dihapus untuk membuang PII sebanyak mungkin. Akses ke log ini akan dibatasi pada pengelola grup produk Chrome OS di Listnr. Log akan dihapus setelah 90 hari.</translation>
 <translation id="3668823961463113931">Penangan</translation>
 <translation id="3670113805793654926">Perangkat dari semua vendor</translation>
@@ -1896,6 +1898,7 @@
 <translation id="3916445069167113093">Jenis file ini dapat membahayakan komputer Anda. Apakah Anda ingin tetap menyimpan <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Laporkan detail ke Google</translation>
 <translation id="3919145445993746351">Untuk dapat mengakses ekstensi Anda di semua komputer, aktifkan sinkronisasi</translation>
+<translation id="391999873395511996">Mendownload mesin virtual.</translation>
 <translation id="3920504717067627103">Kebijakan Sertifikat</translation>
 <translation id="392089482157167418">Aktifkan ChromeVox (masukan lisan)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1947,7 +1950,6 @@
 <translation id="3983586614702900908">perangkat dari vendor tak dikenal</translation>
 <translation id="3984159763196946143">Tidak dapat memulai mode demo</translation>
 <translation id="3984431586879874039">Izinkan situs ini melihat kunci keamanan Anda?</translation>
-<translation id="3987348946546879621">Lebih hemat kuota</translation>
 <translation id="3987938432087324095">Maaf, kurang jelas.</translation>
 <translation id="3988996860813292272">Pilih zona waktu</translation>
 <translation id="399179161741278232">Diimpor</translation>
@@ -1978,7 +1980,6 @@
 <translation id="4037889604535939429">Edit orang</translation>
 <translation id="4042264909745389898">Persyaratan Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Keluar dari Halaman}other{Keluar dari Halaman}}</translation>
-<translation id="404299405565920089">Semua Akun Google Anda yang digunakan untuk login dari aplikasi dan situs dapat dikelola di sini. Aplikasi dan situs yang Anda izinkan dapat mengakses informasi akun yang dibutuhkan untuk berfungsi sebagaimana mestinya.</translation>
 <translation id="4044612648082411741">Memasukkan sandi sertifikat</translation>
 <translation id="404493185430269859">Mesin telusur default</translation>
 <translation id="4046123991198612571">Lagu berikutnya</translation>
@@ -2093,7 +2094,6 @@
 <translation id="4242533952199664413">Buka setelan</translation>
 <translation id="4242577469625748426">Gagal memasang setelan kebijakan di perangkat: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Temukan aplikasi stilus lainnya</translation>
-<translation id="424546999567421758">Penggunaan disk tinggi terdeteksi</translation>
 <translation id="424726838611654458">Selalu buka di Adobe Reader</translation>
 <translation id="4247901771970415646">Tidak dapat disinkronkan ke <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Menunggu sambungan jaringan...</translation>
@@ -2201,7 +2201,6 @@
 <translation id="4421932782753506458">Si Manis</translation>
 <translation id="4422347585044846479">Edit bookmark untuk halaman ini</translation>
 <translation id="4423376891418188461">Pulihkan Setelan</translation>
-<translation id="4423482519432579560">&amp;Pemeriksaan Ejaan</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, administrator mewajibkan Anda untuk mengganti sandi.</translation>
 <translation id="4430019312045809116">Volume</translation>
 <translation id="4430369329743628066">Bookmark ditambahkan</translation>
@@ -2661,8 +2660,6 @@
 <translation id="5187295959347858724">Sekarang Anda masuk pada <ph name="SHORT_PRODUCT_NAME" />. Bookmark, histori, dan setelan lainnya sedang disinkronkan ke Akun Google Anda.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ingin mendownload beberapa file</translation>
-<translation id="5192316339598592690">Lakukan peralihan akun dengan cepat dan login ke aplikasi dan situs sekaligus.
-    Aplikasi dan situs dapat meminta izin Anda untuk menggunakan sebagian info Akun Google Anda. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Harap powerwash perangkat, lalu coba lagi.</translation>
 <translation id="5204967432542742771">Masukkan sandi</translation>
 <translation id="5206215183583316675">Hapus "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3341,7 +3338,6 @@
 <translation id="622537739776246443">Profil akan dihapus</translation>
 <translation id="6225475702458870625">Koneksi data tersedia dari <ph name="PHONE_NAME" /> Anda</translation>
 <translation id="6226777517901268232">File kunci pribadi (opsional)</translation>
-<translation id="6228516488918914827">Halaman dimuat lebih cepat</translation>
 <translation id="6228691855869374890">Situs ini memiliki kontrol penuh atas perangkat MIDI.</translation>
 <translation id="6229890768313448549">Persyaratan Layanan Google Play tidak dapat dimuat. Coba lagi.</translation>
 <translation id="6231881193380278751">Tambahkan parameter kueri di URL untuk menyegarkan halaman secara otomatis: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3546,7 +3542,6 @@
 <translation id="6545665334409411530">Tingkat pengulangan</translation>
 <translation id="6545834809683560467">Gunakan layanan prediksi untuk membantu melengkapi penelusuran dan URL yang diketik di kolom URL atau kotak penelusuran peluncur aplikasi</translation>
 <translation id="6545867563032584178">Mikrofon dinonaktifkan di Preferensi Sistem Mac</translation>
-<translation id="6547316139431024316">Jangan peringatkan lagi untuk ekstensi ini</translation>
 <translation id="6547354035488017500">Kosongkan ruang penyimpanan minimal 512 MB atau perangkat tidak akan merespons. Untuk mengosongkan ruang penyimpanan, hapus file dari penyimpanan perangkat.</translation>
 <translation id="6550675742724504774">Opsi</translation>
 <translation id="6551508934388063976">Perintah tidak tersedia. Tekan Control-N untuk membuka jendela baru.</translation>
@@ -4677,7 +4672,6 @@
 <translation id="827097179112817503">Tampilkan tombol beranda</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 bookmark dihapus}other{# bookmark dihapus}}</translation>
 <translation id="8272443605911821513">Kelola ekstensi Anda dengan mengeklik Ekstensi pada menu "Fitur lainnya".</translation>
-<translation id="8272966760965438857">Kelola Akun Google Anda di satu tempat</translation>
 <translation id="8274332263553132018">Cast file</translation>
 <translation id="8274924778568117936">Jangan menonaktifkan atau menutup <ph name="DEVICE_TYPE" /> Anda sampai proses update selesai. <ph name="DEVICE_TYPE" /> Anda akan dimulai ulang setelah proses instal selesai.</translation>
 <translation id="8275038454117074363">Impor</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index e08df93..257c835 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -338,6 +338,7 @@
     server proxy, modifica le <ph name="LINK_START" />impostazioni del proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">L'unico modo per annullare questa operazione è reinstallare <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importati da Safari</translation>
+<translation id="1515163294334130951">Avvia</translation>
 <translation id="1521442365706402292">Gestisci certificati</translation>
 <translation id="152234381334907219">Mai salvate</translation>
 <translation id="1524430321211440688">Tastiera</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Al massimo</translation>
 <translation id="1673137583248014546"><ph name="URL" /> vuole accedere a marca e modello del token di sicurezza</translation>
 <translation id="1679068421605151609">Strumenti per sviluppatori</translation>
+<translation id="1679806121152819234">PluginVm</translation>
 <translation id="167983332380191032">Il servizio di gestione ha inviato un errore HTTP.</translation>
 <translation id="1680849702532889074">Si è verificato un errore durante l'installazione della tua applicazione Linux.</translation>
 <translation id="16815041330799488">Non consentire ai siti di leggere testi e immagini copiati negli appunti</translation>
@@ -612,7 +614,7 @@
 <translation id="1932026958134051332">Opzioni Switch Access</translation>
 <translation id="1932098463447129402">Non prima</translation>
 <translation id="1933809209549026293">Collega un mouse o una tastiera. Se utilizzi un dispositivo Bluetooth, assicurati che sia pronto per essere accoppiato.</translation>
-<translation id="1937774647013465102">Impossibile importare il tipo di architettura del contenitore <ph name="ARCHITECTURE_CONTAINER" /> con questo dispositivo che invece è <ph name="ARCHITECTURE_DEVICE" />. Puoi provare a ripristinare questo contenitore in un diverso dispositivo oppure puoi accedere ai file all'interno dell'immagine del contenitore se accedi all'app File.</translation>
+<translation id="1937774647013465102">Impossibile importare il tipo di architettura del contenitore <ph name="ARCHITECTURE_CONTAINER" /> con questo dispositivo che invece è <ph name="ARCHITECTURE_DEVICE" />. Puoi provare a ripristinare questo contenitore in un diverso dispositivo oppure puoi accedere ai file all'interno dell'immagine del contenitore aprendoli nell'app File.</translation>
 <translation id="1938351510777341717">Comando esterno</translation>
 <translation id="1940546824932169984">Dispositivi collegati</translation>
 <translation id="1944921356641260203">Aggiornamento trovato</translation>
@@ -900,7 +902,7 @@
 <translation id="2392369802118427583">Attiva</translation>
 <translation id="2394566832561516196">Le impostazioni verranno cancellate al prossimo aggiornamento della pagina.</translation>
 <translation id="2395616325548404795">Il dispositivo <ph name="DEVICE_TYPE" /> è stato registrato correttamente per la gestione aziendale, ma l'invio delle relative informazioni su asset e posizione non è riuscito. Inserisci manualmente queste informazioni nella Console di amministrazione del dispositivo.</translation>
-<translation id="2396783860772170191">Inserisci il pin di 4 cifre (0000-9999)</translation>
+<translation id="2396783860772170191">Inserisci il PIN di 4 cifre (0000-9999)</translation>
 <translation id="2408955596600435184">Inserisci il codice PIN</translation>
 <translation id="241082044617551207">Plug-in sconosciuto</translation>
 <translation id="2413749388954403953">Modifica dell'interfaccia utente dei Preferiti</translation>
@@ -962,7 +964,6 @@
 <translation id="2496180316473517155">Cronologia di navigazione</translation>
 <translation id="2497229222757901769">Velocità mouse</translation>
 <translation id="2497852260688568942">La sincronizzazione è stata disattivata dall'amministratore</translation>
-<translation id="249819058197909513">Non avvisare più per questa app</translation>
 <translation id="2498539833203011245">Riduci a icona</translation>
 <translation id="2498765460639677199">Enorme</translation>
 <translation id="2499747912851752301">Esportazione delle password...</translation>
@@ -1049,7 +1050,6 @@
 <translation id="2630681426381349926">Per iniziare, collegati alla rete Wi-Fi</translation>
 <translation id="2631120081682787498">Vuoi chiudere questa scheda?</translation>
 <translation id="2631498379019108537">Mostra opzioni di immissione nella shelf</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> sta utilizzando <ph name="USAGE" /> MB di spazio su disco.</translation>
 <translation id="2633212996805280240">Rimuovere "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> non è stato in grado di completare l'installazione ma continuerà a essere eseguito dall'immagine disco.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1087,7 +1087,7 @@
 <translation id="2677748264148917807">Esci</translation>
 <translation id="2678063897982469759">Riattiva</translation>
 <translation id="268053382412112343">Cr&amp;onologia</translation>
-<translation id="2682498795777673382">Aggiornata da un genitore</translation>
+<translation id="2682498795777673382">Aggiornato da un genitore</translation>
 <translation id="2683638487103917598">Cartella ordinata</translation>
 <translation id="2684004000387153598">Per continuare, fai clic su OK, quindi fai clic su Aggiungi persona per creare un nuovo profilo per il tuo indirizzo email.</translation>
 <translation id="2688196195245426394">Errore durante la registrazione del dispositivo con il server. <ph name="CLIENT_ERROR" />.</translation>
@@ -1395,7 +1395,6 @@
 <translation id="3157931365184549694">Ripristina</translation>
 <translation id="3158033540161634471">Imposta la tua impronta</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (con supporto hardware)</translation>
-<translation id="316125635462764134">Rimuovi app</translation>
 <translation id="3161522574479303604">Tutte le lingue</translation>
 <translation id="3163201441334626963">Prodotto sconosciuto <ph name="PRODUCT_ID" /> del fornitore <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">La funzione potrebbe essere bloccata da alcuni operatori.</translation>
@@ -1894,6 +1893,7 @@
 <translation id="3916445069167113093">Questo tipo di file può danneggiare il computer. Conservare comunque <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Segnala i dettagli a Google</translation>
 <translation id="3919145445993746351">Attiva la sincronizzazione per avere a disposizione le estensioni su tutti i tuoi computer</translation>
+<translation id="391999873395511996">Download della macchina virtuale in corso.</translation>
 <translation id="3920504717067627103">Criteri dei certificati</translation>
 <translation id="392089482157167418">Attiva ChromeVox (lettura vocale)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1945,7 +1945,6 @@
 <translation id="3983586614702900908">dispositivi di un fornitore sconosciuto</translation>
 <translation id="3984159763196946143">Impossibile avviare la modalità demo</translation>
 <translation id="3984431586879874039">Vuoi consentire a questo sito di rilevare il tuo token di sicurezza?</translation>
-<translation id="3987348946546879621">Dati risparmiati</translation>
 <translation id="3987938432087324095">Scusa, non ho capito.</translation>
 <translation id="3988996860813292272">Seleziona il fuso orario</translation>
 <translation id="399179161741278232">Importati</translation>
@@ -1976,7 +1975,6 @@
 <translation id="4037889604535939429">Modifica persona</translation>
 <translation id="4042264909745389898">Termini di Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Esci dalla pagina}other{Esci dalle pagine}}</translation>
-<translation id="404299405565920089">Qui puoi gestire tutti i tuoi Account Google a cui accedi da app e siti web. Le app e i siti web autorizzati possono accedere ai dati degli account necessari per il loro corretto funzionamento.</translation>
 <translation id="4044612648082411741">Inserisci la password del certificato</translation>
 <translation id="404493185430269859">Motore di ricerca predefinito</translation>
 <translation id="4046123991198612571">Traccia successiva</translation>
@@ -2091,7 +2089,6 @@
 <translation id="4242533952199664413">Apri le impostazioni</translation>
 <translation id="4242577469625748426">Installazione delle impostazioni criterio sul dispositivo non riuscita. <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Trova altre app per stilo</translation>
-<translation id="424546999567421758">È stato rilevato un elevato utilizzo del disco</translation>
 <translation id="424726838611654458">Apri sempre in Adobe Reader</translation>
 <translation id="4247901771970415646">Impossibile sincronizzare con <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">In attesa della connessione di rete...</translation>
@@ -2199,7 +2196,6 @@
 <translation id="4421932782753506458">Micio</translation>
 <translation id="4422347585044846479">Modifica Preferito</translation>
 <translation id="4423376891418188461">Ripristina impostazioni</translation>
-<translation id="4423482519432579560">&amp;Controllo ortografico</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, il tuo amministratore ti chiede di cambiare la password.</translation>
 <translation id="4430019312045809116">Volume</translation>
 <translation id="4430369329743628066">Aggiunto ai preferiti</translation>
@@ -2659,8 +2655,6 @@
 <translation id="5187295959347858724">Hai eseguito l'accesso a <ph name="SHORT_PRODUCT_NAME" />. I tuoi Preferiti, la tua cronologia e le altre impostazioni sono in fase di sincronizzazione con il tuo Account Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vuole scaricare più file</translation>
-<translation id="5192316339598592690">Cambia rapidamente account e accedi contemporaneamente a tutti i siti web e app.
-    Le app e i siti possono chiederti l'autorizzazione per utilizzare alcune delle informazioni del tuo Account Google. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Esegui il powerwash del dispositivo e riprova.</translation>
 <translation id="5204967432542742771">Inserisci la password</translation>
 <translation id="5206215183583316675">Eliminare "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3339,7 +3333,6 @@
 <translation id="622537739776246443">Il profilo verrà eliminato</translation>
 <translation id="6225475702458870625">Connessione dati disponibile dal tuo dispositivo <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">File chiave privata (facoltativo)</translation>
-<translation id="6228516488918914827">Pagina caricata più velocemente</translation>
 <translation id="6228691855869374890">Questo sito ha il controllo totale dei dispositivi MIDI.</translation>
 <translation id="6229890768313448549">Impossibile caricare i Termini di servizio di Google Play. Riprova.</translation>
 <translation id="6231881193380278751">Aggiungi un parametro query nell'URL per aggiornare automaticamente la pagina: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3544,7 +3537,6 @@
 <translation id="6545665334409411530">Frequenza ripetizione</translation>
 <translation id="6545834809683560467">Utilizza un servizio di previsione per il completamento delle ricerche e degli URL digitati nella barra degli indirizzi o nella casella di ricerca di Avvio applicazioni</translation>
 <translation id="6545867563032584178">Il microfono è disattivato nelle Preferenze di Sistema del Mac</translation>
-<translation id="6547316139431024316">Non avvisare più per questa estensione</translation>
 <translation id="6547354035488017500">Libera almeno 512 MB di spazio, altrimenti il tuo dispositivo non risponderà più ai comandi. Per liberare spazio, elimina i file dallo spazio di archiviazione.</translation>
 <translation id="6550675742724504774">Opzioni</translation>
 <translation id="6551508934388063976">Comando non disponibile. Premi Ctrl+N per aprire una nuova finestra.</translation>
@@ -4672,7 +4664,6 @@
 <translation id="827097179112817503">Mostra pulsante Home</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 preferito eliminato}other{# preferiti eliminati}}</translation>
 <translation id="8272443605911821513">Gestisci le tue estensioni facendo clic su Estensioni nel menu "Altri strumenti".</translation>
-<translation id="8272966760965438857">Gestisci il tuo Account Google in un unico posto</translation>
 <translation id="8274332263553132018">Trasmetti file</translation>
 <translation id="8274924778568117936">Non spegnere o chiudere il tuo dispositivo <ph name="DEVICE_TYPE" /> fino al termine dell'aggiornamento. Il dispositivo <ph name="DEVICE_TYPE" /> si riavvierà al termine dell'installazione.</translation>
 <translation id="8275038454117074363">Importa</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index d61ec9b..7202dd5c 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">‏אם אתה משתמש בשרת proxy, בדוק את הגדרות שרת ה-proxy או צור קשר עם מנהל הרשת כדי לוודא ששרת ה-proxy פועל. אם אינך סבור שעליך להשתמש בשרת proxy, שנה את <ph name="LINK_START" />הגדרות שרת ה-proxy שלך<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">הדרך היחידה לבטל את הפעולה זו היא להתקין מחדש את <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="151501797353681931">‏יובא מ-Safari</translation>
+<translation id="1515163294334130951">הפעל</translation>
 <translation id="1521442365706402292">נהל אישורים</translation>
 <translation id="152234381334907219">פריטים שאף פעם לא נשמרו</translation>
 <translation id="1524430321211440688">מקלדת</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">עוצמת הקול הגבוהה ביותר</translation>
 <translation id="1673137583248014546">האתר <ph name="URL" /> מבקש לראות את היצרן והדגם של מפתח האבטחה שלך</translation>
 <translation id="1679068421605151609">כלים עבור מפתחים</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">‏שירות הניהול שלח שגיאת HTTP.</translation>
 <translation id="1680849702532889074">‏קרתה שגיאה במהלך ההתקנה של אפליקציית Linux.</translation>
 <translation id="16815041330799488">אין להתיר לאתרים לגשת לטקסט ותמונות שהועתקו ללוח</translation>
@@ -960,7 +962,6 @@
 <translation id="2496180316473517155">היסטוריית גלישה</translation>
 <translation id="2497229222757901769">מהירות עכבר</translation>
 <translation id="2497852260688568942">מנהל המערכת שלך השבית את הסנכרון</translation>
-<translation id="249819058197909513">אל תציג שוב אזהרה עבור היישום הזה</translation>
 <translation id="2498539833203011245">מזער</translation>
 <translation id="2498765460639677199">ענק</translation>
 <translation id="2499747912851752301">מייצא סיסמאות...</translation>
@@ -1048,7 +1049,6 @@
 <translation id="2630681426381349926">‏התחבר ל-Wi-Fi כדי להתחיל</translation>
 <translation id="2631120081682787498">לסגור את הכרטיסייה הזו?</translation>
 <translation id="2631498379019108537">הצג אפשרויות קלט במדף</translation>
-<translation id="2633199387167390344">‏<ph name="NAME" /> משתמש ב-‎<ph name="USAGE" /> MB מנפח הדיסק.</translation>
 <translation id="2633212996805280240">להסיר את "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> לא הצליח להשלים את ההתקנה, אך ימשיך לפעול מתמונת הדיסק שלו.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1302,7 +1302,7 @@
 <translation id="3012917896646559015">יש ליצור קשר עם יצרן החומרה באופן מיידי כדי לשלוח את המחשב לתיקון.</translation>
 <translation id="3013291976881901233">‏התקני MIDI</translation>
 <translation id="3015639418649705390">הפעלה מחדש עכשיו</translation>
-<translation id="3016329696181678353">לא ניתן להגדיר את <ph name="PRINTER_NAME" /> באופן אוטומטי. יש לציין פרטי מדפסת מתקדמים.</translation>
+<translation id="3016329696181678353">לא ניתן להגדיר את <ph name="PRINTER_NAME" /> באופן אוטומטי. יש לקבוע את ההגדרות המתקדמות של המדפסת.</translation>
 <translation id="3016641847947582299">הרכיב עודכן</translation>
 <translation id="3016780570757425217">לדעת מה המיקום שלך</translation>
 <translation id="3020183492814296499">קיצורים</translation>
@@ -1394,7 +1394,6 @@
 <translation id="3157931365184549694">שחזר</translation>
 <translation id="3158033540161634471">הגדרת טביעת האצבע</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (בגיבוי חומרה)</translation>
-<translation id="316125635462764134">הסר יישום</translation>
 <translation id="3161522574479303604">כל השפות</translation>
 <translation id="3163201441334626963">מוצר לא ידוע <ph name="PRODUCT_ID" /> מהספק <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">ייתכן שספקים מסוימים חוסמים את התכונה הזו.</translation>
@@ -1895,6 +1894,7 @@
 <translation id="3916445069167113093">סוג קובץ זה עלול לגרום נזק למחשב שלך. האם ברצונך לשמור את <ph name="FILE_NAME" /> בכל מקרה?</translation>
 <translation id="3918972485393593704">‏שליחת הפרטים אל Google</translation>
 <translation id="3919145445993746351">כדי לקבל גישה אל התוספים שלך בכל המחשבים שברשותך, יש להפעיל את הסנכרון</translation>
+<translation id="391999873395511996">מתבצעת הורדה של המכונה הווירטואלית.</translation>
 <translation id="3920504717067627103">מדיניות אישורים </translation>
 <translation id="392089482157167418">‏הפעל את ChromeVox (משוב קולי)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1946,7 +1946,6 @@
 <translation id="3983586614702900908">מכשירים מספק לא ידוע</translation>
 <translation id="3984159763196946143">לא ניתן היה להתחיל מצב הדגמה</translation>
 <translation id="3984431586879874039">האם לאפשר לאתר לראות את מפתח האבטחה שלך?</translation>
-<translation id="3987348946546879621">נתונים נחסכו</translation>
 <translation id="3987938432087324095">זה לא היה ברור.</translation>
 <translation id="3988996860813292272">בחר אזור זמן</translation>
 <translation id="399179161741278232">מיובאות</translation>
@@ -1977,7 +1976,6 @@
 <translation id="4037889604535939429">עריכת פרטי משתמש</translation>
 <translation id="4042264909745389898">‏תנאים של Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{יציאה מהדף}two{יציאה מהדפים}many{יציאה מהדפים}other{יציאה מהדפים}}</translation>
-<translation id="404299405565920089">‏כאן אפשר לנהל את כל חשבונות Google שלך שעמם נכנסת אל אפליקציות ואתרים. אפליקציות ואתרים שהענקת להם הרשאה יכולים לגשת אל פרטי החשבון הנחוצים לתפקוד שלהם.</translation>
 <translation id="4044612648082411741">הזן את סיסמת האישור</translation>
 <translation id="404493185430269859">מנוע החיפוש המוגדר כברירת מחדל</translation>
 <translation id="4046123991198612571">הרצועה הבאה</translation>
@@ -2092,7 +2090,6 @@
 <translation id="4242533952199664413">פתח את 'הגדרות'</translation>
 <translation id="4242577469625748426">התקנת הגדרות המדיניות במכשיר: <ph name="VALIDATION_ERROR" /> נכשלה.</translation>
 <translation id="4244238649050961491">חפש עוד אפליקציות לשימוש בסטיילוס</translation>
-<translation id="424546999567421758">אותר שימוש בכמות גדולה מנפח הדיסק</translation>
 <translation id="424726838611654458">‏פתח תמיד ב-Adobe Reader</translation>
 <translation id="4247901771970415646">לא ניתן לסנכרן עם <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">תיכף נתחבר לרשת…</translation>
@@ -2200,7 +2197,6 @@
 <translation id="4421932782753506458">לקיק</translation>
 <translation id="4422347585044846479">ערוך סימניה עבור דף זה</translation>
 <translation id="4423376891418188461">שחזר הגדרות</translation>
-<translation id="4423482519432579560">&amp;בדיקת איות</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, מנהל המערכת מבקש ממך לשנות את הסיסמה שלך.</translation>
 <translation id="4430019312045809116">עוצמת קול</translation>
 <translation id="4430369329743628066">הסימנייה נוספה</translation>
@@ -2660,8 +2656,6 @@
 <translation id="5187295959347858724">‏נכנסת ל-<ph name="SHORT_PRODUCT_NAME" />. הסימניות, ההיסטוריה והגדרות אחרות שלך מסתנכרנות עם חשבון Google שלך.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> ‏(<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> רוצה להוריד מספר קבצים</translation>
-<translation id="5192316339598592690">‏ניתן להחליף חשבונות במהירות ולהיכנס לאפליקציות ולאתרים מרובים בבת אחת.
-    אפליקציות ואתרים יכולים לבקש ממך הרשאה להשתמש בחלק מפרטי חשבון Google שלך. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">‏אפשר לבצע Powerwash במכשיר ולנסות שוב.</translation>
 <translation id="5204967432542742771">הזן סיסמה</translation>
 <translation id="5206215183583316675">האם למחוק את "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3340,7 +3334,6 @@
 <translation id="622537739776246443">הפרופיל יימחק</translation>
 <translation id="6225475702458870625">יש חיבור נתונים זמין ב-<ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">קובץ מפתח פרטי (אופציונלי)</translation>
-<translation id="6228516488918914827">נטען דף מהיר יותר</translation>
 <translation id="6228691855869374890">‏לאתר זה יש שליטה מלאה על מכשירי MIDI.</translation>
 <translation id="6229890768313448549">‏לא ניתן לטעון את התנאים וההגבלות של Google Play. נסה שוב.</translation>
 <translation id="6231881193380278751">‏הוסף פרמטר שאילתה בכתובת האתר כדי לרענן את הדף באופן אוטומטי: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3545,7 +3538,6 @@
 <translation id="6545665334409411530">שיעור חזרה</translation>
 <translation id="6545834809683560467">‏שימוש בשירות חיזויים כדי להשלים חיפושים וכתובות URL שמזינים בשורת כתובת האתר או בתיבת החיפוש של מרכז האפליקציות</translation>
 <translation id="6545867563032584178">‏המיקרופון מושבת בהעדפות המערכת של Mac</translation>
-<translation id="6547316139431024316">אל תציג שוב אזהרה עבור התוסף הזה</translation>
 <translation id="6547354035488017500">‏עליך לפנות ‎512 MB לפחות משטח האחסון במכשיר, אחרת הוא יפסיק להגיב. כדי לפנות שטח אחסון, מחק קבצים מאחסון המכשיר.</translation>
 <translation id="6550675742724504774">אפשרויות</translation>
 <translation id="6551508934388063976">‏הפקודה לא זמינה. הקש על Control-N לפתיחת חלון חדש.</translation>
@@ -4675,7 +4667,6 @@
 <translation id="827097179112817503">הצג את לחצן 'דף הבית'</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{סימניה אחת נמחקה}two{# סימניות נמחקו}many{# סימניות נמחקו}other{# סימניות נמחקו}}</translation>
 <translation id="8272443605911821513">נהל את התוספים שלך על ידי לחיצה על 'תוספים' בתפריט 'כלים נוספים'.</translation>
-<translation id="8272966760965438857">‏יש לך אפשרות לנהל את כל חשבונות Google במקום אחד</translation>
 <translation id="8274332263553132018">העברת קובץ</translation>
 <translation id="8274924778568117936">אל תכבה או תסגור את ה-<ph name="DEVICE_TYPE" /> לפני סיום העדכון. ה-<ph name="DEVICE_TYPE" /> יופעל מחדש באופן אוטומטי בסיום ההתקנה.</translation>
 <translation id="8275038454117074363">ייבוא</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index b1e23ed..99b485d 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -338,6 +338,7 @@
     場合は、<ph name="LINK_START" />プロキシ設定<ph name="LINK_END" />を調整してください。</translation>
 <translation id="1512210426710821809">この設定を元に戻すには、<ph name="IDS_SHORT_PRODUCT_OS_NAME" /> の再インストールが必要になります</translation>
 <translation id="151501797353681931">Safari からのインポート</translation>
+<translation id="1515163294334130951">起動</translation>
 <translation id="1521442365706402292">証明書の管理</translation>
 <translation id="152234381334907219">常に保存しない</translation>
 <translation id="1524430321211440688">キーボード</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">最大</translation>
 <translation id="1673137583248014546"><ph name="URL" /> よりセキュリティ キーのメーカーとモデルの読み取り許可を求められています</translation>
 <translation id="1679068421605151609">デベロッパー ツール</translation>
+<translation id="1679806121152819234">プラグイン VM</translation>
 <translation id="167983332380191032">管理サービスから HTTP エラーが送信されました。</translation>
 <translation id="1680849702532889074">Linux アプリケーションのインストール中にエラーが発生しました。</translation>
 <translation id="16815041330799488">クリップボードにコピーされているテキストや画像へのアクセスをサイトに許可しない</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">デバイスをドメインに追加できません。追加できるデバイスの上限数を超えていないかご確認ください。</translation>
 <translation id="1744108098763830590">バックグラウンド ページ</translation>
 <translation id="1745520510852184940">常に翻訳する</translation>
+<translation id="1746402432151920942">保護されているメディア識別子</translation>
 <translation id="175196451752279553">閉じたタブを開く(&amp;R)</translation>
 <translation id="1753905327828125965">よくアクセスするページ</translation>
 <translation id="1756681705074952506">入力方法</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">ログインしていません</translation>
 <translation id="1832511806131704864">スマートフォンの変更が反映されました</translation>
 <translation id="1834503245783133039"><ph name="FILE_NAME" /> をダウンロードできませんでした</translation>
+<translation id="1834583737373831634">MIDI デバイス</translation>
 <translation id="1838374766361614909">検索をクリア</translation>
 <translation id="1841545962859478868">デバイス管理者が次の情報を監視している可能性があります。</translation>
 <translation id="1841616161104323629">デバイスレコードがありません。</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">問題を報告</translation>
 <translation id="2220572644011485463">PIN またはパスワード</translation>
 <translation id="2224444042887712269">この設定は <ph name="OWNER_EMAIL" /> に帰属します。</translation>
+<translation id="2224471211857467033">ユーザー補助イベント</translation>
 <translation id="2224551243087462610">フォルダ名の編集</translation>
 <translation id="2226449515541314767">このサイトには MIDI デバイスのフル コントロールは許可されていません。</translation>
 <translation id="2226720438730111184">問題の詳細をお知らせください</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">閲覧履歴</translation>
 <translation id="2497229222757901769">マウスの速度</translation>
 <translation id="2497852260688568942">同期は管理者により無効にされています</translation>
-<translation id="249819058197909513">このアプリの警告を表示しない</translation>
 <translation id="2498539833203011245">最小化</translation>
 <translation id="2498765460639677199">極大</translation>
 <translation id="2499747912851752301">パスワードのエクスポート中...</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">開始するには Wi-Fi に接続</translation>
 <translation id="2631120081682787498">このタブを閉じてもよろしいですか?</translation>
 <translation id="2631498379019108537">シェルフに入力オプションを表示</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> は <ph name="USAGE" /> MB のディスク領域を使用しています。</translation>
 <translation id="2633212996805280240">「<ph name="EXTENSION_NAME" />」を削除しますか?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> のインストールを完了できませんでした。ただし、今後もディスク イメージから実行できます。</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">復元</translation>
 <translation id="3158033540161634471">指紋の設定</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />](ハードウェアにより保護を強化)</translation>
-<translation id="316125635462764134">アプリを削除</translation>
 <translation id="3161522574479303604">すべての言語</translation>
 <translation id="3163201441334626963">不明な商品(<ph name="PRODUCT_ID" />、ベンダー: <ph name="VENDOR_ID" />)</translation>
 <translation id="3165390001037658081">携帯通信会社によってはこの機能を利用できない場合があります。</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">この種類のファイルはコンピュータに損害を与える可能性があります。<ph name="FILE_NAME" /> のダウンロードを続けますか?</translation>
 <translation id="3918972485393593704">Google に詳細なレポートを送信する</translation>
 <translation id="3919145445993746351">お使いのどのパソコンでも同じ拡張機能を使用するには、同期を有効にします</translation>
+<translation id="391999873395511996">仮想マシンをダウンロードしています。</translation>
 <translation id="3920504717067627103">証明書ポリシー</translation>
 <translation id="392089482157167418">ChromeVox(音声フィードバック)を有効にする</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">不明なベンダーのデバイス</translation>
 <translation id="3984159763196946143">デモモードを開始できませんでした</translation>
 <translation id="3984431586879874039">このサイトによるセキュリティ キーへのアクセスを許可しますか?</translation>
-<translation id="3987348946546879621">データの使用量が削減されました</translation>
 <translation id="3987938432087324095">聞き取れませんでした。</translation>
 <translation id="3988996860813292272">タイムゾーンの選択</translation>
 <translation id="399179161741278232">インポートしたブックマーク</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">画像と名前を設定</translation>
 <translation id="4042264909745389898">Google Chrome OS 利用規約</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{ページを離れる}other{ページを離れる}}</translation>
-<translation id="404299405565920089">アプリやウェブサイトからログインしているすべての Google アカウントをここで管理できます。許可している場合、アプリやウェブサイトは正しく動作するために必要なアカウント情報にアクセスできます。</translation>
 <translation id="4044612648082411741">証明書のパスワードを入力してください</translation>
 <translation id="404493185430269859">デフォルトの検索エンジン</translation>
 <translation id="4046123991198612571">次のトラック</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">設定を開く</translation>
 <translation id="4242577469625748426">デバイスにポリシー設定をインストールできませんでした: <ph name="VALIDATION_ERROR" />。</translation>
 <translation id="4244238649050961491">他のタッチペン アプリを探す</translation>
-<translation id="424546999567421758">ディスクの使用率が高くなっています</translation>
 <translation id="424726838611654458">常に Adobe Reader で開く</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" /> に同期できません</translation>
 <translation id="4249248555939881673">ネットワークに接続しています...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">フワフワ</translation>
 <translation id="4422347585044846479">このページのブックマークを編集します</translation>
 <translation id="4423376891418188461">設定を元に戻す</translation>
-<translation id="4423482519432579560">スペルチェック(&amp;S)</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" /> さん、管理者がパスワードの変更をリクエストしています。</translation>
 <translation id="4430019312045809116">音量</translation>
 <translation id="4430369329743628066">ブックマークを追加しました</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724"><ph name="SHORT_PRODUCT_NAME" /> にログインしています。ブックマーク、履歴、その他の設定は Google アカウントに同期されます。</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" />(<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> で複数のファイルがダウンロードされようとしています</translation>
-<translation id="5192316339598592690">アカウントのすばやい切り替えとアプリやウェブサイトへのログインをまとめて行えます。
-    アプリやサイトが、お使いの Google アカウント情報の一部を使用することについて許可を求める場合があります。<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">デバイスで Powerwash を実行してもう一度お試しください。</translation>
 <translation id="5204967432542742771">パスワードを入力</translation>
 <translation id="5206215183583316675">「<ph name="CERTIFICATE_NAME" />」を削除しますか?</translation>
@@ -3343,7 +3340,6 @@
 <translation id="622537739776246443">プロフィールは削除されます</translation>
 <translation id="6225475702458870625"><ph name="PHONE_NAME" /> からデータ接続が可能です</translation>
 <translation id="6226777517901268232">秘密鍵ファイル(省略可能)</translation>
-<translation id="6228516488918914827">高速化のためプレビュー ページを表示しています</translation>
 <translation id="6228691855869374890">このサイトは MIDI デバイスのフル コントロールが許可されています。</translation>
 <translation id="6229890768313448549">Google Play 利用規約を読み込めません。もう一度お試しください。</translation>
 <translation id="6231881193380278751">ページを自動更新するには URL にクエリ パラメータを追加します: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3544,6 @@
 <translation id="6545665334409411530">リピート回数 / 秒</translation>
 <translation id="6545834809683560467">予測サービスを使用して、アドレスバーまたはアプリ ランチャーの検索ボックスに入力した検索キーワードや URL を補完する</translation>
 <translation id="6545867563032584178">Mac のシステム環境設定でマイクがオフになっています</translation>
-<translation id="6547316139431024316">この拡張機能の警告を表示しない</translation>
 <translation id="6547354035488017500">デバイスの空き領域を 512 MB 以上確保してください。空き領域がこれより少なくなると、デバイスは応答しなくなります。空き領域を確保するために、デバイスのストレージからファイルを削除してください。</translation>
 <translation id="6550675742724504774">オプション</translation>
 <translation id="6551508934388063976">コマンドを使用できません。Ctrl+N を押して新しいウィンドウを開いてください。</translation>
@@ -3831,7 +3826,7 @@
 <translation id="7003339318920871147">ウェブ データベース</translation>
 <translation id="7003723821785740825">デバイスのロックをすばやく解除する方法を設定できます</translation>
 <translation id="7003844668372540529">不明な商品(<ph name="PRODUCT_ID" />、ベンダー: <ph name="VENDOR_NAME" />)</translation>
-<translation id="7004402701596653846">サイトで MIDI が使用される可能性があります</translation>
+<translation id="7004402701596653846">サイトに MIDI の使用が許可されています</translation>
 <translation id="7004499039102548441">最近使ったタブ</translation>
 <translation id="7005848115657603926">ページ範囲が無効です。<ph name="EXAMPLE_PAGE_RANGE" /> の範囲で指定してください。</translation>
 <translation id="7006634003215061422">下余白</translation>
@@ -4680,7 +4675,6 @@
 <translation id="827097179112817503">ホームボタンを表示する</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 個のブックマークが削除されました}other{# 個のブックマークが削除されました}}</translation>
 <translation id="8272443605911821513">拡張機能を管理するには、[その他のツール] メニューの [拡張機能] をクリックします。</translation>
-<translation id="8272966760965438857">Google アカウントを 1 か所で管理</translation>
 <translation id="8274332263553132018">ファイルをキャスト</translation>
 <translation id="8274924778568117936">アップデートが完了するまでは、<ph name="DEVICE_TYPE" /> の電源を切ったり蓋を閉じたりしないでください。インストールが完了すると、<ph name="DEVICE_TYPE" /> は再起動します。</translation>
 <translation id="8275038454117074363">インポート</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index c4e31ef..0f6221a5 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -339,6 +339,7 @@
        ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು<ph name="LINK_END" /> ಸರಿಹೊಂದಿಸಿ.</translation>
 <translation id="1512210426710821809">ಇದನ್ನು ರದ್ದುಗೊಳಿಸಲು ಇರುವ ಏಕೈಕ ಮಾರ್ಗವೆಂದರೆ <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> ಅನ್ನು ಮರುಸ್ಥಾಪಿಸುವುದು</translation>
 <translation id="151501797353681931">Safari ಯಿಂದ ಆಮದು ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="1515163294334130951">ಪ್ರಾರಂಭಿಸು</translation>
 <translation id="1521442365706402292">ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
 <translation id="152234381334907219">ಎಂದಿಗೂ ಉಳಿಸಿಲ್ಲ</translation>
 <translation id="1524430321211440688">ಕೀಬೋರ್ಡ್</translation>
@@ -441,6 +442,7 @@
 <translation id="167160931442925455">ಇನ್ನಷ್ಟು ಜೋರಾಗಿ</translation>
 <translation id="1673137583248014546">ನಿಮ್ಮ ಸುರಕ್ಷತಾ ಕೀಯ ತಯಾರಕರ ಬ್ರಾಂಡ್ ಹೆಸರು  ಮತ್ತು ಮಾದರಿಯನ್ನು <ph name="URL" /> ನೋಡಲು ಬಯಸುತ್ತದೆ</translation>
 <translation id="1679068421605151609">ಡೆವಲಪರ್ ಟೂಲ್ಸ್</translation>
+<translation id="1679806121152819234">VM ಅನ್ನು ಪ್ಲಗ್‌ಇನ್ ಮಾಡಿ</translation>
 <translation id="167983332380191032">ನಿರ್ವಹಣಾ ಸೇವೆಯು HTTP ದೋಷ ಸಂದೇಶವನ್ನು ಕಳುಹಿಸಿದೆ.</translation>
 <translation id="1680849702532889074">ನಿಮ್ಮ Linux ಅಪ್ಲಿಕೇಶನ್‌ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವಾಗ ದೋಷವೊಂದು ಸಂಭವಿಸಿದೆ.</translation>
 <translation id="16815041330799488">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿರುವ ಪಠ್ಯ ಮತ್ತು ಚಿತ್ರಗಳನ್ನು ನೋಡಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿ ನೀಡಬೇಡಿ</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ</translation>
 <translation id="2497229222757901769">ಮೌಸ್ ವೇಗ</translation>
 <translation id="2497852260688568942">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸಿಂಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ</translation>
-<translation id="249819058197909513">ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗಾಗಿ ಮತ್ತೆ ಎಚ್ಚರಿಕೆ ನೀಡದಿರು</translation>
 <translation id="2498539833203011245">ಕುಗ್ಗಿಸು</translation>
 <translation id="2498765460639677199">ಅಗಾಧ</translation>
 <translation id="2499747912851752301">ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಎಕ್ಸ್‌ಪೋರ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">ಪ್ರಾರಂಭಿಸಲು ವೈ-ಫೈ ಗೆ ಸಂಪರ್ಕಿಸಿ</translation>
 <translation id="2631120081682787498">ನೀವು ಖಂಡಿತವಾಗಿಯೂ ಈ ಟ್ಯಾಬ್ ಅನ್ನು ಮುಚ್ಚಲು ಬಯಸುವಿರಾ?</translation>
 <translation id="2631498379019108537">ಶೆಲ್ಫ್‌ನಲ್ಲಿ ಇನ್‌ಪುಟ್‌ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸಿ</translation>
-<translation id="2633199387167390344">ಡಿಸ್ಕ್ ಸ್ಥಳಾವಕಾಶದಲ್ಲಿ <ph name="USAGE" /> MB ಅನ್ನು <ph name="NAME" /> ಬಳಸಿಕೊಳ್ಳುತ್ತಿದೆ.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" ಅನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ಸ್ಥಾಪನೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲಾಗಲಿಲ್ಲ, ಆದರೆ ಇದರ ಡಿಸ್ಕ್ ಇಮೇಜ್‌ನಿಂದ ಚಾಲನೆಗೊಳ್ಳುವುದನ್ನು ಮುಂದುವರಿಸುತ್ತದೆ.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">ಮರುಸ್ಥಾಪನೆ</translation>
 <translation id="3158033540161634471">ನಿಮ್ಮ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಅನ್ನು ಸೆಟಪ್‌ ಮಾಡಿ</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (ಹಾರ್ಡ್‌ವೇರ್-ಹಿಂದಕ್ಕೆ ಪಡೆದ)</translation>
-<translation id="316125635462764134">ಅಪ್ಲಿಕೇಶನ್ ತೆಗೆದುಹಾಕು</translation>
 <translation id="3161522574479303604">ಎಲ್ಲಾ ಭಾಷೆಗಳು</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> ಮಾರಾಟಗಾರರಿಂದ <ph name="PRODUCT_ID" /> ಅಪರಿಚಿತ ಉತ್ಪನ್ನ</translation>
 <translation id="3165390001037658081">ಕೆಲವು ವಾಹಕಗಳು ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ನಿರ್ಬಂಧಿಸಬಹುದು.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">ಈ ಫೈಲ್‌ನ ಪ್ರಕಾರವು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಹಾನಿಯನ್ನುಂಟು ಮಾಡಬಹುದು. ನೀವು <ph name="FILE_NAME" /> ಅನ್ನು ಹೇಗಿದ್ದರೂ ಇರಿಸಲು ಬಯಸುವಿರಾ?</translation>
 <translation id="3918972485393593704">Google ಗೆ ವಿವರಗಳ ವರದಿ ನೀಡಿ</translation>
 <translation id="3919145445993746351">ನಿಮ್ಮ ಎಲ್ಲಾ ಕಂಪ್ಯೂಟರ್‌ಗಳಲ್ಲೂ ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ಪಡೆಯಲು, ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಿ</translation>
+<translation id="391999873395511996">ವರ್ಚುವಲ್ ಯಂತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ.</translation>
 <translation id="3920504717067627103">ಪ್ರಮಾಣಪತ್ರ ನೀತಿಗಳು</translation>
 <translation id="392089482157167418">ChromeVox ಸಕ್ರಿಯಗೊಳಿಸಿ (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">ಅಪರಿಚಿತ ಮಾರಾಟಗಾರರಿಂದ ಸಾಧನಗಳು</translation>
 <translation id="3984159763196946143">ಡೆಮೋ ಮೋಡ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation>
 <translation id="3984431586879874039">ನಿಮ್ಮ ಭದ್ರತೆ ಕೀ ಅನ್ನು ನೋಡಲು ಈ ಸೈಟ್‌ಗೆ ಅನುಮತಿಸುವುದೇ?</translation>
-<translation id="3987348946546879621">ಉಳಿಸಲಾದ ಡೇಟಾ</translation>
 <translation id="3987938432087324095">ಕ್ಷಮಿಸಿ, ಅದನ್ನು ಗ್ರಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation>
 <translation id="3988996860813292272">ಸಮಯ ವಲಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation>
 <translation id="399179161741278232">ಆಮದುಮಾಡಲಾಗಿದೆ</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">ವ್ಯಕ್ತಿಯನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation>
 <translation id="4042264909745389898">Google Chrome OS ನಿಯಮಗಳು</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{ನಿರ್ಗಮನ ಪುಟ}one{ನಿರ್ಗಮನ ಪುಟಗಳು}other{ನಿರ್ಗಮನ ಪುಟಗಳು}}</translation>
-<translation id="404299405565920089">ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳ ಮೂಲಕ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದ ನಿಮ್ಮ ಎಲ್ಲಾ Google ಖಾತೆಗಳನ್ನು ಇಲ್ಲಿ ನಿರ್ವಹಿಸಬಹುದು. ನಿಮ್ಮ ಅನುಮತಿಯನ್ನು ಹೊಂದಿರುವ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳು ಸಮರ್ಪಕವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬೇಕಾದರೆ, ಅವುಗಳು ಖಾತೆಯ ಮಾಹಿತಿಯನ್ನು ಪ್ರವೇಶಿಸಬೇಕಾಗಬಹುದು.</translation>
 <translation id="4044612648082411741">ನಿಮ್ಮ ಪ್ರಮಾಣಪತ್ರ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ</translation>
 <translation id="404493185430269859">ಡೀಫಾಲ್ಟ್ ಹುಡುಕಾಟ ಎಂಜಿನ್</translation>
 <translation id="4046123991198612571">ಮುಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆ</translation>
 <translation id="4242577469625748426">ಸಾಧನದಲ್ಲಿ ನೀತಿಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಸ್ಥಾಪಿಸಲು ವಿಫಲವಾಗಿದೆ: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">ಇನ್ನಷ್ಟು ಸ್ಟೈಲಸ್ ಅಪ್ಲಿಕೇಶನ್‌‌ಗಳನ್ನು ಹುಡುಕಿ</translation>
-<translation id="424546999567421758">ಅಧಿಕ ಡಿಸ್ಕ್ ಬಳಕೆಯನ್ನು ಪತ್ತೆ ಹಚ್ಚಲಾಗಿದೆ</translation>
 <translation id="424726838611654458">ಯಾವಾಗಲೂ Adobe Reader ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" /> ಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ</translation>
 <translation id="4249248555939881673">ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕಕ್ಕಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ...</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">ಫ್ಲುಫಿ</translation>
 <translation id="4422347585044846479">ಈ ಪುಟಕ್ಕಾಗಿ ಬುಕ್‌ಮಾರ್ಕ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation>
 <translation id="4423376891418188461">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸು</translation>
-<translation id="4423482519432579560">&amp;ಕಾಗುಣಿತಪರೀಕ್ಷೆ</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಗೆ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ ಅನ್ನು ನೀವು ಬದಲಾಯಿಸವುದು ಅಗತ್ಯವಿರುತ್ತದೆ.</translation>
 <translation id="4430019312045809116">ವಾಲ್ಯೂಮ್</translation>
 <translation id="4430369329743628066">ಬುಕ್‌ಮಾರ್ಕ್ ಸೇರಿಸಲಾಗಿದೆ</translation>
@@ -2664,8 +2660,6 @@
 <translation id="5187295959347858724">ಇದೀಗ ನೀವು<ph name="SHORT_PRODUCT_NAME" /> ಗೆ ಸೈನ್ ಇನ್ ಆಗಿರುವಿರಿ. ನಿಮ್ಮ Google ಖಾತೆ ಜೊತೆ ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಇತರೆ ಸೆಟ್ಟಿಂಗ್‌‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ಬಹು ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲು ಬಯಸುತ್ತದೆ</translation>
-<translation id="5192316339598592690">ಖಾತೆಗಳನ್ನು ತ್ವರಿತವಾಗಿ ಬದಲಾಯಿಸಿ ಮತ್ತು ಆ್ಯಪ್‌ಗಳು ಹಾಗೂ ವೆಬ್‌ಸೈಟ್‌ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ, ಇವೆಲ್ಲವನ್ನೂ ಒಂದೇ ಬಾರಿಗೆ ಮಾಡಬಹುದಾಗಿದೆ.
-    ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸೈಟ್‌ಗಳು ನಿಮ್ಮ Google ಖಾತೆಯ ಕೆಲವು ಮಾಹಿತಿಯನ್ನು ಬಳಸಲು ನಿಮ್ಮ ಅನುಮತಿಯನ್ನು ಕೇಳಬಹುದು. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">ಸಾಧನವನ್ನು ಪವರ್‌ವಾಷ್ ಮಾಡಿ, ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="5204967432542742771">ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ಅಳಿಸುವುದೇ?</translation>
@@ -3345,7 +3339,6 @@
 <translation id="622537739776246443">ಪ್ರೊಫೈಲ್‌ ಅನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ</translation>
 <translation id="6225475702458870625">ನಿಮ್ಮ <ph name="PHONE_NAME" /> ನಿಂದ ಡೇಟಾ ಸಂಪರ್ಕ ಲಭ್ಯವಿದೆ</translation>
 <translation id="6226777517901268232">ಖಾಸಗಿ ಕೀ ಫೈಲ್ (ಐಚ್ಛಿಕ)</translation>
-<translation id="6228516488918914827">ವೇಗವಾದ ಪುಟವನ್ನು ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="6228691855869374890">ಈ ಸೈಟ್‌ಗೆ MIDI ಸಾಧನಗಳ ಸಂಪೂರ್ಣ ನಿಯಂತ್ರಣವಿದೆ.</translation>
 <translation id="6229890768313448549">Google Play ಸೇವೆಯ ನಿಯಮಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ಮರುಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="6231881193380278751">ಪುಟವನ್ನು ಸ್ವಯಂ-ರಿಫ್ರೆಶ್ ಮಾಡಲು ಪ್ರಶ್ನೆಯ ಪರಮ್ ಸೇರಿಸಿ: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3550,7 +3543,6 @@
 <translation id="6545665334409411530">ಪುನರಾವರ್ತನೆ ಪ್ರಮಾಣ</translation>
 <translation id="6545834809683560467">ಹುಡುಕಾಟಗಳನ್ನು ಮತ್ತು ಅಡ್ರೆಸ್‌ ಬಾರ್‌‌ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್ ಲಾಂಚರ್‌ನಲ್ಲಿನ ಹುಡುಕಾಟ ಪೆಟ್ಟಿಗೆಯಲ್ಲಿ ಟೈಪ್‌ ಮಾಡಲಾದ URLಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಸಲಹೆ ಸೇವೆಯನ್ನು ಬಳಸು</translation>
 <translation id="6545867563032584178">Mac ಸಿಸ್ಟಂ ಆದ್ಯತೆಗಳಲ್ಲಿ ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
-<translation id="6547316139431024316">ಈ ವಿಸ್ತರಣೆಗಾಗಿ ಮತ್ತೆ ಎಚ್ಚರಿಕೆ ನೀಡದಿರು</translation>
 <translation id="6547354035488017500">ಕನಿಷ್ಠ 512 MB ಸ್ಥಳಾವಕಾಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಿ ಇಲ್ಲದಿದ್ದರೆ ನಿಮ್ಮ ಸಾಧನವು ಪ್ರತಿಕ್ರಿಯೆ ನೀಡದಂತಾಗುತ್ತದೆ. ಸ್ಥಳಾವಕಾಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಲು, ಸಾಧನದ ಸಂಗ್ರಹಣೆಯಿಂದ ಫೈಲ್‌ಗಳನ್ನು ಅಳಿಸಿ.</translation>
 <translation id="6550675742724504774">ಆಯ್ಕೆಗಳು</translation>
 <translation id="6551508934388063976">ಕಮಾಂಡ್ ಲಭ್ಯವಿಲ್ಲ. ಹೊಸ ವಿಂಡೋ ತೆರೆಯಲು control-N ಒತ್ತಿರಿ.</translation>
@@ -4680,7 +4672,6 @@
 <translation id="827097179112817503">ಮುಖಪುಟ ಬಟನ್‌ ತೋರಿಸು</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 ಬುಕ್‌ಮಾರ್ಕ್ ಅಳಿಸಲಾಗಿದೆ}one{# ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಅಳಿಸಲಾಗಿದೆ}other{# ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಅಳಿಸಲಾಗಿದೆ}}</translation>
 <translation id="8272443605911821513">"ಹೆಚ್ಚಿನ ಪರಿಕರಗಳು" ಮೆನುನಲ್ಲಿರುವ ‘ವಿಸ್ತರಣೆಗಳು’ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation>
-<translation id="8272966760965438857">ನಿಮ್ಮ Google ಖಾತೆಗಳನ್ನು ಒಂದೇ ಸ್ಥಳದಲ್ಲಿ ನಿರ್ವಹಿಸಿ.</translation>
 <translation id="8274332263553132018">ಫೈಲ್‌ ಅನ್ನು ಬಿತ್ತರಿಸಿ</translation>
 <translation id="8274924778568117936">ಅಪ್‌ಡೇಟ್ ಮುಕ್ತಾಯಗೊಳ್ಳುವವರೆಗೆ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಆಫ್ ಮಾಡಬೇಡಿ. ಇನ್‌ಸ್ಟಾಲೇಶನ್ ಪ್ರಕ್ರಿಯೆ ಪೂರ್ಣಗೊಂಡ ನಂತರ ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಮರುಪ್ರಾರಂಭವಾಗುತ್ತದೆ.</translation>
 <translation id="8275038454117074363">ಆಮದು</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index b5b6c8a8..50826337 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -338,6 +338,7 @@
     <ph name="LINK_START" />프록시 설정<ph name="LINK_END" />을 조정하세요.</translation>
 <translation id="1512210426710821809">이 작업을 실행취소하려면 <ph name="IDS_SHORT_PRODUCT_OS_NAME" />을(를) 다시 설치해야 합니다</translation>
 <translation id="151501797353681931">Safari에서 가져온 북마크</translation>
+<translation id="1515163294334130951">실행</translation>
 <translation id="1521442365706402292">인증서 관리</translation>
 <translation id="152234381334907219">저장되지 않음</translation>
 <translation id="1524430321211440688">키보드</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">가장 크게</translation>
 <translation id="1673137583248014546"><ph name="URL" />에서 보안 키 제조업체와 모델을 확인하려고 합니다.</translation>
 <translation id="1679068421605151609">개발자 도구</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">관리 서비스에서 HTTP 오류를 전송했습니다.</translation>
 <translation id="1680849702532889074">Linux 애플리케이션을 설치하는 중에 오류가 발생했습니다.</translation>
 <translation id="16815041330799488">사이트에서 클립보드에 복사된 텍스트 및 이미지를 확인하도록 허용하지 않음</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">인터넷 사용 기록</translation>
 <translation id="2497229222757901769">마우스 속도</translation>
 <translation id="2497852260688568942">관리자가 동기화를 사용 중지했습니다.</translation>
-<translation id="249819058197909513">이 앱에 대해 다시 경고하지 않음</translation>
 <translation id="2498539833203011245">최소화</translation>
 <translation id="2498765460639677199">크게</translation>
 <translation id="2499747912851752301">비밀번호를 내보내는 중...</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Wi-Fi에 연결하여 시작</translation>
 <translation id="2631120081682787498">이 탭을 닫으시겠습니까?</translation>
 <translation id="2631498379019108537">실행기에 입력 옵션 표시</translation>
-<translation id="2633199387167390344"><ph name="NAME" />에서 <ph name="USAGE" />MB의 디스크 공간을 사용하고 있습니다.</translation>
 <translation id="2633212996805280240">'<ph name="EXTENSION_NAME" />'을(를) 삭제하시겠습니까?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" />에서 설치를 완료하지 못했지만 디스크 이미지에서 계속 실행됩니다.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">복구</translation>
 <translation id="3158033540161634471">지문 설정</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />](하드웨어에 백업됨)</translation>
-<translation id="316125635462764134">앱 제거</translation>
 <translation id="3161522574479303604">모든 언어</translation>
 <translation id="3163201441334626963">공급업체 <ph name="VENDOR_ID" />의 알 수 없는 제품 <ph name="PRODUCT_ID" /></translation>
 <translation id="3165390001037658081">일부 이동통신사는 이 기능을 차단할 수도 있습니다.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">이 형식의 파일은 컴퓨터를 손상시킬 수 있습니다. 그래도 <ph name="FILE_NAME" />을(를) 다운로드하시겠습니까?</translation>
 <translation id="3918972485393593704">Google에 세부정보 신고</translation>
 <translation id="3919145445993746351">어느 컴퓨터에서나 내 확장 프로그램을 사용하려면 동기화를 사용 설정하세요.</translation>
+<translation id="391999873395511996">가상 머신을 다운로드하고 있습니다.</translation>
 <translation id="3920504717067627103">인증서 정책</translation>
 <translation id="392089482157167418">ChromeVox(음성 피드백) 사용</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">알 수 없는 공급업체의 기기</translation>
 <translation id="3984159763196946143">데모 모드를 시작할 수 없음</translation>
 <translation id="3984431586879874039">이 사이트에서 보안 키를 보도록 허용할까요?</translation>
-<translation id="3987348946546879621">데이터를 절약했습니다</translation>
 <translation id="3987938432087324095">죄송합니다. 인식하지 못했습니다.</translation>
 <translation id="3988996860813292272">시간대 선택</translation>
 <translation id="399179161741278232">가져온 북마크</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">사용자 수정</translation>
 <translation id="4042264909745389898">Google Chrome OS 이용약관</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{페이지 나가기}other{페이지 나가기}}</translation>
-<translation id="404299405565920089">앱 및 웹사이트에서 로그인한 모든 Google 계정을 여기에서 관리할 수 있습니다. 사용자가 허가한 앱 및 웹사이트는 정상적으로 작동하기 위해 필요한 계정 정보에 액세스할 수 있습니다.</translation>
 <translation id="4044612648082411741">인증서 비밀번호를 입력하세요.</translation>
 <translation id="404493185430269859">기본 검색엔진</translation>
 <translation id="4046123991198612571">다음 트랙</translation>
@@ -2093,7 +2091,6 @@
 <translation id="4242533952199664413">설정 열기</translation>
 <translation id="4242577469625748426">기기에 정책 설정을 설치하지 못함: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">스타일러스 앱 더보기</translation>
-<translation id="424546999567421758">디스크 사용률이 높음</translation>
 <translation id="424726838611654458">항상 Adobe Reader에서 열기</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" />과(와) 동기화할 수 없음</translation>
 <translation id="4249248555939881673">네트워크 연결 대기 중...</translation>
@@ -2201,7 +2198,6 @@
 <translation id="4421932782753506458">복실이</translation>
 <translation id="4422347585044846479">이 페이지에 대한 북마크 편집</translation>
 <translation id="4423376891418188461">설정 복원</translation>
-<translation id="4423482519432579560">맞춤법 검사(&amp;S)</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />님, 관리자가 비밀번호 변경을 요청했습니다.</translation>
 <translation id="4430019312045809116">볼륨</translation>
 <translation id="4430369329743628066">북마크 추가됨</translation>
@@ -2661,8 +2657,6 @@
 <translation id="5187295959347858724">이제 <ph name="SHORT_PRODUCT_NAME" />에 로그인되었으며 북마크와 방문기록, 기타 설정이 내 Google 계정과 동기화됩니다.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" />(<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" />에서 여러 파일을 다운로드하려고 합니다.</translation>
-<translation id="5192316339598592690">계정 간에 빠르게 전환하고 한 번에 앱과 웹사이트에 로그인하세요.
-    앱 및 사이트에서 Google 계정 정보 중 일부를 사용할 권한을 요청할 수 있습니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">기기를 파워워시한 후 다시 시도해 주세요.</translation>
 <translation id="5204967432542742771">비밀번호 입력</translation>
 <translation id="5206215183583316675">'<ph name="CERTIFICATE_NAME" />'을(를) 삭제하시겠습니까?</translation>
@@ -3341,7 +3335,6 @@
 <translation id="622537739776246443">프로필이 삭제됩니다</translation>
 <translation id="6225475702458870625">데이터 연결을 <ph name="PHONE_NAME" />에서 사용할 수 있습니다.</translation>
 <translation id="6226777517901268232">비공개 키 파일(선택사항)</translation>
-<translation id="6228516488918914827">페이지가 빠르게 로드됩니다</translation>
 <translation id="6228691855869374890">이 사이트는 MIDI 기기를 완전히 제어할 수 있습니다.</translation>
 <translation id="6229890768313448549">Google Play 서비스 약관을 로드할 수 없습니다. 다시 시도해 주세요.</translation>
 <translation id="6231881193380278751">검색어 매개변수를 URL에 추가하여 다음 페이지를 자동으로 새로고침하세요. chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3546,7 +3539,6 @@
 <translation id="6545665334409411530">반복 속도</translation>
 <translation id="6545834809683560467">예상 검색어 서비스를 사용하여 검색주소창 또는 앱 런처 검색창에 입력되는 검색어 및 URL을 더 빠르게 완성</translation>
 <translation id="6545867563032584178">Mac 시스템 환경설정에서 마이크가 사용 중지되었습니다</translation>
-<translation id="6547316139431024316">이 확장 프로그램에 대해 다시 경고하지 않음</translation>
 <translation id="6547354035488017500">최소 512MB의 저장 공간을 확보하지 않으면 기기가 응답하지 않을 것입니다. 저장 공간을 확보하려면 기기에서 파일을 삭제하세요.</translation>
 <translation id="6550675742724504774">옵션</translation>
 <translation id="6551508934388063976">명령어가 없습니다. 컨트롤 키와 N을 눌러 새 창을 여세요.</translation>
@@ -4677,7 +4669,6 @@
 <translation id="827097179112817503">홈 버튼 표시</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{북마크 1개가 삭제됨}other{북마크 #개가 삭제됨}}</translation>
 <translation id="8272443605911821513">'추가 도구' 메뉴에서 확장 프로그램을 클릭하여 확장 프로그램을 관리할 수 있습니다.</translation>
-<translation id="8272966760965438857">한곳에서 Google 계정을 관리하세요</translation>
 <translation id="8274332263553132018">파일 전송</translation>
 <translation id="8274924778568117936">업데이트가 완료될 때까지 <ph name="DEVICE_TYPE" />을(를) 끄거나 닫지 마세요. 설치가 완료되면 <ph name="DEVICE_TYPE" />이(가) 다시 시작됩니다.</translation>
 <translation id="8275038454117074363">가져오기</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index cd9fb9c..e47c9cd 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -338,6 +338,7 @@
     koreguokite <ph name="LINK_START" />įgaliotojo serverio nustatymus<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Vienintelis būdas tai anuliuoti yra iš naujo įdiegti „<ph name="IDS_SHORT_PRODUCT_OS_NAME" />“</translation>
 <translation id="151501797353681931">Importuota iš „Safari“</translation>
+<translation id="1515163294334130951">Paleidimas</translation>
 <translation id="1521442365706402292">Valdyti sertifikatus</translation>
 <translation id="152234381334907219">Niekada neišsaugota</translation>
 <translation id="1524430321211440688">Klaviatūra</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Garsiausiai</translation>
 <translation id="1673137583248014546"><ph name="URL" /> nori sužinoti jūsų saugos rakto tipą ir modelį</translation>
 <translation id="1679068421605151609">Kūrėjo įrankiai</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Tvarkymo paslauga išsiuntė HTTP klaidą.</translation>
 <translation id="1680849702532889074">Įdiegiant „Linux“ programą įvyko klaida.</translation>
 <translation id="16815041330799488">Neleisti svetainėms peržiūrėti teksto ir vaizdų, nukopijuotų į iškarpinę</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Naršymo istorija</translation>
 <translation id="2497229222757901769">Pelės greitis</translation>
 <translation id="2497852260688568942">Sinchronizavimą išjungė jūsų administratorius</translation>
-<translation id="249819058197909513">Daugiau nebeįspėti apie šią programą</translation>
 <translation id="2498539833203011245">Sumažinti</translation>
 <translation id="2498765460639677199">Milžiniškas</translation>
 <translation id="2499747912851752301">Eksportuojami slaptažodžiai...</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Prisijunkite prie „Wi-Fi“, kad pradėtumėte</translation>
 <translation id="2631120081682787498">Ar tikrai norite uždaryti šį skirtuką?</translation>
 <translation id="2631498379019108537">Rodyti įvesties parinktis lentynoje</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> naudoja <ph name="USAGE" /> MB disko vietos.</translation>
 <translation id="2633212996805280240">Pašalinti „<ph name="EXTENSION_NAME" />“?</translation>
 <translation id="263325223718984101">„<ph name="PRODUCT_NAME" />“ nepavyko baigti diegimo, bet ji toliau bus paleista iš disko vaizdo.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Atkurti</translation>
 <translation id="3158033540161634471">Piršto antspaudo nustatymas</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (atsarginė kopija sukurta aparatinėje įrangoje)</translation>
-<translation id="316125635462764134">Pašalinti programą</translation>
 <translation id="3161522574479303604">Visos kalbos</translation>
 <translation id="3163201441334626963">Nežinomas produktas „<ph name="PRODUCT_ID" />“ iš teikėjo „<ph name="VENDOR_ID" />“</translation>
 <translation id="3165390001037658081">Kai kurie operatoriai gali blokuoti šią funkciją.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Šio tipo failai gali pažeisti kompiuterį. Ar vis tiek norite palikti <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Pranešti išsamią informaciją „Google“</translation>
 <translation id="3919145445993746351">Jei norite naudoti plėtinius visuose kompiuteriuose, įjunkite sinchronizavimą</translation>
+<translation id="391999873395511996">Atsisiunčiamas virtualus įrenginys.</translation>
 <translation id="3920504717067627103">Sertifikato politika</translation>
 <translation id="392089482157167418">Įgalinti „ChromeVox“ (ekrano skaitymą balsu)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">nežinomų tiekėjų įrenginiai</translation>
 <translation id="3984159763196946143">Nepavyko paleisti demonstracinės būsenos</translation>
 <translation id="3984431586879874039">Leisti šiai svetainei peržiūrėti jūsų saugos raktą?</translation>
-<translation id="3987348946546879621">Išsaugoti duomenys</translation>
 <translation id="3987938432087324095">Deja, suprasti nepavyko.</translation>
 <translation id="3988996860813292272">Pasirinkite laiko juostą</translation>
 <translation id="399179161741278232">Importuota</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Asmens informacijos redagavimas</translation>
 <translation id="4042264909745389898">„Google Chrome“ OS sąlygos</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Išeiti iš puslapio}one{Išeiti iš puslapių}few{Išeiti iš puslapių}many{Išeiti iš puslapių}other{Išeiti iš puslapių}}</translation>
-<translation id="404299405565920089">Visas „Google“ paskyras, prie kurių prisijungta iš programų ir svetainių, galite tvarkyti čia. Jūsų leidimą turinčios programos ir svetainės gali pasiekti paskyros informaciją, kurios reikia, kad galėtų tinkamai veikti.</translation>
 <translation id="4044612648082411741">Įveskite sertifikato slaptažodį</translation>
 <translation id="404493185430269859">Numatytasis paieškos variklis</translation>
 <translation id="4046123991198612571">Kitas takelis</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Atidaryti nustatymus</translation>
 <translation id="4242577469625748426">Diegiant politikos nustatymus įrenginyje įvyko klaida: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Rasti daugiau rašiklio programų</translation>
-<translation id="424546999567421758">Aptiktas intensyvus disko naudojimas</translation>
 <translation id="424726838611654458">Visada atidaryti naudojant „Adobe Reader“</translation>
 <translation id="4247901771970415646">Negalima sinchronizuoti su <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Laukiama tinklo ryšio...</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Pūkuotasis</translation>
 <translation id="4422347585044846479">Redaguoti žymę šitam puslapiui</translation>
 <translation id="4423376891418188461">Atkurti nustatymus</translation>
-<translation id="4423482519432579560">&amp;Rašybos tikrinimas</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, jūsų administratoriui reikia pakeisti jūsų slaptažodį.</translation>
 <translation id="4430019312045809116">Apimtis</translation>
 <translation id="4430369329743628066">Žymė pridėta</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Dabar esate prisijungę prie „<ph name="SHORT_PRODUCT_NAME" />“. Žymės, istorija ir kiti nustatymai sinchronizuojami su „Google“ paskyra.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> nori atsisiųsti kelis failus</translation>
-<translation id="5192316339598592690">Sparčiai perjunkite paskyras ir prisijunkite iš karto prie visų programų ir svetainių.
-    Programose ir svetainėse gali būti prašoma jūsų leidimo naudoti tam tikrą „Google“ paskyros informaciją. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Vykdykite „Powerwash“ ir bandykite dar kartą.</translation>
 <translation id="5204967432542742771">Įveskite slaptažodį</translation>
 <translation id="5206215183583316675">Ištrinti „<ph name="CERTIFICATE_NAME" />“?</translation>
@@ -3344,7 +3338,6 @@
 <translation id="622537739776246443">Profilis bus ištrintas</translation>
 <translation id="6225475702458870625">Duomenų ryšys pasiekiamas iš „<ph name="PHONE_NAME" />“ telefono</translation>
 <translation id="6226777517901268232">Privataus rakto failas (pasirenkama)</translation>
-<translation id="6228516488918914827">Spartesnis puslapio įkėlimas</translation>
 <translation id="6228691855869374890">Ši svetainė visiškai valdo MIDI įrenginius.</translation>
 <translation id="6229890768313448549">Nepavyksta įkelti „Google Play“ paslaugų teikimo sąlygų. Bandykite dar kartą.</translation>
 <translation id="6231881193380278751">Kad puslapis būtų atnaujintas automatiškai, pridėkite šį užklausos parametrą prie URL: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3549,7 +3542,6 @@
 <translation id="6545665334409411530">Kartojimo dažnis</translation>
 <translation id="6545834809683560467">Naudoti numatymo paslaugą, padėsiančią užbaigti adreso juostoje arba programų paleidimo priemonės paieškos laukelyje įvedamus paieškos terminus ir URL adresus</translation>
 <translation id="6545867563032584178">Mikrofonas išjungtas „Mac“ sistemos nuostatose</translation>
-<translation id="6547316139431024316">Daugiau nebeįspėti apie šį plėtinį</translation>
 <translation id="6547354035488017500">Atlaisvinkite bent 512 MB vietos arba jūsų įrenginys nebeatsakys. Norėdami atlaisvinti vietos, ištrinkite failus iš įrenginio saugyklos.</translation>
 <translation id="6550675742724504774">Parinktys</translation>
 <translation id="6551508934388063976">Komanda negalima. Paspauskite „Control“ – N, kad atidarytumėte naują langą.</translation>
@@ -4680,7 +4672,6 @@
 <translation id="827097179112817503">Rodyti mygtuką „Pagrindinis“</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Ištrinta 1 žymė}one{Ištrinta # žymė}few{Ištrintos # žymės}many{Ištrinta # žymės}other{Ištrinta # žymių}}</translation>
 <translation id="8272443605911821513">Tvarkykite plėtinius meniu „Daugiau įrankių“ spustelėję „Plėtiniai“.</translation>
-<translation id="8272966760965438857">Tvarkykite „Google“ paskyras vienoje vietoje</translation>
 <translation id="8274332263553132018">Norimas perduoti failas</translation>
 <translation id="8274924778568117936">Neišjunkite ar neuždarykite „<ph name="DEVICE_TYPE" />“, kol atnaujinimo procesas nebus baigtas. Kai diegimo procesas baigsis, „<ph name="DEVICE_TYPE" />“ bus paleistas iš naujo.</translation>
 <translation id="8275038454117074363">Importuoti</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 1be32ee..3f0683d 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -338,6 +338,7 @@
     pielāgojiet <ph name="LINK_START" />starpniekservera iestatījumus<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Šo darbību var atsaukt, tikai atkārtoti instalējot <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importēts no Safari</translation>
+<translation id="1515163294334130951">Palaist</translation>
 <translation id="1521442365706402292">Pārvaldīt sertifikātus</translation>
 <translation id="152234381334907219">Jaunākie saglabātie</translation>
 <translation id="1524430321211440688">Tastatūra</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Visskaļāk</translation>
 <translation id="1673137583248014546">Vietne <ph name="URL" /> vēlas skatīt jūsu drošības atslēgas ražotāju un modeli.</translation>
 <translation id="1679068421605151609">Izstrādātāja rīki</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">No pārvaldības pakalpojuma tika nosūtīts kļūdains HTTP kods.</translation>
 <translation id="1680849702532889074">Linux lietojumprogrammas instalēšanas laikā radās kļūda.</translation>
 <translation id="16815041330799488">Neļaut vietnēm skatīt starpliktuvē kopēto tekstu un attēlus</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Pārlūkošanas vēsture</translation>
 <translation id="2497229222757901769">Peles ātrums</translation>
 <translation id="2497852260688568942">Administrators ir atspējojis sinhronizēšanu.</translation>
-<translation id="249819058197909513">Vairs nebrīdināt par šo lietotni</translation>
 <translation id="2498539833203011245">Minimizēt</translation>
 <translation id="2498765460639677199">Milzīgs</translation>
 <translation id="2499747912851752301">Notiek paroļu eksportēšana...</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Vispirms izveidojiet savienojumu ar Wi-Fi tīklu</translation>
 <translation id="2631120081682787498">Vai tiešām vēlaties aizvērt šo cilni?</translation>
 <translation id="2631498379019108537">Rādīt ievades iespējas plauktā</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> izmanto <ph name="USAGE" /> MB no diskā pieejamās vietas.</translation>
 <translation id="2633212996805280240">Vai noņemt paplašinājumu <ph name="EXTENSION_NAME" />?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> nevarēja pabeigt instalēšanu, tomēr turpinās izpildīties no diska attēla.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Atjaunot</translation>
 <translation id="3158033540161634471">Iestatiet pirksta nospiedumu</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (ar krātuvi aparatūrā)</translation>
-<translation id="316125635462764134">Noņemt lietotni</translation>
 <translation id="3161522574479303604">Visas valodas</translation>
 <translation id="3163201441334626963">Nezināms produkts (ID: <ph name="PRODUCT_ID" />), ko piedāvā <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Daļa mobilo sakaru operatoru var bloķēt šo funkciju.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Šāds faila tips var kaitēt jūsu datoram. Vai tiešām vēlaties saglabāt <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Nosūtīt informāciju uzņēmumam Google</translation>
 <translation id="3919145445993746351">Lai paplašinājumi būtu pieejami visos jūsu datoros, ieslēdziet sinhronizēšanu.</translation>
+<translation id="391999873395511996">Notiek virtuālās mašīnas lejupielāde.</translation>
 <translation id="3920504717067627103">Sertifikātu politika</translation>
 <translation id="392089482157167418">Iespējot ChromeVox (balss komentārus)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">ierīces, ko piedāvā nezināms ražotājs</translation>
 <translation id="3984159763196946143">Nevarēja sākt demonstrācijas režīmu</translation>
 <translation id="3984431586879874039">Vai atļaut šai vietnei skatīt jūsu drošības atslēgu?</translation>
-<translation id="3987348946546879621">Datu lietojums ir samazināts.</translation>
 <translation id="3987938432087324095">Diemžēl nav saprotams.</translation>
 <translation id="3988996860813292272">Laika joslas atlasīšana</translation>
 <translation id="399179161741278232">Importēts</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Personas informācijas rediģēšana</translation>
 <translation id="4042264909745389898">Google Chrome OS noteikumi</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Izejas lapa}zero{Izejas lapas}one{Izejas lapas}other{Izejas lapas}}</translation>
-<translation id="404299405565920089">Šeit varat pārvaldīt visus Google kontus, kuros esat pierakstījies lietotnēs un vietnēs. Lietotnes un vietnes, kurām ir piešķirta atļauja, var piekļūt konta informācijai, kas nepieciešama pareizai darbībai.</translation>
 <translation id="4044612648082411741">Ievadiet sertifikāta paroli</translation>
 <translation id="404493185430269859">Noklusējuma meklētājprogramma</translation>
 <translation id="4046123991198612571">Nākamais ieraksts</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Atvērt iestatījumus</translation>
 <translation id="4242577469625748426">Neizdevās ierīcē instalēt politikas iestatījumus: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Atrast citas skārienekrāna pildspalvas lietotnes</translation>
-<translation id="424546999567421758">Konstatēts apjomīgs diska lietojums</translation>
 <translation id="424726838611654458">Vienmēr atvērt programmā Adobe Reader</translation>
 <translation id="4247901771970415646">Nevar sinhronizēt ar lietotāju <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Tiek gaidīta savienojuma izveide ar tīklu...</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Minka</translation>
 <translation id="4422347585044846479">Rediģēt šīs lapas grāmatzīmes</translation>
 <translation id="4423376891418188461">Atjaunot iestatījumus</translation>
-<translation id="4423482519432579560">&amp;Pareizrakstības pārbaudītājs</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, jūsu administrators pieprasa paroles maiņu.</translation>
 <translation id="4430019312045809116">Skaļums</translation>
 <translation id="4430369329743628066">Grāmatzīme pievienota</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Šobrīd esat pierakstījies pakalpojumā <ph name="SHORT_PRODUCT_NAME" />. Jūsu grāmatzīmes, vēsture un citi iestatījumi tiek sinhronizēti ar jūsu Google kontu.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vēlas lejupielādēt vairākus failus</translation>
-<translation id="5192316339598592690">Ērti pārslēdziet kontus un pierakstieties lietotnēs un vietnēs vienuviet.
-    Lietotnēs un vietnēs var tikt lūgta jūsu atļauja izmantot daļu jūsu Google konta informācijas. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation>
 <translation id="5204673965307125349">Lūdzu, izpildiet ierīcei funkciju Powerwash un mēģiniet vēlreiz.</translation>
 <translation id="5204967432542742771">Ievadiet paroli</translation>
 <translation id="5206215183583316675">Vai dzēst “<ph name="CERTIFICATE_NAME" />”?</translation>
@@ -3343,7 +3337,6 @@
 <translation id="622537739776246443">Profiles tiks dzēsts</translation>
 <translation id="6225475702458870625">Ir pieejams datu savienojums no tālruņa <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Privātās atslēgas fails (neobligāti)</translation>
-<translation id="6228516488918914827">Ir ielādēta ātrākā lapa.</translation>
 <translation id="6228691855869374890">Šai vietnei ir pieejama MIDI ierīču pilnīga pārvaldība.</translation>
 <translation id="6229890768313448549">Google Play pakalpojumu sniegšanas noteikumus nevar ielādēt. Lūdzu, mēģiniet vēlreiz.</translation>
 <translation id="6231881193380278751">Vietrādī URL pievienojiet vaicājuma parametru, lai automātiski atsvaidzinātu lapu: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3541,6 @@
 <translation id="6545665334409411530">Atkārtošanas ātrums</translation>
 <translation id="6545834809683560467">Izmantot ieteikumus, lai ātrāk ievadītu meklēšanas frāzes un vietrāžus URL adreses joslā vai lietotņu palaidēja meklēšanas lodziņā.</translation>
 <translation id="6545867563032584178">Mikrofons ir izslēgts Mac sistēmas preferencēs</translation>
-<translation id="6547316139431024316">Vairs nebrīdināt par šo paplašinājumu</translation>
 <translation id="6547354035488017500">Atbrīvojiet vismaz 512 MB vietas ierīcē, pretējā gadījumā tā nereaģēs. Lai atbrīvotu vietu, izdzēsiet failus no ierīces krātuves.</translation>
 <translation id="6550675742724504774">Opcijas</translation>
 <translation id="6551508934388063976">Komanda nav pieejama. Nospiediet taustiņu kombināciju Control-N, lai atvērtu jaunu logu.</translation>
@@ -4678,7 +4670,6 @@
 <translation id="827097179112817503">Rādīt pogu Sākums</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Izdzēsta 1 grāmatzīme}zero{Izdzēstas # grāmatzīmes}one{Izdzēsta # grāmatzīme}other{Izdzēstas # grāmatzīmes}}</translation>
 <translation id="8272443605911821513">Pārvaldiet savus paplašinājumus, izvēlnē “Citi rīki” noklikšķinot uz Paplašinājumi.</translation>
-<translation id="8272966760965438857">Google kontu pārvaldība vienuviet</translation>
 <translation id="8274332263553132018">Apraidīt failu</translation>
 <translation id="8274924778568117936">Neizslēdziet un neaizveriet savu <ph name="DEVICE_TYPE" /> ierīci, kamēr notiek atjaunināšana. Pēc instalēšanas pabeigšanas jūsu <ph name="DEVICE_TYPE" /> ierīce tiks restartēta.</translation>
 <translation id="8275038454117074363">Importēt</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index cdd7159..0dc9ef53 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">നിങ്ങൾ ഒരു പ്രോക്‌സി സെർവർ  ഉപയോഗിക്കുകയാണെങ്കിൽ, പ്രോക്‌സി സെർവർ പ്രവർത്തനക്ഷമമാണെന്ന് ഉറപ്പുവരുത്തുന്നതിന് നിങ്ങളുടെ പ്രോക്‌സി ക്രമീകരണങ്ങൾ പരിശോധിക്കുകയോ നിങ്ങളുടെ നെറ്റ്‌വർക്ക് അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുകയോ ചെയ്യുക. നിങ്ങൾ ഉപയോഗിക്കുന്നത് ഒരു പ്രോക്‌സി സെർവറാണെന്ന് കരുതുന്നില്ലെങ്കിൽ, നിങ്ങളുടെ <ph name="LINK_START" />പ്രോക്‌സി ക്രമീകരണങ്ങൾ<ph name="LINK_END" /> ക്രമീകരിക്കുക.</translation>
 <translation id="1512210426710821809"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> വീണ്ടും ഇൻസ്‌റ്റാൾ ചെയ്യുന്നതിലൂടെ മാത്രമേ ഇത് പഴയപടിയാക്കാനാകൂ</translation>
 <translation id="151501797353681931">Safari യില്‍‌ നിന്നും ഇറക്കുമതി ചെയ്‌തത്</translation>
+<translation id="1515163294334130951">ലോഞ്ച്</translation>
 <translation id="1521442365706402292">സര്‍ട്ടിഫിക്കറ്റുകള്‍ മാനേജ് ചെയ്യുക</translation>
 <translation id="152234381334907219">ഒരിക്കലും സംരക്ഷിച്ചില്ല</translation>
 <translation id="1524430321211440688">കീബോർഡ്</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">ഏറ്റവും ശബ്‌ദതീവ്രത</translation>
 <translation id="1673137583248014546">നിങ്ങളുടെ സുരക്ഷാ കീയുടെ മെയ്‌ക്കും മോഡലും കാണാൻ <ph name="URL" /> ആഗ്രഹിക്കുന്നു</translation>
 <translation id="1679068421605151609">ഡെവലപ്പർ ഉപകരണങ്ങൾ</translation>
+<translation id="1679806121152819234">പ്ലഗിൻ VM</translation>
 <translation id="167983332380191032">മാനേജ്‌മെന്റ് സേവനം, HTTP പിശക് അയച്ചു.</translation>
 <translation id="1680849702532889074">നിങ്ങളുടെ Linux ആപ്ലിക്കേഷൻ ഇൻസ്‌റ്റാൾ ചെയ്യുമ്പോൾ ഒരു പിശക് സംഭവിച്ചു.</translation>
 <translation id="16815041330799488">ക്ലിപ്പ്‌ബോർഡിലേക്ക് പകർത്തിയിട്ടുള്ള ടെക്‌സ്‌റ്റുകളും ചിത്രങ്ങളും കാണാൻ സൈറ്റുകളെ അനുവദിക്കരുത്</translation>
@@ -799,7 +801,7 @@
 <translation id="2241053333139545397">നിരവധി വെബ്‌സൈറ്റുകളിലെ നിങ്ങളുടെ ഡാറ്റ വായിക്കുക, മാറ്റുക</translation>
 <translation id="2241634353105152135">ഒരിക്കൽ മാത്രം</translation>
 <translation id="2242687258748107519">ഫയൽ വിവരം</translation>
-<translation id="2246549592927364792">Google-ൽ നിന്ന് ചിത്ര വിവരണങ്ങൾ ലഭിക്കണോ?</translation>
+<translation id="2246549592927364792">Google-ൽ നിന്ന് ചിത്ര വിവരണങ്ങൾ നേടണോ?</translation>
 <translation id="224940702122312781">ഈ പേജ് ധാരാളം ഡാറ്റ ഉപയോഗിക്കും.</translation>
 <translation id="2249605167705922988">ഉദാ. 1-5, 8, 11-13</translation>
 <translation id="2251218783371366160">സിസ്റ്റം വ്യൂവർ ഉപയോഗിച്ച് തുറക്കുക</translation>
@@ -901,7 +903,7 @@
 <translation id="2408955596600435184">നിങ്ങളുടെ പിൻ നൽകുക</translation>
 <translation id="241082044617551207">അജ്ഞാത പ്ലഗ് ഇൻ</translation>
 <translation id="2413749388954403953">ബുക്ക്മാർക്കുകളുടെ ഉപയോക്തൃ ഇന്റർഫേസ് മാറ്റുക</translation>
-<translation id="241639282915300771">നിലവിൽ <ph name="CONTAINER_ID" /> എന്നതിന്റെ പുനഃസ്ഥാപിക്കൽ പുരോഗമിക്കുന്നു</translation>
+<translation id="241639282915300771">നിലവിൽ <ph name="CONTAINER_ID" /> എന്നതിൻ്റെ പുനഃസ്ഥാപിക്കൽ പുരോഗമിക്കുന്നു</translation>
 <translation id="241727068219398187"><ph name="TIME" /> മുതലുള്ള ഡാറ്റ നിങ്ങളുടെ Google പാസ്‌വേഡ് ഉപയോഗിച്ച് എൻക്രി‌പ്‌റ്റ് ചെയ്‌തു.
           ഇതിൽ Google Pay-ൽ നിന്നുള്ള പേയ്മെന്‍റ് രീതികളും വിലാസങ്ങളും അടങ്ങുന്നില്ല.</translation>
 <translation id="2419706071571366386">സുരക്ഷയ്ക്കായി, നിങ്ങളുടെ കമ്പ്യൂട്ടർ ഉപയോഗിക്കാത്തപ്പോൾ സൈൻ ഔട്ട് ചെയ്യുക.</translation>
@@ -960,7 +962,6 @@
 <translation id="2496180316473517155">ബ്രൌസിംഗ് ചരിത്രം</translation>
 <translation id="2497229222757901769">മൗസിന്റെ വേഗത</translation>
 <translation id="2497852260688568942">നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർ സമന്വയിപ്പിക്കൽ പ്രവർത്തനരഹിതമാക്കി</translation>
-<translation id="249819058197909513">ഈ ആപ്പിനുവേണ്ടി വീണ്ടും മുന്നറിയിപ്പ് നൽകരുത്</translation>
 <translation id="2498539833203011245">ചെറുതാക്കുക</translation>
 <translation id="2498765460639677199">ബൃഹത്തായ</translation>
 <translation id="2499747912851752301">പാസ്‌വേഡുകൾ എക്‌സ്‌പോർട്ട് ചെയ്യുന്നു...</translation>
@@ -1048,7 +1049,6 @@
 <translation id="2630681426381349926">ആരംഭിക്കുന്നതിന് Wi-Fi-യിലേക്ക് ബന്ധിപ്പിക്കുക</translation>
 <translation id="2631120081682787498">ഈ ടാബ് അവസാനിപ്പിക്കണമെന്ന് തീർച്ചയാണോ?</translation>
 <translation id="2631498379019108537">ഷെൽഫിൽ ഇൻപുട്ട് ഓപ്‌ഷനുകൾ കാണിക്കുക</translation>
-<translation id="2633199387167390344"><ph name="NAME" />, ഡിസ്‌ക് ഇടത്തിന്‍റെ <ph name="USAGE" /> MB ഉപയോഗിക്കുന്നു.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" നീക്കംചെയ്യണോ?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> എന്നതിന് ഇൻസ്‌റ്റാൾ ചെയ്യുന്നത് പൂർത്തിയാക്കാനായില്ല, പക്ഷെ അതിന്റെ ഡിസ്ക് ചിത്രത്തിൽ നിന്ന് പ്രവർത്തിക്കുന്നത് തുടരും.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1106,7 +1106,7 @@
 <translation id="271033894570825754">പുതിയത്</translation>
 <translation id="2714393097308983682">Google Play സ്‌റ്റോർ</translation>
 <translation id="2715751256863167692">ഈ അപ്‍ഗ്രേഡ്, നിങ്ങളുടെ Chromebook-നെ പുനഃസജ്ജീകരിച്ച് നിലവിലെ ഉപയോക്തൃ ഡാറ്റ നീക്കുന്നു.</translation>
-<translation id="2716986496990888774">രക്ഷിതാവാണ് ഈ ക്രമീകരണം മാനേജ് ചെയ്യുന്നത്.</translation>
+<translation id="2716986496990888774">ഈ ക്രമീകരണം മാനേജ് ചെയ്യുന്നത് ഒരു രക്ഷിതാവാണ്.</translation>
 <translation id="2718395828230677721">നൈറ്റ് ലൈറ്റ്</translation>
 <translation id="2718998670920917754">ആന്റി വൈറസ് സോഫ്റ്റ്‌വെയർ ഒരു വൈറസിനെ കണ്ടെത്തി.</translation>
 <translation id="2719936478972253983">ഇനിപ്പറയുന്ന കുക്കികളെ ബ്ലോക്ക് ചെയ്‌തു</translation>
@@ -1394,7 +1394,6 @@
 <translation id="3157931365184549694">പുനഃസ്ഥാപിക്കുക</translation>
 <translation id="3158033540161634471">നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് സജ്ജമാക്കുക</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (ഹാർഡ്‌വെയർ പിന്തുണയുള്ളത്)</translation>
-<translation id="316125635462764134">അപ്ലിക്കേഷൻ നിക്കം ചെയ്യുക</translation>
 <translation id="3161522574479303604">എല്ലാ ഭാഷകളും</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> വെൻഡറിൽ നിന്നുള്ള അജ്ഞാത ഉൽപ്പന്നം <ph name="PRODUCT_ID" /></translation>
 <translation id="3165390001037658081">ചില സേവനദായകർ ഈ ഫീച്ചർ ബ്ലോക്കുചെയ്‌തേക്കും.</translation>
@@ -1710,7 +1709,7 @@
 <translation id="3664511988987167893">വിപുലീകരണ ഐക്കൺ</translation>
 <translation id="3665589677786828986">മറ്റൊരു പ്രോഗ്രാം നിങ്ങളുടെ ചില ക്രമീകരണങ്ങൾക്ക് കേടുവരുത്തി അവയുടെ യഥാർത്ഥ സ്ഥിര ക്രമീകരണങ്ങളിലേക്ക് അവ പുനഃസജ്ജമാക്കിയതായി Chrome കണ്ടെത്തി.</translation>
 <translation id="3668570675727296296">ഭാഷാ ക്രമീകരണങ്ങൾ</translation>
-<translation id="366867565525278777">സ്‌റ്റോറേജ് സ്പേസ് ഇല്ലാത്തതിനാൽ ഇൻസ്‌റ്റാൾ ചെയ്യാനായില്ല. <ph name="INSTALL_SIZE" /> എങ്കിലും ഇടം വേണം. ഇടം സൃഷ്‌ടിക്കാൻ, ഉപകരണ സ്റ്റോറേജിൽ നിന്ന് ഫയലുകൾ ഇല്ലാതാക്കുക.</translation>
+<translation id="366867565525278777">സ്‌റ്റോറേജ് സ്പേസ് ഇല്ലാത്തതിനാൽ ഇൻസ്‌റ്റാൾ ചെയ്യാനായില്ല. <ph name="INSTALL_SIZE" /> എങ്കിലും ഇടം വേണം. ഇടം സൃഷ്‌ടിക്കാൻ ഉപകരണ സ്റ്റോറേജിൽ നിന്ന് ഫയലുകൾ ഇല്ലാതാക്കുക.</translation>
 <translation id="3668801437375206837">Bluetooth-മായി ബന്ധപ്പെട്ട പ്രശ്‌നങ്ങൾ കൂടുതൽ നന്നായി തിരിച്ചറിയുന്നതിന്, Googlers-ന് അവരുടെ ഫീഡ്ബാക്ക് റിപ്പോർട്ടുകൾക്കൊപ്പം അധിക Bluetooth ലോഗുകൾ ഉൾപ്പെടുത്താം. ഈ ഓപ്ഷൻ ചെക്ക് ചെയ്‌തിട്ടുണ്ടെങ്കിൽ, നിലവിലെ സെഷനിൽ നിന്നുള്ള btsnoop, HCI ലോഗുകൾ നിങ്ങളുടെ റിപ്പോർട്ടിൽ ഉൾപ്പെടും, പരമാവധി PII നീക്കം ചെയ്യാനായി പരിഷ്ക്കരിച്ചതാണ് ഇത്. ഈ ലോഗുകളിലേക്കുള്ള ആക്‌സസ്, Listnr-ലെ Chrome OS ഉൽപ്പന്ന ഗ്രൂപ്പിലുള്ള മാനേജർമാർക്ക് മാത്രമായി പരിമിതപ്പെടുത്തും. 90 ദിവസത്തിന് ശേഷം ലോഗുകൾ ശുദ്ധീകരിക്കും.</translation>
 <translation id="3668823961463113931">ഹാന്‍ഡ്‌ലറുകള്‍</translation>
 <translation id="3670113805793654926">ഏത് വെൻഡറിൽ നിന്നുമുള്ള ഉപകരണങ്ങൾ</translation>
@@ -1787,7 +1786,7 @@
 <translation id="3765246971671567135">ഓഫ്‌ലൈൻ ഡെമോ മോഡ് നയം വായിക്കാനായില്ല.</translation>
 <translation id="3766223500670287046">റിമോട്ട് സ്ക്രീൻ</translation>
 <translation id="3768037234834996183">നിങ്ങളുടെ മുൻഗണനകൾ സമന്വയിപ്പിക്കുന്നു...</translation>
-<translation id="377050016711188788">ഐസ്‌ക്രീം</translation>
+<translation id="377050016711188788">ഐസ്ക്രീം</translation>
 <translation id="3771294271822695279">വീഡിയോ ഫയലുകള്‍</translation>
 <translation id="3775432569830822555">SSL സെര്‍വര്‍ സര്‍‌ട്ടിഫിക്കറ്റ്</translation>
 <translation id="3775705724665058594">നിങ്ങളുടെ ഉപകരണങ്ങളിലേക്ക് അയയ്‌ക്കുക</translation>
@@ -1895,6 +1894,7 @@
 <translation id="3916445069167113093">നിങ്ങളുടെ കമ്പ്യൂട്ടറിനെ ഇത്തരത്തിലുള്ള ഫയൽ ദ്രോഹിച്ചേക്കാം. <ph name="FILE_NAME" /> എന്നത് എന്തായാലും സൂക്ഷിക്കണമെന്നത് തീർച്ചയാണോ?</translation>
 <translation id="3918972485393593704">വിശദാംശങ്ങൾ Google-ന് റിപ്പോർട്ടുചെയ്യുക</translation>
 <translation id="3919145445993746351">എല്ലാ കമ്പ്യൂട്ടറുകളിലും നിങ്ങളുടെ വിപുലീകരണങ്ങൾ ലഭിക്കാൻ, സമന്വയം ഓണാക്കുക</translation>
+<translation id="391999873395511996">വെർച്വൽ മെഷീൻ ഡൗൺലോഡ് ചെയ്യുന്നു.</translation>
 <translation id="3920504717067627103">സര്‍‌ട്ടിഫിക്കറ്റ് നയങ്ങള്‍‌</translation>
 <translation id="392089482157167418">ChromeVox (സ്‌പോക്കൺ ഫീഡ്‌ബാക്ക്) പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1945,7 +1945,6 @@
 <translation id="3983586614702900908">അജ്ഞാത വെണ്ടറിൽ നിന്നുള്ള ഉപകരണങ്ങൾ</translation>
 <translation id="3984159763196946143">ഡെമോ മോഡ് ആരംഭിക്കാനായില്ല</translation>
 <translation id="3984431586879874039">നിങ്ങളുടെ സുരക്ഷാ കീ കാണാൻ ഈ സൈറ്റിനെ അനുവദിക്കണോ?</translation>
-<translation id="3987348946546879621">ഡാറ്റ ലാഭിച്ചു</translation>
 <translation id="3987938432087324095">ക്ഷമിക്കണം, അത് മനസ്സിലായില്ല.</translation>
 <translation id="3988996860813292272">സമയ മേഖല തിരഞ്ഞെടുക്കുക</translation>
 <translation id="399179161741278232">ഇറക്കുമതിചെയ്തു</translation>
@@ -1976,7 +1975,6 @@
 <translation id="4037889604535939429">വ്യക്തിയെ എഡിറ്റുചെയ്യുക</translation>
 <translation id="4042264909745389898">Google Chrome OS നിബന്ധനകൾ</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{പേജിൽ നിന്ന് പുറത്തുകടക്കുക}other{പേജുകളിൽ നിന്ന് പുറത്തുകടക്കുക}}</translation>
-<translation id="404299405565920089">ആപ്പുകളിൽ നിന്നും വെബ്‌സൈറ്റുകളിൽ നിന്നും സൈൻ ഇൻ ചെയ്‌തിരിക്കുന്ന നിങ്ങളുടെ എല്ലാ Google അക്കൗണ്ടുകളും ഇവിടെ മാനേജ് ചെയ്യാം. നിങ്ങളുടെ അനുമതിയുള്ള ആപ്പുകൾക്കും വെബ്‌സൈറ്റുകൾക്കും അവയുടെ ശരിയായ പ്രവർത്തനത്തിന് ആവശ്യമായ അക്കൗണ്ട് വിവരങ്ങൾ ആക്‌സസ് ചെയ്യാനാവും.</translation>
 <translation id="4044612648082411741">നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് പാസ്‌വേഡ് നൽകുക</translation>
 <translation id="404493185430269859">ഡിഫോൾട്ട് തിരയൽ എൻജിൻ</translation>
 <translation id="4046123991198612571">അടുത്ത ട്രാക്ക്</translation>
@@ -2091,7 +2089,6 @@
 <translation id="4242533952199664413">ക്രമീകരണം തുറക്കുക</translation>
 <translation id="4242577469625748426">ഉപകരണത്തിൽ നയ ക്രമീകരണങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">കൂടുതൽ സ്‌റ്റൈലസ് ആപ്പുകൾ കാണുക</translation>
-<translation id="424546999567421758">ഉയർന്ന ഡിസ്‌ക് ഉപയോഗം കണ്ടെത്തി</translation>
 <translation id="424726838611654458">എപ്പോഴും Adobe Reader-ൽ തുറക്കുക</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" /> എന്ന ഉപയോക്താവിലേക്ക് സമന്വയിപ്പിക്കാനാവില്ല</translation>
 <translation id="4249248555939881673">നെറ്റ്‌വർക്ക് കണക്ഷനുവേണ്ടി കാത്തിരിക്കുന്നു...</translation>
@@ -2199,7 +2196,6 @@
 <translation id="4421932782753506458">ഫ്ലഫി</translation>
 <translation id="4422347585044846479">ഈ പേജിനാ‍യി ബുക്മാര്‍ക്ക് എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="4423376891418188461">ക്രമീകരണം പുനഃസ്ഥാപിക്കുക</translation>
-<translation id="4423482519432579560">&amp;അക്ഷരത്തെറ്റ് പരിശോധന</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, അഡ്‌മിനിസ്‌ട്രേറ്റർ നിങ്ങളുടെ പാസ്‌വേഡ് മാറ്റാൻ ആവശ്യപ്പെടുന്നു.</translation>
 <translation id="4430019312045809116">അളവ്</translation>
 <translation id="4430369329743628066">ബുക്ക്‌മാർക്ക് ചേർത്തു</translation>
@@ -2252,6 +2248,7 @@
 <translation id="4524832533047962394">വിതരണം ചെയ്‌ത എൻറോൾമെന്റ് മോഡിനെ ഓപ്പറേറ്റിംഗ് സിസ്‌റ്റത്തിന്റെ ഈ പതിപ്പ് പിന്തുണയ്‌ക്കുന്നില്ല. ഏറ്റവും പുതിയ പതിപ്പിലാണ് നിങ്ങൾ പ്രവർത്തിക്കുന്നതെന്ന് ഉറപ്പാക്കുക.</translation>
 <translation id="4525382759303819021">Play സ്‌റ്റോർ ആപ്പുകളെക്കുറിച്ചുള്ള ഏറ്റവും പുതിയ അപ്‌ഡേറ്റുകളും ശുപാർശകളും നേടുക</translation>
 <translation id="4530494379350999373">ഉറവിടം</translation>
+<translation id="4532646538815530781">ഈ സൈറ്റ് ചലന സെൻസറുകൾ ഉപയോഗിക്കുന്നു.</translation>
 <translation id="4533846798469727141">ഇപ്പോൾ "Hey Google" എന്ന് പറയൂ</translation>
 <translation id="4533985347672295764">CPU സമയം</translation>
 <translation id="4534661889221639075">വീണ്ടും ശ്രമിക്കുക.</translation>
@@ -2484,6 +2481,7 @@
 <translation id="4892229439761351791">സൈറ്റിന് Bluetooth ഉപയോഗിക്കാനാവും</translation>
 <translation id="4893336867552636863">ഇത് ഈ ഉപകരണത്തിൽ നിന്നും നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റയെ ശാശ്വതമായി ഇല്ലാതാക്കും.</translation>
 <translation id="4893522937062257019">ലോക്ക് സ്ക്രീനിൽ</translation>
+<translation id="489454699928748701">ചലന സെൻസറുകൾ ഉപയോഗിക്കാൻ സൈറ്റുകളെ അനുവദിക്കുക</translation>
 <translation id="4898011734382862273">"<ph name="CERTIFICATE_NAME" />" സർട്ടിഫിക്കറ്റ് ഒരു സർട്ടിഫിക്കേഷൻ അതോറിറ്റിയെ പ്രതിനിധീകരിക്കുന്നു</translation>
 <translation id="489985760463306091">ദോഷകരമായ സോഫ്‌റ്റ്‌വയർ നീക്കംചെയ്യുന്നത് പൂർത്തിയാക്കാൻ, നിങ്ങളുടെ കമ്പ്യൂട്ടർ പുനരാരംഭിക്കുക</translation>
 <translation id="4900392736118574277">നിങ്ങളുടെ ആരംഭ പേജിനെ <ph name="URL" /> എന്നതിലേക്ക് മാറ്റിയിരിക്കുന്നു.</translation>
@@ -2657,8 +2655,6 @@
 <translation id="5187295959347858724">നിങ്ങൾ ഇപ്പോൾ <ph name="SHORT_PRODUCT_NAME" />-ൽ പ്രവേശിച്ചു. നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ, ചരിത്രം, മറ്റ് ക്രമീകരണം എന്നിവയെല്ലാം നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നു.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" />, ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു</translation>
-<translation id="5192316339598592690">അക്കൗണ്ടുകൾ എളുപ്പത്തിൽ മാറുക, ആപ്പുകളിലേക്കും വെബ്‌സൈറ്റുകളിലേക്കും പെട്ടന്ന് സൈൻ ഇൻ ചെയ്യുക.
-    നിങ്ങളുടെ Google അക്കൗണ്ട് വിവരങ്ങളിൽ ചിലത് ഉപയോഗിക്കാനുള്ള അനുമതി ചോദിക്കാൻ ആപ്പുകൾക്കും സൈറ്റുകൾക്കും കഴിയും. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">ഉപകരണം Powerwash ചെയ്‌ത ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5204967432542742771">പാസ്‌വേഡ് നല്‍കുക</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ഇല്ലാതാക്കണോ?</translation>
@@ -2947,6 +2943,7 @@
 <translation id="5620568081365989559"><ph name="FOLDER_PATH" />-ലേക്ക് DevTools പൂർണ്ണമായ ആക്‌സസ് അഭ്യർത്ഥിക്കുന്നു. സെൻസിറ്റീവായ വിവരങ്ങളൊന്നും തന്നെ വെളിപ്പെടുത്തുന്നില്ലെന്ന് ഉറപ്പാക്കുക.</translation>
 <translation id="5620612546311710611">ഉപയോഗ സ്ഥിതിവിവരക്കണക്കുകൾ</translation>
 <translation id="5620655347161642930">പാസ്‌വേഡുകൾ എക്‌സ്‌പോർട്ട് ചെയ്യുക...</translation>
+<translation id="5623282979409330487">ഈ സൈറ്റ് നിങ്ങളുടെ ചലന സെൻസറുകൾ ഉപയോഗിക്കുന്നു.</translation>
 <translation id="5623842676595125836">ലോഗ്</translation>
 <translation id="5624120631404540903">പാസ്‌വേഡുകൾ നിയന്ത്രിക്കുക</translation>
 <translation id="5626134646977739690">നാമം:</translation>
@@ -3338,7 +3335,6 @@
 <translation id="622537739776246443">പ്രൊഫൈല്‍ ഇല്ലാതാക്കപ്പെടും</translation>
 <translation id="6225475702458870625"><ph name="PHONE_NAME" /> എന്ന പേരുള്ള ഫോണിൽ നിന്ന് ലഭ്യമായ ഡാറ്റാ കണക്ഷൻ</translation>
 <translation id="6226777517901268232">സ്വകാര്യ കീ ഫയല്‍‌ (ഓപ്‌ഷണൽ)</translation>
-<translation id="6228516488918914827">പേജ് വേഗത്തിൽ ലോഡ് ചെയ്‌തു</translation>
 <translation id="6228691855869374890">ഈ സൈറ്റിന് MIDI ഉപകരണങ്ങളുടെ പൂർണ്ണ നിയന്ത്രണമുണ്ട്.</translation>
 <translation id="6229890768313448549">Google Play സേവന നിബന്ധനകൾ ലോഡ് ചെയ്യാനാവില്ല. വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="6231881193380278751">പേജ് സ്വയമേവ പുതുക്കുന്നതിന് URL-ൽ ചോദ്യ param ചേർക്കുക: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3442,6 +3438,7 @@
 <translation id="6390994422085833176">സജ്ജീകരണത്തിന് ശേഷം സമന്വയിപ്പിക്കൽ, വ്യക്തിഗതമാക്കൽ ഫീച്ചറുകൾ അവലോകനം ചെയ്യുക</translation>
 <translation id="6393156038355142111">ശക്തമായ പാസ്‌വേഡ് നിർദ്ദേശിക്കുക</translation>
 <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />സിസ്റ്റം വിവരങ്ങളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />മെട്രിക്‌സും<ph name="END_LINK2" /> അയയ്‌ക്കുക</translation>
+<translation id="6396988158856674517">ചലന സെൻസറുകൾ ഉപയോഗിക്കുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="6397094776139756010">സമന്വയവും വ്യക്തിപരമാക്കലും ഓപ്‌ഷനുകൾ</translation>
 <translation id="6398715114293939307">Google Play സ്‌റ്റോർ നീക്കംചെയ്യുക</translation>
 <translation id="6398765197997659313">പൂര്‍ണ്ണ സ്ക്രീനില്‍ നിന്ന് പുറത്തുകടക്കുക</translation>
@@ -3536,16 +3533,16 @@
 <translation id="6531282281159901044">അപകടകരമായ ഫയൽ സൂക്ഷിക്കുക</translation>
 <translation id="6532101170117367231">Google ഡ്രൈവിൽ സംരക്ഷിക്കുക</translation>
 <translation id="654039047105555694"><ph name="BEGIN_BOLD" />ശ്രദ്ധിക്കുക:<ph name="END_BOLD" /> ഡാറ്റയുടെ ശേഖരം പ്രകടനത്തെ കുറയ്‌ക്കുമെന്നതിനാൽ, ചെയ്യുന്നതെന്താണെന്ന് നിങ്ങൾക്ക് അറിയാമെങ്കിലോ അങ്ങനെ ചെയ്യാൻ നിങ്ങൾ ആവശ്യപ്പെട്ടാലോ മാത്രമേ പ്രവർത്തനക്ഷമമാക്കൂ.</translation>
+<translation id="6541638731489116978">നിങ്ങളുടെ ചലന സെൻസറുകൾ ആക്‌സസ് ചെയ്യുന്നതിൽ നിന്ന് ഈ സൈറ്റിനെ ബ്ലോക്ക് ചെയ്‌തിരിക്കുന്നു.</translation>
 <translation id="654233263479157500">നാവിഗേഷന്‍ പിശകുകള്‍ പരിഹരിക്കുന്നതിന് ഒരു വെബ് സേവനം ഉപയോഗിക്കുക</translation>
 <translation id="6544215763872433504">Google-ൽ നിന്ന് നിങ്ങൾക്കുള്ള വെബ് ബ്രൗസർ</translation>
 <translation id="6545665334409411530">ആവർത്തന നിരക്ക്</translation>
 <translation id="6545834809683560467">തിരയലുകളും ഒരു വിലാസ ബാറിലോ അപ്ലിക്കേഷൻ ലോഞ്ചർ തിരയൽ ബോക്‌സിലോ ടൈപ്പ് ചെ‌യ്‌തിരിക്കുന്ന URL കളും പൂര്‍ത്തിയാക്കാൻ ഒരു പ്രവചന സേവനം ഉപയോഗിക്കുക</translation>
 <translation id="6545867563032584178">Mac സിസ്‌റ്റം മുൻഗണനകളിൽ മൈക്രോഫോൺ ഓഫാക്കി</translation>
-<translation id="6547316139431024316">ഈ വിപുലീകരണത്തിന് വീണ്ടും മുന്നറിയിപ്പ് നൽകരുത്</translation>
 <translation id="6547354035488017500">512 MB ഇടമെങ്കിലും സൃഷ്‌ടിച്ചില്ലെങ്കിൽ നിങ്ങളുടെ ഉപകരണം പ്രതികരിക്കില്ല. ഇടം സൃഷ്‌ടിക്കാൻ, ഉപകരണ സ്‌റ്റോറേജിൽ നിന്ന് ഫയലുകൾ ഇല്ലാതാക്കുക.</translation>
 <translation id="6550675742724504774">ഓപ്ഷനുകൾ</translation>
 <translation id="6551508934388063976">കമാൻഡ് ലഭ്യമല്ല. പുതിയ വിൻഡോ തുറക്കാൻ control-N അമർത്തുക.</translation>
-<translation id="6551612971599078809">സൈറ്റ് USB ഉപയോഗിക്കുന്നു</translation>
+<translation id="6551612971599078809">സൈറ്റ് USB ഉപയോഗിക്കുന്നുണ്ട്</translation>
 <translation id="655384502888039633"><ph name="USER_COUNT" /> ഉപയോക്താക്കള്‍</translation>
 <translation id="655483977608336153">വീണ്ടും ശ്രമിക്കുക</translation>
 <translation id="6555432686520421228">എല്ലാ ഉപയോക്തൃ അക്കൗണ്ടുകളും നീക്കം ചെയ്‌ത് നിങ്ങളുടെ <ph name="IDS_SHORT_PRODUCT_NAME" /> ഉപകരണം പുതിയതുപോലെ റീസെറ്റ് ചെയ്യുക.</translation>
@@ -3769,7 +3766,7 @@
 <translation id="692114467174262153"><ph name="ALTERNATIVE_BROWSER_NAME" /> തുറക്കാനായില്ല</translation>
 <translation id="6921709132208495314">ഈ പേജിൽ ഡാറ്റ ഉപയോഗിക്കുന്നത് നിർത്തുക</translation>
 <translation id="6922128026973287222">Google ഡാറ്റ സേവർ ഉപയോഗിച്ച് വിവരം സംരക്ഷിച്ച് വേഗത്തിൽ ബ്രൗസ് ചെയ്യുക. കൂടുതലറിയാൻ ക്ലിക്ക് ചെയ്യുക.</translation>
-<translation id="6922745772873733498">അച്ചടിക്കാൻ ഒരു പിൻ നൽകുക</translation>
+<translation id="6922745772873733498">പ്രിൻ്റ് ചെയ്യാൻ ഒരു പിൻ നൽകുക</translation>
 <translation id="6923132443355966645">സ്ക്രോൾ ചെയ്യുക / ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="6923633482430812883">പങ്കിടൽ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. നിങ്ങൾ കണക്‌റ്റ് ചെയ്യുന്ന ഫയൽ സെർവർ SMBv2 അല്ലെങ്കിൽ അതിന് ശേഷമുള്ളത് പിന്തുണയ്‌ക്കുന്നു എന്ന് പരിശോധിക്കുക.</translation>
 <translation id="6930036377490597025">ബാഹ്യ സുരക്ഷാ കീ അല്ലെങ്കിൽ അന്തർനിർ‌മ്മിത സെൻസർ</translation>
@@ -3865,7 +3862,7 @@
 <translation id="706626672220389329">പങ്കിടൽ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. നിർദ്ദിഷ്‌ട പങ്കിടൽ മുമ്പേ മൗണ്ട് ചെയ്‌തിട്ടുണ്ട്.</translation>
 <translation id="7066944511817949584">"<ph name="DEVICE_NAME" />" എന്നതിലേക്ക് കണക്റ്റുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു.</translation>
 <translation id="7067725467529581407">ഇത് വീണ്ടും കണിക്കരുത്.</translation>
-<translation id="7069811530847688087"><ph name="WEBSITE" />-ന് പുതിയതോ വ്യത്യസ്‌ത തരത്തിലുള്ളതോ ആയ സുരക്ഷാ കീ ആവശ്യമായേക്കാം</translation>
+<translation id="7069811530847688087"><ph name="WEBSITE" />-ന് പുതിയതോ മറ്റൊരു തരത്തിലുള്ളതോ ആയ സുരക്ഷാ കീ ആവശ്യമായേക്കാം</translation>
 <translation id="7070484045139057854">ഇതിന് സൈറ്റ് ഡാറ്റ വായിക്കാനും മാറ്റാനുമാവും</translation>
 <translation id="7072010813301522126">കുറുക്കുവഴിയുടെ പേര്</translation>
 <translation id="707392107419594760">നിങ്ങളുടെ കീബോര്‍ഡ് തിരഞ്ഞെടുക്കുക :</translation>
@@ -4275,6 +4272,7 @@
 <translation id="7704628569466676326">നിങ്ങളുടെ അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ ഉപയോഗിക്കുന്നതിന് ഈ ഉപകരണവുമായി സുരക്ഷാ കീ ജോടിയാക്കുക</translation>
 <translation id="7705276765467986571">ബുക്ക്‌മാര്‍ക്ക് മോഡല്‍ ലോഡ് ചെയ്യാന്‍ കഴിഞ്ഞില്ല.</translation>
 <translation id="7705524343798198388">VPN</translation>
+<translation id="7707108266051544351">ചലന സെൻസറുകൾ ആക്‌സസ് ചെയ്യുന്നതിൽ നിന്ന് ഈ സൈറ്റിനെ ബ്ലോക്ക് ചെയ്‌തിരിക്കുന്നു.</translation>
 <translation id="7707922173985738739">മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കുക</translation>
 <translation id="7709152031285164251">പരാജയപ്പെട്ടു - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7710568461918838723">&amp;കാസ്‌റ്റുചെയ്യുക...</translation>
@@ -4372,7 +4370,7 @@
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />കുറിപ്പ്:<ph name="END_BOLD" />  പ്രോസസ്സ് വേളയിൽ സിസ്റ്റം റീബൂട്ട് ചെയ്യും.</translation>
 <translation id="7829298379596169484">ഓഡിയോ ഇൻപുട്ട് ആക്‌സസ്സുചെയ്യുന്നു</translation>
-<translation id="7830594666202422257">Linux-ലേക്ക് കണക്‌റ്റ് ചെയ്യുക</translation>
+<translation id="7830594666202422257">Linux-ലേക്ക് കണക്റ്റ് ചെയ്യുക</translation>
 <translation id="7831491651892296503">നെറ്റ്‍വര്‍ക്ക് കോണ്‍ഫിഗര്‍ ചെയ്യുന്നതിൽ പിശക്</translation>
 <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
 <translation id="7832084384634357321">അവസാനിക്കുന്ന സമയം</translation>
@@ -4671,7 +4669,6 @@
 <translation id="827097179112817503">ഹോം ബട്ടൺ കാണിക്കുക</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{ഒരു ബുക്ക്‌മാർക്ക് ഇല്ലാതാക്കി}other{# ബുക്ക്‌മാർക്കുകൾ ഇല്ലാതാക്കി}}</translation>
 <translation id="8272443605911821513">"കൂടുതൽ ഉപകരണങ്ങൾ" മെനുവിലെ വിപുലീകരണങ്ങളിൽ ക്ലിക്ക് ചെയ്യുന്നതിലൂടെ നിങ്ങളുടെ വിപുലീകരണങ്ങൾ നിയന്ത്രിക്കുക.</translation>
-<translation id="8272966760965438857">നിങ്ങളുടെ Google അക്കൗണ്ടുകൾ ഒരിടത്ത് മാനേജ് ചെയ്യുക</translation>
 <translation id="8274332263553132018">ഫയൽ കാസ്‌റ്റ് ചെയ്യുക</translation>
 <translation id="8274924778568117936">അപ്‌ഡേറ്റ് പൂർത്തിയാകുന്നതുവരെ നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഓഫാക്കുകയോ അടയ്‌ക്കുകയോ ചെയ്യരുത്. ഇൻസ്‌റ്റലേഷൻ പൂർത്തിയായിക്കഴിഞ്ഞാൽ <ph name="DEVICE_TYPE" /> റീസ്‌റ്റാർട്ട് ആകുന്നതാണ്.</translation>
 <translation id="8275038454117074363">ഇറക്കുമതിചെയ്യുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 5c82b5b..48badd0 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -338,6 +338,7 @@
         तुमच्या <ph name="LINK_START" />प्रॉक्सी सेटिंग्ज<ph name="LINK_END" /> अॅडजस्ट करा.</translation>
 <translation id="1512210426710821809">हे पहिल्यासारखे करण्‍याचा एकमेव मार्ग म्‍हणजे <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> पुन्हा इन्‍स्‍टॉल करणे.</translation>
 <translation id="151501797353681931">Safari मधून इंपोर्ट केलेले</translation>
+<translation id="1515163294334130951">लाँच करा</translation>
 <translation id="1521442365706402292">प्रमाणपत्रे व्यवस्थापित करा</translation>
 <translation id="152234381334907219">कधीही सेव्ह न केलेले</translation>
 <translation id="1524430321211440688">कीबोर्ड</translation>
@@ -439,6 +440,7 @@
 <translation id="167160931442925455">सर्वात मोठा आवाज</translation>
 <translation id="1673137583248014546"><ph name="URL" /> ला तुमच्या सिक्युरिटी कीची निर्मिती आणि मॉडेल पहायचा आहे</translation>
 <translation id="1679068421605151609">डेव्हलपर टूल</translation>
+<translation id="1679806121152819234">VM प्लग-इन</translation>
 <translation id="167983332380191032">व्यवस्थापन सेवेने HTTP एरर पाठवली.</translation>
 <translation id="1680849702532889074">तुमच्या Linux ॲप्लिकेशनच्या इंस्टॉलेशन दरम्यान एरर आली.</translation>
 <translation id="16815041330799488">क्लिपबोर्डवर कॉपी केलेला मजकूर आणि इमेज पाहण्याची अनुमती साइटना देऊ नका</translation>
@@ -962,7 +964,6 @@
 <translation id="2496180316473517155">ब्राउझिंग इतिहास</translation>
 <translation id="2497229222757901769">माउस गती</translation>
 <translation id="2497852260688568942">तुमच्या अॅडमिनिस्ट्रेटरने सिंक अक्षम केले आहे</translation>
-<translation id="249819058197909513">या ॲप साठी पुन्हा चेतावणी देऊ नका</translation>
 <translation id="2498539833203011245">लहान करा</translation>
 <translation id="2498765460639677199">विशाल</translation>
 <translation id="2499747912851752301">पासवर्ड एक्सपोर्ट करत आहे...</translation>
@@ -1050,7 +1051,6 @@
 <translation id="2630681426381349926">सुरुवात करण्यासाठी वाय-फाय वर कनेक्ट करा</translation>
 <translation id="2631120081682787498">तुम्हाला नक्की हा टॅब बंद करायचा आहे का?</translation>
 <translation id="2631498379019108537">शेल्फ मधील इनपुट पर्याय दर्शवा</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> <ph name="USAGE" /> MB डिस्क स्थान वापरत आहे.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" काढून टाकायचे?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> इंस्टॉलेशन पूर्ण करू शकत नाही, परंतु ते त्याच्या डिस्क इमेजवरून चालत राहील.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1396,7 +1396,6 @@
 <translation id="3157931365184549694">पुनर्संचयित करा</translation>
 <translation id="3158033540161634471">तुमचे फिंगरप्रिंट सेट करा</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (हार्डवेअर-बॅक्ड)</translation>
-<translation id="316125635462764134">ॲप काढून टाका</translation>
 <translation id="3161522574479303604">सर्व भाषा</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> विक्रेत्याकडील <ph name="PRODUCT_ID" /> अज्ञात उत्पादन</translation>
 <translation id="3165390001037658081">काही वाहक हे वैशिष्ट्य अवरोधित शकतात.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">या प्रकारची फाइल तुमच्या कॉंप्युटरला हानी पोहचवू शकते. तुम्ही तरीसुद्धा <ph name="FILE_NAME" /> ठेवू इच्छिता?</translation>
 <translation id="3918972485393593704">Googleला तपशील द्या</translation>
 <translation id="3919145445993746351">तुमच्या सर्व कॉंप्युटरवर एक्स्टेंशन मिळवण्यासाठी, सिंक सुरू करा</translation>
+<translation id="391999873395511996">व्हर्च्युअल मशीन डाउनलोड करत आहे.</translation>
 <translation id="3920504717067627103">सर्टिफिकेट धोरणे</translation>
 <translation id="392089482157167418">ChromeVox (वाचिक फीडबॅक) सुरू करा</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">अज्ञात विक्रेत्याकडील डिव्हाइसेस</translation>
 <translation id="3984159763196946143">डेमो मोड सुरू करता आला नाही</translation>
 <translation id="3984431586879874039">या साइटला तुमची सिक्युरिटी की पाहण्याची अनुमती द्यायची आहे का?</translation>
-<translation id="3987348946546879621">वाचवलेला डेटा</translation>
 <translation id="3987938432087324095">क्षमस्व, ते समजले नाही.</translation>
 <translation id="3988996860813292272">टाइम झोन निवडा</translation>
 <translation id="399179161741278232">आयातीत</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">व्यक्ती संपादित करा</translation>
 <translation id="4042264909745389898">Google Chrome OS अटी</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{पेजमधून बाहेर या}other{पेजमधून बाहेर या}}</translation>
-<translation id="404299405565920089">अ‍ॅप्स आणि वेबसाइटवरील तुमची सर्व साइन इन केलेली Google खाती येथे व्यवस्थापित करता येतील. तुमची परवानगी असलेली अ‍ॅप्स आणि वेबसाइट त्यांना योग्यरीत्या काम करण्यासाठी आवश्यक असलेली खाते माहिती अ‍ॅक्सेस करू शकतात.</translation>
 <translation id="4044612648082411741">तुमचा सर्टिफिकेट पासवर्ड एंटर करा</translation>
 <translation id="404493185430269859">डीफॉल्ट शोध इंजिन</translation>
 <translation id="4046123991198612571">पुढील ट्रॅक</translation>
@@ -2094,7 +2092,6 @@
 <translation id="4242533952199664413">सेटिंग्ज उघडा</translation>
 <translation id="4242577469625748426">डिव्हाइसवर धोरण सेटिंग्ज इंस्टॉल करण्यात अयशस्वी: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">अधिक स्टायलस अॅप्स शोधा</translation>
-<translation id="424546999567421758">अतिशय जास्त डिस्क वापर आढळला</translation>
 <translation id="424726838611654458">Adobe Reader मध्ये नेहमी उघडा</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" /> शी सिंक करू शकत नाही</translation>
 <translation id="4249248555939881673">नेटवर्क कनेक्शनची प्रतीक्षा करत आहे...</translation>
@@ -2202,7 +2199,6 @@
 <translation id="4421932782753506458">Fluffy</translation>
 <translation id="4422347585044846479">या पृष्ठासाठी बुकमार्क संपादित करा</translation>
 <translation id="4423376891418188461">सेटिंग्ज पुनर्संचयित करा</translation>
-<translation id="4423482519432579560">&amp;शब्दलेखन तपासणी</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, तुम्ही तुमचा पासवर्ड बदलणे तुमच्या अॅडमिनिस्ट्रेटरसाठी आवश्यक आहे.</translation>
 <translation id="4430019312045809116">व्हॉल्यूम</translation>
 <translation id="4430369329743628066">बुकमार्क जोडला</translation>
@@ -2662,8 +2658,6 @@
 <translation id="5187295959347858724">तुम्ही आता <ph name="SHORT_PRODUCT_NAME" />मध्‍ये साइन इन केले आहे. तुमचे बुकमार्क, इतिहास, आणि इतर सेटिंग्ज आपल्या Google खात्यात समक्रमीत केल्या जात आहेत.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ला एकाहून अधिक फायली डाउनलोड करायच्या आहेत</translation>
-<translation id="5192316339598592690">खाती लगेच स्विच करा आणि एकाच वेळी अॅप्स आणि वेबसाइटवर साइन इन करा.
-    ॲप्‍स आणि साइट तुमच्या Google खात्याची काही माहिती वापरण्यासाठी परवानगी मागू शकतात. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">कृपया डिव्हाइस पॉवरवॉश करा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="5204967432542742771">पासवर्ड एंटर करा</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" हटवायचे?</translation>
@@ -3343,7 +3337,6 @@
 <translation id="622537739776246443">प्रोफाइल हटवली जाईल</translation>
 <translation id="6225475702458870625">आपल्या <ph name="PHONE_NAME" /> वरून डेटा कनेक्शन उपलब्ध आहे</translation>
 <translation id="6226777517901268232">खाजगी की फाईल (पर्यायी)</translation>
-<translation id="6228516488918914827">वेगाने लोड होणारे पेज लोड केले.</translation>
 <translation id="6228691855869374890">या साइटवर MIDI डिव्हाइसचे पूर्ण नियंत्रण आहे.</translation>
 <translation id="6229890768313448549">Google Play सेवा अटी लोड केल्या जाऊ शकत नाहीत. कृपया पुन्हा प्रयत्न करा.</translation>
 <translation id="6231881193380278751">पृष्ठ स्वयं-रिफ्रेश करण्यासाठी एक क्वेरी परम जोडा: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3541,6 @@
 <translation id="6545665334409411530">पुनरावृत्ती दर</translation>
 <translation id="6545834809683560467">अ‍ॅड्रेस बारमध्ये किंवा अ‍ॅप लाँचरमध्ये टाइप केलेले शोध आणि URL पूर्ण करण्यात मदतीसाठी पूर्वानुमान सेवा वापरा</translation>
 <translation id="6545867563032584178">Mac सिस्टम प्राधान्ये मधील मायक्रोफोन बंद केला आहे</translation>
-<translation id="6547316139431024316">या एक्स्टेंशनसाठी पुन्हा चेतावणी देऊ नका</translation>
 <translation id="6547354035488017500">किमान ५१२ MB स्थान मोकळे करा किंवा तुमचे डिव्हाइस अप्रतिसादात्मक बनेल. स्थान मोकळे करण्‍यासाठी, डिव्हाइस स्टोरेजमधून फायली हटवा.</translation>
 <translation id="6550675742724504774">पर्याय</translation>
 <translation id="6551508934388063976">कमांड अनुपलब्ध. एक नवीन विंडो उघडण्यासाठी control-N दाबा.</translation>
@@ -4677,7 +4669,6 @@
 <translation id="827097179112817503">होम बटण दर्शवा</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 बुकमार्क हटवला}other{# बुकमार्क हटवले}}</translation>
 <translation id="8272443605911821513">"अधिक साधने" मेनूमधील विस्तार क्लिक करून तुमचे विस्तार व्यवस्थापित करा.</translation>
-<translation id="8272966760965438857">तुमची Google खाती एका ठिकाणी व्यवस्थापित करा</translation>
 <translation id="8274332263553132018">फाइल कास्ट करा</translation>
 <translation id="8274924778568117936">अपडेट पूर्ण होईपर्यंत तुमचे <ph name="DEVICE_TYPE" /> बंद करू नका. इंस्‍टॉलेशन पूर्ण झाल्‍यानंतर तुमचे <ph name="DEVICE_TYPE" /> पुन्‍हा सुरू हाेईल .</translation>
 <translation id="8275038454117074363">इंपोर्ट</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index a31cfc5..e154992 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -338,6 +338,7 @@
         pelayan proksi, laraskan <ph name="LINK_START" />tetapan proksi<ph name="LINK_END" /> anda.</translation>
 <translation id="1512210426710821809">Satu-satunya cara hendak membuat asal tindakan ini ialah dengan memasang semula <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Dimport Daripada Safari</translation>
+<translation id="1515163294334130951">Lancarkan</translation>
 <translation id="1521442365706402292">Uruskan sijil</translation>
 <translation id="152234381334907219">Tidak Pernah Disimpan</translation>
 <translation id="1524430321211440688">Papan kekunci</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Paling lantang</translation>
 <translation id="1673137583248014546"><ph name="URL" /> ingin melihat jenama dan model Kunci Keselamatan anda</translation>
 <translation id="1679068421605151609">Alat Pembangun</translation>
+<translation id="1679806121152819234">PluginVm</translation>
 <translation id="167983332380191032">Perkhidmatan pengurusan menghantar ralat HTTP.</translation>
 <translation id="1680849702532889074">Ralat telah berlaku semasa pemasangan aplikasi Linux anda.</translation>
 <translation id="16815041330799488">Jangan benarkan tapak melihat teks dan imej yang disalin ke papan keratan</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Tidak dapat menghubungkan peranti ke domain. Pastikan anda belum melebihi jumlah peranti yang boleh ditambahkan.</translation>
 <translation id="1744108098763830590">halaman latar belakang</translation>
 <translation id="1745520510852184940">Sentiasa Terjemahkan</translation>
+<translation id="1746402432151920942">Pengecam Media Dilindungi</translation>
 <translation id="175196451752279553">B&amp;uka semula tab yang ditutup</translation>
 <translation id="1753905327828125965">Paling Kerap Dilawati</translation>
 <translation id="1756681705074952506">Kaedah input</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Tidak dilog masuk</translation>
 <translation id="1832511806131704864">Perubahan telefon dikemas kini</translation>
 <translation id="1834503245783133039">Muat turun tidak berjaya: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Peranti MIDI</translation>
 <translation id="1838374766361614909">Kosongkan carian</translation>
 <translation id="1841545962859478868">Pentadbir peranti boleh memantau perkara berikut:</translation>
 <translation id="1841616161104323629">Rekod peranti tiada.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Laporkan isu</translation>
 <translation id="2220572644011485463">PIN atau kata laluan</translation>
 <translation id="2224444042887712269">Tetapan ini milik <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Acara Kebolehaksesan</translation>
 <translation id="2224551243087462610">Edit nama folder</translation>
 <translation id="2226449515541314767">Tapak ini telah disekat daripada mengawal sepenuhnya peranti MIDI.</translation>
 <translation id="2226720438730111184">Beritahu Kami Perkara Yang Berlaku</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Sejarah penyemakan imbas</translation>
 <translation id="2497229222757901769">Kelajuan tetikus</translation>
 <translation id="2497852260688568942">Penyegerakan dilumpuhkan oleh pentadbir anda</translation>
-<translation id="249819058197909513">Jangan berikan amaran untuk apl ini lagi</translation>
 <translation id="2498539833203011245">Minimize</translation>
 <translation id="2498765460639677199">Besar</translation>
 <translation id="2499747912851752301">Mengeksport kata laluan...</translation>
@@ -1052,7 +1056,6 @@
 <translation id="2630681426381349926">Sambung ke Wi-Fi untuk bermula</translation>
 <translation id="2631120081682787498">Adakah anda pasti anda mahu menutup tab ini?</translation>
 <translation id="2631498379019108537">Tunjukkan pilihan input dalam rak</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> menggunakan <ph name="USAGE" /> MB ruang cakera.</translation>
 <translation id="2633212996805280240">Alih keluar "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> tidak dapat melengkapkan pemasangan, tetapi akan terus dijalankan daripada imej cakeranya.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1398,7 +1401,6 @@
 <translation id="3157931365184549694">Pulihkan</translation>
 <translation id="3158033540161634471">Sediakan cap jari anda</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (disokong perkakasan)</translation>
-<translation id="316125635462764134">Alih keluar apl</translation>
 <translation id="3161522574479303604">Semua bahasa</translation>
 <translation id="3163201441334626963">Produk <ph name="PRODUCT_ID" /> daripada vendor <ph name="VENDOR_ID" /> tidak diketahui</translation>
 <translation id="3165390001037658081">Sesetengah pembawa mungkin menyekat ciri ini.</translation>
@@ -1899,6 +1901,7 @@
 <translation id="3916445069167113093">Jenis fail ini boleh membahayakan komputer anda. Adakah anda mahu terus menyimpan <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Laporkan butiran kepada Google</translation>
 <translation id="3919145445993746351">Hidupkan penyegerakan untuk mendapatkan sambungan anda pada semua komputer anda</translation>
+<translation id="391999873395511996">Memuat turun mesin maya.</translation>
 <translation id="3920504717067627103">Dasar Sijil</translation>
 <translation id="392089482157167418">Dayakan ChromeVox (maklum balas dituturkan)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1950,7 +1953,6 @@
 <translation id="3983586614702900908">peranti daripada vendor yang tidak diketahui</translation>
 <translation id="3984159763196946143">Tidak dapat memulakan mod tunjuk cara</translation>
 <translation id="3984431586879874039">Benarkan tapak ini melihat kunci keselamatan anda?</translation>
-<translation id="3987348946546879621">Data disimpan</translation>
 <translation id="3987938432087324095">Maaf, kurang jelas.</translation>
 <translation id="3988996860813292272">Pilih zon waktu</translation>
 <translation id="399179161741278232">Diimport</translation>
@@ -1981,7 +1983,6 @@
 <translation id="4037889604535939429">Edit orang</translation>
 <translation id="4042264909745389898">Syarat OS Google Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Keluar daripada Halaman}other{Keluar daripada Halaman}}</translation>
-<translation id="404299405565920089">Semua Akaun Google anda yang dilog masuk daripada apl dan tapak web boleh diurus di sini. Apl dan tapak web yang mempunyai kebenaran anda dapat mengakses maklumat akaun yang diperlukan untuk berfungsi dengan betul.</translation>
 <translation id="4044612648082411741">Masukkan kata laluan sijil anda</translation>
 <translation id="404493185430269859">Enjin carian lalai</translation>
 <translation id="4046123991198612571">Lagu seterusnya</translation>
@@ -2096,7 +2097,6 @@
 <translation id="4242533952199664413">Buka tetapan</translation>
 <translation id="4242577469625748426">Gagal memasang tetapan dasar pada peranti: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Dapatkan lagi apl stilus</translation>
-<translation id="424546999567421758">Penggunaan tinggi cakera dikesan</translation>
 <translation id="424726838611654458">Sentiasa buka dalam Adobe Reader</translation>
 <translation id="4247901771970415646">Tidak dapat disegerakkan ke <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Menunggu sambungan rangkaian...</translation>
@@ -2204,7 +2204,6 @@
 <translation id="4421932782753506458">Gebu</translation>
 <translation id="4422347585044846479">Edit penanda halaman untuk halaman ini</translation>
 <translation id="4423376891418188461">Pulihkan Tetapan</translation>
-<translation id="4423482519432579560">&amp;Semakan ejaan</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, pentadbir anda memerlukan anda untuk menukar kata laluan.</translation>
 <translation id="4430019312045809116">Kelantangan</translation>
 <translation id="4430369329743628066">Penanda halaman ditambahkan</translation>
@@ -2664,8 +2663,6 @@
 <translation id="5187295959347858724">Anda sekarang dilog masuk ke <ph name="SHORT_PRODUCT_NAME" />. Penanda halaman, sejarah dan tetapan anda yang lain sedang disegerakkan dengan Akaun Google anda.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> mahu memuat turun berbilang fail</translation>
-<translation id="5192316339598592690">Tukar akaun dengan cepat dan log masuk ke apl serta tapak web serentak.
-    Apl dan tapak boleh meminta kebenaran daripada anda untuk menggunakan sesetengah maklumat Akaun Google anda. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Sila lakukan powerwash pada peranti dan cuba lagi.</translation>
 <translation id="5204967432542742771">Masukkan kata laluan</translation>
 <translation id="5206215183583316675">Padam "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3344,7 +3341,6 @@
 <translation id="622537739776246443">Profil akan dipadamkan</translation>
 <translation id="6225475702458870625">Sambungan data tersedia daripada <ph name="PHONE_NAME" /> anda</translation>
 <translation id="6226777517901268232">Fail kunci peribadi (pilihan)</translation>
-<translation id="6228516488918914827">Halaman dimuatkan lebih cepat</translation>
 <translation id="6228691855869374890">Tapak ini mengawal sepenuhnya peranti MIDI.</translation>
 <translation id="6229890768313448549">Syarat Perkhidmatan Google Play tidak dapat dimuatkan. Sila cuba semula.</translation>
 <translation id="6231881193380278751">Tambahkan param pertanyaan dalam URL untuk automuat semula halaman: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3549,7 +3545,6 @@
 <translation id="6545665334409411530">Kadar pengulangan</translation>
 <translation id="6545834809683560467">Gunakan perkhidmatan ramalan untuk membantu menyelesaikan carian dan URL yang ditaip dalam bar alamat atau kotak carian pelancar apl</translation>
 <translation id="6545867563032584178">Mikrofon dimatikan dalam Pilihan Sistem Mac</translation>
-<translation id="6547316139431024316">Jangan berikan amaran untuk sambungan ini lagi</translation>
 <translation id="6547354035488017500">Kosongkan sekurang-kurangnya 512 MB ruang, jika tidak peranti anda akan menjadi tidak responsif. Untuk mengosongkan ruang, padamkan fail daripada storan peranti.</translation>
 <translation id="6550675742724504774">Pilihan</translation>
 <translation id="6551508934388063976">Perintah tidak tersedia. Tekan control-N untuk membuka tetingkap baharu.</translation>
@@ -4680,7 +4675,6 @@
 <translation id="827097179112817503">Paparkan butang laman utama</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 penanda halaman dipadam}other{# penanda halaman dipadam}}</translation>
 <translation id="8272443605911821513">Urus sambungan anda dengan mengklik Sambungan dalam menu "Lagi alat".</translation>
-<translation id="8272966760965438857">Urus Akaun Google anda di satu tempat</translation>
 <translation id="8274332263553132018">Hantar fail</translation>
 <translation id="8274924778568117936">Jangan matikan atau menutup <ph name="DEVICE_TYPE" /> anda sehingga kemas kini selesai. <ph name="DEVICE_TYPE" /> anda akan dimulakan semula selepas pemasangan selesai.</translation>
 <translation id="8275038454117074363">Import</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 47cc900..ee298424 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -338,6 +338,7 @@
     moet gebruiken, pas je je <ph name="LINK_START" />proxyinstellingen<ph name="LINK_END" /> aan.</translation>
 <translation id="1512210426710821809">Je kunt dit alleen ongedaan maken door <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> opnieuw te installeren</translation>
 <translation id="151501797353681931">Geïmporteerd uit Safari</translation>
+<translation id="1515163294334130951">Starten</translation>
 <translation id="1521442365706402292">Certificaten beheren</translation>
 <translation id="152234381334907219">Nooit opgeslagen</translation>
 <translation id="1524430321211440688">Toetsenbord</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Luidst</translation>
 <translation id="1673137583248014546"><ph name="URL" /> wil het merk en het model van je beveiligingssleutel bekijken</translation>
 <translation id="1679068421605151609">Ontwikkelaarstools</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Beheerservice heeft HTTP-fout verzonden.</translation>
 <translation id="1680849702532889074">Er is een fout opgetreden tijdens de installatie van je Linux-app.</translation>
 <translation id="16815041330799488">Niet toestaan dat sites tekst en afbeeldingen kunnen zien die naar het klembord zijn gekopieerd</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Browsegeschiedenis</translation>
 <translation id="2497229222757901769">Snelheid muis</translation>
 <translation id="2497852260688568942">Synchronisatie is uitgeschakeld door je beheerder</translation>
-<translation id="249819058197909513">Geen waarschuwing meer weergeven voor deze app</translation>
 <translation id="2498539833203011245">Minimaliseren</translation>
 <translation id="2498765460639677199">Heel groot</translation>
 <translation id="2499747912851752301">Wachtwoorden exporteren...</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Maak verbinding met wifi om te beginnen</translation>
 <translation id="2631120081682787498">Weet je zeker dat je dit tabblad wilt sluiten?</translation>
 <translation id="2631498379019108537">Invoeropties op de plank weergeven</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> gebruikt <ph name="USAGE" /> MB schijfruimte.</translation>
 <translation id="2633212996805280240">Wil je '<ph name="EXTENSION_NAME" />' verwijderen?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> kan de installatie niet voltooien, maar wordt nog steeds uitgevoerd via de schijfkopie.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Herstellen</translation>
 <translation id="3158033540161634471">Je vingerafdruk instellen</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (met hardwareondersteuning)</translation>
-<translation id="316125635462764134">App verwijderen</translation>
 <translation id="3161522574479303604">Alle talen</translation>
 <translation id="3163201441334626963">Onbekend product <ph name="PRODUCT_ID" /> van leverancier <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Sommige providers kunnen deze functie blokkeren.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Dit type bestand kan schadelijk zijn voor je computer. Wil je <ph name="FILE_NAME" /> toch behouden?</translation>
 <translation id="3918972485393593704">Details melden aan Google</translation>
 <translation id="3919145445993746351">Schakel synchronisatie in om op al je computers toegang te krijgen tot je extensies</translation>
+<translation id="391999873395511996">De virtuele machine downloaden.</translation>
 <translation id="3920504717067627103">Certificaatbeleid</translation>
 <translation id="392089482157167418">ChromeVox (gesproken feedback) inschakelen</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">apparaten van een onbekende leverancier</translation>
 <translation id="3984159763196946143">Kan demomodus niet starten</translation>
 <translation id="3984431586879874039">Deze site toestaan je beveiligingssleutel te bekijken?</translation>
-<translation id="3987348946546879621">Mobiel dataverbruik bespaard</translation>
 <translation id="3987938432087324095">Sorry, dat heb ik niet verstaan.</translation>
 <translation id="3988996860813292272">Tijdzone selecteren</translation>
 <translation id="399179161741278232">Geïmporteerd</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Persoon bewerken</translation>
 <translation id="4042264909745389898">Voorwaarden van Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Pagina afsluiten}other{Pagina's afsluiten}}</translation>
-<translation id="404299405565920089">Al je ingelogde Google-accounts voor apps en websites kunnen hier worden beheerd. Apps en websites die je daarvoor toestemming hebt gegeven, hebben toegang tot de accountgegevens die ze nodig hebben om goed te kunnen werken.</translation>
 <translation id="4044612648082411741">Geef je certificaatwachtwoord op</translation>
 <translation id="404493185430269859">Standaard­zoekmachine</translation>
 <translation id="4046123991198612571">Volgend nummer</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Instellingen openen</translation>
 <translation id="4242577469625748426">Kan geen beleidsinstellingen op het apparaat installeren: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Meer stylus-apps zoeken</translation>
-<translation id="424546999567421758">Intensief schijfgebruik gedetecteerd</translation>
 <translation id="424726838611654458">Altijd in Adobe Reader openen</translation>
 <translation id="4247901771970415646">Kan niet synchroniseren met <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Wachten op netwerkverbinding...</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Pluisje</translation>
 <translation id="4422347585044846479">Bladwijzer voor deze pagina bewerken</translation>
 <translation id="4423376891418188461">Instellingen herstellen</translation>
-<translation id="4423482519432579560">&amp;Spellingcontrole</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, de beheerder vereist dat je je wachtwoord wijzigt.</translation>
 <translation id="4430019312045809116">Volume</translation>
 <translation id="4430369329743628066">Bladwijzer toegevoegd</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Je bent nu ingelogd bij <ph name="SHORT_PRODUCT_NAME" />. Je bladwijzers, geschiedenis en andere instellingen worden gesynchroniseerd met je Google-account.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> wil meerdere bestanden downloaden</translation>
-<translation id="5192316339598592690">Schakel snel tussen accounts en log in één keer in bij apps en websites.
-    Apps en sites kunnen je toestemming vragen om bepaalde Google-accountgegevens te gebruiken. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Voer een powerwash uit op het apparaat en probeer het opnieuw.</translation>
 <translation id="5204967432542742771">Wachtwoord invoeren</translation>
 <translation id="5206215183583316675"><ph name="CERTIFICATE_NAME" /> verwijderen?</translation>
@@ -3343,7 +3337,6 @@
 <translation id="622537739776246443">Profiel wordt verwijderd</translation>
 <translation id="6225475702458870625">Gegevensverbinding beschikbaar via je <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Privésleutelbestand (optioneel)</translation>
-<translation id="6228516488918914827">Pagina sneller geladen</translation>
 <translation id="6228691855869374890">Deze site heeft volledig beheer van MIDI-apparaten.</translation>
 <translation id="6229890768313448549">De Servicevoorwaarden van Google Play kunnen niet worden geladen. Probeer het opnieuw.</translation>
 <translation id="6231881193380278751">Voeg een queryparameter aan de URL toe om de pagina automatisch te laten vernieuwen: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3541,6 @@
 <translation id="6545665334409411530">Herhalingssnelheid</translation>
 <translation id="6545834809683560467">Een voorspellingsservice gebruiken om zoekopdrachten en URL's aan te vullen die in de adresbalk of het zoekvak van de App Launcher worden getypt</translation>
 <translation id="6545867563032584178">Microfoon is uitgeschakeld in Mac-systeemvoorkeuren</translation>
-<translation id="6547316139431024316">Geen waarschuwing meer weergeven voor deze extensie</translation>
 <translation id="6547354035488017500">Je moet minimaal 512 MB aan ruimte vrijmaken om ervoor te zorgen dat het apparaat blijft reageren. Verwijder bestanden uit de opslag van het apparaat om ruimte vrij te maken.</translation>
 <translation id="6550675742724504774">Opties</translation>
 <translation id="6551508934388063976">Opdracht niet beschikbaar. Druk op Ctrl-N om een nieuw venster te openen.</translation>
@@ -4678,7 +4670,6 @@
 <translation id="827097179112817503">Knop 'Homepage' weergeven</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 bladwijzer verwijderd}other{# bladwijzers verwijderd}}</translation>
 <translation id="8272443605911821513">Beheer je extensies door op 'Extensies' te klikken in het menu 'Meer tools'.</translation>
-<translation id="8272966760965438857">Je Google-accounts op één plaats beheren</translation>
 <translation id="8274332263553132018">Bestand casten</translation>
 <translation id="8274924778568117936">Je moet je <ph name="DEVICE_TYPE" /> niet uitschakelen of sluiten totdat de update is voltooid. Je <ph name="DEVICE_TYPE" /> wordt opnieuw opgestart nadat de installatie is voltooid.</translation>
 <translation id="8275038454117074363">Importeren</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 1bcde2c31..6e5f971b 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">Hvis du bruker en mellomtjener, må du sjekke mellomtjenerinnstillingene eller ta kontakt med nettverksadministratoren for å kontrollere at mellomtjeneren fungerer. Hvis du ikke vil bruke en mellomtjener, kan du endre <ph name="LINK_START" />mellomtjenerinnstillingene<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Den eneste måten du kan angre dette på, er å installere <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> på nytt</translation>
 <translation id="151501797353681931">Importert fra Safari</translation>
+<translation id="1515163294334130951">Start</translation>
 <translation id="1521442365706402292">Administrer sertifikater</translation>
 <translation id="152234381334907219">Aldri lagret</translation>
 <translation id="1524430321211440688">Tastatur</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">Høyest</translation>
 <translation id="1673137583248014546"><ph name="URL" /> ber om å se merket og modellen til sikkerhetsnøkkelen din</translation>
 <translation id="1679068421605151609">Utviklerverktøy</translation>
+<translation id="1679806121152819234">VM for programtillegg</translation>
 <translation id="167983332380191032">Administrasjonstjenesten sendte en HTTP-feil.</translation>
 <translation id="1680849702532889074">Det oppsto en feil under installasjon av Linux-programmet ditt.</translation>
 <translation id="16815041330799488">Ikke la nettsteder se tekst og bilder som er kopiert til utklippstavlen</translation>
@@ -960,7 +962,6 @@
 <translation id="2496180316473517155">Nettleserlogg</translation>
 <translation id="2497229222757901769">Musehastighet</translation>
 <translation id="2497852260688568942">Administratoren din har slått av synkronisering</translation>
-<translation id="249819058197909513">Ikke advar om denne appen igjen</translation>
 <translation id="2498539833203011245">Minimer</translation>
 <translation id="2498765460639677199">Kjempestor</translation>
 <translation id="2499747912851752301">Eksporterer passordene …</translation>
@@ -1047,7 +1048,6 @@
 <translation id="2630681426381349926">Koble til Wi-Fi for å begynne</translation>
 <translation id="2631120081682787498">Er du sikker på at du vil lukke denne fanen?</translation>
 <translation id="2631498379019108537">Vis inndataalternativer i hyllen</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> bruker <ph name="USAGE" /> MB lagringsplass.</translation>
 <translation id="2633212996805280240">Vil du fjerne «<ph name="EXTENSION_NAME" />»?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> kan ikke fullføre installeringen, men vil fortsette å kjøre fra diskavbildningen.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1393,7 +1393,6 @@
 <translation id="3157931365184549694">Gjenopprett</translation>
 <translation id="3158033540161634471">Konfigurer fingeravtrykket ditt</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (maskinvarestøttet)</translation>
-<translation id="316125635462764134">Fjern appen</translation>
 <translation id="3161522574479303604">Alle språk</translation>
 <translation id="3163201441334626963">Ukjent produkt, <ph name="PRODUCT_ID" />, fra leverandøren <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Det kan hende at enkelte operatører blokkerer denne funksjonen.</translation>
@@ -1893,6 +1892,7 @@
 <translation id="3916445069167113093">Denne filtypen kan skade datamaskinen. Ønsker du å beholde <ph name="FILE_NAME" /> likevel?</translation>
 <translation id="3918972485393593704">Rapportér detaljer til Google</translation>
 <translation id="3919145445993746351">For å få utvidelsene dine på alle datamaskinene dine, slå på synkronisering</translation>
+<translation id="391999873395511996">Laster ned den virtuelle maskinen</translation>
 <translation id="3920504717067627103">Administratorinnstillinger for sertifikater</translation>
 <translation id="392089482157167418">Slå på ChromeVox (taletilbakemelding)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1942,7 +1942,6 @@
 <translation id="3983586614702900908">enheter fra en ukjent leverandør</translation>
 <translation id="3984159763196946143">Kan ikke starte demomodus</translation>
 <translation id="3984431586879874039">Vil du la dette nettstedet se sikkerhetsnøkkelen din?</translation>
-<translation id="3987348946546879621">Dataforbruk redusert</translation>
 <translation id="3987938432087324095">Det fikk jeg ikke med meg.</translation>
 <translation id="3988996860813292272">Velg tidssone</translation>
 <translation id="399179161741278232">Importert</translation>
@@ -1973,7 +1972,6 @@
 <translation id="4037889604535939429">Endre person</translation>
 <translation id="4042264909745389898">Vilkår for Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Lukk siden}other{Lukk sidene}}</translation>
-<translation id="404299405565920089">Her kan du administrere alle Google-kontoer du er logget på via apper og nettsteder. Apper og nettsteder du gir tillatelse, får tilgang til kontoinformasjonen de trenger for å fungere som de skal.</translation>
 <translation id="4044612648082411741">Angi sertifikatpassordet ditt</translation>
 <translation id="404493185430269859">Standard søkemotor</translation>
 <translation id="4046123991198612571">Neste spor</translation>
@@ -2088,7 +2086,6 @@
 <translation id="4242533952199664413">Åpne innstillingene</translation>
 <translation id="4242577469625748426">Kunne ikke installere angivelse av innstillinger på enheten: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Finn flere pekepennapper</translation>
-<translation id="424546999567421758">Høyt forbruk av lagringsplass oppdaget</translation>
 <translation id="424726838611654458">Åpne alltid i Adobe Reader</translation>
 <translation id="4247901771970415646">Kan ikke synkronisere med <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Venter på nettverkstilkobling …</translation>
@@ -2196,7 +2193,6 @@
 <translation id="4421932782753506458">Pus</translation>
 <translation id="4422347585044846479">Rediger bokmerket for denne siden</translation>
 <translation id="4423376891418188461">Gjenopprett innstillingene</translation>
-<translation id="4423482519432579560">&amp;Stavekontroll</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, administratoren din krever at du endrer passord.</translation>
 <translation id="4430019312045809116">Volum</translation>
 <translation id="4430369329743628066">Bokmerke lagt til</translation>
@@ -2656,8 +2652,6 @@
 <translation id="5187295959347858724">Du er nå pålogget <ph name="SHORT_PRODUCT_NAME" />. Bokmerkene, loggen og de andre innstillingene dine blir synkronisert med Google-kontoen din.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ber om å laste ned flere filer</translation>
-<translation id="5192316339598592690">Bytt konto raskt, og logg på både apper og nettsteder samtidig.
-    Apper og nettsteder kan be om tillatelse til å bruke noe av informasjonen fra Google-kontoen din. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Utfør Powerwash på enheten, og prøv på nytt.</translation>
 <translation id="5204967432542742771">Skriv inn passordet</translation>
 <translation id="5206215183583316675">Vil du slette «<ph name="CERTIFICATE_NAME" />»?</translation>
@@ -3336,7 +3330,6 @@
 <translation id="622537739776246443">Profilen blir slettet</translation>
 <translation id="6225475702458870625">En datatilkobling er tilgjengelig fra <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Privat nøkkelfil (valgfritt)</translation>
-<translation id="6228516488918914827">Raskere side er lastet inn</translation>
 <translation id="6228691855869374890">Dette nettstedet har full kontroll over MIDI-enheter.</translation>
 <translation id="6229890768313448549">Vilkårene for bruk av Google Play kan ikke lastes inn. Prøv på nytt.</translation>
 <translation id="6231881193380278751">Legg til en forespørselsparameter i nettadressen for å laste inn siden på nytt automatisk: chrome://device-log/?refresh=&lt;sek&gt;</translation>
@@ -3541,7 +3534,6 @@
 <translation id="6545665334409411530">Gjentakelsesfrekvens</translation>
 <translation id="6545834809683560467">Bruk en forslagstjeneste for å fullføre søk og nettadresser som skrives inn i adressefeltet eller søkefeltet i appvelgeren</translation>
 <translation id="6545867563032584178">Mikrofonen er slått av i Mac-systemvalgene</translation>
-<translation id="6547316139431024316">Ikke advar om denne utvidelsen igjen</translation>
 <translation id="6547354035488017500">Frigjør minst 512 MB lagringsplass for å unngå at enheten slutter å reagere. For å frigjøre plass, slett filer fra enhetslagringen.</translation>
 <translation id="6550675742724504774">Alternativer</translation>
 <translation id="6551508934388063976">Kommandoen er utilgjengelig. Trykk på control-N for å åpne et nytt vindu.</translation>
@@ -4670,7 +4662,6 @@
 <translation id="827097179112817503">Vis startsideknapp</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 bokmerke er slettet}other{# bokmerker er slettet}}</translation>
 <translation id="8272443605911821513">Administrer utvidelsene dine ved å klikke på Utvidelser i Flere verktøy-menyen.</translation>
-<translation id="8272966760965438857">Administrer Google-kontoene dine på ett sted</translation>
 <translation id="8274332263553132018">Cast en fil</translation>
 <translation id="8274924778568117936">Du må ikke slå av eller lukke <ph name="DEVICE_TYPE" />-enheten din før oppdateringen er ferdig. <ph name="DEVICE_TYPE" />-enheten starter på nytt når installasjonen er ferdig.</translation>
 <translation id="8275038454117074363">Importer</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index d75f0620..830c2f0 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -338,6 +338,7 @@
     być używany, zmień <ph name="LINK_START" />jego ustawienia<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Jedynym sposobem cofnięcia tej czynności jest ponowna instalacja systemu <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Zaimportowane z przeglądarki Safari</translation>
+<translation id="1515163294334130951">Uruchom</translation>
 <translation id="1521442365706402292">Zarządzaj certyfikatami</translation>
 <translation id="152234381334907219">Nigdy nie zapisane</translation>
 <translation id="1524430321211440688">Klawiatura</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Najgłośniej</translation>
 <translation id="1673137583248014546"><ph name="URL" /> chce odczytać markę i model Twojego klucza bezpieczeństwa</translation>
 <translation id="1679068421605151609">Narzędzia dla deweloperów</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Usługa zarządzania wysłała błędny kod HTTP.</translation>
 <translation id="1680849702532889074">Podczas instalowania aplikacji na Linuksa wystąpił błąd.</translation>
 <translation id="16815041330799488">Nie zezwalaj stronom na dostęp do tekstu i obrazów skopiowanych do schowka</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Nie można dołączyć urządzenia do domeny. Upewnij się, że nie została przekroczona dozwolona liczba urządzeń.</translation>
 <translation id="1744108098763830590">strona w tle</translation>
 <translation id="1745520510852184940">Tłumacz zawsze</translation>
+<translation id="1746402432151920942">Identyfikator chronionych treści multimedialnych</translation>
 <translation id="175196451752279553">Prz&amp;ywróć zamkniętą kartę</translation>
 <translation id="1753905327828125965">Najczęstsze</translation>
 <translation id="1756681705074952506">Sposób wprowadzania tekstu</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Niezalogowany</translation>
 <translation id="1832511806131704864">Zmiana telefonu została zapisana</translation>
 <translation id="1834503245783133039">Nie udało się pobrać: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Urządzenia MIDI</translation>
 <translation id="1838374766361614909">Wyczyść wyszukiwanie</translation>
 <translation id="1841545962859478868">Administrator urządzenia może monitorować te zdarzenia:</translation>
 <translation id="1841616161104323629">Brak rekordu urządzenia.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Zgłoś problem</translation>
 <translation id="2220572644011485463">Kod PIN lub hasło</translation>
 <translation id="2224444042887712269">To ustawienie należy do <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Zdarzenia związane z ułatwieniami dostępu</translation>
 <translation id="2224551243087462610">Edytuj nazwę folderu</translation>
 <translation id="2226449515541314767">Pełny dostęp do sterowania urządzeniami MIDI został dla tej witryny zablokowany.</translation>
 <translation id="2226720438730111184">Powiedz nam, co się dzieje</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Historia przeglądania</translation>
 <translation id="2497229222757901769">Szybkość myszy</translation>
 <translation id="2497852260688568942">Synchronizację wyłączył administrator</translation>
-<translation id="249819058197909513">Nie pokazuj już ostrzeżeń dla tej aplikacji</translation>
 <translation id="2498539833203011245">Zminimalizuj</translation>
 <translation id="2498765460639677199">Ogromny</translation>
 <translation id="2499747912851752301">Eksportuję hasła…</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Połącz się z Wi-Fi, aby rozpocząć</translation>
 <translation id="2631120081682787498">Czy na pewno chcesz zamknąć tę kartę?</translation>
 <translation id="2631498379019108537">Pokaż opcje wprowadzania na półce</translation>
-<translation id="2633199387167390344">Aplikacja <ph name="NAME" /> używa <ph name="USAGE" /> MB na dysku.</translation>
 <translation id="2633212996805280240">Usunąć „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="263325223718984101">Nie można ukończyć instalacji produktu <ph name="PRODUCT_NAME" />. Będzie on nadal uruchamiany z obrazu dysku.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Przywróć</translation>
 <translation id="3158033540161634471">Skonfiguruj swój odcisk palca</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (obsługiwany sprzętowo)</translation>
-<translation id="316125635462764134">Usuń aplikację</translation>
 <translation id="3161522574479303604">Wszystkie języki</translation>
 <translation id="3163201441334626963">Nieznany produkt <ph name="PRODUCT_ID" />, którego producent to <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Niektórzy operatorzy mogą blokować tę funkcję.</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">Pliki tego typu mogą wyrządzić szkody na komputerze. Czy chcesz mimo tego zachować plik <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Przesyłaj do Google szczegółowe informacje</translation>
 <translation id="3919145445993746351">Aby korzystać z rozszerzeń na wszystkich swoich komputerach, włącz synchronizację</translation>
+<translation id="391999873395511996">Pobieram maszynę wirtualną.</translation>
 <translation id="3920504717067627103">Zasady certyfikatu</translation>
 <translation id="392089482157167418">Włącz ChromeVox (potwierdzenia głosowe)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">urządzenia od nieznanego dostawcy</translation>
 <translation id="3984159763196946143">Nie udało się uruchomić trybu demonstracyjnego</translation>
 <translation id="3984431586879874039">Zezwolić tej stronie na odczytywanie danych klucza bezpieczeństwa?</translation>
-<translation id="3987348946546879621">Zmniejszono zużycie danych</translation>
 <translation id="3987938432087324095">Nie rozumiem.</translation>
 <translation id="3988996860813292272">Wybierz strefę czasową</translation>
 <translation id="399179161741278232">Zaimportowane</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">Edytuj dane osoby</translation>
 <translation id="4042264909745389898">Warunki korzystania z systemu operacyjnego Google Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Zamknij stronę}few{Zamknij strony}many{Zamknij strony}other{Zamknij strony}}</translation>
-<translation id="404299405565920089">W tym miejscu możesz zarządzać wszystkimi kontami Google, na które logujesz się na stronach i w aplikacjach. Aplikacje i strony mające Twoje pozwolenie mogą korzystać z informacji o koncie, których potrzebują do prawidłowego działania.</translation>
 <translation id="4044612648082411741">Podaj hasło certyfikatu</translation>
 <translation id="404493185430269859">Domyślna wyszukiwarka</translation>
 <translation id="4046123991198612571">Następny utwór</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">Otwórz ustawienia</translation>
 <translation id="4242577469625748426">Instalacja ustawień zasad na urządzeniu nie powiodła się: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Znajdź więcej aplikacji dla rysika</translation>
-<translation id="424546999567421758">Wykryto wysokie użycie dysku</translation>
 <translation id="424726838611654458">Zawsze otwieraj w Adobe Reader</translation>
 <translation id="4247901771970415646">Nie można zsynchronizować z <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Czekam na połączenie z siecią...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">Puszysty</translation>
 <translation id="4422347585044846479">Edytuj zakładkę tej strony</translation>
 <translation id="4423376891418188461">Przywróć ustawienia</translation>
-<translation id="4423482519432579560">&amp;Sprawdzanie pisowni</translation>
 <translation id="442397852638519243">Twój administrator (<ph name="USER_NAME" />) prosi Cię o zmianę Twojego hasła.</translation>
 <translation id="4430019312045809116">Głośność</translation>
 <translation id="4430369329743628066">Dodano zakładkę</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">Jesteś zalogowany(a) do <ph name="SHORT_PRODUCT_NAME" />. Twoje zakładki, historia i inne ustawienia są synchronizowane z Twoim kontem Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> chce pobrać wiele plików</translation>
-<translation id="5192316339598592690">Możesz szybko przełączać konta i logować się w wielu aplikacjach i witrynach jednocześnie.
-    Aplikacje i witryny mogą prosić Cię o pozwolenie na użycie niektórych informacji dotyczących Twojego konta Google. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Wykonaj Powerwash urządzenia i spróbuj jeszcze raz.</translation>
 <translation id="5204967432542742771">Wpisz hasło</translation>
 <translation id="5206215183583316675">Usunąć „<ph name="CERTIFICATE_NAME" />”?</translation>
@@ -3343,7 +3340,6 @@
 <translation id="622537739776246443">Profil zostanie usunięty</translation>
 <translation id="6225475702458870625">Połączenie transmisji danych jest dostępne z telefonu <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Plik klucza prywatnego (opcjonalnie)</translation>
-<translation id="6228516488918914827">Wczytano szybszą stronę</translation>
 <translation id="6228691855869374890">Ta witryna ma pełny dostęp do sterowania urządzeniami MIDI.</translation>
 <translation id="6229890768313448549">Nie można wczytać Warunków korzystania z usługi Google Play. Spróbuj ponownie.</translation>
 <translation id="6231881193380278751">Dodaj parametr zapytania do URL-a, by strona odświeżała się automatycznie: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3544,6 @@
 <translation id="6545665334409411530">Szybkość powtarzania</translation>
 <translation id="6545834809683560467">Używaj podpowiedzi, by uzupełniać zapytania i adresy URL wpisywane na pasku adresu lub w polu wyszukiwania menu z aplikacjami</translation>
 <translation id="6545867563032584178">Mikrofon jest wyłączony w Preferencjach systemowych Maca</translation>
-<translation id="6547316139431024316">Nie pokazuj już ostrzeżeń dla tego rozszerzenia</translation>
 <translation id="6547354035488017500">Zwolnij co najmniej 512 MB miejsca. W przeciwnym razie urządzenie przestanie odpowiadać. Aby zwolnić miejsce, usuń pliki z pamięci urządzenia.</translation>
 <translation id="6550675742724504774">Opcje</translation>
 <translation id="6551508934388063976">Polecenie jest niedostępne. Naciśnij control+N, by otworzyć nowe okno.</translation>
@@ -4679,7 +4674,6 @@
 <translation id="827097179112817503">Pokaż przycisk strony głównej</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Usunięto 1 zakładkę}few{Usunięto # zakładki}many{Usunięto # zakładek}other{Usunięto # zakładki}}</translation>
 <translation id="8272443605911821513">Aby zarządzać zainstalowanymi rozszerzeniami, kliknij Rozszerzenia w menu Więcej narzędzi.</translation>
-<translation id="8272966760965438857">Zarządzaj swoimi kontami Google w jednym miejscu</translation>
 <translation id="8274332263553132018">Prześlij plik</translation>
 <translation id="8274924778568117936">Nie wyłączaj ani nie zamykaj urządzenia <ph name="DEVICE_TYPE" /> do momentu ukończenia aktualizacji. Po zakończeniu instalacji <ph name="DEVICE_TYPE" /> uruchomi się ponownie.</translation>
 <translation id="8275038454117074363">Importuj</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 0bb48d26..33dc362 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -338,6 +338,7 @@
      servidor proxy, ajuste suas <ph name="LINK_START" />configurações de proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">A única maneira de desfazer essa ação é reinstalando o <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importados do Safari</translation>
+<translation id="1515163294334130951">Iniciar</translation>
 <translation id="1521442365706402292">Gerenciar certificados</translation>
 <translation id="152234381334907219">Nunca salvas</translation>
 <translation id="1524430321211440688">Teclado</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Volume máximo</translation>
 <translation id="1673137583248014546"><ph name="URL" /> quer ver a marca e o modelo da sua chave de segurança</translation>
 <translation id="1679068421605151609">Ferramentas do desenvolvedor</translation>
+<translation id="1679806121152819234">Plug-in VM</translation>
 <translation id="167983332380191032">O serviço de gerenciamento enviou um erro de HTTP.</translation>
 <translation id="1680849702532889074">Ocorreu um erro durante a instalação do aplicativo Linux.</translation>
 <translation id="16815041330799488">Não permitir que sites vejam textos e imagens copiados para a área de transferência</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Não é possível vincular o dispositivo ao domínio. Verifique se você não excedeu o número de dispositivos que podem ser adicionados.</translation>
 <translation id="1744108098763830590">página de plano de fundo</translation>
 <translation id="1745520510852184940">Sempre fazer isso</translation>
+<translation id="1746402432151920942">Identificador de mídia protegida</translation>
 <translation id="175196451752279553">R&amp;eabrir guia fechada</translation>
 <translation id="1753905327828125965">Mais visitados</translation>
 <translation id="1756681705074952506">Método de entrada</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Desconectado</translation>
 <translation id="1832511806131704864">Atualização da alteração do smartphone</translation>
 <translation id="1834503245783133039">Falha no download: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Dispositivos MIDI</translation>
 <translation id="1838374766361614909">Limpar pesquisa</translation>
 <translation id="1841545962859478868">O administrador do dispositivo pode monitorar o seguinte:</translation>
 <translation id="1841616161104323629">Registro do dispositivo não encontrado.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Informar um problema</translation>
 <translation id="2220572644011485463">PIN ou senha</translation>
 <translation id="2224444042887712269">Esta configuração pertence a <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Eventos de acessibilidade</translation>
 <translation id="2224551243087462610">Editar nome da pasta</translation>
 <translation id="2226449515541314767">O controle total de dispositivos MIDI foi bloqueado neste site.</translation>
 <translation id="2226720438730111184">Conte-nos o que está acontecendo</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Histórico de navegação</translation>
 <translation id="2497229222757901769">Velocidade do mouse</translation>
 <translation id="2497852260688568942">A sincronização foi desativada pelo administrador</translation>
-<translation id="249819058197909513">Não avisar novamente para este aplicativo</translation>
 <translation id="2498539833203011245">Minimizar</translation>
 <translation id="2498765460639677199">Enorme</translation>
 <translation id="2499747912851752301">Exportando senhas…</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Conecte-se ao Wi-Fi para começar</translation>
 <translation id="2631120081682787498">Tem certeza de que quer fechar esta guia?</translation>
 <translation id="2631498379019108537">Mostrar opções de entrada na estante</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> está usando <ph name="USAGE" /> MB de espaço em disco.</translation>
 <translation id="2633212996805280240">Remover "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101">O <ph name="PRODUCT_NAME" /> não conseguiu completar a instalação, mas continuará a ser executado a partir da sua imagem de disco.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Restaurar</translation>
 <translation id="3158033540161634471">Configurar impressão digital</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (no hardware)</translation>
-<translation id="316125635462764134">Remover aplicativo</translation>
 <translation id="3161522574479303604">Todos os idiomas</translation>
 <translation id="3163201441334626963">Produto <ph name="PRODUCT_ID" /> desconhecido do fornecedor <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Algumas operadoras podem bloquear esse recurso.</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">Este tipo de arquivo pode danificar seu computador. Quer manter o arquivo <ph name="FILE_NAME" /> mesmo assim?</translation>
 <translation id="3918972485393593704">Informar detalhes ao Google</translation>
 <translation id="3919145445993746351">Para ver suas extensões em todos os seus computadores, ative a sincronização</translation>
+<translation id="391999873395511996">Fazendo o download da máquina virtual.</translation>
 <translation id="3920504717067627103">Diretivas de certificação</translation>
 <translation id="392089482157167418">Ativar ChromeVox (feedback falado)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">dispositivos de um fornecedor desconhecido</translation>
 <translation id="3984159763196946143">Não foi possível iniciar o modo de demonstração</translation>
 <translation id="3984431586879874039">Permitir que este site veja sua chave de segurança?</translation>
-<translation id="3987348946546879621">Dados economizados</translation>
 <translation id="3987938432087324095">Não entendi.</translation>
 <translation id="3988996860813292272">Selecionar fuso horário</translation>
 <translation id="399179161741278232">Importado</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">Editar pessoa</translation>
 <translation id="4042264909745389898">Termos do Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Sair da página}one{Sair da página}other{Sair das páginas}}</translation>
-<translation id="404299405565920089">É possível gerenciar todas as suas Contas do Google conectadas em apps e sites aqui. Os apps e sites que têm sua permissão podem acessar as informações da conta necessárias para o funcionamento adequado.</translation>
 <translation id="4044612648082411741">Digite a senha do certificado</translation>
 <translation id="404493185430269859">Mecanismo de pesquisa padrão</translation>
 <translation id="4046123991198612571">Próxima faixa</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">Abrir configurações.</translation>
 <translation id="4242577469625748426">Falha ao instalar configurações da política no dispositivo: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Encontrar mais apps para usar com a stylus</translation>
-<translation id="424546999567421758">Detectado alto uso de disco</translation>
 <translation id="424726838611654458">Sempre abrir com o Adobe Reader</translation>
 <translation id="4247901771970415646">Não é possível sincronizar com <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Aguardando conexão da rede...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">Pelúcia</translation>
 <translation id="4422347585044846479">Editar favorito para esta página</translation>
 <translation id="4423376891418188461">Restaurar configurações</translation>
-<translation id="4423482519432579560">&amp;Correção ortográfica</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, seu administrador solicita que você altere sua senha.</translation>
 <translation id="4430019312045809116">Volume</translation>
 <translation id="4430369329743628066">Página adicionada como favorito</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">Você está conectado a <ph name="SHORT_PRODUCT_NAME" />. Seus favoritos, o histórico e outras configurações estão sendo sincronizados com sua Conta do Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">Solicitação do download de vários arquivos feita por <ph name="ORIGIN" /></translation>
-<translation id="5192316339598592690">Mude de conta rapidamente e faça login em apps e sites ao mesmo tempo.
-    Apps e sites podem pedir permissão para usar algumas informações da sua Conta do Google. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Execute o Powerwash do dispositivo e tente novamente.</translation>
 <translation id="5204967432542742771">Insira a senha</translation>
 <translation id="5206215183583316675">Quer excluir "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3345,7 +3342,6 @@
 <translation id="622537739776246443">O perfil será excluído</translation>
 <translation id="6225475702458870625">Conexão de dados disponível a partir do seu <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Arquivo de chaves particulares (opcional)</translation>
-<translation id="6228516488918914827">Página carregada mais rapidamente</translation>
 <translation id="6228691855869374890">Este site tem controle total de dispositivos MIDI.</translation>
 <translation id="6229890768313448549">Não é possível carregar os Termos de Serviço do Google Play. Tente novamente.</translation>
 <translation id="6231881193380278751">Adicionar um parâmetro de consulta no URL para atualizar automaticamente a página: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3550,7 +3546,6 @@
 <translation id="6545665334409411530">Taxa de repetição</translation>
 <translation id="6545834809683560467">Utilizar o serviço de previsão para ajudar a completar pesquisas e URLs digitados na barra de endereço ou na caixa de pesquisa do Acesso rápido aos apps</translation>
 <translation id="6545867563032584178">O microfone está desativado nas preferências do sistema do Mac</translation>
-<translation id="6547316139431024316">Não avisar novamente para esta extensão</translation>
 <translation id="6547354035488017500">Libere pelo menos 512 MB de espaço. Caso contrário, seu dispositivo deixará de responder. Para liberar espaço, exclua arquivos do armazenamento do dispositivo.</translation>
 <translation id="6550675742724504774">Opções</translation>
 <translation id="6551508934388063976">Comando não disponível. Pressione "Control-N" para abrir uma nova janela.</translation>
@@ -4681,7 +4676,6 @@
 <translation id="827097179112817503">Mostrar botão "Página inicial"</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{ favorito excluído}one{# favorito excluído}other{# favoritos excluídos}}</translation>
 <translation id="8272443605911821513">Gerencie suas extensões clicando em "Extensões" no menu "Mais ferramentas".</translation>
-<translation id="8272966760965438857">Gerencie suas Contas do Google em um só lugar</translation>
 <translation id="8274332263553132018">Transmitir arquivo</translation>
 <translation id="8274924778568117936">Não desligue ou feche seu <ph name="DEVICE_TYPE" /> até que a atualização termine. O <ph name="DEVICE_TYPE" /> será reiniciado depois que a instalação for concluída.</translation>
 <translation id="8275038454117074363">Importar</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 73a269d..672da3ab 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -338,6 +338,7 @@
     servidor proxy, ajuste as <ph name="LINK_START" />definições de proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">A única forma de anular esta ação é reinstalar o <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="151501797353681931">Importado do Safari</translation>
+<translation id="1515163294334130951">Iniciar</translation>
 <translation id="1521442365706402292">Gerir certificados</translation>
 <translation id="152234381334907219">Nunca guardado</translation>
 <translation id="1524430321211440688">Teclado</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">O mais alto</translation>
 <translation id="1673137583248014546"><ph name="URL" /> pretende ver a marca e o modelo da sua Chave de segurança.</translation>
 <translation id="1679068421605151609">Ferramentas do Programador</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Ocorreu um erro com o HTTP enviado pelo serviço de gestão.</translation>
 <translation id="1680849702532889074">Ocorreu um erro durante a instalação da sua aplicação para Linux.</translation>
 <translation id="16815041330799488">Não permitir que os sites vejam o texto e as imagens copiados para a área de transferência</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Não é possível associar o dispositivo ao domínio. Certifique-se de que não excedeu o número de dispositivos que pode adicionar.</translation>
 <translation id="1744108098763830590">página de fundo</translation>
 <translation id="1745520510852184940">Fazer sempre isto</translation>
+<translation id="1746402432151920942">Identificador de multimédia protegido</translation>
 <translation id="175196451752279553">Voltar a abrir o s&amp;eparador fechado</translation>
 <translation id="1753905327828125965">Mais visitados</translation>
 <translation id="1756681705074952506">Método de introdução</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Não tem sessão iniciada</translation>
 <translation id="1832511806131704864">Alteração de telemóvel atualizada</translation>
 <translation id="1834503245783133039">Transferência sem êxito: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Dispositivos MIDI</translation>
 <translation id="1838374766361614909">Limpar pesquisa</translation>
 <translation id="1841545962859478868">O gestor do dispositivo pode monitorizar o seguinte:</translation>
 <translation id="1841616161104323629">Registo do dispositivo em falta.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Comunicar um problema</translation>
 <translation id="2220572644011485463">PIN ou palavra-passe</translation>
 <translation id="2224444042887712269">Esta definição pertence a <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Eventos de acessibilidade</translation>
 <translation id="2224551243087462610">Editar nome da pasta</translation>
 <translation id="2226449515541314767">Este site foi impedido de ter controlo total sobre dispositivos MIDI.</translation>
 <translation id="2226720438730111184">Indique-nos o que está a acontecer</translation>
@@ -962,7 +967,6 @@
 <translation id="2496180316473517155">Histórico de navegação</translation>
 <translation id="2497229222757901769">Velocidade do rato</translation>
 <translation id="2497852260688568942">A sincronização foi desativada pelo gestor</translation>
-<translation id="249819058197909513">Não avisar novamente para esta aplicação</translation>
 <translation id="2498539833203011245">Minimizar</translation>
 <translation id="2498765460639677199">Enorme</translation>
 <translation id="2499747912851752301">A exportar palavras-passe...</translation>
@@ -1050,7 +1054,6 @@
 <translation id="2630681426381349926">Estabelecer ligação a Wi-Fi para começar</translation>
 <translation id="2631120081682787498">Tem a certeza de que pretende fechar este separador?</translation>
 <translation id="2631498379019108537">Mostrar opções de introdução na prateleira</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> está a utilizar <ph name="USAGE" /> MB de espaço em disco.</translation>
 <translation id="2633212996805280240">Remover "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101">O <ph name="PRODUCT_NAME" /> não conseguiu terminar a instalação, mas continuará a executar a partir da respectiva imagem de disco.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1123,7 +1126,7 @@
 <translation id="2731392572903530958">Voltar a Abrir a Jan&amp;ela Fechada</translation>
 <translation id="2731700343119398978">Aguarde...</translation>
 <translation id="2731710757838467317">A criar o utilizador supervisionado. Isto poderá demorar alguns momentos.</translation>
-<translation id="2731971182069536520">Da próxima vez que reiniciar o dispositivo, o administrador vai efetuar uma atualização única que vai eliminar os seus dados locais.</translation>
+<translation id="2731971182069536520">Da próxima vez que reiniciar o dispositivo, o administrador irá efetuar uma atualização única que elimina os seus dados locais.</translation>
 <translation id="2734760316755174687">Os sites em <ph name="SITE_GROUP_NAME" /> também serão repostos.</translation>
 <translation id="2735438478659026460">Clicar automaticamente quando o cursor do rato parar</translation>
 <translation id="2735712963799620190">Programação</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Restaurar</translation>
 <translation id="3158033540161634471">Configurar a sua impressão digital</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (suportado por hardware)</translation>
-<translation id="316125635462764134">Remover aplicação</translation>
 <translation id="3161522574479303604">Todos os idiomas</translation>
 <translation id="3163201441334626963">Produto desconhecido <ph name="PRODUCT_ID" /> do fornecedor <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Alguns operadores podem bloquear esta funcionalidade.</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">Este tipo de ficheiro pode danificar o seu computador. Pretende, mesmo assim, manter <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Comunicar detalhes à Google</translation>
 <translation id="3919145445993746351">Para obter todas as suas extensões em todos os seus computadores, ative a sincronização</translation>
+<translation id="391999873395511996">A transferir a máquina virtual…</translation>
 <translation id="3920504717067627103">Políticas de certificados</translation>
 <translation id="392089482157167418">Ativar ChromeVox (comentários falados)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">dispositivos de um fornecedor desconhecido</translation>
 <translation id="3984159763196946143">Não foi possível iniciar o modo de demonstração</translation>
 <translation id="3984431586879874039">Pretende permitir que este site veja a sua chave de segurança?</translation>
-<translation id="3987348946546879621">Poupou dados.</translation>
 <translation id="3987938432087324095">Lamento, mas não compreendi.</translation>
 <translation id="3988996860813292272">Selecionar fuso horário</translation>
 <translation id="399179161741278232">Importado</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">Editar pessoa</translation>
 <translation id="4042264909745389898">Termos de Utilização do Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Sair da página}other{Sair das páginas}}</translation>
-<translation id="404299405565920089">É possível gerir todas as suas Contas Google com sessão iniciada em aplicações e Websites aqui. As aplicações e os Websites que têm a sua autorização podem aceder às informações da conta necessárias para funcionarem corretamente.</translation>
 <translation id="4044612648082411741">Introduzir a palavra-passe do certificado</translation>
 <translation id="404493185430269859">Motor de pesquisa predefinido</translation>
 <translation id="4046123991198612571">Faixa seguinte</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">Abrir definições</translation>
 <translation id="4242577469625748426">Falha ao instalar as definições da política no dispositivo: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Encontrar mais aplicações para a caneta stylus</translation>
-<translation id="424546999567421758">Detetada elevada utilização do disco</translation>
 <translation id="424726838611654458">Sempre aberto no Adobe Reader</translation>
 <translation id="4247901771970415646">Não é possível sincronizar com <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">A aguardar ligação à rede...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">Fofo</translation>
 <translation id="4422347585044846479">Editar marcador para esta página</translation>
 <translation id="4423376891418188461">Restaurar definições</translation>
-<translation id="4423482519432579560">&amp;Verificação ortográfica</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, o seu gestor requer que altere a sua palavra-passe.</translation>
 <translation id="4430019312045809116">Volume</translation>
 <translation id="4430369329743628066">Marcador adicionado</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">Está com sessão iniciada no <ph name="SHORT_PRODUCT_NAME" />. Os seus marcadores, histórico e outras definições estão a ser sincronizados com a sua Conta Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> pretende transferir vários ficheiros.</translation>
-<translation id="5192316339598592690">Alterne entre contas rapidamente e inicie sessão em aplicações e Websites, tudo em simultâneo.
-    As aplicações e os sites podem solicitar-lhe autorização para utilizar algumas das informações da sua Conta Google. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Efetue um Powerwash ao dispositivo e tente novamente.</translation>
 <translation id="5204967432542742771">Introduzir palavra-passe</translation>
 <translation id="5206215183583316675">Pretende eliminar "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3344,7 +3341,6 @@
 <translation id="622537739776246443">O perfil será eliminado</translation>
 <translation id="6225475702458870625">Ligação de dados disponível a partir do seu <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Ficheiro de chave privada (opcional)</translation>
-<translation id="6228516488918914827">Página carregada mais rapidamente.</translation>
 <translation id="6228691855869374890">Este site tem controlo total sobre dispositivos MIDI.</translation>
 <translation id="6229890768313448549">Não é possível carregar os Termos de Utilização do Google Play. Tente novamente.</translation>
 <translation id="6231881193380278751">Adicione um parâmetro de consulta no URL para atualizar automaticamente a página: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3549,7 +3545,6 @@
 <translation id="6545665334409411530">Taxa de repetição</translation>
 <translation id="6545834809683560467">Utilize um serviço de previsão para ajudar a concluir as pesquisas e os URLs introduzidos na barra de endereço ou na caixa de pesquisa do iniciador de aplicações</translation>
 <translation id="6545867563032584178">O microfone está desligado nas Preferências do Sistema no Mac</translation>
-<translation id="6547316139431024316">Não avisar novamente para esta extensão</translation>
 <translation id="6547354035488017500">Liberte, pelo menos, 512 MB de espaço ou o seu dispositivo deixa de responder. Para libertar espaço, elimine ficheiros do armazenamento do dispositivo.</translation>
 <translation id="6550675742724504774">Opções</translation>
 <translation id="6551508934388063976">Comando indisponível. Prima control-N para abrir uma nova janela.</translation>
@@ -4679,7 +4674,6 @@
 <translation id="827097179112817503">Mostrar botão Página inicial</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 marcador eliminado}other{# marcadores eliminados}}</translation>
 <translation id="8272443605911821513">Faça a gestão das suas extensões clicando em Extensões no menu "Mais ferramentas".</translation>
-<translation id="8272966760965438857">Efetue a gestão das suas Contas Google num único local</translation>
 <translation id="8274332263553132018">Transmitir ficheiro</translation>
 <translation id="8274924778568117936">Não desligue ou feche o <ph name="DEVICE_TYPE" /> até a atualização terminar. O <ph name="DEVICE_TYPE" /> será reiniciado quando a instalação estiver concluída.</translation>
 <translation id="8275038454117074363">Importar</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 09a25d0..66736944 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -338,6 +338,7 @@
     utilizați un server proxy, modificați <ph name="LINK_START" />setările de proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Singura modalitate de anulare este să reinstalezi <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importate din Safari</translation>
+<translation id="1515163294334130951">Lansați</translation>
 <translation id="1521442365706402292">Gestionează certificatele</translation>
 <translation id="152234381334907219">Nu se salvează niciodată</translation>
 <translation id="1524430321211440688">Tastatură</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Cel mai tare</translation>
 <translation id="1673137583248014546"><ph name="URL" /> dorește să vadă marca și modelul cheii de securitate</translation>
 <translation id="1679068421605151609">Instrumente pentru dezvoltatori</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Serviciul de administrare a trimis o eroare HTTP.</translation>
 <translation id="1680849702532889074">A apărut o eroare în timpul instalării aplicației Linux.</translation>
 <translation id="16815041330799488">Nu permite site-urilor să vadă textul și imaginile copiate în clipboard</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Dispozitivul nu a putut fi asociat domeniului. Asigură-te că nu ai depășit numărul de dispozitive pe care le poți adăuga.</translation>
 <translation id="1744108098763830590">pagină de fundal</translation>
 <translation id="1745520510852184940">Tradu întotdeauna</translation>
+<translation id="1746402432151920942">Identificator media protejat</translation>
 <translation id="175196451752279553">R&amp;edeschide fila închisă</translation>
 <translation id="1753905327828125965">Cele mai vizitate</translation>
 <translation id="1756681705074952506">Metodă de introducere</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Neconectat</translation>
 <translation id="1832511806131704864">Schimbare a telefonului actualizată</translation>
 <translation id="1834503245783133039">Descărcare nereușită: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Dispozitive MIDI</translation>
 <translation id="1838374766361614909">Șterge căutarea</translation>
 <translation id="1841545962859478868">Este posibil ca administratorul dispozitivului să monitorizeze următoarele:</translation>
 <translation id="1841616161104323629">Înregistrare privind lipsa dispozitivului.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Semnalați o problemă</translation>
 <translation id="2220572644011485463">PIN sau parolă</translation>
 <translation id="2224444042887712269">Setarea aparține utilizatorului <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Evenimente de accesibilitate</translation>
 <translation id="2224551243087462610">Editați numele dosarului</translation>
 <translation id="2226449515541314767">Acest site a fost blocat și nu poate avea control complet asupra dispozitivelor MIDI.</translation>
 <translation id="2226720438730111184">Spune-ne ce se întâmplă</translation>
@@ -900,7 +905,7 @@
 <translation id="2392369802118427583">Activează</translation>
 <translation id="2394566832561516196">Setările vor fi șterse la următoarea reîncărcare.</translation>
 <translation id="2395616325548404795">Dispozitivul <ph name="DEVICE_TYPE" /> a fost înscris pentru gestionarea de întreprindere, dar nu a putut trimite informațiile despre locație și articol. Introdu manual aceste informații din consola de administrare pentru acest dispozitiv.</translation>
-<translation id="2396783860772170191">Introdu codul PIN de 4 cifre (0000-9999)</translation>
+<translation id="2396783860772170191">Introdu codul PIN de 4 cifre (0000 – 9999)</translation>
 <translation id="2408955596600435184">Introdu codul PIN</translation>
 <translation id="241082044617551207">Plugin necunoscut</translation>
 <translation id="2413749388954403953">Modifică interfața de utilizare pentru marcaje</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Istoricul de navigare</translation>
 <translation id="2497229222757901769">Viteza mouse-ului</translation>
 <translation id="2497852260688568942">Sincronizarea este dezactivată de administrator</translation>
-<translation id="249819058197909513">Nu mai notifica pentru această aplicație</translation>
 <translation id="2498539833203011245">Minimizează</translation>
 <translation id="2498765460639677199">Foarte mare</translation>
 <translation id="2499747912851752301">Se exportă parolele...</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Conectați-vă la Wi-Fi pentru a începe</translation>
 <translation id="2631120081682787498">Sigur vrei să închizi fila?</translation>
 <translation id="2631498379019108537">Afișează pe raft opțiunile de introducere a textului</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> folosește <ph name="USAGE" /> MB din spațiul de pe disc.</translation>
 <translation id="2633212996805280240">Eliminați „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> nu a putut finaliza instalarea, dar va continua să ruleze de pe imaginea de pe disc.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Restabilește</translation>
 <translation id="3158033540161634471">Adaugă amprenta</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (stocat pe hardware)</translation>
-<translation id="316125635462764134">Eliminați aplicația</translation>
 <translation id="3161522574479303604">Toate limbile</translation>
 <translation id="3163201441334626963">Produs necunoscut <ph name="PRODUCT_ID" /> de la furnizorul <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Este posibil ca unii operatori să blocheze funcția.</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">Acest tip de fișier poate dăuna computerului. Vrei să păstrezi <ph name="FILE_NAME" /> totuși?</translation>
 <translation id="3918972485393593704">Raportează detaliile la Google</translation>
 <translation id="3919145445993746351">Pentru a accesa extensiile pe toate computerele, activează sincronizarea</translation>
+<translation id="391999873395511996">Se descarcă mașina virtuală.</translation>
 <translation id="3920504717067627103">Politici de certificat</translation>
 <translation id="392089482157167418">Activați ChromeVox (feedback rostit)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">dispozitive de la producător necunoscut</translation>
 <translation id="3984159763196946143">Modul demonstrativ nu a pornit</translation>
 <translation id="3984431586879874039">Permiți site-ului să vadă cheia de securitate?</translation>
-<translation id="3987348946546879621">Date salvate</translation>
 <translation id="3987938432087324095">Scuze, nu am înțeles.</translation>
 <translation id="3988996860813292272">Selectează fusul orar</translation>
 <translation id="399179161741278232">Importate</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">Editează persoana</translation>
 <translation id="4042264909745389898">Termenii Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Închide pagina}few{Închide paginile}other{Închide paginile}}</translation>
-<translation id="404299405565920089">Toate conturile tale Google conectate din aplicații și site-uri pot fi gestionate aici. Aplicațiile și site-urile care au permisiunea ta pot accesa informațiile despre cont de care au nevoie pentru a funcționa corect.</translation>
 <translation id="4044612648082411741">Introdu parola pentru certificat</translation>
 <translation id="404493185430269859">Motor de căutare prestabilit</translation>
 <translation id="4046123991198612571">Melodia următoare</translation>
@@ -2022,7 +2023,7 @@
 <translation id="409579654357498729">Adăugați la Cloud Print</translation>
 <translation id="4096508467498758490">Dezactivați extensiile care rulează în modul pentru dezvoltatori</translation>
 <translation id="4096824249111507322">Se pregătește modulul securizat. Așteaptă (poate dura câteva minute)...</translation>
-<translation id="4097560579602855702">Căutați pe Google</translation>
+<translation id="4097560579602855702">Caută pe Google</translation>
 <translation id="4099060993766194518">Restabilești motorul de căutare prestabilit?</translation>
 <translation id="4099874310852108874">A apărut o eroare de rețea.</translation>
 <translation id="4100733287846229632">Spațiul de pe dispozitiv este foarte redus</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">Deschide setările</translation>
 <translation id="4242577469625748426">Setările de politică nu au putut fi instalate pe gadget: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Găsește mai multe aplicații pentru creion</translation>
-<translation id="424546999567421758">S-a detectat o utilizare ridicată a spațiului de pe disc</translation>
 <translation id="424726838611654458">Deschide întotdeauna în Adobe Reader</translation>
 <translation id="4247901771970415646">Nu se poate sincroniza cu <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Se așteaptă realizarea conexiunii la rețea...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">Pufoșel</translation>
 <translation id="4422347585044846479">Editați marcajul pentru această pagină</translation>
 <translation id="4423376891418188461">Restabilește setările</translation>
-<translation id="4423482519432579560">&amp;Verificare ortografică</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, administratorul solicită să îți schimbi parola.</translation>
 <translation id="4430019312045809116">Volum</translation>
 <translation id="4430369329743628066">Marcajul a fost adăugat</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">Acum sunteți conectat(ă) la <ph name="SHORT_PRODUCT_NAME" />. Marcajele dvs., istoricul și alte setări sunt sincronizate cu Contul dvs. Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vrea să descarce mai multe fișiere</translation>
-<translation id="5192316339598592690">Comută conturile rapid și conectează-te la aplicații și site-uri simultan.
-    Aplicațiile și site-urile îți pot solicita permisiunea de a folosi unele informații din Contul Google. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Folosește funcția Powerwash pe dispozitiv și încearcă din nou.</translation>
 <translation id="5204967432542742771">Introdu parola</translation>
 <translation id="5206215183583316675">Ștergi „<ph name="CERTIFICATE_NAME" />”?</translation>
@@ -3343,7 +3340,6 @@
 <translation id="622537739776246443">Profilul va fi șters</translation>
 <translation id="6225475702458870625">Conexiune de date disponibilă de pe <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Fișierul cu cheia privată (opțional)</translation>
-<translation id="6228516488918914827">S-a încărcat pagina mai rapidă</translation>
 <translation id="6228691855869374890">Acest site are control complet asupra dispozitivelor MIDI.</translation>
 <translation id="6229890768313448549">Nu se pot încărca Termenii și condițiile Google Play. Încearcă din nou.</translation>
 <translation id="6231881193380278751">Adaugă un parametru de interogare în adresa URL pentru a actualiza automat pagina: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3544,6 @@
 <translation id="6545665334409411530">Frecvența de repetare</translation>
 <translation id="6545834809683560467">Folosește un serviciu de predicții pentru a completa căutările și adresele URL introduse în bara de adrese sau în caseta de căutare a lansatorului de aplicații</translation>
 <translation id="6545867563032584178">Microfonul este dezactivat în System Preferences (Preferințe de sistem) pentru Mac</translation>
-<translation id="6547316139431024316">Nu mai notifica pentru această extensie</translation>
 <translation id="6547354035488017500">Eliberează un spațiu de cel puțin 512 MB sau dispozitivul nu va mai răspunde la comenzi. Pentru a elibera spațiu, șterge fișiere din stocarea dispozitivului.</translation>
 <translation id="6550675742724504774">Opțiuni</translation>
 <translation id="6551508934388063976">Comanda nu este disponibilă. Pentru a deschide o fereastră nouă, apăsați pe Ctrl+N.</translation>
@@ -3872,7 +3867,7 @@
 <translation id="706626672220389329">Eroare la montarea dispozitivului de stocare în rețea. Dispozitivul indicat este deja montat.</translation>
 <translation id="7066944511817949584">Conectarea la „<ph name="DEVICE_NAME" />” a eșuat.</translation>
 <translation id="7067725467529581407">Nu mai afișa niciodată acest mesaj.</translation>
-<translation id="7069811530847688087">Este posibil ca <ph name="WEBSITE" /> să necesite un tip diferit sau mai nou de cheie de securitate</translation>
+<translation id="7069811530847688087"><ph name="WEBSITE" /> poate necesita un tip diferit sau mai nou de cheie de securitate</translation>
 <translation id="7070484045139057854">Poate să citească și să modifice datele site-ului</translation>
 <translation id="7072010813301522126">Numele comenzii rapide</translation>
 <translation id="707392107419594760">Selectează tastatura:</translation>
@@ -4679,7 +4674,6 @@
 <translation id="827097179112817503">Afișează butonul Pagina principală</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 marcaj șters}few{# marcaje șterse}other{# de marcaje șterse}}</translation>
 <translation id="8272443605911821513">Gestionați extensiile dând clic pe Extensii în meniul „Mai multe instrumente”.</translation>
-<translation id="8272966760965438857">Gestionează Conturile Google într-un singur loc</translation>
 <translation id="8274332263553132018">Proiectează fișierul</translation>
 <translation id="8274924778568117936">Nu închide și nu opri dispozitivul <ph name="DEVICE_TYPE" /> înainte să se finalizeze actualizarea. Dispozitivul <ph name="DEVICE_TYPE" /> va reporni după ce se finalizează instalarea.</translation>
 <translation id="8275038454117074363">Importă</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index de0b70d98..c25db5c 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -337,6 +337,7 @@
     В противном случае измените <ph name="LINK_START" />настройки прокси-сервера<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Чтобы отменить это действие, необходимо переустановить <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="151501797353681931">Импортированные из Safari</translation>
+<translation id="1515163294334130951">Запустить</translation>
 <translation id="1521442365706402292">Настроить сертификаты</translation>
 <translation id="152234381334907219">Сайты, пароли для которых не сохраняются</translation>
 <translation id="1524430321211440688">Клавиатура</translation>
@@ -439,6 +440,7 @@
 <translation id="167160931442925455">Максимальная громкость</translation>
 <translation id="1673137583248014546">Сайт <ph name="URL" /> запрашивает доступ к производителю и модели вашего Электронного ключа</translation>
 <translation id="1679068421605151609">Инструменты разработчика</translation>
+<translation id="1679806121152819234">Плагин ВМ</translation>
 <translation id="167983332380191032">От сервиса управления получен недействительный код HTTP.</translation>
 <translation id="1680849702532889074">В процессе установки приложения для Linux произошла ошибка.</translation>
 <translation id="16815041330799488">Не предоставлять сайтам доступ к тексту и изображениям, скопированным в буфер обмена</translation>
@@ -961,7 +963,6 @@
 <translation id="2496180316473517155">История браузера</translation>
 <translation id="2497229222757901769">Скорость указателя (для мыши)</translation>
 <translation id="2497852260688568942">Ваш администратор отключил синхронизацию</translation>
-<translation id="249819058197909513">Больше не показывать для этого приложения</translation>
 <translation id="2498539833203011245">Свернуть</translation>
 <translation id="2498765460639677199">Огромный</translation>
 <translation id="2499747912851752301">Экспорт паролей…</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Подключение к сети Wi-Fi</translation>
 <translation id="2631120081682787498">Закрыть эту вкладку?</translation>
 <translation id="2631498379019108537">Показывать параметры ввода на панели запуска</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> использует <ph name="USAGE" /> МБ дискового пространства.</translation>
 <translation id="2633212996805280240">Удалить "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> не может завершить установку, однако продолжит работу со своего образа на диске.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Восстановить</translation>
 <translation id="3158033540161634471">Добавьте отпечаток пальца</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> (<ph name="ISSUED_TO" />). Поддерживается аппаратным обеспечением.</translation>
-<translation id="316125635462764134">Удалить приложение</translation>
 <translation id="3161522574479303604">Все языки</translation>
 <translation id="3163201441334626963">Неизвестный продукт <ph name="PRODUCT_ID" /> от поставщика <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Некоторые операторы могут блокировать эту функцию.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Файл этого типа может нанести вред компьютеру. Все равно сохранить <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Отправить данные в Google</translation>
 <translation id="3919145445993746351">Чтобы автоматически установить расширения на всех своих компьютерах, включите синхронизацию.</translation>
+<translation id="391999873395511996">Скачивание виртуальной машины…</translation>
 <translation id="3920504717067627103">Политики сертификатов</translation>
 <translation id="392089482157167418">Включить ChromeVox (голосовое сопровождение)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">устройства от неизвестного поставщика</translation>
 <translation id="3984159763196946143">Не удалось запустить демонстрационный режим</translation>
 <translation id="3984431586879874039">Разрешить этому сайту просматривать данные вашего электронного ключа?</translation>
-<translation id="3987348946546879621">Версия для предпросмотра</translation>
 <translation id="3987938432087324095">Извините, не слышно.</translation>
 <translation id="3988996860813292272">Выбор часового пояса</translation>
 <translation id="399179161741278232">Выполнен импорт</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Сменить пользователя</translation>
 <translation id="4042264909745389898">Условия использования Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Закрыть страницу}one{Закрыть страницы}few{Закрыть страницы}many{Закрыть страницы}other{Закрыть страницы}}</translation>
-<translation id="404299405565920089">Здесь можно управлять всеми аккаунтами Google, в которые вы вошли в приложениях и на сайтах. Некоторым сервисам для корректной работы требуется разрешение на доступ к данным аккаунта.</translation>
 <translation id="4044612648082411741">Введите пароль сертификата</translation>
 <translation id="404493185430269859">Поисковая система по умолчанию</translation>
 <translation id="4046123991198612571">Следующий трек</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Открыть настройки</translation>
 <translation id="4242577469625748426">Не удалось применить к устройству настройки политики: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Другие приложения для стилуса</translation>
-<translation id="424546999567421758">Большая нагрузка на диск</translation>
 <translation id="424726838611654458">Всегда открывать в Adobe Reader</translation>
 <translation id="4247901771970415646">Не удалось синхронизироваться с аккаунтом <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Ожидается подключение к сети...</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Пушистик</translation>
 <translation id="4422347585044846479">Изменить эту закладку</translation>
 <translation id="4423376891418188461">Восстановить настройки</translation>
-<translation id="4423482519432579560">&amp;Проверка правописания</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, администратор просит вас сменить пароль.</translation>
 <translation id="4430019312045809116">Объем</translation>
 <translation id="4430369329743628066">Закладка добавлена</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Вы вошли в <ph name="SHORT_PRODUCT_NAME" />. Ваши закладки, история и другие настройки синхронизируются с аккаунтом Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> хочет скачать несколько файлов</translation>
-<translation id="5192316339598592690">Быстро переключайтесь между аккаунтами и выполняйте вход сразу на нескольких сайтах и в разных приложениях.
-    Приложения и сайты могут запрашивать разрешение на использование некоторых ваших данных из аккаунта Google. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Сбросьте настройки устройства и повторите попытку.</translation>
 <translation id="5204967432542742771">Введите пароль</translation>
 <translation id="5206215183583316675">Удалить "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3343,7 +3337,6 @@
 <translation id="622537739776246443">Профиль будет удален</translation>
 <translation id="6225475702458870625">Интернет-подключение доступно через <ph name="PHONE_NAME" />.</translation>
 <translation id="6226777517901268232">Файл секретного ключа (необязательно)</translation>
-<translation id="6228516488918914827">Загружена версия страницы для предпросмотра</translation>
 <translation id="6228691855869374890">Этот сайт имеет полный контроль над устройствами MIDI.</translation>
 <translation id="6229890768313448549">Не удалось скачать Условия использования Google Play. Повторите попытку.</translation>
 <translation id="6231881193380278751">Добавьте в URL параметр запроса для автоматического обновления страницы: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3541,6 @@
 <translation id="6545665334409411530">Скорость повтора</translation>
 <translation id="6545834809683560467">Показывать подсказки при вводе поисковых запросов и URL</translation>
 <translation id="6545867563032584178">Микрофон отключен в системных настройках macOS</translation>
-<translation id="6547316139431024316">Больше не показывать для этого расширения</translation>
 <translation id="6547354035488017500">Чтобы устройство работало, требуется как минимум 512 МБ свободного пространства. Рекомендуем удалить файлы, хранящиеся на устройстве.</translation>
 <translation id="6550675742724504774">Параметры</translation>
 <translation id="6551508934388063976">Команда недоступна. Нажмите Ctrl + N, чтобы открыть новое окно.</translation>
@@ -4678,7 +4670,6 @@
 <translation id="827097179112817503">Показывать кнопку "Главная страница"</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Удалена 1 закладка.}one{Удалена # закладка.}few{Удалено # закладки.}many{Удалено # закладок.}other{Удалено # закладки.}}</translation>
 <translation id="8272443605911821513">Управляйте расширениями в соответствующем разделе в меню дополнительных инструментов.</translation>
-<translation id="8272966760965438857">Централизованно управляйте своими аккаунтами Google</translation>
 <translation id="8274332263553132018">Файл для трансляции</translation>
 <translation id="8274924778568117936">Не выключайте и не закрывайте <ph name="DEVICE_TYPE" />, выполняется обновление. После завершения установки <ph name="DEVICE_TYPE" /> перезагрузится.</translation>
 <translation id="8275038454117074363">Импорт</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index cc20db44..e99b52d 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -338,6 +338,7 @@
     nemali, upravte svoje <ph name="LINK_START" />nastavenia servera proxy<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Jediný spôsob, ako to vrátiť späť, je zopakovať inštaláciu systému <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Importované zo Safari</translation>
+<translation id="1515163294334130951">Spustiť</translation>
 <translation id="1521442365706402292">Spravovať certifikáty</translation>
 <translation id="152234381334907219">Nikdy neukladať</translation>
 <translation id="1524430321211440688">Klávesnica</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Najhlasnejšie</translation>
 <translation id="1673137583248014546"><ph name="URL" /> chce zistiť model a značku vášho bezpečnostného kľúča</translation>
 <translation id="1679068421605151609">Nástroje pre vývojárov</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Služba správy odoslala chybu protokolu HTTP.</translation>
 <translation id="1680849702532889074">Počas inštalácie aplikácie Linux sa vyskytla chyba.</translation>
 <translation id="16815041330799488">Nepovoliť webom prístup k textu a obrázkom skopírovaným do schránky</translation>
@@ -962,7 +964,6 @@
 <translation id="2496180316473517155">História prehliadania</translation>
 <translation id="2497229222757901769">Rýchlosť myši</translation>
 <translation id="2497852260688568942">Synchronizácia je zakázaná správcom</translation>
-<translation id="249819058197909513">Nezobrazovať znova upozornenia pre túto aplikáciu</translation>
 <translation id="2498539833203011245">Minimalizovať</translation>
 <translation id="2498765460639677199">Obrovské</translation>
 <translation id="2499747912851752301">Exportujú sa heslá...</translation>
@@ -1049,7 +1050,6 @@
 <translation id="2630681426381349926">Začnite pripojením k sieti Wi‑Fi</translation>
 <translation id="2631120081682787498">Naozaj chcete povoliť režim ukážky?</translation>
 <translation id="2631498379019108537">Zobraziť možnosti vstupu na poličke</translation>
-<translation id="2633199387167390344">Aplikácia alebo rozšírenie <ph name="NAME" /> využíva <ph name="USAGE" /> MB miesta na disku.</translation>
 <translation id="2633212996805280240">Odstrániť rozšírenie <ph name="EXTENSION_NAME" />?</translation>
 <translation id="263325223718984101">Inštaláciu prehliadača <ph name="PRODUCT_NAME" /> sa nepodarilo dokončiť, ale bude sa naďalej spúšťať z jeho obrazu disku.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1395,7 +1395,6 @@
 <translation id="3157931365184549694">Obnoviť</translation>
 <translation id="3158033540161634471">Nastavenie odtlačku prsta</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (chránené hardvérom)</translation>
-<translation id="316125635462764134">Odstrániť aplikáciu</translation>
 <translation id="3161522574479303604">Všetky jazyky</translation>
 <translation id="3163201441334626963">Neznámy produkt <ph name="PRODUCT_ID" /> od dodávateľa <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Niektorí operátori môžu túto funkciu blokovať.</translation>
@@ -1896,6 +1895,7 @@
 <translation id="3916445069167113093">Tento typ súboru môže poškodiť váš počítač. Chcete súbor <ph name="FILE_NAME" /> aj napriek tomu uložiť?</translation>
 <translation id="3918972485393593704">Hlásiť podrobnosti Googlu</translation>
 <translation id="3919145445993746351">Ak chcete získať svoje rozšírenia vo všetkých počítačoch, zapnite synchronizáciu</translation>
+<translation id="391999873395511996">Sťahuje sa virtuálny počítač.</translation>
 <translation id="3920504717067627103">Certifikačné politiky</translation>
 <translation id="392089482157167418">Povoliť funkciu ChromeVox (hlasovú spätnú väzbu)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1947,7 +1947,6 @@
 <translation id="3983586614702900908">zariadenia od neznámeho dodávateľa</translation>
 <translation id="3984159763196946143">Nepodarilo sa spustiť režim ukážky</translation>
 <translation id="3984431586879874039">Chcete tomuto webu povoliť zobrazenie vášho bezpečnostného kľúča?</translation>
-<translation id="3987348946546879621">Uložené dáta</translation>
 <translation id="3987938432087324095">Je nám to ľúto, ale nebolo vám dobre rozumieť.</translation>
 <translation id="3988996860813292272">Výber časového pásma</translation>
 <translation id="399179161741278232">Importované</translation>
@@ -1978,7 +1977,6 @@
 <translation id="4037889604535939429">Úprava osoby</translation>
 <translation id="4042264909745389898">Zmluvné podmienky systému Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Opustiť stránku}few{Opustiť stránky}many{Opustiť stránky}other{Opustiť stránky}}</translation>
-<translation id="404299405565920089">Tu môžete spravovať všetky účty Google aplikácií a webov, do ktorých ste sa prihlásili. Aplikácie a weby s týmto povolením môžu používať informácie o účte, ktoré potrebujú na správne fungovanie.</translation>
 <translation id="4044612648082411741">Zadajte heslo certifikátu</translation>
 <translation id="404493185430269859">Predvolený vyhľadávač</translation>
 <translation id="4046123991198612571">Ďalšia skladba</translation>
@@ -2093,7 +2091,6 @@
 <translation id="4242533952199664413">Otvoriť nastavenia</translation>
 <translation id="4242577469625748426">Nastavenia pravidla sa nepodarilo nainštalovať na zariadenie: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Nájsť ďalšie aplikácie pre dotykové pero</translation>
-<translation id="424546999567421758">Zistilo sa vysoké využitie disku</translation>
 <translation id="424726838611654458">Vždy otvoriť v programe Adobe Reader</translation>
 <translation id="4247901771970415646">Nedá sa synchronizovať do účtu <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Čaká sa na sieťové pripojenie...</translation>
@@ -2201,7 +2198,6 @@
 <translation id="4421932782753506458">Páperový</translation>
 <translation id="4422347585044846479">Upraviť záložku pre túto stránku</translation>
 <translation id="4423376891418188461">Obnoviť nastavenia</translation>
-<translation id="4423482519432579560">&amp;Kontrola pravopisu</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, váš správca vyžaduje zmenu hesla.</translation>
 <translation id="4430019312045809116">Hlasitosť</translation>
 <translation id="4430369329743628066">Záložka bola pridaná</translation>
@@ -2661,8 +2657,6 @@
 <translation id="5187295959347858724">Ste prihlásený/-á do prehliadača <ph name="SHORT_PRODUCT_NAME" />. Vaše záložky, história a ďalšie nastavenia sa synchronizujú s účtom Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> chce stiahnuť viacero súborov</translation>
-<translation id="5192316339598592690">Rýchlo prepínajte účty a prihláste sa okamžite do aplikácií a webov.
-    Aplikácie a weby môžu požiadať o povolenie používať niektoré vaše informácie o účte Google. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Vykonajte v zariadení obnovu Powerwash a skúste to znova.</translation>
 <translation id="5204967432542742771">Zadajte heslo</translation>
 <translation id="5206215183583316675">Odstrániť certifikát <ph name="CERTIFICATE_NAME" />?</translation>
@@ -3341,7 +3335,6 @@
 <translation id="622537739776246443">Profil bude odstránený</translation>
 <translation id="6225475702458870625">Je k dispozícii dátové pripojenie z vášho zariadenia <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Súkromný kľúč (nepovinné)</translation>
-<translation id="6228516488918914827">Stránka sa načítala rýchlejšie</translation>
 <translation id="6228691855869374890">Tieto stránky majú úplnú kontrolu nad zariadeniami MIDI.</translation>
 <translation id="6229890768313448549">Zmluvné podmienky služby Google Play sa nedajú načítať. Skúste to znova.</translation>
 <translation id="6231881193380278751">Pridajte do webovej adresy parameter dopytu na automatickú aktualizáciu stránky: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3546,7 +3539,6 @@
 <translation id="6545665334409411530">Rýchlosť opakovania</translation>
 <translation id="6545834809683560467">Predpovedať vyhľadávané výrazy a webové adresy zadávané na paneli s adresou alebo vo vyhľadávacom poli spúšťača</translation>
 <translation id="6545867563032584178">Mikrofón je vypnutý v predvoľbách systému Mac</translation>
-<translation id="6547316139431024316">Nezobrazovať znova upozornenia pre toto rozšírenie</translation>
 <translation id="6547354035488017500">Uvoľnite aspoň 512 MB miesta, inak vaše zariadenie prestane reagovať. Miesto uvoľníte odstránením súborov z úložiska zariadenia.</translation>
 <translation id="6550675742724504774">Možnosti</translation>
 <translation id="6551508934388063976">Príkaz nie je k dispozícii. Stlačením kombinácie klávesov CTRL + N otvoríte nové okno.</translation>
@@ -4022,7 +4014,7 @@
 <translation id="7289225569524511578">Otvoriť aplikáciu tapety</translation>
 <translation id="7290242001003353852">Prihlasovacia služba hostená doménou <ph name="SAML_DOMAIN" /> pristupuje k vášmu fotoaparátu.</translation>
 <translation id="7290594223351252791">Potvrdenie registrácie</translation>
-<translation id="7295614427631867477">Upozorňujeme, že Android, Play a spojené aplikácie sa riadia vlastnými pravidlami zhromažďovania údajov a používania.</translation>
+<translation id="7295614427631867477">Upozorňujeme, že Android, Play a príslušné aplikácie sa riadia vlastnými pravidlami zhromažďovania údajov a používania.</translation>
 <translation id="729583233778673644">Povoľte šifrovania AES a RC4. Šifry RC4 sú nezabezpečené, takže použitím tejto možnosti zvýšite riziko.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> – Zmluvné podmienky</translation>
 <translation id="7297443947353982503">Používateľské meno alebo heslo je nesprávne alebo zlyhalo overenie EAP-auth</translation>
@@ -4676,7 +4668,6 @@
 <translation id="827097179112817503">Zobrazovať tlačidlo domovskej stránky</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Bola odstránená 1 záložka}few{Boli odstránené # záložky}many{Bolo odstránenej # záložky}other{Bolo odstránených # záložiek}}</translation>
 <translation id="8272443605911821513">Ak chcete spravovať rozšírenia, kliknite v ponuke Ďalšie nástroje na možnosť Rozšírenia.</translation>
-<translation id="8272966760965438857">Spravujte svoje účty Google na jednom mieste</translation>
 <translation id="8274332263553132018">Prenášať súbor</translation>
 <translation id="8274924778568117936">V priebehu aktualizácie zariadenie <ph name="DEVICE_TYPE" /> nevypínajte ani nezatvárajte. Po dokončení inštalácie sa <ph name="DEVICE_TYPE" /> reštartuje.</translation>
 <translation id="8275038454117074363">Importovať</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 33dc58be..e56a2fab 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -338,6 +338,7 @@
         uporabljati, prilagodite <ph name="LINK_START" />nastavitve proxyja<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">To lahko razveljavite samo tako, da znova namestite <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="151501797353681931">Uvoženo iz Safarija</translation>
+<translation id="1515163294334130951">Zagon</translation>
 <translation id="1521442365706402292">Upravljanje certifikatov</translation>
 <translation id="152234381334907219">Nikoli shranjeno</translation>
 <translation id="1524430321211440688">Tipkovnica</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Najglasneje</translation>
 <translation id="1673137583248014546"><ph name="URL" /> si želi ogledati znamko in model varnostnega ključa</translation>
 <translation id="1679068421605151609">Razvijalska orodja</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Storitev upravljanja je poslala napako HTTP.</translation>
 <translation id="1680849702532889074">Med namestitvijo aplikacije za Linux je prišlo do napake.</translation>
 <translation id="16815041330799488">Spletnim mestom ne dovoli ogleda besedila in slik, kopiranih v odložišče</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Zgodovina brskanja</translation>
 <translation id="2497229222757901769">Hitrost miške</translation>
 <translation id="2497852260688568942">Sinhronizacijo je onemogočil skrbnik</translation>
-<translation id="249819058197909513">Ne opozori več za to aplikacijo</translation>
 <translation id="2498539833203011245">Minimiraj</translation>
 <translation id="2498765460639677199">Zelo velika</translation>
 <translation id="2499747912851752301">Izvažanje gesel ...</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Če želite začeti, vzpostavite povezavo z omrežjem Wi-Fi</translation>
 <translation id="2631120081682787498">Ali ste prepričani, da želite zapreti ta zavihek?</translation>
 <translation id="2631498379019108537">Prikaz možnosti vnosa na polici</translation>
-<translation id="2633199387167390344">Aplikacija/razširitev <ph name="NAME" /> uporablja <ph name="USAGE" /> MB prostora na disku.</translation>
 <translation id="2633212996805280240">Želite odstraniti »<ph name="EXTENSION_NAME" />«?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ni mogel končati namestitve, a se bo še vedno izvajal s posnetka diska.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Obnovi</translation>
 <translation id="3158033540161634471">Nastavite prstni odtis</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (podprto s strojno opremo)</translation>
-<translation id="316125635462764134">Odstrani aplikacijo</translation>
 <translation id="3161522574479303604">Vsi jeziki</translation>
 <translation id="3163201441334626963">Neznan izdelek <ph name="PRODUCT_ID" /> dobavitelja <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Nekateri operaterji morda blokirajo to funkcijo.</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Ta vrsta datoteke lahko poškoduje vaš računalnik. Ali želite vseeno obdržati datoteko <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Sporoči podrobnosti Googlu</translation>
 <translation id="3919145445993746351">Če želite dostopati do razširitev v vseh računalnikih, vklopite sinhronizacijo</translation>
+<translation id="391999873395511996">Prenos navideznega računalnika.</translation>
 <translation id="3920504717067627103">Pravilniki potrdila</translation>
 <translation id="392089482157167418">Omogoči ChromeVox (izgovarjava povratnih informacij)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">naprave neznanega prodajalca</translation>
 <translation id="3984159763196946143">Ni bilo mogoče zagnati predstavitvenega načina</translation>
 <translation id="3984431586879874039">Dovolite, da si to spletno mesto ogleda vaš varnostni ključ?</translation>
-<translation id="3987348946546879621">Shranjeni podatki</translation>
 <translation id="3987938432087324095">Ni bilo razumljivo.</translation>
 <translation id="3988996860813292272">Izbira časovnega pasu</translation>
 <translation id="399179161741278232">Uvoženo</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Urejanje osebe</translation>
 <translation id="4042264909745389898">Pogoji za Googlov OS Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Zapri stran}one{Zapri strani}two{Zapri strani}few{Zapri strani}other{Zapri strani}}</translation>
-<translation id="404299405565920089">Vse račune Google, prijavljene v aplikacijah in na spletnih mestih, je mogoče upravljati tukaj. Aplikacije in spletna mesta, ki imajo vaše dovoljenje, lahko dostopajo do podatkov o računu, ki jih potrebujejo za pravilno delovanje.</translation>
 <translation id="4044612648082411741">Vnesite geslo za potrdilo</translation>
 <translation id="404493185430269859">Privzeti iskalnik</translation>
 <translation id="4046123991198612571">Naslednja skladba</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Odpri nastavitve</translation>
 <translation id="4242577469625748426">Namestitev nastavitev pravilnika v napravi ni uspela: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Iskanje več aplikacij za pisalo</translation>
-<translation id="424546999567421758">Zaznana je bila visoka uporaba diska</translation>
 <translation id="424726838611654458">Vedno odpri v Adobe Readerju</translation>
 <translation id="4247901771970415646">Ni mogoče sinhronizirati z uporabnikom <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Čakanje na povezavo z omrežjem ...</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Puhek</translation>
 <translation id="4422347585044846479">Uredite zaznamek za to stran</translation>
 <translation id="4423376891418188461">Obnovi nastavitve</translation>
-<translation id="4423482519432579560">&amp;Črkovalnik</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, skrbnik zahteva, da spremenite geslo.</translation>
 <translation id="4430019312045809116">Glasnost</translation>
 <translation id="4430369329743628066">Zaznamek dodan</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Zdaj ste prijavljeni v <ph name="SHORT_PRODUCT_NAME" />. Zaznamki, zgodovina in druge nastavitve se sinhronizirajo z vašim Google Računom.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> želi prenesti več datotek</translation>
-<translation id="5192316339598592690">Hkrati hitro preklopite med računi in se prijavite v aplikacije ter na spletnih mestih.
-    Aplikacije in spletna mesta od vas lahko zahtevajo dovoljenje za uporabo nekaterih podatkov v računu za Google. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Opravite postopek »powerwash« v napravi in poskusite znova.</translation>
 <translation id="5204967432542742771">Vnesite geslo</translation>
 <translation id="5206215183583316675">Želite izbrisati »<ph name="CERTIFICATE_NAME" />«?</translation>
@@ -3345,7 +3339,6 @@
 <translation id="622537739776246443">Profil bo izbrisan</translation>
 <translation id="6225475702458870625">Podatkovna povezava je na voljo v napravi <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Datoteka z zasebnim ključem (izbirno)</translation>
-<translation id="6228516488918914827">Hitrejše nalaganje strani</translation>
 <translation id="6228691855869374890">To stran ima popolni nadzor nad napravami MIDI.</translation>
 <translation id="6229890768313448549">Pogojev storitve za Google Play ni mogoče naložiti. Poskusite znova.</translation>
 <translation id="6231881193380278751">Če želite, da se stran samodejno osveži, v URL-ju dodajte parameter iskalne poizvedbe: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3550,7 +3543,6 @@
 <translation id="6545665334409411530">Hitrost ponavljanja</translation>
 <translation id="6545834809683560467">Za pomoč pri dokončanju iskalnih poizvedb in URL-jev, vnesenih v naslovno vrstico ali iskalno polje zaganjalnika aplikacij, uporabite storitev za predvidevanje</translation>
 <translation id="6545867563032584178">Mikrofon je izklopljen v nastavitvah sistema macOS</translation>
-<translation id="6547316139431024316">Ne opozori več za to razširitev</translation>
 <translation id="6547354035488017500">Sprostite najmanj 512 MB prostora, sicer bo postala naprava neodzivna. Če želite sprostiti prostor, izbrišite datoteke iz shrambe v napravi.</translation>
 <translation id="6550675742724504774">Možnosti</translation>
 <translation id="6551508934388063976">Ukaz ni na voljo. Odprite novo okno s pritiskom tipk CTRL + N.</translation>
@@ -4681,7 +4673,6 @@
 <translation id="827097179112817503">Pokaži gumb za domačo stran</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 zaznamek izbrisan}one{# zaznamek izbrisan}two{# zaznamka izbrisana}few{# zaznamki izbrisani}other{# zaznamkov izbrisanih}}</translation>
 <translation id="8272443605911821513">Razširitve lahko upravljate tako, da v meniju »Več orodij« kliknete »Razširitve«.</translation>
-<translation id="8272966760965438857">Upravljanje računov za Google na enem mestu</translation>
 <translation id="8274332263553132018">Predvajanje datoteke</translation>
 <translation id="8274924778568117936">Ne izklopite ali zaprite naprave <ph name="DEVICE_TYPE" />, dokler se posodobitev ne konča. Naprava <ph name="DEVICE_TYPE" /> se bo po končani namestitvi znova zagnala.</translation>
 <translation id="8275038454117074363">Uvozi</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index eece7e6..e5fb4fe 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">Ако користите прокси сервер, проверите подешавања проксија или контактирајте администратора мреже да бисте проверили да ли прокси сервер функционише. Ако не сматрате да треба да користите прокси сервер, прилагодите <ph name="LINK_START" />подешавања проксија<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Једини начин да ово опозовете је да поново инсталирате <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Увоз из прегледача Safari</translation>
+<translation id="1515163294334130951">Покрени</translation>
 <translation id="1521442365706402292">Управљај сертификатима</translation>
 <translation id="152234381334907219">Никада се не чува</translation>
 <translation id="1524430321211440688">Тастатура</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">Најгласније</translation>
 <translation id="1673137583248014546"><ph name="URL" /> жели да види произвођача и модел безбедносног кључа</translation>
 <translation id="1679068421605151609">Алатке за програмере</translation>
+<translation id="1679806121152819234">Додатна компонента VM</translation>
 <translation id="167983332380191032">Услуга управљања је послала HTTP грешку.</translation>
 <translation id="1680849702532889074">Дошло је до грешке током инсталирања Linux апликације.</translation>
 <translation id="16815041330799488">Не дозвољавај сајтовима да виде текст и слике који су копирани у привремену меморију</translation>
@@ -483,6 +485,7 @@
 <translation id="1744060673522309905">Придруживање уређаја домену није успело. Уверите се да нисте премашили број уређаја које можете да додате.</translation>
 <translation id="1744108098763830590">страница у позадини</translation>
 <translation id="1745520510852184940">Увек ради ово</translation>
+<translation id="1746402432151920942">Идентификатор заштићеног садржаја</translation>
 <translation id="175196451752279553">П&amp;оново отвори затворену картицу</translation>
 <translation id="1753905327828125965">Најпосећеније</translation>
 <translation id="1756681705074952506">Метод уноса</translation>
@@ -540,6 +543,7 @@
 <translation id="1830550083491357902">Нисте пријављени</translation>
 <translation id="1832511806131704864">Промена телефона је ажурирана</translation>
 <translation id="1834503245783133039">Преузимање није успело: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">MIDI уређаји</translation>
 <translation id="1838374766361614909">Обришите претрагу</translation>
 <translation id="1841545962859478868">Администратор уређаја може да прати следеће:</translation>
 <translation id="1841616161104323629">Недостаје евиденција уређаја.</translation>
@@ -783,6 +787,7 @@
 <translation id="2220529011494928058">Пријави проблем</translation>
 <translation id="2220572644011485463">PIN или лозинка</translation>
 <translation id="2224444042887712269">Власник овог подешавања је <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Догађаји приступачности</translation>
 <translation id="2224551243087462610">Измена имена директоријума</translation>
 <translation id="2226449515541314767">Спречено је да овај сајт у потпуности контролише MIDI уређаје.</translation>
 <translation id="2226720438730111184">Реците нам шта се дешава</translation>
@@ -960,7 +965,6 @@
 <translation id="2496180316473517155">Историја прегледања</translation>
 <translation id="2497229222757901769">Брзина миша</translation>
 <translation id="2497852260688568942">Администратор је онемогућио синхронизацију</translation>
-<translation id="249819058197909513">Не упозоравај поново за ову апликацију</translation>
 <translation id="2498539833203011245">Умањи</translation>
 <translation id="2498765460639677199">Огромна</translation>
 <translation id="2499747912851752301">Извозе се лозинке...</translation>
@@ -1047,7 +1051,6 @@
 <translation id="2630681426381349926">Повежите са Wi-Fi-јем да бисте започели</translation>
 <translation id="2631120081682787498">Желите ли стварно да затворите ову картицу?</translation>
 <translation id="2631498379019108537">Приказуј опције уноса у полици</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> користи <ph name="USAGE" /> MB простора на диску.</translation>
 <translation id="2633212996805280240">Желите ли да уклоните „<ph name="EXTENSION_NAME" />“?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> није могао да доврши инсталацију, али ће наставити да се покреће са слике диска.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1393,7 +1396,6 @@
 <translation id="3157931365184549694">Поново отвори</translation>
 <translation id="3158033540161634471">Подесите отисак прста</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (хардвер је сертификован)</translation>
-<translation id="316125635462764134">Уклони апликацију</translation>
 <translation id="3161522574479303604">Сви језици</translation>
 <translation id="3163201441334626963">Непознати производ <ph name="PRODUCT_ID" /> продавца <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Неки мобилни оператери могу да блокирају ову функцију.</translation>
@@ -1894,6 +1896,7 @@
 <translation id="3916445069167113093">Овај тип датотеке може да нашкоди рачунару. Да ли ипак желите да задржите датотеку <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Шаљи детаље Google-у</translation>
 <translation id="3919145445993746351">Да би вам додаци били доступни на свим рачунарима, укључите синхронизацију</translation>
+<translation id="391999873395511996">Преузима се виртуелна машина.</translation>
 <translation id="3920504717067627103">Смернице сертификата</translation>
 <translation id="392089482157167418">Омогући ChromeVox (говорне повратне информације)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1945,7 +1948,6 @@
 <translation id="3983586614702900908">уређаји непознатог продавца</translation>
 <translation id="3984159763196946143">Покретање режима демонстрације није успело</translation>
 <translation id="3984431586879874039">Желите ли да дозволите овом сајту да види безбедносни кључ?</translation>
-<translation id="3987348946546879621">Сачувани подаци</translation>
 <translation id="3987938432087324095">Жао нам је, нисмо вас чули.</translation>
 <translation id="3988996860813292272">Изаберите временску зону</translation>
 <translation id="399179161741278232">Увезени</translation>
@@ -1976,7 +1978,6 @@
 <translation id="4037889604535939429">Измена особе</translation>
 <translation id="4042264909745389898">Услови за Google Chrome ОС</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Затвори страницу}one{Затвори странице}few{Затвори странице}other{Затвори странице}}</translation>
-<translation id="404299405565920089">Одавде можете да управљате свим Google налозима на које сте пријављени у апликацијама и на веб-сајтовима. Апликације и веб-сајтови који имају дозволи могу да приступају информацијама о налогу које су им потребне да би нормално радили.</translation>
 <translation id="4044612648082411741">Унесите лозинку за сертификат</translation>
 <translation id="404493185430269859">Подразумевани претраживач</translation>
 <translation id="4046123991198612571">Следећа песма</translation>
@@ -2091,7 +2092,6 @@
 <translation id="4242533952199664413">Отвори подешавања</translation>
 <translation id="4242577469625748426">Није успело инсталирање подешавања смерница на уређају: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Пронађи још апликација за писаљку</translation>
-<translation id="424546999567421758">Откривена је велика искоришћеност диска</translation>
 <translation id="424726838611654458">Увек отвори у Adobe Reader-у</translation>
 <translation id="4247901771970415646">Није успела синхронизација за <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Чека се мрежна веза...</translation>
@@ -2199,7 +2199,6 @@
 <translation id="4421932782753506458">Пуфница</translation>
 <translation id="4422347585044846479">Измените обележивач за ову страницу</translation>
 <translation id="4423376891418188461">Врати подешавања</translation>
-<translation id="4423482519432579560">&amp;Провера правописа</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, администратор захтева да промените лозинку.</translation>
 <translation id="4430019312045809116">Јачина звука</translation>
 <translation id="4430369329743628066">Обележивач је додат</translation>
@@ -2659,8 +2658,6 @@
 <translation id="5187295959347858724">Сада сте пријављени на <ph name="SHORT_PRODUCT_NAME" />. Обележивачи, историја и друга подешавања се синхронизују са Google налогом.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> жели да преузме више датотека</translation>
-<translation id="5192316339598592690">Брзо мењајте налоге и пријављујте се у све апликације и веб-сајтове одједном.
-    Апликације и сајтови могу да вам затраже дозволу да користе неке информације о Google налогу. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Обавите Powerwash на уређају и пробајте поново.</translation>
 <translation id="5204967432542742771">Унесите лозинку</translation>
 <translation id="5206215183583316675">Желите ли да избришете „<ph name="CERTIFICATE_NAME" />“?</translation>
@@ -3341,7 +3338,6 @@
 <translation id="622537739776246443">Профил ће бити избрисан</translation>
 <translation id="6225475702458870625">Веза за пренос података је доступна на телефону <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Датотека приватног кључа (опционално)</translation>
-<translation id="6228516488918914827">Брже је учитана страница</translation>
 <translation id="6228691855869374890">Овај сајт у потпуности контролише MIDI уређаје.</translation>
 <translation id="6229890768313448549">Услови коришћења услуге Google Play не могу да се учитају. Пробајте поново.</translation>
 <translation id="6231881193380278751">Додајте параметар упита у URL да бисте аутоматски освежили страницу: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3546,7 +3542,6 @@
 <translation id="6545665334409411530">Брзина понављања</translation>
 <translation id="6545834809683560467">Користите услугу предвиђања за довршавање упита за претрагу и URL-ова које куцате у траци за адресу или оквиру за претрагу у покретачу апликација</translation>
 <translation id="6545867563032584178">Микрофон је искључен у подешавањима Mac система</translation>
-<translation id="6547316139431024316">Не упозоравај поново за овај додатак</translation>
 <translation id="6547354035488017500">Ослободите бар 512 MB простора или ће уређај престати да се одазива. Да бисте ослободили простор, избришите датотеке из меморијског простора уређаја.</translation>
 <translation id="6550675742724504774">Опције</translation>
 <translation id="6551508934388063976">Команда није доступна. Притисните control-N да бисте отворили нови прозор.</translation>
@@ -4677,7 +4672,6 @@
 <translation id="827097179112817503">Прикажи дугме за почетну страницу</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 обележивач је избрисан}one{# обележивач је избрисан}few{# обележивача су избрисана}other{# обележивача је избрисано}}</translation>
 <translation id="8272443605911821513">Управљајте додацима кликом на Додаци у менију „Још алатки“.</translation>
-<translation id="8272966760965438857">Управљајте Google налозима на једном месту</translation>
 <translation id="8274332263553132018">Пребаците датотеку</translation>
 <translation id="8274924778568117936">Не искључујте и не затварајте <ph name="DEVICE_TYPE" /> док се ажурирање не заврши. <ph name="DEVICE_TYPE" /> ће се поново покренути када се инсталација заврши.</translation>
 <translation id="8275038454117074363">Увези</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 090a1f0..8ec86670 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -338,6 +338,7 @@
     proxyserver ändrar du <ph name="LINK_START" />proxyinställningarna<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Du kan endast ångra det här genom att installera om <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="151501797353681931">Importerat från Safari</translation>
+<translation id="1515163294334130951">Starta</translation>
 <translation id="1521442365706402292">Hantera certifikat</translation>
 <translation id="152234381334907219">Aldrig sparat</translation>
 <translation id="1524430321211440688">Tangentbord</translation>
@@ -439,6 +440,7 @@
 <translation id="167160931442925455">Högst</translation>
 <translation id="1673137583248014546"><ph name="URL" /> vill få tillgång till din säkerhetsnyckels märke och modell.</translation>
 <translation id="1679068421605151609">Verktyg för utvecklare</translation>
+<translation id="1679806121152819234">PluginVM</translation>
 <translation id="167983332380191032">Hanteringstjänsten skickade ett HTTP-fel.</translation>
 <translation id="1680849702532889074">Ett fel uppstod under installationen av Linux-programmet.</translation>
 <translation id="16815041330799488">Ge inte webbplatser tillgång till text och bilder som kopierats till Urklipp</translation>
@@ -485,6 +487,7 @@
 <translation id="1744060673522309905">Det gick inte att ansluta enheten till domänen. Kontrollera att du inte redan har lagt till det högsta tillåtna antalet enheter.</translation>
 <translation id="1744108098763830590">bakgrundssida</translation>
 <translation id="1745520510852184940">Gör alltid detta</translation>
+<translation id="1746402432151920942">Identifierare för skyddad media</translation>
 <translation id="175196451752279553">Ö&amp;ppna en stängd flik igen</translation>
 <translation id="1753905327828125965">Mest besökta</translation>
 <translation id="1756681705074952506">Inmatningsmetod</translation>
@@ -542,6 +545,7 @@
 <translation id="1830550083491357902">Inte inloggad</translation>
 <translation id="1832511806131704864">Mobiländringen har uppdaterats</translation>
 <translation id="1834503245783133039">Nedladdningen misslyckades: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">MIDI-enheter</translation>
 <translation id="1838374766361614909">Rensa sökning</translation>
 <translation id="1841545962859478868">Enhetsadministratören kan övervaka följande:</translation>
 <translation id="1841616161104323629">Uppgift om enheten saknas.</translation>
@@ -785,6 +789,7 @@
 <translation id="2220529011494928058">Rapportera ett problem</translation>
 <translation id="2220572644011485463">Pinkod eller lösenord</translation>
 <translation id="2224444042887712269">Den här inställningen tillhör <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Tillgänglighetshändelser</translation>
 <translation id="2224551243087462610">Redigera mappnamn</translation>
 <translation id="2226449515541314767">Webbplatsen har blockerats från fullständig kontroll över MIDI-enheter.</translation>
 <translation id="2226720438730111184">Berätta vad som händer</translation>
@@ -962,7 +967,6 @@
 <translation id="2496180316473517155">Webbhistorik</translation>
 <translation id="2497229222757901769">Mushastighet</translation>
 <translation id="2497852260688568942">Synkronisering har inaktiverats av administratören</translation>
-<translation id="249819058197909513">Varna inte för den här appen fler gånger</translation>
 <translation id="2498539833203011245">Minimera</translation>
 <translation id="2498765460639677199">Enorm</translation>
 <translation id="2499747912851752301">Lösenorden exporteras …</translation>
@@ -1050,7 +1054,6 @@
 <translation id="2630681426381349926">Anslut till Wi-Fi om du vill börja</translation>
 <translation id="2631120081682787498">Vill du stänga fliken?</translation>
 <translation id="2631498379019108537">Visa inmatningsalternativ på hyllan</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> använder <ph name="USAGE" /> MB diskutrymme.</translation>
 <translation id="2633212996805280240">Vill du ta bort <ph name="EXTENSION_NAME" />?</translation>
 <translation id="263325223718984101">Installationen av <ph name="PRODUCT_NAME" /> kunde inte slutföras, men programmet kommer att fortsätta köras från diskavbildningen.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1396,7 +1399,6 @@
 <translation id="3157931365184549694">Återställ</translation>
 <translation id="3158033540161634471">Konfigurera fingeravtryck</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (med maskinvarustöd)</translation>
-<translation id="316125635462764134">Ta bort app</translation>
 <translation id="3161522574479303604">Alla språk</translation>
 <translation id="3163201441334626963">Okänd produkt (<ph name="PRODUCT_ID" />) från leverantören <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Vissa operatörer kanske blockerar den här funktionen.</translation>
@@ -1897,6 +1899,7 @@
 <translation id="3916445069167113093">Den här typen av fil kan skada datorn. Vill du behålla <ph name="FILE_NAME" /> ändå?</translation>
 <translation id="3918972485393593704">Rapportera informationen till Google</translation>
 <translation id="3919145445993746351">Aktivera synkronisering om du vill ha tilläggen på alla dina datorer</translation>
+<translation id="391999873395511996">Den virtuella maskinen laddas ned.</translation>
 <translation id="3920504717067627103">Certifikatpolicyer</translation>
 <translation id="392089482157167418">Aktivera ChromeVox (talad feedback)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1948,7 +1951,6 @@
 <translation id="3983586614702900908">enheter från en okänd leverantör</translation>
 <translation id="3984159763196946143">Det gick inte att starta demoläget</translation>
 <translation id="3984431586879874039">Vill du tillåta att webbplatsen ser din säkerhetsnyckel?</translation>
-<translation id="3987348946546879621">Sparar data</translation>
 <translation id="3987938432087324095">Det gick inte att uppfatta vad du sade.</translation>
 <translation id="3988996860813292272">Välj tidszon</translation>
 <translation id="399179161741278232">Importerade</translation>
@@ -1979,7 +1981,6 @@
 <translation id="4037889604535939429">Redigera person</translation>
 <translation id="4042264909745389898">Villkor för Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Lämna sidan}other{Lämna sidorna}}</translation>
-<translation id="404299405565920089">Alla inloggade Google-konton från appar och webbplatser kan hanteras här. Appar och webbplatser som du har gett behörighet kan använda den kontoinformation de behöver för att fungera som de ska.</translation>
 <translation id="4044612648082411741">Ange certifikatlösenordet</translation>
 <translation id="404493185430269859">Standardsökmotor</translation>
 <translation id="4046123991198612571">Nästa spår</translation>
@@ -2094,7 +2095,6 @@
 <translation id="4242533952199664413">Öppna Inställningar</translation>
 <translation id="4242577469625748426">Det gick inte att installera policyinställningar på enheten: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Hitta fler appar för e-penna</translation>
-<translation id="424546999567421758">Intensiv användning av disken har upptäckts</translation>
 <translation id="424726838611654458">Öppna alltid i Adobe Reader</translation>
 <translation id="4247901771970415646">Det gick inte att synkronisera med <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Väntar på nätverksanslutning ...</translation>
@@ -2202,7 +2202,6 @@
 <translation id="4421932782753506458">Misse</translation>
 <translation id="4422347585044846479">Redigera bokmärke för den här sidan</translation>
 <translation id="4423376891418188461">Återställ inställningar</translation>
-<translation id="4423482519432579560">&amp;Stavningskontroll</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, administratören kräver att du ändrar ditt lösenord.</translation>
 <translation id="4430019312045809116">Volym</translation>
 <translation id="4430369329743628066">Ett bokmärke har lagts till</translation>
@@ -2662,8 +2661,6 @@
 <translation id="5187295959347858724">Du är nu inloggad i <ph name="SHORT_PRODUCT_NAME" />. Bokmärken, historik och andra inställningar synkroniseras med ditt Google-konto.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> vill ladda ned flera filer</translation>
-<translation id="5192316339598592690">Byt snabbt mellan konton och logga in i appar och på webbplatser på samma gång.
-    Appar och webbplatser kan begära behörighet att använda vissa uppgifter i ditt Google-konto. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Gör en powerwash på enheten och försök igen.</translation>
 <translation id="5204967432542742771">Ange lösenord</translation>
 <translation id="5206215183583316675">Vill du radera <ph name="CERTIFICATE_NAME" />?</translation>
@@ -3342,7 +3339,6 @@
 <translation id="622537739776246443">Profilen raderas</translation>
 <translation id="6225475702458870625">En dataanslutning är tillgänglig via din <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Privat nyckelfil (valfritt)</translation>
-<translation id="6228516488918914827">Sidan lästes in snabbare</translation>
 <translation id="6228691855869374890">Den här webbplatsen har fullständig kontroll över MIDI-enheter.</translation>
 <translation id="6229890768313448549">Det gick inte att läsa in användarvillkoren för Google Play. Försök igen.</translation>
 <translation id="6231881193380278751">Lägg till en frågeparameter i webbadressen för att automatiskt uppdatera sidan: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3547,7 +3543,6 @@
 <translation id="6545665334409411530">Upprepningsintervall</translation>
 <translation id="6545834809683560467">Använd en förslagstjänst om du vill ha hjälp att slutföra sökningar och fylla i webbadresser i adressfältet eller i sökrutan i startprogrammet för appar</translation>
 <translation id="6545867563032584178">Mikrofon har inaktiverats i systeminställningarna för Mac.</translation>
-<translation id="6547316139431024316">Varna inte för det här tillägget fler gånger</translation>
 <translation id="6547354035488017500">Frigör åtminstone 512 MB utrymme för att enheten ska fortsätta att svara. Frigör utrymme genom att radera filer från lagringsutrymmet på enheten.</translation>
 <translation id="6550675742724504774">Alternativ</translation>
 <translation id="6551508934388063976">Kommandot är inte tillgängligt. Tryck på Ctrl+N om du vill öppna ett nytt fönster.</translation>
@@ -4678,7 +4673,6 @@
 <translation id="827097179112817503">Visa hemknappen</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Bokmärket har raderats}other{# bokmärken har raderats}}</translation>
 <translation id="8272443605911821513">Hantera dina tillägg genom att klicka på Tillägg i menyn Fler verktyg.</translation>
-<translation id="8272966760965438857">Hantera dina Google-konton på ett enda ställe</translation>
 <translation id="8274332263553132018">Casta fil</translation>
 <translation id="8274924778568117936">Stäng inte av eller stäng <ph name="DEVICE_TYPE" /> förrän uppdateringen har slutförts. <ph name="DEVICE_TYPE" /> startas om när installationen är slutförd.</translation>
 <translation id="8275038454117074363">Importera</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 287b33b..00cf10a 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">Ukitumia seva ya proksi, angalia mipangilio yako ya proksi au wasiliana na msimamizi wako wa mtandao ili kuhakikisha kuwa seva ya proksi inafanya kazi. Ikiwa huamini kuwa unafaa kuwa ukitumia seva ya proksi, rekebisha <ph name="LINK_START" />mipangilio yako ya proksi<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Njia pekee ya kutendua hili ni kusakinisha tena <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Zilizoingizwa Kutoka Safari</translation>
+<translation id="1515163294334130951">Zindua</translation>
 <translation id="1521442365706402292">Dhibiti vyeti</translation>
 <translation id="152234381334907219">Hayatahifadhiwa Kamwe</translation>
 <translation id="1524430321211440688">Kibodi</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">Sauti ya juu kabisa</translation>
 <translation id="1673137583248014546"><ph name="URL" /> ingependa kuona muundo na aina ya Ufunguo wako wa Usalama</translation>
 <translation id="1679068421605151609">Zana za Wasadini Programu</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">Huduma ya usimamizi ilituma hitilafu ya HTTP.</translation>
 <translation id="1680849702532889074">Hitilafu imetokea wakati wa kusakinisha programu yako ya Linux.</translation>
 <translation id="16815041330799488">Usiruhusu tovuti zione maandishi na picha zilizonakiliwa kwenye ubao wa kunakili</translation>
@@ -483,6 +485,7 @@
 <translation id="1744060673522309905">Imeshindwa kuunganisha kifaa kwenye kikoa. Hakikisha kuwa hujapitisha idadi ya vifaa unavyoruhusiwa kuongeza.</translation>
 <translation id="1744108098763830590">Ukurasa wa mandharinyuma</translation>
 <translation id="1745520510852184940">Fanya Hivi Kila Mara</translation>
+<translation id="1746402432151920942">Kitambulishi cha Maudhui Yanayolindwa</translation>
 <translation id="175196451752279553">&amp;Fungua tena kichupo kilichofungwa</translation>
 <translation id="1753905327828125965">Zinazotembelewa Zaidi</translation>
 <translation id="1756681705074952506">Mbinu ya uingizaji</translation>
@@ -540,6 +543,7 @@
 <translation id="1830550083491357902">Haijaingiwa</translation>
 <translation id="1832511806131704864">Mabadiliko ya simu yamesasishwa</translation>
 <translation id="1834503245783133039">Imeshindwa kupakua: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Vifaa vya MIDI</translation>
 <translation id="1838374766361614909">Futa utafutaji</translation>
 <translation id="1841545962859478868">Msimamizi wa kifaa anaweza kufuatilia mambo yafuatayo:</translation>
 <translation id="1841616161104323629">Rekodi ya kifaa haipo.</translation>
@@ -783,6 +787,7 @@
 <translation id="2220529011494928058">Ripoti tatizo</translation>
 <translation id="2220572644011485463">PIN au nenosiri</translation>
 <translation id="2224444042887712269">Mipangilio hii ni ya <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Matukio ya Kuwasha Zana za Walio na Matatizo ya Kuona au Kusikia</translation>
 <translation id="2224551243087462610">Badilisha jina la folda</translation>
 <translation id="2226449515541314767">Tovuti imezuiwa isiwe na udhibiti kamili wa vifaa vya MIDI.</translation>
 <translation id="2226720438730111184">Tueleze Kinachotendeka</translation>
@@ -960,7 +965,6 @@
 <translation id="2496180316473517155">Historia ya kuvinjari</translation>
 <translation id="2497229222757901769">Kasi ya kipanya</translation>
 <translation id="2497852260688568942">Usawazishaji umezimwa na msimamizi wako</translation>
-<translation id="249819058197909513">Usitume onyo kuhusu programu hii tena</translation>
 <translation id="2498539833203011245">Punguza</translation>
 <translation id="2498765460639677199">Kubwa mno</translation>
 <translation id="2499747912851752301">Inahamisha manenosiri...</translation>
@@ -1047,7 +1051,6 @@
 <translation id="2630681426381349926">Unganisha katika Wi-Fi ili kuanza</translation>
 <translation id="2631120081682787498">Una hakika kuwa ungependa kuzima kichupo hiki?</translation>
 <translation id="2631498379019108537">Onyesha chaguo za kuingiza data katika rafu</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> inatumia MB <ph name="USAGE" /> za diski.</translation>
 <translation id="2633212996805280240">Ondoa "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> haikukamilisha usakinishaji, lakini itaendelea kuendesha kutoka kwa picha yake ya diski.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1393,7 +1396,6 @@
 <translation id="3157931365184549694">Rejesha</translation>
 <translation id="3158033540161634471">Weka mipangilio ya alama ya kidole</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (inatumia maunzi)</translation>
-<translation id="316125635462764134">Ondoa programu</translation>
 <translation id="3161522574479303604">Lugha zote</translation>
 <translation id="3163201441334626963">Bidhaa isiyojulikana <ph name="PRODUCT_ID" /> kutoka kwa mchuuzi <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Huenda watoa huduma wengine wakazuia kipengele hiki.</translation>
@@ -1891,6 +1893,7 @@
 <translation id="3916445069167113093">Aina hii ya faili inaweza kudhuru kompyuta yako. Je, unataka kuweka <ph name="FILE_NAME" /> licha ya hayo?</translation>
 <translation id="3918972485393593704">Ripoti maelezo kwa Google</translation>
 <translation id="3919145445993746351">Ili upate viendelezi vyako kwenye kompyuta zako zote, washa kipengele cha kusawazisha</translation>
+<translation id="391999873395511996">Inapakua mashine dhahania.</translation>
 <translation id="3920504717067627103">Sera za Vyeti</translation>
 <translation id="392089482157167418">Washa ChromeVox (maoni yaliyotamkwa)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1942,7 +1945,6 @@
 <translation id="3983586614702900908">vifaa kutoka kwa mchuuzi asiyejulikana</translation>
 <translation id="3984159763196946143">Imeshindwa kuanzisha hali ya onyesho</translation>
 <translation id="3984431586879874039">Ungependa kuruhusu tovuti hii kuona ufunguo wako wa usalama?</translation>
-<translation id="3987348946546879621">Data imeokolewa</translation>
 <translation id="3987938432087324095">Samahani, haikurekodi sauti hiyo.</translation>
 <translation id="3988996860813292272">Chagua saa za eneo</translation>
 <translation id="399179161741278232">Zilizoingizwa</translation>
@@ -1973,7 +1975,6 @@
 <translation id="4037889604535939429">Badilisha wasifu wa mtumiaji</translation>
 <translation id="4042264909745389898">Sheria na masharti ya Mfumo wa Uendeshaji wa Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Funga Ukurasa}other{Funga Kurasa}}</translation>
-<translation id="404299405565920089">Unaweza kudhibiti akaunti zako zote za Google unazotumika kuingia katika programu na tovuti hapa. Programu na tovuti ambazo umeruhusu zinaweza kufikia maelezo ya akaunti ambayo zinahitaji ili kufanya kazi vizuri.</translation>
 <translation id="4044612648082411741">Weka nenosiri la cheti chako</translation>
 <translation id="404493185430269859">Injini tafuti chaguomsingi</translation>
 <translation id="4046123991198612571">Wimbo unaofuata</translation>
@@ -2086,7 +2087,6 @@
 <translation id="4242533952199664413">Fungua mipangilio</translation>
 <translation id="4242577469625748426">Imeshindwa kusakinisha mipangilio ya sera kwenye kifaa: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Pata programu zaidi za stylus</translation>
-<translation id="424546999567421758">Utumiaji mkubwa wa diski umegunduliwa</translation>
 <translation id="424726838611654458">Fungua katika Adobe Reader wakati wowote</translation>
 <translation id="4247901771970415646">Imeshindwa kusawazisha kwenye <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Inasubiri muunganisho kwa mtandao...</translation>
@@ -2194,7 +2194,6 @@
 <translation id="4421932782753506458">Kibonge</translation>
 <translation id="4422347585044846479">Badilisha alamisho ya ukurasa huu</translation>
 <translation id="4423376891418188461">Rejesha Mipangilio</translation>
-<translation id="4423482519432579560">Kukagua maendelezo</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, msimamizi wako anakuhitaji ubadilishe nenosiri lako.</translation>
 <translation id="4430019312045809116">Kiwango</translation>
 <translation id="4430369329743628066">Alamisho imeongezwa</translation>
@@ -2654,8 +2653,6 @@
 <translation id="5187295959347858724">Sasa umeingia kwenye <ph name="SHORT_PRODUCT_NAME" />. Alamisho zako, historia, na mipangilio mingine vinalinganishwa kwa Akaunti yako ya Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> inataka kupakua faili kadhaa</translation>
-<translation id="5192316339598592690">Badili akaunti kwa haraka na uingie katika programu na tovuti kwa wakati mmoja.
-    Programu na tovuti zinaweza kukuomba ruhusa ili kutumia baadhi ya maelezo ya Akaunti yako ya Google. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Tafadhali powerwash kifaa na ujaribu tena.</translation>
 <translation id="5204967432542742771">Weka nenosiri</translation>
 <translation id="5206215183583316675">Ungependa kufuta "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3334,7 +3331,6 @@
 <translation id="622537739776246443">Wasifu utafutwa</translation>
 <translation id="6225475702458870625">Muunganisho wa data unapatikana kutoka kwenye <ph name="PHONE_NAME" /> yako</translation>
 <translation id="6226777517901268232">Faili ya ufunguo binafsi (hiari)</translation>
-<translation id="6228516488918914827">Imepakia ukurasa unaofunguka haraka</translation>
 <translation id="6228691855869374890">Tovuti hii ina udhibiti kamili wa vifaa vya MIDI.</translation>
 <translation id="6229890768313448549">Sheria na Masharti ya Google Play hayawezi kupakiwa. Tafadhali jaribu tena.</translation>
 <translation id="6231881193380278751">Ongeza hoja katika URL ili kuonyesha upya ukurasa kiotomatiki: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3438,7 +3434,7 @@
 <translation id="6390994422085833176">Kagua vipengee vya kuweka mapendeleo na usawazishaji vinavyotokana na mipangilio</translation>
 <translation id="6393156038355142111">Pendekeza nenosiri thabiti</translation>
 <translation id="6395423953133416962">Tuma <ph name="BEGIN_LINK1" />maelezo ya mfumo<ph name="END_LINK1" /> na <ph name="BEGIN_LINK2" />hesabu<ph name="END_LINK2" /></translation>
-<translation id="6396988158856674517">Zuia touti zisitumie vitambuzi vya mwendo</translation>
+<translation id="6396988158856674517">Zuia tovuti zisitumie vitambuzi vya mwendo</translation>
 <translation id="6397094776139756010">Chaguo za usawazishaji na kuweka mapendeleo</translation>
 <translation id="6398715114293939307">Ondoa Duka la Google Play</translation>
 <translation id="6398765197997659313">Ondoka kwenye Skrini nzima</translation>
@@ -3539,7 +3535,6 @@
 <translation id="6545665334409411530">Ukadiriaji wa kurudia</translation>
 <translation id="6545834809683560467">Tumia huduma ya kutabiri ili isaidie kukamilisha utafutaji na URL zilizoingizwa katika upau wa anwani au katika kisanduku cha kutafutia kizindua programu</translation>
 <translation id="6545867563032584178">Maikrofoni imezimwa katika Mapendeleo ya Mfumo wa Mac</translation>
-<translation id="6547316139431024316">Usitume onyo kuhusu kiendelezi hiki tena</translation>
 <translation id="6547354035488017500">Futa angalau MB 512 za hifadhi, la sivyo kifaa chako kitakwama. Ili kupata nafasi, futa faili kwenye hifadhi ya kifaa.</translation>
 <translation id="6550675742724504774">Chaguo</translation>
 <translation id="6551508934388063976">Amri haipo. Bonyeza "control-N" ili ufungue dirisha jipya.</translation>
@@ -4015,7 +4010,7 @@
 <translation id="7289225569524511578">Fungua programu ya mandhari</translation>
 <translation id="7290242001003353852">Huduma hii ya kuingia katika akaunti, inayopangishwa na <ph name="SAML_DOMAIN" />, ina idhini ya kufikia kamera yako.</translation>
 <translation id="7290594223351252791">Thibitisha usajili</translation>
-<translation id="7295614427631867477">Kumbuka kwamba Google Play, Android na programu zinazohusiana zinaoongozwa na sera zake za ukusanyaji na utumiaji wa data.</translation>
+<translation id="7295614427631867477">Kumbuka kwamba Google Play, Android na programu zinazohusiana zinaongozwa na sera mahususi za ukusanyaji na utumiaji wa data.</translation>
 <translation id="729583233778673644">Ruhusu usimbaji wa AES na RC4. Kutumia chaguo hili huongeza uwezekano wa hatari, kwa kuwa misimbo ya RC45 si salama.</translation>
 <translation id="7296774163727375165"><ph name="DOMAIN" /> Masharti</translation>
 <translation id="7297443947353982503">Jina la mtumiaji/nenosiri sio sahihi au EAP-auth imeshindwa</translation>
@@ -4672,7 +4667,6 @@
 <translation id="827097179112817503">Onyesha kitufe cha mwanzo</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Alamisho 1 imefutwa}other{Alamisho # zimefutwa}}</translation>
 <translation id="8272443605911821513">Dhibiti viendelezi vyako kwa kubofya Viendelezi katika menyu ya "Zana zaidi".</translation>
-<translation id="8272966760965438857">Dhibiti Akaunti zako za Google katika sehemu moja</translation>
 <translation id="8274332263553132018">Tuma faili</translation>
 <translation id="8274924778568117936">Usizime wala kufunga kifaa chako cha <ph name="DEVICE_TYPE" /> hadi sasisho likamilike. Kifaa chako cha <ph name="DEVICE_TYPE" /> kitazimika na kuwaka baada ya sasisho kukamilika.</translation>
 <translation id="8275038454117074363">Leta</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 9982baa..4590005 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -337,6 +337,7 @@
     என்பதை நம்பவில்லை எனில், <ph name="LINK_START" />ப்ராக்ஸி அமைப்புகளைச்<ph name="LINK_END" /> சரிசெய்யவும்.</translation>
 <translation id="1512210426710821809">இதைச் செயல்தவிர்ப்பதற்கு ஒரே வழி, <ph name="IDS_SHORT_PRODUCT_OS_NAME" />ஐ மீண்டும் நிறுவ வேண்டும்</translation>
 <translation id="151501797353681931">Safari இலிருந்து இறக்குமதி செய்யப்பட்டவை</translation>
+<translation id="1515163294334130951">தொடங்கு</translation>
 <translation id="1521442365706402292">சான்றிதழ்களை நிர்வகி</translation>
 <translation id="152234381334907219">எப்போதும் சேமிக்காதவை</translation>
 <translation id="1524430321211440688">விசைப்பலகை</translation>
@@ -611,7 +612,7 @@
 <translation id="1932026958134051332">சுவிட்ச் அணுகல் விருப்பங்கள்</translation>
 <translation id="1932098463447129402">இதற்குமுன் அல்ல</translation>
 <translation id="1933809209549026293">சுட்டி அல்லது விசைப்பலகையை இணைக்கவும். புளூடூத் சாதனத்தைப் பயன்படுத்துகிறீர்கள் எனில், அது இணைப்பதற்குத் தயாராக உள்ளது என்பதை உறுதிசெய்யவும்.</translation>
-<translation id="1937774647013465102">கண்டெய்னர் கட்டமைப்பு வகை <ph name="ARCHITECTURE_CONTAINER" />ஐ இந்த <ph name="ARCHITECTURE_DEVICE" /> சாதனத்தில் இறக்க முடியவில்லை. இந்தக் கண்டெய்னரை வேறு சாதனத்திற்குள் மீட்டெடுக்க முயலலாம் அல்லது Files ஆப்ஸைத் திறந்து இந்தக் கண்டெய்னர் படத்திற்குள் இருக்கும் கோப்புகளை அணுகலாம்.</translation>
+<translation id="1937774647013465102">கண்டெய்னர் கட்டமைப்பு வகை <ph name="ARCHITECTURE_CONTAINER" />ஐ இந்த <ph name="ARCHITECTURE_DEVICE" /> சாதனத்தில் இறக்க முடியவில்லை. இந்தக் கண்டெய்னரை வேறு சாதனத்திற்குள் மீட்டமைக்க முயலலாம் அல்லது Files ஆப்ஸில் திறந்து இந்தக் கண்டெய்னர் படத்திற்குள் இருக்கும் கோப்புகளை அணுகலாம்.</translation>
 <translation id="1938351510777341717">வெளிக் கட்டளை</translation>
 <translation id="1940546824932169984">இணைத்துள்ள சாதனங்கள்</translation>
 <translation id="1944921356641260203">புதுப்பிப்பு உள்ளது</translation>
@@ -902,7 +903,7 @@
 <translation id="2408955596600435184">பின்னை உள்ளிடவும்</translation>
 <translation id="241082044617551207">அறியப்படாத செருகுநிரல்</translation>
 <translation id="2413749388954403953">புக்மார்க்குகள் பயனர் இடைமுகத்தை மாற்றலாம்</translation>
-<translation id="241639282915300771"><ph name="CONTAINER_ID" />க்கான மீட்டெடுப்பு தற்போது செயலில் உள்ளது</translation>
+<translation id="241639282915300771"><ph name="CONTAINER_ID" />க்கான மீட்டமைப்பு தற்போது செயலில் உள்ளது</translation>
 <translation id="241727068219398187"><ph name="TIME" /> அன்றைக்கான உங்கள் Google கடவுச்சொல் மூலம் தரவு என்கிரிப்ட் செய்யப்பட்டது.
           இதில் Google Payயிலுள்ள கட்டண முறைகளும் முகவரிகளும் சேர்க்கப்படவில்லை.</translation>
 <translation id="2419706071571366386">பாதுகாப்பிற்காக, கம்ப்யூட்டர் பயன்படுத்தப்படாத போது வெளியேறவும்.</translation>
@@ -961,7 +962,6 @@
 <translation id="2496180316473517155">உலாவல் வரலாறு</translation>
 <translation id="2497229222757901769">மவுஸின் வேகம்</translation>
 <translation id="2497852260688568942">உங்கள் நிர்வாகி ஒத்திசைவை முடக்கியுள்ளார்</translation>
-<translation id="249819058197909513">இந்தப் பயன்பாட்டிற்காக மீண்டும் எச்சரிக்க வேண்டாம்</translation>
 <translation id="2498539833203011245">சிறிதாக்கு</translation>
 <translation id="2498765460639677199">மிகப்பெரிய</translation>
 <translation id="2499747912851752301">கடவுச்சொற்களை ஏற்றுகிறது...</translation>
@@ -1050,7 +1050,6 @@
 <translation id="2630681426381349926">தொடங்குவதற்கு வைஃபை உடன் இணைக்கவும்</translation>
 <translation id="2631120081682787498">இந்தத் தாவலை நிச்சயமாக மூடவா?</translation>
 <translation id="2631498379019108537">ஷெல்ஃபில் உள்ளீட்டு விருப்பங்களைக் காட்டு</translation>
-<translation id="2633199387167390344">வட்டு இடத்தில் <ph name="USAGE" /> மெ.பை. ஐ <ph name="NAME" /> பயன்படுத்துகிறது.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" நீட்டிப்பை அகற்ற வேண்டுமா?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ஆல் நிறுவலை நிறைவுசெய்ய முடியவில்லை, ஆனால் அதன் வட்டுப் படிமத்திலிருந்து இயக்குவதைத் தொடரும்.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1395,7 +1394,6 @@
 <translation id="3157931365184549694">மீட்டமை</translation>
 <translation id="3158033540161634471">உங்கள் கைரேகையை அமைக்கவும்</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (வன்பொருளில் சேமிக்கப்பட்டிருக்கும்)</translation>
-<translation id="316125635462764134">ஆப்ஸை அகற்று</translation>
 <translation id="3161522574479303604">எல்லா மொழிகளும்</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> அனுப்பிய <ph name="PRODUCT_ID" /> தயாரிப்பை அறிய முடியவில்லை.</translation>
 <translation id="3165390001037658081">சில தொலைத்தொடர்பு நிறுவனங்கள் இந்த அம்சத்தைத் தடுக்கலாம்.</translation>
@@ -1895,6 +1893,7 @@
 <translation id="3916445069167113093">இவ்வகையான கோப்பு உங்கள் கம்ப்யூட்டரைப் பாதிக்கக்கூடும். இருப்பினும் <ph name="FILE_NAME" /> ஐ வைத்திருக்க வேண்டுமா?</translation>
 <translation id="3918972485393593704">Googleளுக்கு விவரங்களை அனுப்பு</translation>
 <translation id="3919145445993746351">உங்கள் அனைத்துக் கணிணிகளிலும் நீட்டிப்புகளைப் பெற, ஒத்திசைவை இயக்கவும்</translation>
+<translation id="391999873395511996">விர்ச்சுவல் மெஷினைப் பதிவிறக்குகிறது.</translation>
 <translation id="3920504717067627103">சான்றிதழ் கொள்கைகள்</translation>
 <translation id="392089482157167418">ChromeVox (பேச்சுவடிவ கருத்து) ஐ இயக்கு</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1946,7 +1945,6 @@
 <translation id="3983586614702900908">அறியப்படாத விற்பனையாளரிடமிருந்து சாதனங்கள்</translation>
 <translation id="3984159763196946143">டெமோ பயன்முறையைத் தொடங்க முடியவில்லை</translation>
 <translation id="3984431586879874039">உங்கள் பாதுகாப்பு விசையைப் பார்க்க இந்தத் தளத்தை அனுமதிக்கவா?</translation>
-<translation id="3987348946546879621">தரவு உபயோகம் குறைக்கப்பட்டது</translation>
 <translation id="3987938432087324095">புரியவில்லை.</translation>
 <translation id="3988996860813292272">நேரமண்டலத்தைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="399179161741278232">இறக்குமதியானது</translation>
@@ -1977,7 +1975,6 @@
 <translation id="4037889604535939429">பயனரை மாற்று</translation>
 <translation id="4042264909745389898">Google Chrome OS விதிமுறைகள்</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{பக்கத்திலிருந்து வெளியேறு}other{பக்கங்களிலிருந்து வெளியேறு}}</translation>
-<translation id="404299405565920089">ஆப்ஸிலும் இணையதளங்களிலும் உள்நுழைந்துள்ள உங்கள் Google கணக்குகள் அனைத்தையும் இங்கு நிர்வகிக்கலாம். உங்களிடம் அனுமதி பெற்றுள்ள ஆப்ஸும் இணையதளங்களும் அவை சரியாக வேலை செய்வதற்குத் தேவையான கணக்குத் தகவலை அணுகலாம்.</translation>
 <translation id="4044612648082411741">சான்றிதழ் கடவுச்சொல்லை உள்ளிடவும்</translation>
 <translation id="404493185430269859">இயல்பு தேடல் இன்ஜின்</translation>
 <translation id="4046123991198612571">அடுத்த ட்ராக்</translation>
@@ -2092,7 +2089,6 @@
 <translation id="4242533952199664413">அமைப்புகளைத் திற</translation>
 <translation id="4242577469625748426">சாதனத்தில் கொள்கை அமைப்புகளை நிறுவுவதில் தோல்வி: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">மேலும் ஸ்டைலஸ் பயன்பாடுகளைக் கண்டறிக</translation>
-<translation id="424546999567421758">அதிக வட்டுப் பயன்பாடு கண்டுபிடிக்கப்பட்டது</translation>
 <translation id="424726838611654458">எப்போதும் Adobe Reader இல் திற</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" />க்கு ஒத்திசைக்க முடியவில்லை</translation>
 <translation id="4249248555939881673">நெட்வொர்க் இணைப்பிற்காகக் காத்திருக்கிறது...</translation>
@@ -2144,7 +2140,7 @@
 <translation id="4324577459193912240">பதிவிறக்கம் முழுமையடையவில்லை</translation>
 <translation id="4325237902968425115"><ph name="LINUX_APP_NAME" />ஐ நிறுவல் நீக்குகிறது...</translation>
 <translation id="4328203388435897516">Chromebook அமைக்கப்பட்டவுடன், எந்நேரத்திலும் உதவி பெற ’அசிஸ்டண்ட்’ பட்டனை அழுத்தவும் அல்லது "Ok Google" என்று சொல்லவும். மாற்றங்களைச் செய்ய ‘அசிஸ்டண்ட்’ அமைப்புகளுக்குச் செல்லவும்.</translation>
-<translation id="4330191372652740264">குளிர்ந்த நீர்</translation>
+<translation id="4330191372652740264">ஐஸ் வாட்டர்</translation>
 <translation id="4330387663455830245"><ph name="LANGUAGE" /> மொழியிலிருந்தால் ஒருபோதும் மொழிபெயர்க்காதே</translation>
 <translation id="4333854382783149454">RSA குறியாக்கத்துடன் PKCS #1 SHA-1</translation>
 <translation id="4336979451636460645">நெட்வொர்க் பதிவுகளுக்கு இதைப் பார்க்கவும்: <ph name="DEVICE_LOG_LINK" /></translation>
@@ -2200,7 +2196,6 @@
 <translation id="4421932782753506458">ஃபளஃபி</translation>
 <translation id="4422347585044846479">இந்தப் பக்கத்திற்கான புக்மார்க்ஸைத் திருத்து</translation>
 <translation id="4423376891418188461">அமைப்புகளை மீட்டெடு</translation>
-<translation id="4423482519432579560">&amp;பிழைதிருத்தம்</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, உங்கள் கடவுச்சொல்லை மாற்றும்படி நிர்வாகி கோருகிறார்.</translation>
 <translation id="4430019312045809116">அளவு</translation>
 <translation id="4430369329743628066">புத்தகக்குறி சேர்க்கப்பட்டது</translation>
@@ -2658,8 +2653,6 @@
 <translation id="5187295959347858724">நீங்கள் இப்போது <ph name="SHORT_PRODUCT_NAME" /> இல் உள்நுழைந்துள்ளீர்கள். உங்களுடைய புக்மார்க்குகள், வரலாறு மற்றும் இதர அமைப்புகள் Google கணக்குடன் ஒத்திசைக்கப்படுகிறது.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> பல கோப்புகளைப் பதிவிறக்க விரும்புகிறது</translation>
-<translation id="5192316339598592690">கணக்குகளை விரைவாக மாற்றி, ஆப்ஸ் மற்றும் இணையதளங்களில் ஒரே நேரத்தில் உள்நுழையலாம்.
-    உங்களின் சில Google கணக்குத் தகவலைப் பயன்படுத்த ஆப்ஸும் தளங்களும் அனுமதி கேட்க முடியும். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">சாதனத்தைப் பவர்வாஷ் செய்து, மீண்டும் முயலவும்.</translation>
 <translation id="5204967432542742771">கடவுச்சொல்</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ஐ நீக்கவா?</translation>
@@ -3338,7 +3331,6 @@
 <translation id="622537739776246443">சுயவிவரம் நீக்கப்படும்</translation>
 <translation id="6225475702458870625"><ph name="PHONE_NAME" /> இலிருந்து தரவு இணைப்பு உள்ளது</translation>
 <translation id="6226777517901268232">தனிப்பட்ட குறியீட்டுக் கோப்பு (விரும்பினால்)</translation>
-<translation id="6228516488918914827">பக்கம் வேகமாக ஏற்றப்பட்டது</translation>
 <translation id="6228691855869374890">இந்தத் தளம், MIDI சாதனங்களுக்கான முழுக்கட்டுப்பாட்டைக் கொண்டுள்ளது.</translation>
 <translation id="6229890768313448549">Google Play சேவை விதிமுறைகளை ஏற்ற முடியவில்லை. மீண்டும் முயலவும்.</translation>
 <translation id="6231881193380278751">பக்கத்தைத் தானாகப் புதுப்பிக்க, URL இல் வினவல் அளவுருவைச் சேர்க்கவும்: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3541,7 +3533,6 @@
 <translation id="6545665334409411530">மீண்டும் இயக்குவதன் வீதம்</translation>
 <translation id="6545834809683560467">தேடல்களையும், முகவரிப் பட்டி அல்லது ஆப்ஸ் துவக்கியின் தேடல் பெட்டியில் தட்டச்சு செய்யப்பட்ட URLகளையும் நிறைவு செய்ய யூகச் சேவையைப் பயன்படுத்தவும்</translation>
 <translation id="6545867563032584178">Mac சிஸ்டம் விருப்பத்தேர்வுகளில் மைக்ரோஃபோன் முடக்கப்பட்டுள்ளது</translation>
-<translation id="6547316139431024316">இந்த நீட்டிப்புக்காக மீண்டும் எச்சரிக்க வேண்டாம்</translation>
 <translation id="6547354035488017500">குறைந்தது 512 மெ.பை. இடத்தைக் காலியாக்கவும் அல்லது உங்கள் சாதனம் இயங்காது. இடத்தைக் காலியாக்க, சாதனத்தின் சேமிப்பகத்தில் இருந்து கோப்புகளை நீக்கவும்.</translation>
 <translation id="6550675742724504774">விருப்பத்தேர்வுகள்</translation>
 <translation id="6551508934388063976">ஆணைக் கிடைக்கவில்லை. புதிய சாளரத்தைத் திறக்க control-N ஐ அழுத்தவும்.</translation>
@@ -4672,7 +4663,6 @@
 <translation id="827097179112817503">முகப்பு பொத்தானைக் காட்டு</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{ஒரு புத்தகக்குறி நீக்கப்பட்டது}other{# புக்மார்க்குகள் நீக்கப்பட்டன}}</translation>
 <translation id="8272443605911821513">"கூடுதல் கருவிகள்" மெனுவில் நீட்டிப்புகள் என்பதைக் கிளிக் செய்து நீட்டிப்புகளை நிர்வகிக்கவும்.</translation>
-<translation id="8272966760965438857">உங்கள் Google கணக்குகளை ஒரே இடத்திலிருந்து நிர்வகிக்கலாம்</translation>
 <translation id="8274332263553132018">கோப்பை அலைபரப்பு</translation>
 <translation id="8274924778568117936">புதுப்பிப்பு முடியும் வரை <ph name="DEVICE_TYPE" /> சாதனத்தை முடக்கவோ அல்லது மூடவோ வேண்டாம். நிறுவியதும், <ph name="DEVICE_TYPE" /> மீண்டும் தொடங்கும்.</translation>
 <translation id="8275038454117074363">இறக்குமதி செய்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 623ae92..fa613efb 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -338,6 +338,7 @@
     విశ్వసించకుంటే, మీ <ph name="LINK_START" />ప్రాక్సీ సెట్టింగ్‌ల<ph name="LINK_END" />ను సర్దుబాటు చేయండి.</translation>
 <translation id="1512210426710821809">దీనిని చర్య రద్దు చేయడానికి <ph name="IDS_SHORT_PRODUCT_OS_NAME" />ను రీ-ఇన్‌స్టాల్ చేయడమే ఏకైక పాథ్‌</translation>
 <translation id="151501797353681931">Safari నుండి దిగుమతి చేయబడింది</translation>
+<translation id="1515163294334130951">ప్రారంభించండి</translation>
 <translation id="1521442365706402292">సర్టిఫికెట్‌లను నిర్వహించు</translation>
 <translation id="152234381334907219">ఎప్పటికి సేవ్ చెయ్యబడవు</translation>
 <translation id="1524430321211440688">కీబోర్డ్</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">అత్యంత బిగ్గరగా</translation>
 <translation id="1673137583248014546"><ph name="URL" /> మీ భద్రతా కీ యొక్క తయారీదారు బ్రాండ్ పేరు మరియు మోడల్‌ని చూడాలనుకుంటోంది</translation>
 <translation id="1679068421605151609">డెవలపర్ సాధనాలు</translation>
+<translation id="1679806121152819234">ప్లగ్ఇన్ VM</translation>
 <translation id="167983332380191032">నిర్వహణ సేవ HTTP ఎర్రర్‌ని పంపింది.</translation>
 <translation id="1680849702532889074">మీ Linux అప్లికేషన్ ఇన్‌స్టాలేషన్ సమయంలో ఎర్రర్ ఏర్పడింది.</translation>
 <translation id="16815041330799488">క్లిప్‌బోర్డ్‌కు కాపీ చేసిన వచనం మరియు చిత్రాలను చూడటానికి సైట్‌లను అనుమతించవద్దు</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">బ్రౌజింగ్ చరిత్ర</translation>
 <translation id="2497229222757901769">మౌస్ వేగం</translation>
 <translation id="2497852260688568942">సింక్‌ను మీ నిర్వాహకులు నిలిపివేశారు</translation>
-<translation id="249819058197909513">ఈ యాప్ కోసం మళ్లీ హెచ్చరించవద్దు</translation>
 <translation id="2498539833203011245">కనిష్ఠీకరించు</translation>
 <translation id="2498765460639677199">ఎక్కువ</translation>
 <translation id="2499747912851752301">పాస్‌వర్డ్‌లను ఎగుమతి చేస్తోంది...</translation>
@@ -1050,7 +1051,6 @@
 <translation id="2630681426381349926">ప్రారంభించడానికి Wi-Fiకి కనెక్ట్ చేయండి</translation>
 <translation id="2631120081682787498">మీరు ఖచ్చితంగా ఈ ట్యాబ్‌ను మూసివేయాలనుకుంటున్నారా?</translation>
 <translation id="2631498379019108537">అరలో ఇన్‌పుట్ ఎంపికలను చూపు</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> డిస్క్ ఖాళీలో <ph name="USAGE" /> MBని ఉపయోగిస్తున్నారు.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />"ను తీసివేయాలా?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ఇన‌స్ట‌లేష‌న్‌ పూర్తి కాలేదు, కానీ డిస్క్ ఇమేజ్‌ నుండి రన్ అవడం కొనసాగుతుంది.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1396,7 +1396,6 @@
 <translation id="3157931365184549694">పునరుద్ధరించు</translation>
 <translation id="3158033540161634471">మీ వేలిముద్రను సెటప్ చేయండి</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (హార్డ్‌వేర్ మద్దతు కలిగినది)</translation>
-<translation id="316125635462764134">యాప్‌ను తీసివేయి</translation>
 <translation id="3161522574479303604">అన్ని భాషలు</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> నుండి <ph name="PRODUCT_ID" /> తెలియని ఉత్పత్తి</translation>
 <translation id="3165390001037658081">కొన్ని క్యారియర్‌లు ఈ లక్షణాన్ని బ్లాక్ చేయవచ్చు.</translation>
@@ -1897,6 +1896,7 @@
 <translation id="3916445069167113093">ఈ రకం ఫైల్‌ మీ కంప్యూటర్‌కు హాని చేయవచ్చు. అయినా సరే <ph name="FILE_NAME" />ని ఉంచాలని అనుకుంటున్నారా?</translation>
 <translation id="3918972485393593704">Googleకు వివరాలను నివేదించండి</translation>
 <translation id="3919145445993746351">మీ అన్ని కంప్యూటర్‌లలో మీ ఎక్స్‌టెన్షన్‌లను పొందడానికి, సింక్‌ను ఆన్ చేయండి</translation>
+<translation id="391999873395511996">వర్చువల్ మెషిన్ డౌన్‌లోడ్ అవుతోంది.</translation>
 <translation id="3920504717067627103">సర్టిఫికెట్ విధానాలు</translation>
 <translation id="392089482157167418">ChromeVox (చదవబడే అభిప్రాయం)ను ప్రారంభించు</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1948,7 +1948,6 @@
 <translation id="3983586614702900908">తెలియని విక్రేత అందించిన పరికరాలు</translation>
 <translation id="3984159763196946143">డెమో మోడ్‌ను ప్రారంభించలేకపోయాము</translation>
 <translation id="3984431586879874039">మీ సెక్యూరిటీ కీని చూడటానికి ఈ సైట్‌ను అనుమతించాలా?</translation>
-<translation id="3987348946546879621">డేటా ఆదా చేయబడింది</translation>
 <translation id="3987938432087324095">క్షమించండి, అర్థం కాలేదు.</translation>
 <translation id="3988996860813292272">సమయ మండలిని ఎంచుకోండి</translation>
 <translation id="399179161741278232">దిగుమతి అయ్యింది</translation>
@@ -1979,7 +1978,6 @@
 <translation id="4037889604535939429">వ్యక్తిని సవరించండి</translation>
 <translation id="4042264909745389898">Google Chrome OS నిబంధనలు</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{పేజీ నుండి నిష్క్రమించు}other{పేజీల నుండి నిష్క్రమించు}}</translation>
-<translation id="404299405565920089">మీరు వివిధ యాప్‌లలో మరియు వెబ్‌సైట్‌లలో సైన్ ఇన్ చేసిన Google ఖాతాలు అన్నీ ఇక్కడ నిర్వహించవచ్చు. అలాగే మీరు అనుమతి ఇచ్చిన యాప్‌లు మరియు వెబ్‌సైట్‌లు, అవి సరిగా పనిచేయడానికి కావాల్సిన ఖాతా సమాచారాన్ని యాక్సెస్ చేసుకోగలవు.</translation>
 <translation id="4044612648082411741">మీ ప్రమాణపత్రం పాస్‌వర్డ్‌ను నమోదు చేయండి</translation>
 <translation id="404493185430269859">డిఫాల్ట్ శోధన ఇంజిన్</translation>
 <translation id="4046123991198612571">తరువాత ట్రాక్</translation>
@@ -2094,7 +2092,6 @@
 <translation id="4242533952199664413">సెట్టింగ్‌లను తెరువు</translation>
 <translation id="4242577469625748426">పరికరంలో విధాన సెట్టింగ్‌లను ఇన్‌స్టాల్ చేయడంలో విఫలమైంది: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">మరిన్ని స్టైలస్ యాప్‌లను కనుగొనండి</translation>
-<translation id="424546999567421758">అధిక డిస్క్ వినియోగం గుర్తించబడింది</translation>
 <translation id="424726838611654458">ఎల్లప్పుడూ Adobe Readerలో తెరువు</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" />కి సమకాలీకరించడం సాధ్యం కాదు</translation>
 <translation id="4249248555939881673">నెట్‌వర్క్ కనెక్షన్ కోసం వేచి ఉంది...</translation>
@@ -2202,7 +2199,6 @@
 <translation id="4421932782753506458">ఫ్లఫ్ఫీ</translation>
 <translation id="4422347585044846479">ఈ పేజీకి బుక్‌మార్క్‌ను సవరించు</translation>
 <translation id="4423376891418188461">సెట్టింగ్‌లను పునరుద్ధరించు</translation>
-<translation id="4423482519432579560">&amp;అక్షరక్రమ తనిఖీ</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, మీ నిర్వాహకులకు మీరు మీ పాస్‌వర్డ్‌ను మార్చడం అవసరం.</translation>
 <translation id="4430019312045809116">వాల్యూమ్</translation>
 <translation id="4430369329743628066">బుక్‌మార్క్ జోడించబడింది</translation>
@@ -2662,8 +2658,6 @@
 <translation id="5187295959347858724"><ph name="SHORT_PRODUCT_NAME" />కు మీరు ఇప్పుడు సైన్‌ఇన్ చేశారు. మీ బుక్‌మార్క్‌లు, చరిత్ర, మరియు ఇతర సెట్టింగ్‌లు మీ Google ఖాతాకు సమకాలీకరించబడుతున్నాయి.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> పలు ఫైల్‌లను డౌన్‌లోడ్ చేయాలనుకుంటోంది</translation>
-<translation id="5192316339598592690">వేగంగా ఖాతాలను మార్చండి, అలాగే ఒకేసారి అన్ని యాప్‌లు మరియు వెబ్‌సైట్‌లకు సైన్ ఇన్ చేయండి.
-    మీ Google ఖాతాలోని కొంత సమాచారాన్ని ఉపయోగించడానికి యాప్‌లు మరియు సైట్‌లు మీ అనుమతి కోరగలవు. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">దయచేసి పరికరాన్ని పవర్‌వాష్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5204967432542742771">పాస్‌వర్డ్‌ని నమోదు చేయండి</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ని తొలగించాలా?</translation>
@@ -3342,7 +3336,6 @@
 <translation id="622537739776246443">ప్రొఫైల్ తొలగించబడుతుంది</translation>
 <translation id="6225475702458870625">మీ <ph name="PHONE_NAME" /> నుండి డేటా కనెక్షన్ అందుబాటులో ఉంది</translation>
 <translation id="6226777517901268232">ప్రైవేట్ కీ ఫైల్ (ఐచ్ఛికం)</translation>
-<translation id="6228516488918914827">వేగవంతమైన పేజీ లోడ్ అయింది</translation>
 <translation id="6228691855869374890">ఈ సైట్ MIDI పరికరాలకు పూర్తి నియంత్రణను కలిగి ఉంది.</translation>
 <translation id="6229890768313448549">Google Play సేవా నిబంధనలను లోడ్ చేయడం సాధ్యపడదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="6231881193380278751">పేజీని ఆటోమేటిక్‌గా రిఫ్రెష్ చేయడానికి URLలో ప్రశ్న పారామీట‌ర్‌ను జోడించండి: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3547,7 +3540,6 @@
 <translation id="6545665334409411530">పునరావృత రేటు</translation>
 <translation id="6545834809683560467">చిరునామా బార్‌లో లేదా యాప్ లాంచర్ శోధన పెట్టెలో టైప్ చేసే శోధనలను మరియు URLలను పూర్తి చేయడంలో సహాయకరంగా ఉండటానికి సూచన సేవను ఉపయోగించండి</translation>
 <translation id="6545867563032584178">Mac సిస్టమ్ ప్రాధాన్యతలలో మైక్రోఫోన్‌ ఆఫ్ చేయబడింది</translation>
-<translation id="6547316139431024316">ఈ పొడిగింపు కోసం మళ్లీ హెచ్చరించవద్దు</translation>
 <translation id="6547354035488017500">కనీసం 512 MB స్థలాన్ని ఖాళీగా ఉంచండి, లేదంటే పరికరం ఇక స్పందించదు. స్థలాన్ని ఖాళీ చేయడానికి, పరికర నిల్వ నుండి ఫైల్‌లను తొలగించండి.</translation>
 <translation id="6550675742724504774">ఎంపికలు</translation>
 <translation id="6551508934388063976">ఆదేశం అందుబాటులో లేదు. కొత్త విండోను తెరవడానికి control-N నొక్కండి.</translation>
@@ -4674,7 +4666,6 @@
 <translation id="827097179112817503">హోమ్ బటన్‌ను చూపు</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 బుక్‌మార్క్ తొలగించబడింది}other{# బుక్‌మార్క్‌లు తొలగించబడ్డాయి}}</translation>
 <translation id="8272443605911821513">"మరిన్ని సాధనాలు" మెనూలోని ఎక్స్‌టెన్షన్‌లను క్లిక్ చేయడం ద్వారా మీ ఎక్స్‌టెన్షన్‌లను నిర్వహించండి.</translation>
-<translation id="8272966760965438857">మీ Google ఖాతాలను ఒకే స్థలంలో నిర్వహించండి</translation>
 <translation id="8274332263553132018">ఫైల్‌ను ప్రసారం చేయండి</translation>
 <translation id="8274924778568117936">అప్‌డేట్ పూర్తయ్యే వరకు మీ <ph name="DEVICE_TYPE" />ని ఆఫ్ చేయవద్దు లేదా మూసివేయవద్దు. ఇన‌స్ట‌లేష‌న్‌ పూర్తయిన తర్వాత మీ <ph name="DEVICE_TYPE" /> పునఃప్రారంభమవుతుంది.</translation>
 <translation id="8275038454117074363">దిగుమతి చెయ్యి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 0fc4da9..3cc450f 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -338,6 +338,7 @@
     พร็อกซีเซิร์ฟเวอร์อยู่ ให้ปรับ<ph name="LINK_START" />การตั้งค่าพร็อกซี<ph name="LINK_END" /></translation>
 <translation id="1512210426710821809">วิธีเดียวที่จะยกเลิกการทำงานนี้คือการติดตั้ง <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> ใหม่</translation>
 <translation id="151501797353681931">นำเข้าจาก Safari</translation>
+<translation id="1515163294334130951">เริ่มต้น</translation>
 <translation id="1521442365706402292">จัดการใบรับรอง</translation>
 <translation id="152234381334907219">ไม่เคยบันทึก</translation>
 <translation id="1524430321211440688">แป้นพิมพ์</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">เสียงดังที่สุด</translation>
 <translation id="1673137583248014546"><ph name="URL" /> ต้องการดูยี่ห้อและรุ่นของคีย์ความปลอดภัย</translation>
 <translation id="1679068421605151609">เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์</translation>
+<translation id="1679806121152819234">VM ปลั๊กอิน</translation>
 <translation id="167983332380191032">บริการการจัดการแสดงข้อผิดพลาด HTTP</translation>
 <translation id="1680849702532889074">เกิดข้อผิดพลาดระหว่างการติดตั้งแอปพลิเคชัน Linux</translation>
 <translation id="16815041330799488">ไม่อนุญาตให้เว็บไซต์ดูข้อความและรูปภาพที่คัดลอกไปยังคลิปบอร์ด</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">นำอุปกรณ์เข้าร่วมโดเมนไม่ได้ ตรวจสอบว่าคุณไม่ได้เพิ่มอุปกรณ์เกินจำนวนจำกัด</translation>
 <translation id="1744108098763830590">หน้าพื้นหลัง</translation>
 <translation id="1745520510852184940">แปลทุกครั้ง</translation>
+<translation id="1746402432151920942">ตัวระบุสื่อที่มีการป้องกัน</translation>
 <translation id="175196451752279553">เ&amp;ปิดแท็บที่ถูกปิดขึ้นใหม่</translation>
 <translation id="1753905327828125965">เข้าชมบ่อยสุด</translation>
 <translation id="1756681705074952506">วิธีการป้อนข้อมูล</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">ไม่ได้ลงชื่อเข้าใช้</translation>
 <translation id="1832511806131704864">อัปเดตการเปลี่ยนแปลงของโทรศัพท์แล้ว</translation>
 <translation id="1834503245783133039">ดาวน์โหลดไม่สำเร็จ: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">อุปกรณ์ MIDI</translation>
 <translation id="1838374766361614909">ล้างการค้นหา</translation>
 <translation id="1841545962859478868">ผู้ดูแลระบบของอุปกรณ์อาจตรวจสอบรายการต่อไปนี้</translation>
 <translation id="1841616161104323629">ไม่มีระเบียนอุปกรณ์</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">รายงานปัญหา</translation>
 <translation id="2220572644011485463">PIN หรือรหัสผ่าน</translation>
 <translation id="2224444042887712269">การตั้งค่านี้เป็นของ <ph name="OWNER_EMAIL" /></translation>
+<translation id="2224471211857467033">เหตุการณ์การช่วยเหลือพิเศษ</translation>
 <translation id="2224551243087462610">แก้ไขชื่อโฟลเดอร์</translation>
 <translation id="2226449515541314767">ไซต์นี้ถูกบล็อกจากการมีสิทธิ์ควบคุมอุปกรณ์ MIDI เต็มรูปแบบ</translation>
 <translation id="2226720438730111184">แจ้งให้เราทราบถึงสิ่งที่เกิดขึ้น</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">ประวัติการเข้าชมที่เรียกดู</translation>
 <translation id="2497229222757901769">ความเร็วเมาส์</translation>
 <translation id="2497852260688568942">ผู้ดูแลระบบปิดใช้การซิงค์</translation>
-<translation id="249819058197909513">ไม่ต้องเตือนอีกสำหรับแอปนี้</translation>
 <translation id="2498539833203011245">ย่อ</translation>
 <translation id="2498765460639677199">ขนาดใหญ่มาก</translation>
 <translation id="2499747912851752301">กำลังส่งออกรหัสผ่าน...</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">เชื่อมต่อ Wi-Fi เพื่อเริ่ม</translation>
 <translation id="2631120081682787498">แน่ใจไหมว่าต้องการปิดแท็บนี้</translation>
 <translation id="2631498379019108537">แสดงตัวเลือกการป้อนข้อมูลในชั้นวาง</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> กำลังใช้พื้นที่ดิสก์ <ph name="USAGE" /> MB</translation>
 <translation id="2633212996805280240">นำ "<ph name="EXTENSION_NAME" />" ออกหรือไม่</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ไม่สามารถติดตั้งให้เสร็จสมบูรณ์ แต่จะเรียกใช้จากดิสก์อิมเมจต่อไป</translation>
 <translation id="2633764681656412085">Fido</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">คืนค่า</translation>
 <translation id="3158033540161634471">ตั้งค่าลายนิ้วมือ</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (ใช้ฮาร์ดแวร์คีย์เข้ารหัสลับ)</translation>
-<translation id="316125635462764134">นำแอปออก</translation>
 <translation id="3161522574479303604">ทุกภาษา</translation>
 <translation id="3163201441334626963">ผลิตภัณฑ์ที่ไม่รู้จัก <ph name="PRODUCT_ID" /> จากผู้ขาย <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">ผู้ให้บริการบางรายอาจบล็อกฟีเจอร์นี้</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">ไฟล์ประเภทนี้อาจเป็นอันตรายต่อคอมพิวเตอร์ของคุณ คุณต้องการเก็บ <ph name="FILE_NAME" /> ไว้หรือไม่</translation>
 <translation id="3918972485393593704">รายงานรายละเอียดให้ Google ทราบ</translation>
 <translation id="3919145445993746351">เปิดการซิงค์เพื่อรับส่วนขยายในคอมพิวเตอร์ทุกเครื่อง</translation>
+<translation id="391999873395511996">กำลังดาวน์โหลดเครื่องเสมือน</translation>
 <translation id="3920504717067627103">นโยบายใบรับรอง</translation>
 <translation id="392089482157167418">เปิดใช้ ChromeVox (การตอบสนองด้วยเสียง)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">อุปกรณ์จากผู้ขายที่ไม่รู้จัก</translation>
 <translation id="3984159763196946143">เริ่มโหมดสาธิตไม่ได้</translation>
 <translation id="3984431586879874039">อนุญาตให้เว็บไซต์นี้ดูคีย์ความปลอดภัยของคุณไหม</translation>
-<translation id="3987348946546879621">ประหยัดเน็ต</translation>
 <translation id="3987938432087324095">ขออภัย ฉันไม่ค่อยเข้าใจ</translation>
 <translation id="3988996860813292272">เลือกเขตเวลา</translation>
 <translation id="399179161741278232">นำเข้า</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">แก้ไขบุคคล</translation>
 <translation id="4042264909745389898">ข้อกำหนดของ Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{หน้าที่ออกไป}other{หน้าที่ออกไป}}</translation>
-<translation id="404299405565920089">คุณจะจัดการบัญชี Google ทั้งหมดที่ลงชื่อเข้าใช้ไว้จากแอปและเว็บไซต์ต่างๆ ได้ที่นี่ แอปและเว็บไซต์ที่มีสิทธิ์จะเข้าถึงข้อมูลบัญชีที่จำเป็นได้เพื่อให้ทำงานได้อย่างถูกต้อง</translation>
 <translation id="4044612648082411741">ป้อนรหัสผ่านใบรับรอง</translation>
 <translation id="404493185430269859">เครื่องมือค้นหาเริ่มต้น</translation>
 <translation id="4046123991198612571">แทร็กถัดไป</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">เปิดการตั้งค่า</translation>
 <translation id="4242577469625748426">ไม่สามารถติดตั้งการตั้งค่านโยบายบนอุปกรณ์: <ph name="VALIDATION_ERROR" /></translation>
 <translation id="4244238649050961491">ค้นหาแอปสไตลัสเพิ่มเติม</translation>
-<translation id="424546999567421758">พบการใช้ดิสก์สูง</translation>
 <translation id="424726838611654458">เปิดใน Adobe Reader ทุกครั้ง</translation>
 <translation id="4247901771970415646">ซิงค์กับ <ph name="USERNAME" /> ไม่ได้</translation>
 <translation id="4249248555939881673">กำลังรอการเชื่อมต่อเครือข่าย...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">ฟลัฟฟี</translation>
 <translation id="4422347585044846479">แก้ไขบุ๊กมาร์กสำหรับหน้านี้</translation>
 <translation id="4423376891418188461">กู้คืนการตั้งค่า</translation>
-<translation id="4423482519432579560">&amp;ตรวจการสะกด</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" /> ผู้ดูแลระบบต้องการให้คุณเปลี่ยนรหัสผ่าน</translation>
 <translation id="4430019312045809116">ระดับเสียง</translation>
 <translation id="4430369329743628066">เพิ่มบุ๊กมาร์กแล้ว</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">คุณได้ลงชื่อเข้าใช้ <ph name="SHORT_PRODUCT_NAME" /> แล้วในตอนนี้ บุ๊กมาร์ก ประวัติการเข้าชม และการตั้งค่าอื่นๆ ของคุณจะได้รับการซิงค์กับบัญชี Google</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ต้องการดาวน์โหลดหลายไฟล์</translation>
-<translation id="5192316339598592690">เปลี่ยนบัญชีอย่างรวดเร็วและลงชื่อเข้าใช้แอปและเว็บไซต์ทั้งหมดได้พร้อมกัน
-    แอปและเว็บไซต์ต่างๆ จะขอสิทธิ์ใช้ข้อมูลบางอย่างในบัญชี Google ของคุณได้ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">โปรดทำ Powerwash อุปกรณ์และลองอีกครั้ง</translation>
 <translation id="5204967432542742771">ป้อนรหัสผ่าน</translation>
 <translation id="5206215183583316675">ลบ " <ph name="CERTIFICATE_NAME" /> " ไหม</translation>
@@ -3343,7 +3340,6 @@
 <translation id="622537739776246443">ระบบจะลบโปรไฟล์ออก</translation>
 <translation id="6225475702458870625">มีการเชื่อมต่อข้อมูลพร้อมใช้งานจาก <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">ไฟล์คีย์ส่วนตัว (ไม่บังคับ)</translation>
-<translation id="6228516488918914827">โหลดหน้าเว็บได้เร็วขึ้น</translation>
 <translation id="6228691855869374890">ไซต์นี้มีการควบคุมอุปกรณ์ MIDI เต็มรูปแบบ</translation>
 <translation id="6229890768313448549">ไม่สามารถโหลดข้อกำหนดในการให้บริการของ Google Play โปรดลองอีกครั้ง</translation>
 <translation id="6231881193380278751">เพิ่มพารามิเตอร์ข้อความค้นหาใน URL เพื่อรีเฟรชหน้าโดยอัตโนมัติ: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3544,6 @@
 <translation id="6545665334409411530">อัตราการพิมพ์ซ้ำ</translation>
 <translation id="6545834809683560467">ใช้บริการคาดคะเนที่จะช่วยเติมข้อความค้นหาและ URL ที่พิมพ์ลงในแถบที่อยู่เว็บหรือช่องค้นหาของเครื่องเรียกใช้งานแอป</translation>
 <translation id="6545867563032584178">ไมโครโฟนปิดอยู่ในค่ากำหนดของระบบ Mac</translation>
-<translation id="6547316139431024316">ไม่ต้องเตือนอีกสำหรับส่วนขยายนี้</translation>
 <translation id="6547354035488017500">เพิ่มพื้นที่ว่างบนอุปกรณ์อย่างน้อย 512 MB มิฉะนั้นอุปกรณ์ของคุณอาจไม่ตอบสนอง หากต้องการเพิ่มพื้นที่ว่าง ให้ลบไฟล์ออกจากพื้นที่เก็บข้อมูลของอุปกรณ์</translation>
 <translation id="6550675742724504774">ตัวเลือก</translation>
 <translation id="6551508934388063976">คำสั่งไม่สามารถใช้งานได้ กด Control-N เพื่อเปิดหน้าต่างใหม่</translation>
@@ -4679,7 +4674,6 @@
 <translation id="827097179112817503">แสดงปุ่มหน้าแรก</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{ลบบุ๊กมาร์ก 1 รายการแล้ว}other{ลบบุ๊กมาร์ก # รายการแล้ว}}</translation>
 <translation id="8272443605911821513">จัดการส่วนขยายของคุณโดยคลิกที่ "ส่วนขยาย" ในเมนู "เครื่องมือเพิ่มเติม"</translation>
-<translation id="8272966760965438857">จัดการบัญชี Google ในที่เดียว</translation>
 <translation id="8274332263553132018">แคสต์ไฟล์</translation>
 <translation id="8274924778568117936">อย่าปิดเครื่องหรือปิดฝา <ph name="DEVICE_TYPE" /> จนกว่าการอัปเดตจะเสร็จสิ้น <ph name="DEVICE_TYPE" /> จะรีสตาร์ทหลังติดตั้งเสร็จแล้ว</translation>
 <translation id="8275038454117074363">การนำเข้า</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 9b64964..79b48b15 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -338,6 +338,7 @@
         düşünüyorsanız <ph name="LINK_START" />proxy ayarlarınızı<ph name="LINK_END" /> yapılandırın.</translation>
 <translation id="1512210426710821809">Bunu geri almanın tek yolu <ph name="IDS_SHORT_PRODUCT_OS_NAME" /> sistemini yeniden yüklemektir</translation>
 <translation id="151501797353681931">Safari'den Aktarıldı</translation>
+<translation id="1515163294334130951">Başlat</translation>
 <translation id="1521442365706402292">Sertifikaları yönet</translation>
 <translation id="152234381334907219">Hiç Kaydedilmeyenler</translation>
 <translation id="1524430321211440688">Klavye</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">En yüksek ses</translation>
 <translation id="1673137583248014546"><ph name="URL" />, Güvenlik Anahtarınızın markasını ve modelini görmek istiyor</translation>
 <translation id="1679068421605151609">Geliştirici Araçları</translation>
+<translation id="1679806121152819234">PluginVm</translation>
 <translation id="167983332380191032">Yönetim hizmeti HTTP hatası gönderdi.</translation>
 <translation id="1680849702532889074">Linux uygulamanızın yüklenmesi sırasında bir hata oluştu.</translation>
 <translation id="16815041330799488">Sitelerin panoya kopyalanan metin ve resimleri görmesine izin verme</translation>
@@ -963,7 +965,6 @@
 <translation id="2496180316473517155">Tarama geçmişi</translation>
 <translation id="2497229222757901769">Fare hızı</translation>
 <translation id="2497852260688568942">Yöneticiniz senkronizasyonu devre dışı bıraktı</translation>
-<translation id="249819058197909513">Bu uygulama için tekrar uyarma</translation>
 <translation id="2498539833203011245">Simge durumuna küçült</translation>
 <translation id="2498765460639677199">Çok büyük</translation>
 <translation id="2499747912851752301">Şifreler dışa aktarılıyor...</translation>
@@ -1051,7 +1052,6 @@
 <translation id="2630681426381349926">Başlamak için Kablosuz ağa bağlanın</translation>
 <translation id="2631120081682787498">Bu sekmeyi kapatmak istediğinizden emin misiniz?</translation>
 <translation id="2631498379019108537">Giriş seçeneklerini rafta göster</translation>
-<translation id="2633199387167390344"><ph name="NAME" />, <ph name="USAGE" /> MB disk alanı kullanıyor.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" kaldırılsın mı?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> yükleme işlemini tamamlayamadı, ancak disk görüntüsünden çalışmaya devam edecek.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1397,6 @@
 <translation id="3157931365184549694">Geri yükle</translation>
 <translation id="3158033540161634471">Parmak izinizi kurun</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (donanım destekli)</translation>
-<translation id="316125635462764134">Uygulamayı kaldır</translation>
 <translation id="3161522574479303604">Tüm diller</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> adlı satıcı firma tarafından sağlanan <ph name="PRODUCT_ID" /> ürün kimliğine sahip bilinmeyen ürün</translation>
 <translation id="3165390001037658081">Bazı operatörler bu özelliği engelleyebilir.</translation>
@@ -1713,7 +1712,7 @@
 <translation id="3664511988987167893">Uzantı Simgesi</translation>
 <translation id="3665589677786828986">Chrome, bazı ayarlarınızın başka bir program tarafından bozulduğunu algıladı ve onları orijinal varsayılan değerlerine sıfırladı.</translation>
 <translation id="3668570675727296296">Dil ayarları</translation>
-<translation id="366867565525278777">Depolama alanı yetersiz olduğu için yükleme işlemi başarısız oldu. En az <ph name="INSTALL_SIZE" /> boş alan gerekiyor. Yer açmak için cihaz depolama alanındaki dosyaları silin.</translation>
+<translation id="366867565525278777">Depolama alanı yetersiz olduğu için yükleme işlemi başarısız oldu. En az <ph name="INSTALL_SIZE" /> boş alan gerekiyor. Yer açmak için cihaz depolama alanından dosya silin.</translation>
 <translation id="3668801437375206837">Google çalışanları Bluetooth sorunlarını daha iyi teşhis etmek için geri bildirim raporlarına ek Bluetooth günlükleri dahil edebilirler. Bu seçenek işaretlendiğinde, geçerli oturumunuzdan btsnoop ve HCI günlükleri raporunuza eklenecektir. Bu şekilde mümkün olan en fazla sayıda PII temizlenecektir. Bu günlüklere erişim, Listnr'da Chrome OS ürün grubu yöneticileri ile kısıtlı olacaktır. Günlükler 90 gün sonra tamamen silinecektir.</translation>
 <translation id="3668823961463113931">İşleyiciler</translation>
 <translation id="3670113805793654926">Herhangi bir tedarikçinin cihazları</translation>
@@ -1898,6 +1897,7 @@
 <translation id="3916445069167113093">Bu türden bir dosya bilgisayarınıza zarar verebilir. <ph name="FILE_NAME" /> adlı dosyayı yine de saklamak istiyor musunuz?</translation>
 <translation id="3918972485393593704">Ayrıntıları Google'a bildir</translation>
 <translation id="3919145445993746351">Uzantıları tüm bilgisayarlarınızda almak için senkronizasyonu açın</translation>
+<translation id="391999873395511996">Sanal makine indiriliyor.</translation>
 <translation id="3920504717067627103">Sertifika Politikaları</translation>
 <translation id="392089482157167418">ChromeVox'u (sesli geri bildirim) etkinleştir</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1949,6 @@
 <translation id="3983586614702900908">bilinmeyen bir tedarikçi firmanın cihazları</translation>
 <translation id="3984159763196946143">Demo modu başlatılamadı</translation>
 <translation id="3984431586879874039">Bu sitenin güvenlik anahtarınızı görmesine izin verilsin mi?</translation>
-<translation id="3987348946546879621">Veri tasarrufu</translation>
 <translation id="3987938432087324095">Pardon, anlaşılmadı.</translation>
 <translation id="3988996860813292272">Saat dilimi seçin</translation>
 <translation id="399179161741278232">İçe aktarılanlar</translation>
@@ -1980,7 +1979,6 @@
 <translation id="4037889604535939429">Kişiyi düzenleyin</translation>
 <translation id="4042264909745389898">Google Chrome OS şartları</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Sayfadan Çık}other{Sayfalardan Çık}}</translation>
-<translation id="404299405565920089">Uygulama ve web sitelerinde oturum açtığınız tüm Google Hesapları burada yönetilebilir. İzin verdiğiniz uygulamalar ve web siteleri, düzgün çalışmaları için ihtiyaç duydukları hesap bilgilerine erişebilir.</translation>
 <translation id="4044612648082411741">Sertifika şifrenizi girin</translation>
 <translation id="404493185430269859">Varsayılan arama motoru</translation>
 <translation id="4046123991198612571">Sonraki parça</translation>
@@ -2095,7 +2093,6 @@
 <translation id="4242533952199664413">Ayarları aç</translation>
 <translation id="4242577469625748426">Politika ayarları cihaza yüklenemedi: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Daha fazla ekran kalemi uygulaması bul</translation>
-<translation id="424546999567421758">Fazla disk kullanımı tespit edildi</translation>
 <translation id="424726838611654458">Her zaman Adobe Reader programında aç</translation>
 <translation id="4247901771970415646"><ph name="USERNAME" /> ile senkronize edilemiyor</translation>
 <translation id="4249248555939881673">Ağ bağlantısı bekleniyor...</translation>
@@ -2182,7 +2179,7 @@
 <translation id="438503109373656455">Şimşek</translation>
 <translation id="4387004326333427325">Kimlik doğrulama sertifikası uzaktan reddedildi</translation>
 <translation id="4389091756366370506">Kullanıcı <ph name="VALUE" /></translation>
-<translation id="4390000551125140321">{0,plural, =1{Gizli mod}other{açık # gizli pencere}}</translation>
+<translation id="4390000551125140321">{0,plural, =1{Gizli mod}other{Açık # gizli pencere}}</translation>
 <translation id="439266289085815679">Bluetooth yapılandırması <ph name="USER_EMAIL" /> tarafından kontrol ediliyor.</translation>
 <translation id="4394049700291259645">Devre dışı bırak</translation>
 <translation id="4400367121200150367">Şifreleri hiçbir zaman kaydedilmeyecek siteler burada görünür</translation>
@@ -2203,7 +2200,6 @@
 <translation id="4421932782753506458">Mırnav</translation>
 <translation id="4422347585044846479">Bu sayfanın yer işaretini düzenle</translation>
 <translation id="4423376891418188461">Ayarları Geri Yükle</translation>
-<translation id="4423482519432579560">&amp;Yazım denetimi</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, yöneticiniz şifrenizi değiştirmenizi zorunlu tutuyor.</translation>
 <translation id="4430019312045809116">Ses</translation>
 <translation id="4430369329743628066">Yer işareti eklendi</translation>
@@ -2486,7 +2482,7 @@
 <translation id="488785315393301722">Ayrıntıları Göster</translation>
 <translation id="4890773143211625964">Gelişmiş yazıcı seçeneklerini göster</translation>
 <translation id="4891089016822695758">Beta forumu</translation>
-<translation id="4892229439761351791">Sitede Bluetooth bağlantısı kullanılabilir</translation>
+<translation id="4892229439761351791">Site Bluetooth bağlantısı kullanabilir</translation>
 <translation id="4893336867552636863">Bu işlem, tarama verilerinizi bu cihazdan kalıcı olarak silecektir.</translation>
 <translation id="4893522937062257019">Kilit ekranında</translation>
 <translation id="489454699928748701">Sitelerin hareket sensörlerini kullanmasına izin ver</translation>
@@ -2663,8 +2659,6 @@
 <translation id="5187295959347858724">Şu anda <ph name="SHORT_PRODUCT_NAME" /> uygulamasında oturum açmış bulunuyorsunuz. Yer işaretleriniz, geçmişiniz ve diğer ayarlarınız Google Hesabınızla senkronize ediliyor.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> birden fazla dosya indirmek istiyor</translation>
-<translation id="5192316339598592690">Hesaplar arasında hızlı şekilde geçiş yapın ve uygulamalar ile web sitelerinde aynı anda oturum açın.
-    Uygulamalar ve siteler, Google Hesabı bilgilerinizin bazılarını kullanmak için izninizi isteyebilir. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Lütfen cihazda powerwash işlemi gerçekleştirin ve tekrar deneyin.</translation>
 <translation id="5204967432542742771">Şifre girin</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" adlı sertifika silinsin mi?</translation>
@@ -3344,7 +3338,6 @@
 <translation id="622537739776246443">Profil silinecek</translation>
 <translation id="6225475702458870625"><ph name="PHONE_NAME" /> telefonunuzdan veri bağlantısı yapılabilir</translation>
 <translation id="6226777517901268232">Özel anahtar dosyası (isteğe bağlı)</translation>
-<translation id="6228516488918914827">Daha hızlı yüklenen sayfa görüntüleniyor</translation>
 <translation id="6228691855869374890">Bu site MIDI cihazları üzerinde tam denetime sahip.</translation>
 <translation id="6229890768313448549">Google Play Hizmet Şartları yüklenemiyor. Lütfen tekrar deneyin.</translation>
 <translation id="6231881193380278751">Sayfayı otomatik yenilemek için URL'ye bir sorgu parametresi ekleyin: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3549,7 +3542,6 @@
 <translation id="6545665334409411530">Yineleme hızı</translation>
 <translation id="6545834809683560467">Adres çubuğuna veya Uygulama Başlatıcı arama kutusuna yazılan aramaların ve URL'lerin tamamlanmasına yardımcı olması için bir tahmin hizmeti kullan</translation>
 <translation id="6545867563032584178">Mikrofon, Mac Sistem Tercihleri'nde kapatıldı</translation>
-<translation id="6547316139431024316">Bu uzantı için bir daha uyarma</translation>
 <translation id="6547354035488017500">En az 512 MB alan boşaltmazsanız cihazınız yanıt vermemeye başlayacaktır. Yer açmak için cihazın depolama alanındaki dosyaları silin.</translation>
 <translation id="6550675742724504774">Seçenekler</translation>
 <translation id="6551508934388063976">Komut kullanılamıyor. Yeni bir pencere açmak için Ctrl+N tuşlarına basın.</translation>
@@ -4283,7 +4275,7 @@
 <translation id="7704628569466676326">Güvenlik anahtarınızı hesabınızda oturum açarken kullanabilmeniz için bu cihazla eşleyin</translation>
 <translation id="7705276765467986571">Yer işareti modeli yüklenemedi.</translation>
 <translation id="7705524343798198388">VPN</translation>
-<translation id="7707108266051544351">Bu sitenin, hareket sensörlerini kullanımı engellenmiştir.</translation>
+<translation id="7707108266051544351">Bu sitenin, hareket sensörlerini kullanması engellenmiştir.</translation>
 <translation id="7707922173985738739">Mobil veri kullanın</translation>
 <translation id="7709152031285164251">Başarısız - <ph name="INTERRUPT_REASON" /></translation>
 <translation id="7710568461918838723">&amp;Yayınla...</translation>
@@ -4679,7 +4671,6 @@
 <translation id="827097179112817503">Ana Sayfa düğmesini göster</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 yer işareti silindi}other{# yer işareti silindi}}</translation>
 <translation id="8272443605911821513">"Diğer araçlar" menüsündeki Uzantılar'ı tıklayarak uzantılarınızı yönetin.</translation>
-<translation id="8272966760965438857">Google Hesaplarınızı tek bir yerden yönetin</translation>
 <translation id="8274332263553132018">Dosya yayınlayın</translation>
 <translation id="8274924778568117936">Güncelleme bitene kadar <ph name="DEVICE_TYPE" /> cihazınızı kapatmayın. Yükleme işlemi tamamlandıktan sonra <ph name="DEVICE_TYPE" /> cihazınız yeniden başlatılacaktır.</translation>
 <translation id="8275038454117074363">İçe aktar</translation>
@@ -5060,7 +5051,7 @@
 <translation id="8877448029301136595">[üst dizin]</translation>
 <translation id="8879284080359814990">&amp;Sekme Olarak Göster</translation>
 <translation id="8883847527783433352">Başka bir Hesapla Senkronize Et</translation>
-<translation id="8884570509232205463">Cihazınız artık saat <ph name="UNLOCK_TIME" /> olduğunda kilitlenecek.</translation>
+<translation id="8884570509232205463">Cihazınız saat <ph name="UNLOCK_TIME" /> olduğunda artık kilitlenecek.</translation>
 <translation id="8885197664446363138">Smart Lock kullanılamıyor</translation>
 <translation id="8888253246822647887">Uygulamanız, yeni sürüme geçme işlemi tamamlandığında açılır. Yeni sürüme geçme işlemi birkaç dakika sürebilir.</translation>
 <translation id="8888432776533519951">Renk:</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index fbc945e..ff6d756 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -338,6 +338,7 @@
         проксі-сервер не потрібно, змініть <ph name="LINK_START" />налаштування проксі<ph name="LINK_END" />.</translation>
 <translation id="1512210426710821809">Єдиний спосіб відмінити зміни – знову встановити <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">Імпортовано з Safari</translation>
+<translation id="1515163294334130951">Запустити</translation>
 <translation id="1521442365706402292">Керування сертифікатами</translation>
 <translation id="152234381334907219">Ніколи не зберігалося</translation>
 <translation id="1524430321211440688">Клавіатура</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">Найголосніше</translation>
 <translation id="1673137583248014546">Сайт <ph name="URL" /> хоче бачити марку й модель вашого ключа безпеки</translation>
 <translation id="1679068421605151609">Інструменти для розробників</translation>
+<translation id="1679806121152819234">Плагін віртуальної машини</translation>
 <translation id="167983332380191032">Сервіс керування надіслав помилку HTTP.</translation>
 <translation id="1680849702532889074">Під час встановлення додатка Linux сталася помилка.</translation>
 <translation id="16815041330799488">Не дозволяти сайтам переглядати тексти й зображення в буфері обміну</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Не вдається приєднати пристрій до домену. Переконайтеся, що ви не перевищили допустиму кількість доданих пристроїв.</translation>
 <translation id="1744108098763830590">фонова сторінка</translation>
 <translation id="1745520510852184940">Завжди виконувати цю дію</translation>
+<translation id="1746402432151920942">Ідентифікатор захищених медіа</translation>
 <translation id="175196451752279553">В&amp;ідкрити закриту вкладку знову</translation>
 <translation id="1753905327828125965">Часто відвідувані</translation>
 <translation id="1756681705074952506">Метод введення</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Користувач не ввійшов</translation>
 <translation id="1832511806131704864">Телефон змінено</translation>
 <translation id="1834503245783133039">Не вдалося завантажити файл "<ph name="FILE_NAME" />"</translation>
+<translation id="1834583737373831634">Пристрої MIDI</translation>
 <translation id="1838374766361614909">Очистити поле пошуку</translation>
 <translation id="1841545962859478868">Адміністратор пристрою може відстежувати таку інформацію:</translation>
 <translation id="1841616161104323629">Немає запису про пристрій.</translation>
@@ -612,7 +616,7 @@
 <translation id="1932026958134051332">Опції кнопкового доступу</translation>
 <translation id="1932098463447129402">Не раніше</translation>
 <translation id="1933809209549026293">Підключіть мишу чи клавіатуру. Якщо ви користуєтеся пристроєм Bluetooth, перевірте, чи він готовий до підключення.</translation>
-<translation id="1937774647013465102">Не вдається імпортувати контейнер архітектури<ph name="ARCHITECTURE_CONTAINER" /> на пристрій з архітектурою<ph name="ARCHITECTURE_DEVICE" />. Ви можете спробувати відновити цей контейнер на іншому пристрої або отримати доступ до його вмісту в додатку Файли.</translation>
+<translation id="1937774647013465102">Не вдається імпортувати контейнер архітектури <ph name="ARCHITECTURE_CONTAINER" /> на пристрій з архітектурою <ph name="ARCHITECTURE_DEVICE" />. Ви можете спробувати відновити цей контейнер на іншому пристрої або отримати доступ до його вмісту в додатку Файли.</translation>
 <translation id="1938351510777341717">Зовнішня клавіша Command</translation>
 <translation id="1940546824932169984">Під’єднані пристрої</translation>
 <translation id="1944921356641260203">Знайдено оновлення</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Повідомити про проблему</translation>
 <translation id="2220572644011485463">PIN-код або пароль</translation>
 <translation id="2224444042887712269">Це налаштування встановив користувач <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Події спеціальних можливостей</translation>
 <translation id="2224551243087462610">Редагувати ім’я папки</translation>
 <translation id="2226449515541314767">Цьому сайту заборонено повністю контролювати пристрої MIDI.</translation>
 <translation id="2226720438730111184">Розкажіть нам, що відбувається</translation>
@@ -904,7 +909,7 @@
 <translation id="2408955596600435184">Введіть PIN-код</translation>
 <translation id="241082044617551207">Невідомий плагін</translation>
 <translation id="2413749388954403953">Змінювати інтерфейс користувача для закладок</translation>
-<translation id="241639282915300771">Триває відновлення контейнера<ph name="CONTAINER_ID" /></translation>
+<translation id="241639282915300771">Триває відновлення контейнера <ph name="CONTAINER_ID" /></translation>
 <translation id="241727068219398187">Дані зашифровано паролем Google від
           <ph name="TIME" />. Це не стосується способів оплати й адрес із Google Pay.</translation>
 <translation id="2419706071571366386">З міркувань безпеки виходьте з облікового запису, коли не використовуєте комп’ютер.</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Історія переглядів</translation>
 <translation id="2497229222757901769">Швидкість миші</translation>
 <translation id="2497852260688568942">Ваш адміністратор вимкнув синхронізацію</translation>
-<translation id="249819058197909513">Більше не попереджати для цього додатка</translation>
 <translation id="2498539833203011245">Згорнути</translation>
 <translation id="2498765460639677199">Дуже великий</translation>
 <translation id="2499747912851752301">Експортуються паролі…</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Під’єднайтеся до Wi-Fi, щоб почати</translation>
 <translation id="2631120081682787498">Закрити цю вкладку?</translation>
 <translation id="2631498379019108537">Показувати на полиці опції введення</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> використовує <ph name="USAGE" /> МБ місця на диску.</translation>
 <translation id="2633212996805280240">Видалити "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> не вдалося завершити встановлення, але він продовжить працювати, використовуючи своє зображення диска.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Відновити</translation>
 <translation id="3158033540161634471">Налаштуйте відбиток</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (з апаратною підтримкою)</translation>
-<translation id="316125635462764134">Видалити додаток</translation>
 <translation id="3161522574479303604">Усі мови</translation>
 <translation id="3163201441334626963">Невідомий продукт <ph name="PRODUCT_ID" /> від постачальника <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Деякі оператори можуть блокувати цю функцію.</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">Цей тип файлу може зашкодити вашому комп’ютеру. Усе одно зберегти <ph name="FILE_NAME" />?</translation>
 <translation id="3918972485393593704">Надішліть у Google докладнішу інформацію</translation>
 <translation id="3919145445993746351">Щоб користуватися розширеннями на всіх комп’ютерах, увімкніть синхронізацію</translation>
+<translation id="391999873395511996">Завантажується віртуальна машина.</translation>
 <translation id="3920504717067627103">Політика сертифікатів</translation>
 <translation id="392089482157167418">Увімкнути ChromeVox (голосові підказки)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">пристрої від невідомого постачальника</translation>
 <translation id="3984159763196946143">Не вдалося запустити демонстраційний режим</translation>
 <translation id="3984431586879874039">Показувати цьому сайту ваш ключ безпеки?</translation>
-<translation id="3987348946546879621">Заощаджено трафік</translation>
 <translation id="3987938432087324095">Незрозуміло.</translation>
 <translation id="3988996860813292272">Вибір часового поясу</translation>
 <translation id="399179161741278232">Імпортовано</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">Змінити користувача</translation>
 <translation id="4042264909745389898">Умови ОС Google Chrome</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Закрити сторінку}one{Закрити сторінки}few{Закрити сторінки}many{Закрити сторінки}other{Закрити сторінки}}</translation>
-<translation id="404299405565920089">Усіма обліковими записами Google, у які ви ввійшли в додатках або на веб-сайтах, можна керувати тут. Додатки й веб-сайти, яким ви надали відповідний дозвіл, можуть отримувати доступ до даних облікового запису, необхідних їм для правильної роботи.</translation>
 <translation id="4044612648082411741">Введіть пароль сертифіката</translation>
 <translation id="404493185430269859">Пошукова система за умовчанням</translation>
 <translation id="4046123991198612571">Наступна композиція</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">Відкрити налаштування</translation>
 <translation id="4242577469625748426">Помилка встановлення налаштувань правил на пристрої: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Більше додатків із використанням стилуса</translation>
-<translation id="424546999567421758">Виявлено надмірне використання місця на диску</translation>
 <translation id="424726838611654458">Завжди відкривати в Adobe Reader</translation>
 <translation id="4247901771970415646">Не вдалося синхронізуватися з користувачем <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Очікування на з’єднання з мережею…</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">Киця</translation>
 <translation id="4422347585044846479">Редагувати закладку для цієї сторінки</translation>
 <translation id="4423376891418188461">Відновити налаштування</translation>
-<translation id="4423482519432579560">&amp;Перевірка правопису</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, ваш адміністратор просить змінити пароль.</translation>
 <translation id="4430019312045809116">Гучність</translation>
 <translation id="4430369329743628066">Закладку додано</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">Зараз ви ввійшли в <ph name="SHORT_PRODUCT_NAME" />. Ваші закладки, історія й інші налаштування синхронізуються з обліковим записом Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> хоче завантажити кілька файлів</translation>
-<translation id="5192316339598592690">Швидко переходьте між обліковими записами й миттєво входьте в додатки та на веб-сайти.
-    Додатки й сайти можуть запитувати дозвіл на використання певних даних облікового запису Google. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Виконайте Powerwash на пристрої та повторіть спробу.</translation>
 <translation id="5204967432542742771">Введіть пароль</translation>
 <translation id="5206215183583316675">Видалити сертифікат "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3343,7 +3340,6 @@
 <translation id="622537739776246443">Профіль буде видалено</translation>
 <translation id="6225475702458870625">Передавання даних доступне через пристрій <ph name="PHONE_NAME" /></translation>
 <translation id="6226777517901268232">Файл секретного ключа (необов’язково)</translation>
-<translation id="6228516488918914827">Завантажено скорочену версію сторінки для більшої швидкості</translation>
 <translation id="6228691855869374890">Цей сайт повністю контролює пристрої MIDI.</translation>
 <translation id="6229890768313448549">Не вдається завантажити Умови використання Google Play. Повторіть спробу.</translation>
 <translation id="6231881193380278751">Додайте в URL-адресу параметр запиту для автоматичного оновлення сторінки: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3544,6 @@
 <translation id="6545665334409411530">Частота повторів</translation>
 <translation id="6545834809683560467">Використовувати підказки для завершення пошукових запитів і URL-адрес, введених в адресний рядок або вікно пошуку на панелі запуску додатків</translation>
 <translation id="6545867563032584178">Мікрофон вимкнено в параметрах системи Mac</translation>
-<translation id="6547316139431024316">Більше не попереджати для цього розширення</translation>
 <translation id="6547354035488017500">Звільніть принаймні 512 МБ пам’яті, інакше пристрій перестане відповідати. Щоб звільнити місце, видаліть файли з пам’яті пристрою.</translation>
 <translation id="6550675742724504774">Параметри</translation>
 <translation id="6551508934388063976">Команда недоступна. Натисніть клавіші Ctrl+N, щоб відкрити нове вікно.</translation>
@@ -4679,7 +4674,6 @@
 <translation id="827097179112817503">Показати кнопку "Домашня сторінка"</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{1 закладку видалено}one{# закладку видалено}few{# закладки видалено}many{# закладок видалено}other{# закладки видалено}}</translation>
 <translation id="8272443605911821513">Керуйте своїми розширеннями, натиснувши "Розширення" в меню "Інші інструменти".</translation>
-<translation id="8272966760965438857">Керуйте обліковими записами Google в одному місці</translation>
 <translation id="8274332263553132018">Транслювати файл</translation>
 <translation id="8274924778568117936">Не вимикайте та не закривайте пристрій <ph name="DEVICE_TYPE" />, поки не завершиться оновлення. Коли встановляться оновлення, пристрій <ph name="DEVICE_TYPE" /> перезавантажиться.</translation>
 <translation id="8275038454117074363">Імпорт</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 897c725..3c04413 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -338,6 +338,7 @@
     máy chủ proxy, hãy điều chỉnh <ph name="LINK_START" />cài đặt proxy<ph name="LINK_END" /> của bạn.</translation>
 <translation id="1512210426710821809">Cách duy nhất để hoàn tác hành động này là cài đặt lại <ph name="IDS_SHORT_PRODUCT_OS_NAME" />.</translation>
 <translation id="151501797353681931">Đã nhập Từ Safari</translation>
+<translation id="1515163294334130951">Chạy</translation>
 <translation id="1521442365706402292">Quản lý chứng chỉ</translation>
 <translation id="152234381334907219">Không bao giờ lưu</translation>
 <translation id="1524430321211440688">Bàn phím</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">To nhất</translation>
 <translation id="1673137583248014546"><ph name="URL" /> muốn xem nhãn hiệu và kiểu Khóa bảo mật của bạn</translation>
 <translation id="1679068421605151609">Công cụ dành cho nhà phát triển</translation>
+<translation id="1679806121152819234">Máy chủ ảo plugin</translation>
 <translation id="167983332380191032">Lỗi HTTP do dịch vụ quản lý gửi</translation>
 <translation id="1680849702532889074">Đã xảy ra lỗi trong quá trình cài đặt ứng dụng Linux.</translation>
 <translation id="16815041330799488">Không cho phép các trang web xem văn bản và hình ảnh đã sao chép sang khay nhớ tạm</translation>
@@ -486,6 +488,7 @@
 <translation id="1744060673522309905">Không thể kết hợp thiết bị với miền. Hãy đảm bảo số thiết bị bạn thêm không vượt quá giới hạn.</translation>
 <translation id="1744108098763830590">trang nền</translation>
 <translation id="1745520510852184940">Luôn làm điều này</translation>
+<translation id="1746402432151920942">Mã nhận dạng nội dung đa phương tiện được bảo vệ</translation>
 <translation id="175196451752279553">&amp;Mở lại tab đã đóng</translation>
 <translation id="1753905327828125965">Truy cập nhiều nhất</translation>
 <translation id="1756681705074952506">Phương thức nhập</translation>
@@ -543,6 +546,7 @@
 <translation id="1830550083491357902">Chưa đăng nhập</translation>
 <translation id="1832511806131704864">Đã cập nhật thay đổi điện thoại</translation>
 <translation id="1834503245783133039">Tải xuống không thành công: <ph name="FILE_NAME" /></translation>
+<translation id="1834583737373831634">Thiết bị MIDI</translation>
 <translation id="1838374766361614909">Xóa tìm kiếm</translation>
 <translation id="1841545962859478868">Quản trị viên thiết bị có thể theo dõi các vấn đề sau đây:</translation>
 <translation id="1841616161104323629">Thiếu hồ sơ thiết bị.</translation>
@@ -786,6 +790,7 @@
 <translation id="2220529011494928058">Báo cáo sự cố</translation>
 <translation id="2220572644011485463">Mã PIN hoặc mật khẩu</translation>
 <translation id="2224444042887712269">Cài đặt này thuộc về <ph name="OWNER_EMAIL" />.</translation>
+<translation id="2224471211857467033">Sự kiện hỗ trợ tiếp cận</translation>
 <translation id="2224551243087462610">Chỉnh sửa tên thư mục</translation>
 <translation id="2226449515541314767">Trang web này đã bị chặn quyền kiểm soát hoàn toàn thiết bị MIDI.</translation>
 <translation id="2226720438730111184">Cho chúng tôi biết điều gì đang xảy ra</translation>
@@ -963,7 +968,6 @@
 <translation id="2496180316473517155">Lịch sử duyệt web</translation>
 <translation id="2497229222757901769">Tốc độ chuột</translation>
 <translation id="2497852260688568942">Đồng bộ hóa bị quản trị viên của bạn tắt</translation>
-<translation id="249819058197909513">Không cảnh báo lại đối với ứng dụng này</translation>
 <translation id="2498539833203011245">Thu nhỏ</translation>
 <translation id="2498765460639677199">Rất lớn</translation>
 <translation id="2499747912851752301">Đang xuất mật khẩu...</translation>
@@ -1051,7 +1055,6 @@
 <translation id="2630681426381349926">Kết nối với Wi-Fi để bắt đầu</translation>
 <translation id="2631120081682787498">Bạn có chắc chắn muốn đóng tab này không?</translation>
 <translation id="2631498379019108537">Hiển thị tùy chọn nhập trong giá</translation>
-<translation id="2633199387167390344"><ph name="NAME" /> đang sử dụng <ph name="USAGE" /> MB dung lượng đĩa.</translation>
 <translation id="2633212996805280240">Xóa "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> không thể hoàn tất cài đặt nhưng sẽ tiếp tục chạy từ hình ảnh đĩa của trình duyệt này.</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1305,7 +1308,7 @@
 <translation id="3012917896646559015">Vui lòng liên hệ ngay với nhà sản xuất phần cứng của bạn để gửi máy tính đến cơ sở sửa chữa.</translation>
 <translation id="3013291976881901233">Thiết bị MIDI</translation>
 <translation id="3015639418649705390">Chạy lại ngay</translation>
-<translation id="3016329696181678353">Không thể định cấu hình tự động cho <ph name="PRINTER_NAME" />. Vui lòng chỉ định các tùy chọn cài đặt nâng cao cho máy in.</translation>
+<translation id="3016329696181678353">Không thể tự động định cấu hình cho <ph name="PRINTER_NAME" />. Vui lòng chỉ định các tùy chọn cài đặt nâng cao cho máy in.</translation>
 <translation id="3016641847947582299">Thành phần đã cập nhật</translation>
 <translation id="3016780570757425217">Biết vị trí của bạn</translation>
 <translation id="3020183492814296499">Phím tắt</translation>
@@ -1397,7 +1400,6 @@
 <translation id="3157931365184549694">Khôi phục</translation>
 <translation id="3158033540161634471">Thiết lập vân tay</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (dựa trên phần cứng)</translation>
-<translation id="316125635462764134">Xóa ứng dụng</translation>
 <translation id="3161522574479303604">Tất cả ngôn ngữ</translation>
 <translation id="3163201441334626963">Sản phẩm không xác định <ph name="PRODUCT_ID" /> từ nhà cung cấp <ph name="VENDOR_ID" /></translation>
 <translation id="3165390001037658081">Một số nhà cung cấp dịch vụ có thể chặn tính năng này.</translation>
@@ -1898,6 +1900,7 @@
 <translation id="3916445069167113093">Loại tệp này có thể gây hại cho máy tính của bạn. Bạn có muốn giữ tệp <ph name="FILE_NAME" /> không?</translation>
 <translation id="3918972485393593704">Báo cáo chi tiết cho Google</translation>
 <translation id="3919145445993746351">Để có các tiện ích trên tất cả các máy tính, hãy bật tính năng đồng bộ hóa</translation>
+<translation id="391999873395511996">Đang tải máy ảo xuống.</translation>
 <translation id="3920504717067627103">Chính sách Chứng chỉ</translation>
 <translation id="392089482157167418">Bật ChromeVox (phản hồi bằng giọng nói)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1949,7 +1952,6 @@
 <translation id="3983586614702900908">thiết bị từ nhà cung cấp không xác định</translation>
 <translation id="3984159763196946143">Không thể khởi động chế độ trình diễn</translation>
 <translation id="3984431586879874039">Cho phép trang web này xem khóa bảo mật của bạn?</translation>
-<translation id="3987348946546879621">Dữ liệu đã tiết kiệm</translation>
 <translation id="3987938432087324095">Rất tiếc, vẫn chưa hiểu được nội dung đó.</translation>
 <translation id="3988996860813292272">Chọn múi giờ</translation>
 <translation id="399179161741278232">Đã nhập</translation>
@@ -1980,7 +1982,6 @@
 <translation id="4037889604535939429">Chỉnh sửa người</translation>
 <translation id="4042264909745389898">Điều khoản của Google Chrome OS</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{Thoát khỏi trang}other{Thoát khỏi trang}}</translation>
-<translation id="404299405565920089">Bạn có thể quản lý tất cả các Tài khoản Google đã đăng nhập của mình trong các ứng dụng và trang web tại đây. Các ứng dụng và trang web mà bạn đã cấp quyền có thể truy cập vào thông tin tài khoản cần thiết để hoạt động đúng cách.</translation>
 <translation id="4044612648082411741">Nhập mật khẩu chứng chỉ của bạn</translation>
 <translation id="404493185430269859">Công cụ tìm kiếm mặc định</translation>
 <translation id="4046123991198612571">Bản nhạc tiếp theo</translation>
@@ -2095,7 +2096,6 @@
 <translation id="4242533952199664413">Mở cài đặt</translation>
 <translation id="4242577469625748426">Không thể cài đặt các cài đặt chính sách trên thiết bị: <ph name="VALIDATION_ERROR" />.</translation>
 <translation id="4244238649050961491">Tìm thêm ứng dụng bút cảm ứng</translation>
-<translation id="424546999567421758">Đã phát hiện mức sử dụng ổ đĩa cao</translation>
 <translation id="424726838611654458">Luôn mở trong Adobe Reader</translation>
 <translation id="4247901771970415646">Không thể đồng bộ hóa với <ph name="USERNAME" /></translation>
 <translation id="4249248555939881673">Đang chờ kết nối mạng...</translation>
@@ -2203,7 +2203,6 @@
 <translation id="4421932782753506458">Mèo con dễ thương</translation>
 <translation id="4422347585044846479">Chỉnh sửa dấu trang của trang này</translation>
 <translation id="4423376891418188461">Khôi phục cài đặt</translation>
-<translation id="4423482519432579560">&amp;Kiểm tra chính tả</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />, quản trị viên của bạn yêu cầu bạn thay đổi mật khẩu của mình.</translation>
 <translation id="4430019312045809116">Âm lượng</translation>
 <translation id="4430369329743628066">Đã thêm dấu trang</translation>
@@ -2663,8 +2662,6 @@
 <translation id="5187295959347858724">Bạn hiện đã đăng nhập vào <ph name="SHORT_PRODUCT_NAME" />. Dấu trang, lịch sử và các cài đặt khác của bạn đang được đồng bộ hóa với Tài khoản Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> muốn tải nhiều tệp xuống</translation>
-<translation id="5192316339598592690">Chuyển nhanh giữa các tài khoản và đăng nhập vào các ứng dụng cũng như trang web cùng lúc.
-    Các ứng dụng và trang web có thể yêu cầu bạn cấp quyền sử dụng một số thông tin về Tài khoản Google của bạn. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Vui lòng powerwash thiết bị và thử lại.</translation>
 <translation id="5204967432542742771">Nhập mật khẩu</translation>
 <translation id="5206215183583316675">Xóa "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3343,7 +3340,6 @@
 <translation id="622537739776246443">Hồ sơ này sẽ bị xóa</translation>
 <translation id="6225475702458870625">Kết nối dữ liệu có sẵn từ <ph name="PHONE_NAME" /> của bạn</translation>
 <translation id="6226777517901268232">Tệp khóa cá nhân (tùy chọn)</translation>
-<translation id="6228516488918914827">Trang tải nhanh hơn</translation>
 <translation id="6228691855869374890">Trang web này có quyền kiểm soát toàn bộ thiết bị MIDI.</translation>
 <translation id="6229890768313448549">Không thể tải Điều khoản dịch vụ của Google. Vui lòng thử lại.</translation>
 <translation id="6231881193380278751">Thêm thông số truy vấn trong URL để tự động làm mới trang: chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3548,7 +3544,6 @@
 <translation id="6545665334409411530">Tốc độ lặp lại</translation>
 <translation id="6545834809683560467">Sử dụng dịch vụ gợi ý để giúp hoàn thành các tìm kiếm và URL được nhập vào thanh địa chỉ hoặc hộp tìm kiếm của trình chạy ứng dụng</translation>
 <translation id="6545867563032584178">Micrô ở trạng thái tắt trong System Preferences (Tùy chọn hệ thống) trên máy Mac</translation>
-<translation id="6547316139431024316">Không cảnh báo lại đối với tiện ích này</translation>
 <translation id="6547354035488017500">Hãy giải phóng ít nhất 512 MB dung lượng, nếu không thiết bị sẽ không phản hồi. Để giải phóng dung lượng, hãy xóa các tệp khỏi bộ nhớ thiết bị.</translation>
 <translation id="6550675742724504774">Tùy chọn</translation>
 <translation id="6551508934388063976">Lệnh không khả dụng. Nhấn phím control-N để mở cửa sổ mới.</translation>
@@ -4292,7 +4287,7 @@
 <translation id="7714464543167945231">Chứng chỉ</translation>
 <translation id="7716781361494605745">URL chính sách của tổ chức phát hành chứng chỉ Netscape</translation>
 <translation id="7717014941119698257">Đang tải xuống: <ph name="STATUS" /></translation>
-<translation id="7717845620320228976">Kiểm tra các bản cập nhật</translation>
+<translation id="7717845620320228976">Kiểm tra bản cập nhật</translation>
 <translation id="7719367874908701697">Thu phóng trang</translation>
 <translation id="7721179060400456005">Cho phép cửa sổ mở rộng màn hình</translation>
 <translation id="7722040605881499779">Cần được cập nhật: <ph name="NECESSARY_SPACE" /></translation>
@@ -4679,7 +4674,6 @@
 <translation id="827097179112817503">Hiển thị nút trang chủ</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{Đã xóa 1 dấu trang}other{Đã xóa # dấu trang}}</translation>
 <translation id="8272443605911821513">Quản lý tiện ích của bạn bằng cách nhấp vào Tiện ích trong menu "Công cụ khác".</translation>
-<translation id="8272966760965438857">Quản lý các Tài khoản Google của bạn tại một nơi</translation>
 <translation id="8274332263553132018">Truyền tệp</translation>
 <translation id="8274924778568117936">Không tắt hoặc đóng <ph name="DEVICE_TYPE" /> cho đến khi cập nhật xong. <ph name="DEVICE_TYPE" /> của bạn sẽ khởi động lại sau khi cài đặt xong.</translation>
 <translation id="8275038454117074363">Nhập</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 1e5ea67..413abd7 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -335,6 +335,7 @@
 <translation id="1510785804673676069">如果您使用的是代理服务器,请检查您的代理设置,或与网络管理员核实代理服务器是否运转正常。如果您认为自己使用的不是代理服务器,请调整您的<ph name="LINK_START" />代理设置<ph name="LINK_END" />。</translation>
 <translation id="1512210426710821809">要想撤消此操作,唯一的方法是重新安装 <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">从 Safari 中导入</translation>
+<translation id="1515163294334130951">启动</translation>
 <translation id="1521442365706402292">管理证书</translation>
 <translation id="152234381334907219">一律不保存</translation>
 <translation id="1524430321211440688">键盘</translation>
@@ -437,6 +438,7 @@
 <translation id="167160931442925455">最大音量</translation>
 <translation id="1673137583248014546"><ph name="URL" /> 想查看您的安全密钥的品牌和型号</translation>
 <translation id="1679068421605151609">开发者工具</translation>
+<translation id="1679806121152819234">插件虚拟机</translation>
 <translation id="167983332380191032">管理服务向您发送了一项 HTTP 错误。</translation>
 <translation id="1680849702532889074">安装 Linux 应用时出错。</translation>
 <translation id="16815041330799488">不允许网站查看复制到剪贴板的文字和图片</translation>
@@ -483,6 +485,7 @@
 <translation id="1744060673522309905">无法将此设备加入到该网域中。请确保您未超出可添加的设备数量上限。</translation>
 <translation id="1744108098763830590">背景页</translation>
 <translation id="1745520510852184940">一律进行此翻译</translation>
+<translation id="1746402432151920942">受保护的媒体标识符</translation>
 <translation id="175196451752279553">重新打开关闭的标签页(&amp;E)</translation>
 <translation id="1753905327828125965">常去网站</translation>
 <translation id="1756681705074952506">输入法</translation>
@@ -540,6 +543,7 @@
 <translation id="1830550083491357902">未登录</translation>
 <translation id="1832511806131704864">配对手机已更新</translation>
 <translation id="1834503245783133039">未能成功下载“<ph name="FILE_NAME" />”</translation>
+<translation id="1834583737373831634">MIDI 设备</translation>
 <translation id="1838374766361614909">清除搜索字词</translation>
 <translation id="1841545962859478868">此设备的管理员可能会监控以下各项:</translation>
 <translation id="1841616161104323629">找不到设备记录。</translation>
@@ -705,7 +709,7 @@
 <translation id="2120297377148151361">活动和互动行为</translation>
 <translation id="2120478168904746065">{NUM_TABS,plural, =1{将这个标签页取消静音}other{将这些标签页取消静音}}</translation>
 <translation id="2121825465123208577">调整大小</translation>
-<translation id="2122305276694332719">自动连接至隐藏的网络会造成其他人能查看您的设备和一些网络设置,因此我们建议不要这样做。</translation>
+<translation id="2122305276694332719">自动连接至隐藏的网络会导致其他人能查看您的设备和一些网络设置,因此我们建议不要这样做。</translation>
 <translation id="2124930039827422115">{1,plural, =1{已有一位用户给出了 <ph name="AVERAGE_RATING" /> 的评分。}other{已有 # 位用户给出评分,平均评分为 <ph name="AVERAGE_RATING" />。}}</translation>
 <translation id="2126167708562367080">您的管理员已停用同步。</translation>
 <translation id="2127372758936585790">低功率充电器</translation>
@@ -783,6 +787,7 @@
 <translation id="2220529011494928058">报告问题</translation>
 <translation id="2220572644011485463">PIN 码或密码</translation>
 <translation id="2224444042887712269">此设置属于<ph name="OWNER_EMAIL" />。</translation>
+<translation id="2224471211857467033">无障碍功能事件</translation>
 <translation id="2224551243087462610">修改文件夹名</translation>
 <translation id="2226449515541314767">已禁止该网站完全控制 MIDI 设备。</translation>
 <translation id="2226720438730111184">告诉我们所发生的情况</translation>
@@ -959,7 +964,6 @@
 <translation id="2496180316473517155">浏览记录</translation>
 <translation id="2497229222757901769">鼠标速度</translation>
 <translation id="2497852260688568942">您的管理员已停用同步</translation>
-<translation id="249819058197909513">不再为此应用发出此警告</translation>
 <translation id="2498539833203011245">最小化</translation>
 <translation id="2498765460639677199">最大</translation>
 <translation id="2499747912851752301">正在导出密码…</translation>
@@ -1046,7 +1050,6 @@
 <translation id="2630681426381349926">连接到 Wi-Fi 才能开始</translation>
 <translation id="2631120081682787498">确定要关闭此标签页吗?</translation>
 <translation id="2631498379019108537">在任务栏中显示输入法选项</translation>
-<translation id="2633199387167390344"><ph name="NAME" />占用了<ph name="USAGE" /> MB的磁盘空间。</translation>
 <translation id="2633212996805280240">要删除“<ph name="EXTENSION_NAME" />”吗?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" />无法完成安装,但是会通过其磁盘映像继续运行。</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1392,7 +1395,6 @@
 <translation id="3157931365184549694">恢复</translation>
 <translation id="3158033540161634471">设置指纹</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />](由硬件支持)</translation>
-<translation id="316125635462764134">卸载应用</translation>
 <translation id="3161522574479303604">所有语言</translation>
 <translation id="3163201441334626963">来自供应商 <ph name="VENDOR_ID" /> 的未知产品 <ph name="PRODUCT_ID" /></translation>
 <translation id="3165390001037658081">有些运营商可能会屏蔽此功能。</translation>
@@ -1891,6 +1893,7 @@
 <translation id="3916445069167113093">此类型的文件可能会损害您的计算机。您仍然要保留 <ph name="FILE_NAME" /> 吗?</translation>
 <translation id="3918972485393593704">向 Google 报告详细信息</translation>
 <translation id="3919145445993746351">若想在您的所有计算机上使用您的扩展程序,请开启同步功能</translation>
+<translation id="391999873395511996">正在下载虚拟机。</translation>
 <translation id="3920504717067627103">证书政策</translation>
 <translation id="392089482157167418">启用 ChromeVox(语音反馈)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1941,7 +1944,6 @@
 <translation id="3983586614702900908">来自未知供应商的设备</translation>
 <translation id="3984159763196946143">无法启动演示模式</translation>
 <translation id="3984431586879874039">允许此网站查看您的安全密钥?</translation>
-<translation id="3987348946546879621">节省了数据流量</translation>
 <translation id="3987938432087324095">抱歉,没听清。</translation>
 <translation id="3988996860813292272">选择时区</translation>
 <translation id="399179161741278232">已导入</translation>
@@ -1972,7 +1974,6 @@
 <translation id="4037889604535939429">修改联系人</translation>
 <translation id="4042264909745389898">Google Chrome 操作系统条款</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{退出网页}other{退出网页}}</translation>
-<translation id="404299405565920089">您可在此处集中管理您的已通过应用和网站登录的所有 Google 帐号。已获得您的授权的应用和网站可访问其所需的帐号信息以正常运行。</translation>
 <translation id="4044612648082411741">输入您的证书密码</translation>
 <translation id="404493185430269859">默认搜索引擎</translation>
 <translation id="4046123991198612571">下一曲</translation>
@@ -2087,7 +2088,6 @@
 <translation id="4242533952199664413">打开“设置”</translation>
 <translation id="4242577469625748426">无法在设备上安装策略设置:<ph name="VALIDATION_ERROR" />。</translation>
 <translation id="4244238649050961491">查找更多触控笔应用</translation>
-<translation id="424546999567421758">检测到磁盘占用量非常高</translation>
 <translation id="424726838611654458">始终用Adobe Reader打开</translation>
 <translation id="4247901771970415646">无法同步到“<ph name="USERNAME" />”</translation>
 <translation id="4249248555939881673">正在等待建立网络连接…</translation>
@@ -2195,7 +2195,6 @@
 <translation id="4421932782753506458">猫咪</translation>
 <translation id="4422347585044846479">修改此页的书签</translation>
 <translation id="4423376891418188461">还原设置</translation>
-<translation id="4423482519432579560">拼写检查(&amp;S)</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />,您的管理员要求您更改密码。</translation>
 <translation id="4430019312045809116">音量</translation>
 <translation id="4430369329743628066">已添加书签</translation>
@@ -2655,8 +2654,6 @@
 <translation id="5187295959347858724">您现在已登录 <ph name="SHORT_PRODUCT_NAME" />。系统正在将您的书签、浏览记录和其他设置与您的 Google 帐号同步。</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> 想下载多个文件</translation>
-<translation id="5192316339598592690">快速切换帐号并同时登录所有相关应用和网站。
-    应用和网站可能会向您请求权限,以便使用您的某些 Google 帐号信息。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">请对此设备执行 Powerwash,然后重试。</translation>
 <translation id="5204967432542742771">输入密码</translation>
 <translation id="5206215183583316675">要删除“<ph name="CERTIFICATE_NAME" />”吗?</translation>
@@ -3335,7 +3332,6 @@
 <translation id="622537739776246443">个人资料将被删除</translation>
 <translation id="6225475702458870625">可通过您的<ph name="PHONE_NAME" />使用数据网络连接</translation>
 <translation id="6226777517901268232">私钥文件(选填)</translation>
-<translation id="6228516488918914827">页面加载速度更快了</translation>
 <translation id="6228691855869374890">此网站可完全控制 MIDI 设备。</translation>
 <translation id="6229890768313448549">无法加载《Google Play 服务条款》。请重试。</translation>
 <translation id="6231881193380278751">在网址中添加查询参数可自动刷新相应网页:chrome://device-log/?refresh=&lt;sec&gt;</translation>
@@ -3540,7 +3536,6 @@
 <translation id="6545665334409411530">重复速度</translation>
 <translation id="6545834809683560467">在地址栏或应用启动器搜索框中输入搜索字词和网址时,借助联想查询服务自动补齐相关内容</translation>
 <translation id="6545867563032584178">已在 Mac 系统偏好设置中关闭麦克风</translation>
-<translation id="6547316139431024316">不再为此扩展程序发出此警告</translation>
 <translation id="6547354035488017500">请至少释放 512 MB 的空间,否则您的设备将无响应。要释放空间,请将文件从设备存储空间中删除。</translation>
 <translation id="6550675742724504774">选项</translation>
 <translation id="6551508934388063976">无法使用命令。请按 Ctrl+N 打开一个新窗口。</translation>
@@ -4668,7 +4663,6 @@
 <translation id="827097179112817503">显示“主页”按钮</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{已删除 1 个书签}other{已删除 # 个书签}}</translation>
 <translation id="8272443605911821513">点击“更多工具”菜单中的“扩展程序”,可以管理您的扩展程序。</translation>
-<translation id="8272966760965438857">在一个位置集中管理您的 Google 帐号</translation>
 <translation id="8274332263553132018">投射文件</translation>
 <translation id="8274924778568117936">在完成更新之前,请勿关闭您的 <ph name="DEVICE_TYPE" />。您的 <ph name="DEVICE_TYPE" /> 将会于安装完毕后重启。</translation>
 <translation id="8275038454117074363">导入</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 9cb3c68..83678b5 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -338,6 +338,7 @@
     <ph name="LINK_START" />Proxy 設定<ph name="LINK_END" />。</translation>
 <translation id="1512210426710821809">如要復原這個動作,唯一的辦法是重新安裝 <ph name="IDS_SHORT_PRODUCT_OS_NAME" /></translation>
 <translation id="151501797353681931">由 Safari 匯入</translation>
+<translation id="1515163294334130951">啟動</translation>
 <translation id="1521442365706402292">管理憑證</translation>
 <translation id="152234381334907219">永不儲存</translation>
 <translation id="1524430321211440688">鍵盤</translation>
@@ -440,6 +441,7 @@
 <translation id="167160931442925455">最大</translation>
 <translation id="1673137583248014546"><ph name="URL" /> 要求查看安全金鑰的製造商和型號</translation>
 <translation id="1679068421605151609">開發人員工具</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="167983332380191032">管理服務傳回了 HTTP 錯誤。</translation>
 <translation id="1680849702532889074">安裝 Linux 應用程式的過程中發生錯誤。</translation>
 <translation id="16815041330799488">禁止網站讀取已複製到剪貼簿的文字和圖片</translation>
@@ -962,7 +964,6 @@
 <translation id="2496180316473517155">瀏覽記錄</translation>
 <translation id="2497229222757901769">滑鼠速度</translation>
 <translation id="2497852260688568942">你的管理員停用了同步功能</translation>
-<translation id="249819058197909513">不要再顯示這個應用程式的相關警告訊息</translation>
 <translation id="2498539833203011245">最小化</translation>
 <translation id="2498765460639677199">最大</translation>
 <translation id="2499747912851752301">正在匯出密碼...</translation>
@@ -1050,7 +1051,6 @@
 <translation id="2630681426381349926">首先請連上 Wi-Fi 網路</translation>
 <translation id="2631120081682787498">你確定要關閉這個分頁嗎?</translation>
 <translation id="2631498379019108537">在檔案櫃中顯示輸入選項</translation>
-<translation id="2633199387167390344">「<ph name="NAME" />」正在使用 <ph name="USAGE" /> MB 的磁碟空間。</translation>
 <translation id="2633212996805280240">要移除「<ph name="EXTENSION_NAME" />」嗎?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> 無法完成安裝,但會繼續透過磁碟映像執行。</translation>
 <translation id="2633764681656412085">FIDO</translation>
@@ -1304,7 +1304,7 @@
 <translation id="3012917896646559015">請立即與你的硬體製造商聯絡,將電腦送返維修中心。</translation>
 <translation id="3013291976881901233">MIDI 裝置</translation>
 <translation id="3015639418649705390">立即重新啟動</translation>
-<translation id="3016329696181678353">無法自動設定「<ph name="PRINTER_NAME" />」。請指定印表機的進階詳細資料。</translation>
+<translation id="3016329696181678353">無法自動設定「<ph name="PRINTER_NAME" />」。請手動設定印表機的進階選項。</translation>
 <translation id="3016641847947582299">元件已更新</translation>
 <translation id="3016780570757425217">存取您的位置資訊</translation>
 <translation id="3020183492814296499">快速鍵</translation>
@@ -1396,7 +1396,6 @@
 <translation id="3157931365184549694">還原</translation>
 <translation id="3158033540161634471">設定指紋</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (使用硬體加密金鑰)</translation>
-<translation id="316125635462764134">移除應用程式</translation>
 <translation id="3161522574479303604">所有語言</translation>
 <translation id="3163201441334626963">供應商 <ph name="VENDOR_ID" /> 提供的不明產品 <ph name="PRODUCT_ID" /></translation>
 <translation id="3165390001037658081">部分電信業者可能會封鎖這項功能。</translation>
@@ -1897,6 +1896,7 @@
 <translation id="3916445069167113093">這種類型的檔案可能會損害你的電腦,你要保留 <ph name="FILE_NAME" /> 這個檔案嗎?</translation>
 <translation id="3918972485393593704">向 Google 回報詳細資料</translation>
 <translation id="3919145445993746351">如要在所有電腦上使用你的擴充功能,請開啟同步功能</translation>
+<translation id="391999873395511996">正在下載虛擬機器。</translation>
 <translation id="3920504717067627103">憑證原則</translation>
 <translation id="392089482157167418">啟用 ChromeVox (互動朗讀)</translation>
 <translation id="3924145049010392604">Meta</translation>
@@ -1947,7 +1947,6 @@
 <translation id="3983586614702900908">製造商不明的裝置</translation>
 <translation id="3984159763196946143">無法啟動示範模式</translation>
 <translation id="3984431586879874039">要允許這個網站查看你的安全金鑰嗎?</translation>
-<translation id="3987348946546879621">數據用量更少</translation>
 <translation id="3987938432087324095">很抱歉,系統無法辨識你的語音指令。</translation>
 <translation id="3988996860813292272">選取時區</translation>
 <translation id="399179161741278232">已匯入</translation>
@@ -1978,7 +1977,6 @@
 <translation id="4037889604535939429">編輯使用者</translation>
 <translation id="4042264909745389898">Google Chrome 作業系統條款</translation>
 <translation id="4042863763121826131">{NUM_PAGES,plural, =1{離開網頁}other{離開網頁}}</translation>
-<translation id="404299405565920089">這個頁面可讓你管理你在應用程式和網站中登入的所有 Google 帳戶。應用程式和網站如果取得了你的授權,將可存取正常運作所需的帳戶資訊。</translation>
 <translation id="4044612648082411741">輸入您的憑證密碼</translation>
 <translation id="404493185430269859">預設搜尋引擎</translation>
 <translation id="4046123991198612571">下一首曲目</translation>
@@ -2093,7 +2091,6 @@
 <translation id="4242533952199664413">開啟設定</translation>
 <translation id="4242577469625748426">無法在裝置上安裝政策設定:<ph name="VALIDATION_ERROR" />。</translation>
 <translation id="4244238649050961491">尋找其他觸控筆應用程式</translation>
-<translation id="424546999567421758">偵測到磁碟使用量偏高情形</translation>
 <translation id="424726838611654458">一律在 Adobe Reader 中開啟</translation>
 <translation id="4247901771970415646">無法與 <ph name="USERNAME" /> 同步</translation>
 <translation id="4249248555939881673">正在等待網路連線...</translation>
@@ -2201,7 +2198,6 @@
 <translation id="4421932782753506458">毛毛</translation>
 <translation id="4422347585044846479">編輯此網頁的書籤</translation>
 <translation id="4423376891418188461">還原設定</translation>
-<translation id="4423482519432579560">拼字檢查(&amp;S)</translation>
 <translation id="442397852638519243"><ph name="USER_NAME" />,管理員要求你變更密碼。</translation>
 <translation id="4430019312045809116">音量</translation>
 <translation id="4430369329743628066">已新增書籤</translation>
@@ -2661,8 +2657,6 @@
 <translation id="5187295959347858724">你已登入 <ph name="SHORT_PRODUCT_NAME" />,系統正在將你的書籤、瀏覽記錄和其他設定與「Google 帳戶」進行同步處理。</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> 想要下載多個檔案</translation>
-<translation id="5192316339598592690">快速切換帳戶,並同時登入應用程式和網站。
-    應用程式和網站可能會要求你授予權限,以便使用你的 Google 帳戶部分資訊。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">請在裝置上執行 Powerwash,然後再試一次。</translation>
 <translation id="5204967432542742771">輸入密碼</translation>
 <translation id="5206215183583316675">要刪除「<ph name="CERTIFICATE_NAME" />」嗎?</translation>
@@ -2988,7 +2982,7 @@
 <translation id="5677928146339483299">已封鎖</translation>
 <translation id="5678550637669481956">已授予 <ph name="VOLUME_NAME" /> 的讀取及寫入權限。</translation>
 <translation id="5678955352098267522">讀取你在 <ph name="WEBSITE_1" /> 上產生的資料</translation>
-<translation id="5684661240348539843">資產識別碼</translation>
+<translation id="5684661240348539843">資產 ID</translation>
 <translation id="5687326903064479980">時區</translation>
 <translation id="5689516760719285838">位置</translation>
 <translation id="56907980372820799">連結資料</translation>
@@ -3341,7 +3335,6 @@
 <translation id="622537739776246443">系統將會刪除設定檔</translation>
 <translation id="6225475702458870625">可透過 <ph name="PHONE_NAME" /> 使用數據連線</translation>
 <translation id="6226777517901268232">私密金鑰檔案 (選填)</translation>
-<translation id="6228516488918914827">網頁載入速度更快</translation>
 <translation id="6228691855869374890">這個網站可完整控制 MIDI 裝置。</translation>
 <translation id="6229890768313448549">無法載入《Google Play 服務條款》,請重試。</translation>
 <translation id="6231881193380278751">在網址中加入查詢間距的參數,設定自動重新整理網頁的時間:chrome://device-log/?refresh=&lt;秒數&gt;</translation>
@@ -3546,7 +3539,6 @@
 <translation id="6545665334409411530">重複頻率</translation>
 <translation id="6545834809683560467">使用預測查詢字串服務,讓系統協助完成你在網址列或應用程式啟動器搜尋框中輸入的搜尋字串或網址</translation>
 <translation id="6545867563032584178">已關閉 Mac 系統偏好設定中的麥克風</translation>
-<translation id="6547316139431024316">不要再顯示這項擴充功能的相關警告訊息</translation>
 <translation id="6547354035488017500">請釋出至少 512 MB 的空間,否則裝置會無回應。如要釋出空間,請刪除裝置儲存空間內的檔案。</translation>
 <translation id="6550675742724504774">選項</translation>
 <translation id="6551508934388063976">無法使用指令。按下 Ctrl + N 鍵可開啟新視窗。</translation>
@@ -4675,7 +4667,6 @@
 <translation id="827097179112817503">顯示 [首頁] 按鈕</translation>
 <translation id="8271246892936492311">{COUNT,plural, =1{已刪除 1 個書籤}other{已刪除 # 個書籤}}</translation>
 <translation id="8272443605911821513">如要管理擴充功能,只需按一下 [其他工具] 選單裡的 [擴充功能] 即可。</translation>
-<translation id="8272966760965438857">集中管理你的 Google 帳戶</translation>
 <translation id="8274332263553132018">投放檔案</translation>
 <translation id="8274924778568117936">完成更新前,請勿將 <ph name="DEVICE_TYPE" /> 關機。<ph name="DEVICE_TYPE" /> 會在安裝完成後重新啟動。</translation>
 <translation id="8275038454117074363">匯入</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb
index 11fff59..e089870c1 100644
--- a/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">ኧረ ገዳይ! Google Chrome ተሰናክሏል። አሁን እንደገና ይጀመር?</translation>
 <translation id="8342675569599923794">ይህ ፋይል አደገኛ ስለሆነ Chrome አግዶታል።</translation>
 <translation id="8370517070665726704">የቅጂ መብት <ph name="YEAR" /> Google LLC. ሁሉም መብቶች በህግ የተጠበቁ ናቸው።</translation>
-<translation id="8380166467911888159">የሥርዓተ ፊደል አጻጻፍ ስህተቶችን ለማስተካከል፣ Chrome እርስዎ በጽሑፍ መስኮች ውስጥ የሚተይቡትን ጽሑፍ ወደ Google ይልካል</translation>
 <translation id="840084489713044809">Google Chrome የእርስዎን የይለፍ ቃላት ወደ ውጭ መላክ ይፈልጋል።</translation>
 <translation id="8406086379114794905">Chrome የተሻለ እንዲሆን ያግዙ</translation>
 <translation id="8432724323949790809">አሁን Google Chromeን ዳግም ማስጀመር አለብዎት።</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Google Chrome አጋዥ</translation>
 <translation id="8679801911857917785">እንዲሁም Chromeን ሲጀምሩት የሚታየውን ገጽ ይቆጣጠራል።</translation>
 <translation id="870251953148363156">&amp;Google Chromeን አዘምን</translation>
-<translation id="8704255848199359374">ይህ በ Google ፍለጋ ውስጥ ጥቅም ላይ ጋር ተመሳሳይ የፊደል አራሚ ይጠቀማል። በአሳሽ ውስጥ የሚተይቡት ጽሑፍ ወደ Google ይላካል። ይህን ባህሪ ሁልጊዜ በቅንብሮች ውስጥ መለወጥ ይችላሉ።</translation>
 <translation id="873133009373065397">Google Chrome ነባሪ አሳሹን ማወቅ ወይም ማቀናበር አልቻለም</translation>
 <translation id="8736674169840206667">አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromeን ዳግም እንዲያስጀምሩት ይፈልግብዎታል</translation>
 <translation id="8788264404293392165">ይህ ቋንቋ የChrome OS ዩአይን ለማሳየት ስራ ላይ ይውላል</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index 9f9b1a5..5212e2e 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -267,7 +267,6 @@
 <translation id="8290100596633877290">‏للأسف! تعطل Google Chrome. هل تريد إعادة التشغيل الآن؟</translation>
 <translation id="8342675569599923794">‏هذا الملف ضار، لذلك فقد حظره Chrome.</translation>
 <translation id="8370517070665726704">‏حقوق الطبع والنشر لعام <ph name="YEAR" /> لشركة Google LLC. جميع الحقوق محفوظة.</translation>
-<translation id="8380166467911888159">‏لإصلاح الأخطاء الإملائية، يرسِل Chrome ما تكتبه في حقول النص إلى Google</translation>
 <translation id="840084489713044809">‏يرغب Google Chrome في تصدير كلمات المرور.</translation>
 <translation id="8406086379114794905">‏ساهم في تحسين Chrome</translation>
 <translation id="8432724323949790809">‏يجب إعادة تشغيل Google Chrome الآن</translation>
@@ -285,7 +284,6 @@
 <translation id="8669527147644353129">‏مساعد Google Chrome</translation>
 <translation id="8679801911857917785">‏كما أنها تتحكم في الصفحة التي تظهر عند تشغيل Chrome.</translation>
 <translation id="870251953148363156">‏&amp;تحديث Google Chrome</translation>
-<translation id="8704255848199359374">‏يستخدم هذا المتصفِّح المدقق الإملائي نفسه الذي يتم استخدامه في "بحث Google". يتم إرسال النص الذي تكتبه في المتصفِّح إلى Google. يمكنك دائمًا تغيير هذا السلوك في الإعدادات.</translation>
 <translation id="873133009373065397">‏يتعذَّر على Google Chrome تحديد المتصفح التلقائي أو تعيينه</translation>
 <translation id="8736674169840206667">‏يطلب المُشرِف إعادة تشغيل Chrome لتطبيق تحديث.</translation>
 <translation id="8788264404293392165">‏يتم استخدام هذه اللغة لعرض واجهة مستخدم نظام التشغيل Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
index 3eeec12c..4ed271a 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -265,7 +265,6 @@
 <translation id="8290100596633877290">О, не! Google Chrome претърпя срив. Да се стартира ли отново сега?</translation>
 <translation id="8342675569599923794">Chrome блокира този файл, тъй като е опасен.</translation>
 <translation id="8370517070665726704">Авторски права <ph name="YEAR" /> г. Google LLC. Всички права запазени.</translation>
-<translation id="8380166467911888159">С цел поправка на правописни грешки Chrome изпраща до Google текста, който въвеждате в текстовите полета</translation>
 <translation id="840084489713044809">Google Chrome иска да експортира паролите ви.</translation>
 <translation id="8406086379114794905">Помогнете за подобряването на Chrome</translation>
 <translation id="8432724323949790809">Трябва да рестартирате Google Chrome сега</translation>
@@ -283,7 +282,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">То също контролира коя страница се показва при стартиране на Chrome.</translation>
 <translation id="870251953148363156">Актуализиране на &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Използва се същата програма за проверка на правописа като в Google Търсене. Текстът, който въвеждате в браузъра, се изпраща до Google. Винаги можете да промените това поведение от настройките.</translation>
 <translation id="873133009373065397">Google Chrome не може да определи или зададе браузъра по подразбиране</translation>
 <translation id="8736674169840206667">Администраторът ви изисква да рестартирате Chrome, за да се приложи актуализация</translation>
 <translation id="8788264404293392165">Този език служи за показване на ПИ на Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb
index 4a8613a3..690d88d 100644
--- a/chrome/app/resources/google_chrome_strings_bn.xtb
+++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -267,7 +267,6 @@
 <translation id="8290100596633877290">হোয়া! Google Chrome ক্র্যাশ হয়েছে৷ এখনই পুনঃলঞ্চ করবেন?</translation>
 <translation id="8342675569599923794">এই ফাইলটি বিপজ্জনক, তাই Chrome এটিকে অবরুদ্ধ করেছে।</translation>
 <translation id="8370517070665726704">কপিরাইট <ph name="YEAR" /> Google LLC সব স্বত্ব সংরক্ষিত আছে।</translation>
-<translation id="8380166467911888159">ভুল বানানগুলি ঠিক করতে, Chrome টেক্সট ফিল্ডে আপনার লেখা টেক্সট Google-এ পাঠায়</translation>
 <translation id="840084489713044809">Google Chrome আপনার পাসওয়ার্ড এক্সপোর্ট করতে চাইছে।</translation>
 <translation id="8406086379114794905">Chrome আরও ভালো করে তুলতে সাহায্য করুন</translation>
 <translation id="8432724323949790809">আপনার এখনই Google Chrome আবার চালু করা উচিত</translation>
@@ -285,7 +284,6 @@
 <translation id="8669527147644353129">Google Chrome সহায়তাকারী</translation>
 <translation id="8679801911857917785">আপনি Chrome শুরু করলে কোন পৃষ্ঠাটি দেখানো হবে তাও এটি নিয়ন্ত্রণ করে।</translation>
 <translation id="870251953148363156">&amp;Google Chrome আপডেট</translation>
-<translation id="8704255848199359374">Google সার্চে যে বানান পরীক্ষক ব্যবহৃত হয় এটিও সেটিই ব্যবহার করে। আপনি ব্রাউজারে যে টেক্সট লেখেন, সেটি Google-এ পাঠানো হয়। সেটিংসে গিয়ে এই আচরণটি পরিবর্তন করতে পারেন।</translation>
 <translation id="873133009373065397">Google Chrome ডিফল্ট ব্রাউজার নির্ধারণ বা সেট করতে পারছে না</translation>
 <translation id="8736674169840206667">একটি আপডেট প্রয়োগ করতে আপনার অ্যাডমিনিস্ট্রেটর চান যে আপনি Chrome আবার চালু করুন</translation>
 <translation id="8788264404293392165">Chrome OS UI-এ দেখানোর জন্য এই ভাষা ব্যবহার করা হয়</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index a69e3c7..07a83e94 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Google Chrome s'ha bloquejat. Voleu tornar-lo a iniciar?</translation>
 <translation id="8342675569599923794">Chrome ha bloquejat aquest fitxer perquè és perillós.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Tots els drets reservats.</translation>
-<translation id="8380166467911888159">Per corregir els errors d'ortografia, Chrome envia a Google el que escrius als camps de text</translation>
 <translation id="840084489713044809">Google Chrome vol exportar les teves contrasenyes.</translation>
 <translation id="8406086379114794905">Ajudeu a millorar Chrome</translation>
 <translation id="8432724323949790809">Reinicia Google Chrome ara</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Aplicació d'ajuda de Google Chrome</translation>
 <translation id="8679801911857917785">També controla la pàgina que es mostra quan inicieu Chrome.</translation>
 <translation id="870251953148363156">Actualitza &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Fa servir el mateix corrector ortogràfic que s'utilitza a la Cerca de Google. El text que escrius al navegador s'envia a Google. Pots canviar aquest comportament sempre que vulguis a la configuració.</translation>
 <translation id="873133009373065397">Google Chrome no pot determinar ni definir el navegador predeterminat</translation>
 <translation id="8736674169840206667">L'administrador necessita que reiniciïs Chrome per aplicar una actualització</translation>
 <translation id="8788264404293392165">És l'idioma en què es mostra la IU de Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb
index 412c2ccc..df1181c 100644
--- a/chrome/app/resources/google_chrome_strings_cs.xtb
+++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -233,7 +233,7 @@
 <translation id="7473136999113284234">Chrome se automaticky aktualizuje, abyste měli vždy nejaktuálnější verzi.</translation>
 <translation id="7486227612705979895">Chrome bude za účelem zobrazování návrhů v adresním řádku číst váš obsah na Disku</translation>
 <translation id="748945194546522577">Tento soubor je nebezpečný, proto jej Chrome zablokoval. Jste chráněni pokročilou ochranou.</translation>
-<translation id="7531671357096394523">Ukončit všechny kopie Chromu</translation>
+<translation id="7531671357096394523">Ukončete všechny kopie Chromu</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
 <translation id="7552219221109926349">Zobrazit Chrome OS v tomto jazyce</translation>
 <translation id="7561940363513215021">{0,plural, =1{Chrome se za 1 minutu restartuje}few{Chrome se za # minuty restartuje}many{Chrome se za # minuty restartuje}other{Chrome se za # minut restartuje}}</translation>
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Ouha! Prohlížeč Google Chrome spadl. Restartovat?</translation>
 <translation id="8342675569599923794">Tento soubor je nebezpečný, proto jej Chrome zablokoval.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Všechna práva vyhrazena.</translation>
-<translation id="8380166467911888159">Text zadaný do textových polí odesílá Chrome kvůli opravě pravopisných chyb do Googlu</translation>
 <translation id="840084489713044809">Google Chrome chce exportovat vaše hesla.</translation>
 <translation id="8406086379114794905">Pomozte nám Chrome zlepšit</translation>
 <translation id="8432724323949790809">Teď byste měli Google Chrome restartovat</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Také řídí, která stránka se zobrazí při spuštění Chromu.</translation>
 <translation id="870251953148363156">Aktualizace aplikace &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Tato funkce využívá stejnou službu kontroly pravopisu, jaká se používá ve vyhledávání Google. Text, který v prohlížeči zadáte, se odešle do Googlu. Toto chování můžete kdykoliv změnit v nastavení.</translation>
 <translation id="873133009373065397">Google Chrome nemůže určit ani nastavit výchozí prohlížeč</translation>
 <translation id="8736674169840206667">Váš administrátor vyžaduje, abyste kvůli použití této aktualizace Chrome restartovali</translation>
 <translation id="8788264404293392165">V tomto jazyce se zobrazuje uživatelské rozhraní systému Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb
index 54bac3d2..03ae4b01 100644
--- a/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Hovsa! Google Chrome er gået ned. Vil du genstarte nu?</translation>
 <translation id="8342675569599923794">Denne fil er farlig, så Chrome har blokeret den.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Alle rettigheder forbeholdes.</translation>
-<translation id="8380166467911888159">Chrome sender den tekst, du skriver i tekstfelter, til Google for at rette stavefejl</translation>
 <translation id="840084489713044809">Google Chrome anmoder om at eksportere dine adgangskoder.</translation>
 <translation id="8406086379114794905">Hjælp med at forbedre Chrome</translation>
 <translation id="8432724323949790809">Du bør genstarte Google Chrome nu</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Hjælp til Google Chrome</translation>
 <translation id="8679801911857917785">Den styrer også, hvilken side der vises, når du åbner Chrome.</translation>
 <translation id="870251953148363156">Opdater &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Dette anvender den samme stavekontrol, som anvendes i Google Søgning. Tekst, som du angiver i browseren, sendes til Google. Du kan altid ændre dette i indstillingerne.</translation>
 <translation id="873133009373065397">Google Chrome kan ikke fastlægge eller angive standardbrowseren</translation>
 <translation id="8736674169840206667">Din administrator kræver, at du genstarter Chrome for at anvende en opdatering</translation>
 <translation id="8788264404293392165">Dette sprog bruges til at vise Chrome OS-brugerfladen</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb
index 5e02a33..03473af 100644
--- a/chrome/app/resources/google_chrome_strings_de.xtb
+++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -25,7 +25,7 @@
 <translation id="1585657529869845941">Klicken Sie auf <ph name="BEGIN_BOLD" />Trotzdem wechseln<ph name="END_BOLD" />, falls die Schaltfläche angezeigt wird</translation>
 <translation id="1587223624401073077">Google Chrome verwendet Ihre Kamera.</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> ist schädlich und wurde daher von Chrome blockiert.</translation>
-<translation id="1590588151039584890">Zum Aktualisieren muss Chrome auf diesem Computer geschlossen werden. Andere Nutzer, die an diesem Computer angemeldet sind, verlieren dann eventuell nicht gespeicherte Änderungen.</translation>
+<translation id="1590588151039584890">Zum Aktualisieren muss Chrome auf diesem Computer geschlossen werden. Nicht gespeicherte Änderungen von anderen Nutzern, die auf diesem Computer angemeldet sind, gehen dann eventuell verloren.</translation>
 <translation id="1619887657840448962">Um Chrome sicherer zu machen, haben wir die folgende Erweiterung deaktiviert. Sie ist nicht im <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> aufgeführt und wurde möglicherweise ohne Ihr Wissen hinzugefügt.</translation>
 <translation id="1628000112320670027">Hilfe für Chrome aufrufen</translation>
 <translation id="1662639173275167396">Chrome OS und <ph name="BEGIN_LINK_LINUX_OSS" />Linux (Beta)<ph name="END_LINK_LINUX_OSS" /> werden durch zusätzliche <ph name="BEGIN_LINK_CROS_OSS" />Open-Source-Software<ph name="END_LINK_CROS_OSS" /> möglich gemacht.</translation>
@@ -164,7 +164,7 @@
 <translation id="5386244825306882791">Die Erweiterung legt auch fest, welche Seite beim Start von Chrome oder bei der Suche über die Omnibox angezeigt wird.</translation>
 <translation id="5430073640787465221">Ihre Einstellungsdatei ist beschädigt oder ungültig. Google Chrome kann Ihre Einstellungen nicht wiederherstellen.</translation>
 <translation id="5483595757826856374">{0,plural, =0{Chrome wird jetzt neu gestartet}=1{Chrome wird in 1 Sekunde neu gestartet}other{Chrome wird in # Sekunden neu gestartet}}</translation>
-<translation id="5543953544073077331">Andere Instanzen von Chrome werden ausgeführt. Bitte schließen Sie diese, um zu aktualisieren.</translation>
+<translation id="5543953544073077331">Andere Instanzen von Chrome sind noch aktiv. Bitte schließen Sie diese, um den Browser zu aktualisieren.</translation>
 <translation id="556024056938947818">Google Chrome versucht, Passwörter anzuzeigen.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> ist möglicherweise schädlich und wurde daher von Chrome blockiert.</translation>
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Google Chrome ist abgestürzt. Jetzt neu starten?</translation>
 <translation id="8342675569599923794">Diese Datei ist schädlich und wurde von Chrome blockiert.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC Alle Rechte vorbehalten.</translation>
-<translation id="8380166467911888159">Um Tippfehler zu beheben, sendet Chrome den eingegebenen Text an Google</translation>
 <translation id="840084489713044809">Google Chrome möchte Ihre Passwörter exportieren.</translation>
 <translation id="8406086379114794905">Zur Verbesserung von Chrome beitragen</translation>
 <translation id="8432724323949790809">Google Chrome jetzt neu starten</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Die Erweiterung legt auch die Seite fest, die beim Start von Chrome angezeigt wird.</translation>
 <translation id="870251953148363156">&amp;Google Chrome aktualisieren</translation>
-<translation id="8704255848199359374">Es wird dieselbe Rechtschreibprüfung wie in der Google-Suche verwendet. Der in den Browser eingegebene Text wird an Google gesendet. Sie können dies jederzeit in den Einstellungen ändern.</translation>
 <translation id="873133009373065397">Google Chrome kann den Standardbrowser nicht bestimmen oder festlegen</translation>
 <translation id="8736674169840206667">Laut Ihrem Administrator müssen Sie Chrome neu starten, um ein Update durchzuführen</translation>
 <translation id="8788264404293392165">Diese Sprache wird für die Chrome OS-UI verwendet</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb
index 68b41b1..0f849f3 100644
--- a/chrome/app/resources/google_chrome_strings_el.xtb
+++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -267,7 +267,6 @@
 <translation id="8290100596633877290">Πω πω! Το Google Chrome παρουσίασε σφάλμα. Επανεκκίνηση τώρα;</translation>
 <translation id="8342675569599923794">Αυτό το αρχείο είναι επικίνδυνο και έχει αποκλειστεί από το Chrome.</translation>
 <translation id="8370517070665726704">Πνευματικά δικαιώματα <ph name="YEAR" /> Google LLC. Με την επιφύλαξη παντός δικαιώματος.</translation>
-<translation id="8380166467911888159">Για τη διόρθωση ορθογραφικών λαθών, το Chrome στέλνει στην Google το κείμενο που πληκτρολογείτε σε πεδία κειμένου</translation>
 <translation id="840084489713044809">Το Google Chrome θέλει να εξαγάγει τους κωδικούς πρόσβασής σας.</translation>
 <translation id="8406086379114794905">Βοηθήστε μας να κάνουμε καλύτερο το Chrome</translation>
 <translation id="8432724323949790809">Τώρα θα πρέπει να επανεκκινήσετε το Google Chrome</translation>
@@ -285,7 +284,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Επίσης, ελέγχει τη σελίδα που εμφανίζεται κατά την εκκίνηση του Chrome.</translation>
 <translation id="870251953148363156">Ενημέρωση &amp;του Google Chrome</translation>
-<translation id="8704255848199359374">Αυτό χρησιμοποιεί τον ίδιο ορθογραφικό έλεγχο που χρησιμοποιείται στην Αναζήτηση Google. Το κείμενο που πληκτρολογείτε στο πρόγραμμα περιήγησης αποστέλλεται στην Google. Μπορείτε ανά πάσα στιγμή να αλλάξετε αυτήν τη συμπεριφορά στις ρυθμίσεις.</translation>
 <translation id="873133009373065397">Το Google Chrome δεν μπορεί να καθορίσει ή να ορίσει το προεπιλεγμένο πρόγραμμα περιήγησης</translation>
 <translation id="8736674169840206667">Ο διαχειριστής σας απαιτεί να επανεκκινήσετε το Chrome, προκειμένου να εφαρμοστεί μια ενημέρωση</translation>
 <translation id="8788264404293392165">Αυτή η γλώσσα χρησιμοποιείται για την προβολή της διεπαφής Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index 31617b3..9f01ae2 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Whoa! Google Chrome has crashed. Relaunch now?</translation>
 <translation id="8342675569599923794">This file is dangerous, so Chrome has blocked it.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation>
-<translation id="8380166467911888159">To fix spelling errors, Chrome sends the text that you type in text fields to Google</translation>
 <translation id="840084489713044809">Google Chrome wants to export your passwords.</translation>
 <translation id="8406086379114794905">Help make Chrome better</translation>
 <translation id="8432724323949790809">You should restart Google Chrome now</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">It also controls what page is shown when you start Chrome.</translation>
 <translation id="870251953148363156">Update &amp;Google Chrome</translation>
-<translation id="8704255848199359374">This uses the same spellchecker that's used in Google search. Text that you type in the browser is sent to Google. You can always change this behaviour in settings.</translation>
 <translation id="873133009373065397">Google Chrome cannot determine or set the default browser</translation>
 <translation id="8736674169840206667">Your administrator requires that you relaunch Chrome to apply an update</translation>
 <translation id="8788264404293392165">This language is used to display the Chrome OS UI</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb
index 191dcfd..b3d1db4 100644
--- a/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">¡Vaya! Se ha producido un bloqueo en Google Chrome. ¿Quieres reiniciar el navegador ahora?</translation>
 <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="8380166467911888159">Para corregir los errores de ortografía, Chrome envía a Google lo que escribes en los campos de texto</translation>
 <translation id="840084489713044809">Google Chrome desea exportar tus contraseñas.</translation>
 <translation id="8406086379114794905">Ayudar a mejorar Chrome</translation>
 <translation id="8432724323949790809">Debes reiniciar Google Chrome ahora</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Ayuda de Google Chrome</translation>
 <translation id="8679801911857917785">También controla qué página se muestra al iniciar Chrome.</translation>
 <translation id="870251953148363156">Actualizar &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Se usará el mismo corrector ortográfico que se emplea en la Búsqueda de Google. El texto que escribas en el navegador se enviará a Google. Puedes modificar este comportamiento en la configuración en cualquier momento.</translation>
 <translation id="873133009373065397">Google Chrome no puede determinar ni establecer el navegador predeterminado</translation>
 <translation id="8736674169840206667">El administrador necesita que reinicies Chrome para aplicar una actualización</translation>
 <translation id="8788264404293392165">Este idioma se usa para mostrar la IU del Sistema operativo Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 79a1a45..ff9f73f 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -199,7 +199,7 @@
 <translation id="6291549208091401781">Google Chrome ya está instalado para todos los usuarios de tu ordenador.</translation>
 <translation id="6338556085225130112">Actualizando Google Chrome</translation>
 <translation id="6368958679917195344">Chrome OS está creado con <ph name="BEGIN_LINK_CROS_OSS" />software libre<ph name="END_LINK_CROS_OSS" /> adicional.</translation>
-<translation id="6468844726266617801">{0,plural, =1{Volver a iniciar Chrome en un día}other{Volver a iniciar Chrome en # días}}</translation>
+<translation id="6468844726266617801">{0,plural, =1{Vuelve a iniciar Chrome en un día}other{Vuelve a iniciar Chrome en # días}}</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> ‑ Google Chrome Dev</translation>
 <translation id="6566149418543181476">Actualizando Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">Estás utilizando <ph name="PROFILE_EMAIL" /> para sincronizar tu contenido de Chrome. Para actualizar tus preferencias de sincronización o utilizar Chrome sin una cuenta de Google, accede a <ph name="SETTINGS_LINK" />.</translation>
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">¡Vaya! Se ha producido un fallo en Google Chrome. ¿Quieres reiniciar el navegador ahora?</translation>
 <translation id="8342675569599923794">Este archivo es peligroso, por lo que Chrome lo ha bloqueado.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation>
-<translation id="8380166467911888159">Para corregir errores ortográficos, Chrome envía a Google el texto que escribes en los campos de texto</translation>
 <translation id="840084489713044809">Google Chrome quiere exportar tus contraseñas.</translation>
 <translation id="8406086379114794905">Ayuda a mejorar Chrome</translation>
 <translation id="8432724323949790809">Deberías reiniciar Google Chrome ahora</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Ayudante de Google Chrome</translation>
 <translation id="8679801911857917785">También controla qué página se muestra al iniciar Chrome.</translation>
 <translation id="870251953148363156">Actualizar &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Utiliza el mismo corrector ortográfico que se usa en la Búsqueda de Google. El texto que escribas en el navegador se enviará a Google. Puedes cambiar esta opción en los ajustes.</translation>
 <translation id="873133009373065397">Google Chrome no puede determinar ni establecer el navegador predeterminado</translation>
 <translation id="8736674169840206667">Tu administrador pide que reinicies Chrome para aplicar una actualización</translation>
 <translation id="8788264404293392165">La UI de Chrome OS se muestra en este idioma</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb
index a85a26d1..884e48d 100644
--- a/chrome/app/resources/google_chrome_strings_et.xtb
+++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -267,7 +267,6 @@
 <translation id="8290100596633877290">Tohoh! Google Chrome jooksis kokku. Kas soovite kohe taaskäivitada?</translation>
 <translation id="8342675569599923794">Chrome blokeeris faili, kuna see on ohtlik.</translation>
 <translation id="8370517070665726704">Autoriõigus <ph name="YEAR" /> Google LLC. Kõik õigused on kaitstud.</translation>
-<translation id="8380166467911888159">Õigekirjavigade parandamiseks saadab Chrome teie tekstiväljadel sisestatud teksti Google'ile</translation>
 <translation id="840084489713044809">Google Chrome soovib teie paroole eksportida.</translation>
 <translation id="8406086379114794905">Aidake Chrome'i täiustada</translation>
 <translation id="8432724323949790809">Soovitame Google Chrome'i kohe taaskäivitada</translation>
@@ -285,7 +284,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Lisaks juhib see Chrome'i käivitamisel kuvatavat lehte.</translation>
 <translation id="870251953148363156">Värskenda &amp;Google Chrome'i</translation>
-<translation id="8704255848199359374">See kasutab sama õigekirjakontrolli, mida kasutatakse Google'i otsingus. Brauseris sisestatav tekst saadetakse Google'ile. Seda käitumist saab seadetes alati muuta.</translation>
 <translation id="873133009373065397">Google Chrome ei saa määrata ega seadistada vaikebrauserit</translation>
 <translation id="8736674169840206667">Administraator nõuab, et käivitaksite Chrome'i värskenduse rakendamiseks uuesti</translation>
 <translation id="8788264404293392165">Seda keelt kasutatakse Chrome OS-i UI kuvamiseks</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb
index 9742e874..4e579cd 100644
--- a/chrome/app/resources/google_chrome_strings_fa.xtb
+++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -264,7 +264,6 @@
 <translation id="8290100596633877290">‏اوه! Google Chrome با اشکال مواجه شده است. دوباره راه‌اندازی شود؟</translation>
 <translation id="8342675569599923794">‏این فایل خطرناک است، بنابراین Chrome آن را مسدود کرده است.</translation>
 <translation id="8370517070665726704">‏حق نسخه‌برداری <ph name="YEAR" /> Google LLC.‎ کلیه حقوق محفوظ است.</translation>
-<translation id="8380166467911888159">‏برای رفع خطاهای املائی، Chrome نوشتاری را که در فیلد نوشتار تایپ می‌کنید، برای Google ارسال می‌کند</translation>
 <translation id="840084489713044809">‏Google Chrome می‌خواهد گذرواژه‌های شما را صادر کند.</translation>
 <translation id="8406086379114794905">‏به بهبود Chrome کمک کنید</translation>
 <translation id="8432724323949790809">‏باید هم‌اکنون Google Chrome را بازراه‌اندازی کنید</translation>
@@ -282,7 +281,6 @@
 <translation id="8669527147644353129">‏راهنمای Google Chrome</translation>
 <translation id="8679801911857917785">‏این برنامه همچنین صفحه‌ای را که هنگام راه‌اندازی Chrome نشان داده می‌شود، کنترل می‌کند.</translation>
 <translation id="870251953148363156">‏به‌روزرسانی Goo&amp;gle Chrome</translation>
-<translation id="8704255848199359374">‏این مورد از همان غلط‌گیر املایی‌ای استفاده می‌کند که در جستجوی Google استفاده می‌شود. نوشتاری که در مرورگر تایپ کرده‌اید برای Google ارسال می‌شود. هروقت بخواهید می‌توانید این رفتار را در تنظیمات تغییر دهید.</translation>
 <translation id="873133009373065397">‏Google Chrome نمی‌تواند مرورگر پیش‌فرض را تعیین یا تنظیم کند</translation>
 <translation id="8736674169840206667">‏سرپرست سیستم لازم می‌داند برای اعمال به‌روزرسانی، Chrome را راه‌اندازی مجدد کنید</translation>
 <translation id="8788264404293392165">‏از این زبان برای نمایش رابط کاربری سیستم عامل Chrome استفاده می‌شود</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index 3f77d9e..dadae4e 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -264,7 +264,6 @@
 <translation id="8290100596633877290">Hups! Google Chrome kaatui. Käynnistetäänkö uudelleen?</translation>
 <translation id="8342675569599923794">Tämä tiedosto on vaarallinen, joten Chrome on estänyt sen.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Kaikki oikeudet pidätetään.</translation>
-<translation id="8380166467911888159">Chrome lähettää kenttiin kirjoittamasi tekstin Googlelle oikeinkirjoitusvirheiden korjaamiseksi.</translation>
 <translation id="840084489713044809">Google Chrome yrittää viedä salasanojasi tiedostoon.</translation>
 <translation id="8406086379114794905">Auta parantamaan Chromea</translation>
 <translation id="8432724323949790809">Käynnistä Google Chrome uudelleen</translation>
@@ -282,7 +281,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Määrittää myös Chromen aloitussivun.</translation>
 <translation id="870251953148363156">Päivitä &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Tämä käyttää samaa oikeinkirjoituksen tarkistusta kuin Google Haku. Selaimeen kirjoittamasi teksti lähetetään Googlelle. Voit muuttaa tätä milloin tahansa asetuksista.</translation>
 <translation id="873133009373065397">Google Chrome ei voi tunnistaa tai asettaa oletusselainta.</translation>
 <translation id="8736674169840206667">Ylläpitäjä vaatii Chromen uudelleenkäynnistystä, jotta päivitys voidaan ottaa käyttöön.</translation>
 <translation id="8788264404293392165">Chrome OS ‑käyttöliittymä näytetään tällä kielellä</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 269e499..6282e47 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Whoa! Nag-crash ang Google Chrome. Ilunsad muli ngayon?</translation>
 <translation id="8342675569599923794">Mapanganib ang file na ito, kaya na-block ito ng Chrome.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Nakalaan ang lahat ng karapatan.</translation>
-<translation id="8380166467911888159">Para maayos ang mga error sa pagbabaybay, ipinapadala ng Chrome sa Google ang text na na-type mo sa mga text field</translation>
 <translation id="840084489713044809">Gustong i-export ng Google Chrome ang iyong mga password.</translation>
 <translation id="8406086379114794905">Tulungang pahusayin ang Chrome</translation>
 <translation id="8432724323949790809">Dapat mong i-restart ngayon ang Google Chrome</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Kinokontrol din nito kung anong pahina ang ipinapakita kapag sinimulan mo ang Chrome.</translation>
 <translation id="870251953148363156">I-update ang &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Ginagamit nito ang parehong spellchecker na ginagamit sa paghahanap sa Google. Ipinapadala sa Google ang text na tina-type mo sa browser. Puwede mong baguhin palagi ang gawi na ito sa mga setting.</translation>
 <translation id="873133009373065397">Hindi matukoy o maitakda ng Google Chrome ang default na browser</translation>
 <translation id="8736674169840206667">Inaatasan ka ng iyong administrator na muling ilunsad ang Chrome para malapat ang update</translation>
 <translation id="8788264404293392165">Ginagamit ang wikang ito para ipakita ang Chrome OS UI</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
index 2c3ed3f..8f0c762 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Google Chrome est bloqué. Voulez-vous le relancer maintenant ?</translation>
 <translation id="8342675569599923794">Chrome a bloqué ce fichier, car ce dernier est dangereux.</translation>
 <translation id="8370517070665726704">© <ph name="YEAR" /> Google LLC. Tous droits réservés.</translation>
-<translation id="8380166467911888159">Pour corriger les fautes d'orthographe, Chrome envoie à Google le texte que vous saisissez dans les champs</translation>
 <translation id="840084489713044809">Google Chrome veut exporter vos mots de passe.</translation>
 <translation id="8406086379114794905">Aidez-nous à améliorer Chrome</translation>
 <translation id="8432724323949790809">Redémarrez Google Chrome maintenant</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Application d'aide de Google Chrome</translation>
 <translation id="8679801911857917785">Elle contrôle également la page qui s'affiche au démarrage de Chrome.</translation>
 <translation id="870251953148363156">Mettre à jour &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Le correcteur orthographique utilisé est le même que celui employé dans la recherche Google. Le texte que vous saisissez dans le navigateur est envoyé à Google. Vous pouvez toujours modifier ce comportement dans les paramètres.</translation>
 <translation id="873133009373065397">Impossible d'identifier ou de définir le navigateur par défaut avec Google Chrome</translation>
 <translation id="8736674169840206667">À la demande de votre administrateur, vous devez relancer Chrome pour installer une mise à jour</translation>
 <translation id="8788264404293392165">Cette langue est utilisée pour l'UI de Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb
index 0797e5a7..ee273f2 100644
--- a/chrome/app/resources/google_chrome_strings_gu.xtb
+++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">ઓહ! Google Chrome ક્રેશ થઈ ગયું. હમણાં ફરીથી લોંચ કરીએ?</translation>
 <translation id="8342675569599923794">આ ફાઇલ જોખમી છે, તેથી Chrome એ તેને અવરોધિત કરેલ છે.</translation>
 <translation id="8370517070665726704">કૉપિરાઇટ <ph name="YEAR" /> Google LLC. સર્વાધિકાર સુરક્ષિત.</translation>
-<translation id="8380166467911888159">જોડણીની ભૂલો સુધારવા માટે, Chrome તમે ટેક્સ્ટ ફીલ્ડમાં ટાઇપ કરો તે ટેક્સ્ટ Googleને મોકલે છે</translation>
 <translation id="840084489713044809">Google Chrome તમારા પાસવર્ડની નિકાસ કરવા માગે છે.</translation>
 <translation id="8406086379114794905">Chrome ને બહેતર બનાવવામાં સહાય કરો</translation>
 <translation id="8432724323949790809">તમારે હવે Google Chrome ફરી શરૂ કરવું જોઈએ</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Google Chrome સહાયક</translation>
 <translation id="8679801911857917785">જ્યારે તમે Chrome શરૂ કરો ત્યારે કયું પૃષ્ઠ બતાવવામાં આવે તે તેનું પણ નિયંત્રણ કરે છે.</translation>
 <translation id="870251953148363156">&amp;Google Chrome ને અપડેટ કરો</translation>
-<translation id="8704255848199359374">આ પણ Google શોધમાં જે જોડણી તપાસનારનો ઉપયોગ થાય છે તેનો જ ઉપયોગ કરે છે. તમે બાઉઝરમાં ટાઇપ કરો છો તે ટેક્સ્ટ Googleને મોકલવામાં આવે છે. તમે સેટિંગમાં આ વર્તણૂકને હંમેશાં બદલી શકો છો.</translation>
 <translation id="873133009373065397">Google Chrome ડિફૉલ્ટ બ્રાઉઝરને નિર્ધારિત અથવા સેટ કરી શકતું નથી</translation>
 <translation id="8736674169840206667">અપડેટ લાગુ કરવા માટે તમે Chromeને ફરીથી લૉન્ચ કરો તે તમારા વ્યવસ્થાપક માટે જરૂરી છે</translation>
 <translation id="8788264404293392165">આ ભાષાનો ઉપયોગ Chrome OS UI પ્રદર્શિત કરવા માટે થાય છે</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index d37a6a6dd..5e3bb1a9 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -12,7 +12,7 @@
 <translation id="1142745911746664600">Chrome को अपडेट नहीं किया जा सकता</translation>
 <translation id="1154147086299354128">Chrome में &amp;खोलें</translation>
 <translation id="123620459398936149">Chrome OS आपका डेटा सिंक नहीं कर सका. कृपया अपना सिंक 'पासफ़्रेज़' अपडेट करें.</translation>
-<translation id="127345590676626841">Chrome अपने आप अपडेट हो जाता है ताकि आपके पास हमेशा सबसे नवीनतम वर्शन रहे. जब यह डाउनलोड पूर्ण हो जाता है, तो Chrome फिर से प्रारंभ होगा और आप आगे बढ़ जाएंगे.</translation>
+<translation id="127345590676626841">Chrome अपने आप अपडेट हो जाता है ताकि आपके पास हमेशा सबसे नवीनतम वर्शन रहे. जब यह डाउनलोड पूरा हो जाता है, तो Chrome फिर से शुरू होगा और आप आगे बढ़ जाएंगे.</translation>
 <translation id="1302523850133262269">कृपया Chrome के द्वारा नवीनतम सिस्टम अपडेट इंस्टॉल करने के दौरान प्रतीक्षा करें.</translation>
 <translation id="1312676208694947750">{0,plural, =0{Chrome OS का एक अपडेट उपलब्ध है}=1{Chrome OS का एक अपडेट उपलब्ध है}one{Chrome OS का एक अपडेट # दिनों से उपलब्ध है}other{Chrome OS का एक अपडेट # दिनों से उपलब्ध है}}</translation>
 <translation id="137466361146087520">Google Chrome बीटा</translation>
@@ -267,7 +267,6 @@
 <translation id="8290100596633877290">रुकिए! Google Chrome क्रैश हो गया है. अभी फिर से लॉन्च करें?</translation>
 <translation id="8342675569599923794">यह फ़ाइल खतरनाक है, इसलिए Chrome ने इसे रोक दिया है.</translation>
 <translation id="8370517070665726704">कॉपीराइट <ph name="YEAR" /> Google LLC. सर्वाधिकार सुरक्षित.</translation>
-<translation id="8380166467911888159">स्पेलिंग की गड़बड़ियां ठीक करने के लिए, Chrome लेख फ़ील्ड में आपके लिखे गए लेख को Google को भेजता है</translation>
 <translation id="840084489713044809">Google Chrome आपके पासवर्ड निर्यात करना चाहता है.</translation>
 <translation id="8406086379114794905">Chrome को बेहतर बनाने में सहायता करें</translation>
 <translation id="8432724323949790809">आपको Google Chrome को अभी रीस्टार्ट करना चाहिए.</translation>
@@ -285,7 +284,6 @@
 <translation id="8669527147644353129">Google Chrome सहायक</translation>
 <translation id="8679801911857917785">इससे यह भी नियंत्रित होता है कि जब आप Chrome प्रारंभ करते हैं तब कौन सा पेज दिखाया जाए.</translation>
 <translation id="870251953148363156">Google Chrome को अपडेट करना</translation>
-<translation id="8704255848199359374">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो कुछ भी लिखते हैं उसे Google को भेज दिया जाता है. आप सेटिंग में जाकर इसे कभी भी बदल सकते हैं.</translation>
 <translation id="873133009373065397">Google Chrome डिफ़ॉल्ट ब्राउज़र निर्धारित या सेट नहीं कर सकता</translation>
 <translation id="8736674169840206667">आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए, Chrome को फिर से लॉन्च करें</translation>
 <translation id="8788264404293392165">इस भाषा का इस्तेमाल Chrome OS यूज़र इंटरफ़ेस (यूआई) की सामग्री दिखाने के लिए किया जाता है</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
index ef223624..6996eab 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Opa! Google Chrome je pao. Ponovo pokrenuti sada?</translation>
 <translation id="8342675569599923794">Datoteka je opasna i Chrome ju je blokirao.</translation>
 <translation id="8370517070665726704">Autorska prava <ph name="YEAR" />. Google LLC. Sva prava pridržana.</translation>
-<translation id="8380166467911888159">Chrome Googleu šalje tekst koji utipkate u tekstualna polja kako bi ispravio pravopisne pogreške</translation>
 <translation id="840084489713044809">Google Chrome želi izvesti vaše zaporke.</translation>
 <translation id="8406086379114794905">Pomozite nam da poboljšamo Chrome</translation>
 <translation id="8432724323949790809">Sada trebate ponovo pokrenuti Google Chrome</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Upravlja i time koja se stranica prikazuje prilikom pokretanja Chromea.</translation>
 <translation id="870251953148363156">Ažuriranje preglednika Google Chrome</translation>
-<translation id="8704255848199359374">Upotrebljava istu provjeru pravopisa koja se upotrebljava na Google pretraživanju. Tekst koji unesete u preglednik šalje se Googleu. To ponašanje možete promijeniti u postavkama kad god želite.</translation>
 <translation id="873133009373065397">Google Chrome ne može utvrditi niti postaviti zadani preglednik</translation>
 <translation id="8736674169840206667">Vaš administrator zahtijeva da ponovo pokrenete Chrome radi primjene ažuriranja</translation>
 <translation id="8788264404293392165">Taj se jezik koristi za prikaz korisničkog sučelja OS-a Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb
index 8d5df576a..c91773b 100644
--- a/chrome/app/resources/google_chrome_strings_hu.xtb
+++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Hmm. A Google Chrome összeomlott. Újraindítja most?</translation>
 <translation id="8342675569599923794">Ez a fájl veszélyes, ezért a Chrome letiltotta.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Minden jog fenntartva.</translation>
-<translation id="8380166467911888159">A nyelvtani hibák javítása érdekében a Chrome elküldi a szövegmezőkbe gépelt szöveget a Google-nak</translation>
 <translation id="840084489713044809">A Google Chrome exportálni szeretné a jelszavakat.</translation>
 <translation id="8406086379114794905">Segítsen a Chrome tökéletesítésében</translation>
 <translation id="8432724323949790809">Indítsa újra a Google Chrome-ot most</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome segéd</translation>
 <translation id="8679801911857917785">Továbbá azt is szabályozza, hogy melyik oldal jelenik meg a Chrome indításakor.</translation>
 <translation id="870251953148363156">A &amp;Google Chrome frissítése</translation>
-<translation id="8704255848199359374">A szolgáltatás ugyanazt a helyesírás-ellenőrzést használja, mint a Google Keresés. A rendszer elküldi a böngészőben begépelt szövegeket a Google-nak. A beállítások között ezt bármikor módosíthatja.</translation>
 <translation id="873133009373065397">A Google Chrome problémába ütközött az alapértelmezett böngésző megállapításakor vagy beállításakor</translation>
 <translation id="8736674169840206667">A rendszergazda előírta, hogy újra kell indítania a Chrome-ot egy frissítés alkalmazása miatt</translation>
 <translation id="8788264404293392165">A Chrome OS kezelőfelülete ezen a nyelven jelenik meg.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index e197571..b20ac46b 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -164,7 +164,7 @@
 <translation id="5386244825306882791">Juga mengontrol halaman apa yang ditampilkan saat Anda memulai Chrome atau menelusuri dari Omnibox.</translation>
 <translation id="5430073640787465221">File preferensi Anda rusak atau tidak valid. Google Chrome tidak dapat memulihkan setelan Anda.</translation>
 <translation id="5483595757826856374">{0,plural, =0{Chrome akan diluncurkan ulang sekarang}=1{Chrome akan diluncurkan ulang dalam 1 detik}other{Chrome akan diluncurkan ulang dalam # detik}}</translation>
-<translation id="5543953544073077331">Salinan Chrome lain sedang berjalan. Untuk mengupdate, tutup salinan tersebut.</translation>
+<translation id="5543953544073077331">Salinan Chrome lain sedang berjalan. Untuk menjalankan update, tutup salinan tersebut.</translation>
 <translation id="556024056938947818">Google Chrome mencoba menampilkan sandi.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> mungkin berbahaya, sehingga Chrome memblokirnya.</translation>
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Aduh! Google Chrome ngadat. Luncurkan ulang sekarang?</translation>
 <translation id="8342675569599923794">File ini berbahaya, jadi Chrome telah memblokirnya.</translation>
 <translation id="8370517070665726704">Hak cipta <ph name="YEAR" /> Google LLC. Semua hak dilindungi undang-undang.</translation>
-<translation id="8380166467911888159">Untuk memperbaiki kesalahan ejaan, Chrome mengirimkan teks yang Anda ketik di kolom teks ke Google</translation>
 <translation id="840084489713044809">Google Chrome ingin mengekspor sandi.</translation>
 <translation id="8406086379114794905">Bantu kami membuat Chrome jadi lebih baik</translation>
 <translation id="8432724323949790809">Mulai ulang Google Chrome sekarang</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Pembantu Google Chrome</translation>
 <translation id="8679801911857917785">Juga mengontrol halaman apa yang ditampilkan saat Anda memulai Chrome.</translation>
 <translation id="870251953148363156">Pembaruan &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Tindakan ini akan menggunakan pemeriksa ejaan yang sama dengan yang digunakan di penelusuran Google. Teks yang Anda ketikkan di browser dikirim ke Google. Anda dapat mengubah perilaku ini di setelan.</translation>
 <translation id="873133009373065397">Google Chrome tidak dapat menentukan atau menyetel browser default</translation>
 <translation id="8736674169840206667">Administrator mengharuskan Anda meluncurkan ulang Chrome untuk menerapkan update</translation>
 <translation id="8788264404293392165">Bahasa ini digunakan untuk menampilkan UI Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb
index 325a0ed..cab1262 100644
--- a/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -264,7 +264,6 @@
 <translation id="8290100596633877290">Spiacenti, si è verificato un arresto anomalo di Google Chrome. Riavviarlo ora?</translation>
 <translation id="8342675569599923794">Questo file è pericoloso, pertanto è stato bloccato da Chrome.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC Tutti i diritti riservati.</translation>
-<translation id="8380166467911888159">Per correggere gli errori ortografici, Chrome invia a Google il testo digitato nei campi di testo</translation>
 <translation id="840084489713044809">Google Chrome vuole esportare le password.</translation>
 <translation id="8406086379114794905">Contribuisci a migliorare Chrome</translation>
 <translation id="8432724323949790809">Riavvia subito Google Chrome</translation>
@@ -282,7 +281,6 @@
 <translation id="8669527147644353129">Supporto Google Chrome</translation>
 <translation id="8679801911857917785">Controlla anche la pagina visualizzata all'avvio di Chrome.</translation>
 <translation id="870251953148363156">Aggiorna &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Viene usato lo stesso controllo ortografico utilizzato nella Ricerca Google. Il testo digitato nel browser viene inviato a Google. Puoi modificare questo comportamento in qualsiasi momento nelle impostazioni.</translation>
 <translation id="873133009373065397">Google Chrome non è in grado di determinare o impostare il browser predefinito</translation>
 <translation id="8736674169840206667">L'amministratore richiede il riavvio di Chrome per installare un aggiornamento</translation>
 <translation id="8788264404293392165">Questa lingua è utilizzata per mostrare l'UI di Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index 610f5438..c8157804 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">‏אופס! Google Chrome קרס. להפעיל מחדש עכשיו?</translation>
 <translation id="8342675569599923794">‏Chrome‏ חסם את הקובץ הזה כי הוא מסוכן.</translation>
 <translation id="8370517070665726704">‏Copyright <ph name="YEAR" /> Google LLC.‎ כל הזכויות שמורות.</translation>
-<translation id="8380166467911888159">‏Chrome שולח את הטקסט שמוקלד בשדות טקסט ל-Google כדי לתקן שגיאות כתיב</translation>
 <translation id="840084489713044809">‏Google Chrome רוצה לייצא את הסיסמאות שלך.</translation>
 <translation id="8406086379114794905">‏כך משפרים את Chrome</translation>
 <translation id="8432724323949790809">‏עליך להפעיל מחדש את Google Chrome עכשיו</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">‏הגדרה זו גם קובעת איזה דף מוצג כשאתה מפעיל את Chrome.</translation>
 <translation id="870251953148363156">‏יש לעדכן את Google Chrome&amp;</translation>
-<translation id="8704255848199359374">‏התכונה משתמשת בבדיקת האיות שבה נעשה שימוש בחיפוש Google. הטקסט המוקלד בדפדפן נשלח אל Google. אפשר לשנות תמיד את ההתנהגות הזאת בהגדרות.</translation>
 <translation id="873133009373065397">‏Google Chrome אינו יכול לקבוע או להגדיר את דפדפן ברירת המחדל</translation>
 <translation id="8736674169840206667">‏לפי דרישת מנהל המערכת, יש להפעיל מחדש את Chrome כדי להחיל עדכון</translation>
 <translation id="8788264404293392165">‏זו השפה שבה מוצג ממשק המשתמש של Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb
index c1fcb69..b7f8cac0 100644
--- a/chrome/app/resources/google_chrome_strings_ja.xtb
+++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">エラー: Google Chrome で問題が発生しました。今すぐ再起動しますか?</translation>
 <translation id="8342675569599923794">このファイルは危険なファイルであるため、Chrome でブロックしました。</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation>
-<translation id="8380166467911888159">スペルミスを修正するために、テキスト欄に入力したテキストが Chrome から Google に送信されます</translation>
 <translation id="840084489713044809">Google Chrome からパスワードをエクスポートするための許可を求められています。</translation>
 <translation id="8406086379114794905">Chrome の品質向上にご協力ください</translation>
 <translation id="8432724323949790809">今すぐ Google Chrome を再起動してください</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">この拡張機能では、Chrome の起動時に表示されるページも制御されます。</translation>
 <translation id="870251953148363156">Google Chrome を更新(&amp;G)</translation>
-<translation id="8704255848199359374">Google 検索と同じスペルチェックが使用されます。ブラウザに入力したテキストは Google に送信されます。この動作はいつでも設定で変更できます。</translation>
 <translation id="873133009373065397">Google Chrome では既定のブラウザを判定または設定できません</translation>
 <translation id="8736674169840206667">管理者が、アップデートを適用するために Chrome を再起動するよう求めています</translation>
 <translation id="8788264404293392165">この言語が Chrome OS UI の表示に使用されます</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb
index 87d4eb13..aba96743 100644
--- a/chrome/app/resources/google_chrome_strings_kn.xtb
+++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -265,7 +265,6 @@
 <translation id="8290100596633877290">ಓಹ್! Google Chrome ಕ್ರ‍್ಯಾಶ್‌ ಆಗಿದೆ.ಇದೀಗ ಮರುಪ್ರಾರಂಭಿಸುವುದೆ?</translation>
 <translation id="8342675569599923794">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿದೆ, ಹೀಗಾಗಿ Chrome ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation>
 <translation id="8370517070665726704">ಕೃತಿಸ್ವಾಮ್ಯ <ph name="YEAR" /> Google LLC. ಎಲ್ಲ ಹಕ್ಕುಗಳನ್ನು ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ.</translation>
-<translation id="8380166467911888159">ಕಾಗುಣಿತ ದೋಷಗಳನ್ನು ಸರಿಪಡಿಸಲು,  ನೀವು ಪಠ್ಯ ಕ್ಷೇತ್ರಗಳಲ್ಲಿ ಟೈಪ್ ಮಾಡುವ ಪಠ್ಯವನ್ನು Chrome, Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ</translation>
 <translation id="840084489713044809">Google Chrome ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ರಫ್ತು ಮಾಡಲು ಬಯಸುತ್ತದೆ.</translation>
 <translation id="8406086379114794905">Chrome ಉತ್ತಮಗೊಳಿಸುವಲ್ಲಿ ಸಹಾಯ ಮಾಡಿ.</translation>
 <translation id="8432724323949790809">ನೀವು ಇದೀಗ Google Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕು</translation>
@@ -284,7 +283,6 @@
 <translation id="8669527147644353129">Google Chrome ಸಹಾಯಕ</translation>
 <translation id="8679801911857917785">ನೀವು Chrome ಪ್ರಾರಂಭಿಸಿದಾಗ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಪುಟವನ್ನು ಕೂಡಾ ಇದು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation>
 <translation id="870251953148363156">&amp;Google Chrome ಅಪ್‌ಡೇಟ್‌ ಮಾಡಿ</translation>
-<translation id="8704255848199359374">ಇದು Google ಹುಡುಕಾಟದಲ್ಲಿ ಬಳಸಲಾದ ಅದೇ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಬಳಸುತ್ತದೆ. ನೀವು ಬ್ರೌಸರ್‌ನಲ್ಲಿ ಟೈಪ್ ಮಾಡುವ ಪಠ್ಯವನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ. ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನೀವು ಈ ವರ್ತನೆಯನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ ಬದಲಾಯಿಸಬಹುದು.</translation>
 <translation id="873133009373065397">ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಅನ್ನು ನಿರ್ಧರಿಸಲು ಅಥವಾ ಹೊಂದಿಸಲು Google Chrome ಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ</translation>
 <translation id="8736674169840206667">ಅಪ್‌ಡೇಟ್‌ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಕೋರುತ್ತಿದ್ದಾರೆ</translation>
 <translation id="8788264404293392165">Chrome OS UI ತೋರಿಸಲು ಈ ಭಾಷೆಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index c373653..bfc47842 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Chrome이 다운되었습니다. 다시 시작하시겠습니까?</translation>
 <translation id="8342675569599923794">이 파일은 위험하므로 Chrome에서 차단했습니다.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation>
-<translation id="8380166467911888159">맞춤법 오류를 수정하기 위해 Chrome에서 Google로 사용자가 입력하는 텍스트 전송</translation>
 <translation id="840084489713044809">Chrome에서 비밀번호를 내보내려고 합니다.</translation>
 <translation id="8406086379114794905">더 나은 Chrome을 만들 수 있도록 도와주세요.</translation>
 <translation id="8432724323949790809">지금 Chrome을 다시 시작해야 합니다</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Chrome 도우미</translation>
 <translation id="8679801911857917785">또한 Chrome을 시작할 때 표시되는 페이지를 설정합니다.</translation>
 <translation id="870251953148363156">Chrome 업데이트(&amp;G)</translation>
-<translation id="8704255848199359374">Google 검색과 동일한 맞춤법 검사기가 사용됩니다. 브라우저에 입력되는 텍스트는 Google로 전송됩니다. 설정에서 언제든지 이 동작을 변경할 수 있습니다.</translation>
 <translation id="873133009373065397">Chrome에서 기본 브라우저를 확인하거나 설정할 수 없습니다.</translation>
 <translation id="8736674169840206667">관리자가 업데이트를 적용하려면 사용자가 Chrome을 다시 시작하도록 설정했습니다.</translation>
 <translation id="8788264404293392165">Chrome OS UI가 이 언어로 표시됩니다.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb
index a41fc75..fdfd5c2e 100644
--- a/chrome/app/resources/google_chrome_strings_lt.xtb
+++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -272,7 +272,6 @@
 <translation id="8290100596633877290">Oi! „Google Chrome“ užstrigo. Paleisti iš naujo dabar?</translation>
 <translation id="8342675569599923794">Šis failas pavojingas, todėl „Chrome“ jį užblokavo.</translation>
 <translation id="8370517070665726704">Autorių teisės „Google LLC.“, <ph name="YEAR" /> m. Visos teisės saugomos.</translation>
-<translation id="8380166467911888159">Kad ištaisytų rašybos klaidas, „Chrome“ siunčia „Google“ tekstą, kurį įvedate teksto laukuose</translation>
 <translation id="840084489713044809">„Google Chrome“ nori eksportuoti jūsų slaptažodžius.</translation>
 <translation id="8406086379114794905">Padėkite tobulinti „Chrome“</translation>
 <translation id="8432724323949790809">Dabar turėtumėte paleisti „Google Chrome“ iš naujo</translation>
@@ -290,7 +289,6 @@
 <translation id="8669527147644353129">„Google Chrome“ pagalbos priemonė</translation>
 <translation id="8679801911857917785">Ji taip pat kontroliuoja, koks puslapis rodomas, kai paleidžiate „Chrome“.</translation>
 <translation id="870251953148363156">Atnaujinti „&amp;Google Chrome“</translation>
-<translation id="8704255848199359374">Naudojamas tas pats rašybos tikrinimas kaip ir „Google“ paieškoje. Tekstas, kurį įvedate naršyklėje, nusiunčiamas „Google“. Šį veikimą visada galite pakeisti nustatymuose.</translation>
 <translation id="873133009373065397">„Google Chrome“ nepavyko aptikti arba nustatyti numatytosios naršyklės</translation>
 <translation id="8736674169840206667">Administratorius reikalauja paleisti iš naujo „Chrome“, kad galėtų pritaikyti naujinį</translation>
 <translation id="8788264404293392165">Ši kalba vartojama „Chrome“ OS NS pateikti</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb
index 56d7c50..28a7654 100644
--- a/chrome/app/resources/google_chrome_strings_lv.xtb
+++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -267,7 +267,6 @@
 <translation id="8290100596633877290">Eh! Google Chrome ir avarējis. Vai restartēt to tūlīt?</translation>
 <translation id="8342675569599923794">Šis fails ir bīstams, tāpēc Chrome to bloķēja.</translation>
 <translation id="8370517070665726704">Autortiesības: <ph name="YEAR" /> Google LLC. Visas tiesības paturētas.</translation>
-<translation id="8380166467911888159">Lai izlabotu pareizrakstības kļūdas, Chrome nosūta teksta laukos ievadīto tekstu Google serveriem.</translation>
 <translation id="840084489713044809">Pārlūkā Google Chrome tiek mēģināts eksportēt jūsu paroles.</translation>
 <translation id="8406086379114794905">Palīdziet uzlabot Chrome</translation>
 <translation id="8432724323949790809">Restartējiet Google Chrome tūlīt.</translation>
@@ -285,7 +284,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Tas nosaka arī to, kāda lapa tiks rādīta, kad atvērsiet pārlūku Chrome.</translation>
 <translation id="870251953148363156">Atjaunināt &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Šeit tiek izmantota tā pati pareizrakstības pārbaude, kāda tiek izmantota Google meklēšanā. Pārlūkprogrammā ievadītais teksts tiek nosūtīts Google serveriem. Jebkurā brīdī varat mainīt šo darbību iestatījumos.</translation>
 <translation id="873133009373065397">Google Chrome nevar noteikt vai iestatīt noklusējuma pārlūku.</translation>
 <translation id="8736674169840206667">Lai lietotu atjauninājumu, administrators pieprasa restartēt pārlūku Chrome.</translation>
 <translation id="8788264404293392165">Šī valoda tiek izmantota, lai attēlotu Chrome OS lietotāja saskarni</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
index 495b15fd..dda0895 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -172,7 +172,7 @@
 
 നിങ്ങളുടെ ക്രമീകരണം വീണ്ടെടുക്കാൻ Google Chrome-ന് കഴിയില്ല.</translation>
 <translation id="5483595757826856374">{0,plural, =0{Chrome ഇപ്പോൾ വീണ്ടും സമാരംഭിക്കും}=1{Chrome ഒരു സെക്കൻഡിൽ വീണ്ടും സമാരംഭിക്കും}other{Chrome # സെക്കൻഡിൽ വീണ്ടും സമാരംഭിക്കും}}</translation>
-<translation id="5543953544073077331">Chrome-ൻ്റെ മറ്റ് പകർപ്പുകൾ റൺ ചെയ്യുന്നുണ്ട്. അപ്‌ഡേറ്റ് ചെയ്യാൻ, അവ അടയ്ക്കുക.</translation>
+<translation id="5543953544073077331">Chrome-ൻ്റെ മറ്റ് പകർപ്പുകൾ റൺ ചെയ്യുന്നു. അപ്ഡേറ്റ് ചെയ്യാൻ അവ അടയ്ക്കുക.</translation>
 <translation id="556024056938947818">Google Chrome പാസ്‌വേഡുകൾ ദൃശ്യമാക്കാൻ ശ്രമിക്കുന്നു.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ, Chrome ഇതിനെ ബ്ലോക്കുചെയ്‌തു.</translation>
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">ഓ! Google Chrome ക്രാഷുചെയ്തു. ഇപ്പോള്‍ വീണ്ടും സമാരംഭിക്കണോ?</translation>
 <translation id="8342675569599923794">ഈ ഫയൽ അപകടകരമായതിനാൽ Chrome ഇതിനെ ബ്ലോക്കുചെയ്‌തു.</translation>
 <translation id="8370517070665726704">പകർപ്പവകാശം <ph name="YEAR" /> Google LLC. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്‍തം.</translation>
-<translation id="8380166467911888159">അക്ഷരപ്പിശകുകൾ പരിഹരിക്കാൻ, ടെക്‌സ്‌റ്റ് ഫീൽഡുകളിൽ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന ടെക്‌സ്‌‌റ്റ് Chrome, Google-ന് അയയ്ക്കുന്നു</translation>
 <translation id="840084489713044809">നിങ്ങളുടെ പാസ്‌വേഡുകൾ എക്‌സ്‌പോർട്ട് ചെയ്യാൻ Google Chrome ആഗ്രഹിക്കുന്നു.</translation>
 <translation id="8406086379114794905">Chrome-നെ മികച്ചതാക്കാൻ സഹായിക്കുക</translation>
 <translation id="8432724323949790809">നിങ്ങൾ ഇപ്പോൾ Google Chrome റീസ്‌റ്റാർട്ട് ചെയ്യേണ്ടതുണ്ട്</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Google Chrome സഹായി</translation>
 <translation id="8679801911857917785">നിങ്ങൾ Chrome ആരംഭിയ്ക്കുമ്പോൾ ഏത് പേജാണ് കാണിക്കേണ്ടതെന്നും അത് നിയന്ത്രിയ്ക്കുന്നു.</translation>
 <translation id="870251953148363156">&amp;Google Chrome അപ്‌ഡേറ്റ് ചെയ്യുക</translation>
-<translation id="8704255848199359374">Google തിരയലിൽ ഉപയോഗിക്കുന്ന അതേ അക്ഷരത്തെറ്റ് പരിശോധന ഇത് ഉപയോഗിക്കുന്നു. ബ്രൗസറിൽ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന ടെക്‌സ്‌റ്റ് Google-ന് അയയ്ക്കുന്നു. ക്രമീകരണത്തിൽ എപ്പോഴും ഈ രീതി മാറ്റാനാകും.</translation>
 <translation id="873133009373065397">Google Chrome-ന് ഡിഫോൾട്ട് ബ്രൗസർ നിർണ്ണയിക്കാനോ സജ്ജമാക്കാനോ കഴിയില്ല</translation>
 <translation id="8736674169840206667">അപ്‌ഡേറ്റ് പ്രയോഗിക്കുന്നതിന് Chrome വീണ്ടും സമാരംഭിക്കാൻ നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർ ആവശ്യപ്പെടുന്നു</translation>
 <translation id="8788264404293392165">Chrome OS UI പ്രദര്‍ശിപ്പിക്കാൻ ഈ ഭാഷ ഉപയോഗിക്കുന്നു</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb
index 97129b2..ad1123c 100644
--- a/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -268,7 +268,6 @@
 <translation id="8290100596633877290">अरेरे! Google Chrome क्रॅश झाला. त्वरित पुन्हा लाँच करायचा?</translation>
 <translation id="8342675569599923794">ही फाईल धोकादायक आहे, त्यामुळे Chrome ने ती अवरोधित केली आहे.</translation>
 <translation id="8370517070665726704">कॉपीराइट <ph name="YEAR" /> Google LLC. सर्व हक्क राखीव.</translation>
-<translation id="8380166467911888159">शब्दलेखनाच्या चुकांमध्ये सुधारणा करण्यासाठी Chrome तुम्ही मजकूर भागामध्ये टाइप केलेला मजकूर Google ला पाठवते</translation>
 <translation id="840084489713044809">Google Chrome ला तुमचे पासवर्ड एक्सपोर्ट करायचे आहेत.</translation>
 <translation id="8406086379114794905">Chrome उत्कृष्ट बनविण्यात मदत करा</translation>
 <translation id="8432724323949790809">तुम्ही आता Google Chrome रीस्टार्ट करावे</translation>
@@ -286,7 +285,6 @@
 <translation id="8669527147644353129">Google Chrome मदतनीस</translation>
 <translation id="8679801911857917785">तुम्ही Chrome सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हे देखील हे नियंत्रित करते.</translation>
 <translation id="870251953148363156">&amp;Google Chrome अपडेट करा</translation>
-<translation id="8704255848199359374">Google शोध मध्ये वापरत असेलेले स्पेल चेकर वापरा. तुम्ही ब्राउझरमध्ये टाइप करत असलेला मजकूर Google कडे पाठवला जातो. तुम्ही हे वर्तन कधीही सेटिंग्ज मध्ये बदलू शकता.</translation>
 <translation id="873133009373065397">Google Chrome डीफॉल्ट ब्राउझर निर्धारित करू शकत नाही किंवा सेट करू शकत नाही</translation>
 <translation id="8736674169840206667">तुमच्या अॅडमिनिस्ट्रेटरला अपडेट लागू करता यावी यासाठी तुम्ही Chrome पुन्हा लाँच करणे अावश्यक आहे</translation>
 <translation id="8788264404293392165">ही भाषा Chrome OS UI दाखवण्यासाठी वापरली जाते</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index f7513a3..9d10570 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Alamak! Google Chrome mengalami ranap sistem. Lancarkan semula sekarang?</translation>
 <translation id="8342675569599923794">Fail ini berbahaya, maka Chrome telah menyekatnya.</translation>
 <translation id="8370517070665726704">Hak Cipta <ph name="YEAR" /> Google LLC. Hak cipta terpelihara.</translation>
-<translation id="8380166467911888159">Untuk membetulkan kesilapan ejaan, Chrome menghantar teks yang anda taip dalam medan teks kepada Google</translation>
 <translation id="840084489713044809">Google Chrome mahu mengeksport kata laluan anda.</translation>
 <translation id="8406086379114794905">Bantu mempertingkat Chrome</translation>
 <translation id="8432724323949790809">Anda perlu memulakan semula Google Chrome sekarang</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Pembantu Google Chrome</translation>
 <translation id="8679801911857917785">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chrome.</translation>
 <translation id="870251953148363156">Kemas kini &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Ini menggunakan penyemak ejaan yang sama seperti yang digunakan dalam carian Google. Teks yang anda taip dalam penyemak imbas akan dihantar kepada Google. Anda boleh menukar gelagat ini dalam tetapan pada bila-bila masa.</translation>
 <translation id="873133009373065397">Google Chrome tidak dapat menentukan atau menetapkan penyemak imbas lalai</translation>
 <translation id="8736674169840206667">Pentadbir anda menghendaki anda melancarkan semula Chrome untuk menggunakan kemas kini</translation>
 <translation id="8788264404293392165">Bahasa ini digunakan untuk memaparkan UI OS Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index 596959f..1e66f52 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -269,7 +269,6 @@
 <translation id="8290100596633877290">Oeps! Google Chrome is vastgelopen. Nu opnieuw starten?</translation>
 <translation id="8342675569599923794">Dit bestand is gevaarlijk en is daarom door Chrome geblokkeerd.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Alle rechten voorbehouden.</translation>
-<translation id="8380166467911888159">Chrome verzendt de tekst die je in tekstvelden typt naar Google om spelfouten te corrigeren</translation>
 <translation id="840084489713044809">Google Chrome wil je wachtwoorden exporteren.</translation>
 <translation id="8406086379114794905">Help ons Chrome te verbeteren</translation>
 <translation id="8432724323949790809">Je moet Google Chrome nu opnieuw opstarten</translation>
@@ -287,7 +286,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Hiermee wordt ook gecontroleerd welke pagina wordt weergegeven wanneer je Chrome start.</translation>
 <translation id="870251953148363156">&amp;Google Chrome updaten</translation>
-<translation id="8704255848199359374">Hiervoor wordt dezelfde spellingcontrole gebruikt als voor Google Zoeken. Tekst die je in de browser typt wordt naar Google gestuurd. Je kunt dit altijd wijzigen in de instellingen.</translation>
 <translation id="873133009373065397">Google Chrome kan de standaardbrowser niet bepalen of instellen</translation>
 <translation id="8736674169840206667">Je beheerder vereist dat je Chrome opnieuw start om een update toe te passen</translation>
 <translation id="8788264404293392165">Deze taal wordt gebruikt om de Chrome OS-UI weer te geven</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index 97cfcab..37835859 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Google Chrome har fått et programstopp. Vil du starte på nytt nå?</translation>
 <translation id="8342675569599923794">Denne filen er farlig, så Chrome har blokkert den.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Med enerett.</translation>
-<translation id="8380166467911888159">For å rette opp i skrivefeil sender Chrome sender tekst du skriver i tekstfelt, til Google</translation>
 <translation id="840084489713044809">Google Chrome forsøker å eksportere passordene dine.</translation>
 <translation id="8406086379114794905">Bidra til å gjøre Chrome bedre</translation>
 <translation id="8432724323949790809">Du bør starte Google Chrome på nytt nå</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome-hjelper</translation>
 <translation id="8679801911857917785">Den styrer også hvilken side som vises når du starter Chrome.</translation>
 <translation id="870251953148363156">Oppdater &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Da brukes den samme stavekontrollen som i Google Søk. Tekst du skriver inn i nettleseren, sendes til Google. Du kan når som helst endre dette i innstillingene.</translation>
 <translation id="873133009373065397">Google Chrome kan ikke fastslå eller angi standardnettleseren</translation>
 <translation id="8736674169840206667">Administratoren din krever at du starter Chrome på nytt for at en oppdatering skal tas i bruk</translation>
 <translation id="8788264404293392165">Dette språket brukes for UI-et i Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb
index 006070e8..e3a3f005 100644
--- a/chrome/app/resources/google_chrome_strings_pl.xtb
+++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -25,7 +25,7 @@
 <translation id="1585657529869845941">Kliknij przycisk <ph name="BEGIN_BOLD" />Przełącz mimo to<ph name="END_BOLD" />, jeśli jest widoczny</translation>
 <translation id="1587223624401073077">Google Chrome używa Twojej kamery.</translation>
 <translation id="1587325591171447154">Plik <ph name="FILE_NAME" /> jest niebezpieczny, dlatego został zablokowany przez Chrome.</translation>
-<translation id="1590588151039584890">Aby można było przeprowadzić aktualizację, musisz wyłączyć Chrome na tym komputerze. Wskutek tego inni zalogowani na tym komputerze użytkownicy mogą utracić niezapisane dane.</translation>
+<translation id="1590588151039584890">Aby można było przeprowadzić aktualizację, musisz wyłączyć Chrome na tym komputerze. Może to spowodować, że inni zalogowani na nim użytkownicy utracą niezapisane dane.</translation>
 <translation id="1619887657840448962">Aby poprawić bezpieczeństwo Chrome, wyłączyliśmy to rozszerzenie. Nie jest ono dostępne w <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> i mogło zostać dodane bez Twojej wiedzy.</translation>
 <translation id="1628000112320670027">Pomoc do Chrome</translation>
 <translation id="1662639173275167396">Opracowanie systemu operacyjnego Chrome było możliwe dzięki dodatkowemu <ph name="BEGIN_LINK_CROS_OSS" />oprogramowaniu open source<ph name="END_LINK_CROS_OSS" />. To samo dotyczy funkcji <ph name="BEGIN_LINK_LINUX_OSS" />Linux (Beta)<ph name="END_LINK_LINUX_OSS" />.</translation>
@@ -264,7 +264,6 @@
 <translation id="8290100596633877290">O kurczę! Przeglądarka Google Chrome uległa awarii. Uruchomić ją teraz ponownie?</translation>
 <translation id="8342675569599923794">Ten plik jest niebezpieczny, dlatego został zablokowany przez Chrome.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Wszelkie prawa zastrzeżone.</translation>
-<translation id="8380166467911888159">Aby naprawić błędy pisowni, Chrome wysyła tekst wpisany w polach tekstowych do Google</translation>
 <translation id="840084489713044809">Google Chrome chce wyeksportować Twoje hasła.</translation>
 <translation id="8406086379114794905">Pomóż ulepszać Chrome</translation>
 <translation id="8432724323949790809">Musisz teraz ponownie uruchomić Google Chrome</translation>
@@ -282,7 +281,6 @@
 <translation id="8669527147644353129">Pomoc Google Chrome</translation>
 <translation id="8679801911857917785">Kontroluje także to, jaka strona wyświetla się po uruchomieniu Chrome.</translation>
 <translation id="870251953148363156">Aktualizuj &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Będzie stosowany ten sam mechanizm sprawdzania pisowni, który jest używany w wyszukiwarce Google. Tekst wpisywany w przeglądarce jest wysyłany do Google. Zawsze możesz to zmienić w ustawieniach.</translation>
 <translation id="873133009373065397">Google Chrome nie może określić ani ustawić domyślnej przeglądarki</translation>
 <translation id="8736674169840206667">Administrator wymaga od Ciebie ponownego uruchomienia Chrome, by przeglądarka mogła zainstalować aktualizację</translation>
 <translation id="8788264404293392165">Ten język jest używany do wyświetlania UI Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
index 4ac25425..35dc0b5 100644
--- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -264,7 +264,6 @@
 <translation id="8290100596633877290">Nossa! Houve uma falha no Google Chrome. Reiniciar agora?</translation>
 <translation id="8342675569599923794">Esse arquivo é perigoso, por isso ele foi bloqueado pelo Chrome.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos os direitos reservados.</translation>
-<translation id="8380166467911888159">Para corrigir erros de ortografia, o Chrome envia ao Google o texto que você digita nos campos de texto</translation>
 <translation id="840084489713044809">O Google Chrome quer exportar suas senhas.</translation>
 <translation id="8406086379114794905">Ajudar a melhorar o Google Chrome</translation>
 <translation id="8432724323949790809">Reinicie o Google Chrome agora</translation>
@@ -282,7 +281,6 @@
 <translation id="8669527147644353129">Auxiliar do Google Chrome</translation>
 <translation id="8679801911857917785">Controla também qual página deve ser exibida quando você inicia o Chrome.</translation>
 <translation id="870251953148363156">Atualizar o Google Chrome</translation>
-<translation id="8704255848199359374">Esta opção usa o mesmo recurso de verificação ortográfica da Pesquisa Google. O texto digitado no navegador é enviado para o Google. É possível alterar esse comportamento nas configurações a qualquer momento.</translation>
 <translation id="873133009373065397">O Google Chrome não pode determinar ou definir o navegador padrão</translation>
 <translation id="8736674169840206667">Seu administrador exige que você reinicie o Chrome para que uma atualização seja aplicada</translation>
 <translation id="8788264404293392165">Este idioma é usado para exibir a IU do Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
index 614ecbc..4e6d7279 100644
--- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Ups! O Google Chrome falhou. Reiniciar agora?</translation>
 <translation id="8342675569599923794">Este ficheiro é perigoso. Como tal, o Chrome bloqueou-o.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos os direitos reservados.</translation>
-<translation id="8380166467911888159">Para corrigir erros ortográficos, o Chrome envia o texto que introduzir nos campos de texto para a Google.</translation>
 <translation id="840084489713044809">O Google Chrome pretende exportar as suas palavras-passe.</translation>
 <translation id="8406086379114794905">Ajude a melhorar o Chrome</translation>
 <translation id="8432724323949790809">Deve reiniciar o Google Chrome agora</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Ajudante do Google Chrome</translation>
 <translation id="8679801911857917785">Também controla a página apresentada quando inicia o Chrome.</translation>
 <translation id="870251953148363156">Atualizar o &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Utiliza o mesmo corretor ortográfico utilizado na Pesquisa Google. O texto que introduzir no navegador é enviado à Google. Pode sempre alterar este comportamento nas definições.</translation>
 <translation id="873133009373065397">O Google Chrome não consegue determinar ou definir o navegador predefinido</translation>
 <translation id="8736674169840206667">O seu administrador necessita que reinicie o Chrome para aplicar uma atualização.</translation>
 <translation id="8788264404293392165">Este idioma é utilizado para apresentar a IU do Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
index b89a8886..10de647 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Hopa! Google Chrome s-a blocat. Repornești acum?</translation>
 <translation id="8342675569599923794">Fișierul este periculos, așadar Chrome l-a blocat.</translation>
 <translation id="8370517070665726704">Drept de autor <ph name="YEAR" /> Google LLC. Toate drepturile rezervate.</translation>
-<translation id="8380166467911888159">Pentru a corecta erorile de scriere, Chrome trimite la Google textul pe care îl introduci în câmpurile de text</translation>
 <translation id="840084489713044809">Google Chrome vrea să îți exporte parolele.</translation>
 <translation id="8406086379114794905">Contribuie la îmbunătățirea Chrome</translation>
 <translation id="8432724323949790809">Îți recomandăm să repornești Google Chrome acum.</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Stabilește și ce pagină se afișează când porniți Chrome.</translation>
 <translation id="870251953148363156">Actualizați &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Folosește același verificator ortografic folosit în Căutarea Google. Textul pe care îl introduci în browser este trimis la Google. Poți schimba acest comportament în setări.</translation>
 <translation id="873133009373065397">Google Chrome nu poate determina sau seta browserul prestabilit</translation>
 <translation id="8736674169840206667">Administratorul solicită să relansezi Chrome pentru a aplica o actualizare</translation>
 <translation id="8788264404293392165">Această limbă este folosită pentru a afișa IU din sistemul de operare Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index 648676c8..7a58681a7 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Произошел сбой Google Chrome. Перезапустить?</translation>
 <translation id="8342675569599923794">Chrome заблокировал этот файл как опасный.</translation>
 <translation id="8370517070665726704">© Google LLC, <ph name="YEAR" />. Все права защищены.</translation>
-<translation id="8380166467911888159">Отправлять введенный вами текст в Google для проверки правописания</translation>
 <translation id="840084489713044809">Вы собираетесь экспортировать пароли из Google Chrome.</translation>
 <translation id="8406086379114794905">Помогите сделать Chrome безопаснее</translation>
 <translation id="8432724323949790809">Перезапустите Google Chrome</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Кроме того, расширение изменило стартовую страницу Chrome.</translation>
 <translation id="870251953148363156">Обновить &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Используется та же технология проверки правописания, что и в Google Поиске. Текст, введенный в браузере, отправляется на серверы Google. Этот параметр можно изменить в разделе настроек.</translation>
 <translation id="873133009373065397">Google Chrome не удалось определить или задать браузер по умолчанию</translation>
 <translation id="8736674169840206667">Администратор требует перезапустить Chrome для установки обновления</translation>
 <translation id="8788264404293392165">На этом языке отображается интерфейс Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
index 43a6228..28e396e7 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -269,7 +269,6 @@
 <translation id="8290100596633877290">Google Chrome zlyhal. Chcete ho spustiť znova?</translation>
 <translation id="8342675569599923794">Tento súbor je nebezpečný, a preto ho Chrome zablokoval.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Všetky práva vyhradené.</translation>
-<translation id="8380166467911888159">Chrome odošle text zadaný v textových poliach Googlu s cieľom opraviť pravopisné chyby</translation>
 <translation id="840084489713044809">Google Chrome sa pokúša exportovať vaše heslá.</translation>
 <translation id="8406086379114794905">Pomôžte nám Chrome zlepšiť</translation>
 <translation id="8432724323949790809">Mali by ste reštartovať prehliadač Google Chrome</translation>
@@ -287,7 +286,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Tiež určuje, ktorá stránka sa zobrazí pri spustení prehliadača Chrome.</translation>
 <translation id="870251953148363156">Aktualizácia prehliadača &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Využíva rovnaký nástroj na kontrolu pravopisu, aký sa používa vo Vyhľadávaní Google. Text, ktorý napíšete v prehliadači, sa odosiela Googlu. Toto správanie môžete zmeniť v nastaveniach.</translation>
 <translation id="873133009373065397">Google Chrome nedokáže určiť alebo nastaviť predvolený prehliadač</translation>
 <translation id="8736674169840206667">Správca požaduje, aby ste reštartovali Chrome na použitie aktualizácie</translation>
 <translation id="8788264404293392165">V tomto jazyku sa zobrazuje používateľské rozhranie systému Google OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index bf9802b..94b35ba5 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Opa! Google Chrome se je zrušil. Ga želite znova zagnati?</translation>
 <translation id="8342675569599923794">Ta datoteka je nevarna, zato jo je Chrome blokiral.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Vse pravice pridržane.</translation>
-<translation id="8380166467911888159">Chrome zaradi odpravljanja napak pri črkovanju Googlu pošlje besedilo, ki ga vnesete v besedilna polja</translation>
 <translation id="840084489713044809">Google Chrome želi izvoziti gesla.</translation>
 <translation id="8406086379114794905">Pomagajte izboljšati Chrome</translation>
 <translation id="8432724323949790809">Google Chrome zdaj znova zaženite.</translation>
@@ -290,7 +289,6 @@
 <translation id="8669527147644353129">Pomočnik za Google Chrome</translation>
 <translation id="8679801911857917785">Določa tudi, katera stran je prikazana, ko zaženete Chrome.</translation>
 <translation id="870251953148363156">Posodabljanje &amp;Google Chroma</translation>
-<translation id="8704255848199359374">Uporabljeno je isto preverjanje črkovanja kot v Iskanju Google. Besedilo, ki ga vnesete v brskalniku, je poslano Googlu. To lahko kadar koli spremenite v nastavitvah.</translation>
 <translation id="873133009373065397">Google Chrome ne more določiti ali nastaviti privzetega brskalnika</translation>
 <translation id="8736674169840206667">Skrbnik zahteva, da za uveljavitev te posodobitve znova zaženete Chrome</translation>
 <translation id="8788264404293392165">Ta jezik se uporablja za prikaz uporabniškega vmesnika za Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb
index af704f67..5cf24e0e 100644
--- a/chrome/app/resources/google_chrome_strings_sr.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Опа! Google Chrome је отказао. Желите ли да га одмах поново покренете?</translation>
 <translation id="8342675569599923794">Ова датотека је опасна, па ју је Chrome блокирао.</translation>
 <translation id="8370517070665726704">Ауторска права <ph name="YEAR" />. Google LLC. Сва права задржана.</translation>
-<translation id="8380166467911888159">Да би исправио правописне грешке, Chrome шаље Google-овим серверима текст који уносите у поља за текст.</translation>
 <translation id="840084489713044809">Google Chrome жели да извезе лозинке.</translation>
 <translation id="8406086379114794905">Помозите нам да побољшамо Chrome</translation>
 <translation id="8432724323949790809">Рестартујте Google Chrome</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Google Chrome помоћник</translation>
 <translation id="8679801911857917785">Контролише и страницу која се приказује када покренете Chrome.</translation>
 <translation id="870251953148363156">Ажурирај &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Користи исту проверу правописа као Google претрага. Текст који унесете у прегледач се шаље Google-у. То увек можете да промените у подешавањима.</translation>
 <translation id="873133009373065397">Google Chrome не може да одреди ни да подеси подразумевани прегледач</translation>
 <translation id="8736674169840206667">Администратор захтева да поново покренете Chrome да бисте применили ажурирање</translation>
 <translation id="8788264404293392165">Овај језик се користи за приказивање корисничког интерфејса Chrome ОС-а</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index e52907893..885ee1c 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Hoppsan! Google Chrome har kraschat. Vill du starta om nu?</translation>
 <translation id="8342675569599923794">Filen är farlig och har blockerats av Chrome.</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Med ensamrätt.</translation>
-<translation id="8380166467911888159">Chrome skickar det du skriver i textfält till Google för att kontrollera stavningen</translation>
 <translation id="840084489713044809">Lösenorden exporteras från Google Chrome.</translation>
 <translation id="8406086379114794905">Hjälp till att göra Chrome bättre</translation>
 <translation id="8432724323949790809">Starta om Google Chrome nu</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Det styr också vilken sida som visas när du startar Chrome.</translation>
 <translation id="870251953148363156">Uppdatera &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Detta använder samma stavningskontroll som Google Sök. Text som du anger i webbläsaren skickas till Google. Du kan när som helst ändra detta i inställningarna.</translation>
 <translation id="873133009373065397">Google Chrome kan inte fastställa eller ange standardwebbläsaren</translation>
 <translation id="8736674169840206667">Administratören meddelar att du måste starta om Chrome så att en uppdatering tillämpas</translation>
 <translation id="8788264404293392165">Användargränssnittet i Chrome OS visas på det här språket</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index 97b9231..1d1dcf6 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -271,7 +271,6 @@
 <translation id="8290100596633877290">Ho! Google Chrome imezimika. Ianzishe tena sasa?</translation>
 <translation id="8342675569599923794">Faili hii ni hatari, kwa hivyo Chrome imeizuia.</translation>
 <translation id="8370517070665726704">Hakimiliki <ph name="YEAR" /> Google LLC. Haki zote zimehifadhiwa.</translation>
-<translation id="8380166467911888159">Ili kurekebisha makosa ya tahajia, Chrome hutuma maandishi unayoandika kwenye sehemu za maandishi kwa Google</translation>
 <translation id="840084489713044809">Google Chrome ingependa kuhamisha manenosiri yako.</translation>
 <translation id="8406086379114794905">Saidia kuboresha Chrome</translation>
 <translation id="8432724323949790809">Unapaswa kufunga kisha ufungue Google Chrome sasa</translation>
@@ -289,7 +288,6 @@
 <translation id="8669527147644353129">Msaidizi wa Google Chrome</translation>
 <translation id="8679801911857917785">Pia inadhibiti ukurasa unaoonyeshwa unapoanzisha Chrome.</translation>
 <translation id="870251953148363156">Sasisha &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Huduma hii hutumia kikagua maendelezo sawa na kinachotumika kwenye Huduma ya Tafuta na Google. Maandishi unayoandika kwenye kivinjari yanatumwa kwa Google. Unaweza kubadilisha hali hii katika mipangilio wakati wowote.</translation>
 <translation id="873133009373065397">Google Chrome haijafaulu kubainisha wala kuweka kivinjari chaguomsingi</translation>
 <translation id="8736674169840206667">Msimamizi wako anakushauri uwashe Chrome upya ili utumie sasisho</translation>
 <translation id="8788264404293392165">Lugha hii inatumika kuonyesha Kiolesura cha Mfumo wa Uendeshaji wa Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb
index 0a0149e7..8345e59 100644
--- a/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">அச்சச்சோ! Google Chrome செயலிழந்தது. இப்போது மீண்டும் தொடங்கவா?</translation>
 <translation id="8342675569599923794">இந்தக் கோப்பு ஆபத்தானது என்பதால், அதை Chrome தடுத்துள்ளது.</translation>
 <translation id="8370517070665726704">பதிப்புரிமை <ph name="YEAR" /> Google LLC. அனைத்து உரிமைகளும் பாதுகாக்கப்பட்டவை.</translation>
-<translation id="8380166467911888159">எழுத்துப் பிழைகளைச் சரிசெய்ய, Chrome நீங்கள் உரைப் புலங்களில் உள்ளிடும் உரைகளை Googleளுக்கு அனுப்பும்</translation>
 <translation id="840084489713044809">Google Chrome உங்கள் கடவுச்சொற்களை ஏற்ற விரும்புகிறது.</translation>
 <translation id="8406086379114794905">Chrome ஐ மேலும் சிறப்பாக்க உதவவும்</translation>
 <translation id="8432724323949790809">இப்போது Google Chromeமை மீண்டும் தொடங்க வேண்டும்</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome உதவி</translation>
 <translation id="8679801911857917785">Chrome ஐத் தொடங்கும்போது காண்பிக்கப்படும் பக்கத்தையும் இது கட்டுப்படுத்துகிறது.</translation>
 <translation id="870251953148363156">&amp;Google Chrome ஐப் புதுப்பி</translation>
-<translation id="8704255848199359374">இது Google தேடலில் பயன்படுத்தப்படும் அதே 'எழுத்துப் பிழை சரிபார்க்கும்' அம்சத்தைப் பயன்படுத்துகிறது. உலாவியில் நீங்கள் உள்ளிடும் உரை Googleளுக்கு அனுப்பப்படும். இதை அமைப்புகளில் எப்போது வேண்டுமானாலும் மாற்றலாம்.</translation>
 <translation id="873133009373065397">இயல்புநிலை உலாவியைக் கண்டறியவோ அமைக்கவோ Google Chrome ஆல் முடியவில்லை</translation>
 <translation id="8736674169840206667">புதுப்பிப்பைப் பயன்படுத்த, Chromeஐ மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி சொல்கிறார்</translation>
 <translation id="8788264404293392165">Chrome OS UIயைக் காட்ட இந்த மொழி பயன்படுத்தப்படும்</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index 51a0301..eee6906 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">ఆపండి! Google Chrome క్రాష్ అయ్యింది. ఇప్పుడు మళ్ళీ ప్రారంభించాల?</translation>
 <translation id="8342675569599923794">ఈ ఫైల్ అపాయకరమైనది, కాబట్టి Chrome దీన్ని బ్లాక్ చేసింది.</translation>
 <translation id="8370517070665726704">కాపీరైట్ <ph name="YEAR" /> Google LLC. సర్వ హక్కులు ప్రత్యేకించబడ్డాయి.</translation>
-<translation id="8380166467911888159">అక్షరక్రమ లోపాలను పరిష్కరించడానికి, Chrome మీరు వచన ఫీల్డ్‌లలో టైప్ చేసే వచనాన్ని Googleకి పంపుతుంది</translation>
 <translation id="840084489713044809">Google Chrome మీ పాస్‌వర్డ్‌లను ఎగుమతి చేయాలనుకుంటోంది.</translation>
 <translation id="8406086379114794905">Chromeను మెరుగుపరచడంలో సహాయపడండి</translation>
 <translation id="8432724323949790809">మీరు ఇప్పుడు Google Chromeని పునఃప్రారంభించాలి</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Google Chrome సహాయకారుడు</translation>
 <translation id="8679801911857917785">ఇది మీరు Chromeని ప్రారంభించేటప్పుడు చూపబడే పేజీని కూడా నియంత్రిస్తుంది.</translation>
 <translation id="870251953148363156">&amp;Google Chromeను అప్‌డేట్ చేయి</translation>
-<translation id="8704255848199359374">ఇది Google శోధనలో ఉపయోగించే అదే స్పెల్ చెకర్‌ను ఉపయోగిస్తుంది. మీరు బ్రౌజర్‌లో టైప్ చేసే వచనాన్ని Googleకు పంపుతుంది. మీరు ఈ ప్రవర్తనను తర్వాత ఎప్పుడైనా సెట్టింగ్‌లలో మార్చవచ్చు.</translation>
 <translation id="873133009373065397">Google Chrome డిఫాల్ట్ బ్రౌజర్‌ను నిశ్చయించలేదు లేదా సెట్ చేయలేదు</translation>
 <translation id="8736674169840206667">అప్‌డేట్‌ను వర్తింపజేయడం కోసం మీరు Chromeను పునఃప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు</translation>
 <translation id="8788264404293392165">Chrome OS UIను చూపడానికి ఈ భాష ఉపయోగించబడింది</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
index c9529450..78bdfec 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -264,7 +264,6 @@
 <translation id="8290100596633877290">อ๊ะ! Google Chrome ขัดข้อง เปิดใหม่ตอนนี้หรือไม่</translation>
 <translation id="8342675569599923794">ไฟล์นี้อันตราย Chrome จึงบล็อกไว้</translation>
 <translation id="8370517070665726704">ลิขสิทธิ์ <ph name="YEAR" /> Google LLC สงวนลิขสิทธิ์</translation>
-<translation id="8380166467911888159">Chrome จะส่งข้อความที่คุณพิมพ์ในช่องข้อความไปยัง Google เพื่อแก้ไขข้อผิดพลาดของการสะกดคำ</translation>
 <translation id="840084489713044809">Google Chrome ต้องการส่งออกรหัสผ่านของคุณ</translation>
 <translation id="8406086379114794905">ช่วยปรับปรุง Chrome ให้ดีขึ้น</translation>
 <translation id="8432724323949790809">คุณควรรีสตาร์ท Google Chrome เลย</translation>
@@ -282,7 +281,6 @@
 <translation id="8669527147644353129">ตัวช่วยเหลือของ Google Chrome</translation>
 <translation id="8679801911857917785">อีกทั้งยังควบคุมหน้าที่จะแสดงเมื่อคุณเปิด Chrome ด้วย</translation>
 <translation id="870251953148363156">อัปเดต &amp;Google Chrome</translation>
-<translation id="8704255848199359374">การดำเนินการนี้จะใช้โปรแกรมตรวจตัวสะกดแบบเดียวกับ Google Search ข้อความที่คุณพิมพ์ในเบราว์เซอร์จะส่งไปยัง Google คุณปรับเปลี่ยนลักษณะการทำงานนี้ได้ทุกเมื่อในการตั้งค่า</translation>
 <translation id="873133009373065397">Google Chrome ไม่สามารถกำหนดหรือตั้งค่าเบราว์เซอร์เริ่มต้น</translation>
 <translation id="8736674169840206667">ผู้ดูแลระบบต้องการให้คุณเปิด Chrome ขึ้นมาใหม่เพื่อใช้การอัปเดต</translation>
 <translation id="8788264404293392165">นี่เป็นภาษาที่ใช้ในการแสดง UI ของ Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
index 5d0408b6..03dee7a 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -266,7 +266,6 @@
 <translation id="8290100596633877290">Of! Google Chrome kilitlendi. Şimdi yeniden başlatılsın mı?</translation>
 <translation id="8342675569599923794">Bu dosya tehlikeli olduğu için Chrome tarafından engellendi.</translation>
 <translation id="8370517070665726704">Telif hakkı <ph name="YEAR" /> Google LLC. Tüm hakları saklıdır.</translation>
-<translation id="8380166467911888159">Yazım hatalarını düzeltmek için Chrome, metin alanlarına yazdığınız metinleri Google'a gönderir</translation>
 <translation id="840084489713044809">Google Chrome, şifrelerinizi dışa aktarmak istiyor.</translation>
 <translation id="8406086379114794905">Chrome'u daha iyi hale getirmeye yardımcı olun</translation>
 <translation id="8432724323949790809">Google Chrome'u şimdi yeniden başlatmalısınız</translation>
@@ -284,7 +283,6 @@
 <translation id="8669527147644353129">Google Chrome Helper</translation>
 <translation id="8679801911857917785">Ayrıca Chrome'u başlattığınızda gösterilecek sayfayı da denetler.</translation>
 <translation id="870251953148363156">&amp;Google Chrome'u güncelle</translation>
-<translation id="8704255848199359374">Bu işlev, Google Arama'da kullanılan yazım denetiminin aynısını kullanır. Tarayıcıda yazdığınız metin Google'a gönderilir. Bu davranışı istediğiniz zaman ayarlardan değiştirebilirsiniz.</translation>
 <translation id="873133009373065397">Google Chrome, varsayılan tarayıcıyı tespit edemiyor veya ayarlayamıyor</translation>
 <translation id="8736674169840206667">Yöneticiniz bir güncellemeyi uygulamak için Chrome'u yeniden başlatmanızı gerektiriyor</translation>
 <translation id="8788264404293392165">Bu dil, Chrome OS kullanıcı arayüzünü görüntülemek için kullanılır</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb
index 08dcbc3..52ae046 100644
--- a/chrome/app/resources/google_chrome_strings_uk.xtb
+++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -263,7 +263,6 @@
 <translation id="8290100596633877290">Відбулося аварійне завершення роботи Google Chrome. Перезапустити зараз?</translation>
 <translation id="8342675569599923794">Цей файл небезпечний, тому Chrome заблокував його.</translation>
 <translation id="8370517070665726704">Авторське право <ph name="YEAR" /> Google LLC. Усі права захищено.</translation>
-<translation id="8380166467911888159">Щоб виправляти орфографічні помилки, Chrome надсилає введений текст у Google</translation>
 <translation id="840084489713044809">Google Chrome хоче експортувати ваші паролі.</translation>
 <translation id="8406086379114794905">Допоможіть покращити Chrome</translation>
 <translation id="8432724323949790809">Перезапустіть Google Chrome</translation>
@@ -281,7 +280,6 @@
 <translation id="8669527147644353129">Помічник Google Chrome</translation>
 <translation id="8679801911857917785">Розширення також змінило сторінку, яка відкривається під час запуску Chrome.</translation>
 <translation id="870251953148363156">Оновити &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Використовується та сама технологія перевірки орфографії, що й у Пошуку Google. Текст, який ви вводите у веб-переглядачі, надсилається в Google. Це завжди можна змінити в налаштуваннях.</translation>
 <translation id="873133009373065397">Google Chrome не може визначити чи встановити веб-переглядач за умовчанням</translation>
 <translation id="8736674169840206667">Адміністратор вимагає перезапустити Chrome, щоб застосувати оновлення</translation>
 <translation id="8788264404293392165">Цією мовою відображається інтерфейс ОС Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
index 2a3871e..d8f163a 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -268,7 +268,6 @@
 <translation id="8290100596633877290">Chà! Google Chrome đã bị lỗi. Mở lại bây giờ không? </translation>
 <translation id="8342675569599923794">Tệp này nguy hiểm, do đó Chrome đã chặn tệp.</translation>
 <translation id="8370517070665726704">Bản quyền <ph name="YEAR" /> Google LLC. Mọi quyền được bảo lưu.</translation>
-<translation id="8380166467911888159">Để sửa lỗi chính tả, Chrome sẽ gửi cho Google nội dung bạn nhập vào các trường văn bản</translation>
 <translation id="840084489713044809">Google Chrome muốn xuất các mật khẩu của bạn.</translation>
 <translation id="8406086379114794905">Giúp cải thiện Chrome tốt hơn</translation>
 <translation id="8432724323949790809">Bạn cần khởi động lại Google Chrome ngay bây giờ</translation>
@@ -286,7 +285,6 @@
 <translation id="8669527147644353129">Trình trợ giúp của Google Chrome</translation>
 <translation id="8679801911857917785">Tiện ích này cũng điều khiển trang nào được hiển thị khi bạn khởi động Chrome.</translation>
 <translation id="870251953148363156">Cập nhật &amp;Google Chrome</translation>
-<translation id="8704255848199359374">Dịch vụ này sử dụng cùng một trình kiểm tra lỗi chính tả dùng trong Google Tìm kiếm. Chrome gửi cho Google văn bản mà bạn nhập vào trình duyệt. Bạn luôn có thể thay đổi hành động này trong các tùy chọn cài đặt.</translation>
 <translation id="873133009373065397">Google Chrome không thể xác định hoặc đặt trình duyệt mặc định</translation>
 <translation id="8736674169840206667">Quản trị viên của bạn yêu cầu bạn chạy lại Chrome để áp dụng bản cập nhật</translation>
 <translation id="8788264404293392165">Ngôn ngữ này dùng để hiển thị giao diện người dùng của Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
index a989e10..6496689 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -264,7 +264,6 @@
 <translation id="8290100596633877290">哎呀!Google Chrome 浏览器崩溃了。是否立即重新启动?</translation>
 <translation id="8342675569599923794">此文件存在危险,因此 Chrome 已将其拦截。</translation>
 <translation id="8370517070665726704">版权所有 <ph name="YEAR" /> Google LLC. 保留所有权利。</translation>
-<translation id="8380166467911888159">为了修正拼写错误,Chrome 会将您在文本字段中输入的文字发送给 Google</translation>
 <translation id="840084489713044809">Google Chrome 想导出您的密码。</translation>
 <translation id="8406086379114794905">帮助我们改进Chrome</translation>
 <translation id="8432724323949790809">您应立即重启 Google Chrome</translation>
@@ -282,7 +281,6 @@
 <translation id="8669527147644353129">Google Chrome 浏览器帮助程序</translation>
 <translation id="8679801911857917785">它还能够控制Chrome启动后显示的页面。</translation>
 <translation id="870251953148363156">更新 Google Chrome(&amp;G)</translation>
-<translation id="8704255848199359374">这项服务会使用 Google 搜索所用的拼写检查工具。您在浏览器中输入的文字会被发送给 Google。您随时可在“设置”中更改此行为。</translation>
 <translation id="873133009373065397">Google Chrome 无法确定或设置默认浏览器</translation>
 <translation id="8736674169840206667">您的管理员要求您重新启动 Chrome 以应用一项更新</translation>
 <translation id="8788264404293392165">使用此语言显示 Chrome 操作系统界面</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index 61c6905..5389437 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -265,7 +265,6 @@
 <translation id="8290100596633877290">真糟糕!Google Chrome 當掉了,要立即重新啟動嗎?</translation>
 <translation id="8342675569599923794">這個檔案並不安全,因此遭到 Chrome 封鎖。</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. 保留所有權利。</translation>
-<translation id="8380166467911888159">為修正拼字錯誤,Chrome 會將你在文字欄位輸入的文字傳送給 Google</translation>
 <translation id="840084489713044809">Google Chrome 要求匯出你的密碼。</translation>
 <translation id="8406086379114794905">協助改善 Chrome 的服務品質</translation>
 <translation id="8432724323949790809">建議你立即重新啟動 Google Chrome</translation>
@@ -283,7 +282,6 @@
 <translation id="8669527147644353129">Google Chrome 小幫手</translation>
 <translation id="8679801911857917785">這個擴充功能也會控管 Chrome 啟動時所顯示的網頁。</translation>
 <translation id="870251953148363156">更新 Google Chrome(&amp;G)</translation>
-<translation id="8704255848199359374">這會使用與 Google 搜尋相同的拼字檢查技術。系統會將你在瀏覽器中輸入的文字傳送給 Google。你隨時可以在設定中變更這項行為。</translation>
 <translation id="873133009373065397">Google Chrome 無法偵測或設定預設瀏覽器</translation>
 <translation id="8736674169840206667">你的管理員要求你重新啟動 Chrome,以套用更新</translation>
 <translation id="8788264404293392165">這是 Chrome 作業系統 UI 的顯示語言</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index c455badf..47d411a5 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1626,6 +1626,18 @@
     <message name="IDS_SETTINGS_KERBEROS_ACCOUNTS_REAUTHENTICATION_LABEL" desc="Label of the re-authentication button on Kerberos Accounts Settings page.">
       Sign in
     </message>
+    <message name="IDS_SETTINGS_ADD_KERBEROS_ACCOUNT" desc="In Add Kerberos Accounts dialog, the title of the dialog.">
+      Add Kerberos Account
+    </message>
+    <message name="IDS_SETTINGS_KERBEROS_USERNAME" desc="Title for the input that lets users specify their username for a Kerberos account.">
+      Username
+    </message>
+    <message name="IDS_SETTINGS_KERBEROS_PASSWORD" desc="Title for the input that lets users specify their password for a Kerberos account.">
+      Password
+    </message>
+    <message name="IDS_SETTINGS_KERBEROS_GENERAL_ERROR_MESSAGE" desc="Fallback error message displayed in the Add Kerberos.">
+      Oops! Something went wrong (error code <ph name="ERROR_CODE">$1<ex>123</ex></ph>).
+    </message>
   </if>
 
   <!-- Date/Time Page -->
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index b77f942..4ac83862 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -54,6 +54,8 @@
     "forward_arrow_touch.icon",
     "generic_stop.icon",
     "globe.icon",
+    "hardware_computer.icon",
+    "hardware_smartphone.icon",
     "horizontal_menu.icon",
     "incognito.icon",
     "incognito_profile.icon",
diff --git a/chrome/app/vector_icons/hardware_computer.icon b/chrome/app/vector_icons/hardware_computer.icon
new file mode 100644
index 0000000..d5e15f94
--- /dev/null
+++ b/chrome/app/vector_icons/hardware_computer.icon
@@ -0,0 +1,25 @@
+// 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.
+
+CANVAS_DIMENSIONS, 24,
+MOVE_TO, 20, 18,
+R_CUBIC_TO, 1.1f, 0, 1.99f, -0.9f, 1.99f, -2,
+LINE_TO, 22, 6,
+R_CUBIC_TO, 0, -1.1f, -0.9f, -2, -2, -2,
+H_LINE_TO, 4,
+R_CUBIC_TO, -1.1f, 0, -2, 0.9f, -2, 2,
+R_V_LINE_TO, 10,
+R_CUBIC_TO, 0, 1.1f, 0.9f, 2, 2, 2,
+H_LINE_TO, 0,
+R_V_LINE_TO, 2,
+R_H_LINE_TO, 24,
+R_V_LINE_TO, -2,
+R_H_LINE_TO, -4,
+CLOSE,
+MOVE_TO, 4, 6,
+R_H_LINE_TO, 16,
+R_V_LINE_TO, 10,
+H_LINE_TO, 4,
+V_LINE_TO, 6,
+CLOSE
diff --git a/chrome/app/vector_icons/hardware_smartphone.icon b/chrome/app/vector_icons/hardware_smartphone.icon
new file mode 100644
index 0000000..fbdbf962
--- /dev/null
+++ b/chrome/app/vector_icons/hardware_smartphone.icon
@@ -0,0 +1,21 @@
+// 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.
+
+CANVAS_DIMENSIONS, 24,
+MOVE_TO, 17, 1.01f,
+LINE_TO, 7, 1,
+R_CUBIC_TO, -1.1f, 0, -2, 0.9f, -2, 2,
+R_V_LINE_TO, 18,
+R_CUBIC_TO, 0, 1.1f, 0.9f, 2, 2, 2,
+R_H_LINE_TO, 10,
+R_CUBIC_TO, 1.1f, 0, 2, -0.9f, 2, -2,
+V_LINE_TO, 3,
+R_CUBIC_TO, 0, -1.1f, -0.9f, -1.99f, -2, -1.99f,
+CLOSE,
+MOVE_TO, 17, 19,
+H_LINE_TO, 7,
+V_LINE_TO, 5,
+R_H_LINE_TO, 10,
+R_V_LINE_TO, 14,
+CLOSE
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index a31ebbf7..3fc4c5e 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -834,8 +834,6 @@
     "net/chrome_extensions_network_delegate.h",
     "net/chrome_mojo_proxy_resolver_factory.cc",
     "net/chrome_mojo_proxy_resolver_factory.h",
-    "net/chrome_net_log_helper.cc",
-    "net/chrome_net_log_helper.h",
     "net/chrome_network_delegate.cc",
     "net/chrome_network_delegate.h",
     "net/chrome_report_sender.cc",
@@ -2037,8 +2035,6 @@
     "//device/base",
     "//device/fido",
     "//device/gamepad/public/cpp:switches",
-    "//device/usb/public/cpp",
-    "//device/usb/public/mojom",
     "//device/vr/buildflags",
     "//extensions/buildflags",
     "//google_apis",
@@ -2064,7 +2060,9 @@
     "//services/audio/public/cpp",
     "//services/data_decoder/public/cpp",
     "//services/device/public/cpp:device_features",
+    "//services/device/public/cpp/usb",
     "//services/device/public/mojom",
+    "//services/device/public/mojom:usb",
     "//services/identity:lib",
     "//services/identity/public/cpp",
     "//services/image_annotation:service",
@@ -3510,7 +3508,6 @@
       "//chromeos/strings",
       "//components/services/font:lib",
       "//components/services/font/public/interfaces",
-      "//services/ws:lib",
       "//services/ws/public/cpp/input_devices",
       "//services/ws/public/cpp/input_devices:input_device_controller",
       "//services/ws/public/mojom",
@@ -5095,7 +5092,7 @@
     "//chrome/browser/ui/webui/usb_internals:mojo_bindings_js",
     "//device/bluetooth/public/mojom:deprecated_experimental_interfaces_js",
     "//device/bluetooth/public/mojom:mojom_js",
-    "//device/usb/public/mojom:test_js",
+    "//services/device//public/mojom:usb_test_js",
     "//url/mojom:url_mojom_gurl_js",
     "//url/mojom:url_mojom_origin_js",
   ]
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index eb637d9..c5390e0 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -33,7 +33,6 @@
   "+device/bluetooth",
   "+device/fido",
   "+device/gamepad/public/cpp",
-  "+device/usb/public",
   "+device/vr/buildflags/buildflags.h",
   "+device/vr/public",
   "+extensions/browser",
@@ -93,7 +92,6 @@
   "+services/video_capture/public",
   "+services/viz/privileged",
   "+services/viz/public/interfaces",
-  "+services/ws/common",
   "+services/ws/public",
   "+skia/ext",
   "+third_party/boringssl/src/include",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index a9f0efa..13650c4 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -710,6 +710,24 @@
         {"12 matches", kOmniboxUIMaxAutocompleteMatches12,
          base::size(kOmniboxUIMaxAutocompleteMatches12), nullptr}};
 
+#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || \
+    defined(OS_CHROMEOS)
+const FeatureEntry::FeatureParam kTranslateBubbleUIButton[] = {
+    {language::kTranslateUIBubbleKey, language::kTranslateUIBubbleButtonValue}};
+const FeatureEntry::FeatureParam kTranslateBubbleUITab[] = {
+    {language::kTranslateUIBubbleKey, language::kTranslateUIBubbleTabValue}};
+const FeatureEntry::FeatureParam kTranslateBubbleUIButtonGM2[] = {
+    {language::kTranslateUIBubbleKey,
+     language::kTranslateUIBubbleButtonGM2Value}};
+
+const FeatureEntry::FeatureVariation kTranslateBubbleUIVariations[] = {
+    {"Button", kTranslateBubbleUIButton, base::size(kTranslateBubbleUIButton),
+     nullptr},
+    {"Tab", kTranslateBubbleUITab, base::size(kTranslateBubbleUITab), nullptr},
+    {"Button_GM2", kTranslateBubbleUIButtonGM2,
+     base::size(kTranslateBubbleUIButton), nullptr}};
+#endif  // OS_LINUX || OS_MACOSX || OS_WIN || OS_CHROMEOS
+
 const FeatureEntry::FeatureParam kOmniboxUIVerticalMargin0px[] = {
     {OmniboxFieldTrial::kUIVerticalMarginParam, "0"}};
 const FeatureEntry::FeatureParam kOmniboxUIVerticalMargin2px[] = {
@@ -1299,11 +1317,6 @@
         kOsMac | kOsWin | kOsCrOS | kOsAndroid,
         SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedVideoDecode),
     },
-#if defined(OS_WIN)
-    {"enable-hdr", flag_descriptions::kEnableHDRName,
-     flag_descriptions::kEnableHDRDescription, kOsWin,
-     FEATURE_VALUE_TYPE(display::features::kHighDynamicRange)},
-#endif  // OS_WIN
 #if defined(OS_CHROMEOS)
     {
         "ash-debug-shortcuts",
@@ -1467,6 +1480,16 @@
                                     kTranslateForceTriggerOnEnglishVariations,
                                     "OverrideTranslateTriggerInIndia")},
 #endif  // OS_ANDROID
+
+#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || \
+    defined(OS_CHROMEOS)
+    {"translate-ui-bubble-options", flag_descriptions::kTranslateBubbleUIName,
+     flag_descriptions::kTranslateBubbleUIDescription, kOsDesktop,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(language::kUseButtonTranslateBubbleUI,
+                                    kTranslateBubbleUIVariations,
+                                    "UseButtonTranslateBubbleUI")},
+#endif  // OS_LINUX || OS_MACOSX || OS_WIN || OS_CHROMEOS
+
 #if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) && !defined(OS_CHROMEOS)
     {"enable-native-notifications",
      flag_descriptions::kNotificationsNativeFlagName,
@@ -1652,10 +1675,6 @@
     {"enable-system-webapps", flag_descriptions::kEnableSystemWebAppsName,
      flag_descriptions::kEnableSystemWebAppsDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kSystemWebApps)},
-    {"enable-desktop-pwas-custom-tab-ui",
-     flag_descriptions::kDesktopPWAsCustomTabUIName,
-     flag_descriptions::kDesktopPWAsCustomTabUIDescription, kOsDesktop,
-     FEATURE_VALUE_TYPE(features::kDesktopPWAsCustomTabUI)},
     {"enable-desktop-pwas-stay-in-window",
      flag_descriptions::kDesktopPWAsStayInWindowName,
      flag_descriptions::kDesktopPWAsStayInWindowDescription, kOsDesktop,
@@ -3086,6 +3105,11 @@
      FEATURE_VALUE_TYPE(
          features::kAllowSignedHTTPExchangeCertsWithoutExtension)},
 
+    {"enable-sxg-subresource-prefetching",
+     flag_descriptions::kEnableSignedExchangeSubresourcePrefetchName,
+     flag_descriptions::kEnableSignedExchangeSubresourcePrefetchDescription,
+     kOsAll, FEATURE_VALUE_TYPE(features::kSignedExchangeSubresourcePrefetch)},
+
     {"enable-autofill-account-wallet-storage",
      flag_descriptions::kEnableAutofillAccountWalletStorageName,
      flag_descriptions::kEnableAutofillAccountWalletStorageDescription,
@@ -3491,13 +3515,6 @@
      flag_descriptions::kWebrtcHwVP9EncodingDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(features::kWebRtcHWVP9Encoding)},
 
-#if defined(OS_CHROMEOS)
-    {"user-activity-prediction-ml-service",
-     flag_descriptions::kUserActivityPredictionMlServiceName,
-     flag_descriptions::kUserActivityPredictionMlServiceDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::features::kUserActivityPredictionMlService)},
-#endif  // defined(OS_CHROMEOS)
-
 #if defined(OS_ANDROID)
     {"manual-password-generation-android",
      flag_descriptions::kManualPasswordGenerationAndroidName,
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android.cc b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
index 819e6578..27bf4f5 100644
--- a/chrome/browser/android/autofill_assistant/ui_controller_android.cc
+++ b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
@@ -671,6 +671,8 @@
               Java_AssistantFormInput_createCounter(
                   env,
                   base::android::ConvertUTF8ToJavaString(env, counter.label()),
+                  base::android::ConvertUTF8ToJavaString(env,
+                                                         counter.subtext()),
                   counter.initial_value(), counter.min_value(),
                   counter.max_value()));
         }
@@ -681,6 +683,10 @@
                 env, i,
                 base::android::ConvertUTF8ToJavaString(env,
                                                        counter_input.label()),
+                base::android::ConvertUTF8ToJavaString(
+                    env, counter_input.expand_text()),
+                base::android::ConvertUTF8ToJavaString(
+                    env, counter_input.minimize_text()),
                 jcounters, counter_input.minimized_count(),
                 form_delegate_.GetJavaObject()));
         break;
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 769aa90..838db82 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -181,6 +181,7 @@
     &kUsageStatsFeature,
     &kVideoPersistence,
     &kVrBrowsingFeedback,
+    &kOfferWipeDataOnSignout,
     &network::features::kNetworkService,
     &payments::features::kReturnGooglePayInBasicCard,
     &payments::features::kWebPaymentsExperimentalFeatures,
@@ -550,6 +551,9 @@
 const base::Feature kVrBrowsingFeedback{"VrBrowsingFeedback",
                                         base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kOfferWipeDataOnSignout{"OfferWipeDataOnSignout",
+                                            base::FEATURE_ENABLED_BY_DEFAULT};
+
 static jboolean JNI_ChromeFeatureList_IsInitialized(JNIEnv* env) {
   return !!base::FeatureList::GetInstance();
 }
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index 005424ef..f50f97d1 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -117,6 +117,7 @@
 extern const base::Feature kUserMediaScreenCapturing;
 extern const base::Feature kVideoPersistence;
 extern const base::Feature kVrBrowsingFeedback;
+extern const base::Feature kOfferWipeDataOnSignout;
 
 }  // namespace android
 }  // namespace chrome
diff --git a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
index 98a3edad..6c1ace0c 100644
--- a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
+++ b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
@@ -16,7 +16,6 @@
 #include "content/public/browser/android/compositor.h"
 #include "jni/TabListSceneLayer_jni.h"
 #include "ui/android/resources/resource_manager_impl.h"
-#include "ui/gfx/android/java_bitmap.h"
 
 using base::android::JavaParamRef;
 using base::android::JavaRef;
@@ -201,30 +200,6 @@
   content_obscures_self_ |= content.Contains(self);
 }
 
-void TabListSceneLayer::PutCreateGroupTextButtonLayer(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jobj,
-    jint text_button_resource_id,
-    jfloat x,
-    jfloat y,
-    jboolean is_visible) {
-  if (!tab_group_layer_) {
-    tab_group_layer_ = cc::UIResourceLayer::Create();
-    tab_group_layer_->SetIsDrawable(true);
-    tab_group_layer_->SetUIResourceId(resource_manager_->GetUIResourceId(
-        ui::ANDROID_RESOURCE_TYPE_DYNAMIC_BITMAP, text_button_resource_id));
-    gfx::Size size = resource_manager_
-                         ->GetResource(ui::ANDROID_RESOURCE_TYPE_DYNAMIC_BITMAP,
-                                       text_button_resource_id)
-                         ->size();
-    tab_group_layer_->SetBounds(size);
-    own_tree_->AddChild(tab_group_layer_);
-  }
-  DCHECK(tab_group_layer_);
-  tab_group_layer_->SetHideLayerAndSubtree(!is_visible);
-  tab_group_layer_->SetPosition(gfx::PointF(x, y));
-}
-
 void TabListSceneLayer::OnDetach() {
   SceneLayer::OnDetach();
   for (auto tab : tab_map_)
diff --git a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h
index bdd48c4443..153eeb9 100644
--- a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h
+++ b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h
@@ -12,7 +12,6 @@
 
 #include "base/macros.h"
 #include "cc/layers/layer.h"
-#include "cc/layers/ui_resource_layer.h"
 #include "chrome/browser/android/compositor/layer/layer.h"
 #include "chrome/browser/android/compositor/scene_layer/scene_layer.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -108,14 +107,6 @@
                    jfloat side_border_scale,
                    jboolean inset_border);
 
-  void PutCreateGroupTextButtonLayer(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jobj,
-      jint text_button_resource_id,
-      jfloat x,
-      jfloat y,
-      jboolean is_visible);
-
   void OnDetach() override;
   bool ShouldShowBackground() override;
   SkColor GetBackgroundColor() override;
@@ -134,8 +125,6 @@
   TabContentManager* tab_content_manager_;
   SkColor background_color_;
 
-  scoped_refptr<cc::UIResourceLayer> tab_group_layer_;
-
   scoped_refptr<cc::Layer> own_tree_;
 
   DISALLOW_COPY_AND_ASSIGN(TabListSceneLayer);
diff --git a/chrome/browser/android/download/available_offline_content_provider.cc b/chrome/browser/android/download/available_offline_content_provider.cc
index 86accccd..1db328a 100644
--- a/chrome/browser/android/download/available_offline_content_provider.cc
+++ b/chrome/browser/android/download/available_offline_content_provider.cc
@@ -22,6 +22,7 @@
 #include "components/offline_items_collection/core/offline_content_provider.h"
 #include "components/offline_items_collection/core/offline_item.h"
 #include "components/offline_items_collection/core/offline_item_state.h"
+#include "components/offline_pages/core/offline_page_feature.h"
 #include "components/prefs/pref_service.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "ui/base/l10n/time_format.h"
@@ -219,7 +220,8 @@
 AvailableOfflineContentProvider::~AvailableOfflineContentProvider() = default;
 
 void AvailableOfflineContentProvider::List(ListCallback callback) {
-  if (!base::FeatureList::IsEnabled(features::kNewNetErrorPageUI)) {
+  if (!offline_pages::IsOfflinePagesEnabled() ||
+      !base::FeatureList::IsEnabled(features::kNewNetErrorPageUI)) {
     std::move(callback).Run(true, {});
     return;
   }
diff --git a/chrome/browser/android/download/available_offline_content_provider_unittest.cc b/chrome/browser/android/download/available_offline_content_provider_unittest.cc
index 983e017..4dcd8ec 100644
--- a/chrome/browser/android/download/available_offline_content_provider_unittest.cc
+++ b/chrome/browser/android/download/available_offline_content_provider_unittest.cc
@@ -20,6 +20,7 @@
 #include "components/offline_items_collection/core/offline_item.h"
 #include "components/offline_items_collection/core/offline_item_state.h"
 #include "components/offline_items_collection/core/test_support/mock_offline_content_provider.h"
+#include "components/offline_pages/core/offline_page_feature.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -179,7 +180,12 @@
   EXPECT_TRUE(list_visible_by_prefs);
 }
 
-TEST_F(AvailableOfflineContentTest, FourInterestingItems) {
+#if defined(DISABLE_OFFLINE_PAGES_TOUCHLESS)
+#define MAYBE_FourInterestingItems DISABLED_FourInterestingItems
+#else
+#define MAYBE_FourInterestingItems FourInterestingItems
+#endif
+TEST_F(AvailableOfflineContentTest, MAYBE_FourInterestingItems) {
   // We need at least 4 interesting items for anything to show up at all.
   content_provider_.SetItems({UninterestingImageItem(), VideoItem(),
                               SuggestedOfflinePageItem(), AudioItem(),
@@ -236,7 +242,12 @@
   EXPECT_TRUE(list_visible_by_prefs);
 }
 
-TEST_F(AvailableOfflineContentTest, ListVisibilityChanges) {
+#if defined(DISABLE_OFFLINE_PAGES_TOUCHLESS)
+#define MAYBE_ListVisibilityChanges DISABLED_ListVisibilityChanges
+#else
+#define MAYBE_ListVisibilityChanges ListVisibilityChanges
+#endif
+TEST_F(AvailableOfflineContentTest, MAYBE_ListVisibilityChanges) {
   // We need at least 4 interesting items for anything to show up at all.
   content_provider_.SetItems({UninterestingImageItem(), VideoItem(),
                               SuggestedOfflinePageItem(), AudioItem(),
diff --git a/chrome/browser/android/feature_utilities.cc b/chrome/browser/android/feature_utilities.cc
index b9abd17c..126b17c 100644
--- a/chrome/browser/android/feature_utilities.cc
+++ b/chrome/browser/android/feature_utilities.cc
@@ -37,6 +37,11 @@
   return Java_FeatureUtilities_isDownloadAutoResumptionEnabledInNative(env);
 }
 
+bool IsNoTouchModeEnabled() {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  return Java_FeatureUtilities_isNoTouchModeEnabled(env);
+}
+
 } // namespace android
 } // namespace chrome
 
diff --git a/chrome/browser/android/feature_utilities.h b/chrome/browser/android/feature_utilities.h
index 508ea0a..f3f20bcf 100644
--- a/chrome/browser/android/feature_utilities.h
+++ b/chrome/browser/android/feature_utilities.h
@@ -22,6 +22,8 @@
 
 bool IsDownloadAutoResumptionEnabledInNative();
 
+bool IsNoTouchModeEnabled();
+
 } // namespace android
 } // namespace chrome
 
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index 0f4d4b11..b9acc12 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -1713,7 +1713,7 @@
 
   // Handoff is not allowed from an incognito profile. To err on the safe side,
   // also disallow Handoff from a guest profile.
-  if (profile->GetProfileType() != Profile::REGULAR_PROFILE)
+  if (!profile->IsRegularProfile())
     return GURL();
 
   if (!webContents)
diff --git a/chrome/browser/apps/app_service/arc_apps.cc b/chrome/browser/apps/app_service/arc_apps.cc
index 392abcf..71c46822 100644
--- a/chrome/browser/apps/app_service/arc_apps.cc
+++ b/chrome/browser/apps/app_service/arc_apps.cc
@@ -281,6 +281,9 @@
     case apps::mojom::LaunchSource::kFromKioskNextHome:
       uit = arc::UserInteractionType::APP_STARTED_FROM_KIOSK_NEXT_HOME;
       break;
+    case apps::mojom::LaunchSource::kFromParentalControls:
+      uit = arc::UserInteractionType::APP_STARTED_FROM_SETTINGS;
+      break;
   }
 
   arc::LaunchApp(profile_, app_id, event_flags, uit, display_id);
diff --git a/chrome/browser/apps/app_service/built_in_chromeos_apps.cc b/chrome/browser/apps/app_service/built_in_chromeos_apps.cc
index 25d8c3e3..03924e5f 100644
--- a/chrome/browser/apps/app_service/built_in_chromeos_apps.cc
+++ b/chrome/browser/apps/app_service/built_in_chromeos_apps.cc
@@ -143,6 +143,7 @@
   switch (launch_source) {
     case apps::mojom::LaunchSource::kUnknown:
     case apps::mojom::LaunchSource::kFromKioskNextHome:
+    case apps::mojom::LaunchSource::kFromParentalControls:
       break;
     case apps::mojom::LaunchSource::kFromAppListGrid:
     case apps::mojom::LaunchSource::kFromAppListGridContextMenu:
diff --git a/chrome/browser/apps/app_service/extension_apps.cc b/chrome/browser/apps/app_service/extension_apps.cc
index 7451a66..4e4b037 100644
--- a/chrome/browser/apps/app_service/extension_apps.cc
+++ b/chrome/browser/apps/app_service/extension_apps.cc
@@ -167,6 +167,7 @@
   switch (launch_source) {
     case apps::mojom::LaunchSource::kUnknown:
     case apps::mojom::LaunchSource::kFromKioskNextHome:
+    case apps::mojom::LaunchSource::kFromParentalControls:
       break;
     case apps::mojom::LaunchSource::kFromAppListGrid:
     case apps::mojom::LaunchSource::kFromAppListGridContextMenu:
diff --git a/chrome/browser/apps/app_service/launch_util.cc b/chrome/browser/apps/app_service/launch_util.cc
index 7f92ffe..49ac382c 100644
--- a/chrome/browser/apps/app_service/launch_util.cc
+++ b/chrome/browser/apps/app_service/launch_util.cc
@@ -14,6 +14,7 @@
   switch (launch_source) {
     case apps::mojom::LaunchSource::kUnknown:
     case apps::mojom::LaunchSource::kFromKioskNextHome:
+    case apps::mojom::LaunchSource::kFromParentalControls:
       return ash::LAUNCH_FROM_UNKNOWN;
     case apps::mojom::LaunchSource::kFromAppListGrid:
     case apps::mojom::LaunchSource::kFromAppListGridContextMenu:
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
index 4994979..d6664fdf 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -401,8 +401,7 @@
     active_tab = active_browser->tab_strip_model()->GetActiveWebContents();
   for (auto* browser : *BrowserList::GetInstance()) {
     // Only look at same profile (and anonymity level).
-    if (browser->profile()->IsSameProfile(profile_) &&
-        browser->profile()->GetProfileType() == profile_->GetProfileType()) {
+    if (browser->profile()->IsSameProfileAndType(profile_)) {
       for (int i = 0; i < browser->tab_strip_model()->count(); ++i) {
         content::WebContents* web_contents =
             browser->tab_strip_model()->GetWebContentsAt(i);
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 1598c0f..41694c1 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -59,7 +59,6 @@
 #include "chrome/browser/metrics/chrome_metrics_services_manager_client.h"
 #include "chrome/browser/metrics/metrics_reporting_state.h"
 #include "chrome/browser/metrics/thread_watcher.h"
-#include "chrome/browser/net/chrome_net_log_helper.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/notifications/notification_platform_bridge.h"
 #include "chrome/browser/notifications/system_notification_helper.h"
@@ -1178,7 +1177,9 @@
       log_file = user_data_dir.AppendASCII("netlog.json");
     }
     net_log_->StartWritingToFile(
-        log_file, GetNetCaptureModeFromCommandLine(command_line),
+        log_file,
+        net::GetNetCaptureModeFromCommandLine(
+            command_line, network::switches::kNetLogCaptureMode),
         command_line.GetCommandLineString(), chrome::GetChannelName());
   }
 
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index dde836a..c51dad93c 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -187,11 +187,6 @@
 
       <!-- Chrome OS Supervised users. -->
       <if expr="chromeos">
-        <include name="IDR_SUPERVISION_ONBOARDING_CONTROLLER_MOJOM_HTML"
-          file="${root_gen_dir}/chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.html"
-          use_base_dir="false"
-          type="BINDATA"
-          compress="gzip" />
         <include name="IDR_SUPERVISION_ONBOARDING_CONTROLLER_MOJOM_LITE_JS"
           file="${root_gen_dir}/chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom-lite.js"
           use_base_dir="false"
@@ -448,11 +443,11 @@
       <include name="IDR_SIGNIN_EMAIL_CONFIRMATION_JS" file="resources\signin\signin_email_confirmation\signin_email_confirmation.js" type="BINDATA" />
       <include name="IDR_SIGNIN_ERROR_HTML" file="resources\signin\signin_error\signin_error.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       <include name="IDR_SIGNIN_ERROR_JS" file="resources\signin\signin_error\signin_error.js" type="BINDATA" />
-      <include name="IDR_USB_DEVICE_ENUMERATION_OPTIONS_MOJOM_LITE_JS" file="${root_gen_dir}\device\usb\public\mojom\device_enumeration_options.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
-      <include name="IDR_USB_DEVICE_MANAGER_CLIENT_MOJOM_LITE_JS" file="${root_gen_dir}\device\usb\public\mojom\device_manager_client.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
-      <include name="IDR_USB_DEVICE_MANAGER_MOJOM_LITE_JS" file="${root_gen_dir}\device\usb\public\mojom\device_manager.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
-      <include name="IDR_USB_DEVICE_MANAGER_TEST_MOJOM_LITE_JS" file="${root_gen_dir}\device\usb\public\mojom\device_manager_test.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
-      <include name="IDR_USB_DEVICE_MOJOM_LITE_JS" file="${root_gen_dir}\device\usb\public\mojom\device.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+      <include name="IDR_USB_ENUMERATION_OPTIONS_MOJOM_LITE_JS" file="${root_gen_dir}\services\device\public\mojom\usb_enumeration_options.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+      <include name="IDR_USB_DEVICE_MANAGER_CLIENT_MOJOM_LITE_JS" file="${root_gen_dir}\services\device\public\mojom\usb_manager_client.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+      <include name="IDR_USB_DEVICE_MANAGER_MOJOM_LITE_JS" file="${root_gen_dir}\services\device\public\mojom\usb_manager.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
+      <include name="IDR_USB_DEVICE_MANAGER_TEST_MOJOM_LITE_JS" file="${root_gen_dir}\services\device\public\mojom\usb_manager_test.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
+      <include name="IDR_USB_DEVICE_MOJOM_LITE_JS" file="${root_gen_dir}\services\device\public\mojom\usb_device.mojom-lite.js" use_base_dir="false" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
       <include name="IDR_USB_INTERNALS_CSS" file="resources\usb_internals\usb_internals.css" type="BINDATA" compress="gzip" />
       <include name="IDR_USB_INTERNALS_DESCRIPTOR_PANEL_JS" file="resources\usb_internals\descriptor_panel.js" type="BINDATA" compress="gzip" />
       <include name="IDR_USB_INTERNALS_DEVICES_PAGE_JS" file="resources\usb_internals\devices_page.js" type="BINDATA" compress="gzip" />
@@ -713,7 +708,6 @@
         <include name="IDR_TAB_RANKER_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="resource_coordinator\tab_ranker\example_preprocessor_config.pb" type="BINDATA" />
       </if>
       <if expr="chromeos">
-        <include name="IDR_SMART_DIM_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="chromeos\power\ml\smart_dim\example_preprocessor_config.pb" type="BINDATA" />
         <include name="IDR_SMART_DIM_LITE_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="chromeos\power\ml\smart_dim\lite_example_preprocessor_config.pb" type="BINDATA" />
       </if>
       <if expr="chromeos">
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 157e01c..db39e7ea 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -950,7 +950,8 @@
 #if defined(OS_ANDROID)
     // For now we're considering offline pages as cache, so if we're removing
     // cache we should remove offline pages as well.
-    if ((remove_mask & content::BrowsingDataRemover::DATA_TYPE_CACHE)) {
+    if ((remove_mask & content::BrowsingDataRemover::DATA_TYPE_CACHE) &&
+        offline_pages::IsOfflinePagesEnabled()) {
       offline_pages::OfflinePageModelFactory::GetForBrowserContext(profile_)
           ->DeleteCachedPagesByURLPredicate(
               filter,
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 5f11e8a..97c6866 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5223,7 +5223,8 @@
     LoginAuthRequiredCallback auth_required_callback) {
   return CreateLoginPrompt(
       auth_info, web_contents, request_id, is_request_for_main_frame, url,
-      std::move(response_headers), std::move(auth_required_callback));
+      std::move(response_headers), LoginHandler::PRE_COMMIT,
+      std::move(auth_required_callback));
 }
 
 bool ChromeContentBrowserClient::HandleExternalProtocol(
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 6d565eeeb0..4ab8146f 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -210,8 +210,6 @@
     "//crypto",
     "//dbus",
     "//device/bluetooth",
-    "//device/usb/public/cpp",
-    "//device/usb/public/mojom",
     "//extensions/browser",
     "//extensions/browser/kiosk",
     "//extensions/common",
@@ -231,14 +229,15 @@
     "//remoting/host/it2me:chrome_os_host",
     "//services/audio/public/cpp",
     "//services/data_decoder/public/cpp",
+    "//services/device/public/cpp/usb",
     "//services/device/public/mojom",
+    "//services/device/public/mojom:usb",
     "//services/identity/public/cpp",
     "//services/identity/public/mojom",
     "//services/metrics/public/cpp:ukm_builders",
     "//services/preferences/public/mojom",
     "//services/resource_coordinator/public/cpp:resource_coordinator_cpp",
     "//services/service_manager/public/cpp",
-    "//services/ws/public/cpp",
     "//services/ws/public/cpp/input_devices",
     "//skia",
     "//storage/browser",
@@ -1081,10 +1080,14 @@
     "kiosk_next_home/app_controller_service.h",
     "kiosk_next_home/app_controller_service_factory.cc",
     "kiosk_next_home/app_controller_service_factory.h",
+    "kiosk_next_home/identity_controller_impl.cc",
+    "kiosk_next_home/identity_controller_impl.h",
     "kiosk_next_home/intent_config_helper.cc",
     "kiosk_next_home/intent_config_helper.h",
     "kiosk_next_home/kiosk_next_home_interface_broker_impl.cc",
     "kiosk_next_home/kiosk_next_home_interface_broker_impl.h",
+    "kiosk_next_home/metrics_helper.cc",
+    "kiosk_next_home/metrics_helper.h",
     "language_preferences.cc",
     "language_preferences.h",
     "launcher_search_provider/error_reporter.cc",
@@ -1710,8 +1713,8 @@
     "policy/user_network_configuration_updater.h",
     "policy/user_network_configuration_updater_factory.cc",
     "policy/user_network_configuration_updater_factory.h",
-    "policy/user_policy_manager_factory_chromeos.cc",
-    "policy/user_policy_manager_factory_chromeos.h",
+    "policy/user_policy_manager_builder_chromeos.cc",
+    "policy/user_policy_manager_builder_chromeos.h",
     "policy/value_validation/onc_device_policy_value_validator.cc",
     "policy/value_validation/onc_device_policy_value_validator.h",
     "policy/value_validation/onc_policy_value_validator_base.h",
@@ -2193,8 +2196,10 @@
     "login/screens/mock_welcome_screen.h",
     "login/screens/recommend_apps/fake_recommend_apps_fetcher_delegate.cc",
     "login/screens/recommend_apps/fake_recommend_apps_fetcher_delegate.h",
-    "login/test/help_app_test_helper.cc",
-    "login/test/help_app_test_helper.h",
+    "login/test/dialog_window_waiter.cc",
+    "login/test/dialog_window_waiter.h",
+    "login/test/scoped_help_app_for_test.cc",
+    "login/test/scoped_help_app_for_test.h",
     "login/test/test_condition_waiter.h",
     "login/test/test_predicate_waiter.cc",
     "login/test/test_predicate_waiter.h",
@@ -2429,6 +2434,7 @@
     "input_method/input_method_manager_impl_unittest.cc",
     "input_method/input_method_persistence_unittest.cc",
     "kiosk_next_home/app_controller_service_unittest.cc",
+    "kiosk_next_home/identity_controller_impl_unittest.cc",
     "kiosk_next_home/intent_config_helper_unittest.cc",
     "locale_change_guard_unittest.cc",
     "lock_screen_apps/app_manager_impl_unittest.cc",
diff --git a/chrome/browser/chromeos/app_mode/arc/DEPS b/chrome/browser/chromeos/app_mode/arc/DEPS
deleted file mode 100644
index 3386e05..0000000
--- a/chrome/browser/chromeos/app_mode/arc/DEPS
+++ /dev/null
@@ -1,7 +0,0 @@
-specific_include_rules = {
-  # TODO(mash): Find another way to observe for ARC++ window creation.
-  # https://crbug.com/887156
-  "arc_kiosk_app_launcher\.cc": [
-    "+ash/shell.h",
-  ],
-}
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_launcher.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_launcher.cc
index 81399f0..9512726 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_launcher.cc
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_launcher.cc
@@ -9,7 +9,6 @@
 
 #include "ash/public/cpp/window_properties.h"
 #include "ash/public/interfaces/window_pin_type.mojom.h"
-#include "ash/shell.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h"
 #include "components/arc/arc_util.h"
@@ -26,10 +25,7 @@
                                          Delegate* delegate)
     : app_id_(app_id), prefs_(prefs), delegate_(delegate) {
   prefs_->AddObserver(this);
-  // TODO(mash): Find another way to observe for ARC++ window creation.
-  // https://crbug.com/887156
-  if (!features::IsMultiProcessMash())
-    ash::Shell::Get()->aura_env()->AddObserver(this);
+  aura::Env::GetInstance()->AddObserver(this);
   // Launching the app by app id in landscape mode and in non-touch mode.
   arc::LaunchApp(context, app_id_, ui::EF_NONE,
                  arc::UserInteractionType::NOT_USER_INITIATED);
@@ -95,8 +91,7 @@
 }
 
 void ArcKioskAppLauncher::StopObserving() {
-  if (!features::IsMultiProcessMash())
-    ash::Shell::Get()->aura_env()->RemoveObserver(this);
+  aura::Env::GetInstance()->RemoveObserver(this);
   for (auto* window : windows_)
     window->RemoveObserver(this);
   windows_.clear();
diff --git a/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.cc b/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.cc
index a428f5c..347406d 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.cc
+++ b/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.cc
@@ -68,4 +68,9 @@
   arc_play_store_enabled_ = enabled;
 }
 
+void FakeVoiceInteractionController::NotifyLockedFullScreenStateChanged(
+    bool enabled) {
+  locked_full_screen_enabled_ = enabled;
+}
+
 }  // namespace arc
diff --git a/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.h b/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.h
index 0658fb83..1274d37 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.h
+++ b/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.h
@@ -32,6 +32,7 @@
   void NotifyLocaleChanged(const std::string& locale) override;
   void NotifyLaunchWithMicOpen(bool launch_with_mic_open) override;
   void NotifyArcPlayStoreEnabledChanged(bool enabled) override;
+  void NotifyLockedFullScreenStateChanged(bool enabled) override;
   void AddObserver(ash::mojom::VoiceInteractionObserverPtr observer) override {}
 
   ash::mojom::VoiceInteractionState voice_interaction_state() const {
@@ -58,6 +59,9 @@
   const std::string& locale() const { return locale_; }
   bool launch_with_mic_open() const { return launch_with_mic_open_; }
   bool arc_play_store_enabled() const { return arc_play_store_enabled_; }
+  bool locked_full_screen_enabled() const {
+    return locked_full_screen_enabled_;
+  }
 
  private:
   ash::mojom::VoiceInteractionState voice_interaction_state_ =
@@ -74,6 +78,7 @@
       ash::mojom::AssistantAllowedState::DISALLOWED_BY_INCOGNITO;
   bool launch_with_mic_open_ = false;
   bool arc_play_store_enabled_ = false;
+  bool locked_full_screen_enabled_ = false;
 
   mojo::Binding<ash::mojom::VoiceInteractionController> binding_;
 
diff --git a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.cc b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.cc
index 396d8d2..a3c901e 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.cc
+++ b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.cc
@@ -83,6 +83,11 @@
     observer.OnStateChanged(state);
 }
 
+void VoiceInteractionControllerClient::NotifyLockedFullScreenStateChanged(
+    bool enabled) {
+  voice_interaction_controller_->NotifyLockedFullScreenStateChanged(enabled);
+}
+
 void VoiceInteractionControllerClient::SetControllerForTesting(
     ash::mojom::VoiceInteractionControllerPtr controller) {
   voice_interaction_controller_ = std::move(controller);
diff --git a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h
index ac45dcd..ee50a73 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h
+++ b/chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h
@@ -37,6 +37,8 @@
   // Notify the controller about state changes.
   void NotifyStatusChanged(ash::mojom::VoiceInteractionState state);
 
+  void NotifyLockedFullScreenStateChanged(bool enabled);
+
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
diff --git a/chrome/browser/chromeos/child_accounts/child_policy_observer.cc b/chrome/browser/chromeos/child_accounts/child_policy_observer.cc
index dad6ff15..065dec3 100644
--- a/chrome/browser/chromeos/child_accounts/child_policy_observer.cc
+++ b/chrome/browser/chromeos/child_accounts/child_policy_observer.cc
@@ -6,7 +6,6 @@
 
 #include "base/timer/timer.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/policy/core/common/cloud/cloud_policy_core.h"
 
@@ -66,8 +65,7 @@
 policy::UserCloudPolicyManagerChromeOS*
 ChildPolicyObserver::GetUserCloudPolicyManager() {
   policy::UserCloudPolicyManagerChromeOS* user_cloud_policy_manager =
-      policy::UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile_);
+      profile_->GetUserCloudPolicyManagerChromeOS();
   DCHECK(user_cloud_policy_manager);
   return user_cloud_policy_manager;
 }
diff --git a/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.cc b/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.cc
index ec69b96e..13625a4 100644
--- a/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.cc
+++ b/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/chromeos/policy/status_collector/child_status_collector.h"
 #include "chrome/browser/chromeos/policy/status_uploader.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
@@ -36,18 +35,17 @@
 ConsumerStatusReportingService::ConsumerStatusReportingService(
     content::BrowserContext* context)
     : context_(context) {
+  Profile* profile = Profile::FromBrowserContext(context_);
   // If child user is registered with DMServer and has User Policy applied, it
   // should upload device status to the server.
-  user_cloud_policy_manager_ =
-      policy::UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          Profile::FromBrowserContext(context_));
+  user_cloud_policy_manager_ = profile->GetUserCloudPolicyManagerChromeOS();
   if (!user_cloud_policy_manager_) {
     LOG(WARNING) << "Child user is not managed by User Policy - status reports "
                     "cannot be uploaded to the server. ";
     return;
   }
 
-  PrefService* pref_service = Profile::FromBrowserContext(context_)->GetPrefs();
+  PrefService* pref_service = profile->GetPrefs();
   DCHECK(pref_service->GetInitializationStatus() !=
          PrefService::INITIALIZATION_STATUS_WAITING);
 
diff --git a/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service_factory.cc b/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service_factory.cc
index 3dbec66..f7136972 100644
--- a/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service_factory.cc
+++ b/chrome/browser/chromeos/child_accounts/consumer_status_reporting_service_factory.cc
@@ -6,7 +6,6 @@
 
 #include "base/macros.h"
 #include "chrome/browser/chromeos/child_accounts/consumer_status_reporting_service.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
 namespace chromeos {
@@ -30,7 +29,6 @@
     : BrowserContextKeyedServiceFactory(
           "ConsumerStatusReportingServiceFactory",
           BrowserContextDependencyManager::GetInstance()) {
-  DependsOn(policy::UserPolicyManagerFactoryChromeOS::GetInstance());
 }
 
 ConsumerStatusReportingServiceFactory::
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index f9c4de5..7bcc8a8 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -52,11 +52,11 @@
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/common/service_manager_connection.h"
 #include "dbus/message.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
 #include "extensions/browser/extension_registry.h"
 #include "net/base/escape.h"
 #include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 #include "services/network/public/cpp/network_connection_tracker.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "storage/browser/fileapi/external_mount_points.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h
index 18806a4..9595676 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.h
+++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -24,7 +24,7 @@
 #include "chromeos/dbus/concierge/service.pb.h"
 #include "chromeos/dbus/concierge_client.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 
 class Profile;
 
diff --git a/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc b/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc
index efbbc59..b0ab3f54 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager_unittest.cc
@@ -20,7 +20,7 @@
 #include "components/account_id/account_id.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
 #include "storage/browser/fileapi/external_mount_points.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_share_path.cc b/chrome/browser/chromeos/crostini/crostini_share_path.cc
index e0000b8..b612648 100644
--- a/chrome/browser/chromeos/crostini/crostini_share_path.cc
+++ b/chrome/browser/chromeos/crostini/crostini_share_path.cc
@@ -602,14 +602,12 @@
     return;
   }
   base::PostTaskWithTraits(
-      FROM_HERE, {content::BrowserThread::IO},
-      base::BindOnce(&CrostiniSharePath::CheckIfPathDeletedOnIOThread,
+      FROM_HERE, {base::MayBlock()},
+      base::BindOnce(&CrostiniSharePath::CheckIfPathDeleted,
                      base::Unretained(this), path));
 }
 
-void CrostiniSharePath::CheckIfPathDeletedOnIOThread(
-    const base::FilePath& path) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+void CrostiniSharePath::CheckIfPathDeleted(const base::FilePath& path) {
   if (base::PathExists(path)) {
     return;
   }
diff --git a/chrome/browser/chromeos/crostini/crostini_share_path.h b/chrome/browser/chromeos/crostini/crostini_share_path.h
index 63cad9d..db9c45a0 100644
--- a/chrome/browser/chromeos/crostini/crostini_share_path.h
+++ b/chrome/browser/chromeos/crostini/crostini_share_path.h
@@ -155,8 +155,8 @@
   // Callback for FilePathWatcher.
   void OnFileChanged(const base::FilePath& path, bool error);
 
-  // Runs on IO Thread to check if a path is deleted.
-  void CheckIfPathDeletedOnIOThread(const base::FilePath& path);
+  // Blocking function to check if a path is deleted.
+  void CheckIfPathDeleted(const base::FilePath& path);
 
   // Returns info for specified path or nullptr if not found.
   SharedPathInfo* FindSharedPathInfo(const base::FilePath& path);
diff --git a/chrome/browser/chromeos/cryptauth/client_app_metadata_provider_service_unittest.cc b/chrome/browser/chromeos/cryptauth/client_app_metadata_provider_service_unittest.cc
index 87155843..55edc4ad 100644
--- a/chrome/browser/chromeos/cryptauth/client_app_metadata_provider_service_unittest.cc
+++ b/chrome/browser/chromeos/cryptauth/client_app_metadata_provider_service_unittest.cc
@@ -4,13 +4,6 @@
 
 #include "chrome/browser/chromeos/cryptauth/client_app_metadata_provider_service.h"
 
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/test/scoped_task_environment.h"
-#include "chromeos/network/network_state_handler.h"
-#include "chromeos/network/network_state_test_helper.h"
-#include "chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.h"
-#include "chromeos/services/device_sync/persistent_enrollment_scheduler.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
index d2a367a..5df83ae 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
@@ -958,12 +958,6 @@
   }
 }
 
-std::unique_ptr<base::ListValue> MakeBlankReturnValue() {
-  auto list_value = std::make_unique<base::ListValue>();
-  list_value->AppendString("");
-  return list_value;
-}
-
 }  // namespace
 
 FileManagerPrivateInternalGetEntryPropertiesFunction::
@@ -1776,16 +1770,14 @@
   if (!file_system) {
     // |file_system| is NULL if Drive is disabled or not mounted.
     // Intentionally returns a blank.
-    return RespondNow(ErrorWithArguments(MakeBlankReturnValue(),
-                                         "Drive is disabled or not mounted."));
+    return RespondNow(Error("Drive is disabled or not mounted."));
   }
 
   const base::FilePath path = file_manager::util::GetLocalPathFromURL(
       render_frame_host(), chrome_details.GetProfile(), url);
   if (!drive::util::IsUnderDriveMountPoint(path)) {
     // Intentionally returns a blank.
-    return RespondNow(ErrorWithArguments(MakeBlankReturnValue(),
-                                         "The given file is not in Drive."));
+    return RespondNow(Error("The given file is not in Drive."));
   }
   base::FilePath file_path = drive::util::ExtractDrivePath(path);
 
@@ -1818,8 +1810,7 @@
     GURL download_url) {
   if (download_url.is_empty()) {
     // Intentionally returns a blank.
-    Respond(ErrorWithArguments(MakeBlankReturnValue(),
-                               "Download Url for this item is not available."));
+    Respond(Error("Download Url for this item is not available."));
     return;
   }
   download_url_ = std::move(download_url);
@@ -1845,8 +1836,7 @@
     const std::string& access_token) {
   if (code != google_apis::HTTP_SUCCESS) {
     // Intentionally returns a blank.
-    Respond(ErrorWithArguments(MakeBlankReturnValue(),
-                               "Not able to fetch the token."));
+    Respond(Error("Not able to fetch the token."));
     return;
   }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index 1c4b7950..bf523ea 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -418,9 +418,7 @@
   if (success) {
     Respond(OneArgument(std::move(result_value)));
   } else {
-    auto result_list = std::make_unique<base::ListValue>();
-    result_list->Append(std::move(result_value));
-    Respond(ErrorWithArguments(std::move(result_list), ""));
+    Respond(Error(""));
   }
 }
 
@@ -445,8 +443,7 @@
   if (file_system_url.path().empty()) {
     auto result_list = std::make_unique<base::ListValue>();
     result_list->Append(std::make_unique<base::Value>(false));
-    return RespondNow(
-        ErrorWithArguments(std::move(result_list), "Invalid URL"));
+    return RespondNow(Error("Invalid URL"));
   }
 
   file_manager::EventRouter* const event_router =
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 4a249940..f349404 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -58,6 +58,7 @@
 #include "chromeos/settings/timezone_settings.h"
 #include "components/account_id/account_id.h"
 #include "components/arc/arc_prefs.h"
+#include "components/arc/volume_mounter/arc_volume_mounter_bridge.h"
 #include "components/drive/drive_pref_names.h"
 #include "components/drive/event_logger.h"
 #include "components/prefs/pref_service.h"
@@ -266,6 +267,18 @@
   return RespondNow(NoArguments());
 }
 
+ExtensionFunction::ResponseAction
+FileManagerPrivateSetArcStorageToastShownFlagFunction::Run() {
+  const ChromeExtensionFunctionDetails chrome_details(this);
+  auto* volume_mounter = arc::ArcVolumeMounterBridge::GetForBrowserContext(
+      chrome_details.GetProfile());
+  DCHECK(volume_mounter);
+
+  const bool result = volume_mounter->files_app_toast_shown();
+  volume_mounter->set_files_app_toast_shown(true);
+  return RespondNow(OneArgument(std::make_unique<base::Value>(result)));
+}
+
 FileManagerPrivateInternalZipSelectionFunction::
     FileManagerPrivateInternalZipSelectionFunction() = default;
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
index a289a39..8ba79a4 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
@@ -86,6 +86,21 @@
   ResponseAction Run() override;
 };
 
+// Implements the chrome.fileManagerPrivate.setArcStorageToastShownFlag method.
+// Sets the ARC flag for the Files app and returns what was the state before
+// setting.
+class FileManagerPrivateSetArcStorageToastShownFlagFunction
+    : public UIThreadExtensionFunction {
+ public:
+  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.setArcStorageToastShownFlag",
+                             FILEMANAGERPRIVATE_SETARCSTORAGETOASTSHOWNFLAG)
+
+ protected:
+  ~FileManagerPrivateSetArcStorageToastShownFlagFunction() override = default;
+
+  ResponseAction Run() override;
+};
+
 // Implements the chrome.fileManagerPrivate.zipSelection method.
 // Creates a zip file for the selected files.
 class FileManagerPrivateInternalZipSelectionFunction
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc
index eb6321d..28fd679 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc
@@ -81,10 +81,7 @@
 
   file_manager::file_tasks::TaskDescriptor task;
   if (!file_manager::file_tasks::ParseTaskID(params->task_id, &task)) {
-    // TODO(crbug.com/514135): Stop relying on the result being set on error.
-    return RespondNow(ErrorWithArguments(
-        Create(extensions::api::file_manager_private::TASK_RESULT_FAILED),
-        kInvalidTask + params->task_id));
+    return RespondNow(Error(kInvalidTask + params->task_id));
   }
 
   if (params->urls.empty()) {
@@ -101,9 +98,7 @@
     const FileSystemURL url =
         file_system_context->CrackURL(GURL(params->urls[i]));
     if (!chromeos::FileSystemBackend::CanHandleURL(url)) {
-      return RespondNow(ErrorWithArguments(
-          Create(extensions::api::file_manager_private::TASK_RESULT_FAILED),
-          kInvalidFileUrl));
+      return RespondNow(Error(kInvalidFileUrl));
     }
     urls.push_back(url);
   }
@@ -114,9 +109,7 @@
           &FileManagerPrivateInternalExecuteTaskFunction::OnTaskExecuted,
           this));
   if (!result) {
-    return RespondNow(ErrorWithArguments(
-        Create(extensions::api::file_manager_private::TASK_RESULT_FAILED),
-        "ExecuteFileTask failed"));
+    return RespondNow(Error("ExecuteFileTask failed"));
   }
   return RespondLater();
 }
@@ -126,7 +119,7 @@
   auto result_list = extensions::api::file_manager_private_internal::
       ExecuteTask::Results::Create(result);
   if (result == extensions::api::file_manager_private::TASK_RESULT_FAILED) {
-    Respond(ErrorWithArguments(std::move(result_list), "Task result failed"));
+    Respond(Error("Task result failed"));
   } else {
     Respond(ArgumentList(std::move(result_list)));
   }
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
index b82e414..e29a6afe 100644
--- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
+++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
@@ -299,6 +299,7 @@
   Profile* profile = GetActiveProfile(browser_context());
   QuickUnlockStorage* quick_unlock_storage =
       chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(profile);
+  quick_unlock_storage->MarkStrongAuth();
   result->token = quick_unlock_storage->CreateAuthToken(user_context);
   result->lifetime_seconds = AuthToken::kTokenExpirationSeconds;
 
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
index cb34061..b9eae706 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -943,6 +943,11 @@
                       TestCase("filesTooltipClickHides")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
+    FileList, /* file_list.js */
+    FilesAppBrowserTest,
+    ::testing::Values(TestCase("fileListAriaAttributes")));
+
+WRAPPED_INSTANTIATE_TEST_SUITE_P(
     Crostini, /* crostini.js */
     FilesAppBrowserTest,
     ::testing::Values(TestCase("mountCrostini"),
@@ -1125,9 +1130,7 @@
     return test_case_name_.c_str();
   }
 
-  std::string GetFullTestCaseName() const override {
-    return test_case_name_;
-  }
+  std::string GetFullTestCaseName() const override { return test_case_name_; }
 
   const char* GetTestExtensionManifestName() const override {
     return "file_manager_test_manifest.json";
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
index f806b499..8363cbe 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -66,6 +66,7 @@
 #include "components/arc/session/arc_bridge_service.h"
 #include "components/arc/test/connection_holder_util.h"
 #include "components/arc/test/fake_file_system_instance.h"
+#include "components/arc/volume_mounter/arc_volume_mounter_bridge.h"
 #include "components/drive/chromeos/file_system_interface.h"
 #include "components/drive/drive_pref_names.h"
 #include "components/drive/service/fake_drive_service.h"
@@ -1726,6 +1727,7 @@
   static const base::FilePath test_extension_dir =
       base::FilePath(FILE_PATH_LITERAL("ui/file_manager/integration_tests"));
   LaunchExtension(test_extension_dir, GetTestExtensionManifestName());
+  CreateArcServices();
   RunTestMessageLoop();
 }
 
@@ -2293,4 +2295,12 @@
   ash::ShellTestApi().EnableVirtualKeyboard();
 }
 
+void FileManagerBrowserTestBase::CreateArcServices() {
+  // Instantiate testing version of the services.
+
+  // chrome.fileManagerPrivate relies on ArcVolumeMounterBridge, and our tests
+  // call the chrome.fileManagerPrivate interface.
+  arc::ArcVolumeMounterBridge::GetForBrowserContextForTesting(profile());
+}
+
 }  // namespace file_manager
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
index e5f6b5c..23d23d1 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
@@ -143,6 +143,9 @@
   // Called during tests to determine if SMB file shares is enabled.
   bool IsSmbEnabled() const;
 
+  // Creates ARC services for testing that are keyed to the current |profile()|.
+  void CreateArcServices();
+
   base::test::ScopedFeatureList feature_list_;
 
   std::unique_ptr<DownloadsTestVolume> local_volume_;
diff --git a/chrome/browser/chromeos/file_manager/file_manager_string_util.cc b/chrome/browser/chromeos/file_manager/file_manager_string_util.cc
index 24b688d..357f4338 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_string_util.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_string_util.cc
@@ -755,8 +755,18 @@
              IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_CROSTINI);
   SET_STRING("SHARE_ROOT_FOLDER_WITH_CROSTINI_DRIVE",
              IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_CROSTINI_DRIVE);
+  SET_STRING("SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_TITLE",
+             IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_TITLE);
+  SET_STRING("SHARE_ROOT_FOLDER_WITH_PLUGIN_VM",
+             IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM);
+  SET_STRING("SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_DRIVE",
+             IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_DRIVE);
   SET_STRING("SIZE_BYTES", IDS_FILE_BROWSER_SIZE_BYTES);
   SET_STRING("SIZE_COLUMN_LABEL", IDS_FILE_BROWSER_SIZE_COLUMN_LABEL);
+  SET_STRING("COLUMN_ASC_SORT_MESSAGE",
+             IDS_FILE_BROWSER_COLUMN_ASC_SORT_MESSAGE);
+  SET_STRING("COLUMN_DESC_SORT_MESSAGE",
+             IDS_FILE_BROWSER_COLUMN_DESC_SORT_MESSAGE);
   SET_STRING("SIZE_GB", IDS_FILE_BROWSER_SIZE_GB);
   SET_STRING("SIZE_KB", IDS_FILE_BROWSER_SIZE_KB);
   SET_STRING("SIZE_MB", IDS_FILE_BROWSER_SIZE_MB);
diff --git a/chrome/browser/chromeos/kiosk_next_home/app_controller_service.cc b/chrome/browser/chromeos/kiosk_next_home/app_controller_service.cc
index 9615abf..f24988e 100644
--- a/chrome/browser/chromeos/kiosk_next_home/app_controller_service.cc
+++ b/chrome/browser/chromeos/kiosk_next_home/app_controller_service.cc
@@ -12,12 +12,14 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/logging.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/apps/app_service/app_icon_source.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/chromeos/kiosk_next_home/app_controller_service_factory.h"
 #include "chrome/browser/chromeos/kiosk_next_home/intent_config_helper.h"
+#include "chrome/browser/chromeos/kiosk_next_home/metrics_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
@@ -46,6 +48,10 @@
              : nullptr;
 }
 
+void RecordLaunchIntentResult(LaunchIntentResult result) {
+  UMA_HISTOGRAM_ENUMERATION("KioskNextHome.Bridge.LaunchIntentResult", result);
+}
+
 }  // namespace
 
 // static
@@ -78,6 +84,7 @@
 
 void AppControllerService::GetApps(
     mojom::AppController::GetAppsCallback callback) {
+  RecordBridgeAction(BridgeAction::kListApps);
   std::vector<chromeos::kiosk_next_home::mojom::AppPtr> app_list;
   // Using AppUpdate objects here since that's how the app list is intended to
   // be consumed. Refer to AppRegistryCache::ForEachApp for more information.
@@ -97,20 +104,25 @@
 }
 
 void AppControllerService::LaunchApp(const std::string& app_id) {
+  RecordBridgeAction(BridgeAction::kLaunchApp);
   app_service_proxy_->Launch(app_id, ui::EventFlags::EF_NONE,
                              apps::mojom::LaunchSource::kFromKioskNextHome,
                              display::kDefaultDisplayId);
 }
 
 void AppControllerService::UninstallApp(const std::string& app_id) {
+  RecordBridgeAction(BridgeAction::kUninstallApp);
   app_service_proxy_->Uninstall(app_id);
 }
 
 void AppControllerService::GetArcAndroidId(
     mojom::AppController::GetArcAndroidIdCallback callback) {
+  RecordBridgeAction(BridgeAction::kGetAndroidId);
   arc::GetAndroidId(base::BindOnce(
       [](mojom::AppController::GetArcAndroidIdCallback callback, bool success,
          int64_t raw_android_id) {
+        UMA_HISTOGRAM_BOOLEAN("KioskNextHome.Bridge.GetAndroidIdSuccess",
+                              success);
         // The bridge expects the Android id as a hex string.
         std::stringstream android_id_stream;
         android_id_stream << std::hex << raw_android_id;
@@ -121,18 +133,22 @@
 
 void AppControllerService::LaunchIntent(const std::string& intent,
                                         LaunchIntentCallback callback) {
+  RecordBridgeAction(BridgeAction::kLaunchIntent);
   GURL intent_uri(intent);
   if (!intent_config_helper_->IsIntentAllowed(intent_uri)) {
+    RecordLaunchIntentResult(LaunchIntentResult::kNotAllowed);
     std::move(callback).Run(false, "Intent not allowed.");
     return;
   }
 
   arc::mojom::AppInstance* app_instance = GetArcAppInstanceForLaunchIntent();
   if (!app_instance) {
+    RecordLaunchIntentResult(LaunchIntentResult::kArcUnavailable);
     std::move(callback).Run(false, "ARC bridge not available.");
     return;
   }
 
+  RecordLaunchIntentResult(LaunchIntentResult::kSuccess);
   app_instance->LaunchIntent(intent_uri.spec(), display::kDefaultDisplayId);
   std::move(callback).Run(true, base::nullopt);
 }
@@ -149,8 +165,10 @@
   if (!AppIsRelevantForKioskNextHome(update))
     return;
 
-  if (client_)
+  if (client_) {
+    RecordBridgeAction(BridgeAction::kNotifiedAppChange);
     client_->OnAppChanged(CreateAppPtr(update));
+  }
 }
 
 void AppControllerService::SetIntentConfigHelperForTesting(
diff --git a/chrome/browser/chromeos/kiosk_next_home/app_controller_service_unittest.cc b/chrome/browser/chromeos/kiosk_next_home/app_controller_service_unittest.cc
index 6de0a2c3c..37c6be4 100644
--- a/chrome/browser/chromeos/kiosk_next_home/app_controller_service_unittest.cc
+++ b/chrome/browser/chromeos/kiosk_next_home/app_controller_service_unittest.cc
@@ -12,8 +12,10 @@
 
 #include "base/optional.h"
 #include "base/test/bind_test_util.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/chromeos/kiosk_next_home/intent_config_helper.h"
+#include "chrome/browser/chromeos/kiosk_next_home/metrics_helper.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_test.h"
 #include "chrome/common/extensions/extension_constants.h"
@@ -250,6 +252,23 @@
     }
   }
 
+  void ExpectBridgeActionRecorded(BridgeAction action, int count) {
+    // Since seeding apps may fire bridge actions, check only the bucket of
+    // interest.
+    histogram_tester_.ExpectBucketCount("KioskNextHome.Bridge.Action", action,
+                                        count);
+  }
+
+  void ExpectLaunchIntentResultRecorded(LaunchIntentResult result) {
+    histogram_tester_.ExpectUniqueSample(
+        "KioskNextHome.Bridge.LaunchIntentResult", result, 1);
+  }
+
+  void ExpectGetAndroidIdSuccessRecorded(bool success, int count) {
+    histogram_tester_.ExpectUniqueSample(
+        "KioskNextHome.Bridge.GetAndroidIdSuccess", success, count);
+  }
+
  private:
   content::TestBrowserThreadBundle test_browser_thread_bundle_;
   std::unique_ptr<TestingProfile> profile_;
@@ -257,6 +276,7 @@
   MockAppServiceProxy* proxy_ = nullptr;
   AppControllerService* app_controller_service_ = nullptr;
   std::unique_ptr<FakeAppControllerClient> client_;
+  base::HistogramTester histogram_tester_;
 
   void ExpectEqualApps(const mojom::App& expected_app,
                        const mojom::App& actual_app) {
@@ -298,6 +318,7 @@
   expected_app.readiness = readiness;
 
   ExpectApps({expected_app});
+  ExpectBridgeActionRecorded(BridgeAction::kListApps, 1);
 }
 
 TEST_F(AppControllerServiceTest, AndroidAppIsFetchedCorrectly) {
@@ -325,6 +346,7 @@
   expected_app.readiness = readiness;
 
   ExpectApps({expected_app});
+  ExpectBridgeActionRecorded(BridgeAction::kListApps, 1);
 }
 
 TEST_F(AppControllerServiceTest, AndroidAppWithMissingPackageFetchedCorrectly) {
@@ -366,6 +388,7 @@
   delta.readiness = readiness;
   delta.show_in_launcher = OptionalBool::kTrue;
   AddAppDeltaToAppService(delta.Clone());
+  ExpectBridgeActionRecorded(BridgeAction::kNotifiedAppChange, 1);
 
   mojom::App expected_app;
   expected_app.app_id = app_id;
@@ -376,9 +399,11 @@
   // Now we change the readiness.
   delta.readiness = Readiness::kReady;
   AddAppDeltaToAppService(delta.Clone());
+  ExpectBridgeActionRecorded(BridgeAction::kNotifiedAppChange, 2);
 
   expected_app.readiness = Readiness::kReady;
   ExpectApps({expected_app});
+  ExpectBridgeActionRecorded(BridgeAction::kListApps, 2);
 }
 
 TEST_F(AppControllerServiceTest, AppDisplayNameIsUpdated) {
@@ -392,6 +417,7 @@
   delta.name = display_name;
   delta.show_in_launcher = OptionalBool::kTrue;
   AddAppDeltaToAppService(delta.Clone());
+  ExpectBridgeActionRecorded(BridgeAction::kNotifiedAppChange, 1);
 
   mojom::App expected_app;
   expected_app.app_id = app_id;
@@ -403,9 +429,11 @@
   std::string new_display_name = "New App Name";
   delta.name = new_display_name;
   AddAppDeltaToAppService(delta.Clone());
+  ExpectBridgeActionRecorded(BridgeAction::kNotifiedAppChange, 2);
 
   expected_app.display_name = new_display_name;
   ExpectApps({expected_app});
+  ExpectBridgeActionRecorded(BridgeAction::kListApps, 2);
 }
 
 TEST_F(AppControllerServiceTest, MultipleAppsAreFetchedCorrectly) {
@@ -500,6 +528,9 @@
   // Make sure the returned Android ID doesn't get clipped when it's too large.
   SetAndroidId(std::numeric_limits<int64_t>::max());
   ExpectArcAndroidIdResponse(true, "7fffffffffffffff");
+
+  ExpectBridgeActionRecorded(BridgeAction::kGetAndroidId, 2);
+  ExpectGetAndroidIdSuccessRecorded(/*success=*/true, 2);
 }
 
 TEST_F(AppControllerServiceTest, GetArcAndroidIdFailureIsPropagated) {
@@ -507,6 +538,8 @@
   StopArc();
 
   ExpectArcAndroidIdResponse(false, "0");
+  ExpectBridgeActionRecorded(BridgeAction::kGetAndroidId, 1);
+  ExpectGetAndroidIdSuccessRecorded(/*success=*/false, 1);
 }
 
 TEST_F(AppControllerServiceTest, LaunchIntentLaunchesWhenAllowed) {
@@ -515,6 +548,8 @@
   ExpectLaunchIntentResponse(intent, true, base::nullopt);
 
   ExpectIntentLaunched(intent);
+  ExpectBridgeActionRecorded(BridgeAction::kLaunchIntent, 1);
+  ExpectLaunchIntentResultRecorded(LaunchIntentResult::kSuccess);
 }
 
 TEST_F(AppControllerServiceTest, LaunchIntentFailsWhenNotAllowed) {
@@ -524,6 +559,8 @@
       intent, false, base::Optional<std::string>("Intent not allowed."));
 
   ExpectNoLaunchedIntents();
+  ExpectBridgeActionRecorded(BridgeAction::kLaunchIntent, 1);
+  ExpectLaunchIntentResultRecorded(LaunchIntentResult::kNotAllowed);
 }
 
 TEST_F(AppControllerServiceTest, LaunchIntentFailsWhenArcIsDisabled) {
@@ -534,6 +571,8 @@
       intent, false, base::Optional<std::string>("ARC bridge not available."));
 
   ExpectNoLaunchedIntents();
+  ExpectBridgeActionRecorded(BridgeAction::kLaunchIntent, 1);
+  ExpectLaunchIntentResultRecorded(LaunchIntentResult::kArcUnavailable);
 }
 
 TEST_F(AppControllerServiceTest, ClientIsNotifiedOfChangesToAndroidApp) {
@@ -666,12 +705,14 @@
   first_app_state.app_id = "app";
   first_app_state.type = AppType::kBuiltIn;
   ExpectAppChangedUpdates({first_app_state});
+  ExpectBridgeActionRecorded(BridgeAction::kNotifiedAppChange, 1);
 
   // We don't care about this field, so changes to it shouldn't be
   // propagated to the client.
   app_delta.additional_search_terms = {"random_term"};
   AddAppDeltaToAppService(app_delta.Clone());
   ExpectAppChangedUpdates({first_app_state});
+  ExpectBridgeActionRecorded(BridgeAction::kNotifiedAppChange, 1);
 }
 
 TEST_F(AppControllerServiceTest, LaunchAppCallsAppServiceCorrectly) {
@@ -680,12 +721,14 @@
                                display::kDefaultDisplayId));
 
   service()->LaunchApp("fake_app_id");
+  ExpectBridgeActionRecorded(BridgeAction::kLaunchApp, 1);
 }
 
 TEST_F(AppControllerServiceTest, UninstallAppCallsAppServiceCorrectly) {
   EXPECT_CALL(*proxy(), Uninstall("fake_app_id"));
 
   service()->UninstallApp("fake_app_id");
+  ExpectBridgeActionRecorded(BridgeAction::kUninstallApp, 1);
 }
 
 }  // namespace kiosk_next_home
diff --git a/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.cc b/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.cc
new file mode 100644
index 0000000..4ffde74d
--- /dev/null
+++ b/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.cc
@@ -0,0 +1,33 @@
+// 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/kiosk_next_home/identity_controller_impl.h"
+
+#include <string>
+#include <utility>
+
+#include "base/strings/utf_string_conversions.h"
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
+
+namespace chromeos {
+namespace kiosk_next_home {
+
+IdentityControllerImpl::IdentityControllerImpl(
+    mojom::IdentityControllerRequest request)
+    : binding_(this, std::move(request)) {}
+
+IdentityControllerImpl::~IdentityControllerImpl() = default;
+
+void IdentityControllerImpl::GetUserInfo(
+    mojom::IdentityController::GetUserInfoCallback callback) {
+  auto user_info = mojom::UserInfo::New();
+  user_manager::User* user = user_manager::UserManager::Get()->GetActiveUser();
+  user_info->given_name = base::UTF16ToUTF8(user->GetGivenName());
+  user_info->display_name = base::UTF16ToUTF8(user->GetDisplayName());
+  std::move(callback).Run(std::move(user_info));
+}
+
+}  // namespace kiosk_next_home
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.h b/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.h
new file mode 100644
index 0000000..4d9ebacb
--- /dev/null
+++ b/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.h
@@ -0,0 +1,35 @@
+// 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_KIOSK_NEXT_HOME_IDENTITY_CONTROLLER_IMPL_H_
+#define CHROME_BROWSER_CHROMEOS_KIOSK_NEXT_HOME_IDENTITY_CONTROLLER_IMPL_H_
+
+#include "base/macros.h"
+#include "chrome/browser/chromeos/kiosk_next_home/mojom/identity_controller.mojom.h"
+#include "mojo/public/cpp/bindings/binding.h"
+
+namespace chromeos {
+namespace kiosk_next_home {
+
+// IdentityController implementation to expose identity-related capabilities to
+// Kiosk Next Home.
+class IdentityControllerImpl : public mojom::IdentityController {
+ public:
+  explicit IdentityControllerImpl(mojom::IdentityControllerRequest request);
+  ~IdentityControllerImpl() override;
+
+  // mojom::IdentityController:
+  void GetUserInfo(
+      mojom::IdentityController::GetUserInfoCallback callback) override;
+
+ private:
+  mojo::Binding<mojom::IdentityController> binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(IdentityControllerImpl);
+};
+
+}  // namespace kiosk_next_home
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_KIOSK_NEXT_HOME_IDENTITY_CONTROLLER_IMPL_H_
diff --git a/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl_unittest.cc b/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl_unittest.cc
new file mode 100644
index 0000000..b9a9554
--- /dev/null
+++ b/chrome/browser/chromeos/kiosk_next_home/identity_controller_impl_unittest.cc
@@ -0,0 +1,72 @@
+// 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/kiosk_next_home/identity_controller_impl.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/scoped_task_environment.h"
+#include "components/user_manager/fake_user_manager.h"
+#include "components/user_manager/scoped_user_manager.h"
+#include "components/user_manager/user_manager.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace kiosk_next_home {
+
+namespace {
+
+const char* kUserDisplayName = "User Display Name";
+const char* kUserGivenName = "User Given Name";
+
+}  // namespace
+
+class IdentityControllerImplTest : public testing::Test {
+ protected:
+  void SetUp() override {
+    auto* fake_user_manager = new user_manager::FakeUserManager();
+    user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
+        base::WrapUnique(fake_user_manager));
+    AccountId account_id =
+        AccountId::FromUserEmailGaiaId("test@test.com", "123456");
+    // Create new fake user and set its account data.
+    fake_user_manager->AddUser(account_id);
+    user_manager::UserManager::UserAccountData account_data(
+        base::ASCIIToUTF16(kUserDisplayName),
+        base::ASCIIToUTF16(kUserGivenName), std::string() /* locale */);
+    fake_user_manager->UpdateUserAccountData(account_id, account_data);
+    identity_controller_impl_ = std::make_unique<IdentityControllerImpl>(
+        mojo::MakeRequest(&identity_controller_));
+  }
+
+  mojom::IdentityController* identity_controller() {
+    return identity_controller_.get();
+  }
+
+ private:
+  base::test::ScopedTaskEnvironment task_environemnt_;
+  std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
+  std::unique_ptr<IdentityControllerImpl> identity_controller_impl_;
+  mojom::IdentityControllerPtr identity_controller_;
+};
+
+TEST_F(IdentityControllerImplTest, GetUserInfo) {
+  base::RunLoop run_loop;
+  mojom::UserInfoPtr returned_user_info;
+  identity_controller()->GetUserInfo(base::BindLambdaForTesting(
+      [&run_loop, &returned_user_info](mojom::UserInfoPtr user_info) {
+        returned_user_info = std::move(user_info);
+        run_loop.QuitClosure().Run();
+      }));
+  run_loop.Run();
+  EXPECT_EQ(returned_user_info->display_name, kUserDisplayName);
+  EXPECT_EQ(returned_user_info->given_name, kUserGivenName);
+}
+
+}  // namespace kiosk_next_home
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/kiosk_next_home/kiosk_next_home_interface_broker_impl.cc b/chrome/browser/chromeos/kiosk_next_home/kiosk_next_home_interface_broker_impl.cc
index 41a7dd8..12f80bee 100644
--- a/chrome/browser/chromeos/kiosk_next_home/kiosk_next_home_interface_broker_impl.cc
+++ b/chrome/browser/chromeos/kiosk_next_home/kiosk_next_home_interface_broker_impl.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "chrome/browser/chromeos/kiosk_next_home/app_controller_service.h"
+#include "chrome/browser/chromeos/kiosk_next_home/identity_controller_impl.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_context.h"
 #include "services/identity/public/mojom/constants.mojom.h"
@@ -29,6 +30,12 @@
                             std::move(request));
 }
 
+void KioskNextHomeInterfaceBrokerImpl::GetIdentityController(
+    mojom::IdentityControllerRequest request) {
+  identity_controller_ =
+      std::make_unique<IdentityControllerImpl>(std::move(request));
+}
+
 void KioskNextHomeInterfaceBrokerImpl::GetAppController(
     mojom::AppControllerRequest request) {
   AppControllerService::Get(context_)->BindRequest(std::move(request));
diff --git a/chrome/browser/chromeos/kiosk_next_home/kiosk_next_home_interface_broker_impl.h b/chrome/browser/chromeos/kiosk_next_home/kiosk_next_home_interface_broker_impl.h
index baf89ef..f54392d0 100644
--- a/chrome/browser/chromeos/kiosk_next_home/kiosk_next_home_interface_broker_impl.h
+++ b/chrome/browser/chromeos/kiosk_next_home/kiosk_next_home_interface_broker_impl.h
@@ -24,6 +24,8 @@
 namespace chromeos {
 namespace kiosk_next_home {
 
+class IdentityControllerImpl;
+
 // Implementation of interface responsible for brokering other interfaces needed
 // to support Kiosk Next Home functionality.
 class KioskNextHomeInterfaceBrokerImpl
@@ -39,11 +41,13 @@
   // mojom::KioskNextHomeInterfaceBroker:
   void GetIdentityAccessor(
       ::identity::mojom::IdentityAccessorRequest request) override;
+  void GetIdentityController(mojom::IdentityControllerRequest request) override;
   void GetAppController(mojom::AppControllerRequest request) override;
 
  private:
   content::BrowserContext* context_;
   mojo::BindingSet<mojom::KioskNextHomeInterfaceBroker> bindings_;
+  std::unique_ptr<IdentityControllerImpl> identity_controller_;
   // Clone of BrowserContext's Connector, which allows binding to other
   // services.
   std::unique_ptr<service_manager::Connector> connector_;
diff --git a/chrome/browser/chromeos/kiosk_next_home/metrics_helper.cc b/chrome/browser/chromeos/kiosk_next_home/metrics_helper.cc
new file mode 100644
index 0000000..73bd3b98
--- /dev/null
+++ b/chrome/browser/chromeos/kiosk_next_home/metrics_helper.cc
@@ -0,0 +1,17 @@
+// 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/kiosk_next_home/metrics_helper.h"
+
+#include "base/metrics/histogram_macros.h"
+
+namespace chromeos {
+namespace kiosk_next_home {
+
+void RecordBridgeAction(BridgeAction action) {
+  UMA_HISTOGRAM_ENUMERATION("KioskNextHome.Bridge.Action", action);
+}
+
+}  // namespace kiosk_next_home
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/kiosk_next_home/metrics_helper.h b/chrome/browser/chromeos/kiosk_next_home/metrics_helper.h
new file mode 100644
index 0000000..d12c81c
--- /dev/null
+++ b/chrome/browser/chromeos/kiosk_next_home/metrics_helper.h
@@ -0,0 +1,38 @@
+// 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_KIOSK_NEXT_HOME_METRICS_HELPER_H_
+#define CHROME_BROWSER_CHROMEOS_KIOSK_NEXT_HOME_METRICS_HELPER_H_
+
+namespace chromeos {
+namespace kiosk_next_home {
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class BridgeAction {
+  kListApps = 0,
+  kLaunchApp = 1,
+  kUninstallApp = 2,
+  kNotifiedAppChange = 3,
+  kGetAndroidId = 4,
+  kLaunchIntent = 5,
+  kMaxValue = kLaunchIntent,
+};
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class LaunchIntentResult {
+  kSuccess = 0,
+  kNotAllowed = 1,
+  kArcUnavailable = 2,
+  kMaxValue = kArcUnavailable,
+};
+
+// Records KioskNextHome bridge method calls.
+void RecordBridgeAction(BridgeAction action);
+
+}  // namespace kiosk_next_home
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_KIOSK_NEXT_HOME_METRICS_HELPER_H_
diff --git a/chrome/browser/chromeos/kiosk_next_home/mojom/BUILD.gn b/chrome/browser/chromeos/kiosk_next_home/mojom/BUILD.gn
index 198be69..171e014f 100644
--- a/chrome/browser/chromeos/kiosk_next_home/mojom/BUILD.gn
+++ b/chrome/browser/chromeos/kiosk_next_home/mojom/BUILD.gn
@@ -7,6 +7,7 @@
 mojom("mojom") {
   sources = [
     "app_controller.mojom",
+    "identity_controller.mojom",
     "kiosk_next_home_interface_broker.mojom",
   ]
 
diff --git a/chrome/browser/chromeos/kiosk_next_home/mojom/identity_controller.mojom b/chrome/browser/chromeos/kiosk_next_home/mojom/identity_controller.mojom
new file mode 100644
index 0000000..251b5209
--- /dev/null
+++ b/chrome/browser/chromeos/kiosk_next_home/mojom/identity_controller.mojom
@@ -0,0 +1,15 @@
+// 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.
+
+module chromeos.kiosk_next_home.mojom;
+
+struct UserInfo {
+  string given_name;
+  string display_name;
+};
+
+// Exposes identity-related capabilities to Kiosk Next Home.
+interface IdentityController {
+  GetUserInfo() => (UserInfo user_info);
+};
diff --git a/chrome/browser/chromeos/kiosk_next_home/mojom/kiosk_next_home_interface_broker.mojom b/chrome/browser/chromeos/kiosk_next_home/mojom/kiosk_next_home_interface_broker.mojom
index 21ecd83..f86e53b2 100644
--- a/chrome/browser/chromeos/kiosk_next_home/mojom/kiosk_next_home_interface_broker.mojom
+++ b/chrome/browser/chromeos/kiosk_next_home/mojom/kiosk_next_home_interface_broker.mojom
@@ -5,6 +5,7 @@
 module chromeos.kiosk_next_home.mojom;
 
 import "chrome/browser/chromeos/kiosk_next_home/mojom/app_controller.mojom";
+import "chrome/browser/chromeos/kiosk_next_home/mojom/identity_controller.mojom";
 import "services/identity/public/mojom/identity_accessor.mojom";
 
 // Single entry point for any interface requests issued by the Kiosk Next
@@ -12,8 +13,12 @@
 // its functionality.
 interface KioskNextHomeInterfaceBroker {
   // Binds IdentityAccessor service request.
+  // TODO(brunoad): migrate needed methods to IdentityController and remove.
   GetIdentityAccessor(identity.mojom.IdentityAccessor& request);
 
+  // Binds the IdentityController service request.
+  GetIdentityController(IdentityController& request);
+
   // Binds the AppController service request.
   GetAppController(AppController& request);
 };
diff --git a/chrome/browser/chromeos/login/configuration_keys.cc b/chrome/browser/chromeos/login/configuration_keys.cc
index 284cb46b..cf94b52 100644
--- a/chrome/browser/chromeos/login/configuration_keys.cc
+++ b/chrome/browser/chromeos/login/configuration_keys.cc
@@ -71,6 +71,8 @@
 // == Update screen:
 
 // Boolean value, indicating that all non-critical updates should be skipped.
+// This should be used only during rollback scenario, when Chrome version is
+// known not to have any critical issues.
 const char kUpdateSkipUpdate[] = "updateSkipNonCritical";
 
 // == Wizard controller:
@@ -128,7 +130,7 @@
      ConfigurationHandlerSide::HANDLER_JS},
     {kEULAAutoAccept, ValueType::BOOLEAN, ConfigurationHandlerSide::HANDLER_JS},
     {kUpdateSkipUpdate, ValueType::BOOLEAN,
-     ConfigurationHandlerSide::HANDLER_JS},
+     ConfigurationHandlerSide::HANDLER_CPP},
     {kWizardAutoEnroll, ValueType::BOOLEAN,
      ConfigurationHandlerSide::HANDLER_CPP},
     {kRestoreAfterRollback, ValueType::BOOLEAN,
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
index 5c2740e..4d03a0b 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
@@ -125,11 +125,10 @@
     return;
   }
 
-  if (feature_state_ !=
-      multidevice_setup::mojom::FeatureState::kEnabledByUser) {
+  if (!IsEnabled()) {
     // OnFeatureStatesChanged() will call back on this method when feature state
     // changes.
-    PA_LOG(VERBOSE) << "Smart Lock is disabled; aborting.";
+    PA_LOG(VERBOSE) << "Smart Lock is not enabled by user; aborting.";
     SetProximityAuthDevices(GetAccountId(), multidevice::RemoteDeviceRefList(),
                             base::nullopt /* local_device */);
     return;
@@ -149,6 +148,8 @@
     pref_manager_->SetEasyUnlockEnabledStateSet();
     LogSmartLockEnabledState(SmartLockEnabledState::ENABLED);
   } else {
+    PA_LOG(ERROR) << "Smart Lock is enabled by user, but no unlock key is "
+                     "present; aborting.";
     SetProximityAuthDevices(GetAccountId(), multidevice::RemoteDeviceRefList(),
                             base::nullopt /* local_device */);
 
@@ -175,7 +176,11 @@
 void EasyUnlockServiceRegular::UseLoadedRemoteDevices(
     const multidevice::RemoteDeviceRefList& remote_devices) {
   // When EasyUnlock is enabled, only one EasyUnlock host should exist.
-  DCHECK(remote_devices.size() == 1u);
+  if (remote_devices.size() != 1u) {
+    PA_LOG(ERROR) << "There should only be 1 Smart Lock host, but there are: "
+                  << remote_devices.size();
+    NOTREACHED();
+  }
 
   SetProximityAuthDevices(GetAccountId(), remote_devices,
                           device_sync_client_->GetLocalDeviceMetadata());
@@ -239,9 +244,21 @@
                       multidevice::SoftwareFeatureState::kEnabled;
     dict->SetBoolean(key_names::kKeyUnlockKey, unlock_key);
 
+    PA_LOG(VERBOSE) << "Storing RemoteDevice: { "
+                    << "name: " << device.name()
+                    << ", unlock_key: " << unlock_key
+                    << ", id: " << device.GetTruncatedDeviceIdForLogs()
+                    << " }.";
     device_list->Append(std::move(dict));
   }
 
+  if (device_list->GetSize() != 2u) {
+    PA_LOG(ERROR) << "There should only be 2 devices persisted, the host and "
+                     "the client, but there are: "
+                  << device_list->GetSize();
+    NOTREACHED();
+  }
+
   SetStoredRemoteDevices(*device_list);
 }
 
@@ -250,7 +267,6 @@
   std::string remote_devices_json;
   JSONStringValueSerializer serializer(&remote_devices_json);
   serializer.Serialize(devices);
-  PA_LOG(VERBOSE) << "Setting RemoteDevices:\n  " << remote_devices_json;
 
   DictionaryPrefUpdate pairing_update(profile()->GetPrefs(),
                                       prefs::kEasyUnlockPairing);
@@ -393,19 +409,18 @@
   if (!ProfileHelper::IsPrimaryProfile(profile()))
     return false;
 
-  if (feature_state_ ==
+  if (multidevice_setup_client_->GetFeatureState(
+          multidevice_setup::mojom::Feature::kSmartLock) ==
       multidevice_setup::mojom::FeatureState::kProhibitedByPolicy) {
     return false;
   }
 
-  if (!profile()->GetPrefs()->GetBoolean(prefs::kEasyUnlockAllowed))
-    return false;
-
   return true;
 }
 
 bool EasyUnlockServiceRegular::IsEnabled() const {
-  return feature_state_ ==
+  return multidevice_setup_client_->GetFeatureState(
+             multidevice_setup::mojom::Feature::kSmartLock) ==
          multidevice_setup::mojom::FeatureState::kEnabledByUser;
 }
 
@@ -455,15 +470,6 @@
 void EasyUnlockServiceRegular::OnFeatureStatesChanged(
     const multidevice_setup::MultiDeviceSetupClient::FeatureStatesMap&
         feature_states_map) {
-  const auto it =
-      feature_states_map.find(multidevice_setup::mojom::Feature::kSmartLock);
-  if (it == feature_states_map.end()) {
-    feature_state_ =
-        multidevice_setup::mojom::FeatureState::kUnavailableNoVerifiedHost;
-    return;
-  }
-
-  feature_state_ = it->second;
   LoadRemoteDevices();
   UpdateAppState();
 }
@@ -472,7 +478,7 @@
   // The user may have decided to disable Smart Lock or the whole multidevice
   // suite immediately after completing setup, so ensure that Smart Lock is
   // enabled.
-  if (feature_state_ == multidevice_setup::mojom::FeatureState::kEnabledByUser)
+  if (IsEnabled())
     notification_controller_->ShowChromebookAddedNotification();
 }
 
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.h b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.h
index fee4245..864ea0c0 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.h
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.h
@@ -157,7 +157,7 @@
   // Used to fetch local device and remote device data.
   device_sync::DeviceSyncClient* device_sync_client_;
 
-  // Used to determine the FeatureState of Smart Lock. See |feature_state_|.
+  // Used to determine the FeatureState of Smart Lock.
   multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_;
 
   // Stores the unlock keys for EasyUnlock before the current device sync, so we
@@ -165,12 +165,6 @@
   std::vector<cryptauth::ExternalDeviceInfo> unlock_keys_before_sync_;
   multidevice::RemoteDeviceRefList remote_device_unlock_keys_before_sync_;
 
-  // Caches feature state of Smart Lock. This service should only actively be
-  // running if its value is kEnabledByUser. Populated by using
-  // |multidevice_setup_client_|.
-  multidevice_setup::mojom::FeatureState feature_state_ =
-      multidevice_setup::mojom::FeatureState::kUnavailableNoVerifiedHost;
-
   // True if the pairing changed notification was shown, so that the next time
   // the Chromebook is unlocked, we can show the subsequent 'pairing applied'
   // notification.
diff --git a/chrome/browser/chromeos/login/error_screen_browsertest.cc b/chrome/browser/chromeos/login/error_screen_browsertest.cc
index 7971eabc..8114975 100644
--- a/chrome/browser/chromeos/login/error_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/error_screen_browsertest.cc
@@ -5,28 +5,51 @@
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
 #include "base/test/bind_test_util.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/chromeos/app_mode/fake_cws.h"
+#include "chrome/browser/chromeos/login/app_launch_controller.h"
 #include "chrome/browser/chromeos/login/login_wizard.h"
 #include "chrome/browser/chromeos/login/mixin_based_in_process_browser_test.h"
 #include "chrome/browser/chromeos/login/screens/error_screen.h"
+#include "chrome/browser/chromeos/login/test/device_state_mixin.h"
+#include "chrome/browser/chromeos/login/test/dialog_window_waiter.h"
+#include "chrome/browser/chromeos/login/test/embedded_test_server_mixin.h"
 #include "chrome/browser/chromeos/login/test/js_checker.h"
 #include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
+#include "chrome/browser/chromeos/login/test/login_screen_tester.h"
 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h"
+#include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "chromeos/dbus/shill/shill_profile_client.h"
 #include "chromeos/network/network_state_test_helper.h"
+#include "components/policy/proto/chrome_device_policy.pb.h"
 #include "components/user_manager/user_manager.h"
+#include "content/public/test/test_utils.h"
+#include "net/dns/mock_host_resolver.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace em = enterprise_management;
 
 namespace chromeos {
 
 namespace {
 
+// This is a simple test app that creates an app window and immediately closes
+// it again. Webstore data json is in
+//   chrome/test/data/chromeos/app_mode/webstore/inlineinstall/
+//       detail/ggaeimfdpnmlhdhpcikgoblffmkckdmn
+constexpr char kTestKioskAppId[] = "ggaeimfdpnmlhdhpcikgoblffmkckdmn";
+constexpr char kTestKioskAccountId[] = "enterprise-kiosk-app@localhost";
+
 constexpr char kTestUser[] = "test-user1@gmail.com";
+
 constexpr char kWifiServiceName[] = "stub_wifi";
 constexpr char kWifiNetworkName[] = "wifi-test-network";
 
@@ -218,4 +241,103 @@
   EXPECT_TRUE(user_manager->IsLoggedInAsGuest());
 }
 
+class KioskErrorScreenTest : public MixinBasedInProcessBrowserTest {
+ public:
+  KioskErrorScreenTest() = default;
+  ~KioskErrorScreenTest() override = default;
+
+  void SetUpInProcessBrowserTestFixture() override {
+    host_resolver()->AddRule("*", "127.0.0.1");
+
+    AppLaunchController::SkipSplashWaitForTesting();
+    AppLaunchController::SetNetworkWaitForTesting(0);
+
+    fake_cws_.Init(embedded_test_server());
+    fake_cws_.SetUpdateCrx(kTestKioskAppId,
+                           base::StrCat({kTestKioskAppId, ".crx"}), "1.0.0");
+
+    AddKioskAppToDevicePolicy();
+
+    MixinBasedInProcessBrowserTest::SetUpInProcessBrowserTestFixture();
+  }
+
+  void SetUpOnMainThread() override {
+    network_helper_ = std::make_unique<NetworkStateTestHelper>(
+        /*use_default_devices_and_services=*/false);
+
+    network_helper_->service_test()->AddService(
+        kWifiServiceName, "wifi_guid", kWifiNetworkName, shill::kTypeWifi,
+        shill::kStateOffline, /*visible=*/true);
+
+    apps_loaded_waiter_ =
+        std::make_unique<content::WindowedNotificationObserver>(
+            chrome::NOTIFICATION_KIOSK_APPS_LOADED,
+            content::NotificationService::AllSources());
+
+    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
+  }
+
+  void TearDownOnMainThread() override {
+    network_helper_.reset();
+    apps_loaded_waiter_.reset();
+    MixinBasedInProcessBrowserTest::TearDownOnMainThread();
+  }
+
+ protected:
+  content::WindowedNotificationObserver* apps_loaded_waiter() {
+    return apps_loaded_waiter_.get();
+  }
+
+ private:
+  void AddKioskAppToDevicePolicy() {
+    std::unique_ptr<ScopedDevicePolicyUpdate> device_policy_update =
+        device_state_.RequestDevicePolicyUpdate();
+    em::DeviceLocalAccountsProto* const device_local_accounts =
+        device_policy_update->policy_payload()->mutable_device_local_accounts();
+
+    em::DeviceLocalAccountInfoProto* const account =
+        device_local_accounts->add_account();
+    account->set_account_id(kTestKioskAccountId);
+    account->set_type(em::DeviceLocalAccountInfoProto::ACCOUNT_TYPE_KIOSK_APP);
+    account->mutable_kiosk_app()->set_app_id(kTestKioskAppId);
+
+    device_policy_update.reset();
+
+    std::unique_ptr<ScopedUserPolicyUpdate> device_local_account_policy_update =
+        device_state_.RequestDeviceLocalAccountPolicyUpdate(
+            kTestKioskAccountId);
+    device_local_account_policy_update.reset();
+  }
+
+  std::unique_ptr<NetworkStateTestHelper> network_helper_;
+
+  std::unique_ptr<content::WindowedNotificationObserver> apps_loaded_waiter_;
+
+  FakeCWS fake_cws_;
+
+  DeviceStateMixin device_state_{
+      &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED};
+
+  EmbeddedTestServerSetupMixin embedded_test_server_setup_{
+      &mixin_host_, embedded_test_server()};
+
+  LoginManagerMixin login_manager_{&mixin_host_, {}};
+
+  DISALLOW_COPY_AND_ASSIGN(KioskErrorScreenTest);
+};
+
+// Verify that certificate manager dialog opens.
+IN_PROC_BROWSER_TEST_F(KioskErrorScreenTest, OpenCertificateConfig) {
+  apps_loaded_waiter()->Wait();
+  EXPECT_TRUE(test::LoginScreenTester().LaunchApp(kTestKioskAppId));
+
+  OobeScreenWaiter(ErrorScreenView::kScreenId).Wait();
+
+  DialogWindowWaiter waiter(
+      l10n_util::GetStringUTF16(IDS_CERTIFICATE_MANAGER_TITLE));
+
+  test::OobeJS().ClickOnPath({"error-message-md-configure-certs-button"});
+  waiter.Wait();
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/eula_browsertest.cc b/chrome/browser/chromeos/login/eula_browsertest.cc
index d14734aa..8878daae 100644
--- a/chrome/browser/chromeos/login/eula_browsertest.cc
+++ b/chrome/browser/chromeos/login/eula_browsertest.cc
@@ -16,10 +16,11 @@
 #include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/login/test/help_app_test_helper.h"
+#include "chrome/browser/chromeos/login/test/dialog_window_waiter.h"
 #include "chrome/browser/chromeos/login/test/js_checker.h"
 #include "chrome/browser/chromeos/login/test/oobe_base_test.h"
 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
+#include "chrome/browser/chromeos/login/test/scoped_help_app_for_test.h"
 #include "chrome/browser/chromeos/login/test/webview_content_extractor.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
@@ -27,6 +28,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
+#include "chrome/grit/generated_resources.h"
 #include "chrome/installer/util/google_update_settings.h"
 #include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
 #include "components/guest_view/browser/guest_view_manager.h"
@@ -40,6 +42,7 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
 using net::test_server::BasicHttpResponse;
@@ -354,10 +357,11 @@
   ShowEulaScreen();
 
   // Load HelperApp extension.
-  HelpAppTestHelper scoped_helper;
+  ScopedHelpAppForTest scoped_help_app;
 
   // Start listening for help dialog creation.
-  HelpAppTestHelper::Waiter waiter;
+  DialogWindowWaiter waiter(
+      l10n_util::GetStringUTF16(IDS_LOGIN_OOBE_HELP_DIALOG_TITLE));
 
   NonPolymerOobeJS().TapOnPath({"oobe-eula-md", "learn-more"});
 
@@ -366,4 +370,5 @@
 }
 
 }  // namespace
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/login_browsertest.cc b/chrome/browser/chromeos/login/login_browsertest.cc
index 9cfe343f9..03a387a3 100644
--- a/chrome/browser/chromeos/login/login_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_browsertest.cc
@@ -11,6 +11,7 @@
 #include "base/command_line.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/login/login_wizard.h"
+#include "chrome/browser/chromeos/login/test/guest_session_mixin.h"
 #include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
 #include "chrome/browser/chromeos/login/test/offline_gaia_test_mixin.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host_webui.h"
@@ -45,15 +46,9 @@
   }
 };
 
-class LoginGuestTest : public InProcessBrowserTest {
+class LoginGuestTest : public MixinBasedInProcessBrowserTest {
  protected:
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    command_line->AppendSwitch(switches::kGuestSession);
-    command_line->AppendSwitch(::switches::kIncognito);
-    command_line->AppendSwitchASCII(switches::kLoginProfile, "hash");
-    command_line->AppendSwitchASCII(
-        switches::kLoginUser, user_manager::GuestAccountId().GetUserEmail());
-  }
+  GuestSessionMixin guest_session_{&mixin_host_};
 };
 
 class LoginCursorTest : public InProcessBrowserTest {
diff --git a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
index 9b52f7b4..0a94da9 100644
--- a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
@@ -53,6 +53,7 @@
 #include "content/public/browser/notification_service.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_utils.h"
+#include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
 
@@ -78,6 +79,338 @@
   return "unknown";
 }
 
+void WaitForOobeWelcomeScreen() {
+  content::WindowedNotificationObserver observer(
+      chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
+      content::NotificationService::AllSources());
+  observer.Wait();
+  OobeScreenWaiter(WelcomeView::kScreenId).Wait();
+}
+
+void RunWelcomeScreenChecks() {
+#if defined(GOOGLE_CHROME_BUILD)
+  constexpr int kNumberOfVideosPlaying = 1;
+#else
+  constexpr int kNumberOfVideosPlaying = 0;
+#endif
+  test::OobeJS().ExpectVisiblePath({"connect", "welcomeScreen"});
+  test::OobeJS().ExpectHiddenPath({"connect", "accessibilityScreen"});
+  test::OobeJS().ExpectHiddenPath({"connect", "languageScreen"});
+  test::OobeJS().ExpectHiddenPath({"connect", "timezoneScreen"});
+
+  test::OobeJS().ExpectEQ(
+      "(() => {let cnt = 0; for (let v of "
+      "$('connect').$.welcomeScreen.root.querySelectorAll('video')) "
+      "{  cnt += v.paused ? 0 : 1; }; return cnt; })()",
+      kNumberOfVideosPlaying);
+}
+
+void TapWelcomeNext() {
+  test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
+}
+
+void WaitForNetworkSelectionScreen() {
+  OobeScreenWaiter(NetworkScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'network-selection' screen.";
+}
+
+void RunNetworkSelectionScreenChecks() {
+  test::OobeJS().ExpectTrue(
+      "!$('oobe-network-md').$.networkDialog.querySelector('oobe-next-button'"
+      ").disabled");
+}
+
+void TapNetworkSelectionNext() {
+  test::OobeJS().ExecuteAsync(
+      "$('oobe-network-md').$.networkDialog.querySelector('oobe-next-button')"
+      ".click()");
+}
+
+#if defined(GOOGLE_CHROME_BUILD)
+void WaitForEulaScreen() {
+  OobeScreenWaiter(EulaView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'eula' screen.";
+}
+
+void RunEulaScreenChecks() {
+  // Wait for actual EULA to appear.
+  test::OobeJS()
+      .CreateVisibilityWaiter(true, {"oobe-eula-md", "eulaDialog"})
+      ->Wait();
+  test::OobeJS().ExpectTrue("!$('oobe-eula-md').$.acceptButton.disabled");
+}
+
+void TapEulaAccept() {
+  test::OobeJS().TapOnPath({"oobe-eula-md", "acceptButton"});
+}
+#endif
+
+void WaitForUpdateScreen() {
+  OobeScreenWaiter(UpdateView::kScreenId).Wait();
+  test::OobeJS().CreateVisibilityWaiter(true, {"update"})->Wait();
+
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'update' screen.";
+}
+
+void ExitUpdateScreenNoUpdate() {
+  UpdateScreen* screen = static_cast<UpdateScreen*>(
+      WizardController::default_controller()->GetScreen(UpdateView::kScreenId));
+  UpdateEngineClient::Status status;
+  status.status = UpdateEngineClient::UPDATE_STATUS_ERROR;
+  screen->UpdateStatusChanged(status);
+}
+
+void WaitForGaiaSignInScreen(bool arc_available) {
+  OobeScreenWaiter(GaiaView::kScreenId).Wait();
+
+  // Arc terms of service content gets preloaded when GAIA screen is shown,
+  // wait for the preload to finish before proceeding - requesting reload
+  // (which may happen when ARC terms of service screen is show) before the
+  // preload is done may cause flaky load failures.
+  // TODO(https://crbug/com/959902): Fix ARC terms of service screen to better
+  //     handle this case.
+  if (arc_available) {
+    test::OobeJS()
+        .CreateHasClassWaiter(true, "arc-tos-loaded",
+                              {"arc-tos-root", "arc-tos-dialog"})
+        ->Wait();
+  }
+
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'gaia-signin' screen.";
+}
+
+void LogInAsRegularUser() {
+  LoginDisplayHost::default_host()
+      ->GetOobeUI()
+      ->GetView<GaiaScreenHandler>()
+      ->ShowSigninScreenForTest(FakeGaiaMixin::kFakeUserEmail,
+                                FakeGaiaMixin::kFakeUserPassword,
+                                FakeGaiaMixin::kEmptyUserServices);
+  LOG(INFO) << "OobeInteractiveUITest: Logged in.";
+}
+
+#if defined(GOOGLE_CHROME_BUILD)
+void WaitForSyncConsentScreen() {
+  LOG(INFO) << "OobeInteractiveUITest: Waiting for 'sync-consent' screen.";
+  OobeScreenWaiter(SyncConsentScreenView::kScreenId).Wait();
+}
+
+void ExitScreenSyncConsent() {
+  SyncConsentScreen* screen = static_cast<SyncConsentScreen*>(
+      WizardController::default_controller()->GetScreen(
+          SyncConsentScreenView::kScreenId));
+
+  screen->SetProfileSyncDisabledByPolicyForTesting(true);
+  screen->OnStateChanged(nullptr);
+  LOG(INFO) << "OobeInteractiveUITest: Waiting for 'sync-consent' screen "
+               "to close.";
+  OobeScreenExitWaiter(SyncConsentScreenView::kScreenId).Wait();
+}
+#endif
+
+void WaitForFingerprintScreen() {
+  LOG(INFO) << "OobeInteractiveUITest: Waiting for 'fingerprint-setup' screen.";
+  OobeScreenWaiter(FingerprintSetupScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup screen "
+               "to show.";
+  test::OobeJS().CreateVisibilityWaiter(true, {"fingerprint-setup"})->Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup screen "
+               "to initializes.";
+  test::OobeJS()
+      .CreateVisibilityWaiter(true, {"fingerprint-setup-impl"})
+      ->Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup screen "
+               "to show setupFingerprint.";
+  test::OobeJS()
+      .CreateVisibilityWaiter(true,
+                              {"fingerprint-setup-impl", "setupFingerprint"})
+      ->Wait();
+}
+
+void RunFingerprintScreenChecks() {
+  test::OobeJS().ExpectVisible("fingerprint-setup");
+  test::OobeJS().ExpectVisible("fingerprint-setup-impl");
+  test::OobeJS().ExpectVisiblePath(
+      {"fingerprint-setup-impl", "setupFingerprint"});
+  test::OobeJS().TapOnPath(
+      {"fingerprint-setup-impl", "showSensorLocationButton"});
+  test::OobeJS().ExpectHiddenPath(
+      {"fingerprint-setup-impl", "setupFingerprint"});
+  LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup "
+               "to switch to placeFinger.";
+  test::OobeJS()
+      .CreateVisibilityWaiter(true, {"fingerprint-setup-impl", "placeFinger"})
+      ->Wait();
+}
+
+void ExitFingerprintPinSetupScreen() {
+  test::OobeJS().ExpectVisiblePath({"fingerprint-setup-impl", "placeFinger"});
+  // This might be the last step in flow. Synchronious execute gets stuck as
+  // WebContents may be destroyed in the process. So it may never return.
+  // So we use ExecuteAsync() here.
+  test::OobeJS().ExecuteAsync(
+      "$('fingerprint-setup-impl').$.setupFingerprintLater.click()");
+  LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup screen "
+               "to close.";
+  OobeScreenExitWaiter(FingerprintSetupScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: 'fingerprint-setup' screen done.";
+}
+
+void WaitForDiscoverScreen() {
+  OobeScreenWaiter(DiscoverScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'discover' screen.";
+}
+
+void RunDiscoverScreenChecks() {
+  test::OobeJS().ExpectVisible("discover");
+  test::OobeJS().ExpectVisible("discover-impl");
+  test::OobeJS().ExpectTrue(
+      "!$('discover-impl').root.querySelector('discover-pin-setup-module')."
+      "hidden");
+  test::OobeJS().ExpectTrue(
+      "!$('discover-impl').root.querySelector('discover-pin-setup-module').$."
+      "setup.hidden");
+}
+
+void ExitDiscoverPinSetupScreen() {
+  // This might be the last step in flow. Synchronious execute gets stuck as
+  // WebContents may be destroyed in the process. So it may never return.
+  // So we use ExecuteAsync() here.
+  test::OobeJS().ExecuteAsync(
+      "$('discover-impl').root.querySelector('discover-pin-setup-module')."
+      "$.setupSkipButton.click()");
+  OobeScreenExitWaiter(DiscoverScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: 'discover' screen done.";
+}
+
+// Waits for the ARC terms of service screen to be shown, it accepts or
+// declines the terms based in |accept_terms| value, and waits for the flow to
+// leave the ARC terms of service screen.
+void HandleArcTermsOfServiceScreen(bool accept_terms) {
+  OobeScreenWaiter(ArcTermsOfServiceScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'arc-tos' screen.";
+
+  test::OobeJS()
+      .CreateEnabledWaiter(true, {"arc-tos-root", "arc-tos-next-button"})
+      ->Wait();
+  test::OobeJS().Evaluate(
+      test::GetOobeElementPath({"arc-tos-root", "arc-tos-next-button"}) +
+      ".click()");
+  test::OobeJS()
+      .CreateVisibilityWaiter(true, {"arc-tos-root", "arc-location-service"})
+      ->Wait();
+  test::OobeJS()
+      .CreateVisibilityWaiter(true, {"arc-tos-root", "arc-tos-accept-button"})
+      ->Wait();
+
+  const std::string button_to_click =
+      accept_terms ? "arc-tos-accept-button" : "arc-tos-skip-button";
+  test::OobeJS().Evaluate(
+      test::GetOobeElementPath({"arc-tos-root", button_to_click}) + ".click()");
+
+  OobeScreenExitWaiter(ArcTermsOfServiceScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: 'arc-tos' screen done.";
+}
+
+// Waits for the recommend apps screen to be shown, selects the single app
+// reported by FakeRecommendAppsFetcher, and requests the apps install. It
+// will wait for the flow to progress away from the RecommendAppsScreen before
+// returning.
+// This assumes that ARC terms of service have bee accepted in
+// HandleArcTermsOfServiceScreen.
+void HandleRecommendAppsScreen() {
+  OobeScreenWaiter(RecommendAppsScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'recommend-apps' screen.";
+
+  test::OobeJS()
+      .CreateDisplayedWaiter(true, {"recommend-apps-screen", "app-list-view"})
+      ->Wait();
+
+  std::string toggle_apps_script = base::StringPrintf(
+      "(function() {"
+      "  if (!document.getElementById('recommend-apps-container'))"
+      "    return false;"
+      "  var items ="
+      "      Array.from(document.getElementById('recommend-apps-container')"
+      "         .querySelectorAll('.item') || [])"
+      "         .filter(i => '%s' == i.getAttribute('data-packagename'));"
+      "  if (items.length == 0)"
+      "    return false;"
+      "  items.forEach(i => i.querySelector('.image-picker').click());"
+      "  return true;"
+      "})();",
+      "test.package");
+
+  const std::string webview_path =
+      test::GetOobeElementPath({"recommend-apps-screen", "app-list-view"});
+  const std::string script = base::StringPrintf(
+      "(function() {"
+      "  var toggleApp = function() {"
+      "    %s.executeScript({code: \"%s\"}, r => {"
+      "      if (!r || !r[0]) {"
+      "        setTimeout(toggleApp, 50);"
+      "        return;"
+      "      }"
+      "      window.domAutomationController.send(true);"
+      "    });"
+      "  };"
+      "  toggleApp();"
+      "})();",
+      webview_path.c_str(), toggle_apps_script.c_str());
+
+  bool result;
+  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
+      LoginDisplayHost::default_host()->GetOobeWebContents(), script, &result));
+  EXPECT_TRUE(result);
+
+  const std::initializer_list<base::StringPiece> install_button = {
+      "recommend-apps-screen", "recommend-apps-install-button"};
+  test::OobeJS().CreateEnabledWaiter(true, install_button)->Wait();
+  test::OobeJS().TapOnPath(install_button);
+
+  OobeScreenExitWaiter(RecommendAppsScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: 'recommend-apps' screen done.";
+}
+
+// Waits for AppDownloadingScreen to be shown, clicks 'Continue' button, and
+// waits until the flow moves to the next screen. This assumes that an app was
+// selected in HandleRecommendAppsScreen.
+void HandleAppDownloadingScreen() {
+  OobeScreenWaiter(AppDownloadingScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'app-downloading' screen.";
+
+  const std::initializer_list<base::StringPiece> continue_button = {
+      "app-downloading-screen", "app-downloading-continue-setup-button"};
+  test::OobeJS().TapOnPath(continue_button);
+
+  OobeScreenExitWaiter(AppDownloadingScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: 'app-downloading' screen done.";
+}
+
+// Waits for AssistantOptInFlowScreen to be shown, skips the opt-in, and waits
+// for the flow to move away from the screen.
+// Note that due to test setup, the screen will fail to load assistant value
+// proposal error (as the URL is not faked in this test), and display an
+// error, This is good enough for this tests, whose goal is to verify the
+// screen is shown, and how the setup progresses after the screen. The actual
+// assistant opt-in flow is tested separately.
+void HandleAssistantOptInScreen() {
+  OobeScreenWaiter(AssistantOptInFlowScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: Switched to 'assistant-optin' screen.";
+
+  test::OobeJS()
+      .CreateVisibilityWaiter(true, {"assistant-optin-flow-card", "loading"})
+      ->Wait();
+
+  std::initializer_list<base::StringPiece> skip_button_path = {
+      "assistant-optin-flow-card", "loading", "skip-button"};
+  test::OobeJS().CreateEnabledWaiter(true, skip_button_path)->Wait();
+  test::OobeJS().TapOnPath(skip_button_path);
+
+  OobeScreenExitWaiter(AssistantOptInFlowScreenView::kScreenId).Wait();
+  LOG(INFO) << "OobeInteractiveUITest: 'assistant-optin' screen done.";
+}
+
 class FakeRecommendAppsFetcher : public RecommendAppsFetcher {
  public:
   explicit FakeRecommendAppsFetcher(RecommendAppsFetcherDelegate* delegate)
@@ -103,20 +436,30 @@
   return std::make_unique<FakeRecommendAppsFetcher>(delegate);
 }
 
-class ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver {
+class ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver
+    : public extensions::QuickUnlockPrivateGetAuthTokenFunction::TestObserver {
  public:
-  explicit ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver(
-      extensions::QuickUnlockPrivateGetAuthTokenFunction::TestObserver*
-          observer) {
-    extensions::QuickUnlockPrivateGetAuthTokenFunction::SetTestObserver(
-        observer);
+  ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver() {
+    extensions::QuickUnlockPrivateGetAuthTokenFunction::SetTestObserver(this);
   }
+
   ~ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver() {
     extensions::QuickUnlockPrivateGetAuthTokenFunction::SetTestObserver(
         nullptr);
   }
 
+  // extensions::QuickUnlockPrivateGetAuthTokenFunction::TestObserver:
+  void OnGetAuthTokenCalled(const std::string& password) override {
+    get_auth_token_password_ = password;
+  }
+
+  const base::Optional<std::string>& get_auth_token_password() const {
+    return get_auth_token_password_;
+  }
+
  private:
+  base::Optional<std::string> get_auth_token_password_;
+
   DISALLOW_COPY_AND_ASSIGN(
       ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver);
 };
@@ -242,7 +585,6 @@
 
 class OobeInteractiveUITest
     : public OobeBaseTest,
-      public extensions::QuickUnlockPrivateGetAuthTokenFunction::TestObserver,
       public ::testing::WithParamInterface<std::tuple<bool, bool, ArcState>> {
  public:
   OobeInteractiveUITest() = default;
@@ -259,351 +601,22 @@
     OobeBaseTest::TearDownOnMainThread();
   }
 
-  // QuickUnlockPrivateGetAuthTokenFunction::TestObserver:
-  void OnGetAuthTokenCalled(const std::string& password) override {
-    quick_unlock_private_get_auth_token_password_ = password;
-  }
-
   void WaitForLoginDisplayHostShutdown() {
     if (!LoginDisplayHost::default_host())
       return;
 
-    LOG(INFO)
-        << "OobeInteractiveUITest: Waiting for LoginDisplayHost to shut down.";
+    LOG(INFO) << "OobeInteractiveUITest: Waiting for LoginDisplayHost to "
+                 "shut down.";
     test::TestPredicateWaiter(base::BindRepeating([]() {
       return !LoginDisplayHost::default_host();
     })).Wait();
     LOG(INFO) << "OobeInteractiveUITest: LoginDisplayHost is down.";
   }
 
-  void WaitForOobeWelcomeScreen() {
-    content::WindowedNotificationObserver observer(
-        chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
-        content::NotificationService::AllSources());
-    observer.Wait();
-    OobeScreenWaiter(WelcomeView::kScreenId).Wait();
-  }
-
-  void RunWelcomeScreenChecks() {
-#if defined(GOOGLE_CHROME_BUILD)
-    constexpr int kNumberOfVideosPlaying = 1;
-#else
-    constexpr int kNumberOfVideosPlaying = 0;
-#endif
-    test::OobeJS().ExpectVisiblePath({"connect", "welcomeScreen"});
-    test::OobeJS().ExpectHiddenPath({"connect", "accessibilityScreen"});
-    test::OobeJS().ExpectHiddenPath({"connect", "languageScreen"});
-    test::OobeJS().ExpectHiddenPath({"connect", "timezoneScreen"});
-
-    test::OobeJS().ExpectEQ(
-        "(() => {let cnt = 0; for (let v of "
-        "$('connect').$.welcomeScreen.root.querySelectorAll('video')) "
-        "{  cnt += v.paused ? 0 : 1; }; return cnt; })()",
-        kNumberOfVideosPlaying);
-  }
-
-  void TapWelcomeNext() {
-    test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
-  }
-
-  void WaitForNetworkSelectionScreen() {
-    OobeScreenWaiter(NetworkScreenView::kScreenId).Wait();
-    LOG(INFO)
-        << "OobeInteractiveUITest: Switched to 'network-selection' screen.";
-  }
-
-  void RunNetworkSelectionScreenChecks() {
-    test::OobeJS().ExpectTrue(
-        "!$('oobe-network-md').$.networkDialog.querySelector('oobe-next-button'"
-        ").disabled");
-  }
-
-  void TapNetworkSelectionNext() {
-    test::OobeJS().ExecuteAsync(
-        "$('oobe-network-md').$.networkDialog.querySelector('oobe-next-button')"
-        ".click()");
-  }
-
-  void WaitForEulaScreen() {
-    OobeScreenWaiter(EulaView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Switched to 'eula' screen.";
-  }
-
-  void RunEulaScreenChecks() {
-    // Wait for actual EULA to appear.
-    test::OobeJS()
-        .CreateVisibilityWaiter(true, {"oobe-eula-md", "eulaDialog"})
-        ->Wait();
-    test::OobeJS().ExpectTrue("!$('oobe-eula-md').$.acceptButton.disabled");
-  }
-
-  void TapEulaAccept() {
-    test::OobeJS().TapOnPath({"oobe-eula-md", "acceptButton"});
-  }
-
-  void WaitForUpdateScreen() {
-    OobeScreenWaiter(UpdateView::kScreenId).Wait();
-    test::OobeJS().CreateVisibilityWaiter(true, {"update"})->Wait();
-
-    LOG(INFO) << "OobeInteractiveUITest: Switched to 'update' screen.";
-  }
-
-  void ExitUpdateScreenNoUpdate() {
-    UpdateScreen* screen = static_cast<UpdateScreen*>(
-        WizardController::default_controller()->GetScreen(
-            UpdateView::kScreenId));
-    UpdateEngineClient::Status status;
-    status.status = UpdateEngineClient::UPDATE_STATUS_ERROR;
-    screen->UpdateStatusChanged(status);
-  }
-
-  void WaitForGaiaSignInScreen() {
-    OobeScreenWaiter(GaiaView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Switched to 'gaia-signin' screen.";
-  }
-
-  void LogInAsRegularUser() {
-    LoginDisplayHost::default_host()
-        ->GetOobeUI()
-        ->GetView<GaiaScreenHandler>()
-        ->ShowSigninScreenForTest(FakeGaiaMixin::kFakeUserEmail,
-                                  FakeGaiaMixin::kFakeUserPassword,
-                                  FakeGaiaMixin::kEmptyUserServices);
-    LOG(INFO) << "OobeInteractiveUITest: Logged in.";
-  }
-
-  void WaitForSyncConsentScreen() {
-    LOG(INFO) << "OobeInteractiveUITest: Waiting for 'sync-consent' screen.";
-    OobeScreenWaiter(SyncConsentScreenView::kScreenId).Wait();
-  }
-
-  void ExitScreenSyncConsent() {
-    SyncConsentScreen* screen = static_cast<SyncConsentScreen*>(
-        WizardController::default_controller()->GetScreen(
-            SyncConsentScreenView::kScreenId));
-
-    screen->SetProfileSyncDisabledByPolicyForTesting(true);
-    screen->OnStateChanged(nullptr);
-    LOG(INFO) << "OobeInteractiveUITest: Waiting for 'sync-consent' screen "
-                 "to close.";
-    OobeScreenExitWaiter(SyncConsentScreenView::kScreenId).Wait();
-  }
-
-  void WaitForFingerprintScreen() {
-    LOG(INFO)
-        << "OobeInteractiveUITest: Waiting for 'fingerprint-setup' screen.";
-    OobeScreenWaiter(FingerprintSetupScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup screen "
-                 "to show.";
-    test::OobeJS().CreateVisibilityWaiter(true, {"fingerprint-setup"})->Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup screen "
-                 "to initializes.";
-    test::OobeJS()
-        .CreateVisibilityWaiter(true, {"fingerprint-setup-impl"})
-        ->Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup screen "
-                 "to show setupFingerprint.";
-    test::OobeJS()
-        .CreateVisibilityWaiter(true,
-                                {"fingerprint-setup-impl", "setupFingerprint"})
-        ->Wait();
-  }
-
-  void RunFingerprintScreenChecks() {
-    test::OobeJS().ExpectVisible("fingerprint-setup");
-    test::OobeJS().ExpectVisible("fingerprint-setup-impl");
-    test::OobeJS().ExpectVisiblePath(
-        {"fingerprint-setup-impl", "setupFingerprint"});
-    test::OobeJS().TapOnPath(
-        {"fingerprint-setup-impl", "showSensorLocationButton"});
-    test::OobeJS().ExpectHiddenPath(
-        {"fingerprint-setup-impl", "setupFingerprint"});
-    LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup "
-                 "to switch to placeFinger.";
-    test::OobeJS()
-        .CreateVisibilityWaiter(true, {"fingerprint-setup-impl", "placeFinger"})
-        ->Wait();
-  }
-
-  void ExitFingerprintPinSetupScreen() {
-    test::OobeJS().ExpectVisiblePath({"fingerprint-setup-impl", "placeFinger"});
-    // This might be the last step in flow. Synchronious execute gets stuck as
-    // WebContents may be destroyed in the process. So it may never return.
-    // So we use ExecuteAsync() here.
-    test::OobeJS().ExecuteAsync(
-        "$('fingerprint-setup-impl').$.setupFingerprintLater.click()");
-    LOG(INFO) << "OobeInteractiveUITest: Waiting for fingerprint setup screen "
-                 "to close.";
-    OobeScreenExitWaiter(FingerprintSetupScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: 'fingerprint-setup' screen done.";
-  }
-
-  void WaitForDiscoverScreen() {
-    OobeScreenWaiter(DiscoverScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Switched to 'discover' screen.";
-  }
-
-  void RunDiscoverScreenChecks() {
-    test::OobeJS().ExpectVisible("discover");
-    test::OobeJS().ExpectVisible("discover-impl");
-    test::OobeJS().ExpectTrue(
-        "!$('discover-impl').root.querySelector('discover-pin-setup-module')."
-        "hidden");
-    test::OobeJS().ExpectTrue(
-        "!$('discover-impl').root.querySelector('discover-pin-setup-module').$."
-        "setup.hidden");
-    EXPECT_TRUE(quick_unlock_private_get_auth_token_password_.has_value());
-    EXPECT_EQ(quick_unlock_private_get_auth_token_password_,
-              FakeGaiaMixin::kFakeUserPassword);
-  }
-
-  void ExitDiscoverPinSetupScreen() {
-    // This might be the last step in flow. Synchronious execute gets stuck as
-    // WebContents may be destroyed in the process. So it may never return.
-    // So we use ExecuteAsync() here.
-    test::OobeJS().ExecuteAsync(
-        "$('discover-impl').root.querySelector('discover-pin-setup-module')."
-        "$.setupSkipButton.click()");
-    OobeScreenExitWaiter(DiscoverScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: 'discover' screen done.";
-  }
-
-  // Waits for the ARC terms of service screen to be shown, it accepts or
-  // declines the terms based in |accept_terms| value, and waits for the flow to
-  // leave the ARC terms of service screen.
-  void HandleArcTermsOfServiceScreen(bool accept_terms) {
-    OobeScreenWaiter(ArcTermsOfServiceScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Switched to 'arc-tos' screen.";
-
-    test::OobeJS()
-        .CreateEnabledWaiter(true, {"arc-tos-root", "arc-tos-next-button"})
-        ->Wait();
-    test::OobeJS().Evaluate(
-        test::GetOobeElementPath({"arc-tos-root", "arc-tos-next-button"}) +
-        ".click()");
-    test::OobeJS()
-        .CreateVisibilityWaiter(true, {"arc-tos-root", "arc-location-service"})
-        ->Wait();
-    test::OobeJS()
-        .CreateVisibilityWaiter(true, {"arc-tos-root", "arc-tos-accept-button"})
-        ->Wait();
-
-    const std::string button_to_click =
-        accept_terms ? "arc-tos-accept-button" : "arc-tos-skip-button";
-    test::OobeJS().Evaluate(
-        test::GetOobeElementPath({"arc-tos-root", button_to_click}) +
-        ".click()");
-
-    OobeScreenExitWaiter(ArcTermsOfServiceScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: 'arc-tos' screen done.";
-  }
-
-  // Waits for the recommend apps screen to be shown, selects the single app
-  // reported by FakeRecommendAppsFetcher, and requests the apps install. It
-  // will wait for the flow to progress away from the RecommendAppsScreen before
-  // returning.
-  // This assumes that ARC terms of service have bee accepted in
-  // HandleArcTermsOfServiceScreen.
-  void HandleRecommendAppsScreen() {
-    OobeScreenWaiter(RecommendAppsScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Switched to 'recommend-apps' screen.";
-
-    test::OobeJS()
-        .CreateDisplayedWaiter(true, {"recommend-apps-screen", "app-list-view"})
-        ->Wait();
-
-    std::string toggle_apps_script = base::StringPrintf(
-        "(function() {"
-        "  if (!document.getElementById('recommend-apps-container'))"
-        "    return false;"
-        "  var items ="
-        "      Array.from(document.getElementById('recommend-apps-container')"
-        "         .querySelectorAll('.item') || [])"
-        "         .filter(i => '%s' == i.getAttribute('data-packagename'));"
-        "  if (items.length == 0)"
-        "    return false;"
-        "  items.forEach(i => i.querySelector('.image-picker').click());"
-        "  return true;"
-        "})();",
-        "test.package");
-
-    const std::string webview_path =
-        test::GetOobeElementPath({"recommend-apps-screen", "app-list-view"});
-    const std::string script = base::StringPrintf(
-        "(function() {"
-        "  var toggleApp = function() {"
-        "    %s.executeScript({code: \"%s\"}, r => {"
-        "      if (!r || !r[0]) {"
-        "        setTimeout(toggleApp, 50);"
-        "        return;"
-        "      }"
-        "      window.domAutomationController.send(true);"
-        "    });"
-        "  };"
-        "  toggleApp();"
-        "})();",
-        webview_path.c_str(), toggle_apps_script.c_str());
-
-    bool result;
-    ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
-        LoginDisplayHost::default_host()->GetOobeWebContents(), script,
-        &result));
-    EXPECT_TRUE(result);
-
-    const std::initializer_list<base::StringPiece> install_button = {
-        "recommend-apps-screen", "recommend-apps-install-button"};
-    test::OobeJS().CreateEnabledWaiter(true, install_button)->Wait();
-    test::OobeJS().TapOnPath(install_button);
-
-    OobeScreenExitWaiter(RecommendAppsScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: 'recommend-apps' screen done.";
-  }
-
-  // Waits for AppDownloadingScreen to be shown, clicks 'Continue' button, and
-  // waits until the flow moves to the next screen. This assumes that an app was
-  // selected in HandleRecommendAppsScreen.
-  void HandleAppDownloadingScreen() {
-    OobeScreenWaiter(AppDownloadingScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Switched to 'app-downloading' screen.";
-
-    const std::initializer_list<base::StringPiece> continue_button = {
-        "app-downloading-screen", "app-downloading-continue-setup-button"};
-    test::OobeJS().TapOnPath(continue_button);
-
-    OobeScreenExitWaiter(AppDownloadingScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: 'app-downloading' screen done.";
-  }
-
-  // Waits for AssistantOptInFlowScreen to be shown, skips the opt-in, and waits
-  // for the flow to move away from the screen.
-  // Note that due to test setup, the screen will fail to load assistant value
-  // proposal error (as the URL is not faked in this test), and display an
-  // error, This is good enough for this tests, whose goal is to verify the
-  // screen is shown, and how the setup progresses after the screen. The actual
-  // assistant opt-in flow is tested separately.
-  void HandleAssistantOptInScreen() {
-    OobeScreenWaiter(AssistantOptInFlowScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: Switched to 'assistant-optin' screen.";
-
-    test::OobeJS()
-        .CreateVisibilityWaiter(true, {"assistant-optin-flow-card", "loading"})
-        ->Wait();
-
-    std::initializer_list<base::StringPiece> skip_button_path = {
-        "assistant-optin-flow-card", "loading", "skip-button"};
-    test::OobeJS().CreateEnabledWaiter(true, skip_button_path)->Wait();
-    test::OobeJS().TapOnPath(skip_button_path);
-
-    OobeScreenExitWaiter(AssistantOptInFlowScreenView::kScreenId).Wait();
-    LOG(INFO) << "OobeInteractiveUITest: 'assistant-optin' screen done.";
-  }
-
   void SimpleEndToEnd();
 
   const OobeEndToEndTestSetupMixin* test_setup() const { return &setup_; }
 
-  base::Optional<std::string> quick_unlock_private_get_auth_token_password_;
-
  private:
   FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()};
 
@@ -616,7 +629,7 @@
 };
 
 void OobeInteractiveUITest::SimpleEndToEnd() {
-  ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver scoped_observer(this);
+  ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver get_auth_token_observer;
 
   WaitForOobeWelcomeScreen();
   RunWelcomeScreenChecks();
@@ -634,21 +647,8 @@
 
   WaitForUpdateScreen();
   ExitUpdateScreenNoUpdate();
-  WaitForGaiaSignInScreen();
 
-  // Arc terms of service content gets preloaded when GAIA screen is shown, wait
-  // for the preload to finish before proceeding - requesting reload (which may
-  // happen when ARC terms of service screen is show) before the preload is done
-  // may cause flaky load failures.
-  // TODO(https://crbug/com/959902): Fix ARC terms of service screen to better
-  //     handle this case.
-  if (test_setup()->arc_state() != ArcState::kNotAvailable) {
-    test::OobeJS()
-        .CreateHasClassWaiter(true, "arc-tos-loaded",
-                              {"arc-tos-root", "arc-tos-dialog"})
-        ->Wait();
-  }
-
+  WaitForGaiaSignInScreen(test_setup()->arc_state() != ArcState::kNotAvailable);
   LogInAsRegularUser();
 
 #if defined(GOOGLE_CHROME_BUILD)
@@ -665,6 +665,11 @@
   if (test_setup()->is_tablet()) {
     WaitForDiscoverScreen();
     RunDiscoverScreenChecks();
+
+    EXPECT_TRUE(get_auth_token_observer.get_auth_token_password().has_value());
+    EXPECT_EQ(get_auth_token_observer.get_auth_token_password().value(),
+              FakeGaiaMixin::kFakeUserPassword);
+
     ExitDiscoverPinSetupScreen();
   }
 
@@ -805,4 +810,106 @@
                      testing::Values(ArcState::kNotAvailable,
                                      ArcState::kDeclineTerms)));
 
+class EphemeralUserOobeTest
+    : public MixinBasedInProcessBrowserTest,
+      public ::testing::WithParamInterface<std::tuple<bool, bool, ArcState>> {
+ public:
+  EphemeralUserOobeTest() { login_manager_.set_should_launch_browser(true); }
+  ~EphemeralUserOobeTest() override = default;
+
+  // MixinBaseInProcessBrowserTest:
+  void SetUpInProcessBrowserTestFixture() override {
+    std::unique_ptr<ScopedDevicePolicyUpdate> device_policy_update =
+        device_state_.RequestDevicePolicyUpdate();
+    device_policy_update->policy_payload()
+        ->mutable_ephemeral_users_enabled()
+        ->set_ephemeral_users_enabled(true);
+    device_policy_update.reset();
+
+    MixinBasedInProcessBrowserTest::SetUpInProcessBrowserTestFixture();
+  }
+
+  void SetUpOnMainThread() override {
+    host_resolver()->AddRule("*", "127.0.0.1");
+
+    base::RunLoop run_loop;
+    if (!LoginDisplayHost::default_host()->GetOobeUI()->IsJSReady(
+            run_loop.QuitClosure())) {
+      run_loop.Run();
+    }
+
+    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
+  }
+
+  void WaitForActiveSession() { login_manager_.WaitForActiveSession(); }
+
+  const OobeEndToEndTestSetupMixin* test_setup() const { return &setup_; }
+
+ private:
+  EmbeddedTestServerSetupMixin gaia_server_setup_{&mixin_host_,
+                                                  embedded_test_server()};
+  FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()};
+
+  net::EmbeddedTestServer arc_tos_server_{net::EmbeddedTestServer::TYPE_HTTPS};
+  EmbeddedTestServerSetupMixin arc_tos_server_setup_{&mixin_host_,
+                                                     &arc_tos_server_};
+  OobeEndToEndTestSetupMixin setup_{&mixin_host_, &arc_tos_server_, GetParam()};
+
+  LoginManagerMixin login_manager_{&mixin_host_, {}};
+  DeviceStateMixin device_state_{
+      &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED};
+};
+
+IN_PROC_BROWSER_TEST_P(EphemeralUserOobeTest, RegularEphemeralUser) {
+  ScopedQuickUnlockPrivateGetAuthTokenFunctionObserver get_auth_token_observer;
+
+  WaitForGaiaSignInScreen(test_setup()->arc_state() != ArcState::kNotAvailable);
+  LogInAsRegularUser();
+
+#if defined(GOOGLE_CHROME_BUILD)
+  WaitForSyncConsentScreen();
+  ExitScreenSyncConsent();
+#endif
+
+  if (test_setup()->is_quick_unlock_enabled()) {
+    WaitForFingerprintScreen();
+    RunFingerprintScreenChecks();
+    ExitFingerprintPinSetupScreen();
+  }
+
+  if (test_setup()->is_tablet()) {
+    WaitForDiscoverScreen();
+    RunDiscoverScreenChecks();
+
+    EXPECT_TRUE(get_auth_token_observer.get_auth_token_password().has_value());
+    EXPECT_EQ("", get_auth_token_observer.get_auth_token_password().value());
+
+    ExitDiscoverPinSetupScreen();
+  }
+
+  if (test_setup()->arc_state() != ArcState::kNotAvailable) {
+    HandleArcTermsOfServiceScreen(test_setup()->arc_state() ==
+                                  ArcState::kAcceptTerms);
+  }
+
+  if (test_setup()->arc_state() == ArcState::kAcceptTerms) {
+    HandleRecommendAppsScreen();
+    HandleAppDownloadingScreen();
+  }
+
+  if (test_setup()->arc_state() != ArcState::kNotAvailable) {
+    HandleAssistantOptInScreen();
+  }
+
+  WaitForActiveSession();
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    EphemeralUserOobeTestImpl,
+    EphemeralUserOobeTest,
+    testing::Combine(testing::Bool(),
+                     testing::Bool(),
+                     testing::Values(ArcState::kNotAvailable,
+                                     ArcState::kAcceptTerms,
+                                     ArcState::kDeclineTerms)));
 }  //  namespace chromeos
diff --git a/chrome/browser/chromeos/login/saml/saml_browsertest.cc b/chrome/browser/chromeos/login/saml/saml_browsertest.cc
index a985f84..6541da3 100644
--- a/chrome/browser/chromeos/login/saml/saml_browsertest.cc
+++ b/chrome/browser/chromeos/login/saml/saml_browsertest.cc
@@ -396,9 +396,9 @@
   void SetupAuthFlowChangeListener() {
     content::ExecuteScriptAsync(
         GetLoginUI()->GetWebContents(),
-        "$('gaia-signin').gaiaAuthHost_.addEventListener('authFlowChange',"
+        "$('gaia-signin').authenticator_.addEventListener('authFlowChange',"
         "    function f() {"
-        "      $('gaia-signin').gaiaAuthHost_.removeEventListener("
+        "      $('gaia-signin').authenticator_.removeEventListener("
         "          'authFlowChange', f);"
         "      window.domAutomationController.send("
         "          $('gaia-signin').isSAML() ? 'SamlLoaded' : 'GaiaLoaded');"
@@ -480,7 +480,6 @@
   StartSamlAndWaitForIdpPageLoad(kFirstSAMLUserEmail);
 
   // Saml flow UI expectations.
-  test::OobeJS().ExpectHasClass("full-width", {"gaia-signin"});
   test::OobeJS().ExpectVisible("saml-notice-container");
   std::string js = "$('saml-notice-message').textContent.indexOf('$Host') > -1";
   base::ReplaceSubstringsAfterOffset(&js, 0, "$Host", kIdPHost);
@@ -499,7 +498,7 @@
   } while (message != "\"GaiaLoaded\"");
 
   // Saml flow is gone.
-  test::OobeJS().ExpectHasNoClass("full-width", {"gaia-signin"});
+  test::OobeJS().ExpectHidden("saml-notice-container");
 }
 
 // Tests the sign-in flow when the credentials passing API is used.
@@ -541,7 +540,7 @@
   // Make sure that the password is scraped correctly.
   ASSERT_TRUE(content::ExecuteScript(
       GetLoginUI()->GetWebContents(),
-      "$('gaia-signin').gaiaAuthHost_.addEventListener('authCompleted',"
+      "$('gaia-signin').authenticator_.addEventListener('authCompleted',"
       "    function(e) {"
       "      var password = e.detail.password;"
       "      window.domAutomationController.send(password);"
@@ -744,14 +743,14 @@
       "var processEventsAndSendIfHostFound = function() {"
       "  window.setTimeout(function() {"
       "    if (sendIfHostFound()) {"
-      "      $('gaia-signin').gaiaAuthHost_.removeEventListener("
+      "      $('gaia-signin').authenticator_.removeEventListener("
       "          'authDomainChange',"
       "          processEventsAndSendIfHostFound);"
       "    }"
       "  }, 0);"
       "};"
       "if (!sendIfHostFound()) {"
-      "  $('gaia-signin').gaiaAuthHost_.addEventListener("
+      "  $('gaia-signin').authenticator_.addEventListener("
       "      'authDomainChange',"
       "      processEventsAndSendIfHostFound);"
       "}";
@@ -1089,7 +1088,7 @@
   content::DOMMessageQueue message_queue;
   ASSERT_TRUE(content::ExecuteScript(
       GetLoginUI()->GetWebContents(),
-      "$('gaia-signin').gaiaAuthHost_.addEventListener('ready', function() {"
+      "$('gaia-signin').authenticator_.addEventListener('ready', function() {"
       "  window.domAutomationController.send('ready');"
       "});"));
   ASSERT_TRUE(test::LoginScreenTester().ClickAddUserButton());
@@ -1147,7 +1146,7 @@
   content::DOMMessageQueue message_queue;
   ASSERT_TRUE(content::ExecuteScript(
       GetLoginUI()->GetWebContents(),
-      "$('gaia-signin').gaiaAuthHost_.addEventListener('ready', function() {"
+      "$('gaia-signin').authenticator_.addEventListener('ready', function() {"
       "  window.domAutomationController.send('ready');"
       "});"
       "$('saml-interstitial').changeAccountLink.click();"));
diff --git a/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.cc b/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.cc
index b54f02c..afa99f4 100644
--- a/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.cc
+++ b/chrome/browser/chromeos/login/saml/saml_password_expiry_notification.cc
@@ -16,9 +16,8 @@
 #include "chrome/browser/notifications/notification_display_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/ash/chrome_new_window_client.h"
+#include "chrome/browser/ui/webui/chromeos/insession_password_change_ui.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/webui_url_constants.h"
 #include "chromeos/login/auth/saml_password_attributes.h"
 #include "chromeos/strings/grit/chromeos_strings.h"
 #include "components/prefs/pref_service.h"
@@ -78,11 +77,7 @@
 
 // Callback called when notification is clicked - opens password-change page.
 void OnNotificationClicked() {
-  ChromeNewWindowClient* client = ChromeNewWindowClient::Get();
-  if (client) {
-    client->NewTabWithUrl(GURL(chrome::kChromeUIPasswordChangeUrl),
-                          /*from_user_interaction=*/true);
-  }
+  PasswordChangeDialog::Show();
 }
 
 const base::NoDestructor<scoped_refptr<HandleNotificationClickDelegate>>
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc
index 51b0410..17b1d1d 100644
--- a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc
+++ b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen.cc
@@ -7,6 +7,7 @@
 #include "base/logging.h"
 #include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
 #include "chromeos/constants/chromeos_features.h"
+#include "components/user_manager/user_manager.h"
 
 namespace chromeos {
 namespace {
@@ -31,10 +32,14 @@
 }
 
 void SupervisionOnboardingScreen::Show() {
-  // TODO(ltenorio): Show this screen only for supervised accounts when the
-  // test support is improved by b/959244.
-  if (view_ && base::FeatureList::IsEnabled(
-                   features::kEnableSupervisionOnboardingScreens)) {
+  const user_manager::UserManager* user_manager =
+      user_manager::UserManager::Get();
+  DCHECK(user_manager->IsUserLoggedIn());
+
+  if (view_ &&
+      base::FeatureList::IsEnabled(
+          features::kEnableSupervisionOnboardingScreens) &&
+      user_manager->IsLoggedInAsChildUser()) {
     view_->Show();
     return;
   }
diff --git a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc
index d58f85f..d290c78 100644
--- a/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/supervision_onboarding_screen_browsertest.cc
@@ -15,9 +15,13 @@
 #include "chrome/browser/chromeos/login/login_wizard.h"
 #include "chrome/browser/chromeos/login/mixin_based_in_process_browser_test.h"
 #include "chrome/browser/chromeos/login/oobe_screen.h"
+#include "chrome/browser/chromeos/login/test/embedded_test_server_mixin.h"
+#include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h"
 #include "chrome/browser/chromeos/login/test/js_checker.h"
+#include "chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h"
 #include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
+#include "chrome/browser/chromeos/login/test/user_policy_mixin.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
 #include "chrome/browser/profiles/profile.h"
@@ -25,14 +29,23 @@
 #include "chrome/browser/ui/webui/chromeos/login/supervision_onboarding_screen_handler.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/chromeos_switches.h"
+#include "google_apis/gaia/gaia_urls.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/test/embedded_test_server/http_request.h"
+#include "net/test/embedded_test_server/http_response.h"
+
+using net::test_server::BasicHttpResponse;
+using net::test_server::HttpRequest;
+using net::test_server::HttpResponse;
 
 namespace chromeos {
 
 namespace {
 
-constexpr char kTestUser[] = "test-user1@gmail.com";
-constexpr char kTestOnboardingPageUrl[] =
-    "https://families.google.com/families";
+constexpr char kTestStartPageRelativeUrl[] = "/families/onboarding/start";
+constexpr char kTestCustomHttpHeaderKey[] =
+    "test-supervision-onboarding-header";
 
 chromeos::OobeUI* GetOobeUI() {
   auto* host = chromeos::LoginDisplayHost::default_host();
@@ -41,18 +54,143 @@
 
 }  // namespace
 
-class SupervisionOnboardingTest : public MixinBasedInProcessBrowserTest {
+// Fake HTTP server that returns the data necessary to render the Supervision
+// Onboarding pages. It provides methods to customize the HTTP responses to
+// include/omit custom HTTP headers that are expected by the flow.
+class FakeSupervisionServer {
  public:
-  SupervisionOnboardingTest() = default;
-  ~SupervisionOnboardingTest() override = default;
+  explicit FakeSupervisionServer(net::EmbeddedTestServer* test_server) {
+    test_server_ = test_server;
+
+    test_server_->RegisterRequestHandler(base::BindRepeating(
+        &FakeSupervisionServer::HandleRequest, base::Unretained(this)));
+  }
+
+  ~FakeSupervisionServer() = default;
+
+  // Sets the custom HTTP header that will be sent back in responses.
+  void set_custom_http_header_value(
+      const std::string& custom_http_header_value) {
+    custom_http_header_value_ = custom_http_header_value;
+  }
+
+  // Stops sending the custom header in responses.
+  void clear_custom_http_header_value() {
+    custom_http_header_value_ = base::nullopt;
+  }
+
+  size_t GetReceivedRequestsCount() const {
+    // It's safe to use the size of the access token list as a proxy to the
+    // number of requests. This server asserts that all requests contain an
+    // authentication header.
+    return received_auth_header_values_.size();
+  }
+
+  GURL url_filter_pattern() const { return test_server_->GetURL("/*"); }
+  GURL start_page_url() {
+    return test_server_->GetURL(kTestStartPageRelativeUrl);
+  }
+
+ private:
+  std::unique_ptr<HttpResponse> HandleRequest(const HttpRequest& request) {
+    // We are not interested in other URLs hitting the server at this point.
+    // This will filter bogus requests like favicon fetches and stop us from
+    // handling requests that are targeting gaia.
+    if (request.relative_url != kTestStartPageRelativeUrl)
+      return nullptr;
+
+    UpdateVerificationData(request);
+    auto response = std::make_unique<BasicHttpResponse>();
+    if (custom_http_header_value_.has_value()) {
+      response->AddCustomHeader(kTestCustomHttpHeaderKey,
+                                custom_http_header_value_.value());
+    }
+
+    response->set_code(net::HTTP_OK);
+    response->set_content("Test Supervision Onboarding content");
+    response->set_content_type("text/plain");
+    return std::move(response);
+  }
+
+  void UpdateVerificationData(const HttpRequest& request) {
+    auto auth_header =
+        request.headers.find(net::HttpRequestHeaders::kAuthorization);
+    ASSERT_NE(auth_header, request.headers.end());
+    ASSERT_EQ(auth_header->second,
+              base::StringPrintf("Bearer %s",
+                                 FakeGaiaMixin::kFakeAllScopeAccessToken));
+
+    received_auth_header_values_.push_back(auth_header->second);
+  }
+
+  net::EmbeddedTestServer* test_server_;
+  std::vector<std::string> received_auth_header_values_;
+
+  base::Optional<std::string> custom_http_header_value_ = base::nullopt;
+};
+
+class SupervisionOnboardingBaseTest : public MixinBasedInProcessBrowserTest {
+ public:
+  SupervisionOnboardingBaseTest() = default;
+  ~SupervisionOnboardingBaseTest() override = default;
+
+  virtual bool IsFeatureOn() const = 0;
+  virtual bool IsChild() const = 0;
+
+  void SetUp() override {
+    if (IsFeatureOn()) {
+      feature_list_.InitAndEnableFeature(
+          features::kEnableSupervisionOnboardingScreens);
+    }
+
+    MixinBasedInProcessBrowserTest::SetUp();
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    if (IsFeatureOn()) {
+      command_line->AppendSwitchASCII(
+          chromeos::switches::kSupervisionOnboardingPageUrlPattern,
+          supervision_server()->url_filter_pattern().spec());
+      command_line->AppendSwitchASCII(
+          chromeos::switches::kSupervisionOnboardingStartPageUrl,
+          supervision_server()->start_page_url().spec());
+      command_line->AppendSwitchASCII(
+          chromeos::switches::kSupervisionOnboardingHttpResponseHeader,
+          kTestCustomHttpHeaderKey);
+
+      // To turn on the feature properly we also ask the server to return the
+      // expected custom http header value. Tests that want to simulate other
+      // server responses can call these methods again to override this
+      // behavior.
+      ExpectCustomHttpHeaderValue("user-eligible");
+      supervision_server()->set_custom_http_header_value("user-eligible");
+    }
+
+    MixinBasedInProcessBrowserTest::SetUpCommandLine(command_line);
+  }
 
   void SetUpOnMainThread() override {
-    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-        chromeos::switches::kSupervisionOnboardingStartPageUrl,
-        kTestOnboardingPageUrl);
+    host_resolver()->AddRule("*", "127.0.0.1");
 
-    login_manager_.LoginAndWaitForActiveSession(
-        LoginManagerMixin::CreateDefaultUserContext(test_user_));
+    AccountId id =
+        IsChild() ? child_user_.account_id : regular_user_.account_id;
+    fake_gaia_.SetupFakeGaiaForLogin(id.GetUserEmail(), id.GetGaiaId(),
+                                     FakeGaiaMixin::kFakeRefreshToken);
+
+    // Since we will login after this method returns, we need to set this
+    // to prevent Chrome from trying to quit after login.
+    login_manager_.set_should_launch_browser(true);
+
+    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
+  }
+
+  void LoginAndShowScreen() {
+    LoginManagerMixin::TestUserInfo user_info =
+        IsChild() ? child_user_ : regular_user_;
+    UserContext user_context =
+        LoginManagerMixin::CreateDefaultUserContext(user_info);
+    user_context.SetRefreshToken(FakeGaiaMixin::kFakeRefreshToken);
+    login_manager_.LoginAndWaitForActiveSession(user_context);
 
     ShowLoginWizard(OobeScreen::SCREEN_TEST_NO_WINDOW);
     WizardController::default_controller()
@@ -61,27 +199,35 @@
     auto supervision_onboarding_screen =
         std::make_unique<SupervisionOnboardingScreen>(
             GetOobeUI()->GetView<SupervisionOnboardingScreenHandler>(),
-            base::BindRepeating(&SupervisionOnboardingTest::HandleScreenExit,
-                                base::Unretained(this)));
+            base::BindRepeating(
+                &SupervisionOnboardingBaseTest::HandleScreenExit,
+                base::Unretained(this)));
     supervision_onboarding_screen_ = supervision_onboarding_screen.get();
     WizardController::default_controller()
         ->screen_manager()
         ->SetScreenForTesting(std::move(supervision_onboarding_screen));
 
-    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
-  }
-
-  void TurnOnFeature() {
-    feature_list_.InitAndEnableFeature(
-        features::kEnableSupervisionOnboardingScreens);
-  }
-
-  void ShowAndWaitForScreen() {
     supervision_onboarding_screen_->Show();
+  }
 
+  // Sets the flow to expect the given header value in server responses. If
+  // the value is not present, we should exit the flow.
+  void ExpectCustomHttpHeaderValue(
+      const std::string& custom_http_header_value) {
+    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+        chromeos::switches::kSupervisionOnboardingHttpResponseHeaderValue,
+        custom_http_header_value);
+  }
+
+  void WaitForScreen() {
     OobeScreenWaiter screen_waiter(SupervisionOnboardingScreenView::kScreenId);
     screen_waiter.set_assert_next_screen();
     screen_waiter.Wait();
+
+    test::OobeJS()
+        .CreateVisibilityWaiter(true,
+                                {"supervision-onboarding", "contentWebview"})
+        ->Wait();
   }
 
   void ClickButton(const std::string& button_id) {
@@ -100,8 +246,9 @@
     run_loop.Run();
   }
 
+  FakeSupervisionServer* supervision_server() { return &supervision_server_; }
+
   SupervisionOnboardingScreen* supervision_onboarding_screen_;
-  base::test::ScopedFeatureList feature_list_;
 
  private:
   void HandleScreenExit() {
@@ -111,39 +258,120 @@
       std::move(screen_exit_callback_).Run();
   }
 
+  base::test::ScopedFeatureList feature_list_;
   bool screen_exited_ = false;
   base::OnceClosure screen_exit_callback_;
 
-  const LoginManagerMixin::TestUserInfo test_user_{
-      AccountId::FromUserEmailGaiaId(kTestUser, kTestUser)};
-  LoginManagerMixin login_manager_{&mixin_host_, {test_user_}};
+  const LoginManagerMixin::TestUserInfo regular_user_{
+      AccountId::FromUserEmailGaiaId("test-regular-user@gmail.com",
+                                     "test-regular-user-gaia-id")};
+  const LoginManagerMixin::TestUserInfo child_user_{
+      AccountId::FromUserEmailGaiaId("test-child-user@gmail.com",
+                                     "test-child-user-gaia-id"),
+      user_manager::USER_TYPE_CHILD};
+
+  EmbeddedTestServerSetupMixin embedded_test_server_{&mixin_host_,
+                                                     embedded_test_server()};
+  FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()};
+  LoginManagerMixin login_manager_{&mixin_host_, {regular_user_, child_user_}};
+  LocalPolicyTestServerMixin local_policy_mixin_{&mixin_host_};
+  UserPolicyMixin user_policy_{&mixin_host_, child_user_.account_id,
+                               &local_policy_mixin_};
+
+  FakeSupervisionServer supervision_server_{embedded_test_server()};
+};
+
+class SupervisionOnboardingRegularUserTest
+    : public SupervisionOnboardingBaseTest {
+ public:
+  SupervisionOnboardingRegularUserTest() = default;
+  ~SupervisionOnboardingRegularUserTest() override = default;
+
+  bool IsFeatureOn() const override { return true; }
+
+  bool IsChild() const override { return false; }
+};
+
+IN_PROC_BROWSER_TEST_F(SupervisionOnboardingRegularUserTest,
+                       FlowExitsImmediately) {
+  LoginAndShowScreen();
+
+  WaitForScreenExit();
+  EXPECT_EQ(0u, supervision_server()->GetReceivedRequestsCount());
+}
+
+class SupervisionOnboardingFeatureTurnedOffTest
+    : public SupervisionOnboardingBaseTest {
+ public:
+  SupervisionOnboardingFeatureTurnedOffTest() = default;
+  ~SupervisionOnboardingFeatureTurnedOffTest() override = default;
+
+  bool IsFeatureOn() const override { return false; }
+
+  bool IsChild() const override { return true; }
+};
+
+IN_PROC_BROWSER_TEST_F(SupervisionOnboardingFeatureTurnedOffTest,
+                       FlowExitsImmediately) {
+  LoginAndShowScreen();
+
+  WaitForScreenExit();
+  EXPECT_EQ(0u, supervision_server()->GetReceivedRequestsCount());
+}
+
+class SupervisionOnboardingTest : public SupervisionOnboardingBaseTest {
+ public:
+  SupervisionOnboardingTest() = default;
+  ~SupervisionOnboardingTest() override = default;
+
+  bool IsFeatureOn() const override { return true; }
+
+  bool IsChild() const override { return true; }
 };
 
 IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
-                       ExitImmediatelyWhenFeatureIsOff) {
-  supervision_onboarding_screen_->Show();
+                       ExitWhenServerDoesNotReturnHeader) {
+  supervision_server()->clear_custom_http_header_value();
+
+  LoginAndShowScreen();
   WaitForScreenExit();
+
+  EXPECT_EQ(1u, supervision_server()->GetReceivedRequestsCount());
+}
+
+IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest,
+                       ExitWhenServerSendsWrongHeader) {
+  ExpectCustomHttpHeaderValue("user-eligible-for-supervision");
+  supervision_server()->set_custom_http_header_value("user-not-eligible");
+
+  LoginAndShowScreen();
+  WaitForScreenExit();
+
+  EXPECT_EQ(1u, supervision_server()->GetReceivedRequestsCount());
 }
 
 IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest, NextButtonExitsScreen) {
-  TurnOnFeature();
-  ShowAndWaitForScreen();
+  LoginAndShowScreen();
+  WaitForScreen();
+  EXPECT_EQ(1u, supervision_server()->GetReceivedRequestsCount());
 
   ClickButton("next-button");
   WaitForScreenExit();
 }
 
 IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest, BackButtonExitsScreen) {
-  TurnOnFeature();
-  ShowAndWaitForScreen();
+  LoginAndShowScreen();
+  WaitForScreen();
+  EXPECT_EQ(1u, supervision_server()->GetReceivedRequestsCount());
 
   ClickButton("back-button");
   WaitForScreenExit();
 }
 
 IN_PROC_BROWSER_TEST_F(SupervisionOnboardingTest, SkipButtonExitsScreen) {
-  TurnOnFeature();
-  ShowAndWaitForScreen();
+  LoginAndShowScreen();
+  WaitForScreen();
+  EXPECT_EQ(1u, supervision_server()->GetReceivedRequestsCount());
 
   ClickButton("skip-button");
   WaitForScreenExit();
diff --git a/chrome/browser/chromeos/login/test/device_state_mixin.cc b/chrome/browser/chromeos/login/test/device_state_mixin.cc
index 757892f..a29630a8 100644
--- a/chrome/browser/chromeos/login/test/device_state_mixin.cc
+++ b/chrome/browser/chromeos/login/test/device_state_mixin.cc
@@ -44,10 +44,15 @@
   install_attrs_["enterprise.domain"] = domain;
   install_attrs_["enterprise.realm"] = realm;
   install_attrs_["enterprise.device_id"] = device_id;
-  install_attrs_["enterprise.owned"] = "true";
+  if (!mode.empty())
+    install_attrs_["enterprise.owned"] = "true";
 
   cryptohome::SerializedInstallAttributes install_attrs;
+  install_attrs.set_version(1);
+
   for (const auto& it : install_attrs_) {
+    if (it.second.empty())
+      continue;
     cryptohome::SerializedInstallAttributes::Attribute* attr_entry =
         install_attrs.add_attributes();
     const std::string& name = it.first;
@@ -151,13 +156,13 @@
     case DeviceStateMixin::State::OOBE_COMPLETED_ACTIVE_DIRECTORY_ENROLLED:
     case DeviceStateMixin::State::OOBE_COMPLETED_CONSUMER_OWNED:
     case DeviceStateMixin::State::OOBE_COMPLETED_DEMO_MODE:
-      local_state_values.device_registered = 1;
-      FALLTHROUGH;
     case DeviceStateMixin::State::OOBE_COMPLETED_UNOWNED:
+      local_state_values.device_registered = 1;
       local_state_values.enrollment_recovery_required = false;
       local_state_values.oobe_complete = true;
       break;
     case DeviceStateMixin::State::BEFORE_OOBE:
+      local_state_values.device_registered = 0;
       break;
   }
 
@@ -217,30 +222,31 @@
   std::string device_mode, domain, realm, device_id;
   switch (state_) {
     case DeviceStateMixin::State::BEFORE_OOBE:
+    case DeviceStateMixin::State::OOBE_COMPLETED_UNOWNED:
       // No file at all.
       return;
-    case DeviceStateMixin::State::OOBE_COMPLETED_UNOWNED:
-      // Write file with empty install attributes.
+    case DeviceStateMixin::State::OOBE_COMPLETED_CONSUMER_OWNED:
+      // File with version only.
       break;
     case DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED:
       device_mode = "enterprise";
       domain = !domain_.empty() ? domain_ : kFakeDomain;
+      device_id = kFakeDeviceId;
       break;
     case DeviceStateMixin::State::OOBE_COMPLETED_ACTIVE_DIRECTORY_ENROLLED:
       device_mode = "enterprise_ad";
       realm = kFakeDomain;
-      break;
-    case DeviceStateMixin::State::OOBE_COMPLETED_CONSUMER_OWNED:
-      device_mode = "consumer";
+      device_id = kFakeDeviceId;
       break;
     case DeviceStateMixin::State::OOBE_COMPLETED_DEMO_MODE:
       device_mode = "demo_mode";
       domain = "cros-demo-mode.com";
+      device_id = kFakeDeviceId;
       break;
   }
 
   std::string install_attrs_bits;
-  CHECK(BuildInstallAttributes(device_mode, domain, realm, kFakeDeviceId)
+  CHECK(BuildInstallAttributes(device_mode, domain, realm, device_id)
             .SerializeToString(&install_attrs_bits));
   WriteFile(install_attrs_file, install_attrs_bits);
 }
diff --git a/chrome/browser/chromeos/login/test/dialog_window_waiter.cc b/chrome/browser/chromeos/login/test/dialog_window_waiter.cc
new file mode 100644
index 0000000..f681bc7
--- /dev/null
+++ b/chrome/browser/chromeos/login/test/dialog_window_waiter.cc
@@ -0,0 +1,53 @@
+// 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/login/test/dialog_window_waiter.h"
+
+#include "ui/aura/env.h"
+#include "ui/aura/window.h"
+#include "ui/views/widget/widget.h"
+
+namespace chromeos {
+
+DialogWindowWaiter::DialogWindowWaiter(const base::string16& dialog_title)
+    : dialog_title_(dialog_title) {
+  aura::Env::GetInstance()->AddObserver(this);
+}
+
+DialogWindowWaiter::~DialogWindowWaiter() {
+  aura::Env::GetInstance()->RemoveObserver(this);
+  window_observer_.RemoveAll();
+  // Explicitly close any help app dialogs still open to prevent flaky errors in
+  // browser tests. Remove when crbug.com/951828 is fixed.
+  for (aura::Window* dialog_window : dialog_windows_)
+    views::Widget::GetWidgetForNativeView(dialog_window)->CloseNow();
+}
+
+void DialogWindowWaiter::Wait() {
+  run_loop_.Run();
+}
+
+void DialogWindowWaiter::OnWindowInitialized(aura::Window* window) {
+  DCHECK(!window_observer_.IsObserving(window));
+  window_observer_.Add(window);
+}
+
+void DialogWindowWaiter::OnWindowDestroyed(aura::Window* window) {
+  if (window_observer_.IsObserving(window))
+    window_observer_.Remove(window);
+  dialog_windows_.erase(window);
+}
+
+void DialogWindowWaiter::OnWindowVisibilityChanged(aura::Window* window,
+                                                   bool visible) {
+  if (window->GetTitle() != dialog_title_)
+    return;
+
+  dialog_windows_.insert(window);
+  if (visible) {
+    run_loop_.Quit();
+  }
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/dialog_window_waiter.h b/chrome/browser/chromeos/login/test/dialog_window_waiter.h
new file mode 100644
index 0000000..483080a
--- /dev/null
+++ b/chrome/browser/chromeos/login/test/dialog_window_waiter.h
@@ -0,0 +1,60 @@
+// 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_LOGIN_TEST_DIALOG_WINDOW_WAITER_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_TEST_DIALOG_WINDOW_WAITER_H_
+
+#include <set>
+
+#include "base/macros.h"
+#include "base/run_loop.h"
+#include "base/scoped_observer.h"
+#include "ui/aura/env_observer.h"
+#include "ui/aura/window_observer.h"
+
+namespace chromeos {
+
+// Waits for a dialog window to open and become visible.
+//
+// Starts listening for window creation events on construction. |Wait| blocks
+// until the expected dialog window is visible. |Wait| returns immediately if
+// the expected dialog window is already visible when |Wait| is called.
+//
+// DialogWindowWaiter is single-use. It can only wait for one dialog to be
+// opened per lifetime.
+class DialogWindowWaiter : public aura::EnvObserver,
+                           public aura::WindowObserver {
+ public:
+  // Starts listening for a dialog window to open with title |dialog_title|.
+  explicit DialogWindowWaiter(const base::string16& dialog_title);
+
+  ~DialogWindowWaiter() override;
+
+  // Blocks until a dialog with title |dialog_title| becomes visible. All calls
+  // to |Wait| return immediately after the dialog becomes visible during this
+  // object's lifetime.
+  void Wait();
+
+  // aura::EnvObserver
+  void OnWindowInitialized(aura::Window* window) override;
+
+  // aura::WindowObserver
+  void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
+  void OnWindowDestroyed(aura::Window* window) override;
+
+ private:
+  // The title of the expected dialog window.
+  base::string16 dialog_title_;
+
+  base::RunLoop run_loop_;
+
+  std::set<aura::Window*> dialog_windows_;
+  ScopedObserver<aura::Window, DialogWindowWaiter> window_observer_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(DialogWindowWaiter);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_TEST_DIALOG_WINDOW_WAITER_H_
diff --git a/chrome/browser/chromeos/login/test/fake_gaia_mixin.cc b/chrome/browser/chromeos/login/test/fake_gaia_mixin.cc
index b9e7cb49..3c7782e 100644
--- a/chrome/browser/chromeos/login/test/fake_gaia_mixin.cc
+++ b/chrome/browser/chromeos/login/test/fake_gaia_mixin.cc
@@ -16,7 +16,6 @@
 
 namespace {
 constexpr char kGAIAHost[] = "accounts.google.com";
-constexpr char kTestAllScopeAccessToken[] = "fake-all-scope-token";
 }  // namespace
 
 // static
@@ -26,6 +25,7 @@
 const char FakeGaiaMixin::kFakeAuthCode[] = "fake-auth-code";
 const char FakeGaiaMixin::kFakeRefreshToken[] = "fake-refresh-token";
 const char FakeGaiaMixin::kEmptyUserServices[] = "[]";
+const char FakeGaiaMixin::kFakeAllScopeAccessToken[] = "fake-all-scope-token";
 
 const char FakeGaiaMixin::kFakeSIDCookie[] = "fake-SID-cookie";
 const char FakeGaiaMixin::kFakeLSIDCookie[] = "fake-LSID-cookie";
@@ -55,7 +55,7 @@
     fake_gaia_->MapEmailToGaiaId(user_email, gaia_id);
 
   FakeGaia::AccessTokenInfo token_info;
-  token_info.token = kTestAllScopeAccessToken;
+  token_info.token = kFakeAllScopeAccessToken;
   token_info.audience = GaiaUrls::GetInstance()->oauth2_chrome_client_id();
   token_info.email = user_email;
   token_info.any_scope = true;
@@ -80,7 +80,7 @@
 
   if (issue_any_scope_token) {
     FakeGaia::AccessTokenInfo all_scopes_token;
-    all_scopes_token.token = kTestAllScopeAccessToken;
+    all_scopes_token.token = kFakeAllScopeAccessToken;
     all_scopes_token.audience =
         GaiaUrls::GetInstance()->oauth2_chrome_client_id();
     all_scopes_token.email = user_email;
diff --git a/chrome/browser/chromeos/login/test/fake_gaia_mixin.h b/chrome/browser/chromeos/login/test/fake_gaia_mixin.h
index 4b844003..9dfc1d5 100644
--- a/chrome/browser/chromeos/login/test/fake_gaia_mixin.h
+++ b/chrome/browser/chromeos/login/test/fake_gaia_mixin.h
@@ -28,6 +28,7 @@
   static const char kFakeAuthCode[];
   static const char kFakeRefreshToken[];
   static const char kEmptyUserServices[];
+  static const char kFakeAllScopeAccessToken[];
 
   // FakeGaia is configured to return these cookies for kFakeUserEmail.
   static const char kFakeSIDCookie[];
diff --git a/chrome/browser/chromeos/login/test/guest_session_mixin.cc b/chrome/browser/chromeos/login/test/guest_session_mixin.cc
new file mode 100644
index 0000000..ee539a6
--- /dev/null
+++ b/chrome/browser/chromeos/login/test/guest_session_mixin.cc
@@ -0,0 +1,28 @@
+// 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/login/test/guest_session_mixin.h"
+
+#include "base/command_line.h"
+#include "chrome/common/chrome_switches.h"
+#include "chromeos/constants/chromeos_switches.h"
+#include "components/account_id/account_id.h"
+#include "components/user_manager/user_names.h"
+
+namespace chromeos {
+
+GuestSessionMixin::GuestSessionMixin(InProcessBrowserTestMixinHost* mixin_host)
+    : InProcessBrowserTestMixin(mixin_host) {}
+
+GuestSessionMixin::~GuestSessionMixin() = default;
+
+void GuestSessionMixin::SetUpCommandLine(base::CommandLine* command_line) {
+  command_line->AppendSwitch(switches::kGuestSession);
+  command_line->AppendSwitch(::switches::kIncognito);
+  command_line->AppendSwitchASCII(switches::kLoginProfile, "hash");
+  command_line->AppendSwitchASCII(
+      switches::kLoginUser, user_manager::GuestAccountId().GetUserEmail());
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/guest_session_mixin.h b/chrome/browser/chromeos/login/test/guest_session_mixin.h
new file mode 100644
index 0000000..65d96d4a
--- /dev/null
+++ b/chrome/browser/chromeos/login/test/guest_session_mixin.h
@@ -0,0 +1,33 @@
+// 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_LOGIN_TEST_GUEST_SESSION_MIXIN_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_TEST_GUEST_SESSION_MIXIN_H_
+
+#include "base/macros.h"
+#include "chrome/browser/chromeos/login/mixin_based_in_process_browser_test.h"
+
+namespace base {
+class CommandLine;
+}
+
+namespace chromeos {
+
+// A mixin that sets up test command line for guest user session.
+// Use this with tests for in-session behavior for guest user.
+class GuestSessionMixin : public InProcessBrowserTestMixin {
+ public:
+  explicit GuestSessionMixin(InProcessBrowserTestMixinHost* mixin_host);
+  ~GuestSessionMixin() override;
+
+  // InProcessBrowserTestMixin:
+  void SetUpCommandLine(base::CommandLine* command_line) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(GuestSessionMixin);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_TEST_GUEST_SESSION_MIXIN_H_
diff --git a/chrome/browser/chromeos/login/test/help_app_test_helper.cc b/chrome/browser/chromeos/login/test/help_app_test_helper.cc
deleted file mode 100644
index 4061091..0000000
--- a/chrome/browser/chromeos/login/test/help_app_test_helper.cc
+++ /dev/null
@@ -1,99 +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/login/test/help_app_test_helper.h"
-
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-#include "chrome/browser/chromeos/extensions/signin_screen_policy_provider.h"
-#include "chrome/browser/chromeos/login/help_app_launcher.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/extensions/chrome_test_extension_loader.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/grit/generated_resources.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/views/widget/widget.h"
-
-namespace chromeos {
-
-///////////////////////////////////////////////////////////////////////////////
-// HelpAppTestHelper::Waiter
-///////////////////////////////////////////////////////////////////////////////
-
-HelpAppTestHelper::Waiter::Waiter() {
-  aura::Env::GetInstance()->AddObserver(this);
-}
-
-HelpAppTestHelper::Waiter::~Waiter() {
-  aura::Env::GetInstance()->RemoveObserver(this);
-  window_observer_.RemoveAll();
-  // Explicitly close any help app dialogs still open to prevent flaky errors in
-  // browser tests. Remove when crbug.com/951828 is fixed.
-  for (aura::Window* dialog_window : dialog_windows_)
-    views::Widget::GetWidgetForNativeView(dialog_window)->CloseNow();
-}
-
-void HelpAppTestHelper::Waiter::Wait() {
-  if (!help_app_dialog_opened_)
-    run_loop_.Run();
-}
-
-void HelpAppTestHelper::Waiter::OnWindowInitialized(aura::Window* window) {
-  DCHECK(!window_observer_.IsObserving(window));
-  window_observer_.Add(window);
-}
-
-void HelpAppTestHelper::Waiter::OnWindowDestroyed(aura::Window* window) {
-  if (window_observer_.IsObserving(window))
-    window_observer_.Remove(window);
-  dialog_windows_.erase(window);
-}
-
-void HelpAppTestHelper::Waiter::OnWindowVisibilityChanged(aura::Window* window,
-                                                          bool visible) {
-  if (!IsHelpAppDialog(window))
-    return;
-
-  dialog_windows_.insert(window);
-  if (visible) {
-    help_app_dialog_opened_ = true;
-    run_loop_.Quit();
-  }
-}
-
-bool HelpAppTestHelper::Waiter::IsHelpAppDialog(aura::Window* window) {
-  return window->GetTitle() ==
-         l10n_util::GetStringUTF16(IDS_LOGIN_OOBE_HELP_DIALOG_TITLE);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// HelpAppTestHelper
-///////////////////////////////////////////////////////////////////////////////
-
-HelpAppTestHelper::HelpAppTestHelper() {
-  auto reset = GetScopedSigninScreenPolicyProviderDisablerForTesting();
-
-  base::FilePath test_data_dir;
-  base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
-  extensions::ChromeTestExtensionLoader loader(
-      ProfileHelper::GetSigninProfile());
-  loader.set_allow_incognito_access(true);
-
-  scoped_refptr<const extensions::Extension> extension =
-      loader.LoadExtension(test_data_dir.AppendASCII("extensions")
-                               .AppendASCII("api_test")
-                               .AppendASCII("help_app"));
-
-  DCHECK(extension && !extension->id().empty());
-
-  HelpAppLauncher::SetExtensionIdForTest(extension->id().c_str());
-}
-
-HelpAppTestHelper::~HelpAppTestHelper() {
-  HelpAppLauncher::SetExtensionIdForTest(nullptr);
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/help_app_test_helper.h b/chrome/browser/chromeos/login/test/help_app_test_helper.h
deleted file mode 100644
index d4ee1b6..0000000
--- a/chrome/browser/chromeos/login/test/help_app_test_helper.h
+++ /dev/null
@@ -1,70 +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_LOGIN_TEST_HELP_APP_TEST_HELPER_H_
-#define CHROME_BROWSER_CHROMEOS_LOGIN_TEST_HELP_APP_TEST_HELPER_H_
-
-#include <set>
-
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/scoped_observer.h"
-#include "ui/aura/env_observer.h"
-#include "ui/aura/window_observer.h"
-
-namespace chromeos {
-
-// Provides utilies for launching and interacting with HelpApp dialogs in tests.
-class HelpAppTestHelper {
- public:
-  // Waits for a HelpApp dialog to open and become visible.
-  //
-  // Starts listening for window creation events on construction. |Wait| blocks
-  // until a HelpApp window is visible. |Wait| returns immediately if a HelpApp
-  // window is already visible when |Wait| is called.
-  //
-  // HelpAppTestHelper::Waiter is single-use. It can only wait for one HelpApp
-  // dialog to be opened per lifetime.
-  class Waiter : public aura::EnvObserver, public aura::WindowObserver {
-   public:
-    Waiter();
-    ~Waiter() override;
-
-    // Blocks until a HelpApp dialog becomes visible. Once a HelpApp dialog
-    // becomes visible during this object's lifetime, all calls to |Wait| return
-    // immediately.
-    void Wait();
-
-    // aura::EnvObserver
-    void OnWindowInitialized(aura::Window* window) override;
-
-    // aura::WindowObserver
-    void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
-    void OnWindowDestroyed(aura::Window* window) override;
-
-   private:
-    bool IsHelpAppDialog(aura::Window* window);
-
-    base::RunLoop run_loop_;
-    std::set<aura::Window*> dialog_windows_;
-    ScopedObserver<aura::Window, Waiter> window_observer_{this};
-    bool help_app_dialog_opened_ = false;
-    DISALLOW_COPY_AND_ASSIGN(Waiter);
-  };
-
-  HelpAppTestHelper();
-  virtual ~HelpAppTestHelper();
-
-  // Performs setup to allow HelpApp dialogs to open in tests.
-  void SetUpHelpAppForTest();
-
-  // TODO(tonydeluna): Add utilities for interacting with the contents of the
-  // help dialogs.
-
-  DISALLOW_COPY_AND_ASSIGN(HelpAppTestHelper);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_TEST_HELP_APP_TEST_HELPER_H_
diff --git a/chrome/browser/chromeos/login/test/login_screen_tester.cc b/chrome/browser/chromeos/login/test/login_screen_tester.cc
index 09c993f..260e0c5 100644
--- a/chrome/browser/chromeos/login/test/login_screen_tester.cc
+++ b/chrome/browser/chromeos/login/test/login_screen_tester.cc
@@ -89,5 +89,12 @@
   return success;
 }
 
+bool LoginScreenTester::LaunchApp(const std::string& app_id) {
+  ash::mojom::LoginScreenTestApiAsyncWaiter login_screen(test_api_.get());
+  bool success;
+  login_screen.LaunchApp(app_id, &success);
+  return success;
+}
+
 }  // namespace test
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/login_screen_tester.h b/chrome/browser/chromeos/login/test/login_screen_tester.h
index c9241d9..ef66c33 100644
--- a/chrome/browser/chromeos/login/test/login_screen_tester.h
+++ b/chrome/browser/chromeos/login/test/login_screen_tester.h
@@ -41,6 +41,9 @@
   // |previous_update_count|. Returns true on success, false on error.
   bool WaitForUiUpdate(int64_t previous_update_count);
 
+  // Starts kiosk app.
+  bool LaunchApp(const std::string& app_id);
+
  private:
   ash::mojom::LoginScreenTestApiPtr test_api_;
 
diff --git a/chrome/browser/chromeos/login/test/oobe_auth_page_waiter.cc b/chrome/browser/chromeos/login/test/oobe_auth_page_waiter.cc
index 471161f..0d5bb49a 100644
--- a/chrome/browser/chromeos/login/test/oobe_auth_page_waiter.cc
+++ b/chrome/browser/chromeos/login/test/oobe_auth_page_waiter.cc
@@ -14,7 +14,7 @@
 
 namespace {
 
-constexpr char kGaiaAuthenticator[] = "$('gaia-signin').gaiaAuthHost_";
+constexpr char kGaiaAuthenticator[] = "$('gaia-signin').authenticator_";
 constexpr char kEnrollmentAuthenticator[] =
     "$('oauth-enrollment').authenticator_";
 
diff --git a/chrome/browser/chromeos/login/test/oobe_base_test.h b/chrome/browser/chromeos/login/test/oobe_base_test.h
index 039fe12..2e85f85 100644
--- a/chrome/browser/chromeos/login/test/oobe_base_test.h
+++ b/chrome/browser/chromeos/login/test/oobe_base_test.h
@@ -62,7 +62,7 @@
   std::unique_ptr<content::WindowedNotificationObserver>
       login_screen_load_observer_;
   std::string gaia_frame_parent_ = "signin-frame";
-  std::string authenticator_id_ = "$('gaia-signin').gaiaAuthHost_";
+  std::string authenticator_id_ = "$('gaia-signin').authenticator_";
   EmbeddedTestServerSetupMixin embedded_test_server_{&mixin_host_,
                                                      embedded_test_server()};
 
diff --git a/chrome/browser/chromeos/login/test/scoped_help_app_for_test.cc b/chrome/browser/chromeos/login/test/scoped_help_app_for_test.cc
new file mode 100644
index 0000000..bb1e020
--- /dev/null
+++ b/chrome/browser/chromeos/login/test/scoped_help_app_for_test.cc
@@ -0,0 +1,41 @@
+// 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/login/test/scoped_help_app_for_test.h"
+
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+#include "chrome/browser/chromeos/extensions/signin_screen_policy_provider.h"
+#include "chrome/browser/chromeos/login/help_app_launcher.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/extensions/chrome_test_extension_loader.h"
+#include "chrome/common/chrome_paths.h"
+
+namespace chromeos {
+
+ScopedHelpAppForTest::ScopedHelpAppForTest() {
+  auto reset = GetScopedSigninScreenPolicyProviderDisablerForTesting();
+
+  base::FilePath test_data_dir;
+  base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+
+  extensions::ChromeTestExtensionLoader loader(
+      ProfileHelper::GetSigninProfile());
+  loader.set_allow_incognito_access(true);
+
+  scoped_refptr<const extensions::Extension> extension =
+      loader.LoadExtension(test_data_dir.AppendASCII("extensions")
+                               .AppendASCII("api_test")
+                               .AppendASCII("help_app"));
+
+  DCHECK(extension && !extension->id().empty());
+
+  HelpAppLauncher::SetExtensionIdForTest(extension->id().c_str());
+}
+
+ScopedHelpAppForTest::~ScopedHelpAppForTest() {
+  HelpAppLauncher::SetExtensionIdForTest(nullptr);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/scoped_help_app_for_test.h b/chrome/browser/chromeos/login/test/scoped_help_app_for_test.h
new file mode 100644
index 0000000..68a445d
--- /dev/null
+++ b/chrome/browser/chromeos/login/test/scoped_help_app_for_test.h
@@ -0,0 +1,26 @@
+// 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_LOGIN_TEST_SCOPED_HELP_APP_FOR_TEST_H_
+#define CHROME_BROWSER_CHROMEOS_LOGIN_TEST_SCOPED_HELP_APP_FOR_TEST_H_
+
+#include "base/macros.h"
+
+namespace chromeos {
+
+// An object that loads a test version of the HelpApp extension for use in
+// tests. While this object is in scope |HelpAppLauncher| sends requests to the
+// loaded test HelpApp extension. When this object goes out of scope
+// |HelpAppLauncher| reverts to sending requests to the production extension.
+class ScopedHelpAppForTest {
+ public:
+  ScopedHelpAppForTest();
+  virtual ~ScopedHelpAppForTest();
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedHelpAppForTest);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_TEST_SCOPED_HELP_APP_FOR_TEST_H_
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
index d6a3fde8..7c36629 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -85,7 +85,6 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "services/audio/public/cpp/sounds/sounds_manager.h"
-#include "services/ws/public/cpp/property_type_converters.h"
 #include "services/ws/public/mojom/window_manager.mojom.h"
 #include "ui/aura/window.h"
 #include "ui/base/ime/chromeos/extension_ime_util.h"
diff --git a/chrome/browser/chromeos/login/users/avatar/user_image_manager_browsertest.cc b/chrome/browser/chromeos/login/users/avatar/user_image_manager_browsertest.cc
index a51f438..21cbe371 100644
--- a/chrome/browser/chromeos/login/users/avatar/user_image_manager_browsertest.cc
+++ b/chrome/browser/chromeos/login/users/avatar/user_image_manager_browsertest.cc
@@ -39,7 +39,6 @@
 #include "chrome/browser/chromeos/policy/cloud_external_data_manager_base_test_util.h"
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_downloader.h"
@@ -100,8 +99,7 @@
     return NULL;
   }
   policy::UserCloudPolicyManagerChromeOS* policy_manager =
-      policy::UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   if (!policy_manager) {
     ADD_FAILURE();
     return NULL;
diff --git a/chrome/browser/chromeos/login/users/wallpaper_policy_browsertest.cc b/chrome/browser/chromeos/login/users/wallpaper_policy_browsertest.cc
index ef0a42b0..553f95ec 100644
--- a/chrome/browser/chromeos/login/users/wallpaper_policy_browsertest.cc
+++ b/chrome/browser/chromeos/login/users/wallpaper_policy_browsertest.cc
@@ -31,7 +31,6 @@
 #include "chrome/browser/chromeos/policy/cloud_external_data_manager_base_test_util.h"
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/ash/wallpaper_controller_client.h"
@@ -83,8 +82,7 @@
     return NULL;
   }
   policy::UserCloudPolicyManagerChromeOS* policy_manager =
-      policy::UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   if (!policy_manager) {
     ADD_FAILURE();
     return NULL;
diff --git a/chrome/browser/chromeos/login/webview_login_browsertest.cc b/chrome/browser/chromeos/login/webview_login_browsertest.cc
index d7d112d..33dbdbe 100644
--- a/chrome/browser/chromeos/login/webview_login_browsertest.cc
+++ b/chrome/browser/chromeos/login/webview_login_browsertest.cc
@@ -300,7 +300,7 @@
 IN_PROC_BROWSER_TEST_F(WebviewLoginTest, AllowNewUser) {
   WaitForGaiaPageLoad();
 
-  std::string frame_url = "$('gaia-signin').gaiaAuthHost_.reloadUrl_";
+  std::string frame_url = "$('gaia-signin').authenticator_.reloadUrl_";
   // New users are allowed.
   test::OobeJS().ExpectTrue(frame_url + ".search('flow=nosignup') == -1");
 
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index dd9a437d..08de5dc1 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -1222,6 +1222,16 @@
     return;
   }
 
+  const auto* skip_screen_key = oobe_configuration_.FindKeyOfType(
+      configuration::kUpdateSkipUpdate, base::Value::Type::BOOLEAN);
+  const bool skip_screen = skip_screen_key && skip_screen_key->GetBool();
+
+  if (skip_screen) {
+    VLOG(1) << "Skip OOBE Update because of configuration.";
+    OnUpdateCompleted();
+    return;
+  }
+
   // If this is a Cellular First device, instruct UpdateEngine to allow
   // updates over cellular data connections.
   if (chromeos::switches::IsCellularFirstDevice()) {
diff --git a/chrome/browser/chromeos/policy/app_install_event_log_manager_wrapper.cc b/chrome/browser/chromeos/policy/app_install_event_log_manager_wrapper.cc
index f2a1625..55f2ed8 100644
--- a/chrome/browser/chromeos/policy/app_install_event_log_manager_wrapper.cc
+++ b/chrome/browser/chromeos/policy/app_install_event_log_manager_wrapper.cc
@@ -10,7 +10,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -66,8 +65,7 @@
 void AppInstallEventLogManagerWrapper::CreateManager() {
   log_manager_ = std::make_unique<AppInstallEventLogManager>(
       log_task_runner_.get(),
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile_)
+      profile_->GetUserCloudPolicyManagerChromeOS()
           ->GetAppInstallEventLogUploader(),
       profile_);
 }
diff --git a/chrome/browser/chromeos/policy/power_policy_browsertest.cc b/chrome/browser/chromeos/policy/power_policy_browsertest.cc
index a0f54dc2..91cfe82 100644
--- a/chrome/browser/chromeos/policy/power_policy_browsertest.cc
+++ b/chrome/browser/chromeos/policy/power_policy_browsertest.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
@@ -266,8 +265,7 @@
 
 void PowerPolicyBrowserTestBase::ReloadUserPolicy(Profile* profile) {
   UserCloudPolicyManagerChromeOS* policy_manager =
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   ASSERT_TRUE(policy_manager);
   policy_manager->core()->store()->Load();
 }
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
index ba1d560..300ee123 100644
--- a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
@@ -546,6 +546,8 @@
         tpm_status_struct.boot_lockbox_finalized);
   }
 
+  // Note that we use proto3 syntax for ProbeResult, so missing fields will
+  // have default values.
   void OnProbeDataReceived(
       const base::Optional<runtime_probe::ProbeResult>& probe_result,
       const base::circular_deque<std::unique_ptr<SampledData>>& samples) {
@@ -587,6 +589,18 @@
         // uV to mV:
         battery_info->set_design_min_voltage(
             battery.values().voltage_min_design() / 1000);
+        if (battery.values().manufacture_date_smart() > 0) {
+          // manufacture_date in (((year-1980) * 16 + month) * 32 + day) format.
+          int remainder = battery.values().manufacture_date_smart();
+          int day = remainder % 32;
+          remainder /= 32;
+          int month = remainder % 16;
+          remainder /= 16;
+          int year = remainder + 1980;
+          // set manufacture_date in yyyy-mm-dd format.
+          battery_info->set_manufacture_date(
+              base::StringPrintf("%04d-%02d-%02d", year, month, day));
+        }
 
         for (const std::unique_ptr<SampledData>& sample_data : samples) {
           auto it = sample_data->battery_samples.find(battery.name());
diff --git a/chrome/browser/chromeos/policy/status_collector/status_collector.cc b/chrome/browser/chromeos/policy/status_collector/status_collector.cc
index 0e6632d9..95bc288 100644
--- a/chrome/browser/chromeos/policy/status_collector/status_collector.cc
+++ b/chrome/browser/chromeos/policy/status_collector/status_collector.cc
@@ -10,7 +10,6 @@
 #include "chrome/browser/chromeos/policy/device_local_account.h"
 #include "chrome/browser/chromeos/policy/status_collector/activity_storage.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/system/statistics_provider.h"
@@ -139,8 +138,7 @@
 
 std::string StatusCollector::GetDMTokenForProfile(Profile* profile) const {
   CloudPolicyManager* user_cloud_policy_manager =
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   DCHECK(user_cloud_policy_manager != nullptr);
   return user_cloud_policy_manager->core()->client()->dm_token();
 }
diff --git a/chrome/browser/chromeos/policy/user_cloud_external_data_manager_browsertest.cc b/chrome/browser/chromeos/policy/user_cloud_external_data_manager_browsertest.cc
index bf51a6c3..96ecbbf0 100644
--- a/chrome/browser/chromeos/policy/user_cloud_external_data_manager_browsertest.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_external_data_manager_browsertest.cc
@@ -18,7 +18,6 @@
 #include "chrome/browser/chromeos/policy/cloud_external_data_manager_base_test_util.h"
 #include "chrome/browser/chromeos/policy/login_policy_test_base.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/policy/user_policy_test_helper.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
@@ -89,8 +88,7 @@
                                          profile);
 
   UserCloudPolicyManagerChromeOS* policy_manager =
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   ASSERT_TRUE(policy_manager);
   ProfilePolicyConnector* policy_connector =
       profile->GetProfilePolicyConnector();
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc
index 96e8a89..85a2125 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h"
 #include "chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/policy/wildcard_login_checker.h"
 #include "chrome/browser/invalidation/deprecated_profile_invalidation_provider_factory.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_factory.cc b/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_factory.cc
index 9799618..eb1bb40b 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_factory.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_factory.cc
@@ -6,7 +6,6 @@
 
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
@@ -25,7 +24,6 @@
         "UserCloudPolicyTokenForwarder",
         BrowserContextDependencyManager::GetInstance()) {
   DependsOn(IdentityManagerFactory::GetInstance());
-  DependsOn(UserPolicyManagerFactoryChromeOS::GetInstance());
 }
 
 UserCloudPolicyTokenForwarderFactory::~UserCloudPolicyTokenForwarderFactory() {}
@@ -34,8 +32,7 @@
     content::BrowserContext* context) const {
   Profile* profile = static_cast<Profile*>(context);
   UserCloudPolicyManagerChromeOS* manager =
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   identity::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
   if (!manager || !identity_manager)
diff --git a/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc b/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.cc
similarity index 74%
rename from chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc
rename to chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.cc
index d728d25..e931647 100644
--- a/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc
+++ b/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// 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/policy/user_policy_manager_factory_chromeos.h"
+#include "chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.h"
 
 #include <utility>
 
@@ -28,30 +28,23 @@
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/net/system_network_context_manager.h"
-#include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/policy/schema_registry_service.h"
-#include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_features.h"
-#include "chrome/common/pref_names.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/dbus/constants/dbus_paths.h"
 #include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "chromeos/tpm/install_attributes.h"
 #include "components/arc/arc_features.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/policy/core/common/cloud/cloud_external_data_manager.h"
 #include "components/policy/core/common/cloud/device_management_service.h"
 #include "components/policy/core/common/cloud/enterprise_metrics.h"
 #include "components/policy/core/common/configuration_policy_provider.h"
 #include "components/policy/policy_constants.h"
-#include "components/prefs/pref_service.h"
 #include "components/user_manager/known_user.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
-#include "net/url_request/url_request_context_getter.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 using user_manager::known_user::ProfileRequiresPolicy;
@@ -93,86 +86,23 @@
 
 }  // namespace
 
-// static
-UserPolicyManagerFactoryChromeOS*
-UserPolicyManagerFactoryChromeOS::GetInstance() {
-  return base::Singleton<UserPolicyManagerFactoryChromeOS>::get();
-}
-
-// static
-ConfigurationPolicyProvider* UserPolicyManagerFactoryChromeOS::GetForProfile(
-    Profile* profile) {
-  ConfigurationPolicyProvider* cloud_provider =
-      GetInstance()->GetCloudPolicyManagerForProfile(profile);
-  if (cloud_provider) {
-    return cloud_provider;
-  }
-  return GetInstance()->GetActiveDirectoryPolicyManagerForProfile(profile);
-}
-
-// static
-UserCloudPolicyManagerChromeOS*
-UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-    Profile* profile) {
-  return GetInstance()->GetCloudPolicyManager(profile);
-}
-
-// static
-ActiveDirectoryPolicyManager*
-UserPolicyManagerFactoryChromeOS::GetActiveDirectoryPolicyManagerForProfile(
-    Profile* profile) {
-  return GetInstance()->GetActiveDirectoryPolicyManager(profile);
-}
-
-// static
-std::unique_ptr<ConfigurationPolicyProvider>
-UserPolicyManagerFactoryChromeOS::CreateForProfile(
+void CreateConfigurationPolicyProvider(
     Profile* profile,
     bool force_immediate_load,
-    scoped_refptr<base::SequencedTaskRunner> background_task_runner) {
-  return GetInstance()->CreateManagerForProfile(profile, force_immediate_load,
-                                                background_task_runner);
-}
-
-UserPolicyManagerFactoryChromeOS::UserPolicyManagerFactoryChromeOS()
-    : BrowserContextKeyedBaseFactory(
-          "UserCloudPolicyManagerChromeOS",
-          BrowserContextDependencyManager::GetInstance()) {}
-
-UserPolicyManagerFactoryChromeOS::~UserPolicyManagerFactoryChromeOS() {}
-
-UserCloudPolicyManagerChromeOS*
-UserPolicyManagerFactoryChromeOS::GetCloudPolicyManager(Profile* profile) {
-  // Get the manager for the original profile, since the PolicyService is
-  // also shared between the incognito Profile and the original Profile.
-  const auto it = cloud_managers_.find(profile->GetOriginalProfile());
-  return it != cloud_managers_.end() ? it->second : nullptr;
-}
-
-ActiveDirectoryPolicyManager*
-UserPolicyManagerFactoryChromeOS::GetActiveDirectoryPolicyManager(
-    Profile* profile) {
-  // Get the manager for the original profile, since the PolicyService is
-  // also shared between the incognito Profile and the original Profile.
-  const auto it =
-      active_directory_managers_.find(profile->GetOriginalProfile());
-  return it != active_directory_managers_.end() ? it->second : nullptr;
-}
-
-std::unique_ptr<ConfigurationPolicyProvider>
-UserPolicyManagerFactoryChromeOS::CreateManagerForProfile(
-    Profile* profile,
-    bool force_immediate_load,
-    scoped_refptr<base::SequencedTaskRunner> background_task_runner) {
-  DCHECK(cloud_managers_.find(profile) == cloud_managers_.end());
-  DCHECK(active_directory_managers_.find(profile) ==
-         active_directory_managers_.end());
+    scoped_refptr<base::SequencedTaskRunner> background_task_runner,
+    std::unique_ptr<UserCloudPolicyManagerChromeOS>*
+        user_cloud_policy_manager_chromeos_out,
+    std::unique_ptr<ActiveDirectoryPolicyManager>*
+        active_directory_policy_manager_out) {
+  // Clear the two out parameters. Default return will be nullptr for both.
+  *user_cloud_policy_manager_chromeos_out = nullptr;
+  *active_directory_policy_manager_out = nullptr;
 
   // Don't initialize cloud policy for the signin and the lock screen app
   // profile.
   if (chromeos::ProfileHelper::IsSigninProfile(profile) ||
       chromeos::ProfileHelper::IsLockScreenAppProfile(profile)) {
-    return {};
+    return;
   }
 
   // |user| should never be nullptr except for the signin and lock screen app
@@ -207,7 +137,7 @@
     // Mark this profile as not requiring policy.
     user_manager::known_user::SetProfileRequiresPolicy(
         account_id, ProfileRequiresPolicy::kNoPolicyRequired);
-    return {};
+    return;
   }
 
   policy::BrowserPolicyConnectorChromeOS* connector =
@@ -220,7 +150,7 @@
       // migration is finished.  (KioskAppManager still needs to be migrated.)
       if (!user->HasGaiaAccount()) {
         DLOG(WARNING) << "No policy for users without Gaia accounts";
-        return {};
+        return;
       }
       is_active_directory = false;
       break;
@@ -265,7 +195,7 @@
                                   kBlockingInitWithGoogleCloudManagement,
         MetricUserPolicyChromeOSSessionAbortType::kCount);
     chrome::AttemptUserExit();
-    return {};
+    return;
   }
 
   // If true, we must load policy for this user - we will abort profile
@@ -365,9 +295,7 @@
                            kInitWithActiveDirectoryManagement),
         std::move(store), std::move(external_data_manager));
     manager->Init(profile->GetPolicySchemaRegistryService()->registry());
-
-    active_directory_managers_[profile] = manager.get();
-    return std::move(manager);
+    *active_directory_policy_manager_out = std::move(manager);
   } else {
     std::unique_ptr<UserCloudPolicyManagerChromeOS> manager =
         std::make_unique<UserCloudPolicyManagerChromeOS>(
@@ -392,52 +320,8 @@
     manager->Connect(g_browser_process->local_state(),
                      device_management_service,
                      g_browser_process->shared_url_loader_factory());
-
-    cloud_managers_[profile] = manager.get();
-    return std::move(manager);
+    *user_cloud_policy_manager_chromeos_out = std::move(manager);
   }
 }
 
-void UserPolicyManagerFactoryChromeOS::BrowserContextShutdown(
-    content::BrowserContext* context) {
-  Profile* profile = static_cast<Profile*>(context);
-  if (profile->IsOffTheRecord())
-    return;
-
-  // TODO(crbug.com/937770): Move the shut down of |profile_policy_connector|
-  // to where the |cloud_manager| is shut down.
-  ProfilePolicyConnector* profile_policy_connector =
-      profile->GetProfilePolicyConnector();
-  if (profile_policy_connector)
-    profile_policy_connector->Shutdown();
-
-  UserCloudPolicyManagerChromeOS* cloud_manager =
-      GetCloudPolicyManager(profile);
-  if (cloud_manager)
-    cloud_manager->Shutdown();
-  ActiveDirectoryPolicyManager* active_directory_manager =
-      GetActiveDirectoryPolicyManager(profile);
-  if (active_directory_manager)
-    active_directory_manager->Shutdown();
-}
-
-void UserPolicyManagerFactoryChromeOS::BrowserContextDestroyed(
-    content::BrowserContext* context) {
-  Profile* profile = static_cast<Profile*>(context);
-  cloud_managers_.erase(profile);
-  active_directory_managers_.erase(profile);
-  BrowserContextKeyedBaseFactory::BrowserContextDestroyed(context);
-}
-
-void UserPolicyManagerFactoryChromeOS::SetEmptyTestingFactory(
-    content::BrowserContext* context) {}
-
-bool UserPolicyManagerFactoryChromeOS::HasTestingFactory(
-    content::BrowserContext* context) {
-  return false;
-}
-
-void UserPolicyManagerFactoryChromeOS::CreateServiceNow(
-    content::BrowserContext* context) {}
-
 }  // namespace policy
diff --git a/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.h b/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.h
new file mode 100644
index 0000000..52d37946
--- /dev/null
+++ b/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.h
@@ -0,0 +1,37 @@
+// 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_POLICY_USER_POLICY_MANAGER_BUILDER_CHROMEOS_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_USER_POLICY_MANAGER_BUILDER_CHROMEOS_H_
+
+#include <memory>
+
+#include "base/memory/ref_counted.h"
+
+class Profile;
+
+namespace base {
+class SequencedTaskRunner;
+}
+
+namespace policy {
+
+class ActiveDirectoryPolicyManager;
+class UserCloudPolicyManagerChromeOS;
+
+// Create a ConfigurationPolicyProvider for the given Profile.
+// Either a UserCloudPolicyManagerChromeOS, an ActiveDirectoryPolicyManager,
+// or neither will be returned through the out parameters.
+void CreateConfigurationPolicyProvider(
+    Profile* profile,
+    bool force_immediate_load,
+    scoped_refptr<base::SequencedTaskRunner> background_task_runner,
+    std::unique_ptr<UserCloudPolicyManagerChromeOS>*
+        user_cloud_policy_manager_chromeos_out,
+    std::unique_ptr<ActiveDirectoryPolicyManager>*
+        active_directory_policy_manager_out);
+
+}  // namespace policy
+
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_USER_POLICY_MANAGER_BUILDER_CHROMEOS_H_
diff --git a/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h b/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h
deleted file mode 100644
index c07c4218..0000000
--- a/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (c) 2013 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_POLICY_USER_POLICY_MANAGER_FACTORY_CHROMEOS_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_USER_POLICY_MANAGER_FACTORY_CHROMEOS_H_
-
-#include <map>
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/singleton.h"
-#include "components/keyed_service/content/browser_context_keyed_base_factory.h"
-
-class Profile;
-
-namespace base {
-class SequencedTaskRunner;
-}
-
-namespace content {
-class BrowserContext;
-}
-
-namespace policy {
-
-class ConfigurationPolicyProvider;
-class ActiveDirectoryPolicyManager;
-class UserCloudPolicyManagerChromeOS;
-
-// Shared BrowserContextKeyedBaseFactory implementation for
-// UserCloudPolicyManagerChromeOS and ActiveDirectoryPolicyManager.
-//
-// UserCloudPolicyManagerChromeOS/ActiveDirectoryPolicyManager is handled
-// differently than other KeyedServices because it is a dependency of
-// PrefService.  Therefore, lifetime of instances is managed by Profile, Profile
-// startup code invokes CreateForProfile() explicitly, takes ownership, and the
-// instance is only deleted after PrefService destruction.
-//
-// TODO(mnissler): Remove the special lifetime management in favor of
-// PrefService directly depending on UserCloudPolicyManagerChromeOS once the
-// former has been converted to a KeyedService.
-// See also http://crbug.com/131843 and http://crbug.com/131844.
-class UserPolicyManagerFactoryChromeOS : public BrowserContextKeyedBaseFactory {
- public:
-  // Returns an instance of the UserPolicyManagerFactoryChromeOS singleton.
-  static UserPolicyManagerFactoryChromeOS* GetInstance();
-
-  // Get the ConfigurationPolicyProvider instance associated with |profile|.
-  // Depending on the type of management, either a
-  // UserCloudPolicyManagerChromeOS or an ActiveDirectoryPolicyManager or
-  // nullptr is returned.
-  static ConfigurationPolicyProvider* GetForProfile(Profile* profile);
-
-  // Returns the UserCloudPolicyManagerChromeOS instance associated with
-  // |profile| or nullptr in case there is none.
-  static UserCloudPolicyManagerChromeOS* GetCloudPolicyManagerForProfile(
-      Profile* profile);
-
-  // Returns the ActiveDirectoryPolicyManager instance associated with |profile|
-  // or nullptr in case there is none.
-  static ActiveDirectoryPolicyManager*
-  GetActiveDirectoryPolicyManagerForProfile(Profile* profile);
-
-  // Creates an instance for |profile|. Note that the caller is responsible for
-  // managing the lifetime of the instance. Subsequent calls to GetForProfile()
-  // will return the created instance as long as it lives.
-  //
-  // If |force_immediate_load| is true, policy is loaded synchronously from
-  // UserCloudPolicyStore at startup.
-  static std::unique_ptr<ConfigurationPolicyProvider> CreateForProfile(
-      Profile* profile,
-      bool force_immediate_load,
-      scoped_refptr<base::SequencedTaskRunner> background_task_runner);
-
- private:
-  friend struct base::DefaultSingletonTraits<UserPolicyManagerFactoryChromeOS>;
-
-  UserPolicyManagerFactoryChromeOS();
-  ~UserPolicyManagerFactoryChromeOS() override;
-
-  // See comments for the static versions above.
-  UserCloudPolicyManagerChromeOS* GetCloudPolicyManager(Profile* profile);
-  ActiveDirectoryPolicyManager* GetActiveDirectoryPolicyManager(
-      Profile* profile);
-  std::unique_ptr<ConfigurationPolicyProvider> CreateManagerForProfile(
-      Profile* profile,
-      bool force_immediate_load,
-      scoped_refptr<base::SequencedTaskRunner> background_task_runner);
-
-  // BrowserContextKeyedBaseFactory:
-  void BrowserContextShutdown(content::BrowserContext* context) override;
-  void BrowserContextDestroyed(content::BrowserContext* context) override;
-  void SetEmptyTestingFactory(content::BrowserContext* context) override;
-  bool HasTestingFactory(content::BrowserContext* context) override;
-  void CreateServiceNow(content::BrowserContext* context) override;
-
-  std::map<Profile*, UserCloudPolicyManagerChromeOS*> cloud_managers_;
-  std::map<Profile*, ActiveDirectoryPolicyManager*> active_directory_managers_;
-
-  DISALLOW_COPY_AND_ASSIGN(UserPolicyManagerFactoryChromeOS);
-};
-
-}  // namespace policy
-
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_USER_POLICY_MANAGER_FACTORY_CHROMEOS_H_
diff --git a/chrome/browser/chromeos/policy/user_policy_test_helper.cc b/chrome/browser/chromeos/policy/user_policy_test_helper.cc
index 15e10938..5d318ed 100644
--- a/chrome/browser/chromeos/policy/user_policy_test_helper.cc
+++ b/chrome/browser/chromeos/policy/user_policy_test_helper.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
@@ -48,8 +47,7 @@
   connector->ScheduleServiceInitialization(0);
 
   UserCloudPolicyManagerChromeOS* const policy_manager =
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   DCHECK(!policy_manager->IsInitializationComplete(POLICY_DOMAIN_CHROME));
 
   // Give a bogus OAuth token to the |policy_manager|. This should make its
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
index 84b3dd3..6ff2df9 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.cc
@@ -223,20 +223,15 @@
   if (adapter_status_ == Status::kDisabled)
     return;
 
-  personal_curve_.emplace(brightness_curve);
+  model_.personal_curve = brightness_curve;
+  ++model_.iteration_count;
 }
 
-void Adapter::OnModelInitialized(
-    const base::Optional<MonotoneCubicSpline>& global_curve,
-    const base::Optional<MonotoneCubicSpline>& personal_curve) {
+void Adapter::OnModelInitialized(const Model& model) {
   DCHECK(!model_initialized_);
 
   model_initialized_ = true;
-
-  if (global_curve)
-    global_curve_.emplace(*global_curve);
-  if (personal_curve)
-    personal_curve_.emplace(*personal_curve);
+  model_ = model;
 
   UpdateStatus();
 }
@@ -279,12 +274,12 @@
 }
 
 base::Optional<MonotoneCubicSpline> Adapter::GetGlobalCurveForTesting() const {
-  return global_curve_;
+  return model_.global_curve;
 }
 
 base::Optional<MonotoneCubicSpline> Adapter::GetPersonalCurveForTesting()
     const {
-  return personal_curve_;
+  return model_.personal_curve;
 }
 
 base::Optional<AlsAvgStdDev> Adapter::GetAverageAmbientWithStdDevForTesting(
@@ -367,21 +362,8 @@
     return;
   }
   params_.model_curve = static_cast<ModelCurve>(model_curve);
-
-  const int auto_brightness_als_horizon_seconds =
-      GetFieldTrialParamByFeatureAsInt(
-          features::kAutoScreenBrightness,
-          "auto_brightness_als_horizon_seconds",
-          model_config.auto_brightness_als_horizon_seconds);
-
-  if (auto_brightness_als_horizon_seconds <= 0) {
-    adapter_status_ = Status::kDisabled;
-    LogParameterError(ParameterError::kAdapterError);
-    return;
-  }
-
-  params_.auto_brightness_als_horizon =
-      base::TimeDelta::FromSeconds(auto_brightness_als_horizon_seconds);
+  params_.auto_brightness_als_horizon = base::TimeDelta::FromSeconds(
+      model_config.auto_brightness_als_horizon_seconds);
   log_als_values_ = std::make_unique<AmbientLightSampleBuffer>(
       params_.auto_brightness_als_horizon);
 
@@ -431,7 +413,7 @@
   if (!model_initialized_)
     return;
 
-  if (!global_curve_) {
+  if (!model_.global_curve) {
     adapter_status_ = Status::kDisabled;
     SetMetricsReporterDeviceClass();
     return;
@@ -521,7 +503,7 @@
     return decision;
   }
 
-  if (params_.model_curve == ModelCurve::kPersonal && !personal_curve_) {
+  if (params_.model_curve == ModelCurve::kPersonal && !model_.personal_curve) {
     decision.no_brightness_change_cause =
         NoBrightnessChangeCause::kMissingPersonalCurve;
     return decision;
@@ -631,15 +613,15 @@
   DCHECK_EQ(adapter_status_, Status::kSuccess);
   switch (params_.model_curve) {
     case ModelCurve::kGlobal:
-      return global_curve_->Interpolate(ambient_log_lux);
+      return model_.global_curve->Interpolate(ambient_log_lux);
     case ModelCurve::kPersonal:
-      DCHECK(personal_curve_);
-      return personal_curve_->Interpolate(ambient_log_lux);
+      DCHECK(model_.personal_curve);
+      return model_.personal_curve->Interpolate(ambient_log_lux);
     default:
       // We use the latest curve available.
-      if (personal_curve_)
-        return personal_curve_->Interpolate(ambient_log_lux);
-      return global_curve_->Interpolate(ambient_log_lux);
+      if (model_.personal_curve)
+        return model_.personal_curve->Interpolate(ambient_log_lux);
+      return model_.global_curve->Interpolate(ambient_log_lux);
   }
 }
 
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.h b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.h
index 96ec4896..490f56d 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter.h
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter.h
@@ -21,7 +21,7 @@
 #include "chrome/browser/chromeos/power/auto_screen_brightness/metrics_reporter.h"
 #include "chrome/browser/chromeos/power/auto_screen_brightness/model_config.h"
 #include "chrome/browser/chromeos/power/auto_screen_brightness/model_config_loader.h"
-#include "chrome/browser/chromeos/power/auto_screen_brightness/modeller.h"
+#include "chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h"
 #include "chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.h"
 #include "chrome/browser/chromeos/power/auto_screen_brightness/utils.h"
 #include "chromeos/dbus/power/power_manager_client.h"
@@ -185,9 +185,7 @@
 
   // Modeller::Observer overrides:
   void OnModelTrained(const MonotoneCubicSpline& brightness_curve) override;
-  void OnModelInitialized(
-      const base::Optional<MonotoneCubicSpline>& global_curve,
-      const base::Optional<MonotoneCubicSpline>& personal_curve) override;
+  void OnModelInitialized(const Model& model) override;
 
   // ModelConfigLoader::Observer overrides:
   void OnModelConfigLoaded(base::Optional<ModelConfig> model_config) override;
@@ -231,7 +229,8 @@
           MetricsReporter* metrics_reporter,
           const base::TickClock* tick_clock);
 
-  // Called by |OnModelConfigLoaded|. It will initialize all params used by
+  // Called by |OnModelConfigLoaded| and only if |model_config| has been checked
+  // as valid by ModelConfigLoader. It will initialize all params used by
   // the modeller from |model_config| and also other experiment flags. If
   // any param is invalid, it will disable the adapter.
   void InitParams(const ModelConfig& model_config);
@@ -258,9 +257,9 @@
   void AdjustBrightness(BrightnessChangeCause cause, double log_als_avg);
 
   // Calculates brightness from given |ambient_log_lux| based on either
-  // |global_curve_| or |personal_curve_| (as specified by the experiment
-  // params). It's only safe to call this method when |CanAdjustBrightness|
-  // returns a |BrightnessChangeCause| in its decision.
+  // |model_.global_curve| or |model_.personal_curve| (as specified by the
+  // experiment params). It's only safe to call this method when
+  // |CanAdjustBrightness| returns a |BrightnessChangeCause| in its decision.
   double GetBrightnessBasedOnAmbientLogLux(double ambient_log_lux) const;
 
   // Called when brightness is changed by the model or user. This function
@@ -362,8 +361,7 @@
   base::Optional<double> brightening_threshold_;
   base::Optional<double> darkening_threshold_;
 
-  base::Optional<MonotoneCubicSpline> global_curve_;
-  base::Optional<MonotoneCubicSpline> personal_curve_;
+  Model model_;
 
   // |average_log_ambient_lux_| is only recorded when screen brightness is
   // changed by either model or user. New thresholds will be calculated from it.
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc b/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
index d4a7397..e30f049 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
@@ -61,21 +61,15 @@
   FakeModeller() = default;
   ~FakeModeller() override = default;
 
-  void InitModellerWithCurves(
-      const base::Optional<MonotoneCubicSpline>& global_curve,
-      const base::Optional<MonotoneCubicSpline>& personal_curve) {
+  void InitModellerWithModel(const Model& model) {
     DCHECK(!modeller_initialized_);
     modeller_initialized_ = true;
-    if (global_curve)
-      global_curve_.emplace(*global_curve);
-
-    if (personal_curve)
-      personal_curve_.emplace(*personal_curve);
+    model_ = model;
   }
 
   void ReportModelTrained(const MonotoneCubicSpline& personal_curve) {
     DCHECK(modeller_initialized_);
-    personal_curve_.emplace(personal_curve);
+    model_.personal_curve = personal_curve;
     for (auto& observer : observers_)
       observer.OnModelTrained(personal_curve);
   }
@@ -83,7 +77,7 @@
   void ReportModelInitialized() {
     DCHECK(modeller_initialized_);
     for (auto& observer : observers_)
-      observer.OnModelInitialized(global_curve_, personal_curve_);
+      observer.OnModelInitialized(model_);
   }
 
   // Modeller overrides:
@@ -91,7 +85,7 @@
     DCHECK(observer);
     observers_.AddObserver(observer);
     if (modeller_initialized_)
-      observer->OnModelInitialized(global_curve_, personal_curve_);
+      observer->OnModelInitialized(model_);
   }
 
   void RemoveObserver(Modeller::Observer* observer) override {
@@ -101,8 +95,7 @@
 
  private:
   bool modeller_initialized_ = false;
-  base::Optional<MonotoneCubicSpline> global_curve_;
-  base::Optional<MonotoneCubicSpline> personal_curve_;
+  Model model_;
 
   base::ObserverList<Observer> observers_;
 };
@@ -151,8 +144,12 @@
 
     chromeos::PowerManagerClient::Get()->AddObserver(&test_observer_);
 
-    global_curve_.emplace(MonotoneCubicSpline({-4, 12, 20}, {30, 80, 100}));
-    personal_curve_.emplace(MonotoneCubicSpline({-4, 12, 20}, {20, 60, 100}));
+    global_curve_ = MonotoneCubicSpline::CreateMonotoneCubicSpline(
+        {-4, 12, 20}, {30, 80, 100});
+    personal_curve_ = MonotoneCubicSpline::CreateMonotoneCubicSpline(
+        {-4, 12, 20}, {20, 60, 100});
+    DCHECK(global_curve_);
+    DCHECK(personal_curve_);
   }
 
   void TearDown() override {
@@ -211,14 +208,13 @@
   // Sets up all required input for Adapter and then creates Adapter.
   void Init(AlsReader::AlsInitStatus als_reader_status,
             BrightnessMonitor::Status brightness_monitor_status,
-            const base::Optional<MonotoneCubicSpline>& global_curve,
-            const base::Optional<MonotoneCubicSpline>& personal_curve,
+            const Model& model,
             const base::Optional<ModelConfig>& model_config,
             const std::map<std::string, std::string>& params,
             bool brightness_set_by_policy = false) {
     fake_als_reader_.set_als_init_status(als_reader_status);
     fake_brightness_monitor_.set_status(brightness_monitor_status);
-    fake_modeller_.InitModellerWithCurves(global_curve, personal_curve);
+    fake_modeller_.InitModellerWithModel(model);
     if (model_config) {
       fake_model_config_loader_.set_model_config(model_config.value());
     }
@@ -299,7 +295,6 @@
       {"darkening_log_lux_threshold", "0.00001"},
       {"stabilization_threshold", "100000000"},
       {"model_curve", "2"},
-      {"auto_brightness_als_horizon_seconds", "5"},
       {"user_adjustment_effect", "0"},
   };
 
@@ -314,7 +309,7 @@
 // AlsReader is |kDisabled| when Adapter is created.
 TEST_F(AdapterTest, AlsReaderDisabledOnInit) {
   Init(AlsReader::AlsInitStatus::kDisabled, BrightnessMonitor::Status::kSuccess,
-       global_curve_, base::nullopt /* personal_curve */, GetTestModelConfig(),
+       Model(global_curve_, base::nullopt, 0), GetTestModelConfig(),
        default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kDisabled);
@@ -323,7 +318,7 @@
 // BrightnessMonitor is |kDisabled| when Adapter is created.
 TEST_F(AdapterTest, BrightnessMonitorDisabledOnInit) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kDisabled,
-       global_curve_, base::nullopt /* personal_curve */, GetTestModelConfig(),
+       Model(global_curve_, base::nullopt, 0), GetTestModelConfig(),
        default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kDisabled);
@@ -332,8 +327,7 @@
 // Modeller is |kDisabled| when Adapter is created.
 TEST_F(AdapterTest, ModellerDisabledOnInit) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       base::nullopt /* global_curve */, base::nullopt /* personal_curve */,
-       GetTestModelConfig(), default_params_);
+       Model(), GetTestModelConfig(), default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kDisabled);
 }
@@ -341,8 +335,7 @@
 // ModelConfigLoader has an invalid config, hence Modeller is disabled.
 TEST_F(AdapterTest, ModelConfigLoaderDisabledOnInit) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, base::nullopt /* personal_curve */, ModelConfig(),
-       default_params_);
+       Model(global_curve_, base::nullopt, 0), ModelConfig(), default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kDisabled);
 }
@@ -350,8 +343,8 @@
 // AlsReader is |kDisabled| on later notification.
 TEST_F(AdapterTest, AlsReaderDisabledOnNotification) {
   Init(AlsReader::AlsInitStatus::kInProgress,
-       BrightnessMonitor::Status::kSuccess, global_curve_,
-       base::nullopt /* personal_curve */, GetTestModelConfig(),
+       BrightnessMonitor::Status::kSuccess,
+       Model(global_curve_, base::nullopt, 0), GetTestModelConfig(),
        default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kInitializing);
@@ -364,8 +357,8 @@
 // AlsReader is |kSuccess| on later notification.
 TEST_F(AdapterTest, AlsReaderEnabledOnNotification) {
   Init(AlsReader::AlsInitStatus::kInProgress,
-       BrightnessMonitor::Status::kSuccess, global_curve_,
-       base::nullopt /* personal_curve */, GetTestModelConfig(),
+       BrightnessMonitor::Status::kSuccess,
+       Model(global_curve_, base::nullopt, 0), GetTestModelConfig(),
        default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kInitializing);
@@ -383,8 +376,8 @@
 // BrightnessMonitor is |kDisabled| on later notification.
 TEST_F(AdapterTest, BrightnessMonitorDisabledOnNotification) {
   Init(AlsReader::AlsInitStatus::kSuccess,
-       BrightnessMonitor::Status::kInitializing, global_curve_,
-       base::nullopt /* personal_curve */, GetTestModelConfig(),
+       BrightnessMonitor::Status::kInitializing,
+       Model(global_curve_, base::nullopt, 0), GetTestModelConfig(),
        default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kInitializing);
@@ -397,8 +390,8 @@
 // BrightnessMonitor is |kSuccess| on later notification.
 TEST_F(AdapterTest, BrightnessMonitorEnabledOnNotification) {
   Init(AlsReader::AlsInitStatus::kSuccess,
-       BrightnessMonitor::Status::kInitializing, global_curve_,
-       base::nullopt /* personal_curve */, GetTestModelConfig(),
+       BrightnessMonitor::Status::kInitializing,
+       Model(global_curve_, base::nullopt, 0), GetTestModelConfig(),
        default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kInitializing);
@@ -421,7 +414,7 @@
   thread_bundle_.RunUntilIdle();
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kInitializing);
 
-  fake_modeller_.InitModellerWithCurves(base::nullopt, base::nullopt);
+  fake_modeller_.InitModellerWithModel(Model());
   fake_modeller_.ReportModelInitialized();
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kDisabled);
   EXPECT_FALSE(adapter_->GetGlobalCurveForTesting());
@@ -437,7 +430,8 @@
   thread_bundle_.RunUntilIdle();
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kInitializing);
 
-  fake_modeller_.InitModellerWithCurves(global_curve_, personal_curve_);
+  fake_modeller_.InitModellerWithModel(
+      Model(global_curve_, personal_curve_, 0));
   fake_modeller_.ReportModelInitialized();
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
   EXPECT_TRUE(adapter_->GetGlobalCurveForTesting());
@@ -449,8 +443,7 @@
 // ModelConfigLoader reports an invalid config on later notification.
 TEST_F(AdapterTest, InvalidModelConfigOnNotification) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, base::nullopt /* personal_curve */, base::nullopt,
-       default_params_);
+       Model(global_curve_, base::nullopt, 0), base::nullopt, default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kInitializing);
 
@@ -466,8 +459,7 @@
 // ModelConfigLoader reports a valid config on later notification.
 TEST_F(AdapterTest, ValidModelConfigOnNotification) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, base::nullopt /* personal_curve */, base::nullopt,
-       default_params_);
+       Model(global_curve_, base::nullopt, 0), base::nullopt, default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kInitializing);
 
@@ -485,7 +477,8 @@
 // |auto_brightness_als_horizon_seconds|, brightness is changed.
 TEST_F(AdapterTest, FirstAlsAfterAlsReaderInitTime) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), default_params_);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -504,7 +497,8 @@
 // changed.
 TEST_F(AdapterTest, FirstAlsAtAlsReaderInitTime) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), default_params_);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -521,7 +515,8 @@
 
 TEST_F(AdapterTest, SequenceOfBrightnessUpdatesWithDefaultParams) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), default_params_);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
   EXPECT_TRUE(adapter_->GetGlobalCurveForTesting());
@@ -589,7 +584,8 @@
 // the adapter because |user_adjustment_effect| is 0 (disabled).
 TEST_F(AdapterTest, UserBrightnessChangeAlsReadingExists) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), default_params_);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -629,7 +625,7 @@
   // UserAdjustmentEffect::kContinueAuto = 2.
   params["user_adjustment_effect"] = "2";
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -672,7 +668,8 @@
 // brightness change comes when there is no ALS reading.
 TEST_F(AdapterTest, UserBrightnessChangeAlsReadingAbsent) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), default_params_);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -711,7 +708,7 @@
   // UserAdjustmentEffect::kContinueAuto = 2.
   params["user_adjustment_effect"] = "2";
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -751,7 +748,7 @@
   std::map<std::string, std::string> params = default_params_;
   params["brightening_log_lux_threshold"] = "100";
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
   EXPECT_TRUE(adapter_->GetGlobalCurveForTesting());
@@ -805,7 +802,7 @@
   std::map<std::string, std::string> params = default_params_;
   params["darkening_log_lux_threshold"] = "100";
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   ForwardTimeAndReportAls({10, 20, 30, 40});
   EXPECT_EQ(test_observer_.num_changes(), 0);
@@ -842,7 +839,7 @@
   std::map<std::string, std::string> params = default_params_;
   params["stabilization_threshold"] = "0.00001";
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   ForwardTimeAndReportAls({10, 20, 30, 40, 50});
   EXPECT_EQ(test_observer_.num_changes(), 1);
@@ -866,11 +863,13 @@
 // stabilization.
 TEST_F(AdapterTest, AlsHorizon) {
   std::map<std::string, std::string> params = default_params_;
-  params["auto_brightness_als_horizon_seconds"] = "1";
   // Small |stabilization_threshold|.
   params["stabilization_threshold"] = "0.00001";
+  ModelConfig test_config = GetTestModelConfig();
+  test_config.auto_brightness_als_horizon_seconds = 1;
+
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), test_config, params);
 
   ForwardTimeAndReportAls({10});
   EXPECT_EQ(test_observer_.num_changes(), 1);
@@ -891,8 +890,7 @@
 
   // Init modeller with only a global curve.
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, base::nullopt /* personal_curve */, GetTestModelConfig(),
-       params);
+       Model(global_curve_, base::nullopt, 0), GetTestModelConfig(), params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -929,7 +927,7 @@
   params["model_curve"] = "0";
 
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -959,8 +957,8 @@
 
 TEST_F(AdapterTest, BrightnessSetByPolicy) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), default_params_,
-       true /* brightness_set_by_policy */);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       default_params_, true /* brightness_set_by_policy */);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
 
@@ -974,7 +972,8 @@
   std::map<std::string, std::string> empty_params;
 
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), empty_params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       empty_params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kDisabled);
 
@@ -991,7 +990,8 @@
 
 TEST_F(AdapterTest, ValidParameters) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), default_params_);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       default_params_);
 
   histogram_tester_.ExpectTotalCount("AutoScreenBrightness.ParameterError", 0);
 }
@@ -1001,7 +1001,7 @@
   params["user_adjustment_effect"] = "10";
 
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   histogram_tester_.ExpectUniqueSample(
       "AutoScreenBrightness.ParameterError",
@@ -1011,7 +1011,8 @@
 TEST_F(AdapterTest, UserAdjustmentEffectDisable) {
   // |default_params_| sets the effect to disable.
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), default_params_);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(),
+       default_params_);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
   EXPECT_TRUE(adapter_->GetGlobalCurveForTesting());
@@ -1052,7 +1053,7 @@
   params["user_adjustment_effect"] = "1";
 
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
   EXPECT_TRUE(adapter_->GetGlobalCurveForTesting());
@@ -1124,7 +1125,7 @@
   params["user_adjustment_effect"] = "2";
 
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig(), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig(), params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
   EXPECT_TRUE(adapter_->GetGlobalCurveForTesting());
@@ -1165,7 +1166,8 @@
   params.erase("user_adjustment_effect");
 
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       global_curve_, personal_curve_, GetTestModelConfig("atlas"), params);
+       Model(global_curve_, personal_curve_, 0), GetTestModelConfig("atlas"),
+       params);
 
   EXPECT_EQ(adapter_->GetStatusForTesting(), Adapter::Status::kSuccess);
   EXPECT_TRUE(adapter_->GetGlobalCurveForTesting());
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.cc b/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.cc
index f735ba3..40e7f2b 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer.cc
@@ -394,7 +394,9 @@
   if (!need_to_update_curve_)
     return *current_curve_;
 
-  current_curve_.emplace(MonotoneCubicSpline(ambient_log_lux_, brightness_));
+  current_curve_ = MonotoneCubicSpline::CreateMonotoneCubicSpline(
+      ambient_log_lux_, brightness_);
+  DCHECK(current_curve_);
   need_to_update_curve_ = false;
   return *current_curve_;
 }
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer_unittest.cc b/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer_unittest.cc
index c2338c2..5e6b2fc 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer_unittest.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/gaussian_trainer_unittest.cc
@@ -20,8 +20,12 @@
 class GaussianTrainerTest : public testing::Test {
  public:
   GaussianTrainerTest()
-      : global_curve_(MonotoneCubicSpline(log_lux_, global_brightness_)),
-        personal_curve_(MonotoneCubicSpline(log_lux_, personal_brightness_)) {}
+      : global_curve_(*MonotoneCubicSpline::CreateMonotoneCubicSpline(
+            log_lux_,
+            global_brightness_)),
+        personal_curve_(*MonotoneCubicSpline::CreateMonotoneCubicSpline(
+            log_lux_,
+            personal_brightness_)) {}
 
   void ResetModelWithParams(const std::map<std::string, std::string>& params) {
     base::test::ScopedFeatureList scoped_feature_list;
@@ -551,11 +555,13 @@
       gaussian_trainer_->SetInitialCurves(global_curve_, personal_curve_));
 
   const MonotoneCubicSpline trained_curve = gaussian_trainer_->Train({data});
-  const MonotoneCubicSpline expected_curve(
-      log_lux_,
-      {3.0,  8.0,  12.48, 18.72, 24.96, 31.2, 37.44, 43.68, 49.92, 56.16, 62.4,
-       62.4, 62.4, 66.0,  71.0,  76.0,  81.0, 86.0,  91.0,  95,    100.0});
-  EXPECT_EQ(trained_curve, expected_curve);
+  const base::Optional<MonotoneCubicSpline> expected_curve =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(
+          log_lux_, {3.0,   8.0,   12.48, 18.72, 24.96, 31.2, 37.44,
+                     43.68, 49.92, 56.16, 62.4,  62.4,  62.4, 66.0,
+                     71.0,  76.0,  81.0,  86.0,  91.0,  95,   100.0});
+  DCHECK(expected_curve);
+  EXPECT_EQ(trained_curve, *expected_curve);
 }
 
 // Initial personal curve doesn't satisfy slope constraints.
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/model_config.cc b/chrome/browser/chromeos/power/auto_screen_brightness/model_config.cc
index 188565a..30af4e57 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/model_config.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/model_config.cc
@@ -60,7 +60,7 @@
     return false;
 
   if (model_config.log_lux.size() != model_config.brightness.size() ||
-      model_config.brightness.empty())
+      model_config.brightness.size() < 2)
     return false;
 
   if (model_config.metrics_key.empty())
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/modeller.h b/chrome/browser/chromeos/power/auto_screen_brightness/modeller.h
index fdb12c3b..71aea74 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/modeller.h
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/modeller.h
@@ -13,6 +13,8 @@
 namespace power {
 namespace auto_screen_brightness {
 
+struct Model;
+
 // Interface to on-device adaptive model.
 class Modeller {
  public:
@@ -29,9 +31,7 @@
     // Called when the model is initialized. If model is disabled, both
     // |global_curve| and |personal_curve| will be nullopt. If there is only a
     // global curve, then |personal_curve| will be nullopt.
-    virtual void OnModelInitialized(
-        const base::Optional<MonotoneCubicSpline>& global_curve,
-        const base::Optional<MonotoneCubicSpline>& personal_curve) = 0;
+    virtual void OnModelInitialized(const Model& model) = 0;
 
    private:
     DISALLOW_COPY_AND_ASSIGN(Observer);
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.cc b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.cc
index 43deaee..5112339 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.cc
@@ -12,6 +12,7 @@
 #include "base/files/important_file_writer.h"
 #include "base/logging.h"
 #include "base/metrics/field_trial_params.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -31,38 +32,50 @@
 
 namespace {
 
-// Loads curve from a specified location on disk. This should run in another
-// thread to be non-blocking to the main thread (if |is_testing| is false).
-// The ambient values read from disk should be in the log-domain already.
-base::Optional<MonotoneCubicSpline> LoadCurveFromDisk(
-    const base::FilePath& path,
-    bool is_testing) {
+// Loads saved model from locations specified by |spec|. This
+// should run in another thread to be non-blocking to the main thread (if
+// |is_testing| is false). The ambient values read from disk should be in the
+// log-domain already.
+// TODO(jiameng): add UMA metrics to record model loading status.
+Model LoadModelFromDisk(const ModellerImpl::ModelSavingSpec& spec,
+                        bool is_testing) {
   DCHECK(is_testing ||
          !content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-  if (!PathExists(path)) {
-    return base::nullopt;
-  }
-
+  Model loaded_model;
   std::string content;
-  if (!base::ReadFileToString(path, &content) || content.empty()) {
-    return base::nullopt;
-  }
 
-  return MonotoneCubicSpline::FromString(content);
+  // If global curve doesn't exist or can't be parsed, then we ignore all saved
+  // data.
+  if (!PathExists(spec.global_curve) ||
+      !base::ReadFileToString(spec.global_curve, &content))
+    return loaded_model;
+  loaded_model.global_curve = MonotoneCubicSpline::FromString(content);
+  if (!loaded_model.global_curve)
+    return loaded_model;
+
+  // If personal curve doesn't exist or can't be parsed, then we ignore any
+  // saved personal model. The iteration count is implicitly set to 0.
+  if (!PathExists(spec.personal_curve) ||
+      !base::ReadFileToString(spec.personal_curve, &content))
+    return loaded_model;
+  loaded_model.personal_curve = MonotoneCubicSpline::FromString(content);
+  if (!loaded_model.personal_curve)
+    return loaded_model;
+
+  int iteration_count = 0;
+  // If iteration count doesn't exist or can't be parsed, it's reset to 0.
+  if (!PathExists(spec.iteration_count) ||
+      !base::ReadFileToString(spec.iteration_count, &content) ||
+      content.empty() || !base::StringToInt(content, &iteration_count))
+    return loaded_model;
+  loaded_model.iteration_count = iteration_count;
+
+  return loaded_model;
 }
 
-// Saves |curve| to disk and returns whether it was successful. This should run
-// in another thread to be non-blocking to the main thread (if |is_testing| is
-// false).
-// TODO(jiameng): write to a temp location and rename to |path|. Refactor out
-// the logic that's shared with the unit test to utils.
-bool SaveCurveToDisk(const base::FilePath& path,
-                     const MonotoneCubicSpline& curve,
-                     bool is_testing) {
-  DCHECK(is_testing ||
-         !content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-  const std::string data = curve.ToString();
-  DCHECK(!data.empty());
+// Saves |data| to |path|. Returns whether successful and logs error if an
+// error occurs.
+bool SaveDataAndLogError(const base::FilePath& path, const std::string& data) {
   const int bytes_written = base::WriteFile(path, data.data(), data.size());
   if (bytes_written != static_cast<int>(data.size())) {
     LOG(ERROR) << "Wrote " << bytes_written << " byte(s) instead of "
@@ -100,7 +113,49 @@
 }  // namespace
 
 constexpr char ModellerImpl::kModelDir[];
-constexpr char ModellerImpl::kCurveFileName[];
+constexpr char ModellerImpl::kGlobalCurveFileName[];
+constexpr char ModellerImpl::kPersonalCurveFileName[];
+constexpr char ModellerImpl::kModelIterationCountFileName[];
+
+Model::Model() = default;
+Model::Model(const base::Optional<MonotoneCubicSpline>& global_curve,
+             const base::Optional<MonotoneCubicSpline>& personal_curve,
+             int iteration_count)
+    : global_curve(global_curve),
+      personal_curve(personal_curve),
+      iteration_count(iteration_count) {}
+
+Model::Model(const Model& model) = default;
+Model::~Model() = default;
+
+bool SaveModelToDisk(const ModellerImpl::ModelSavingSpec& model_saving_spec,
+                     const Model& model,
+                     bool save_global_curve,
+                     bool save_personal_curve,
+                     bool is_testing) {
+  DCHECK(is_testing ||
+         !content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+
+  if (save_global_curve) {
+    DCHECK(model.global_curve);
+    const std::string data = model.global_curve->ToString();
+    DCHECK(!data.empty());
+    if (!SaveDataAndLogError(model_saving_spec.global_curve, data))
+      return false;
+  }
+
+  if (save_personal_curve) {
+    DCHECK(model.personal_curve);
+    const std::string data = model.personal_curve->ToString();
+    DCHECK(!data.empty());
+    if (!SaveDataAndLogError(model_saving_spec.personal_curve, data))
+      return false;
+  }
+
+  const std::string data = base::NumberToString(model.iteration_count);
+  DCHECK(!data.empty());
+  return SaveDataAndLogError(model_saving_spec.iteration_count, data);
+}
 
 ModellerImpl::ModellerImpl(const Profile* profile,
                            AlsReader* als_reader,
@@ -238,12 +293,6 @@
   return data_cache_.size();
 }
 
-MonotoneCubicSpline ModellerImpl::GetGlobalCurveForTesting() const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(global_curve_);
-  return *global_curve_;
-}
-
 size_t ModellerImpl::GetMaxTrainingDataPointsForTesting() const {
   return max_training_data_points_;
 }
@@ -256,21 +305,27 @@
   return model_config_;
 }
 
-base::FilePath ModellerImpl::GetCurvePathFromProfile(const Profile* profile) {
+ModellerImpl::ModelSavingSpec ModellerImpl::GetModelSavingSpecFromProfile(
+    const Profile* profile) {
   DCHECK(profile);
-  const base::FilePath empty_path;
 
+  ModelSavingSpec model_saving_spec;
   const base::FilePath profile_path = profile->GetPath();
   if (profile_path.empty()) {
-    return empty_path;
+    return model_saving_spec;
   }
 
   const base::FilePath model_dir = profile_path.Append(kModelDir);
   if (!base::DirectoryExists(model_dir) && !base::CreateDirectory(model_dir)) {
-    return empty_path;
+    return model_saving_spec;
   }
 
-  return model_dir.Append(kCurveFileName);
+  model_saving_spec.global_curve = model_dir.Append(kGlobalCurveFileName);
+  model_saving_spec.personal_curve = model_dir.Append(kPersonalCurveFileName);
+  model_saving_spec.iteration_count =
+      model_dir.Append(kModelIterationCountFileName);
+
+  return model_saving_spec;
 }
 
 ModellerImpl::ModellerImpl(
@@ -311,8 +366,8 @@
     return;
   }
 
-  curve_path_ = GetCurvePathFromProfile(profile);
-  if (curve_path_.empty()) {
+  model_saving_spec_ = GetModelSavingSpecFromProfile(profile);
+  if (model_saving_spec_.global_curve.empty()) {
     is_modeller_enabled_ = false;
     return;
   }
@@ -329,7 +384,7 @@
   if (is_modeller_enabled_.has_value())
     return;
 
-  if (!als_init_status_)
+  if (!als_init_status_.has_value())
     return;
 
   const bool als_success =
@@ -358,34 +413,30 @@
     return;
   }
 
-  RunCustomization();
+  if (!ApplyCustomization()) {
+    is_modeller_enabled_ = false;
+    OnInitializationComplete();
+    return;
+  }
 
   base::PostTaskAndReplyWithResult(
       blocking_task_runner_.get(), FROM_HERE,
-      base::BindOnce(&LoadCurveFromDisk, curve_path_, is_testing_),
-      base::BindOnce(&ModellerImpl::OnCurveLoadedFromDisk,
+      base::BindOnce(&LoadModelFromDisk, model_saving_spec_, is_testing_),
+      base::BindOnce(&ModellerImpl::OnModelLoadedFromDisk,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void ModellerImpl::RunCustomization() {
+bool ModellerImpl::ApplyCustomization() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  global_curve_.emplace(
-      MonotoneCubicSpline(model_config_.log_lux, model_config_.brightness));
+  DCHECK(*model_config_exists_);
 
-  // Get |model_als_horizon_seconds| from finch and use the value from
-  // |model_config_| as its default.
-  int model_als_horizon_seconds = GetFieldTrialParamByFeatureAsInt(
-      features::kAutoScreenBrightness, "model_als_horizon_seconds",
-      model_config_.model_als_horizon_seconds);
+  initial_global_curve_ = MonotoneCubicSpline::CreateMonotoneCubicSpline(
+      model_config_.log_lux, model_config_.brightness);
+  if (!initial_global_curve_)
+    return false;
 
-  // If finch param is invalid, use the value from |model_config_|, which is
-  // guaranteed to be valid.
-  if (model_als_horizon_seconds <= 0) {
-    // TODO(jiameng): log model param error.
-    model_als_horizon_seconds = model_config_.model_als_horizon_seconds;
-  }
   log_als_values_ = std::make_unique<AmbientLightSampleBuffer>(
-      base::TimeDelta::FromSeconds(model_als_horizon_seconds));
+      base::TimeDelta::FromSeconds(model_config_.model_als_horizon_seconds));
 
   // TODO(jiameng): the following params are probably not useful and can be
   // removed.
@@ -401,10 +452,15 @@
   if (training_delay_in_seconds >= 0) {
     training_delay_ = base::TimeDelta::FromSeconds(training_delay_in_seconds);
   }
+
+  return true;
 }
 
 void ModellerImpl::OnInitializationComplete() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(is_modeller_enabled_.has_value());
+  DCHECK(*is_modeller_enabled_ == model_.global_curve.has_value());
+
   // TODO(jiameng): log model status to UMA.
   for (auto& observer : observers_) {
     NotifyObserverInitStatus(observer);
@@ -414,39 +470,36 @@
 void ModellerImpl::NotifyObserverInitStatus(Modeller::Observer& observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(is_modeller_enabled_.has_value());
-  if (!*is_modeller_enabled_) {
-    observer.OnModelInitialized(base::nullopt, base::nullopt);
-  } else {
-    base::Optional<MonotoneCubicSpline> personal_curve;
-    if (has_initial_personal_curve_)
-      personal_curve.emplace(trainer_->GetCurrentCurve());
-
-    observer.OnModelInitialized(global_curve_, personal_curve);
-  }
+  observer.OnModelInitialized(model_);
 }
 
-void ModellerImpl::OnCurveLoadedFromDisk(
-    const base::Optional<MonotoneCubicSpline>& curve) {
+void ModellerImpl::OnModelLoadedFromDisk(const Model& model) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(global_curve_);
+  DCHECK(initial_global_curve_);
 
-  if (curve) {
-    current_curve_.emplace(curve.value());
-  } else {
-    current_curve_.emplace(*global_curve_);
+  model_ = model;
+  if (!model_.global_curve || *model_.global_curve != *initial_global_curve_) {
+    // Reset the model.
+    model_.global_curve = initial_global_curve_;
+    model_.personal_curve = base::nullopt;
+    model_.iteration_count = 0;
+    global_curve_reset_ = true;
   }
 
+  DCHECK(model_.global_curve);
   // Run SetInitialCurves calculations on background thread to avoid blocking UI
   // thread.
   base::PostTaskAndReplyWithResult(
       blocking_task_runner_.get(), FROM_HERE,
-      base::BindOnce(&SetInitialCurves, trainer_.get(), *global_curve_,
-                     *current_curve_, is_testing_),
+      base::BindOnce(
+          &SetInitialCurves, trainer_.get(), *model_.global_curve,
+          model_.personal_curve ? *model_.personal_curve : *model_.global_curve,
+          is_testing_),
       base::BindOnce(&ModellerImpl::OnSetInitialCurves,
-                     weak_ptr_factory_.GetWeakPtr(), curve));
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
-void ModellerImpl::OnCurveSavedToDisk(bool is_successful) {
+void ModellerImpl::OnModelSavedToDisk(bool is_successful) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const base::TimeTicks now = tick_clock_->NowTicks();
 
@@ -456,21 +509,31 @@
     UMA_HISTOGRAM_TIMES("AutoScreenBrightness.NewCurveSaved.Duration",
                         now - training_start_.value());
   }
+
+  // We don't want to repeatedly save the global curve.
+  global_curve_reset_ = false;
 }
 
-void ModellerImpl::OnSetInitialCurves(
-    const base::Optional<MonotoneCubicSpline>& loaded_curve,
-    bool is_personal_curve_valid) {
+void ModellerImpl::OnSetInitialCurves(bool is_personal_curve_valid) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   UMA_HISTOGRAM_BOOLEAN("AutoScreenBrightness.PersonalCurveValid",
                         is_personal_curve_valid);
 
-  has_initial_personal_curve_ = is_personal_curve_valid && loaded_curve;
-  DCHECK(global_curve_);
-  DCHECK(trainer_->GetGlobalCurve() == *global_curve_);
-  DCHECK(trainer_->GetCurrentCurve() ==
-         (has_initial_personal_curve_ ? *loaded_curve : *global_curve_));
+  const bool has_loaded_and_valid_personal_curve =
+      model_.personal_curve && is_personal_curve_valid;
+  DCHECK(model_.global_curve);
+  DCHECK(trainer_->GetGlobalCurve() == *model_.global_curve);
+  DCHECK(trainer_->GetCurrentCurve() == (has_loaded_and_valid_personal_curve
+                                             ? *model_.personal_curve
+                                             : *model_.global_curve));
+
+  if (!has_loaded_and_valid_personal_curve) {
+    model_.personal_curve = base::nullopt;
+    model_.iteration_count = 0;
+  } else if (model_.iteration_count == 0) {
+    model_.iteration_count = 1;
+  }
 
   is_modeller_enabled_ = true;
   OnInitializationComplete();
@@ -517,26 +580,26 @@
   const base::TimeTicks now = tick_clock_->NowTicks();
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  DCHECK(current_curve_);
-  if (current_curve_ == curve) {
-    // Only update current curve if it's different from before.
-    UMA_HISTOGRAM_TIMES(
-        "AutoScreenBrightness.TrainingCompleteDuration.NoNewCurve",
-        now - training_start_.value());
-    return;
-  }
-
-  UMA_HISTOGRAM_TIMES("AutoScreenBrightness.TrainingCompleteDuration.NewCurve",
-                      now - training_start_.value());
-
-  current_curve_.emplace(curve);
+  ++model_.iteration_count;
   for (auto& observer : observers_)
     observer.OnModelTrained(curve);
 
+  // Save personal curve if it doesn't exist or has been updated.
+  const bool save_personal_curve =
+      !model_.personal_curve || *model_.personal_curve != curve;
+  const std::string histogram_name =
+      std::string("AutoScreenBrightness.TrainingCompleteDuration.") +
+      (save_personal_curve ? "NewCurve" : "NoNewCurve");
+  base::UmaHistogramTimes(histogram_name, now - training_start_.value());
+
+  if (save_personal_curve)
+    model_.personal_curve = curve;
+
   base::PostTaskAndReplyWithResult(
       blocking_task_runner_.get(), FROM_HERE,
-      base::BindOnce(&SaveCurveToDisk, curve_path_, curve, is_testing_),
-      base::BindOnce(&ModellerImpl::OnCurveSavedToDisk,
+      base::BindOnce(&SaveModelToDisk, model_saving_spec_, model_,
+                     global_curve_reset_, save_personal_curve, is_testing_),
+      base::BindOnce(&ModellerImpl::OnModelSavedToDisk,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h
index edc5e82..9dc2c4a 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl.h
@@ -33,6 +33,18 @@
 namespace power {
 namespace auto_screen_brightness {
 
+struct Model {
+  Model();
+  Model(const base::Optional<MonotoneCubicSpline>& global_curve,
+        const base::Optional<MonotoneCubicSpline>& personal_curve,
+        int iteration_count);
+  Model(const Model& model);
+  ~Model();
+  base::Optional<MonotoneCubicSpline> global_curve;
+  base::Optional<MonotoneCubicSpline> personal_curve;
+  int iteration_count = 0;
+};
+
 // Real implementation of Modeller.
 // It monitors user-requested brightness changes, ambient light values and
 // trains personal brightness curves when user remains idle for a period of
@@ -46,7 +58,17 @@
                      public ui::UserActivityObserver {
  public:
   static constexpr char kModelDir[] = "autobrightness";
-  static constexpr char kCurveFileName[] = "curve";
+  static constexpr char kGlobalCurveFileName[] = "global_curve";
+  static constexpr char kPersonalCurveFileName[] = "personal_curve";
+  static constexpr char kModelIterationCountFileName[] = "iteration_count";
+
+  // Global curve, personal curve and training iteration count will be saved to
+  // the file paths below.
+  struct ModelSavingSpec {
+    base::FilePath global_curve;
+    base::FilePath personal_curve;
+    base::FilePath iteration_count;
+  };
 
   // ModellerImpl has weak dependencies on all parameters except |trainer|.
   ModellerImpl(const Profile* profile,
@@ -95,9 +117,6 @@
   // training.
   size_t NumberTrainingDataPointsForTesting() const;
 
-  // Returns |global_curve_| for unit tests.
-  MonotoneCubicSpline GetGlobalCurveForTesting() const;
-
   // Returns |max_training_data_points_| for unit tests.
   size_t GetMaxTrainingDataPointsForTesting() const;
 
@@ -105,10 +124,10 @@
 
   ModelConfig GetModelConfigForTesting() const;
 
-  // Returns the path that will be used to store curves. It also creates
-  // intermediate directories if they do not exist. Returns an empty path on
+  // Returns ModelSavingSpec used to store models. It also creates intermediate
+  // directories if they do not exist. The returned paths will be empty on
   // failures.
-  static base::FilePath GetCurvePathFromProfile(const Profile* profile);
+  static ModelSavingSpec GetModelSavingSpecFromProfile(const Profile* profile);
 
  private:
   // ModellerImpl has weak dependencies on all parameters except |trainer|.
@@ -122,45 +141,37 @@
                const base::TickClock* tick_clock,
                bool is_testing = false);
 
-  // Updates |model_status_| by checking |als_init_status_| and
-  // |brightness_monitor_status_| and optionally loads a curve.
-  // 1. |model_status_| is |kDisabled| if either |als_init_status_| is not
-  // |kSuccess|, or |brightness_monitor_success_| is false. The modeller will
-  // notify its observers as soon as |model_status_| is |kDisabled|.
-  // 2. If |als_init_status_| is |kSuccess| and |brightness_monitor_success_| is
-  // true, then this method loads a curve from the disk and sets |model_status_|
-  // to |kPersonal|. If no curve is found from the disk a default curve will be
-  // created and |model_status_| is set to |kGlobal|. All observers will be
-  // notified about the status and the curve.
+  // Called to handle a status change in one of the dependencies (ALS,
+  // brightness monitor, model config loader) of the modeller. If all
+  // dependencies are successfully initialized, attempts initialization of
+  // the modeller (curve loading, parameter customization) and notifies
+  // observers about the result.
   void HandleStatusUpdate();
 
-  // Load customizations from model configs.
-  void RunCustomization();
+  // Applies customizations from model configs. Returns whether it is
+  // successful.
+  bool ApplyCustomization();
 
-  // Notifies its observers on the status of the model. It will be called either
-  // when HandleStatusUpdate is called and |model_status_| is no longer
-  // |kInitializing|, or when an observer is added to the modeller, and
-  // |model_status_| is not |kInitializing|.
+  // Called as soon as |is_modeller_enabled_| has its value set. It will notify
+  // all observers.
   void OnInitializationComplete();
 
-  // Called when the modeller is initialized. It notifies its observers about
-  // constructed global curve and personal curve (loaded from the disk). Both
-  // curves will be nullopt if model is disabled, and personal curve will be
-  // nullopt if no curve is loaded from the disk.
+  // Notifies a given observer about the state of the modeller. Will provide
+  // either
+  // - no curves (if modeller is disabled),
+  // - just a global curve (if no personal curve is available), or
+  // - both a global and personal curve.
   void NotifyObserverInitStatus(Modeller::Observer& observer);
 
-  // Called after we've attempted to construct a |curve| from data saved on
-  // disk. |curve| will be assigned to |current_curve_| if |curve| is not
-  // nullopt. Otherwise, |current_curve_| will have the same value as
-  // |global_curve_|.
-  void OnCurveLoadedFromDisk(const base::Optional<MonotoneCubicSpline>& curve);
+  // Sets the global and personal curves based on the model read from disk. If
+  // the model is invalid or not based on the current model config, instead
+  // resets the global and personal curves.
+  void OnModelLoadedFromDisk(const Model& model);
 
-  void OnCurveSavedToDisk(bool is_successful);
+  void OnModelSavedToDisk(bool is_successful);
 
   // Called after we've set trainer's initial curves.
-  void OnSetInitialCurves(
-      const base::Optional<MonotoneCubicSpline>& loaded_curve,
-      bool is_personal_curve_valid);
+  void OnSetInitialCurves(bool is_personal_curve_valid);
 
   // Either starts training immediately or delays it for |training_delay_|.
   // Training starts immediately if |training_delay_| is 0 or number of training
@@ -226,25 +237,25 @@
   // Whether this modeller has initialized successfully, including connecting
   // to AlsReader, BrightnessMonitor and loading a Trainer.
   // Initially has no value. Guaranteed to have a value after the completion of
-  // |OnCurveLoadedFromDisk|.
+  // |OnModelLoadedFromDisk|.
   base::Optional<bool> is_modeller_enabled_;
 
-  base::FilePath curve_path_;
+  ModelSavingSpec model_saving_spec_;
 
-  // True if a personal curve was successfully loaded from disk and passed to
-  // Trainer and Trainer reported it was valid.
-  bool has_initial_personal_curve_ = false;
+  // Whether the initial global curve is reset to the one constructed from
+  // model config. It is true if there is no saved model loaded from the disk
+  // or if the saved global curve is different from the curve from model config.
+  // If this flag is true, then the global curve is saved to the disk the first
+  // time a personal curve is trained and saved to disk; it will be set to false
+  // after the first saving is done.
+  bool global_curve_reset_ = false;
 
-  // Global curve constructed from predefined params. It will remain nullopt
-  // until |OnModelConfigLoaded| is called. If input model config is nullopt
-  // then |global_curve_| will remain nullopt, else it will be created based on
-  // the model config.
-  base::Optional<MonotoneCubicSpline> global_curve_;
+  // |model_| will be set after initialization is complete and updated each time
+  // training is done with a new curve.
+  Model model_;
 
-  // Current personal curve. Initially it could be either the global curve or
-  // loaded curve. After training, it will be updated each time trainer
-  // generates a new curve.
-  base::Optional<MonotoneCubicSpline> current_curve_;
+  // |initial_global_curve_| is constructed from model config.
+  base::Optional<MonotoneCubicSpline> initial_global_curve_;
 
   // Recent log ambient values.
   std::unique_ptr<AmbientLightSampleBuffer> log_als_values_;
@@ -263,6 +274,19 @@
   DISALLOW_COPY_AND_ASSIGN(ModellerImpl);
 };
 
+// Saves |model| to disk at location specified by |model_saving_spec| and
+// returns whether it was successful. This should run in another thread to be
+// non-blocking to the main thread (if |is_testing| is false).
+// Not every components of |model| will be saved:
+// 1. |global_curve| is saved only if |save_global_curve| is true.
+// 2. |personal_curve| is saved only if |save_personal_curve| is true.
+// 3. |iteration_count| is always saved.
+bool SaveModelToDisk(const ModellerImpl::ModelSavingSpec& model_saving_spec,
+                     const Model& model,
+                     bool save_global_curve,
+                     bool save_personal_curve,
+                     bool is_testing);
+
 }  // namespace auto_screen_brightness
 }  // namespace power
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl_unittest.cc b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl_unittest.cc
index 9a7a9c4..155fbc7 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl_unittest.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/modeller_impl_unittest.cc
@@ -50,7 +50,7 @@
     ys.push_back(ys[i - 1] + 1);
   }
 
-  return MonotoneCubicSpline(xs, ys);
+  return *MonotoneCubicSpline::CreateMonotoneCubicSpline(xs, ys);
 }
 
 void CheckOptionalCurves(
@@ -80,9 +80,8 @@
   bool SetInitialCurves(const MonotoneCubicSpline& global_curve,
                         const MonotoneCubicSpline& current_curve) override {
     DCHECK(is_configured_);
-    global_curve_.emplace(global_curve);
-    current_curve_.emplace(is_personal_curve_valid_ ? current_curve
-                                                    : global_curve);
+    global_curve_ = global_curve;
+    current_curve_ = is_personal_curve_valid_ ? current_curve : global_curve;
     return is_personal_curve_valid_;
   }
 
@@ -109,7 +108,7 @@
     if (data.size() == 1) {
       used_data.push_back(data[0]);
     }
-    current_curve_.emplace(CreateTestCurveFromTrainingData(used_data));
+    current_curve_ = CreateTestCurveFromTrainingData(used_data);
     return *current_curve_;
   }
 
@@ -129,44 +128,31 @@
 
   // Modeller::Observer overrides:
   void OnModelTrained(const MonotoneCubicSpline& brightness_curve) override {
-    personal_curve_.emplace(brightness_curve);
-    trained_curve_received_ = true;
+    model_.personal_curve = brightness_curve;
+    ++model_.iteration_count;
   }
 
-  void OnModelInitialized(
-      const base::Optional<MonotoneCubicSpline>& global_curve,
-      const base::Optional<MonotoneCubicSpline>& personal_curve) override {
+  void OnModelInitialized(const Model& model) override {
     model_initialized_ = true;
-    if (global_curve)
-      global_curve_.emplace(*global_curve);
-
-    if (personal_curve)
-      personal_curve_.emplace(*personal_curve);
-  }
-
-  base::Optional<MonotoneCubicSpline> global_curve() const {
-    return global_curve_;
+    model_ = model;
   }
 
   base::Optional<MonotoneCubicSpline> personal_curve() const {
-    return personal_curve_;
+    return model_.personal_curve;
   }
 
-  void CheckStatus(bool is_model_initialized,
-                   const base::Optional<MonotoneCubicSpline>& global_curve,
-                   const base::Optional<MonotoneCubicSpline>& personal_curve) {
+  int iteration_count() const { return model_.iteration_count; }
+
+  void CheckStatus(bool is_model_initialized, const Model& expected_model) {
     EXPECT_EQ(is_model_initialized, model_initialized_);
-    CheckOptionalCurves(global_curve, global_curve_);
-    CheckOptionalCurves(personal_curve, personal_curve_);
+    CheckOptionalCurves(expected_model.global_curve, model_.global_curve);
+    CheckOptionalCurves(expected_model.personal_curve, model_.personal_curve);
+    EXPECT_EQ(expected_model.iteration_count, model_.iteration_count);
   }
 
-  bool trained_curve_received() { return trained_curve_received_; }
-
  private:
   bool model_initialized_ = false;
-  base::Optional<MonotoneCubicSpline> global_curve_;
-  base::Optional<MonotoneCubicSpline> personal_curve_;
-  bool trained_curve_received_ = false;
+  Model model_;
 
   DISALLOW_COPY_AND_ASSIGN(TestObserver);
 };
@@ -183,6 +169,10 @@
     profile_builder.SetProfileName("testuser@gmail.com");
     profile_builder.SetPath(temp_dir_.GetPath().AppendASCII("TestProfile"));
     profile_ = profile_builder.Build();
+    test_model_config_ = GetTestModelConfig();
+    test_initial_global_curve_ = MonotoneCubicSpline::CreateMonotoneCubicSpline(
+        test_model_config_.log_lux, test_model_config_.brightness);
+    DCHECK(test_initial_global_curve_);
   }
 
   ~ModellerImplTest() override {
@@ -225,17 +215,15 @@
   }
 
  protected:
-  void WriteCurveToFile(const MonotoneCubicSpline& curve) {
-    const base::FilePath curve_path =
-        ModellerImpl::ModellerImpl::GetCurvePathFromProfile(profile_.get());
-    CHECK(!curve_path.empty());
-
-    const std::string data = curve.ToString();
-    const int bytes_written =
-        base::WriteFile(curve_path, data.data(), data.size());
-    ASSERT_EQ(bytes_written, static_cast<int>(data.size()))
-        << "Wrote " << bytes_written << " byte(s) instead of " << data.size()
-        << " to " << curve_path;
+  void WriteModelToFile(const Model& model) {
+    const ModellerImpl::ModelSavingSpec& model_saving_spec =
+        ModellerImpl::ModellerImpl::GetModelSavingSpecFromProfile(
+            profile_.get());
+    CHECK(!model_saving_spec.global_curve.empty());
+    CHECK(!model_saving_spec.personal_curve.empty());
+    CHECK(!model_saving_spec.iteration_count.empty());
+    SaveModelToDisk(model_saving_spec, model, true /* save_global_curve */,
+                    true /* save_personal_curve */, true /* is_testing */);
   }
 
   // Returns a valid ModelConfig.
@@ -262,6 +250,9 @@
   base::ScopedTempDir temp_dir_;
   std::unique_ptr<TestingProfile> profile_;
 
+  ModelConfig test_model_config_;
+  base::Optional<MonotoneCubicSpline> test_initial_global_curve_;
+
   FakeAlsReader fake_als_reader_;
   FakeBrightnessMonitor fake_brightness_monitor_;
   FakeModelConfigLoader fake_model_config_loader_;
@@ -277,21 +268,19 @@
 // AlsReader is |kDisabled| when Modeller is created.
 TEST_F(ModellerImplTest, AlsReaderDisabledOnInit) {
   Init(AlsReader::AlsInitStatus::kDisabled, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig());
+       test_model_config_);
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  // Model should be empty if modeller is disabled.
+  test_observer_->CheckStatus(true /* is_model_initialized */, Model());
 }
 
 // BrightnessMonitor is |kDisabled| when Modeller is created.
 TEST_F(ModellerImplTest, BrightnessMonitorDisabledOnInit) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kDisabled,
-       GetTestModelConfig());
+       test_model_config_);
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  // Model should be empty if modeller is disabled.
+  test_observer_->CheckStatus(true /* is_model_initialized */, Model());
 }
 
 // ModelConfigLoader has an invalid config, hence Modeller is disabled.
@@ -299,80 +288,67 @@
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
        ModelConfig());
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  // Model should be empty if modeller is disabled.
+  test_observer_->CheckStatus(true /* is_model_initialized */, Model());
 }
 
 // AlsReader is |kDisabled| on later notification.
 TEST_F(ModellerImplTest, AlsReaderDisabledOnNotification) {
   Init(AlsReader::AlsInitStatus::kInProgress,
-       BrightnessMonitor::Status::kSuccess, GetTestModelConfig());
+       BrightnessMonitor::Status::kSuccess, test_model_config_);
 
-  test_observer_->CheckStatus(false /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  test_observer_->CheckStatus(false /* is_model_initialized */, Model());
 
   fake_als_reader_.set_als_init_status(AlsReader::AlsInitStatus::kDisabled);
   fake_als_reader_.ReportReaderInitialized();
   thread_bundle_.RunUntilIdle();
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  // Model should be empty if modeller is disabled.
+  test_observer_->CheckStatus(true /* is_model_initialized */, Model());
 }
 
 // AlsReader is |kSuccess| on later notification.
 TEST_F(ModellerImplTest, AlsReaderEnabledOnNotification) {
   Init(AlsReader::AlsInitStatus::kInProgress,
-       BrightnessMonitor::Status::kSuccess, GetTestModelConfig());
+       BrightnessMonitor::Status::kSuccess, test_model_config_);
 
-  test_observer_->CheckStatus(false /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  test_observer_->CheckStatus(false /* is_model_initialized */, Model());
 
   fake_als_reader_.set_als_init_status(AlsReader::AlsInitStatus::kSuccess);
   fake_als_reader_.ReportReaderInitialized();
   thread_bundle_.RunUntilIdle();
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
 }
 
 // BrightnessMonitor is |kDisabled| on later notification.
 TEST_F(ModellerImplTest, BrightnessMonitorDisabledOnNotification) {
   Init(AlsReader::AlsInitStatus::kSuccess,
-       BrightnessMonitor::Status::kInitializing, GetTestModelConfig());
+       BrightnessMonitor::Status::kInitializing, test_model_config_);
 
-  test_observer_->CheckStatus(false /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  test_observer_->CheckStatus(false /* is_model_initialized */, Model());
 
   fake_brightness_monitor_.set_status(BrightnessMonitor::Status::kDisabled);
   fake_brightness_monitor_.ReportBrightnessMonitorInitialized();
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  // Model should be empty if modeller is disabled.
+  test_observer_->CheckStatus(true /* is_model_initialized */, Model());
 }
 
 // BrightnessMonitor is |kSuccess| on later notification.
 TEST_F(ModellerImplTest, BrightnessMonitorEnabledOnNotification) {
   Init(AlsReader::AlsInitStatus::kSuccess,
-       BrightnessMonitor::Status::kInitializing, GetTestModelConfig());
+       BrightnessMonitor::Status::kInitializing, test_model_config_);
 
-  test_observer_->CheckStatus(false /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  test_observer_->CheckStatus(false /* is_model_initialized */, Model());
 
   fake_brightness_monitor_.set_status(BrightnessMonitor::Status::kSuccess);
   fake_brightness_monitor_.ReportBrightnessMonitorInitialized();
   thread_bundle_.RunUntilIdle();
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
 }
 
 // ModelConfigLoader reports an invalid config on later notification.
@@ -380,18 +356,14 @@
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
        base::nullopt /* model_config */);
 
-  test_observer_->CheckStatus(false /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  test_observer_->CheckStatus(false /* is_model_initialized */, Model());
 
   // ModelConfig() creates an invalid config.
   DCHECK(!IsValidModelConfig(ModelConfig()));
   fake_model_config_loader_.set_model_config(ModelConfig());
   fake_model_config_loader_.ReportModelConfigLoaded();
   thread_bundle_.RunUntilIdle();
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  test_observer_->CheckStatus(true /* is_model_initialized */, Model());
 }
 
 // ModelConfigLoader reports a valid config on later notification.
@@ -399,66 +371,81 @@
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
        base::nullopt /* model_config */);
 
-  test_observer_->CheckStatus(false /* is_model_initialized */,
-                              base::nullopt /* global_curve */,
-                              base::nullopt /* personal_curve */);
+  test_observer_->CheckStatus(false /* is_model_initialized */, Model());
 
-  fake_model_config_loader_.set_model_config(GetTestModelConfig());
+  fake_model_config_loader_.set_model_config(test_model_config_);
   fake_model_config_loader_.ReportModelConfigLoaded();
   thread_bundle_.RunUntilIdle();
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
-}
-// There is no saved curve, hence a global curve is created.
-TEST_F(ModellerImplTest, NoSavedCurve) {
-  Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig());
-
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
 }
 
-// A curve is loaded from disk, this is a personal curve.
-TEST_F(ModellerImplTest, CurveLoadedFromProfilePath) {
+// A model is loaded from disk, this is a personal curve, and the saved global
+// curve is the same as initial global curve set from model config, hence there
+// is no need to reset the model.
+TEST_F(ModellerImplTest, ModelLoadedFromProfilePath) {
   const std::vector<double> xs = {0, 10, 20, 40, 60, 80, 90, 100};
   const std::vector<double> ys = {0, 5, 10, 15, 20, 25, 30, 40};
-  MonotoneCubicSpline curve(xs, ys);
+  const base::Optional<MonotoneCubicSpline> personal_curve =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(xs, ys);
+  DCHECK(personal_curve);
 
-  WriteCurveToFile(curve);
+  // Use |test_initial_global_curve_| as the saved global curve.
+  const Model model(test_initial_global_curve_, personal_curve,
+                    1 /* iteration_count */);
+  WriteModelToFile(model);
 
   thread_bundle_.RunUntilIdle();
 
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig());
+       test_model_config_);
+  thread_bundle_.RunUntilIdle();
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(), curve);
+  test_observer_->CheckStatus(true /* is_model_initialized */, model);
   histogram_tester_.ExpectUniqueSample(
       "AutoScreenBrightness.PersonalCurveValid", true, 1);
 }
 
-// A curve is loaded from disk, this is a personal curve. This personal curve
-// doesn't satisfy Trainer slope constraint, hence it's ignored and the global
-// curve is used instead.
-TEST_F(ModellerImplTest, PersonalCurveError) {
+// A model is loaded from disk, this is a personal curve, and the saved global
+// curve is different from the initial global curve set from model config, hence
+// there the model is reset.
+TEST_F(ModellerImplTest, ModelLoadedFromProfilePathWithReset) {
   const std::vector<double> xs = {0, 10, 20, 40, 60, 80, 90, 100};
   const std::vector<double> ys = {0, 5, 10, 15, 20, 25, 30, 40};
-  MonotoneCubicSpline curve(xs, ys);
+  const base::Optional<MonotoneCubicSpline> saved_global_curve =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(xs, ys);
+  DCHECK(saved_global_curve);
 
-  WriteCurveToFile(curve);
+  const Model model(saved_global_curve, saved_global_curve,
+                    2 /* iteration_count */);
+  WriteModelToFile(model);
 
   thread_bundle_.RunUntilIdle();
 
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig(), true /* is_trainer_configured */,
+       test_model_config_);
+
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
+
+  histogram_tester_.ExpectUniqueSample(
+      "AutoScreenBrightness.PersonalCurveValid", true, 1);
+}
+
+// A model is loaded from disk but the personal curve doesn't satisfy Trainer
+// slope constraint, hence it's ignored and the global curve is used instead.
+TEST_F(ModellerImplTest, PersonalCurveError) {
+  const Model model(test_initial_global_curve_, test_initial_global_curve_, 2);
+  WriteModelToFile(model);
+  thread_bundle_.RunUntilIdle();
+
+  Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
+       test_model_config_, true /* is_trainer_configured */,
        false /* is_personal_curve_valid */);
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
 
   histogram_tester_.ExpectUniqueSample(
       "AutoScreenBrightness.PersonalCurveValid", false, 1);
@@ -467,20 +454,18 @@
 // Ambient light values are received. We check average ambient light has been
 // calculated from the recent samples only.
 TEST_F(ModellerImplTest, OnAmbientLightUpdated) {
-  const ModelConfig model_config = GetTestModelConfig();
-  // Set a horizon different from model_config.
-  const int horizon_in_seconds = 4;
+  const int horizon_in_seconds = test_model_config_.model_als_horizon_seconds;
+
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       model_config, true /* is_trainer_configured */,
-       true /* is_personal_curve_valid */,
-       {{"model_als_horizon_seconds",
-         base::NumberToString(horizon_in_seconds)}});
+       test_model_config_, true /* is_trainer_configured */,
+       true /* is_personal_curve_valid */);
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
+  // No model is saved to disk, hence the initial model only has the global
+  // curve set from the config.
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
 
-  EXPECT_EQ(modeller_->GetModelConfigForTesting(), model_config);
+  EXPECT_EQ(modeller_->GetModelConfigForTesting(), test_model_config_);
 
   const int first_lux = 1000;
   double running_sum = 0.0;
@@ -493,6 +478,7 @@
         modeller_->AverageAmbientForTesting(thread_bundle_.NowTicks()).value(),
         running_sum / (i + 1));
   }
+  EXPECT_EQ(test_observer_->iteration_count(), 0);
 
   // Add another one should push the oldest |first_lux| out of the horizon.
   thread_bundle_.FastForwardBy(base::TimeDelta::FromSeconds(1));
@@ -501,6 +487,7 @@
   EXPECT_DOUBLE_EQ(
       modeller_->AverageAmbientForTesting(thread_bundle_.NowTicks()).value(),
       running_sum / horizon_in_seconds);
+  EXPECT_EQ(test_observer_->iteration_count(), 0);
 }
 
 // User brightness changes are received, training example cache reaches
@@ -508,13 +495,12 @@
 // within a small window shorter than |training_delay_|.
 TEST_F(ModellerImplTest, OnUserBrightnessChanged) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig(), true /* is_trainer_configured */,
+       test_model_config_, true /* is_trainer_configured */,
        true /* is_personal_curve_valid */,
        {{"training_delay_in_seconds", base::NumberToString(60)}});
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
 
   std::vector<TrainingDataPoint> expected_data;
 
@@ -531,6 +517,7 @@
     expected_data.push_back({brightness_old, brightness_new,
                              modeller_->AverageAmbientForTesting(now).value(),
                              now});
+    EXPECT_EQ(test_observer_->iteration_count(), 0);
   }
 
   // Training should not have started.
@@ -549,6 +536,7 @@
   thread_bundle_.RunUntilIdle();
 
   EXPECT_EQ(0u, modeller_->NumberTrainingDataPointsForTesting());
+  EXPECT_EQ(test_observer_->iteration_count(), 1);
 
   const base::Optional<MonotoneCubicSpline>& result_curve =
       test_observer_->personal_curve();
@@ -562,13 +550,12 @@
 // User activities resets timer used to start training.
 TEST_F(ModellerImplTest, MultipleUserActivities) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig(), true /* is_trainer_configured */,
+       test_model_config_, true /* is_trainer_configured */,
        true /* is_personal_curve_valid */,
        {{"training_delay_in_seconds", base::NumberToString(60)}});
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
 
   thread_bundle_.FastForwardBy(base::TimeDelta::FromSeconds(1));
   fake_als_reader_.ReportAmbientLightUpdate(30);
@@ -585,6 +572,7 @@
     expected_data.push_back({brightness_old, brightness_new,
                              modeller_->AverageAmbientForTesting(now).value(),
                              now});
+    EXPECT_EQ(test_observer_->iteration_count(), 0);
   }
 
   EXPECT_EQ(modeller_->NumberTrainingDataPointsForTesting(), 10u);
@@ -597,6 +585,7 @@
 
   thread_bundle_.FastForwardBy(modeller_->GetTrainingDelayForTesting() / 3);
   EXPECT_EQ(modeller_->NumberTrainingDataPointsForTesting(), 10u);
+  EXPECT_EQ(test_observer_->iteration_count(), 0);
 
   // Another user event is received.
   modeller_->OnUserActivity(&mouse_event);
@@ -604,11 +593,13 @@
   // After |training_delay_|/2, no training has started.
   thread_bundle_.FastForwardBy(modeller_->GetTrainingDelayForTesting() / 2);
   EXPECT_EQ(modeller_->NumberTrainingDataPointsForTesting(), 10u);
+  EXPECT_EQ(test_observer_->iteration_count(), 0);
 
   // After another |training_delay_|/2, training is scheduled.
   thread_bundle_.FastForwardBy(modeller_->GetTrainingDelayForTesting() / 2);
 
   EXPECT_EQ(0u, modeller_->NumberTrainingDataPointsForTesting());
+  EXPECT_EQ(test_observer_->iteration_count(), 1);
   const base::Optional<MonotoneCubicSpline>& result_curve =
       test_observer_->personal_curve();
   DCHECK(result_curve);
@@ -621,15 +612,14 @@
 // Training delay is 0, hence we train as soon as we have 1 data point.
 TEST_F(ModellerImplTest, ZeroTrainingDelay) {
   Init(AlsReader::AlsInitStatus::kSuccess, BrightnessMonitor::Status::kSuccess,
-       GetTestModelConfig(), true /* is_trainer_configured */,
+       test_model_config_, true /* is_trainer_configured */,
        true /* is_personal_curve_valid  */,
        {
            {"training_delay_in_seconds", "0"},
        });
 
-  test_observer_->CheckStatus(true /* is_model_initialized */,
-                              modeller_->GetGlobalCurveForTesting(),
-                              base::nullopt /* personal_curve */);
+  const Model expected_model(test_initial_global_curve_, base::nullopt, 0);
+  test_observer_->CheckStatus(true /* is_model_initialized */, expected_model);
 
   fake_als_reader_.ReportAmbientLightUpdate(30);
   const ui::MouseEvent mouse_event(ui::ET_MOUSE_EXITED, gfx::Point(0, 0),
@@ -639,7 +629,7 @@
   modeller_->OnUserBrightnessChanged(10, 20);
   thread_bundle_.RunUntilIdle();
   EXPECT_EQ(0u, modeller_->NumberTrainingDataPointsForTesting());
-  EXPECT_TRUE(test_observer_->trained_curve_received());
+  EXPECT_EQ(test_observer_->iteration_count(), 1);
 }
 
 }  // namespace auto_screen_brightness
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.cc b/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.cc
index 0128db1c..a9152b9 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.cc
@@ -28,16 +28,25 @@
   return true;
 }
 
+bool IsDataValid(const std::vector<double>& xs, const std::vector<double>& ys) {
+  const size_t num_points = xs.size();
+  if (num_points < 2)
+    return false;
+
+  if (num_points != ys.size())
+    return false;
+
+  if (!IsIncreasing(xs, true /* is_strict */))
+    return false;
+
+  return IsIncreasing(ys, false /* is_strict */);
+}
+
 // Computes the tangents at every control point as the average of the secants,
 // while ensuring monotonicity is preserved.
 std::vector<double> ComputeTangents(const std::vector<double>& xs,
                                     const std::vector<double>& ys,
                                     size_t num_points) {
-  DCHECK_GT(num_points, 1u);
-  DCHECK_EQ(num_points, ys.size());
-  DCHECK(IsIncreasing(xs, true /* is_strict */));
-  DCHECK(IsIncreasing(ys, false /* is_strict */));
-
   // Calculate the slopes of the secant lines between successive points.
   std::vector<double> ds;
   std::vector<double> ms;
@@ -81,13 +90,6 @@
 
 }  // namespace
 
-MonotoneCubicSpline::MonotoneCubicSpline(const std::vector<double>& xs,
-                                         const std::vector<double>& ys)
-    : xs_(xs),
-      ys_(ys),
-      num_points_(xs.size()),
-      ms_(ComputeTangents(xs, ys, num_points_)) {}
-
 MonotoneCubicSpline::MonotoneCubicSpline(const MonotoneCubicSpline& spline) =
     default;
 
@@ -127,7 +129,16 @@
     ys.push_back(y);
   }
 
-  if (xs.size() < 2)
+  if (!IsDataValid(xs, ys))
+    return base::nullopt;
+
+  return MonotoneCubicSpline(xs, ys);
+}
+
+base::Optional<MonotoneCubicSpline>
+MonotoneCubicSpline::CreateMonotoneCubicSpline(const std::vector<double>& xs,
+                                               const std::vector<double>& ys) {
+  if (!IsDataValid(xs, ys))
     return base::nullopt;
 
   return MonotoneCubicSpline(xs, ys);
@@ -208,6 +219,13 @@
   return base::JoinString(rows, "\n");
 }
 
+MonotoneCubicSpline::MonotoneCubicSpline(const std::vector<double>& xs,
+                                         const std::vector<double>& ys)
+    : xs_(xs),
+      ys_(ys),
+      num_points_(xs.size()),
+      ms_(ComputeTangents(xs, ys, num_points_)) {}
+
 }  // namespace auto_screen_brightness
 }  // namespace power
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.h b/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.h
index 1baf31b..05cf71e 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.h
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline.h
@@ -19,11 +19,6 @@
 // This class only supports non-decreasing sequence of control points.
 class MonotoneCubicSpline {
  public:
-  // |xs| and |ys| must have the same size with at least 2 elements. |xs| must
-  // be strictly increasing and |ys| must be monotone (non-decreasing).
-  MonotoneCubicSpline(const std::vector<double>& xs,
-                      const std::vector<double>& ys);
-
   MonotoneCubicSpline(const MonotoneCubicSpline& spline);
 
   MonotoneCubicSpline& operator=(const MonotoneCubicSpline& spline);
@@ -37,6 +32,12 @@
   static base::Optional<MonotoneCubicSpline> FromString(
       const std::string& data);
 
+  // Creates a MonotoneCubicSpline if inputs are valid according to the comments
+  // for MonotoneCubicSpline's ctor. Otherwise returns nullopt.
+  static base::Optional<MonotoneCubicSpline> CreateMonotoneCubicSpline(
+      const std::vector<double>& xs,
+      const std::vector<double>& ys);
+
   bool operator==(const MonotoneCubicSpline& spline) const;
   bool operator!=(const MonotoneCubicSpline& spline) const;
 
@@ -54,6 +55,11 @@
   std::string ToString() const;
 
  private:
+  // |xs| and |ys| must have the same size with at least 2 elements. |xs| must
+  // be strictly increasing and |ys| must be monotone (non-decreasing).
+  MonotoneCubicSpline(const std::vector<double>& xs,
+                      const std::vector<double>& ys);
+
   std::vector<double> xs_;
   std::vector<double> ys_;
 
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline_unittest.cc b/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline_unittest.cc
index 2228d62..a0dcae9 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline_unittest.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/monotone_cubic_spline_unittest.cc
@@ -18,17 +18,19 @@
                                   100, 500, 1000, 2000, 3000};
   const std::vector<double> ys = {0, 5, 10, 15, 20, 25, 30, 40, 60, 80, 1000};
 
-  MonotoneCubicSpline spline(xs, ys);
-  EXPECT_EQ(spline.GetControlPointsY().size(), xs.size());
+  const base::Optional<MonotoneCubicSpline> spline =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(xs, ys);
+  DCHECK(spline);
+  EXPECT_EQ(spline->GetControlPointsY().size(), xs.size());
 
   // Spline's control points get their exact values.
   for (size_t i = 0; i < xs.size(); ++i) {
-    EXPECT_DOUBLE_EQ(spline.Interpolate(xs[i]), ys[i]);
+    EXPECT_DOUBLE_EQ(spline->Interpolate(xs[i]), ys[i]);
   }
 
   // Data points falling out of the range get boundary values.
-  EXPECT_DOUBLE_EQ(spline.Interpolate(-0.1), ys[0]);
-  EXPECT_DOUBLE_EQ(spline.Interpolate(4000), ys.back());
+  EXPECT_DOUBLE_EQ(spline->Interpolate(-0.1), ys[0]);
+  EXPECT_DOUBLE_EQ(spline->Interpolate(4000), ys.back());
 
   // Check interpolation results on non-control points. Results are compared
   // with java implementation of Spline for Android.
@@ -37,7 +39,7 @@
       1.1,    2.3999999999999995, 6.200916250000001, 16.599999999999998,
       22.525, 28.08849264366124,  29.413985177197368};
   for (size_t i = 0; i < ts.size(); ++i) {
-    EXPECT_DOUBLE_EQ(spline.Interpolate(ts[i]), expected[i]);
+    EXPECT_DOUBLE_EQ(spline->Interpolate(ts[i]), expected[i]);
   }
 }
 
@@ -63,7 +65,9 @@
 
   std::sort(ys.begin(), ys.end());
 
-  MonotoneCubicSpline spline(xs, ys);
+  const base::Optional<MonotoneCubicSpline> spline =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(xs, ys);
+  DCHECK(spline);
 
   std::vector<double> test_points;
   for (size_t i = 0; i < 1000; ++i) {
@@ -72,8 +76,8 @@
   std::sort(test_points.begin(), test_points.end());
 
   for (size_t i = 1; i < test_points.size(); ++i) {
-    EXPECT_LE(spline.Interpolate(test_points[i - 1]),
-              spline.Interpolate(test_points[i]));
+    EXPECT_LE(spline->Interpolate(test_points[i - 1]),
+              spline->Interpolate(test_points[i]));
   }
 }
 
@@ -81,10 +85,13 @@
   const std::string data("1,10\n2,20\n3,30");
   const base::Optional<MonotoneCubicSpline> spline_from_string =
       MonotoneCubicSpline::FromString(data);
+  DCHECK(spline_from_string);
   const std::vector<double> xs = {1, 2, 3};
   const std::vector<double> ys = {10, 20, 30};
-  const MonotoneCubicSpline expected_spline(xs, ys);
-  EXPECT_EQ(expected_spline, spline_from_string);
+  const base::Optional<MonotoneCubicSpline> expected_spline =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(xs, ys);
+  DCHECK(expected_spline);
+  EXPECT_EQ(*expected_spline, *spline_from_string);
 }
 
 TEST(MonotoneCubicSpline, FromStringTooFewRows) {
@@ -97,8 +104,10 @@
 TEST(MonotoneCubicSpline, ToString) {
   const std::vector<double> xs = {1, 2, 3};
   const std::vector<double> ys = {10, 20, 30};
-  const MonotoneCubicSpline spline(xs, ys);
-  const std::string string_from_spline = spline.ToString();
+  const base::Optional<MonotoneCubicSpline> spline =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(xs, ys);
+  DCHECK(spline);
+  const std::string string_from_spline = spline->ToString();
 
   const std::string expected_string("1,10\n2,20\n3,30");
 
@@ -109,18 +118,20 @@
   const std::vector<double> xs1 = {0,   10,  20,   40,   60,  80,
                                    100, 500, 1000, 2000, 3000};
   const std::vector<double> ys1 = {0, 5, 10, 15, 20, 25, 30, 40, 60, 80, 1000};
-  MonotoneCubicSpline spline1(xs1, ys1);
+  base::Optional<MonotoneCubicSpline> spline1 =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(xs1, ys1);
 
   const std::vector<double> xs2 = {1, 2, 3};
   const std::vector<double> ys2 = {10, 20, 30};
-  const MonotoneCubicSpline spline2(xs2, ys2);
+  const base::Optional<MonotoneCubicSpline> spline2 =
+      MonotoneCubicSpline::CreateMonotoneCubicSpline(xs2, ys2);
 
-  EXPECT_NE(spline1, spline2);
+  EXPECT_NE(*spline1, *spline2);
   spline1 = spline2;
 
-  EXPECT_EQ(spline1, spline2);
+  EXPECT_EQ(*spline1, *spline2);
 
-  const MonotoneCubicSpline spline3 = spline1;
+  const MonotoneCubicSpline spline3 = *spline1;
   EXPECT_EQ(spline3, spline2);
 }
 
diff --git a/chrome/browser/chromeos/power/ml/DEPS b/chrome/browser/chromeos/power/ml/DEPS
deleted file mode 100644
index a93c4ae..0000000
--- a/chrome/browser/chromeos/power/ml/DEPS
+++ /dev/null
@@ -1,10 +0,0 @@
-specific_include_rules = {
-  # User activity detection. https://crbug.com/871914
-  "adaptive_screen_brightness_manager\.cc": [
-    "+ash/shell.h",
-  ],
-  # User activity detection. https://crbug.com/871914
-  "user_activity_controller\.cc": [
-    "+ash/shell.h",
-  ],
-}
diff --git a/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.cc b/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.cc
index c4bde622..3bf6b81 100644
--- a/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.cc
+++ b/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.cc
@@ -8,7 +8,6 @@
 #include <utility>
 
 #include "ash/public/cpp/ash_pref_names.h"
-#include "ash/shell.h"
 #include "base/bind.h"
 #include "base/process/launch.h"
 #include "base/task/post_task.h"
@@ -189,8 +188,7 @@
           mojo::MakeRequest(&video_observer_screen_brightness_logger),
           std::make_unique<base::RepeatingTimer>(),
           base::DefaultClock::GetInstance(), std::make_unique<RealBootClock>());
-  ash::Shell::Get()
-      ->aura_env()
+  aura::Env::GetInstance()
       ->context_factory_private()
       ->GetHostFrameSinkManager()
       ->AddVideoDetectorObserver(
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/BUILD.gn b/chrome/browser/chromeos/power/ml/smart_dim/BUILD.gn
index ee0161b..5677814 100644
--- a/chrome/browser/chromeos/power/ml/smart_dim/BUILD.gn
+++ b/chrome/browser/chromeos/power/ml/smart_dim/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 source_set("smart_dim") {
-  # Dependent targets should not include tf_native_inference.h directly.
   public = [
     "model.h",
     "model_impl.h",
@@ -12,9 +11,9 @@
   sources = [
     "ml_service_client.cc",
     "ml_service_client.h",
+    "model.h",
     "model_impl.cc",
-    "tf_native_inference.cc",
-    "tf_native_inference.h",
+    "model_impl.h",
   ]
 
   deps = [
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/example_preprocessor_config.pb b/chrome/browser/chromeos/power/ml/smart_dim/example_preprocessor_config.pb
deleted file mode 100644
index 94d19a0..0000000
--- a/chrome/browser/chromeos/power/ml/smart_dim/example_preprocessor_config.pb
+++ /dev/null
Binary files differ
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/model_impl.cc b/chrome/browser/chromeos/power/ml/smart_dim/model_impl.cc
index 7bce399..8b7eb80 100644
--- a/chrome/browser/chromeos/power/ml/smart_dim/model_impl.cc
+++ b/chrome/browser/chromeos/power/ml/smart_dim/model_impl.cc
@@ -18,7 +18,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/task/post_task.h"
 #include "base/task_runner_util.h"
-#include "chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h"
 #include "chrome/grit/browser_resources.h"
 #include "chromeos/constants/chromeos_features.h"
@@ -39,14 +38,10 @@
 // RankerExample to a vectorized float for inactivity score calculation. Returns
 // nullptr if cannot load or parse the config.
 std::unique_ptr<assist_ranker::ExamplePreprocessorConfig>
-LoadExamplePreprocessorConfig(bool use_ml_service) {
+LoadExamplePreprocessorConfig() {
   auto config = std::make_unique<assist_ranker::ExamplePreprocessorConfig>();
 
-  // TODO(crbug.com/893425): Remove the TF Native version once we shift to
-  // ML service completely.
-  const int res_id = use_ml_service
-                         ? IDR_SMART_DIM_LITE_EXAMPLE_PREPROCESSOR_CONFIG_PB
-                         : IDR_SMART_DIM_EXAMPLE_PREPROCESSOR_CONFIG_PB;
+  const int res_id = IDR_SMART_DIM_LITE_EXAMPLE_PREPROCESSOR_CONFIG_PB;
 
   scoped_refptr<base::RefCountedMemory> raw_config =
       ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(res_id);
@@ -238,11 +233,7 @@
 
 }  // namespace
 
-SmartDimModelImpl::SmartDimModelImpl()
-    : blocking_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
-          {base::MayBlock(), base::TaskPriority::USER_VISIBLE})),
-      use_ml_service_(base::FeatureList::IsEnabled(
-          features::kUserActivityPredictionMlService)) {}
+SmartDimModelImpl::SmartDimModelImpl() = default;
 
 SmartDimModelImpl::~SmartDimModelImpl() = default;
 
@@ -282,36 +273,6 @@
   return SmartDimModelResult::kSuccess;
 }
 
-SmartDimModelResult SmartDimModelImpl::CalculateInactivityScoreTfNative(
-    const UserActivityEvent::Features& features,
-    float* inactivity_score_out) {
-  // This is the TF Native codepath.
-  // TODO(crbug.com/893425): Remove this codepath once we shift to ML service
-  // completely.
-  CHECK(inactivity_score_out);
-
-  std::vector<float> vectorized_features;
-  auto preprocess_result = PreprocessInput(features, &vectorized_features);
-  if (preprocess_result != SmartDimModelResult::kSuccess) {
-    LogPowerMLSmartDimModelResult(preprocess_result);
-    return preprocess_result;
-  }
-
-  if (vectorized_features.size() != tfnative_model::FEATURES_SIZE) {
-    LogPowerMLSmartDimModelResult(
-        SmartDimModelResult::kMismatchedFeatureSizeError);
-    return SmartDimModelResult::kMismatchedFeatureSizeError;
-  }
-
-  if (!model_alloc_)
-    model_alloc_ = std::make_unique<tfnative_model::FixedAllocations>();
-
-  tfnative_model::Inference(vectorized_features.data(), inactivity_score_out,
-                            model_alloc_.get());
-
-  return SmartDimModelResult::kSuccess;
-}
-
 UserActivityEvent::ModelPrediction
 SmartDimModelImpl::CreatePredictionFromInactivityScore(float inactivity_score) {
   UserActivityEvent::ModelPrediction prediction;
@@ -329,26 +290,7 @@
   return prediction;
 }
 
-UserActivityEvent::ModelPrediction SmartDimModelImpl::ShouldDimTfNative(
-    const UserActivityEvent::Features& input_features) {
-  UserActivityEvent::ModelPrediction prediction;
-  prediction.set_response(UserActivityEvent::ModelPrediction::MODEL_ERROR);
-
-  float inactivity_score = 0;
-  const SmartDimModelResult result =
-      CalculateInactivityScoreTfNative(input_features, &inactivity_score);
-
-  if (result != SmartDimModelResult::kSuccess) {
-    // No need to log here as all error cases are already logged in
-    // CalculateInactivityScoreTfNative.
-    return prediction;
-  }
-
-  LogPowerMLSmartDimModelResult(SmartDimModelResult::kSuccess);
-  return CreatePredictionFromInactivityScore(inactivity_score);
-}
-
-void SmartDimModelImpl::ShouldDimMlService(
+void SmartDimModelImpl::ShouldDim(
     const UserActivityEvent::Features& input_features,
     DimDecisionCallback callback) {
   UserActivityEvent::ModelPrediction prediction;
@@ -392,15 +334,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Cancel previously assigned callbacks and set it to the new callback.
   cancelable_callback_.Reset(std::move(dim_callback));
-  if (!use_ml_service_) {
-    base::PostTaskAndReplyWithResult(
-        blocking_task_runner_.get(), FROM_HERE,
-        base::BindOnce(&SmartDimModelImpl::ShouldDimTfNative,
-                       base::Unretained(this), input_features),
-        base::BindOnce(cancelable_callback_.callback()));
-  } else {
-    ShouldDimMlService(input_features, cancelable_callback_.callback());
-  }
+  ShouldDim(input_features, cancelable_callback_.callback());
 }
 
 void SmartDimModelImpl::CancelPreviousRequest() {
@@ -415,18 +349,13 @@
 }
 
 void SmartDimModelImpl::LazyInitialize() {
-  // TODO(crbug.com/893425): Remove the flag check once we shift to ML service
-  // completely.
-  if (use_ml_service_) {
-    if (!ml_service_client_) {
-      ml_service_client_ = CreateMlServiceClient();
-    }
+  if (!ml_service_client_) {
+    ml_service_client_ = CreateMlServiceClient();
   }
 
-  if (preprocessor_config_)
-    return;
-
-  preprocessor_config_ = LoadExamplePreprocessorConfig(use_ml_service_);
+  if (!preprocessor_config_) {
+    preprocessor_config_ = LoadExamplePreprocessorConfig();
+  }
 }
 
 }  // namespace ml
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/model_impl.h b/chrome/browser/chromeos/power/ml/smart_dim/model_impl.h
index 942b218..ce15296 100644
--- a/chrome/browser/chromeos/power/ml/smart_dim/model_impl.h
+++ b/chrome/browser/chromeos/power/ml/smart_dim/model_impl.h
@@ -22,10 +22,6 @@
 namespace power {
 namespace ml {
 
-namespace tfnative_model {
-struct FixedAllocations;
-}  // namespace tfnative_model
-
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 enum class SmartDimModelResult {
@@ -65,11 +61,8 @@
   void SetMlServiceClientForTesting(std::unique_ptr<MlServiceClient> client);
 
  private:
-  FRIEND_TEST_ALL_PREFIXES(SmartDimTfNativeModelTest, Basic);
-  FRIEND_TEST_ALL_PREFIXES(SmartDimTfNativeModelTest, OptionalFeaturesMissing);
-
   // Loads the preprocessor config if not already loaded. Also initializes the
-  // MlServiceClient object if the ML Service is being used for inference.
+  // MlServiceClient object.
   void LazyInitialize();
 
   // Pre-processes the input features into a vector, placed in
@@ -81,51 +74,27 @@
       const UserActivityEvent::Features& features,
       std::vector<float>* vectorized_features);
 
-  // Calculates inactivity score and returns result status. Also logs the status
-  // to UMA.
-  //
-  // This codepath is used when the inference calls are made to TF-Native.
-  SmartDimModelResult CalculateInactivityScoreTfNative(
-      const UserActivityEvent::Features& features,
-      float* inactivity_score_out);
-
   // Takes an |inactivity_score| returned from the ML model and, using that,
   // returns a ModelPrediction.
   UserActivityEvent::ModelPrediction CreatePredictionFromInactivityScore(
       float inactivity_score);
 
-  // Task which gets posted to the |blocking_task_runner_| and
-  // performs the ML inference call. Based on the result of the inference call,
-  // a prediction is returned, and this return value will be passed to a
-  // DimDecisionCallback which will execute after this function.
-  UserActivityEvent::ModelPrediction ShouldDimTfNative(
-      const UserActivityEvent::Features& input_features);
-
   // Calls the ML service Mojo API to perform an Smart Dim inference call,
   // given |input_features|. The |callback| is supplied to the Mojo API,
   // which in turn will call it to provide the result (a ModelPrediction), once
   // the inference is complete.
-  void ShouldDimMlService(const UserActivityEvent::Features& input_features,
-                          DimDecisionCallback callback);
+  void ShouldDim(const UserActivityEvent::Features& input_features,
+                 DimDecisionCallback callback);
 
   std::unique_ptr<assist_ranker::ExamplePreprocessorConfig>
       preprocessor_config_;
 
-  // Fixed-size working memory provided to the inferencing function. Lazily
-  // initialized once so it isn't reallocated for every inference.
-  std::unique_ptr<tfnative_model::FixedAllocations> model_alloc_;
-
-  // A separate task runner is used to perform the TF Native inference.
-  const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
-
   // Cancelable wrapper for the DimDecisionCallback passed by the client to
   // RequestDimDecision().
   base::CancelableOnceCallback<void(UserActivityEvent::ModelPrediction)>
       cancelable_callback_;
 
-  const bool use_ml_service_;
-  // Pointer to the object that handles the ML service calls. This pointer
-  // is only initialized if features::kSmartDimMLService is set to true.
+  // Pointer to the object that handles the ML service calls.
   std::unique_ptr<MlServiceClient> ml_service_client_;
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/model_unittest.cc b/chrome/browser/chromeos/power/ml/smart_dim/model_unittest.cc
index 41a59bd..825baa0 100644
--- a/chrome/browser/chromeos/power/ml/smart_dim/model_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/smart_dim/model_unittest.cc
@@ -25,6 +25,19 @@
 
 namespace {
 
+// Arbitrary inactivity score for the fake ML Service client to return:
+constexpr float kTestInactivityScore = -3.7;
+// Quantized into the range [0, 100] via sigmoid transform:
+constexpr int kQuantizedTestInactivityScore = 2;
+
+// Arbitrary dim thresholds lower/higher than kTestInactivityScore, implying
+// no/yes dim decisions respectively.
+constexpr double kLowDimThreshold = -10.0;
+constexpr double kHighDimThreshold = -0.1;
+// Same values quantized into the range [0, 100] via sigmoid transform:
+constexpr int kQuantizedLowDimThreshold = 0;
+constexpr int kQuantizedHighDimThreshold = 47;
+
 UserActivityEvent::Features DefaultFeatures() {
   UserActivityEvent::Features features;
   // Bucketize to 95.
@@ -64,24 +77,15 @@
  public:
   SmartDimFeatureFlags() = default;
 
-  void Initialize(const bool use_ml_service, const double dim_threshold) {
+  void Initialize(const double dim_threshold) {
     const std::map<std::string, std::string> params = {
         {"dim_threshold", base::NumberToString(dim_threshold)}};
     smart_dim_feature_override_.InitAndEnableFeatureWithParameters(
         features::kUserActivityPrediction, params);
-
-    if (use_ml_service) {
-      ml_service_feature_override_.InitAndEnableFeature(
-          features::kUserActivityPredictionMlService);
-    } else {
-      ml_service_feature_override_.InitAndDisableFeature(
-          features::kUserActivityPredictionMlService);
-    }
   }
 
  private:
   base::test::ScopedFeatureList smart_dim_feature_override_;
-  base::test::ScopedFeatureList ml_service_feature_override_;
 
   DISALLOW_COPY_AND_ASSIGN(SmartDimFeatureFlags);
 };
@@ -97,8 +101,7 @@
       base::RepeatingCallback<UserActivityEvent::ModelPrediction(float)>
           get_prediction_callback,
       SmartDimModel::DimDecisionCallback decision_callback) override {
-    // Corresponds to DefaultFeatures() with TfNativeModel:
-    const float inactivity_score = -3.6615708;
+    const float inactivity_score = kTestInactivityScore;
 
     UserActivityEvent::ModelPrediction model_prediction =
         get_prediction_callback.Run(inactivity_score);
@@ -113,9 +116,7 @@
 
 }  // namespace
 
-// Parameterized test fixture. The bool parameter is whether to test the ML
-// Service codepath. If false, the old TFNative codepath is tested.
-class SmartDimModelImplTest : public testing::TestWithParam<bool> {
+class SmartDimModelImplTest : public testing::Test {
  public:
   SmartDimModelImplTest()
       : scoped_task_environment_(
@@ -126,9 +127,6 @@
   ~SmartDimModelImplTest() override = default;
 
  protected:
-  // More readable name for the test parameter:
-  bool UsesMlService() const { return GetParam(); }
-
   // Sets a fake MlServiceClient into |impl|.
   void InjectFakeMlServiceClient(SmartDimModelImpl* const impl) {
     impl->SetMlServiceClientForTesting(std::make_unique<FakeMlServiceClient>());
@@ -140,55 +138,13 @@
   DISALLOW_COPY_AND_ASSIGN(SmartDimModelImplTest);
 };
 
-// For the TFNative model, test a hard-coded known-good model result.
-TEST(SmartDimTfNativeModelTest, Basic) {
-  base::test::ScopedTaskEnvironment env;
+// With a high dim threshold, NO_DIM decision is expected.
+TEST_F(SmartDimModelImplTest, ShouldNotDim) {
   SmartDimFeatureFlags flags;
-  flags.Initialize(false /* use_ml_service */, -0.1 /* dim_threshold */);
+  flags.Initialize(kHighDimThreshold);
 
   SmartDimModelImpl smart_dim_model;
-
-  float inactivity_score;
-  EXPECT_EQ(SmartDimModelResult::kSuccess,
-            smart_dim_model.CalculateInactivityScoreTfNative(
-                DefaultFeatures(), &inactivity_score));
-  // Score has been calculated outside of chrome.
-  EXPECT_FLOAT_EQ(-3.6615708, inactivity_score);
-}
-
-// For the TFNative model, test a known-good result with empty features.
-TEST(SmartDimTfNativeModelTest, OptionalFeaturesMissing) {
-  base::test::ScopedTaskEnvironment env;
-  SmartDimFeatureFlags flags;
-  flags.Initialize(false /* use_ml_service */, -0.1 /* dim_threshold */);
-
-  SmartDimModelImpl smart_dim_model;
-
-  UserActivityEvent::Features features = DefaultFeatures();
-  features.clear_battery_percent();
-  features.clear_time_since_last_key_sec();
-  features.clear_time_since_last_mouse_sec();
-  features.clear_time_since_video_ended_sec();
-  features.clear_source_id();
-  features.clear_has_form_entry();
-  features.clear_engagement_score();
-  features.clear_tab_domain();
-
-  float inactivity_score;
-  EXPECT_EQ(SmartDimModelResult::kSuccess,
-            smart_dim_model.CalculateInactivityScoreTfNative(
-                features, &inactivity_score));
-  // Score has been calculated outside of chrome.
-  EXPECT_FLOAT_EQ(-1.9680425, inactivity_score);
-}
-
-TEST_P(SmartDimModelImplTest, ShouldNotDim) {
-  SmartDimFeatureFlags flags;
-  flags.Initialize(UsesMlService(), -0.1 /* dim_threshold */);
-
-  SmartDimModelImpl smart_dim_model;
-  if (UsesMlService())
-    InjectFakeMlServiceClient(&smart_dim_model);
+  InjectFakeMlServiceClient(&smart_dim_model);
 
   bool callback_done = false;
   smart_dim_model.RequestDimDecision(
@@ -198,8 +154,10 @@
                                EXPECT_EQ(
                                    UserActivityEvent::ModelPrediction::NO_DIM,
                                    prediction.response());
-                               EXPECT_EQ(47, prediction.decision_threshold());
-                               EXPECT_EQ(2, prediction.inactivity_score());
+                               EXPECT_EQ(kQuantizedHighDimThreshold,
+                                         prediction.decision_threshold());
+                               EXPECT_EQ(kQuantizedTestInactivityScore,
+                                         prediction.inactivity_score());
                                *callback_done = true;
                              },
                              &callback_done));
@@ -207,13 +165,13 @@
   EXPECT_TRUE(callback_done);
 }
 
-TEST_P(SmartDimModelImplTest, ShouldDim) {
+// With a low dim threshold, DIM decision is expected.
+TEST_F(SmartDimModelImplTest, ShouldDim) {
   SmartDimFeatureFlags flags;
-  flags.Initialize(UsesMlService(), -10.0 /* dim_threshold */);
+  flags.Initialize(kLowDimThreshold);
 
   SmartDimModelImpl smart_dim_model;
-  if (UsesMlService())
-    InjectFakeMlServiceClient(&smart_dim_model);
+  InjectFakeMlServiceClient(&smart_dim_model);
 
   bool callback_done = false;
   smart_dim_model.RequestDimDecision(
@@ -223,8 +181,10 @@
                                EXPECT_EQ(
                                    UserActivityEvent::ModelPrediction::DIM,
                                    prediction.response());
-                               EXPECT_EQ(0, prediction.decision_threshold());
-                               EXPECT_EQ(2, prediction.inactivity_score());
+                               EXPECT_EQ(kQuantizedLowDimThreshold,
+                                         prediction.decision_threshold());
+                               EXPECT_EQ(kQuantizedTestInactivityScore,
+                                         prediction.inactivity_score());
                                *callback_done = true;
                              },
                              &callback_done));
@@ -234,13 +194,12 @@
 
 // Check that CancelableCallback ensures a callback doesn't execute twice, in
 // case two RequestDimDecision() calls were made before any callback ran.
-TEST_P(SmartDimModelImplTest, CheckCancelableCallback) {
+TEST_F(SmartDimModelImplTest, CheckCancelableCallback) {
   SmartDimFeatureFlags flags;
-  flags.Initialize(UsesMlService(), -10.0 /* dim_threshold */);
+  flags.Initialize(kLowDimThreshold);
 
   SmartDimModelImpl smart_dim_model;
-  if (UsesMlService())
-    InjectFakeMlServiceClient(&smart_dim_model);
+  InjectFakeMlServiceClient(&smart_dim_model);
 
   bool callback_done = false;
   int num_callbacks_run = 0;
@@ -252,8 +211,10 @@
                UserActivityEvent::ModelPrediction prediction) {
               EXPECT_EQ(UserActivityEvent::ModelPrediction::DIM,
                         prediction.response());
-              EXPECT_EQ(0, prediction.decision_threshold());
-              EXPECT_EQ(2, prediction.inactivity_score());
+              EXPECT_EQ(kQuantizedLowDimThreshold,
+                        prediction.decision_threshold());
+              EXPECT_EQ(kQuantizedTestInactivityScore,
+                        prediction.inactivity_score());
               *callback_done = true;
               (*num_callbacks_run)++;
             },
@@ -266,13 +227,12 @@
 
 // Check that CancelPreviousRequest() can successfully prevent a previous
 // requested dim decision request from running.
-TEST_P(SmartDimModelImplTest, CheckCanceledRequest) {
+TEST_F(SmartDimModelImplTest, CheckCanceledRequest) {
   SmartDimFeatureFlags flags;
-  flags.Initialize(UsesMlService(), -10.0 /* dim_threshold */);
+  flags.Initialize(kLowDimThreshold);
 
   SmartDimModelImpl smart_dim_model;
-  if (UsesMlService())
-    InjectFakeMlServiceClient(&smart_dim_model);
+  InjectFakeMlServiceClient(&smart_dim_model);
 
   bool callback_done = false;
   smart_dim_model.RequestDimDecision(
@@ -287,10 +247,6 @@
   EXPECT_FALSE(callback_done);
 }
 
-INSTANTIATE_TEST_SUITE_P(SmartDimModelImplTests,
-                         SmartDimModelImplTest,
-                         testing::Bool());
-
 }  // namespace ml
 }  // namespace power
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.cc b/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.cc
deleted file mode 100644
index ddbd80356..0000000
--- a/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.cc
+++ /dev/null
@@ -1,3061 +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.
-
-// This file was generated using tf.native from a neural network trained by
-// TensorFlow, then simplified and cleaned up by hand. Please do not edit except
-// when updating to a new model.
-
-#include "chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h"
-
-#include <algorithm>
-#include <cmath>
-#include <limits>
-
-#include "base/logging.h"
-
-namespace chromeos {
-namespace power {
-namespace ml {
-namespace tfnative_model {
-namespace {
-
-// The size of a shape in terms of number of coefficients.
-inline int32_t ShapeSize(const int32_t rank, const int32_t* shape) {
-  int32_t size = 1;
-  for (int32_t i = 0; i < rank; ++i)
-    size *= shape[i];
-  return size;
-}
-
-template <typename T>
-void FullyConnected(const int32_t* __restrict input_shape,
-                    const T* __restrict input_values,
-                    const int32_t* __restrict weight_shape,
-                    const T* __restrict weight_values,
-                    const int32_t* __restrict bias_shape,
-                    const T* __restrict bias_values,
-                    T* __restrict output_values) {
-  const int32_t batch_size = input_shape[0];
-  const int32_t num_inputs = weight_shape[0];
-  const int32_t num_outputs = weight_shape[1];
-  CHECK_EQ(input_shape[1], num_inputs);
-  CHECK_EQ(bias_shape[0], num_outputs);
-  for (int32_t batch = 0; batch < batch_size; ++batch) {
-    for (int32_t out_i = 0; out_i < num_outputs; ++out_i) {
-      T value = 0;
-      for (int32_t in_i = 0; in_i < num_inputs; ++in_i) {
-        value += input_values[batch * num_inputs + in_i] *
-                 weight_values[in_i * num_outputs + out_i];
-      }
-      value += bias_values[out_i];
-      output_values[batch * num_outputs + out_i] = value;
-    }
-  }
-}
-
-// -----------------------------------------------------------------------------
-// Simple unary ops
-// -----------------------------------------------------------------------------
-
-template <typename T>
-void Relu(const int32_t rank,
-          const int32_t* __restrict input_shape,
-          const T* __restrict input_values,
-          T* __restrict output_values) {
-  const int32_t size = ShapeSize(rank, input_shape);
-  for (int32_t i = 0; i < size; ++i) {
-    const T value = input_values[i];
-    output_values[i] = std::max(value, static_cast<T>(0));
-  }
-}
-
-// -----------------------------------------------------------------------------
-// Dequantize ops
-// -----------------------------------------------------------------------------
-
-template <typename T>
-void DequantizeMinFirst(const int32_t rank,
-                        const int32_t* __restrict input_shape,
-                        const T* __restrict input_values,
-                        const float* __restrict min_range,
-                        const float* __restrict max_range,
-                        float* __restrict output_values) {
-  const int32_t size = ShapeSize(rank, input_shape);
-  const float range_scale = (max_range[0] - min_range[0]) /
-                            (static_cast<float>(std::numeric_limits<T>::max()) -
-                             std::numeric_limits<T>::min());
-  const float range_min_rounded =
-      (max_range[0] == min_range[0]
-           ? min_range[0]
-           : round(min_range[0] / range_scale) * range_scale);
-  for (int32_t i = 0; i < size; i++) {
-    output_values[i] = ((static_cast<int32_t>(input_values[i]) -
-                         std::numeric_limits<T>::min()) *
-                        range_scale) +
-                       range_min_rounded;
-  }
-}
-
-// -----------------------------------------------------------------------------
-// CONSTANTS
-// Note that for now, endianness of the target machine needs to match that of
-// the one training was performed on.
-// -----------------------------------------------------------------------------
-const int32_t dnn_logits_biases__2__cf__2_shape[1] = {1};
-const union {
-  uint8_t bytes[4];
-  float values[1];
-} dnn_logits_biases__2__cf__2 = {{
-    0xde, 0x82, 0x1e, 0x3d,
-}};
-
-const int32_t dnn_hiddenlayer_0_weights__1__cf__1_quantized_const_shape[2] = {
-    FEATURES_SIZE, DNN_BIASES_SIZE};
-const union {
-  uint8_t bytes[DNN_WEIGHTS_SIZE];
-  uint8_t values[DNN_WEIGHTS_SIZE];
-} dnn_hiddenlayer_0_weights__1__cf__1_quantized_const = {{
-    0x70, 0x7c, 0x66, 0x86, 0x7a, 0x79, 0x77, 0x77, 0x62, 0x75, 0x55, 0x70,
-    0x73, 0x6f, 0x72, 0x73, 0x79, 0x73, 0x79, 0x70, 0x74, 0x80, 0x6d, 0x2e,
-    0x6f, 0x71, 0x70, 0x75, 0x7a, 0x7f, 0x74, 0x80, 0x6e, 0x7e, 0x7c, 0x6f,
-    0x76, 0x7e, 0x70, 0x71, 0x9d, 0x7b, 0x73, 0x76, 0x5f, 0x78, 0x6d, 0x67,
-    0x76, 0x6b, 0x78, 0x71, 0x72, 0x6d, 0x69, 0x6e, 0x75, 0x81, 0x5d, 0x74,
-    0x66, 0x68, 0x83, 0x7d, 0xa3, 0x9d, 0x7b, 0x63, 0x8c, 0xb3, 0x8a, 0x77,
-    0x70, 0xad, 0x49, 0x67, 0x77, 0x77, 0x66, 0x73, 0x82, 0x76, 0xae, 0x6d,
-    0x99, 0x79, 0x6f, 0x4e, 0x73, 0x53, 0x84, 0x8c, 0x5e, 0x9c, 0x72, 0x79,
-    0x7f, 0x82, 0x77, 0x8a, 0xd3, 0x8d, 0x78, 0x51, 0x72, 0x87, 0x6c, 0x65,
-    0x7b, 0x83, 0x88, 0x8c, 0x83, 0x5f, 0x95, 0x79, 0x62, 0xe2, 0x9e, 0x5a,
-    0x4d, 0x55, 0x84, 0x72, 0x6e, 0x64, 0x79, 0x5e, 0x6c, 0x70, 0x7b, 0x68,
-    0x6c, 0x77, 0x69, 0x7d, 0x83, 0x61, 0x6d, 0x78, 0x6d, 0x79, 0x86, 0x76,
-    0x72, 0x66, 0x77, 0x55, 0x73, 0x72, 0x70, 0x78, 0x6b, 0x64, 0x7f, 0x71,
-    0x63, 0x6c, 0x71, 0x78, 0x8b, 0x6c, 0x6d, 0x64, 0x80, 0x71, 0x75, 0x74,
-    0x84, 0x6b, 0x77, 0x81, 0x6f, 0x5f, 0x5a, 0x61, 0x74, 0x6a, 0x81, 0x6e,
-    0x73, 0x6f, 0x78, 0x80, 0x74, 0x66, 0x61, 0x6b, 0x68, 0x72, 0x84, 0x79,
-    0x85, 0x89, 0x70, 0x79, 0x77, 0x79, 0x76, 0x80, 0x7a, 0x66, 0x79, 0x7a,
-    0x78, 0x76, 0x7e, 0x6e, 0x83, 0x79, 0x73, 0x7d, 0x7d, 0x77, 0x63, 0x6c,
-    0x6b, 0x7e, 0x70, 0x77, 0x89, 0x77, 0x79, 0x74, 0x7d, 0x7e, 0x79, 0x83,
-    0x71, 0x7e, 0x6f, 0x75, 0x7d, 0x7d, 0x72, 0x72, 0x66, 0x77, 0x86, 0x82,
-    0x66, 0x77, 0x6f, 0x79, 0x73, 0x76, 0x71, 0x74, 0x7b, 0x77, 0x6e, 0x72,
-    0x79, 0x75, 0x74, 0x72, 0x70, 0x7d, 0x6c, 0x74, 0x77, 0x6a, 0x80, 0x7d,
-    0x72, 0x79, 0x79, 0x74, 0x74, 0x77, 0x76, 0x73, 0x75, 0x75, 0x6e, 0x6a,
-    0x76, 0x7a, 0x70, 0x6e, 0x76, 0x79, 0x74, 0x7d, 0x75, 0x78, 0x87, 0x6f,
-    0x6c, 0x7b, 0x72, 0x70, 0x7c, 0x75, 0x60, 0x7d, 0x70, 0x85, 0x84, 0x72,
-    0x75, 0x4b, 0x71, 0x5f, 0x58, 0x7e, 0x62, 0x77, 0x65, 0x6a, 0x6c, 0x38,
-    0x41, 0x77, 0x9c, 0x6a, 0x6c, 0x79, 0x69, 0x3f, 0x92, 0x8e, 0x6f, 0x80,
-    0x5b, 0x6e, 0x8c, 0x69, 0xa2, 0x5c, 0x6b, 0x4f, 0x75, 0x73, 0x7c, 0x87,
-    0x98, 0x75, 0x4f, 0x7b, 0x73, 0x65, 0x8c, 0x80, 0x52, 0x79, 0x4e, 0x76,
-    0x5e, 0x8f, 0x55, 0x5b, 0x77, 0x78, 0x6e, 0x63, 0x49, 0x75, 0x3a, 0x73,
-    0x7a, 0x8f, 0x70, 0x96, 0x7c, 0x82, 0x6d, 0x8d, 0x50, 0x7a, 0x70, 0x6e,
-    0x96, 0x6c, 0x8d, 0x6e, 0x92, 0x6f, 0x61, 0x5e, 0x7d, 0x59, 0x65, 0x50,
-    0x81, 0x78, 0x7e, 0x79, 0x79, 0x67, 0x67, 0x76, 0x6f, 0x7e, 0x7d, 0x77,
-    0x79, 0x6b, 0x6c, 0x96, 0xb0, 0x3b, 0x6d, 0x77, 0x7c, 0x71, 0x95, 0x69,
-    0x63, 0x68, 0x78, 0x73, 0x6f, 0x57, 0x8c, 0x7f, 0x72, 0xb3, 0x7b, 0x84,
-    0x61, 0x6a, 0x60, 0x7b, 0x7e, 0x3e, 0x72, 0x70, 0x95, 0xa0, 0x89, 0x8c,
-    0x7e, 0x70, 0x75, 0x8f, 0x74, 0x78, 0x5e, 0x75, 0x75, 0x73, 0x9d, 0x5f,
-    0x8d, 0x85, 0x57, 0x4a, 0x65, 0x75, 0x76, 0x7b, 0x78, 0x4c, 0x6c, 0x7e,
-    0x68, 0x9f, 0x9a, 0x73, 0xc4, 0x80, 0x74, 0x7c, 0x93, 0x76, 0x50, 0x6f,
-    0x66, 0x89, 0x80, 0x67, 0x77, 0x54, 0x51, 0x78, 0x77, 0xe9, 0x87, 0x6b,
-    0x53, 0x76, 0x83, 0x83, 0x75, 0x75, 0x75, 0x74, 0x74, 0x70, 0x71, 0x7e,
-    0x83, 0x62, 0x6c, 0x75, 0x66, 0x78, 0x80, 0x7f, 0x7b, 0x62, 0x7e, 0x74,
-    0x7a, 0x77, 0x84, 0x6e, 0x6e, 0x6f, 0x6a, 0x79, 0x5f, 0x82, 0x6c, 0x7c,
-    0x65, 0x64, 0x79, 0x7a, 0x90, 0x82, 0x73, 0x76, 0x84, 0x75, 0x81, 0x80,
-    0x85, 0x6f, 0x73, 0x7b, 0x7c, 0x7b, 0x80, 0x6f, 0x61, 0x87, 0x78, 0x7e,
-    0x5c, 0xa5, 0x8d, 0x80, 0x65, 0x46, 0x68, 0x6f, 0x72, 0x9c, 0x90, 0x63,
-    0x77, 0x97, 0x84, 0x73, 0x7f, 0x82, 0x61, 0x71, 0x82, 0x80, 0xc4, 0x87,
-    0x58, 0x68, 0x81, 0x5b, 0x88, 0x75, 0x7c, 0x97, 0x78, 0x92, 0x61, 0x72,
-    0x63, 0x9c, 0x8e, 0x5f, 0xcb, 0x91, 0x84, 0x60, 0x71, 0x74, 0x6b, 0x81,
-    0x67, 0x64, 0x7e, 0x72, 0x88, 0x5d, 0x6b, 0x6f, 0x65, 0x6c, 0x59, 0x69,
-    0x74, 0x73, 0x6f, 0x79, 0x73, 0x73, 0x75, 0x75, 0x74, 0x73, 0x73, 0x76,
-    0x73, 0x72, 0x72, 0x75, 0x79, 0x72, 0x6b, 0x76, 0x6f, 0x74, 0x74, 0x72,
-    0x78, 0x73, 0x73, 0x76, 0x74, 0x74, 0x70, 0x74, 0x73, 0x71, 0x72, 0x78,
-    0x72, 0x6f, 0x6d, 0x75, 0x80, 0x71, 0x75, 0x6a, 0x79, 0x75, 0x69, 0x75,
-    0x73, 0x71, 0x73, 0x75, 0x79, 0x73, 0x78, 0x74, 0x77, 0x64, 0x78, 0x73,
-    0x7b, 0x6b, 0x67, 0x96, 0x80, 0x7a, 0x77, 0x79, 0x5b, 0x6e, 0x81, 0x6b,
-    0x6e, 0x6b, 0x73, 0x82, 0x6b, 0x73, 0x81, 0x6f, 0x70, 0x74, 0x62, 0x60,
-    0x70, 0x6f, 0x7e, 0x78, 0x74, 0x8a, 0x77, 0x7a, 0x6d, 0x7c, 0x7a, 0x6f,
-    0x70, 0x99, 0x79, 0x78, 0xa2, 0x4a, 0x71, 0x63, 0x7b, 0x6e, 0x7c, 0x57,
-    0x79, 0x6a, 0x75, 0x72, 0x77, 0x4c, 0x7e, 0x73, 0x78, 0x87, 0x6d, 0x7a,
-    0x66, 0x72, 0x71, 0x79, 0x7b, 0x59, 0x72, 0x79, 0x62, 0x71, 0x7d, 0x7b,
-    0x6c, 0x77, 0x7e, 0x73, 0x7b, 0x7b, 0x76, 0x75, 0x77, 0x7c, 0x7e, 0x70,
-    0x81, 0x70, 0x64, 0x6b, 0x6f, 0x71, 0x73, 0x72, 0x73, 0x6d, 0x81, 0x74,
-    0x6b, 0x7e, 0x78, 0x73, 0x92, 0x78, 0x72, 0x71, 0x77, 0x77, 0x86, 0x5a,
-    0x7f, 0x5f, 0x77, 0x75, 0x77, 0x60, 0x77, 0x76, 0x6c, 0x7a, 0x70, 0x79,
-    0x6b, 0x5d, 0x65, 0x7f, 0x83, 0x78, 0x7c, 0x60, 0x65, 0x6c, 0x65, 0x74,
-    0x84, 0x74, 0x54, 0x7b, 0x73, 0x6b, 0x57, 0x5e, 0x65, 0x42, 0x67, 0x7d,
-    0x6a, 0x78, 0x84, 0x65, 0x67, 0x71, 0x6f, 0x86, 0x74, 0x74, 0x3f, 0x36,
-    0x68, 0x64, 0x52, 0x7d, 0x63, 0x64, 0x5d, 0x69, 0x73, 0x6d, 0x5f, 0x5e,
-    0x79, 0x7c, 0x83, 0x71, 0x88, 0x6f, 0x75, 0x73, 0x61, 0x72, 0x69, 0x6e,
-    0x6f, 0x7d, 0x71, 0x87, 0x73, 0x61, 0x7d, 0x76, 0x5c, 0x65, 0x7c, 0x79,
-    0x86, 0x8b, 0x7a, 0x7c, 0x6f, 0x71, 0x85, 0x73, 0x65, 0x8e, 0x7b, 0x66,
-    0x67, 0x82, 0x7e, 0x71, 0x81, 0x7d, 0x6e, 0x6a, 0x77, 0x7e, 0x61, 0x6f,
-    0x7b, 0x89, 0x76, 0x77, 0xac, 0x75, 0x73, 0x73, 0x93, 0x8a, 0x89, 0x62,
-    0x6e, 0x5d, 0x70, 0x6f, 0x6f, 0x47, 0x87, 0x6e, 0x9a, 0xa5, 0x7e, 0x72,
-    0x76, 0x70, 0x70, 0x7e, 0x6c, 0x6e, 0x6c, 0x68, 0x78, 0x77, 0x93, 0x68,
-    0x82, 0x6f, 0x44, 0x78, 0x6b, 0x74, 0x6f, 0x7c, 0x71, 0x8d, 0x78, 0x80,
-    0x67, 0x74, 0x76, 0x6a, 0x72, 0x78, 0x75, 0x7d, 0x5d, 0x70, 0x76, 0x8d,
-    0x86, 0x7c, 0x6f, 0x70, 0x97, 0x85, 0x68, 0x74, 0x1d, 0x6f, 0x80, 0x62,
-    0x74, 0x72, 0x6a, 0x70, 0x76, 0x71, 0x7a, 0x6f, 0x73, 0x93, 0x7a, 0x5b,
-    0x76, 0x82, 0x59, 0x7a, 0x72, 0x56, 0x72, 0x72, 0x34, 0x6e, 0x63, 0x74,
-    0x71, 0x59, 0x90, 0x7a, 0x7a, 0x70, 0x75, 0x62, 0x64, 0x7c, 0x5c, 0x62,
-    0x72, 0x6f, 0x74, 0x79, 0x70, 0x6b, 0x75, 0x85, 0x75, 0x7a, 0x89, 0x7a,
-    0x7a, 0x75, 0x7f, 0x86, 0x95, 0x70, 0x65, 0x70, 0x81, 0x7e, 0x80, 0x62,
-    0x73, 0x79, 0x72, 0x6b, 0x72, 0x61, 0x7a, 0x76, 0x7a, 0x90, 0x6a, 0x69,
-    0x82, 0x63, 0x74, 0xa1, 0x5c, 0x4e, 0x4a, 0x65, 0x4d, 0x5f, 0x54, 0x62,
-    0x59, 0x68, 0xb8, 0x60, 0x94, 0x93, 0x47, 0x87, 0x69, 0x74, 0x67, 0x53,
-    0x5e, 0x8b, 0x88, 0x7d, 0x80, 0x84, 0x95, 0x75, 0x8f, 0x73, 0x5d, 0x68,
-    0x66, 0x69, 0x88, 0x91, 0xc7, 0x5b, 0x92, 0x87, 0x72, 0x74, 0x3c, 0x74,
-    0x6a, 0x7a, 0x6b, 0x61, 0x7e, 0x5d, 0x6e, 0x9b, 0x7b, 0xc5, 0x83, 0x89,
-    0x88, 0x7f, 0x59, 0x76, 0x98, 0x4d, 0x84, 0x7e, 0x8f, 0x89, 0x9b, 0x59,
-    0x5e, 0x4b, 0x8e, 0x9c, 0xac, 0x77, 0x58, 0x74, 0x54, 0x71, 0xbb, 0x79,
-    0x56, 0x79, 0x5f, 0x96, 0x6c, 0x7e, 0x62, 0x9c, 0x8a, 0x85, 0x76, 0x48,
-    0x62, 0x51, 0x93, 0x79, 0xca, 0x77, 0x45, 0x77, 0x84, 0x66, 0x54, 0x75,
-    0x66, 0x51, 0x8a, 0x73, 0x86, 0x5d, 0x79, 0x68, 0xaa, 0xe1, 0xa7, 0x88,
-    0x70, 0x63, 0x6d, 0x75, 0x7e, 0x67, 0x8b, 0x77, 0x63, 0x63, 0x6b, 0x6f,
-    0x76, 0x5c, 0x80, 0x96, 0x7b, 0x8e, 0x3a, 0x58, 0x65, 0x67, 0x64, 0x72,
-    0x57, 0x77, 0x82, 0x89, 0x87, 0x6b, 0x5e, 0x7e, 0x81, 0x71, 0x27, 0x7e,
-    0x58, 0x6d, 0x83, 0x6c, 0x85, 0x6b, 0x66, 0x7c, 0x8b, 0x6c, 0x6b, 0x69,
-    0x6f, 0x74, 0x89, 0x71, 0x81, 0x60, 0x71, 0x70, 0x88, 0x98, 0x5e, 0x8b,
-    0x78, 0x56, 0x5e, 0x93, 0x8a, 0x66, 0x8b, 0x83, 0xa5, 0x6c, 0x77, 0x7b,
-    0x5c, 0x43, 0x8e, 0x7d, 0x63, 0x9e, 0x5d, 0x69, 0x61, 0x3f, 0xaf, 0x79,
-    0x5f, 0x96, 0x71, 0x70, 0x7a, 0x6b, 0x5f, 0xa8, 0x6a, 0x5c, 0x53, 0x72,
-    0x6c, 0x59, 0x8f, 0x6f, 0xdc, 0x6e, 0x3e, 0x8d, 0x95, 0x84, 0x70, 0x86,
-    0x70, 0x56, 0x7a, 0x76, 0x84, 0x67, 0x60, 0x72, 0x83, 0xee, 0x5a, 0x9a,
-    0x77, 0x74, 0x70, 0x79, 0x73, 0x72, 0x71, 0x76, 0x71, 0x75, 0x72, 0x76,
-    0x7a, 0x75, 0x73, 0x6b, 0x73, 0x77, 0x71, 0x74, 0x74, 0x6f, 0x6d, 0x6e,
-    0x77, 0x7a, 0x70, 0x74, 0x73, 0x76, 0x70, 0x79, 0x6d, 0x73, 0x79, 0x7a,
-    0x76, 0x6b, 0x72, 0x7a, 0x7e, 0x70, 0x75, 0x73, 0x78, 0x74, 0x79, 0x75,
-    0x79, 0x6f, 0x76, 0x78, 0x79, 0x70, 0x79, 0x74, 0x7a, 0x80, 0x76, 0x72,
-    0x96, 0x62, 0x6b, 0x75, 0x78, 0x6b, 0x7f, 0x76, 0x7d, 0x86, 0x6e, 0x63,
-    0x67, 0x7e, 0x84, 0x7f, 0x8e, 0x8a, 0x68, 0x74, 0x7d, 0x66, 0x97, 0x93,
-    0x80, 0x8e, 0x6e, 0x5c, 0x91, 0x7a, 0x78, 0x90, 0x6e, 0x65, 0x54, 0x60,
-    0x64, 0x54, 0x73, 0x7c, 0xc4, 0x75, 0x8c, 0x93, 0x7c, 0x6d, 0x69, 0x54,
-    0x4c, 0x89, 0x73, 0x78, 0x9a, 0x5d, 0x67, 0x6f, 0x72, 0xcf, 0x6f, 0x86,
-    0x74, 0x70, 0x72, 0x74, 0x75, 0x75, 0x70, 0x75, 0x77, 0x77, 0x6f, 0x6b,
-    0x72, 0x6f, 0x75, 0x71, 0x73, 0x71, 0x73, 0x70, 0x71, 0x79, 0x70, 0x75,
-    0x6a, 0x74, 0x73, 0x73, 0x73, 0x6f, 0x70, 0x75, 0x70, 0x6f, 0x73, 0x74,
-    0x73, 0x70, 0x73, 0x75, 0x75, 0x75, 0x71, 0x75, 0x75, 0x77, 0x74, 0x73,
-    0x75, 0x71, 0x71, 0x71, 0x76, 0x6e, 0x75, 0x75, 0x74, 0x75, 0x70, 0x6f,
-    0x4d, 0x7d, 0x6c, 0x77, 0x85, 0x77, 0x66, 0x6c, 0x9b, 0x82, 0x7a, 0x73,
-    0x60, 0x58, 0xb0, 0x76, 0x47, 0x84, 0x81, 0x73, 0x84, 0x5c, 0xa6, 0x63,
-    0x8e, 0x65, 0x8c, 0x75, 0x79, 0x46, 0x7f, 0x91, 0x9b, 0x8a, 0x5e, 0x73,
-    0xa5, 0x53, 0x5c, 0x83, 0xd9, 0x77, 0x7f, 0x61, 0x90, 0x94, 0x7c, 0x8e,
-    0x66, 0x74, 0x88, 0x8d, 0x8b, 0x5b, 0x80, 0x79, 0x71, 0xde, 0x94, 0x8a,
-    0x73, 0x64, 0x6c, 0x77, 0x72, 0x6e, 0x80, 0x90, 0x6b, 0x73, 0x67, 0x66,
-    0x72, 0x6e, 0x75, 0x80, 0x70, 0x7a, 0x2a, 0x67, 0x4d, 0x73, 0x5c, 0x77,
-    0x61, 0x79, 0x7a, 0x7a, 0x7a, 0x7e, 0x65, 0x78, 0x7c, 0x6b, 0x56, 0x79,
-    0x6d, 0x78, 0x77, 0x79, 0x86, 0x6f, 0x68, 0x73, 0x83, 0x68, 0x6a, 0x6b,
-    0x76, 0x71, 0x79, 0x75, 0x80, 0x62, 0x6c, 0x73, 0x7d, 0x82, 0x5f, 0x89,
-    0x73, 0x76, 0x7e, 0x75, 0x77, 0x76, 0x78, 0x7d, 0x6e, 0x72, 0x69, 0x74,
-    0x6e, 0x70, 0x6a, 0x78, 0x61, 0x66, 0x6e, 0x71, 0x6d, 0x6e, 0x5a, 0x4b,
-    0x6f, 0x70, 0x70, 0x61, 0x76, 0x6c, 0x76, 0x5f, 0x70, 0x69, 0x7c, 0x76,
-    0x6d, 0x67, 0x67, 0x72, 0x81, 0x7c, 0x6d, 0x76, 0x67, 0x6d, 0x83, 0x75,
-    0x7f, 0x6d, 0x75, 0x7c, 0x79, 0x3f, 0x6b, 0x6b, 0x7d, 0x67, 0x71, 0x75,
-    0x70, 0x6c, 0x72, 0x79, 0x75, 0x74, 0x6f, 0x76, 0x6a, 0x6f, 0x6a, 0x78,
-    0x74, 0x78, 0x72, 0x7d, 0x71, 0x68, 0x22, 0x6e, 0x4a, 0x70, 0x6e, 0x77,
-    0x68, 0x78, 0x72, 0x76, 0x72, 0x70, 0x73, 0x7d, 0x7c, 0x71, 0x62, 0x6c,
-    0x74, 0x73, 0x75, 0x79, 0x81, 0x70, 0x70, 0x74, 0x81, 0x73, 0x72, 0x6b,
-    0x74, 0x71, 0x76, 0x74, 0x70, 0x63, 0x71, 0x75, 0x76, 0x7b, 0x73, 0x77,
-    0x75, 0x5f, 0x73, 0x85, 0x7a, 0x51, 0x77, 0x63, 0x69, 0x72, 0x87, 0x51,
-    0x7a, 0x78, 0x63, 0x75, 0x70, 0x78, 0x6c, 0x79, 0x7f, 0x7b, 0x7b, 0x75,
-    0x7f, 0x6c, 0x73, 0x61, 0x79, 0x61, 0x80, 0x81, 0x68, 0x72, 0x7e, 0x6d,
-    0x88, 0x7a, 0x64, 0x70, 0x8b, 0x7c, 0x74, 0x65, 0x25, 0x71, 0x7f, 0x6e,
-    0x70, 0x71, 0x6a, 0x76, 0x73, 0x53, 0x79, 0x77, 0x77, 0x85, 0x78, 0x73,
-    0x8b, 0x8d, 0x5d, 0x7a, 0x98, 0x61, 0x74, 0x6c, 0x87, 0x6b, 0x9c, 0x8c,
-    0x56, 0x63, 0x9a, 0x74, 0x65, 0x80, 0x52, 0x73, 0x83, 0x4f, 0xb7, 0x79,
-    0x8b, 0x8e, 0x77, 0x52, 0x8c, 0x7b, 0x6a, 0x83, 0x71, 0x57, 0x5e, 0x60,
-    0x5d, 0x4e, 0x80, 0x79, 0xc5, 0x7a, 0x6e, 0x8e, 0xba, 0x88, 0x61, 0x76,
-    0x6c, 0x8f, 0x85, 0x76, 0x6e, 0x5c, 0x66, 0x78, 0x7d, 0xd9, 0x8b, 0x77,
-    0x6c, 0x7c, 0x9a, 0x7b, 0x83, 0x88, 0x62, 0x7b, 0x84, 0x73, 0x87, 0x7e,
-    0x70, 0x8b, 0x4f, 0x94, 0x86, 0x6d, 0x7e, 0x5c, 0x76, 0x7e, 0xc6, 0x6b,
-    0x9b, 0x70, 0x74, 0x6c, 0x7d, 0x88, 0x6e, 0x8d, 0x75, 0x7f, 0xac, 0x7f,
-    0x78, 0x87, 0x94, 0x6e, 0xcc, 0x93, 0x89, 0x68, 0x8f, 0x76, 0x7f, 0x88,
-    0x5d, 0x55, 0x74, 0x92, 0x81, 0x5b, 0x86, 0x6e, 0x6e, 0x86, 0xab, 0x92,
-    0x6a, 0x86, 0x9d, 0x7c, 0x94, 0x93, 0x7b, 0x7f, 0x68, 0xa0, 0x84, 0x6e,
-    0x67, 0x7e, 0x73, 0x75, 0x7a, 0x6b, 0x8d, 0x7d, 0x76, 0x85, 0x9f, 0x5a,
-    0x62, 0x69, 0x79, 0x61, 0x71, 0x50, 0x80, 0x97, 0x5a, 0x84, 0x63, 0x7d,
-    0x8b, 0x8d, 0x86, 0x76, 0xd0, 0x6c, 0x8b, 0x95, 0x70, 0x86, 0x59, 0x87,
-    0x79, 0x82, 0x80, 0x85, 0x7d, 0x55, 0x97, 0x79, 0x52, 0xd8, 0x87, 0x68,
-    0x75, 0x71, 0x73, 0x7b, 0x76, 0x6a, 0x6e, 0x73, 0x67, 0x6b, 0x7e, 0x74,
-    0x72, 0x7a, 0x75, 0x79, 0x7d, 0x75, 0x77, 0x70, 0x6f, 0x7f, 0x75, 0x78,
-    0x7b, 0x6e, 0x79, 0x79, 0x71, 0x71, 0x77, 0x76, 0x71, 0x73, 0x75, 0x78,
-    0x74, 0x78, 0x73, 0x6f, 0x8f, 0x7d, 0x6f, 0x71, 0x80, 0x77, 0x82, 0x63,
-    0x76, 0x69, 0x76, 0x72, 0x74, 0x53, 0x80, 0x74, 0x79, 0x65, 0x75, 0x76,
-    0x6b, 0x73, 0x65, 0x79, 0x8f, 0x7d, 0x80, 0x8d, 0x88, 0x89, 0x87, 0x7f,
-    0x5f, 0x6c, 0x96, 0x92, 0x98, 0x8f, 0x79, 0x7a, 0x5a, 0x88, 0xb3, 0x92,
-    0x8d, 0x8f, 0x6c, 0x84, 0x84, 0x8a, 0x76, 0x87, 0xa0, 0x9e, 0x4b, 0x5a,
-    0x7d, 0x73, 0x93, 0x76, 0xcd, 0x82, 0x79, 0x8a, 0x75, 0x7d, 0x91, 0x8f,
-    0x5b, 0x61, 0x72, 0x68, 0x90, 0x62, 0x81, 0x90, 0x88, 0xd9, 0x7b, 0x80,
-    0x6f, 0x73, 0x72, 0x71, 0x71, 0x73, 0x74, 0x71, 0x72, 0x72, 0x71, 0x73,
-    0x72, 0x6f, 0x70, 0x74, 0x76, 0x70, 0x5f, 0x70, 0x71, 0x75, 0x6e, 0x72,
-    0x6d, 0x6e, 0x73, 0x73, 0x72, 0x70, 0x71, 0x6f, 0x6e, 0x71, 0x70, 0x71,
-    0x73, 0x74, 0x72, 0x71, 0x6e, 0x70, 0x72, 0x70, 0x6f, 0x71, 0x74, 0x70,
-    0x71, 0x71, 0x73, 0x76, 0x72, 0x71, 0x6f, 0x71, 0x74, 0x73, 0x71, 0x70,
-    0x70, 0x76, 0x75, 0x75, 0x69, 0x79, 0x72, 0x79, 0x71, 0x6d, 0x76, 0x5f,
-    0x78, 0x70, 0x6e, 0x6c, 0x6f, 0x7a, 0x76, 0x72, 0x71, 0x71, 0x6c, 0x76,
-    0x75, 0x77, 0x76, 0x6f, 0x71, 0x6e, 0x74, 0x74, 0x72, 0x7b, 0x78, 0x68,
-    0x74, 0x70, 0x61, 0x70, 0x71, 0x74, 0x72, 0x76, 0x71, 0x6b, 0x73, 0x75,
-    0x73, 0x7e, 0x74, 0x6d, 0x76, 0x66, 0x74, 0x71, 0x67, 0x76, 0x76, 0x77,
-    0x69, 0x72, 0x58, 0x80, 0x9a, 0xac, 0x85, 0x84, 0x75, 0x8a, 0x9c, 0x51,
-    0x8e, 0x5d, 0x68, 0x81, 0x78, 0x70, 0x7b, 0x76, 0x67, 0x72, 0x8b, 0x52,
-    0x66, 0x7c, 0x60, 0x4e, 0x75, 0x8b, 0x75, 0x94, 0x5d, 0x80, 0x4f, 0x6e,
-    0x89, 0x86, 0x84, 0x74, 0xcc, 0x8e, 0x80, 0x66, 0x99, 0x6d, 0x50, 0x93,
-    0x79, 0x78, 0x78, 0x99, 0x82, 0x5c, 0x91, 0xa5, 0x66, 0xc2, 0x67, 0x66,
-    0x63, 0x6d, 0x60, 0x77, 0x70, 0x77, 0x70, 0x62, 0x69, 0x8a, 0x7a, 0x75,
-    0x7d, 0x76, 0x73, 0x74, 0x6d, 0x6e, 0x73, 0x73, 0x6d, 0x77, 0x78, 0x4a,
-    0x6c, 0x71, 0x66, 0x53, 0x72, 0x72, 0x74, 0x71, 0x6d, 0x6d, 0x76, 0x74,
-    0x6f, 0x78, 0x69, 0x74, 0x75, 0x69, 0x73, 0x77, 0x6b, 0x64, 0x74, 0x77,
-    0x7d, 0x78, 0x7d, 0x7b, 0x66, 0x45, 0x7d, 0x79, 0x78, 0x71, 0x68, 0x7e,
-    0x6e, 0x87, 0x62, 0x7a, 0x80, 0x77, 0x67, 0x75, 0x7d, 0x9d, 0x7f, 0x59,
-    0x67, 0x75, 0x72, 0x8e, 0x62, 0x8c, 0x5f, 0x71, 0x91, 0x7e, 0xaf, 0x5d,
-    0x9c, 0x88, 0x91, 0x45, 0x78, 0x6f, 0x6b, 0x9f, 0x84, 0x84, 0x4b, 0x8c,
-    0x6a, 0x93, 0x98, 0x8a, 0xc9, 0x84, 0x7e, 0x63, 0x93, 0x74, 0x4b, 0x9b,
-    0x81, 0xa2, 0x62, 0x7d, 0x89, 0x65, 0x77, 0x6d, 0x66, 0xf1, 0x93, 0x82,
-    0x75, 0x78, 0x6b, 0x88, 0x7f, 0x77, 0x79, 0x73, 0x60, 0x78, 0x54, 0x6c,
-    0x67, 0x6e, 0x72, 0x76, 0x7a, 0x76, 0x7a, 0x6e, 0x71, 0x7d, 0x6a, 0x2e,
-    0x67, 0x75, 0x7b, 0x75, 0x7d, 0x80, 0x74, 0x7c, 0x72, 0x7a, 0x7c, 0x71,
-    0x65, 0x7f, 0x72, 0x70, 0x9f, 0x86, 0x75, 0x71, 0x6c, 0x73, 0x32, 0x78,
-    0x75, 0x6a, 0x75, 0x75, 0x6e, 0x71, 0x63, 0x68, 0x74, 0x84, 0x6a, 0x74,
-    0x71, 0x84, 0x6d, 0x83, 0x8f, 0x85, 0x4b, 0x58, 0x76, 0x75, 0x79, 0x4a,
-    0x89, 0x89, 0x72, 0x36, 0x64, 0x50, 0x6c, 0x99, 0x55, 0x6c, 0x88, 0x7f,
-    0x7c, 0x5f, 0x4e, 0x53, 0x54, 0x5b, 0x8b, 0x5e, 0x64, 0x6e, 0x7e, 0x6e,
-    0x8a, 0x7f, 0x6e, 0x84, 0x77, 0x85, 0x84, 0x6c, 0x6c, 0x80, 0x80, 0x82,
-    0x71, 0x81, 0x55, 0x82, 0x62, 0x7b, 0x7d, 0x7e, 0x66, 0x42, 0x71, 0x50,
-    0x79, 0x76, 0x63, 0x7e, 0x6d, 0x5a, 0x76, 0x78, 0x61, 0x71, 0x77, 0x73,
-    0x78, 0x73, 0x74, 0x79, 0x78, 0x74, 0x75, 0x73, 0x71, 0x79, 0x71, 0x67,
-    0x77, 0x75, 0x77, 0x73, 0x71, 0x73, 0x75, 0x70, 0x6f, 0x72, 0x7c, 0x71,
-    0x77, 0x7d, 0x74, 0x77, 0x97, 0x72, 0x71, 0x74, 0x70, 0x73, 0x83, 0x56,
-    0x75, 0x73, 0x72, 0x75, 0x77, 0x73, 0x7a, 0x76, 0x78, 0x79, 0x70, 0x77,
-    0x69, 0x81, 0x78, 0x82, 0x77, 0x60, 0x72, 0x6b, 0x6a, 0x79, 0x71, 0x67,
-    0x7e, 0x7c, 0x49, 0x72, 0x77, 0x72, 0x74, 0x6f, 0x81, 0x7f, 0x8a, 0x73,
-    0x7d, 0x76, 0x6d, 0x6e, 0x7b, 0x6c, 0x7a, 0x81, 0x7a, 0x76, 0x68, 0x74,
-    0x6d, 0x71, 0x75, 0x77, 0x8e, 0x6e, 0x75, 0x6e, 0x67, 0x78, 0x77, 0x58,
-    0x6e, 0x6e, 0x6b, 0x7a, 0x75, 0x7d, 0x6e, 0x79, 0x74, 0x82, 0x78, 0x70,
-    0x72, 0x77, 0x6d, 0x8a, 0x97, 0x8c, 0x42, 0x55, 0x81, 0x72, 0x83, 0x3e,
-    0x9b, 0x82, 0x69, 0x57, 0x52, 0x49, 0x7b, 0xa4, 0x58, 0x7c, 0x82, 0x78,
-    0x91, 0x4f, 0x57, 0x4f, 0x5d, 0x53, 0x84, 0x36, 0x5f, 0x74, 0x7b, 0x6c,
-    0x8a, 0x6a, 0x5e, 0x87, 0x7d, 0x8d, 0x97, 0x5a, 0x70, 0x84, 0x86, 0x80,
-    0x67, 0x85, 0x53, 0x94, 0x5f, 0x78, 0x78, 0x7a, 0x68, 0x58, 0x79, 0x60,
-    0x72, 0x70, 0x4a, 0x7b, 0x88, 0x7a, 0x72, 0x74, 0x7e, 0x74, 0x72, 0x61,
-    0x76, 0x6c, 0x7d, 0x71, 0x6d, 0x6e, 0x79, 0x8b, 0x7f, 0x6b, 0x80, 0x53,
-    0x69, 0x7a, 0x70, 0x60, 0x7e, 0x82, 0x89, 0x8b, 0x7d, 0x6b, 0x5f, 0x78,
-    0x89, 0x73, 0x68, 0x78, 0xb9, 0x82, 0x7d, 0x65, 0x75, 0x87, 0x57, 0x72,
-    0x67, 0x67, 0x7c, 0x7e, 0x7c, 0x3c, 0x5d, 0x6a, 0x76, 0xca, 0x7a, 0x65,
-    0x74, 0x76, 0x64, 0x7d, 0x70, 0x75, 0x7c, 0x74, 0x6e, 0x77, 0x75, 0x7a,
-    0x78, 0x6a, 0x71, 0x72, 0x74, 0x72, 0x6d, 0x6f, 0x78, 0x70, 0x7a, 0x7c,
-    0x79, 0x47, 0x70, 0x7c, 0x74, 0x81, 0x76, 0x72, 0x76, 0x74, 0x6b, 0x7d,
-    0x6d, 0x73, 0x7a, 0x74, 0x79, 0x76, 0x76, 0x6d, 0x7a, 0x70, 0x77, 0x71,
-    0x70, 0x71, 0x76, 0x71, 0x76, 0x68, 0x75, 0x78, 0x74, 0x77, 0x72, 0x75,
-    0x60, 0x7b, 0x6b, 0x74, 0xab, 0x95, 0x9f, 0x59, 0x6e, 0x6b, 0x75, 0x52,
-    0x64, 0x57, 0x97, 0x75, 0x7f, 0x64, 0x53, 0x66, 0x5a, 0x75, 0xa4, 0x60,
-    0x8b, 0x7e, 0x82, 0x99, 0x79, 0x91, 0x59, 0x89, 0x5a, 0x8a, 0x57, 0x6a,
-    0xaa, 0x5d, 0x7e, 0x7c, 0xe0, 0x56, 0x3c, 0x52, 0x75, 0x77, 0x71, 0x6f,
-    0x6c, 0x59, 0x8c, 0x79, 0x8d, 0x59, 0x6a, 0x84, 0x8e, 0xe6, 0x56, 0x6b,
-    0x80, 0x78, 0x68, 0x93, 0x73, 0x63, 0x72, 0x4f, 0x7c, 0x71, 0x84, 0x88,
-    0x58, 0x82, 0x9a, 0x8f, 0x61, 0x81, 0x84, 0x72, 0x7d, 0x7d, 0x8a, 0x65,
-    0x94, 0x7a, 0x6a, 0x7e, 0x7f, 0x8d, 0x82, 0xa5, 0x9d, 0x77, 0xa2, 0x67,
-    0x7a, 0x61, 0x79, 0x66, 0xce, 0x96, 0x8c, 0x9a, 0x71, 0x7e, 0x6b, 0x7c,
-    0x69, 0x63, 0x7b, 0x73, 0x7b, 0x6a, 0x5f, 0x98, 0x5c, 0x6d, 0x9d, 0xa7,
-    0x6f, 0x7c, 0x6d, 0x77, 0x7d, 0x74, 0x79, 0x7d, 0x7e, 0x72, 0x83, 0x71,
-    0x73, 0x73, 0x6e, 0x80, 0x79, 0x79, 0x74, 0x7d, 0x7a, 0x73, 0x7d, 0x69,
-    0x6c, 0x76, 0x72, 0x70, 0x7e, 0x74, 0x7e, 0x7e, 0x84, 0x6b, 0x6d, 0x70,
-    0x70, 0x71, 0x72, 0x80, 0xbd, 0x80, 0x7e, 0x67, 0x7b, 0x79, 0x71, 0x78,
-    0x75, 0x72, 0x82, 0x7a, 0x78, 0x6d, 0x73, 0x70, 0x6e, 0x6e, 0x7a, 0x77,
-    0x70, 0x70, 0x79, 0x72, 0x71, 0x7a, 0x76, 0x6e, 0x73, 0x6a, 0x70, 0x82,
-    0x89, 0x71, 0x74, 0x73, 0x5a, 0x79, 0x75, 0x85, 0x7a, 0x77, 0x8a, 0x71,
-    0x65, 0x7b, 0x72, 0x70, 0x6c, 0x83, 0x6a, 0x7e, 0x72, 0x82, 0x7a, 0x70,
-    0x77, 0x71, 0x6d, 0x79, 0x90, 0x82, 0x73, 0x77, 0x7f, 0x6f, 0x7a, 0x7f,
-    0x78, 0x70, 0x73, 0x76, 0x80, 0x7c, 0x87, 0x75, 0x6c, 0x7e, 0x76, 0x7e,
-    0x6b, 0x60, 0x6b, 0x71, 0x81, 0x68, 0x76, 0x73, 0x6e, 0x63, 0x6f, 0x69,
-    0x7c, 0x6e, 0x5f, 0x6b, 0x73, 0x6c, 0x71, 0x70, 0x73, 0x77, 0x64, 0x7c,
-    0x6c, 0x5d, 0x79, 0x70, 0x7c, 0x71, 0x75, 0x76, 0x6f, 0x6b, 0x6e, 0x71,
-    0x6b, 0x74, 0x77, 0x6d, 0x83, 0x83, 0x79, 0x6e, 0x7e, 0x69, 0x68, 0x6c,
-    0x78, 0x72, 0x6f, 0x7d, 0x77, 0x45, 0x74, 0x6e, 0x7e, 0x7a, 0x6d, 0x66,
-    0x73, 0x6f, 0x71, 0x71, 0x7a, 0x74, 0x6e, 0x76, 0x71, 0x6c, 0x71, 0x74,
-    0x75, 0x6d, 0x79, 0x73, 0x76, 0x6b, 0x75, 0x75, 0x71, 0x77, 0x6a, 0x74,
-    0x6e, 0x6a, 0x71, 0x74, 0x72, 0x7a, 0x72, 0x6a, 0x60, 0x70, 0x75, 0x6c,
-    0x74, 0x72, 0x7c, 0x72, 0x7a, 0x75, 0x67, 0x6f, 0x71, 0x75, 0x73, 0x73,
-    0x78, 0x72, 0x6f, 0x77, 0x79, 0x78, 0x74, 0x5c, 0x68, 0x7e, 0x72, 0x73,
-    0x7f, 0x79, 0x9a, 0x7a, 0x8d, 0x87, 0x48, 0x61, 0x89, 0x6e, 0x65, 0x51,
-    0x8a, 0x88, 0x72, 0x63, 0x61, 0x53, 0x7c, 0x64, 0x79, 0x80, 0xc2, 0x69,
-    0x97, 0x73, 0x71, 0x5f, 0x77, 0x55, 0x7c, 0x8a, 0x61, 0x73, 0x71, 0x91,
-    0x92, 0x93, 0x78, 0x81, 0xc8, 0x7c, 0x8e, 0x62, 0x75, 0x79, 0x8c, 0x89,
-    0x78, 0x81, 0x72, 0x8b, 0x73, 0x51, 0xa1, 0x95, 0x4d, 0x73, 0x97, 0x71,
-    0x71, 0x72, 0x76, 0x7c, 0x78, 0x78, 0x71, 0x75, 0x77, 0x77, 0x75, 0x76,
-    0x70, 0x73, 0x71, 0x7b, 0x78, 0x74, 0x6b, 0x76, 0x76, 0x73, 0x6f, 0x77,
-    0x7c, 0x70, 0x7a, 0x76, 0x76, 0x76, 0x74, 0x78, 0x72, 0x72, 0x78, 0x78,
-    0x69, 0x75, 0x73, 0x77, 0x85, 0x73, 0x77, 0x60, 0x77, 0x73, 0x6c, 0x77,
-    0x74, 0x75, 0x71, 0x7a, 0x7c, 0x74, 0x7b, 0x73, 0x76, 0x76, 0x7b, 0x76,
-    0x96, 0x71, 0x50, 0x70, 0x8b, 0x74, 0x98, 0x7e, 0x95, 0x77, 0x80, 0x54,
-    0x5b, 0x70, 0x84, 0x7c, 0x79, 0x8c, 0x73, 0x75, 0x6c, 0x72, 0xba, 0x77,
-    0x57, 0x9a, 0x92, 0x8d, 0x7d, 0x51, 0x81, 0x90, 0x72, 0x7f, 0x44, 0x82,
-    0x73, 0x90, 0x7d, 0x7b, 0xce, 0x7c, 0x64, 0x82, 0xa3, 0x88, 0x75, 0x74,
-    0x60, 0x77, 0x80, 0x6d, 0x9a, 0x56, 0x72, 0x86, 0x7f, 0xd0, 0x9c, 0x7f,
-    0x71, 0x75, 0x83, 0x77, 0x5d, 0x3b, 0x76, 0x6a, 0x79, 0x73, 0x79, 0x62,
-    0x6a, 0x64, 0x78, 0x78, 0x6d, 0x6b, 0x74, 0x74, 0x76, 0x6e, 0x78, 0x73,
-    0x76, 0x85, 0x7b, 0x7f, 0x6e, 0x73, 0x73, 0x73, 0x6d, 0x89, 0x77, 0x70,
-    0x7c, 0x7e, 0x76, 0x71, 0x7c, 0x6f, 0x6f, 0x77, 0x6f, 0x74, 0x74, 0x72,
-    0x78, 0x7b, 0x70, 0x75, 0x71, 0x68, 0x7a, 0x6c, 0x76, 0x82, 0x7e, 0x76,
-    0x75, 0x72, 0x7e, 0x79, 0x74, 0x71, 0x92, 0x77, 0x7f, 0x79, 0x78, 0x6a,
-    0x72, 0x7a, 0x7c, 0x76, 0x6c, 0x72, 0x63, 0x74, 0x7c, 0x77, 0x81, 0x6a,
-    0x71, 0x6a, 0x71, 0x75, 0x71, 0x6d, 0x71, 0x78, 0x73, 0x70, 0x81, 0x79,
-    0x7a, 0x75, 0x71, 0x74, 0x7b, 0x78, 0x6d, 0x90, 0x7c, 0x78, 0x7d, 0x69,
-    0x68, 0x7a, 0x70, 0x70, 0x69, 0x76, 0x53, 0x77, 0x71, 0x7c, 0x79, 0x78,
-    0x7d, 0x64, 0x78, 0x7e, 0x43, 0x82, 0x84, 0x6b, 0x76, 0x6d, 0x77, 0x81,
-    0x58, 0x63, 0x73, 0x8a, 0x7e, 0x7d, 0x7d, 0x64, 0x73, 0x4a, 0x6f, 0x4d,
-    0x5b, 0x7f, 0x67, 0x8a, 0x9e, 0x8f, 0x68, 0x78, 0x78, 0x77, 0x64, 0x4d,
-    0x67, 0x89, 0x77, 0x7d, 0xca, 0x59, 0x9a, 0x9d, 0x7a, 0x92, 0x71, 0x65,
-    0x65, 0x63, 0x85, 0x55, 0x6d, 0x59, 0x6e, 0x9f, 0x80, 0xda, 0x4e, 0x9e,
-    0x78, 0x66, 0x68, 0x82, 0x7a, 0x5c, 0x70, 0x71, 0x7a, 0x6b, 0x98, 0x6e,
-    0x7d, 0x8d, 0x60, 0x76, 0x78, 0x76, 0x6c, 0x74, 0x70, 0x81, 0x76, 0x7c,
-    0x7c, 0x72, 0x58, 0x69, 0x66, 0x7b, 0x7d, 0x7a, 0x6e, 0x7e, 0x7f, 0x85,
-    0x87, 0x7c, 0x66, 0x7a, 0x9e, 0x80, 0x68, 0x66, 0x3c, 0x6c, 0x7d, 0x6c,
-    0x75, 0x6c, 0x6d, 0x7d, 0x77, 0x52, 0x7d, 0x6d, 0x7d, 0x8d, 0x75, 0x5d,
-    0x61, 0x7a, 0x66, 0x7a, 0x6e, 0x89, 0x79, 0x7a, 0x73, 0x6c, 0x81, 0x85,
-    0x65, 0x59, 0x58, 0x85, 0x74, 0x7a, 0x89, 0x71, 0x2d, 0x60, 0xa5, 0x77,
-    0xb3, 0x6d, 0x7e, 0x8d, 0x79, 0x73, 0x82, 0xa0, 0x90, 0x7d, 0x5e, 0x7b,
-    0x6a, 0x86, 0x85, 0x67, 0xce, 0xa8, 0x6a, 0x84, 0x98, 0x6e, 0x74, 0x92,
-    0x7a, 0x4e, 0x7a, 0x89, 0x85, 0x57, 0x7a, 0x7a, 0x60, 0xe0, 0x73, 0x6f,
-    0x70, 0x70, 0x73, 0x7a, 0x75, 0x75, 0x72, 0x71, 0x6f, 0x74, 0x6f, 0x74,
-    0x77, 0x74, 0x72, 0x73, 0x7d, 0x75, 0x71, 0x72, 0x72, 0x75, 0x74, 0x74,
-    0x79, 0x68, 0x74, 0x78, 0x75, 0x75, 0x74, 0x72, 0x76, 0x71, 0x71, 0x77,
-    0x5f, 0x72, 0x6e, 0x76, 0x79, 0x73, 0x74, 0x6b, 0x7a, 0x72, 0x59, 0x73,
-    0x72, 0x70, 0x74, 0x70, 0x72, 0x74, 0x78, 0x77, 0x7a, 0x73, 0x71, 0x72,
-    0x89, 0x77, 0x5f, 0x79, 0x95, 0x62, 0x59, 0x82, 0x92, 0x7c, 0x97, 0x73,
-    0x91, 0x65, 0x7f, 0x78, 0x67, 0x85, 0x6c, 0x5a, 0x9a, 0x83, 0x95, 0x73,
-    0x63, 0x75, 0x6e, 0x95, 0x6c, 0x6e, 0x78, 0x80, 0x9c, 0x65, 0x93, 0x6b,
-    0x7b, 0x5b, 0x9c, 0x62, 0xda, 0x67, 0x74, 0x69, 0x72, 0x76, 0x72, 0x86,
-    0x7e, 0xa0, 0x76, 0x81, 0x74, 0x60, 0x63, 0x6f, 0x7d, 0x86, 0x6c, 0x73,
-    0x78, 0x66, 0x78, 0x76, 0x71, 0x75, 0x76, 0x71, 0x6d, 0x77, 0x77, 0x74,
-    0x6c, 0x78, 0x78, 0x79, 0x6f, 0x73, 0x7a, 0x79, 0x70, 0x6e, 0x76, 0x76,
-    0x69, 0x7b, 0x6d, 0x75, 0x73, 0x6a, 0x74, 0x79, 0x6e, 0x7d, 0x75, 0x76,
-    0x6b, 0x7d, 0x6c, 0x68, 0x81, 0x78, 0x72, 0x74, 0x77, 0x70, 0x7a, 0x79,
-    0x7c, 0x77, 0x73, 0x6e, 0x72, 0x67, 0x7a, 0x6b, 0x76, 0x6c, 0x73, 0x6b,
-    0x88, 0x70, 0x85, 0x78, 0x84, 0x81, 0x60, 0x65, 0x8d, 0x7d, 0x86, 0x7d,
-    0x6b, 0x92, 0x7b, 0x79, 0x7e, 0x6d, 0x94, 0x70, 0x92, 0x6e, 0xbf, 0x72,
-    0x61, 0x91, 0x5a, 0x4c, 0x71, 0x79, 0x73, 0x90, 0x85, 0x73, 0x5e, 0x7a,
-    0x99, 0x8c, 0x85, 0x9c, 0xd4, 0x9f, 0x96, 0x54, 0x70, 0x8b, 0x5d, 0x94,
-    0x7e, 0x8d, 0x7d, 0x7b, 0x8d, 0x57, 0x6c, 0x71, 0x5d, 0x81, 0x8d, 0x7a,
-    0x68, 0x74, 0x86, 0x7a, 0x79, 0x66, 0x77, 0x74, 0x7c, 0x79, 0x76, 0x75,
-    0x74, 0x73, 0x74, 0x78, 0x74, 0x7c, 0x6c, 0x75, 0x6d, 0x74, 0x72, 0x71,
-    0x75, 0x76, 0x76, 0x77, 0x78, 0x6c, 0x79, 0x76, 0x75, 0x6f, 0x72, 0x73,
-    0x6c, 0x7a, 0x6e, 0x79, 0x84, 0x74, 0x72, 0x73, 0x7c, 0x77, 0x6d, 0x7a,
-    0x70, 0x7c, 0x68, 0x72, 0x73, 0x7b, 0x79, 0x76, 0x72, 0x86, 0x77, 0x77,
-    0x7d, 0x6c, 0x7e, 0x9b, 0x59, 0x5f, 0x8f, 0x75, 0x5e, 0x71, 0x5d, 0x73,
-    0x66, 0x51, 0x6c, 0x8b, 0x81, 0x91, 0x4e, 0x75, 0x63, 0x59, 0x78, 0x5f,
-    0x68, 0x89, 0x7e, 0x90, 0x8a, 0x8a, 0x7b, 0xa7, 0xa8, 0x56, 0x69, 0x40,
-    0x74, 0x54, 0x96, 0x6f, 0xd4, 0x6b, 0x6b, 0x81, 0x74, 0x8e, 0x71, 0x57,
-    0x70, 0x76, 0x82, 0x67, 0x7d, 0x63, 0x7a, 0x91, 0xa0, 0x9b, 0x6d, 0xa0,
-    0x5d, 0x78, 0x76, 0x7b, 0xa7, 0xad, 0x79, 0x62, 0x7b, 0xa9, 0x87, 0x70,
-    0x95, 0x8a, 0x64, 0x81, 0x6f, 0x60, 0x71, 0x77, 0x7e, 0x8a, 0xbc, 0x62,
-    0x85, 0x92, 0x65, 0x84, 0x86, 0x4d, 0x76, 0xa9, 0x69, 0x85, 0x4f, 0x8c,
-    0x6e, 0x9f, 0x91, 0x6f, 0xcb, 0x96, 0x88, 0x74, 0x74, 0x78, 0x70, 0x83,
-    0x7c, 0x66, 0x84, 0x79, 0x7d, 0x5f, 0x9d, 0x6c, 0x59, 0xde, 0x94, 0x6e,
-    0x7c, 0x4a, 0x99, 0x7a, 0x86, 0x7d, 0x50, 0x79, 0x7b, 0x7e, 0x89, 0x56,
-    0x65, 0xa6, 0x58, 0x5f, 0x86, 0x5e, 0x72, 0x85, 0x74, 0x8b, 0xb1, 0x51,
-    0x7c, 0x69, 0x5c, 0x57, 0x6d, 0x61, 0x61, 0x8e, 0x6a, 0x73, 0x97, 0x6e,
-    0x5a, 0x91, 0x87, 0x7e, 0xd7, 0x96, 0x80, 0x7c, 0x76, 0x63, 0x99, 0x7c,
-    0x70, 0x40, 0x77, 0x85, 0x7c, 0x5e, 0x9a, 0x80, 0x5e, 0xde, 0x8c, 0x8f,
-    0x72, 0x76, 0x74, 0x6b, 0x71, 0x75, 0x6e, 0x76, 0x74, 0x72, 0x73, 0x70,
-    0x73, 0x6e, 0x71, 0x75, 0x76, 0x71, 0x75, 0x6f, 0x70, 0x75, 0x6c, 0x72,
-    0x6c, 0x6c, 0x6d, 0x74, 0x76, 0x73, 0x72, 0x6f, 0x6e, 0x70, 0x71, 0x6d,
-    0x6d, 0x74, 0x77, 0x75, 0x79, 0x76, 0x71, 0x6d, 0x71, 0x71, 0x76, 0x6e,
-    0x74, 0x70, 0x74, 0x74, 0x72, 0x64, 0x78, 0x78, 0x74, 0x71, 0x77, 0x72,
-    0x7b, 0x71, 0x7d, 0x76, 0x73, 0x70, 0x75, 0x74, 0x75, 0x72, 0x78, 0x6f,
-    0x68, 0x77, 0x78, 0x78, 0x68, 0x77, 0x79, 0x69, 0x76, 0x7c, 0x76, 0x6d,
-    0x85, 0x84, 0x75, 0x70, 0x75, 0x78, 0x71, 0x78, 0x6f, 0x75, 0x74, 0x71,
-    0x78, 0x79, 0x80, 0x6b, 0x7c, 0x77, 0x6e, 0x6f, 0x70, 0x79, 0x7f, 0x72,
-    0x82, 0x78, 0x6f, 0x6d, 0x6a, 0x7d, 0x56, 0x73, 0x7a, 0x71, 0x84, 0x71,
-    0x73, 0x63, 0x63, 0x7e, 0x92, 0x89, 0x71, 0x74, 0x86, 0x63, 0x92, 0x6f,
-    0x81, 0x84, 0x6a, 0x74, 0x58, 0x6b, 0x7d, 0x76, 0x76, 0x43, 0xac, 0x4c,
-    0x5e, 0x82, 0x70, 0x5e, 0x79, 0x8d, 0x75, 0xa4, 0x83, 0x80, 0x59, 0x61,
-    0x8b, 0x7f, 0x7c, 0x77, 0xc9, 0x91, 0x91, 0x6e, 0x80, 0x6d, 0x65, 0x5d,
-    0x62, 0x87, 0x79, 0x57, 0x7e, 0x4c, 0x7d, 0x82, 0x75, 0xd6, 0x87, 0x6b,
-    0x70, 0x77, 0x76, 0x79, 0x75, 0x7d, 0x78, 0x6d, 0x65, 0x75, 0x6b, 0x66,
-    0x79, 0x70, 0x4e, 0x78, 0x78, 0x74, 0x7a, 0x73, 0x77, 0x72, 0x82, 0x4e,
-    0x7a, 0x78, 0x69, 0x6b, 0x7a, 0x72, 0x75, 0x7b, 0x78, 0x73, 0x7d, 0x77,
-    0x67, 0x73, 0x78, 0x79, 0x8a, 0x71, 0x78, 0x72, 0x73, 0x71, 0x70, 0x71,
-    0x78, 0x74, 0x6d, 0x73, 0x72, 0x7b, 0x5d, 0x76, 0x75, 0x80, 0x72, 0x79,
-    0x79, 0x70, 0x75, 0x6c, 0x6f, 0x79, 0x7d, 0x75, 0x7a, 0x73, 0x79, 0x6a,
-    0x84, 0x75, 0x78, 0x6e, 0x64, 0x6f, 0x74, 0x6d, 0x71, 0x59, 0x84, 0x75,
-    0x70, 0x67, 0x65, 0x72, 0x72, 0x6d, 0x77, 0x79, 0x74, 0x68, 0x74, 0x66,
-    0x75, 0x7c, 0x7e, 0x77, 0x6e, 0x6f, 0x6d, 0x8c, 0x76, 0x70, 0x7d, 0x6f,
-    0x7c, 0x80, 0x76, 0x67, 0x6b, 0x73, 0x57, 0x7b, 0x6c, 0x78, 0x75, 0x76,
-    0x92, 0x3f, 0x53, 0xb9, 0x4c, 0x3b, 0x85, 0x76, 0x70, 0x59, 0x6b, 0x8e,
-    0x52, 0x40, 0x80, 0x8c, 0x78, 0xa1, 0x57, 0x31, 0x4c, 0x38, 0x5d, 0x61,
-    0x53, 0x79, 0x70, 0xb3, 0x82, 0x9d, 0x3f, 0x90, 0x6b, 0x4f, 0x32, 0x34,
-    0x4e, 0x37, 0x97, 0x3a, 0x8c, 0x48, 0x2b, 0x8a, 0xbf, 0x3c, 0x54, 0x3f,
-    0x85, 0x46, 0x63, 0x3f, 0x91, 0x57, 0x51, 0x6c, 0xa2, 0xe3, 0x44, 0xa5,
-    0x5d, 0x6c, 0x7c, 0x88, 0x96, 0x5a, 0x72, 0x7c, 0x4b, 0x71, 0x8c, 0x78,
-    0x61, 0x8f, 0x69, 0x82, 0x80, 0x7b, 0x7d, 0x7d, 0x6e, 0x7c, 0x6e, 0x47,
-    0x71, 0x69, 0x93, 0x81, 0x80, 0x75, 0x83, 0x7e, 0x7e, 0x85, 0x63, 0x72,
-    0x56, 0x7c, 0x88, 0x6d, 0xa6, 0x4a, 0x73, 0x80, 0x83, 0x63, 0x99, 0x66,
-    0x55, 0x54, 0x78, 0x81, 0x87, 0x4b, 0x69, 0x6a, 0x7f, 0x91, 0x6c, 0x67,
-    0x55, 0x79, 0x87, 0x74, 0x6a, 0x78, 0x7a, 0x72, 0x76, 0x74, 0x76, 0x7e,
-    0x86, 0x66, 0x68, 0x85, 0x63, 0x7d, 0x83, 0x7a, 0x7e, 0x7a, 0x7e, 0x80,
-    0x85, 0x91, 0x81, 0x7d, 0x6c, 0x71, 0x74, 0x83, 0x64, 0x84, 0x6f, 0x8a,
-    0x7f, 0x73, 0x6c, 0x72, 0x9c, 0x76, 0x73, 0x7f, 0x83, 0x75, 0x80, 0x76,
-    0x70, 0x78, 0x70, 0x80, 0x7d, 0x85, 0x7e, 0x72, 0x5c, 0x78, 0x78, 0x80,
-    0x5a, 0x54, 0x79, 0x81, 0x76, 0x80, 0x7e, 0x6b, 0x7f, 0x85, 0x7a, 0x89,
-    0x80, 0x7c, 0x6a, 0x76, 0x93, 0x7d, 0x6d, 0x8d, 0x76, 0x5a, 0x6d, 0x73,
-    0x8f, 0x7b, 0x84, 0x56, 0x5d, 0x7e, 0x69, 0x82, 0x60, 0x66, 0x6f, 0x7d,
-    0x74, 0x89, 0x7b, 0x78, 0x92, 0x63, 0x82, 0x75, 0x7d, 0x7e, 0x7d, 0x85,
-    0x7c, 0x69, 0x6d, 0x78, 0x77, 0x76, 0x74, 0x81, 0x7c, 0x8d, 0x7b, 0x77,
-    0x6c, 0x83, 0x57, 0x7d, 0x8f, 0x86, 0x6b, 0x86, 0xa5, 0xae, 0x91, 0x64,
-    0x94, 0x9c, 0x62, 0x92, 0x7a, 0x7e, 0x54, 0x72, 0x7d, 0x82, 0xa1, 0x89,
-    0x6d, 0x80, 0x8c, 0x7f, 0x89, 0x6c, 0x61, 0x91, 0x8c, 0x78, 0x63, 0x61,
-    0x6b, 0x90, 0x84, 0x66, 0xd7, 0x91, 0x77, 0x5a, 0x92, 0x7a, 0x72, 0x93,
-    0x6f, 0x8b, 0x7d, 0x7a, 0x9c, 0x5d, 0x9f, 0x6c, 0x83, 0xe0, 0x9a, 0x62,
-    0x74, 0x78, 0x6e, 0x72, 0x75, 0x7b, 0x4a, 0x60, 0x77, 0x73, 0x78, 0x6d,
-    0x79, 0x74, 0x70, 0x3f, 0x73, 0x69, 0x5e, 0x75, 0x62, 0x6e, 0x79, 0x75,
-    0x7e, 0x6c, 0x6c, 0x6f, 0x68, 0x6e, 0x7f, 0x67, 0x54, 0x75, 0x7c, 0x61,
-    0x72, 0x7f, 0x72, 0x7a, 0x73, 0x79, 0x7a, 0x7b, 0x71, 0x78, 0x7b, 0x76,
-    0x78, 0x78, 0x67, 0x7b, 0x6f, 0x75, 0x75, 0x7d, 0x6f, 0x5f, 0x7c, 0x54,
-    0x71, 0x9f, 0x96, 0x7b, 0x86, 0x85, 0x55, 0x6a, 0x82, 0x74, 0x73, 0x82,
-    0x79, 0x6f, 0x73, 0x74, 0x96, 0x7f, 0x87, 0x6c, 0x84, 0x80, 0xa3, 0x52,
-    0x80, 0x5c, 0x5c, 0x60, 0x84, 0x5e, 0x7d, 0x92, 0x7b, 0x70, 0x56, 0x9e,
-    0x72, 0x90, 0x7e, 0x9e, 0xd8, 0x7e, 0x78, 0x71, 0x83, 0x85, 0x8d, 0x8f,
-    0x88, 0x9d, 0x8b, 0x7b, 0x7c, 0x62, 0x84, 0x6e, 0x85, 0x72, 0x87, 0x69,
-    0x7f, 0x85, 0xb5, 0xa0, 0xac, 0xa3, 0x7a, 0x6e, 0x90, 0xb5, 0x98, 0x91,
-    0x78, 0x98, 0x82, 0x5f, 0xa2, 0x27, 0x79, 0xca, 0xb8, 0xcb, 0x5d, 0x91,
-    0x99, 0x70, 0x76, 0x5b, 0x70, 0x88, 0xc3, 0x76, 0x51, 0xd1, 0x7f, 0xad,
-    0xa3, 0x72, 0x84, 0x95, 0xa6, 0xae, 0xca, 0x88, 0x8c, 0x90, 0x73, 0x90,
-    0x7a, 0x88, 0x53, 0xaa, 0x4b, 0x69, 0xca, 0x82, 0x49, 0x7f, 0xb4, 0x7c,
-    0x75, 0x96, 0x89, 0x74, 0x89, 0x58, 0x6d, 0x60, 0x68, 0x5a, 0x83, 0x85,
-    0x85, 0x70, 0x7f, 0x88, 0x80, 0x6e, 0x85, 0x6f, 0x6f, 0x8c, 0x7d, 0x7b,
-    0x92, 0x6e, 0x72, 0x7c, 0x7b, 0x89, 0x6c, 0x74, 0x72, 0x7f, 0x9a, 0x90,
-    0x4f, 0x82, 0x7a, 0x8a, 0xa8, 0x55, 0x73, 0x80, 0x8c, 0x76, 0x88, 0x6c,
-    0x80, 0x67, 0x7c, 0x8d, 0x6a, 0x47, 0x63, 0x93, 0x80, 0xa5, 0x7e, 0x83,
-    0x96, 0x39, 0x48, 0xb5, 0x86, 0x37, 0x6a, 0x72, 0x97, 0x62, 0xa0, 0x7e,
-    0x50, 0x93, 0x74, 0x7f, 0x70, 0x76, 0x47, 0x46, 0x56, 0x42, 0xa8, 0x7c,
-    0x52, 0x75, 0x5c, 0xb0, 0x7a, 0x88, 0x58, 0x8d, 0x53, 0x56, 0x27, 0x5d,
-    0x86, 0x35, 0x71, 0x65, 0x82, 0x5d, 0x51, 0x68, 0x59, 0x3f, 0x5a, 0x6d,
-    0x77, 0x79, 0x9a, 0xa9, 0x7d, 0x4d, 0x4b, 0x75, 0x82, 0xdd, 0x33, 0x9c,
-    0x5f, 0x6f, 0x67, 0x78, 0x6e, 0x4d, 0x68, 0x6c, 0x7a, 0x6b, 0x76, 0x7d,
-    0x75, 0x83, 0x82, 0x74, 0x86, 0x62, 0x80, 0x72, 0x67, 0x5c, 0x7b, 0x6d,
-    0x6b, 0x6b, 0x6b, 0x7a, 0x77, 0x67, 0x73, 0x73, 0x6e, 0x72, 0x67, 0x62,
-    0x4f, 0x75, 0x72, 0x76, 0x7d, 0x7e, 0x82, 0x4d, 0x72, 0x6f, 0x5e, 0x89,
-    0x83, 0x6d, 0x72, 0x71, 0x78, 0x46, 0x5c, 0x77, 0x7a, 0x76, 0x84, 0x70,
-    0x72, 0x66, 0x7e, 0x88, 0x68, 0x5c, 0x74, 0x7c, 0x84, 0x7b, 0x7c, 0x74,
-    0x74, 0x61, 0x68, 0x82, 0x81, 0x81, 0x76, 0x75, 0x7b, 0x82, 0x90, 0x82,
-    0x59, 0x5a, 0x71, 0x74, 0x6e, 0x7d, 0x6e, 0x7d, 0x74, 0x69, 0x7f, 0x90,
-    0x6e, 0x78, 0x6a, 0x7a, 0xa5, 0x75, 0x7d, 0x73, 0x81, 0x6e, 0x83, 0x80,
-    0x7b, 0x75, 0x73, 0x7c, 0x7d, 0x67, 0x79, 0x7a, 0x79, 0x7c, 0x94, 0x83,
-    0x7e, 0x77, 0x66, 0x78, 0x6d, 0x76, 0x74, 0x70, 0x77, 0x7f, 0x6d, 0x7a,
-    0x2a, 0x7a, 0x70, 0x7b, 0x70, 0x73, 0x75, 0x6f, 0x5e, 0x72, 0x76, 0x81,
-    0x6d, 0x75, 0x5a, 0x7e, 0x77, 0x5c, 0x74, 0x76, 0x6b, 0x7a, 0x85, 0x7d,
-    0x76, 0x5a, 0x78, 0x73, 0x8e, 0x6c, 0x7e, 0x80, 0x28, 0x70, 0x33, 0x75,
-    0x78, 0x7d, 0x74, 0x69, 0x6c, 0x67, 0x6c, 0x7b, 0x7c, 0x77, 0x7e, 0x72,
-    0x75, 0x74, 0x7d, 0x7d, 0x78, 0x74, 0x74, 0x76, 0x70, 0x6f, 0x75, 0x78,
-    0x6a, 0x7a, 0x66, 0x76, 0x76, 0x73, 0x7a, 0x6c, 0x6a, 0x70, 0x78, 0x4b,
-    0x6b, 0x6f, 0x7a, 0x72, 0x72, 0x78, 0x6f, 0x74, 0x75, 0x79, 0x79, 0x77,
-    0x65, 0x74, 0x76, 0x73, 0x7b, 0x74, 0x74, 0x6e, 0x7e, 0x74, 0x79, 0x81,
-    0x77, 0x72, 0x7a, 0x71, 0x70, 0x73, 0x66, 0x75, 0x70, 0x71, 0x89, 0x7a,
-    0x82, 0x7c, 0x5f, 0x80, 0x85, 0x5c, 0x79, 0x6e, 0x8b, 0x6c, 0x88, 0x96,
-    0x90, 0x4c, 0x8f, 0x86, 0x7c, 0x8c, 0x4e, 0x5d, 0x90, 0x3b, 0x95, 0x65,
-    0x8d, 0x7c, 0x70, 0x7a, 0x83, 0x84, 0x73, 0x85, 0x8a, 0x58, 0x5a, 0x56,
-    0x91, 0x5c, 0x7b, 0x89, 0xc8, 0x58, 0x87, 0x83, 0x91, 0x75, 0x44, 0x70,
-    0x8b, 0x9d, 0x7f, 0x73, 0x79, 0x61, 0x5e, 0x82, 0x87, 0xdf, 0x8d, 0x7d,
-    0x6f, 0x77, 0x79, 0x71, 0x73, 0x74, 0x59, 0x6b, 0x71, 0x75, 0x79, 0x71,
-    0x74, 0x70, 0x6d, 0x56, 0x6d, 0x73, 0x55, 0x73, 0x54, 0x70, 0x77, 0x77,
-    0x79, 0x6c, 0x77, 0x73, 0x6d, 0x6d, 0x7b, 0x68, 0x63, 0x75, 0x6c, 0x66,
-    0x72, 0x77, 0x72, 0x7a, 0x6c, 0x6e, 0x74, 0x75, 0x71, 0x73, 0x7a, 0x77,
-    0x73, 0x74, 0x6e, 0x7a, 0x65, 0x7d, 0x71, 0x79, 0x71, 0x64, 0x7b, 0x57,
-    0x63, 0x74, 0x67, 0x86, 0x81, 0x77, 0x69, 0x75, 0x8b, 0x82, 0xa1, 0x4b,
-    0x5c, 0x96, 0x59, 0x7b, 0x79, 0x67, 0x72, 0x6e, 0x6e, 0x8b, 0x75, 0x77,
-    0x96, 0x4f, 0x85, 0x6d, 0x68, 0x6b, 0x55, 0x61, 0x2f, 0x75, 0x75, 0x8a,
-    0x7c, 0x6f, 0x5f, 0x83, 0x92, 0x74, 0x7c, 0x58, 0x2c, 0x6e, 0x80, 0x74,
-    0x79, 0x82, 0x82, 0x87, 0x86, 0x7a, 0x68, 0x6b, 0x5e, 0x66, 0x82, 0x5b,
-    0x73, 0x6f, 0x72, 0x70, 0x70, 0x75, 0x75, 0x72, 0x71, 0x70, 0x70, 0x6f,
-    0x72, 0x70, 0x70, 0x6b, 0x4a, 0x74, 0x35, 0x72, 0x71, 0x70, 0x6e, 0x74,
-    0x77, 0x6d, 0x73, 0x72, 0x70, 0x72, 0x72, 0x72, 0x72, 0x72, 0x6b, 0x73,
-    0x6f, 0x75, 0x74, 0x72, 0x70, 0x72, 0x71, 0x6e, 0x73, 0x71, 0x71, 0x73,
-    0x73, 0x74, 0x72, 0x6f, 0x74, 0x72, 0x72, 0x70, 0x6e, 0x6f, 0x70, 0x72,
-    0x72, 0x7c, 0x77, 0x81, 0x7b, 0x89, 0x57, 0x82, 0x7b, 0x94, 0x99, 0x7f,
-    0x76, 0x8c, 0x78, 0x77, 0x5d, 0x86, 0x79, 0x7f, 0x60, 0x6b, 0x98, 0x5c,
-    0x59, 0x66, 0x75, 0x69, 0x84, 0x5d, 0x73, 0x9a, 0x89, 0x91, 0x80, 0x78,
-    0x7f, 0x78, 0x8a, 0x8a, 0xbf, 0x73, 0x75, 0x88, 0x70, 0x81, 0x8d, 0x61,
-    0x6f, 0x84, 0x7f, 0x5e, 0x7e, 0x59, 0x59, 0x8c, 0x70, 0xdd, 0x7b, 0x7e,
-    0x65, 0x53, 0x6c, 0x71, 0x73, 0x6d, 0x89, 0x75, 0x53, 0x78, 0x4a, 0x76,
-    0x4a, 0x54, 0x8f, 0xaa, 0x8f, 0x9f, 0x49, 0x4a, 0x6f, 0x8d, 0x4a, 0x6f,
-    0x59, 0x86, 0x94, 0x8a, 0x9f, 0x9f, 0x51, 0x7e, 0x8d, 0x48, 0x3a, 0x6a,
-    0x67, 0x69, 0x8f, 0x4e, 0x7a, 0x71, 0x65, 0x89, 0x92, 0x70, 0x63, 0x5e,
-    0x6d, 0x7c, 0x8b, 0x66, 0x94, 0x5f, 0x62, 0x95, 0xa3, 0xa3, 0x15, 0x9c,
-    0x7f, 0x8e, 0x7b, 0x7d, 0x6e, 0x7e, 0x90, 0x77, 0x65, 0x6f, 0x7d, 0x73,
-    0x66, 0x96, 0x80, 0x7d, 0x7f, 0x72, 0x87, 0x68, 0x7f, 0x90, 0x88, 0x64,
-    0x77, 0x71, 0x5e, 0x88, 0x6a, 0x7f, 0x68, 0x7c, 0x72, 0x84, 0x83, 0x78,
-    0x78, 0x86, 0x5f, 0x81, 0x97, 0x7f, 0x75, 0x71, 0x8f, 0x60, 0x99, 0x6f,
-    0x80, 0x4d, 0x73, 0x71, 0x6e, 0x5e, 0x8e, 0x86, 0x77, 0x8f, 0x8a, 0x7f,
-    0x78, 0x74, 0x82, 0x7a, 0x79, 0x71, 0x76, 0x72, 0x5d, 0x54, 0x4e, 0x6a,
-    0x7d, 0x6a, 0x41, 0x7e, 0x74, 0x75, 0x71, 0x74, 0x6e, 0x73, 0x67, 0x36,
-    0x70, 0x75, 0x68, 0x6f, 0x75, 0x77, 0x73, 0x70, 0x6b, 0x70, 0x7c, 0x6e,
-    0x71, 0x81, 0x6f, 0x70, 0x87, 0x76, 0x75, 0x6d, 0x30, 0x73, 0x5f, 0x61,
-    0x7e, 0x75, 0x6d, 0x70, 0x77, 0x76, 0x7b, 0x70, 0x7c, 0x81, 0x62, 0x6e,
-    0x66, 0xac, 0x9a, 0x77, 0x8d, 0x66, 0x61, 0x8a, 0x8f, 0x78, 0x75, 0x80,
-    0x8f, 0x7b, 0x96, 0x92, 0xa5, 0x76, 0x3f, 0x77, 0x77, 0x99, 0xc9, 0x70,
-    0x7a, 0x8d, 0x83, 0x61, 0xa1, 0x7b, 0x70, 0x76, 0x91, 0x57, 0x7e, 0x8b,
-    0x9a, 0x85, 0x8e, 0x68, 0xd9, 0x9d, 0x8c, 0x7b, 0x72, 0x6d, 0x80, 0x7e,
-    0x67, 0xb8, 0x5d, 0x7e, 0x85, 0x5a, 0x64, 0x78, 0x90, 0xd9, 0x65, 0x63,
-    0x56, 0x3d, 0x81, 0x7c, 0x7a, 0x7e, 0x7a, 0x6f, 0x7f, 0x8c, 0x7e, 0x94,
-    0x79, 0x8a, 0x60, 0x83, 0x74, 0x77, 0x6f, 0x82, 0x7e, 0x77, 0x78, 0x76,
-    0x81, 0x71, 0x75, 0x5f, 0x79, 0x71, 0x6b, 0x7f, 0x6c, 0x72, 0x76, 0x8a,
-    0x7c, 0x80, 0x87, 0x84, 0x97, 0x6f, 0x7f, 0x75, 0x7b, 0x7d, 0x7f, 0x81,
-    0x82, 0x73, 0x70, 0x70, 0x76, 0x83, 0x6f, 0x7b, 0x6c, 0x91, 0x86, 0x7d,
-    0x6c, 0x81, 0x7c, 0x77, 0x93, 0x42, 0x8e, 0x6e, 0x7a, 0x83, 0x90, 0x7a,
-    0x74, 0x8f, 0x4c, 0x64, 0x6e, 0x62, 0x76, 0x5d, 0x77, 0x68, 0xa6, 0x57,
-    0x56, 0x81, 0x63, 0x5f, 0x7d, 0x84, 0x5c, 0x9c, 0x7a, 0x77, 0x95, 0x78,
-    0x9f, 0x94, 0x7a, 0x67, 0xc9, 0x85, 0x89, 0x56, 0x6f, 0x6a, 0xad, 0x7d,
-    0x73, 0x50, 0x76, 0x83, 0x85, 0x56, 0x91, 0x86, 0x76, 0xcb, 0x68, 0x94,
-    0x72, 0x79, 0x7c, 0x8d, 0x98, 0x52, 0x80, 0x71, 0x56, 0x73, 0x89, 0x77,
-    0x81, 0x84, 0x88, 0x6e, 0x8c, 0x85, 0x84, 0x72, 0x70, 0x75, 0x83, 0x7b,
-    0x7d, 0x75, 0x81, 0x6d, 0x73, 0x95, 0x69, 0x85, 0x6c, 0x7b, 0x7d, 0x78,
-    0x4f, 0x83, 0x86, 0x7e, 0xb1, 0x57, 0x7d, 0x74, 0x8e, 0x7c, 0x90, 0x7c,
-    0x58, 0x4b, 0x74, 0x71, 0x79, 0x4c, 0x7b, 0x7d, 0x77, 0xa8, 0x7f, 0x6a,
-    0x75, 0x7b, 0x73, 0x7e, 0x6d, 0x7e, 0x79, 0x72, 0x76, 0x7c, 0x78, 0x73,
-    0x5e, 0x69, 0x6d, 0x7a, 0x73, 0x77, 0x73, 0x74, 0x6e, 0x6d, 0x72, 0x77,
-    0x71, 0x71, 0x68, 0x6f, 0x72, 0x70, 0x74, 0x6d, 0x70, 0x73, 0x80, 0x77,
-    0x76, 0x75, 0x72, 0x73, 0x86, 0x6b, 0x75, 0x75, 0x46, 0x73, 0x3a, 0x70,
-    0x77, 0x7b, 0x72, 0x6d, 0x6f, 0x6a, 0x71, 0x7b, 0x79, 0x83, 0x81, 0x76,
-    0x4b, 0x69, 0x72, 0x80, 0x8c, 0x68, 0x7e, 0x7b, 0x7e, 0x6f, 0x79, 0x81,
-    0x7e, 0x79, 0x66, 0x74, 0x59, 0x75, 0x7b, 0x77, 0x78, 0x74, 0x76, 0x70,
-    0x5e, 0x85, 0x84, 0x7d, 0x73, 0x7c, 0x70, 0x8d, 0x59, 0x82, 0x7a, 0x79,
-    0x86, 0x6b, 0x41, 0x7c, 0x92, 0x85, 0x7d, 0x6f, 0x8b, 0x7e, 0x94, 0x7c,
-    0x74, 0x6e, 0x6d, 0x77, 0x78, 0x8a, 0x7c, 0x70, 0x68, 0x8a, 0x6d, 0x7c,
-    0x7a, 0x64, 0x6f, 0x8b, 0x7a, 0x5d, 0x72, 0x69, 0x77, 0x75, 0x7d, 0x51,
-    0x65, 0x75, 0x4f, 0x7a, 0x6e, 0x7b, 0x74, 0x7f, 0x78, 0x7d, 0x74, 0x79,
-    0x77, 0x67, 0x56, 0x58, 0x72, 0x63, 0x7d, 0x77, 0x68, 0x68, 0x7f, 0x68,
-    0x7c, 0x7b, 0x5d, 0x60, 0x92, 0x78, 0x71, 0x68, 0x25, 0x7e, 0x80, 0x6d,
-    0x77, 0x6c, 0x6b, 0x7f, 0x76, 0x4f, 0x7c, 0x72, 0x70, 0x83, 0x79, 0x6b,
-    0x67, 0x6d, 0xaa, 0x91, 0x6d, 0x54, 0x62, 0x51, 0x68, 0xa7, 0x83, 0x62,
-    0x8b, 0x76, 0x4c, 0x5f, 0x66, 0x56, 0x6a, 0x85, 0x80, 0x94, 0xab, 0x57,
-    0x86, 0x6c, 0x59, 0x53, 0x61, 0x89, 0x7b, 0x95, 0x6b, 0xa5, 0x5f, 0x8f,
-    0x97, 0xa7, 0x82, 0x84, 0xc4, 0x80, 0x91, 0x53, 0x71, 0x75, 0x75, 0x78,
-    0x7f, 0x4a, 0x73, 0x7e, 0x70, 0x6d, 0xaa, 0x7f, 0x67, 0xc9, 0x85, 0x75,
-    0x75, 0x73, 0x87, 0x71, 0x62, 0x5e, 0x75, 0x77, 0x7a, 0x83, 0x73, 0x56,
-    0x6f, 0x77, 0x7c, 0x78, 0x5a, 0x6e, 0x74, 0x79, 0x7d, 0x71, 0x80, 0x7c,
-    0x76, 0x79, 0x7c, 0x7c, 0x64, 0x6f, 0x75, 0x74, 0x71, 0x7a, 0x7a, 0x63,
-    0x72, 0x80, 0x6b, 0x76, 0x87, 0x74, 0x71, 0x6f, 0x73, 0x56, 0x76, 0x6d,
-    0x82, 0x7e, 0x70, 0x6c, 0x74, 0x6b, 0x79, 0x75, 0x63, 0x73, 0x73, 0x73,
-    0x68, 0x71, 0x79, 0x24, 0x8f, 0x56, 0x93, 0x6c, 0x6b, 0x7a, 0x79, 0x57,
-    0x7c, 0x76, 0x7d, 0x84, 0x82, 0x6a, 0x75, 0x84, 0x71, 0x8b, 0x95, 0x65,
-    0x68, 0x76, 0x77, 0x8f, 0x77, 0x79, 0x73, 0x58, 0x7c, 0x84, 0x75, 0x67,
-    0x77, 0x74, 0x81, 0x7b, 0x90, 0x61, 0x8f, 0x80, 0x96, 0x6e, 0x92, 0x6e,
-    0x6c, 0x53, 0x6a, 0x78, 0x89, 0x57, 0x5c, 0x97, 0x65, 0x8e, 0x86, 0x69,
-    0x79, 0x67, 0x71, 0x78, 0x78, 0x6a, 0x75, 0x72, 0x6e, 0x72, 0x77, 0x70,
-    0x70, 0x78, 0x77, 0x75, 0x75, 0x72, 0x74, 0x77, 0x73, 0x74, 0x72, 0x71,
-    0x70, 0x75, 0x75, 0x75, 0x73, 0x70, 0x72, 0x76, 0x6d, 0x79, 0x77, 0x75,
-    0x75, 0x7f, 0x72, 0x6f, 0x7b, 0x75, 0x75, 0x78, 0x75, 0x6b, 0x77, 0x79,
-    0x78, 0x77, 0x74, 0x72, 0x75, 0x6e, 0x79, 0x6e, 0x74, 0x75, 0x73, 0x71,
-    0x69, 0x73, 0x6f, 0x76, 0x7a, 0x6e, 0x5b, 0x73, 0x7d, 0x6d, 0x80, 0x78,
-    0x57, 0x7b, 0x76, 0x68, 0x78, 0x6c, 0x7a, 0x71, 0x79, 0x73, 0x7b, 0x75,
-    0x57, 0x71, 0x75, 0x78, 0x77, 0x74, 0x73, 0x6e, 0x7e, 0x6a, 0x73, 0x5e,
-    0x68, 0x26, 0x7c, 0x69, 0x86, 0x75, 0x73, 0x80, 0x53, 0x6c, 0x5d, 0x81,
-    0x6c, 0x6f, 0x7b, 0x75, 0x75, 0x6e, 0x57, 0x73, 0x6a, 0x74, 0x70, 0x6e,
-    0x78, 0xa5, 0x95, 0x75, 0x96, 0x84, 0x73, 0x80, 0x80, 0x7b, 0x77, 0x88,
-    0x87, 0x67, 0x7b, 0x66, 0x64, 0xa6, 0x7e, 0x80, 0x7b, 0x86, 0xc9, 0x6f,
-    0xb1, 0x75, 0x86, 0x56, 0x88, 0x66, 0x7a, 0x9a, 0x93, 0x58, 0x6f, 0x7f,
-    0x70, 0x6f, 0x6f, 0x74, 0xcf, 0x7f, 0x8f, 0x63, 0x98, 0x66, 0x73, 0x80,
-    0x73, 0x69, 0x82, 0x63, 0x86, 0x61, 0x6c, 0x79, 0x8c, 0x77, 0x96, 0x73,
-    0x5e, 0x7d, 0x71, 0x7f, 0x74, 0x61, 0x7e, 0x6c, 0x59, 0x76, 0x73, 0x7c,
-    0x68, 0x6a, 0x99, 0x63, 0x77, 0x77, 0x78, 0x67, 0x76, 0x89, 0x65, 0x5f,
-    0x84, 0x7f, 0x6b, 0x83, 0x6c, 0x83, 0x76, 0x87, 0x72, 0x6d, 0x7d, 0x7c,
-    0x80, 0x7b, 0x82, 0x63, 0x95, 0x66, 0x78, 0x6f, 0x88, 0x79, 0x92, 0x6a,
-    0x57, 0x6a, 0x78, 0x6d, 0x72, 0x71, 0x76, 0x79, 0x72, 0x6c, 0x84, 0x68,
-    0x80, 0x75, 0x51, 0x6e, 0x83, 0x6c, 0x68, 0x7b, 0x78, 0x9e, 0x7d, 0x60,
-    0x92, 0x6b, 0x73, 0x82, 0x83, 0x79, 0x74, 0x70, 0x70, 0x6f, 0x95, 0x64,
-    0x76, 0x76, 0x72, 0x64, 0x73, 0x7e, 0x88, 0x8c, 0x71, 0x7f, 0x6c, 0x64,
-    0x7d, 0x6e, 0x7a, 0x74, 0xb7, 0x71, 0x84, 0x6d, 0x7f, 0x6e, 0x70, 0x79,
-    0x70, 0x78, 0x88, 0x75, 0x83, 0x45, 0x6d, 0x70, 0x61, 0xc7, 0x74, 0x63,
-    0x88, 0x68, 0x5f, 0x78, 0x6c, 0x54, 0x64, 0x7e, 0x6e, 0x75, 0x64, 0x8b,
-    0x7a, 0x7a, 0x70, 0x83, 0x8b, 0x87, 0x44, 0x79, 0x7b, 0x56, 0x9f, 0x61,
-    0x5e, 0x8c, 0x7d, 0x93, 0x7f, 0x82, 0x7c, 0x95, 0x8e, 0x7b, 0x70, 0x51,
-    0x5f, 0x90, 0x84, 0x81, 0xbe, 0x79, 0x91, 0x85, 0x82, 0x73, 0x5e, 0x6a,
-    0x61, 0x96, 0x75, 0x7f, 0x7f, 0x5e, 0x67, 0x7b, 0x7e, 0xc4, 0x96, 0x6d,
-    0x8d, 0x62, 0x6f, 0x73, 0x89, 0x69, 0x82, 0x86, 0x75, 0x68, 0x99, 0x81,
-    0x93, 0x64, 0x6c, 0x90, 0x8e, 0x8d, 0x67, 0x7c, 0x5c, 0x89, 0x7c, 0x81,
-    0x61, 0x7c, 0x77, 0x64, 0x7b, 0x77, 0x60, 0x89, 0x8b, 0x66, 0x65, 0x6b,
-    0x63, 0x8f, 0x90, 0x6f, 0xd1, 0x62, 0x90, 0x9e, 0xab, 0x6d, 0x79, 0x5e,
-    0x79, 0x52, 0x7b, 0x72, 0xa7, 0x64, 0x6c, 0x74, 0x84, 0x85, 0x69, 0x8d,
-    0x71, 0x76, 0x50, 0x75, 0x79, 0x7b, 0x70, 0x74, 0x70, 0x63, 0x70, 0x72,
-    0x79, 0x78, 0x6e, 0x6f, 0x77, 0x75, 0x72, 0x6f, 0x72, 0x79, 0x75, 0x6c,
-    0x74, 0x70, 0x72, 0x6e, 0x75, 0x73, 0x71, 0x73, 0x73, 0x64, 0x6e, 0x79,
-    0x74, 0x5d, 0x76, 0x79, 0x81, 0x72, 0x74, 0x6f, 0x70, 0x75, 0x70, 0x74,
-    0x68, 0x6d, 0x75, 0x75, 0x73, 0x7c, 0x67, 0x76, 0x71, 0x7b, 0x7d, 0x75,
-    0x68, 0x56, 0x7f, 0x74, 0x7b, 0x64, 0x5e, 0x5a, 0x3d, 0x6a, 0x83, 0x6a,
-    0x56, 0x66, 0x65, 0x7d, 0x78, 0x71, 0x79, 0x7b, 0x72, 0x6a, 0x7d, 0x7d,
-    0x53, 0x7a, 0x65, 0x76, 0x6e, 0x73, 0x75, 0x7e, 0x6f, 0x6b, 0x5a, 0x6e,
-    0x8a, 0x7d, 0x6a, 0x64, 0x81, 0x71, 0x79, 0x63, 0x85, 0x6f, 0x68, 0x76,
-    0x82, 0x75, 0x78, 0x70, 0x69, 0x78, 0x71, 0x64, 0x88, 0x80, 0x81, 0x6b,
-    0x78, 0x74, 0x72, 0x7a, 0x6a, 0x72, 0x66, 0x73, 0x72, 0x71, 0x6c, 0x79,
-    0x73, 0x7e, 0x72, 0x75, 0x72, 0x5e, 0x1c, 0x74, 0x5a, 0x71, 0x77, 0x6d,
-    0x6f, 0x6b, 0x6e, 0x73, 0x6d, 0x74, 0x76, 0x7a, 0x71, 0x76, 0x6d, 0x70,
-    0x72, 0x74, 0x71, 0x7c, 0x82, 0x71, 0x74, 0x6f, 0x7a, 0x77, 0x73, 0x73,
-    0x78, 0x73, 0x6f, 0x79, 0x6c, 0x72, 0x73, 0x74, 0x6b, 0x77, 0x70, 0x78,
-    0x74, 0x71, 0x7e, 0x7d, 0x80, 0x70, 0x6e, 0x76, 0x77, 0x75, 0x6b, 0x73,
-    0x61, 0x70, 0x71, 0x74, 0x76, 0x74, 0x78, 0x6e, 0x5d, 0x76, 0x7a, 0x55,
-    0x6a, 0x74, 0x7d, 0x78, 0x72, 0x76, 0x6c, 0x7a, 0x71, 0x76, 0x75, 0x70,
-    0x6e, 0x78, 0x76, 0x6c, 0x78, 0x7e, 0x81, 0x75, 0x7f, 0x74, 0x2e, 0x82,
-    0x7b, 0x77, 0x77, 0x6c, 0x6d, 0x74, 0x6f, 0x79, 0x72, 0x75, 0x70, 0x7a,
-    0x71, 0x80, 0x77, 0x80, 0xbf, 0x99, 0x70, 0x63, 0x7e, 0x85, 0x7e, 0x6f,
-    0x7d, 0x98, 0x98, 0x4a, 0x53, 0x60, 0x59, 0x67, 0x89, 0x81, 0x92, 0x5c,
-    0xa0, 0x75, 0x67, 0x45, 0x70, 0x4e, 0x7e, 0x94, 0x5d, 0x76, 0xa3, 0x8f,
-    0x74, 0x9f, 0x70, 0x75, 0xd3, 0x91, 0x6c, 0x9b, 0x6a, 0x7a, 0x72, 0x87,
-    0x5f, 0x71, 0x87, 0x99, 0x93, 0x5b, 0x95, 0x82, 0x69, 0xe5, 0x88, 0x50,
-    0x79, 0x60, 0x69, 0x8a, 0x51, 0x6f, 0x6f, 0x74, 0x7b, 0x75, 0x82, 0x47,
-    0x79, 0x74, 0x4e, 0x77, 0x70, 0x6f, 0x6a, 0x82, 0x6d, 0x6b, 0x64, 0x68,
-    0x71, 0x6c, 0x68, 0x62, 0x6e, 0x79, 0x78, 0x66, 0x4d, 0x74, 0x7c, 0x84,
-    0x76, 0x72, 0x68, 0x6f, 0x8e, 0x88, 0x68, 0x5f, 0x14, 0x81, 0x80, 0x51,
-    0x75, 0x7d, 0x6c, 0x7c, 0x73, 0x5f, 0x74, 0x51, 0x8e, 0x71, 0x7a, 0x5d,
-    0x6f, 0x6d, 0x71, 0x88, 0x6e, 0x5e, 0x74, 0x5f, 0x86, 0x6c, 0x74, 0x72,
-    0x86, 0x6b, 0x83, 0x62, 0x62, 0x77, 0x6c, 0x66, 0x80, 0x50, 0x8a, 0x7f,
-    0x9c, 0x90, 0x97, 0x57, 0x7d, 0x82, 0x7a, 0xa0, 0x53, 0x77, 0x6d, 0x77,
-    0x9e, 0x93, 0x87, 0x88, 0xd1, 0x8b, 0x75, 0x6b, 0x4a, 0x83, 0x71, 0x6b,
-    0x73, 0x64, 0x77, 0x92, 0x91, 0x61, 0x5a, 0x87, 0x7d, 0x77, 0x62, 0x8f,
-    0x7b, 0x65, 0x6a, 0x79, 0x77, 0x6b, 0x77, 0x85, 0x53, 0x6f, 0x57, 0x8d,
-    0x95, 0x49, 0x8e, 0x88, 0x77, 0x86, 0x73, 0x81, 0x84, 0x94, 0x61, 0x52,
-    0x70, 0x8d, 0x7f, 0x95, 0x76, 0x8d, 0x7d, 0xa0, 0x93, 0x79, 0x79, 0x62,
-    0x80, 0x92, 0x93, 0x6a, 0xce, 0x5e, 0x8a, 0x9f, 0x56, 0x77, 0x7e, 0x64,
-    0x84, 0x66, 0x80, 0x8d, 0x93, 0x6b, 0x70, 0x8d, 0x86, 0x73, 0x67, 0x8f,
-    0x79, 0x65, 0x84, 0x89, 0x59, 0x48, 0x7a, 0x72, 0x89, 0x7b, 0x79, 0x83,
-    0x6c, 0x74, 0x51, 0x8b, 0x74, 0x77, 0x72, 0x7f, 0x7f, 0x5e, 0x82, 0x79,
-    0x7c, 0x72, 0x61, 0x75, 0x71, 0x7a, 0x75, 0x76, 0x78, 0x77, 0x8d, 0x72,
-    0x6f, 0x6e, 0x49, 0x7d, 0x9f, 0x6a, 0x6a, 0x6c, 0x88, 0x5a, 0x85, 0x7b,
-    0x6b, 0x6f, 0x74, 0x78, 0x78, 0x6b, 0x76, 0x78, 0x86, 0x89, 0x90, 0x87,
-    0x67, 0x88, 0xa5, 0x7e, 0x8d, 0x5b, 0x79, 0x6d, 0x7c, 0x6d, 0x9b, 0x3f,
-    0x64, 0x7f, 0x46, 0x79, 0x61, 0x8b, 0x7c, 0x60, 0x93, 0x68, 0xa2, 0x73,
-    0x5d, 0x83, 0x60, 0x5c, 0x7a, 0x81, 0x6d, 0xa1, 0x8c, 0x9d, 0x90, 0x7c,
-    0x82, 0xa6, 0x6f, 0x64, 0xd2, 0x8f, 0x91, 0x68, 0x70, 0x82, 0x72, 0x84,
-    0x86, 0x64, 0x70, 0x67, 0x87, 0x56, 0x85, 0x6b, 0x91, 0x78, 0x95, 0x8b,
-    0x77, 0x75, 0x83, 0x7c, 0x72, 0x73, 0x79, 0x72, 0x54, 0x4c, 0x4e, 0x6e,
-    0x77, 0x66, 0x43, 0x79, 0x75, 0x77, 0x72, 0x76, 0x6e, 0x72, 0x63, 0x3b,
-    0x71, 0x73, 0x6a, 0x74, 0x72, 0x75, 0x71, 0x6b, 0x6d, 0x77, 0x7d, 0x6d,
-    0x72, 0x81, 0x71, 0x74, 0x80, 0x73, 0x72, 0x6f, 0x38, 0x6c, 0x4d, 0x6d,
-    0x7d, 0x73, 0x6c, 0x70, 0x73, 0x6f, 0x7f, 0x73, 0x79, 0x7d, 0x6b, 0x74,
-    0x7d, 0x6d, 0x55, 0x76, 0x8b, 0x74, 0x81, 0x84, 0x6c, 0x95, 0x7e, 0x74,
-    0x94, 0x79, 0x77, 0x97, 0x89, 0x6f, 0x72, 0x7e, 0x6e, 0xa2, 0x96, 0x54,
-    0x95, 0x85, 0x78, 0x71, 0x74, 0x61, 0x7f, 0x87, 0x74, 0x71, 0x68, 0x83,
-    0x7d, 0x81, 0x7a, 0x85, 0xc0, 0x73, 0x7c, 0x73, 0x6e, 0x6d, 0x8f, 0x84,
-    0x6c, 0x8d, 0x77, 0x7b, 0x78, 0x4b, 0x6b, 0x6f, 0x7f, 0xd5, 0x84, 0x51,
-    0x7d, 0x6d, 0x68, 0x88, 0x4b, 0x68, 0x78, 0x73, 0x64, 0x73, 0x4d, 0x82,
-    0x6c, 0x25, 0x77, 0x62, 0x76, 0x6e, 0x84, 0x38, 0x6c, 0x3f, 0x5c, 0x6c,
-    0x72, 0x7d, 0x72, 0x72, 0x71, 0x71, 0x57, 0x5d, 0x3d, 0x53, 0x7f, 0x40,
-    0x76, 0x73, 0x67, 0x4f, 0x68, 0x77, 0x31, 0x74, 0x63, 0x64, 0x72, 0x71,
-    0x75, 0x76, 0x74, 0x60, 0x7f, 0x70, 0x61, 0x6e, 0x74, 0x6e, 0x71, 0x6a,
-    0x4b, 0x4d, 0x7a, 0xa6, 0x82, 0x52, 0x72, 0x8c, 0x5a, 0x61, 0x82, 0x83,
-    0x74, 0x78, 0x8b, 0x7f, 0x97, 0x7f, 0x80, 0x7b, 0x8d, 0x73, 0x8a, 0x72,
-    0x74, 0x6d, 0x82, 0x69, 0x79, 0x91, 0x6e, 0x7c, 0x78, 0x7f, 0x7c, 0x7c,
-    0x83, 0x75, 0x75, 0x67, 0xad, 0x3f, 0x6c, 0x72, 0x8b, 0x6f, 0x8d, 0x63,
-    0x60, 0x36, 0x68, 0x6f, 0x7f, 0x60, 0xa4, 0x98, 0x68, 0x9d, 0x7e, 0x75,
-    0x72, 0x6e, 0x5c, 0x78, 0x83, 0x80, 0x75, 0x67, 0x89, 0x8c, 0x70, 0x6f,
-    0x5c, 0x7b, 0x4e, 0x6d, 0x86, 0x74, 0x54, 0x82, 0x7f, 0x7d, 0xaf, 0x6c,
-    0x7b, 0x73, 0x6f, 0x8a, 0x76, 0x82, 0x7a, 0x89, 0x61, 0x8c, 0x7f, 0x7b,
-    0x74, 0x9d, 0x7a, 0x83, 0xce, 0x9d, 0x97, 0x76, 0x70, 0x7c, 0x72, 0x8b,
-    0x80, 0x50, 0x83, 0x8f, 0x87, 0x5a, 0xb0, 0x6f, 0x61, 0xb9, 0x89, 0x8b,
-    0x52, 0x5e, 0xb5, 0x7a, 0x91, 0xb9, 0x80, 0x73, 0x7c, 0xb1, 0x90, 0x64,
-    0x63, 0x64, 0x75, 0x93, 0x70, 0x8e, 0x96, 0x67, 0x74, 0x6b, 0xb6, 0x5e,
-    0x75, 0x7c, 0x6f, 0x4e, 0x94, 0x60, 0x7a, 0x8b, 0x74, 0x7a, 0x95, 0x7f,
-    0xa5, 0x82, 0x87, 0x6c, 0xd3, 0x85, 0x88, 0x55, 0x92, 0x83, 0x34, 0x7d,
-    0x75, 0x6a, 0x7a, 0x98, 0x83, 0x5e, 0x67, 0x73, 0x9a, 0x73, 0x9f, 0x73,
-    0x4d, 0x72, 0x71, 0x8f, 0x99, 0x77, 0x79, 0x6e, 0x9b, 0xa1, 0x87, 0x5a,
-    0x8d, 0xaa, 0x60, 0x7c, 0x4c, 0x4c, 0x63, 0x71, 0x8b, 0x90, 0xb1, 0x72,
-    0x8e, 0x6e, 0x63, 0x58, 0x76, 0x45, 0x76, 0x85, 0x5f, 0x88, 0x67, 0x63,
-    0x85, 0x5a, 0x74, 0x82, 0xcf, 0x93, 0x87, 0x7d, 0x70, 0x87, 0x72, 0x7e,
-    0x82, 0x54, 0x6f, 0x87, 0x7f, 0x55, 0x88, 0x75, 0x5a, 0x80, 0x8e, 0x5f,
-    0x76, 0x75, 0x76, 0x76, 0x76, 0x6f, 0x74, 0x73, 0x6f, 0x76, 0x75, 0x75,
-    0x7c, 0x6c, 0x75, 0x71, 0x69, 0x7a, 0x6a, 0x6f, 0x74, 0x73, 0x69, 0x74,
-    0x72, 0x74, 0x75, 0x75, 0x6d, 0x78, 0x6f, 0x70, 0x72, 0x76, 0x6c, 0x71,
-    0x71, 0x78, 0x6e, 0x73, 0x72, 0x72, 0x74, 0x6e, 0x72, 0x6e, 0x74, 0x74,
-    0x6c, 0x70, 0x74, 0x73, 0x70, 0x71, 0x77, 0x74, 0x6c, 0x6d, 0x79, 0x79,
-    0x64, 0x72, 0x73, 0x68, 0x56, 0x75, 0x71, 0x74, 0x7c, 0x74, 0x6d, 0x62,
-    0x61, 0x64, 0x7c, 0x71, 0x68, 0x7a, 0x83, 0x7f, 0x81, 0x77, 0x71, 0x6b,
-    0x73, 0x72, 0x6e, 0x75, 0x79, 0x6e, 0x7c, 0x69, 0x63, 0x73, 0x77, 0x80,
-    0x73, 0x75, 0x72, 0x63, 0x45, 0x7e, 0x7f, 0x72, 0x75, 0x78, 0x6e, 0x73,
-    0x58, 0x69, 0x67, 0x7d, 0x6a, 0x8b, 0x77, 0x71, 0x74, 0x7a, 0x6e, 0x5b,
-    0x74, 0x6d, 0x69, 0x8d, 0x6e, 0x5f, 0x75, 0x71, 0x54, 0x68, 0x48, 0x67,
-    0x53, 0x78, 0x77, 0x77, 0x76, 0x77, 0x7a, 0x79, 0x77, 0x6c, 0x73, 0x4b,
-    0x78, 0x76, 0x7a, 0x75, 0x7e, 0x84, 0x6d, 0x7e, 0x67, 0x82, 0x80, 0x77,
-    0x6e, 0x80, 0x7d, 0x76, 0x99, 0x6e, 0x76, 0x6e, 0x49, 0x72, 0x7e, 0x5f,
-    0x71, 0x72, 0x75, 0x7b, 0x78, 0x61, 0x75, 0x6b, 0x6d, 0x88, 0x6f, 0x67,
-    0x82, 0x72, 0xa5, 0x74, 0x96, 0x7d, 0x7c, 0x80, 0x82, 0x71, 0x8a, 0x5f,
-    0x74, 0x5d, 0x70, 0x86, 0x6f, 0x6b, 0x60, 0x71, 0x64, 0x82, 0xaf, 0x74,
-    0x56, 0x8d, 0x65, 0x67, 0x7a, 0x70, 0x68, 0x9e, 0x81, 0x7d, 0x8e, 0x63,
-    0x8b, 0x7d, 0xa2, 0x75, 0xbe, 0x5b, 0x87, 0x55, 0x0e, 0x7a, 0x72, 0x84,
-    0x58, 0x83, 0x79, 0x94, 0x7b, 0x5e, 0x87, 0x7d, 0x4e, 0xd9, 0x74, 0x7b,
-    0x75, 0x88, 0x97, 0x80, 0x88, 0x88, 0x85, 0x61, 0x82, 0x99, 0x84, 0x63,
-    0x7b, 0x74, 0x47, 0x6a, 0x7f, 0x67, 0x44, 0x75, 0x8e, 0x8c, 0xbe, 0x67,
-    0x7d, 0x9b, 0x72, 0x3b, 0x86, 0x67, 0x80, 0xad, 0x7c, 0x97, 0xa2, 0x8b,
-    0x93, 0x91, 0x7f, 0x7e, 0xc9, 0x93, 0x89, 0x69, 0x66, 0x7c, 0x2f, 0x75,
-    0x74, 0x4b, 0x75, 0x84, 0x7a, 0x59, 0xab, 0x8a, 0x50, 0xd4, 0x7e, 0x77,
-    0x6b, 0x92, 0x86, 0x80, 0x82, 0x89, 0x6d, 0x81, 0x75, 0xac, 0x80, 0x6c,
-    0x55, 0x94, 0x46, 0x92, 0x98, 0x7e, 0x7d, 0x78, 0x6c, 0xa1, 0xa2, 0x68,
-    0x96, 0x76, 0x8d, 0x84, 0x80, 0x5e, 0x7d, 0xa3, 0xa4, 0x92, 0x3c, 0xab,
-    0xb0, 0x82, 0x86, 0x71, 0xd3, 0x98, 0x85, 0x6d, 0x73, 0x78, 0x73, 0x5e,
-    0x5c, 0x5d, 0x6b, 0x75, 0x84, 0x63, 0x7e, 0x8c, 0x5a, 0xda, 0x66, 0x5f,
-    0x85, 0x7b, 0x9c, 0x71, 0x6f, 0x9e, 0x42, 0x4e, 0x7e, 0x8a, 0x93, 0x2a,
-    0x83, 0x9b, 0x40, 0x34, 0x81, 0x38, 0x86, 0xb6, 0x84, 0x9a, 0xa5, 0x92,
-    0xa0, 0x51, 0x5f, 0x77, 0x5e, 0x34, 0x92, 0x4e, 0x2a, 0x7e, 0xa8, 0xa8,
-    0x92, 0x7e, 0x65, 0x7b, 0x81, 0x93, 0xa4, 0x39, 0x5b, 0x72, 0xab, 0x83,
-    0x52, 0x7f, 0x42, 0x81, 0x65, 0xa3, 0x7e, 0x79, 0x2d, 0x29, 0x96, 0x62,
-    0x74, 0x64, 0x79, 0x83, 0x77, 0x70, 0x72, 0x6b, 0x71, 0x75, 0x7c, 0x81,
-    0x86, 0x7c, 0x70, 0x78, 0x74, 0x79, 0x79, 0x7d, 0x7a, 0x63, 0x7f, 0x7b,
-    0x80, 0x7b, 0x7b, 0x61, 0x7b, 0x6f, 0x74, 0x7c, 0x77, 0x7a, 0x6c, 0x77,
-    0x75, 0x7f, 0x72, 0x7a, 0x88, 0x7a, 0x76, 0x72, 0x80, 0x77, 0x75, 0x86,
-    0x70, 0x79, 0x71, 0x70, 0x82, 0x7c, 0x6a, 0x76, 0x57, 0x83, 0x80, 0x80,
-    0x73, 0x70, 0x70, 0x7a, 0x74, 0x74, 0x7a, 0x73, 0x69, 0x6f, 0x68, 0x76,
-    0x74, 0x7a, 0x75, 0x87, 0x76, 0x70, 0x26, 0x69, 0x2e, 0x7b, 0x69, 0x76,
-    0x58, 0x71, 0x74, 0x7a, 0x73, 0x76, 0x6d, 0x7d, 0x79, 0x71, 0x66, 0x77,
-    0x69, 0x76, 0x72, 0x7d, 0x83, 0x6d, 0x6d, 0x76, 0x82, 0x6f, 0x74, 0x6b,
-    0x77, 0x73, 0x7a, 0x70, 0x72, 0x71, 0x71, 0x73, 0x75, 0x7e, 0x67, 0x78,
-    0x71, 0x80, 0x78, 0x74, 0x7b, 0x77, 0x54, 0x5e, 0x77, 0x72, 0x7b, 0x6a,
-    0x7e, 0x7a, 0x70, 0x42, 0x6c, 0x64, 0x64, 0x7c, 0x3d, 0x73, 0x7a, 0x78,
-    0x78, 0x67, 0x6b, 0x6d, 0x60, 0x6c, 0x80, 0x69, 0x5b, 0x77, 0x7b, 0x68,
-    0x78, 0x76, 0x6e, 0x82, 0x71, 0x7b, 0x7c, 0x75, 0x70, 0x7a, 0x7c, 0x76,
-    0x74, 0x7b, 0x61, 0x7c, 0x6f, 0x7a, 0x7a, 0x80, 0x6f, 0x56, 0x78, 0x52,
-    0x76, 0x78, 0x7c, 0x7c, 0x75, 0x7d, 0x78, 0x75, 0x72, 0x77, 0x64, 0x68,
-    0x74, 0x7e, 0x68, 0x78, 0x79, 0x74, 0x76, 0x6e, 0x77, 0x77, 0x7c, 0x52,
-    0x73, 0x7b, 0x7a, 0x71, 0x68, 0x7a, 0x74, 0x77, 0x75, 0x73, 0x79, 0x65,
-    0x6e, 0x6b, 0x73, 0x74, 0x86, 0x72, 0x7b, 0x6e, 0x7a, 0x6d, 0x65, 0x79,
-    0x78, 0x6a, 0x75, 0x74, 0x74, 0x75, 0x66, 0x75, 0x71, 0x7d, 0x77, 0x7d,
-    0x78, 0x76, 0x71, 0x76, 0x6e, 0x79, 0x70, 0x79, 0x72, 0x72, 0x72, 0x75,
-    0x71, 0x75, 0x77, 0x75, 0x6f, 0x76, 0x6c, 0x72, 0x71, 0x6e, 0x70, 0x72,
-    0x75, 0x73, 0x73, 0x76, 0x6a, 0x76, 0x72, 0x70, 0x71, 0x70, 0x78, 0x74,
-    0x70, 0x7a, 0x67, 0x75, 0x79, 0x67, 0x71, 0x71, 0x70, 0x74, 0x74, 0x75,
-    0x74, 0x70, 0x74, 0x6c, 0x70, 0x7c, 0x73, 0x77, 0x66, 0x6b, 0x6d, 0x74,
-    0x7a, 0x89, 0x6a, 0x86, 0x96, 0x43, 0x88, 0x71, 0x5b, 0x96, 0x8f, 0x77,
-    0x81, 0x6f, 0x7d, 0xa2, 0x79, 0x6c, 0x63, 0x6f, 0x6b, 0x75, 0x70, 0x7c,
-    0x78, 0x76, 0x70, 0x6c, 0x7e, 0x48, 0x5f, 0x96, 0x8f, 0x77, 0x57, 0x57,
-    0x5f, 0x9d, 0x94, 0x82, 0xc6, 0x8f, 0x6f, 0x7c, 0xbb, 0x81, 0x5f, 0x54,
-    0x6c, 0x59, 0x85, 0x89, 0x8d, 0x60, 0x57, 0x76, 0x97, 0x9e, 0x56, 0x8e,
-    0x7a, 0x7b, 0x72, 0x7e, 0x74, 0x79, 0x79, 0x73, 0x55, 0x75, 0x69, 0x75,
-    0x6f, 0x6c, 0x58, 0x77, 0x79, 0x79, 0x76, 0x74, 0x6c, 0x6e, 0x73, 0x5a,
-    0x6e, 0x78, 0x78, 0x67, 0x72, 0x75, 0x76, 0x70, 0x72, 0x78, 0x7a, 0x78,
-    0x73, 0x72, 0x6f, 0x6c, 0x85, 0x75, 0x72, 0x78, 0x5d, 0x74, 0x5f, 0x7b,
-    0x74, 0x71, 0x6f, 0x6e, 0x71, 0x6d, 0x5f, 0x7a, 0x7a, 0x7d, 0x77, 0x70,
-    0x59, 0x7f, 0x72, 0x77, 0x7d, 0x7d, 0x85, 0x71, 0x76, 0x81, 0x80, 0x64,
-    0x79, 0x99, 0x66, 0x77, 0x67, 0x7f, 0x8e, 0x71, 0x6d, 0x6a, 0xae, 0x7a,
-    0x70, 0x80, 0x7f, 0x8a, 0x7f, 0x58, 0x7f, 0x99, 0x78, 0xa4, 0x91, 0x75,
-    0x92, 0xa9, 0x81, 0x77, 0xc9, 0x95, 0x86, 0x73, 0x79, 0x7a, 0x72, 0x7c,
-    0x76, 0x79, 0x6f, 0x72, 0x8f, 0x59, 0xb2, 0x61, 0x81, 0xa9, 0x9a, 0x87,
-    0x78, 0x99, 0x7d, 0x73, 0x7a, 0x81, 0x71, 0x66, 0x99, 0x93, 0x87, 0x4b,
-    0x8e, 0x67, 0x54, 0x87, 0x4c, 0x7a, 0x91, 0x92, 0x92, 0x98, 0x88, 0x7b,
-    0x71, 0xbd, 0x57, 0x42, 0x7d, 0x4b, 0x8a, 0x9d, 0x90, 0x80, 0x9b, 0x5f,
-    0x94, 0xa2, 0x81, 0x74, 0xc8, 0x74, 0x75, 0x51, 0x6e, 0x8e, 0x72, 0x55,
-    0x7b, 0x47, 0x78, 0x76, 0x83, 0x61, 0x9e, 0x7d, 0x6d, 0xd9, 0x99, 0x70,
-    0x71, 0x7d, 0x76, 0x77, 0x87, 0x77, 0x4d, 0x56, 0x74, 0x6c, 0x79, 0x6a,
-    0x84, 0x7d, 0x71, 0x4a, 0x69, 0x5a, 0x66, 0x7e, 0x54, 0x6b, 0x7a, 0x7a,
-    0x77, 0x67, 0x61, 0x6a, 0x62, 0x6f, 0x84, 0x5b, 0x61, 0x7b, 0x7b, 0x79,
-    0x81, 0x77, 0x57, 0x82, 0x74, 0x7c, 0x7e, 0x70, 0x71, 0x84, 0x7b, 0x7c,
-    0x78, 0x7a, 0x5d, 0x83, 0x69, 0x78, 0x7d, 0x80, 0x66, 0x5a, 0x74, 0x51,
-    0x8e, 0x85, 0x9a, 0x7f, 0x70, 0x70, 0x80, 0x6c, 0x73, 0x74, 0x83, 0x78,
-    0x7f, 0x8d, 0x6d, 0x92, 0x79, 0x83, 0x57, 0x63, 0x5a, 0x53, 0xb6, 0x5f,
-    0x5c, 0x97, 0x89, 0x84, 0x76, 0x76, 0x68, 0x7b, 0x86, 0x82, 0x74, 0x45,
-    0x83, 0x81, 0x9f, 0x85, 0xc9, 0x93, 0x8a, 0x74, 0x6d, 0x79, 0x5a, 0x67,
-    0x6a, 0x9b, 0x7e, 0x99, 0x7d, 0x60, 0x7c, 0x7d, 0x50, 0xe0, 0x57, 0x94,
-    0x77, 0x74, 0x76, 0x77, 0x74, 0x70, 0x70, 0x71, 0x78, 0x6f, 0x74, 0x6e,
-    0x79, 0x79, 0x77, 0x78, 0x5d, 0x7b, 0x7e, 0x71, 0x75, 0x77, 0x73, 0x71,
-    0x69, 0x83, 0x79, 0x6e, 0x77, 0x70, 0x71, 0x72, 0x71, 0x77, 0x79, 0x73,
-    0x7c, 0x77, 0x78, 0x73, 0x7a, 0x76, 0x73, 0x77, 0x6f, 0x6e, 0x83, 0x6f,
-    0x78, 0x76, 0x77, 0x7d, 0x77, 0x75, 0x73, 0x73, 0x6f, 0x78, 0x7d, 0x73,
-    0x8b, 0x88, 0x8d, 0x57, 0x76, 0x7b, 0x4c, 0x8e, 0x6c, 0x67, 0x72, 0x56,
-    0x7d, 0x6d, 0x9c, 0x66, 0x3b, 0x7b, 0x8d, 0x5a, 0x9e, 0x8c, 0x62, 0x6c,
-    0x5e, 0x74, 0x7b, 0x49, 0x96, 0x55, 0x68, 0x72, 0x79, 0x88, 0x63, 0x7c,
-    0x9f, 0x85, 0x6e, 0x42, 0x81, 0x81, 0x86, 0x96, 0x63, 0x70, 0x88, 0x67,
-    0x2d, 0x88, 0x5c, 0x71, 0x58, 0x91, 0x6c, 0x4c, 0x4c, 0x78, 0x67, 0x68,
-    0x74, 0x71, 0x5a, 0x7d, 0x80, 0x71, 0x6d, 0x67, 0x57, 0x64, 0x74, 0x6b,
-    0x75, 0x76, 0x7d, 0x75, 0x79, 0x6e, 0x78, 0x6d, 0x7e, 0x78, 0x61, 0x67,
-    0x84, 0x72, 0x84, 0x76, 0x63, 0x6b, 0x71, 0x6e, 0x6c, 0x7d, 0x7b, 0x73,
-    0x80, 0x82, 0x7f, 0x71, 0x99, 0x6b, 0x77, 0x78, 0x78, 0x70, 0x80, 0x60,
-    0x6b, 0x72, 0x7a, 0x6f, 0x7b, 0x72, 0x7b, 0x70, 0x7e, 0x84, 0x63, 0x7a,
-    0x70, 0x70, 0x61, 0x7c, 0x78, 0x7c, 0x79, 0x71, 0x5d, 0x60, 0x7c, 0x76,
-    0x78, 0x69, 0x76, 0x6f, 0x7c, 0x7a, 0x73, 0x6f, 0x6c, 0x6e, 0x59, 0x6a,
-    0x77, 0x59, 0x74, 0x70, 0x81, 0x7c, 0x73, 0x79, 0x74, 0x65, 0x6e, 0x7a,
-    0x83, 0x6c, 0x75, 0x81, 0x88, 0x78, 0x7a, 0x74, 0x7d, 0x72, 0x57, 0x7c,
-    0x69, 0x63, 0x71, 0x78, 0x66, 0x7d, 0x6d, 0x71, 0x77, 0x6e, 0x75, 0x73,
-    0x9d, 0x46, 0x4f, 0xd1, 0x55, 0x33, 0xaf, 0x92, 0x52, 0x4b, 0x62, 0xbd,
-    0x3e, 0x71, 0x92, 0x95, 0xc4, 0x89, 0x2f, 0x5c, 0x3c, 0x5d, 0x67, 0x44,
-    0x4d, 0xa0, 0x97, 0xab, 0x67, 0x99, 0x53, 0x98, 0xe2, 0x49, 0x4b, 0x48,
-    0x2d, 0x5b, 0x9f, 0x4b, 0xb1, 0x5b, 0x38, 0xac, 0xc3, 0x4b, 0x65, 0x31,
-    0xa6, 0x1b, 0x70, 0x37, 0x78, 0x44, 0x1c, 0x8a, 0x8b, 0xb6, 0x20, 0xa7,
-    0x4f, 0x7a, 0x84, 0x76, 0x6c, 0x72, 0x67, 0x75, 0x7f, 0x84, 0x7b, 0x7a,
-    0x7a, 0x63, 0x7a, 0x76, 0x5c, 0x72, 0x6e, 0x76, 0x77, 0x7e, 0x7d, 0x82,
-    0x61, 0x6b, 0x67, 0x77, 0x64, 0x7b, 0x70, 0x7a, 0x74, 0x91, 0x8a, 0x87,
-    0x64, 0x80, 0x69, 0x73, 0x87, 0x6e, 0x7a, 0x6e, 0x7d, 0x7a, 0x6c, 0x69,
-    0x7d, 0x7f, 0x6c, 0x5c, 0x7d, 0x67, 0x74, 0x87, 0x78, 0x7d, 0x78, 0x6f,
-    0x6b, 0x83, 0x3d, 0x71, 0x71, 0x80, 0x76, 0x76, 0x78, 0x76, 0x7b, 0x6a,
-    0x5f, 0x6f, 0x76, 0x79, 0x70, 0x7b, 0x78, 0x76, 0x7d, 0x79, 0x7c, 0x7b,
-    0x6f, 0x74, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x87, 0x75, 0x64, 0x5a, 0x7d,
-    0x74, 0x66, 0x69, 0x7c, 0x86, 0x75, 0x75, 0x6d, 0x61, 0x7a, 0x74, 0x77,
-    0x6e, 0x78, 0x78, 0x75, 0x79, 0x76, 0x50, 0x7b, 0x6e, 0x79, 0x73, 0x7e,
-    0x71, 0x65, 0x68, 0x7b, 0x84, 0x7c, 0x76, 0x6c, 0x7a, 0x73, 0x7d, 0x66,
-    0x74, 0x78, 0x7c, 0x72, 0x6f, 0x66, 0x71, 0x8a, 0x81, 0x7b, 0x9b, 0x46,
-    0x79, 0x7e, 0x68, 0x71, 0x73, 0x6f, 0x7d, 0x95, 0x80, 0x8e, 0x67, 0x6b,
-    0x7e, 0x79, 0x88, 0x89, 0xc0, 0x89, 0x6f, 0x64, 0x8c, 0x7b, 0x81, 0x76,
-    0x79, 0x81, 0x85, 0x76, 0x7e, 0x49, 0x8e, 0x65, 0x7a, 0xc4, 0x73, 0x5a,
-    0x74, 0x74, 0x75, 0x73, 0x74, 0x73, 0x71, 0x75, 0x74, 0x73, 0x72, 0x76,
-    0x76, 0x73, 0x71, 0x74, 0x6f, 0x72, 0x71, 0x71, 0x73, 0x73, 0x6f, 0x74,
-    0x75, 0x75, 0x72, 0x7a, 0x70, 0x75, 0x70, 0x72, 0x71, 0x72, 0x72, 0x71,
-    0x70, 0x75, 0x73, 0x72, 0x78, 0x70, 0x71, 0x78, 0x74, 0x71, 0x78, 0x73,
-    0x72, 0x70, 0x74, 0x72, 0x71, 0x7a, 0x75, 0x72, 0x70, 0x71, 0x6f, 0x73,
-    0x86, 0x8a, 0x6f, 0x90, 0x86, 0x7a, 0x88, 0x6d, 0x5f, 0x74, 0x69, 0x79,
-    0xb0, 0x70, 0x97, 0x61, 0x83, 0x72, 0x67, 0x5d, 0x8e, 0x6e, 0x5e, 0x58,
-    0x8a, 0x6f, 0x85, 0x5e, 0x84, 0x6f, 0x6d, 0x7b, 0x73, 0x8b, 0x72, 0x6b,
-    0x51, 0x87, 0x86, 0x7b, 0x9e, 0x60, 0x7b, 0x71, 0x5e, 0x73, 0x90, 0x66,
-    0x6f, 0x87, 0x7c, 0x5d, 0x67, 0x59, 0x5c, 0x76, 0x78, 0x92, 0x89, 0x82,
-    0x6b, 0x70, 0x7c, 0x6d, 0x85, 0x7a, 0x68, 0x76, 0x7d, 0x75, 0x7a, 0x71,
-    0x78, 0x83, 0x2f, 0x7f, 0x75, 0x6f, 0x5d, 0x72, 0x6e, 0x70, 0x6e, 0x73,
-    0x72, 0x64, 0x69, 0x78, 0x76, 0x7b, 0x6e, 0x71, 0x92, 0x75, 0x55, 0x67,
-    0x75, 0x71, 0x72, 0x7c, 0x3e, 0x67, 0x50, 0x72, 0x80, 0x77, 0x6b, 0x75,
-    0x61, 0x71, 0x66, 0x7a, 0x52, 0x8a, 0x79, 0x78, 0x74, 0x72, 0x75, 0x83,
-    0x60, 0x5d, 0xb3, 0x7f, 0x9a, 0x83, 0x70, 0x7b, 0x92, 0xad, 0x8f, 0x62,
-    0x5e, 0x64, 0x6f, 0x86, 0x5a, 0x63, 0x58, 0x6b, 0x84, 0x7a, 0xcc, 0x8d,
-    0x65, 0x78, 0x80, 0x4f, 0x8a, 0x55, 0x73, 0x90, 0x8b, 0x7d, 0x88, 0x8a,
-    0xb4, 0x7c, 0x71, 0x73, 0xcf, 0x81, 0x97, 0x41, 0x72, 0x72, 0x6a, 0x75,
-    0x9b, 0xad, 0x78, 0x7b, 0x93, 0x5a, 0xac, 0x6e, 0x5b, 0x73, 0xa4, 0x8b,
-    0x79, 0x84, 0x62, 0x7b, 0x7a, 0x81, 0x88, 0x7c, 0x86, 0x9f, 0x8d, 0x72,
-    0x88, 0x6f, 0x76, 0x89, 0x87, 0x68, 0x7c, 0x83, 0x8a, 0x73, 0xa2, 0x5b,
-    0x8c, 0x81, 0x88, 0x50, 0x74, 0x77, 0x88, 0x96, 0x89, 0x80, 0x6f, 0x80,
-    0x8c, 0x8e, 0x89, 0x8e, 0xb5, 0x7b, 0x73, 0x84, 0x83, 0x62, 0x59, 0x7a,
-    0x6b, 0x71, 0x78, 0x83, 0x7e, 0x54, 0x77, 0x74, 0x84, 0xd0, 0x8d, 0x59,
-    0x7b, 0x80, 0x73, 0x76, 0xa4, 0x8b, 0x84, 0x89, 0x51, 0x91, 0x97, 0x7c,
-    0x6f, 0x71, 0x81, 0x94, 0xa2, 0x70, 0x59, 0x79, 0x7c, 0x8d, 0x8d, 0x50,
-    0x8d, 0x87, 0x7f, 0x4a, 0x7a, 0x72, 0x8e, 0x98, 0x79, 0x63, 0x60, 0x7c,
-    0x87, 0x4b, 0x72, 0x75, 0xc6, 0x79, 0x79, 0x84, 0x50, 0x6b, 0x62, 0x6a,
-    0x65, 0x5c, 0x66, 0x76, 0x85, 0x55, 0x60, 0x6c, 0x6e, 0xcf, 0x88, 0x67,
-    0x7a, 0x80, 0x77, 0x79, 0x81, 0x53, 0x86, 0x85, 0x88, 0x6c, 0x9b, 0x85,
-    0x67, 0x63, 0x96, 0x8f, 0x82, 0xa2, 0x5b, 0x6d, 0x5e, 0x8e, 0xbc, 0x64,
-    0x5e, 0x96, 0x86, 0x73, 0x6c, 0x54, 0x78, 0x9a, 0x8a, 0x60, 0x61, 0x63,
-    0x66, 0x5d, 0x73, 0x78, 0xc5, 0x84, 0x6a, 0x8b, 0x71, 0x64, 0x72, 0x68,
-    0x8e, 0x5f, 0x6e, 0x75, 0x82, 0x5c, 0x9d, 0x88, 0x86, 0x79, 0x68, 0x91,
-    0x69, 0x90, 0x86, 0x7e, 0x96, 0x98, 0x7f, 0x74, 0x83, 0x90, 0x85, 0x82,
-    0x85, 0x92, 0x5e, 0x8c, 0x76, 0x6e, 0x79, 0x68, 0x55, 0x73, 0xa2, 0x56,
-    0x6e, 0x96, 0xa3, 0x5d, 0x6b, 0x5c, 0x81, 0x87, 0x6a, 0x72, 0x7a, 0x5f,
-    0x93, 0x8c, 0x8b, 0x97, 0xce, 0x7b, 0x9d, 0x8d, 0x70, 0x75, 0x65, 0x90,
-    0x87, 0x59, 0x6d, 0x8c, 0x7a, 0x56, 0x6f, 0x73, 0x4d, 0x71, 0x86, 0x63,
-    0x73, 0x74, 0x72, 0x76, 0x6d, 0x72, 0x74, 0x77, 0x73, 0x71, 0x72, 0x75,
-    0x70, 0x72, 0x74, 0x73, 0x72, 0x70, 0x6f, 0x71, 0x72, 0x71, 0x6d, 0x6f,
-    0x76, 0x73, 0x6f, 0x72, 0x72, 0x76, 0x72, 0x70, 0x71, 0x74, 0x72, 0x76,
-    0x70, 0x75, 0x72, 0x74, 0x79, 0x70, 0x6f, 0x74, 0x71, 0x74, 0x75, 0x71,
-    0x73, 0x6c, 0x72, 0x6f, 0x73, 0x7b, 0x6b, 0x73, 0x71, 0x67, 0x6b, 0x73,
-    0x71, 0x7a, 0x53, 0x78, 0x76, 0x71, 0x70, 0x73, 0x7d, 0x7a, 0x82, 0x6d,
-    0x55, 0x76, 0x74, 0x65, 0x7a, 0x73, 0x7c, 0x6d, 0x75, 0x75, 0x7c, 0x74,
-    0x71, 0x75, 0x74, 0x77, 0x74, 0x70, 0x77, 0x7e, 0x79, 0x66, 0x7b, 0x6f,
-    0x73, 0x52, 0x79, 0x71, 0x80, 0x76, 0x70, 0x74, 0x51, 0x6c, 0x62, 0x80,
-    0x74, 0x6e, 0x79, 0x76, 0x6f, 0x66, 0x43, 0x72, 0x6c, 0x5c, 0x5f, 0x75,
-    0x7c, 0x87, 0x5c, 0x78, 0x89, 0x69, 0x69, 0x6f, 0x63, 0xa7, 0x82, 0x78,
-    0x73, 0x71, 0x7e, 0x81, 0x6b, 0x7c, 0x69, 0x73, 0x77, 0x75, 0x96, 0x3d,
-    0x76, 0x73, 0x6e, 0x83, 0x81, 0x74, 0x80, 0x7f, 0x8d, 0x77, 0x73, 0x78,
-    0x98, 0x76, 0x6c, 0x76, 0xb8, 0x7a, 0x76, 0x6e, 0x74, 0x73, 0x90, 0x84,
-    0x77, 0x72, 0x7b, 0x87, 0x98, 0x4d, 0x6d, 0x75, 0x5e, 0xcf, 0x81, 0x60,
-    0x79, 0x5e, 0x7f, 0x77, 0x75, 0x65, 0x73, 0x76, 0x70, 0x78, 0x75, 0x76,
-    0x60, 0x73, 0x77, 0x75, 0x6d, 0x73, 0x77, 0x75, 0x6e, 0x72, 0x79, 0x74,
-    0x73, 0x79, 0x6f, 0x78, 0x70, 0x71, 0x75, 0x73, 0x6f, 0x7c, 0x80, 0x79,
-    0x6f, 0x7e, 0x69, 0x6b, 0x84, 0x79, 0x6d, 0x76, 0x79, 0x6b, 0x80, 0x73,
-    0x7a, 0x76, 0x74, 0x7a, 0x77, 0x64, 0x7b, 0x6c, 0x78, 0x77, 0x70, 0x72,
-    0x7c, 0x7c, 0xa4, 0x82, 0x81, 0x7b, 0x67, 0x76, 0x92, 0x73, 0x7c, 0x57,
-    0x82, 0x62, 0x6f, 0x83, 0x7a, 0x85, 0x8a, 0x70, 0x85, 0x75, 0xbc, 0x67,
-    0x8b, 0x8a, 0x6d, 0x63, 0x73, 0x55, 0x6b, 0xaf, 0x87, 0x72, 0x79, 0x80,
-    0x85, 0x98, 0x91, 0x73, 0xce, 0x87, 0x7f, 0x50, 0x84, 0x94, 0x62, 0xb3,
-    0x7c, 0x89, 0x6e, 0x76, 0xac, 0x57, 0x90, 0x93, 0x8a, 0x76, 0x94, 0x8c,
-    0x77, 0x6d, 0x73, 0x7d, 0x6c, 0x72, 0x78, 0x66, 0x71, 0x74, 0x78, 0x7a,
-    0x7b, 0x72, 0x6b, 0x6a, 0x6f, 0x72, 0x69, 0x7e, 0x7b, 0x5f, 0x71, 0x73,
-    0x6d, 0x79, 0x7c, 0x62, 0x69, 0x52, 0x73, 0x80, 0x7f, 0x70, 0x77, 0x89,
-    0x51, 0x6f, 0x7d, 0x59, 0x6e, 0x60, 0x6f, 0x7d, 0x74, 0x7f, 0x7f, 0x74,
-    0x72, 0x7c, 0x76, 0x83, 0x71, 0x71, 0x6a, 0x65, 0x63, 0x78, 0x71, 0x78,
-    0x7a, 0x89, 0x6e, 0x79, 0x76, 0x5f, 0x82, 0x7f, 0x8c, 0x99, 0x6f, 0x87,
-    0x79, 0x7b, 0x66, 0x67, 0x7e, 0x89, 0x69, 0x78, 0x86, 0x8b, 0xa5, 0x45,
-    0xad, 0x83, 0x69, 0x7d, 0x7d, 0x75, 0x6e, 0x8e, 0x70, 0x89, 0x8f, 0x8c,
-    0x8c, 0x5f, 0x94, 0x7e, 0xbe, 0x8b, 0x68, 0x4c, 0x72, 0x65, 0x6d, 0x83,
-    0x66, 0x6a, 0x7a, 0x97, 0x83, 0x4c, 0x82, 0x70, 0x91, 0xd7, 0x91, 0x82,
-    0x6e, 0x7d, 0x76, 0x76, 0x72, 0x7c, 0x7a, 0x70, 0x6e, 0x76, 0x72, 0x6e,
-    0x79, 0x6b, 0x5f, 0x76, 0x77, 0x74, 0x7a, 0x71, 0x7d, 0x75, 0x80, 0x44,
-    0x74, 0x74, 0x6d, 0x6a, 0x77, 0x70, 0x77, 0x7c, 0x73, 0x74, 0x66, 0x79,
-    0x62, 0x84, 0x6f, 0x77, 0x8f, 0x6f, 0x75, 0x6e, 0x71, 0x75, 0x67, 0x6a,
-    0x7b, 0x6e, 0x6f, 0x77, 0x79, 0x7c, 0x6a, 0x76, 0x75, 0x7b, 0x6c, 0x71,
-    0x70, 0x6b, 0x68, 0x80, 0x7c, 0x61, 0x74, 0x6e, 0x67, 0x7a, 0x95, 0x59,
-    0x80, 0x87, 0x40, 0x76, 0x68, 0x73, 0x76, 0x7b, 0x81, 0x7c, 0x7a, 0x6d,
-    0x7c, 0x6a, 0x6c, 0x6e, 0x7c, 0x72, 0x74, 0x7e, 0x75, 0x6c, 0x7e, 0x7b,
-    0x71, 0x73, 0x6f, 0x79, 0x92, 0x7e, 0x6f, 0x69, 0x37, 0x7c, 0x77, 0x68,
-    0x6e, 0x71, 0x68, 0x7c, 0x75, 0x51, 0x74, 0x76, 0x72, 0x83, 0x76, 0x77,
-    0x8a, 0x77, 0x3e, 0x91, 0x80, 0x64, 0x91, 0x5e, 0x61, 0x7c, 0x6c, 0x6a,
-    0x68, 0x84, 0x7a, 0x7f, 0x87, 0x64, 0x75, 0x6e, 0x6c, 0x7b, 0x7a, 0x6a,
-    0x87, 0x73, 0x7e, 0x74, 0x7f, 0x76, 0x69, 0x8a, 0x79, 0x7a, 0x94, 0x87,
-    0x5f, 0x96, 0x7a, 0x64, 0xac, 0x58, 0x76, 0x66, 0x67, 0x71, 0x96, 0x6f,
-    0x76, 0x5a, 0x68, 0x5b, 0x84, 0x64, 0x92, 0x82, 0x79, 0xb4, 0x8c, 0x90,
-    0x70, 0x7c, 0x77, 0x72, 0x6a, 0x89, 0x6c, 0x70, 0x72, 0x71, 0x6c, 0x73,
-    0x5f, 0x6f, 0x74, 0x8a, 0x65, 0x81, 0x67, 0x7d, 0x70, 0x58, 0x82, 0x70,
-    0x7b, 0x7a, 0x64, 0x60, 0x70, 0x51, 0x72, 0x6b, 0x76, 0x7f, 0x78, 0x7f,
-    0x68, 0x70, 0x77, 0x6f, 0x58, 0x53, 0x75, 0x67, 0x77, 0x72, 0x6e, 0x74,
-    0x70, 0x7d, 0x77, 0x7b, 0x65, 0x65, 0x71, 0x74, 0x6c, 0x75, 0x74, 0x6c,
-    0x63, 0x7d, 0x80, 0x7e, 0x7e, 0x66, 0x74, 0x8e, 0x94, 0x75, 0x95, 0x78,
-    0x75, 0x8e, 0x57, 0x69, 0x7a, 0x68, 0x59, 0x6e, 0x76, 0x85, 0xab, 0x72,
-    0x9e, 0x7f, 0x66, 0x49, 0x73, 0x79, 0x76, 0x92, 0x7b, 0x9e, 0x85, 0x7b,
-    0x8d, 0x95, 0x7a, 0x6d, 0xd4, 0x81, 0x88, 0x91, 0x72, 0x7d, 0x71, 0x81,
-    0x66, 0xa1, 0x84, 0x9e, 0x76, 0x5f, 0x9c, 0x71, 0x6b, 0x74, 0x87, 0x70,
-    0x5a, 0x5a, 0x78, 0x68, 0x7e, 0x75, 0x72, 0x77, 0x79, 0x8d, 0x7d, 0x89,
-    0x80, 0x60, 0x54, 0x87, 0x6e, 0x7e, 0x7f, 0x82, 0x7a, 0x85, 0x8e, 0x80,
-    0x8b, 0x8f, 0x78, 0x5e, 0x64, 0x83, 0x72, 0x84, 0x73, 0x63, 0x76, 0x90,
-    0x62, 0x7a, 0x75, 0x80, 0x93, 0x76, 0x7d, 0x80, 0x7e, 0x7c, 0x66, 0x83,
-    0x7b, 0x77, 0x6a, 0x6c, 0x84, 0x88, 0x78, 0x72, 0x5f, 0x78, 0x89, 0x89,
-    0x72, 0x6b, 0x6d, 0x7a, 0x5e, 0x57, 0x77, 0x7e, 0x7d, 0x76, 0x94, 0x52,
-    0x67, 0x6c, 0x43, 0x6e, 0x62, 0x70, 0x70, 0x81, 0x8a, 0x75, 0x77, 0x86,
-    0x5b, 0x6d, 0x42, 0x63, 0x6d, 0x68, 0x77, 0x77, 0x66, 0x71, 0x84, 0x75,
-    0x7d, 0x7d, 0x73, 0x6c, 0x9f, 0x7f, 0x6e, 0x59, 0x25, 0x6c, 0x85, 0x65,
-    0x7f, 0x72, 0x6c, 0x85, 0x73, 0x7e, 0x78, 0x66, 0x76, 0x8a, 0x75, 0x60,
-    0x67, 0x85, 0x6b, 0x7a, 0x85, 0x8b, 0x78, 0x7e, 0x68, 0xa4, 0x8e, 0x72,
-    0x98, 0x88, 0x71, 0x8a, 0x87, 0x6d, 0x47, 0x75, 0x61, 0x83, 0xaf, 0x9b,
-    0x95, 0x7f, 0x47, 0x71, 0x81, 0x56, 0x78, 0x7d, 0x89, 0x93, 0x5f, 0x8b,
-    0x91, 0x62, 0x82, 0x81, 0xce, 0x84, 0x5d, 0x3e, 0x70, 0x84, 0x78, 0x8c,
-    0x67, 0x94, 0x73, 0x8b, 0x70, 0x57, 0x85, 0x6f, 0x56, 0xd7, 0x7b, 0x62,
-    0x77, 0x75, 0x80, 0x79, 0x6f, 0x6d, 0x71, 0x70, 0x68, 0x64, 0x55, 0x72,
-    0x78, 0x69, 0x55, 0x79, 0x6f, 0x71, 0x6a, 0x71, 0x6e, 0x7d, 0x71, 0x5c,
-    0x78, 0x78, 0x6b, 0x6f, 0x78, 0x79, 0x71, 0x71, 0x6e, 0x67, 0x77, 0x71,
-    0x78, 0x86, 0x74, 0x6d, 0x85, 0x75, 0x72, 0x71, 0x6d, 0x6e, 0x65, 0x5b,
-    0x79, 0x71, 0x6e, 0x6d, 0x74, 0x70, 0x7b, 0x73, 0x79, 0x7d, 0x6a, 0x71,
-    0x68, 0x59, 0x80, 0x72, 0x82, 0x56, 0x89, 0x86, 0x58, 0x5a, 0x6d, 0x68,
-    0x5d, 0x40, 0x8b, 0x95, 0x89, 0x9d, 0x4c, 0x5b, 0x6e, 0x7c, 0x5a, 0x77,
-    0x4c, 0x9c, 0x95, 0x83, 0x9b, 0xa2, 0x4e, 0x82, 0x90, 0x71, 0x26, 0x7b,
-    0x51, 0x56, 0x84, 0x49, 0x88, 0x51, 0x57, 0x9c, 0x90, 0x59, 0x6e, 0x69,
-    0x7b, 0x72, 0x85, 0x71, 0x92, 0x67, 0x52, 0x7b, 0x94, 0xaf, 0x0e, 0x98,
-    0xb8, 0x54, 0x8b, 0x76, 0x53, 0x41, 0x8a, 0x89, 0x68, 0x68, 0x61, 0xcb,
-    0x3d, 0x5c, 0xd6, 0x93, 0xe4, 0x93, 0x45, 0x47, 0x66, 0x6a, 0x67, 0x48,
-    0x48, 0x9b, 0xa1, 0xd2, 0x9a, 0x9c, 0x4f, 0xc3, 0xd3, 0x72, 0x47, 0x4f,
-    0x3b, 0x92, 0xaf, 0x58, 0xff, 0x4b, 0x3a, 0xc2, 0xdb, 0x4e, 0x69, 0x41,
-    0x9e, 0x1c, 0x93, 0x48, 0xb0, 0x3f, 0x54, 0xb0, 0xb2, 0xcf, 0x53, 0xc5,
-    0x78, 0x97, 0x81, 0x7a, 0x7f, 0x76, 0x5d, 0x67, 0x76, 0x71, 0x78, 0x5f,
-    0x88, 0x73, 0x51, 0x76, 0x6b, 0x88, 0x56, 0x6e, 0x75, 0x85, 0xa5, 0x51,
-    0x56, 0x7d, 0x66, 0x4d, 0x79, 0x64, 0x7b, 0x93, 0x77, 0x82, 0x81, 0x7b,
-    0x99, 0x74, 0x94, 0x78, 0xc8, 0x7f, 0x91, 0x51, 0x70, 0x83, 0x4d, 0x6a,
-    0x6f, 0x51, 0x7b, 0x80, 0x77, 0x52, 0x90, 0x7f, 0x4e, 0xd6, 0x3e, 0x75,
-    0x7b, 0x83, 0x6c, 0x82, 0x6d, 0x76, 0x70, 0x58, 0x82, 0x79, 0x87, 0x78,
-    0x7c, 0x49, 0x59, 0x4f, 0x7d, 0x3f, 0x84, 0x86, 0x82, 0x70, 0x7c, 0x52,
-    0x80, 0x6b, 0x6b, 0x64, 0x5e, 0x6c, 0x86, 0x5f, 0x00, 0x71, 0x81, 0x7a,
-    0x81, 0x75, 0x80, 0x69, 0x7a, 0x7f, 0x7e, 0x74, 0x37, 0x77, 0x7d, 0x84,
-    0x7d, 0x75, 0x5c, 0x64, 0x6d, 0x8a, 0x71, 0x84, 0x63, 0x6b, 0x7c, 0x56,
-    0x7b, 0x85, 0xa5, 0x76, 0xa1, 0x9c, 0x32, 0x48, 0xa7, 0x9f, 0xb9, 0x5e,
-    0xb0, 0xa0, 0x77, 0x3e, 0x46, 0x7f, 0xa9, 0x97, 0x8a, 0x85, 0xa6, 0xbf,
-    0x86, 0x50, 0x30, 0x5e, 0x4e, 0x6b, 0x9e, 0x2e, 0x39, 0xb4, 0xe4, 0x92,
-    0x5e, 0x81, 0x74, 0x88, 0x75, 0x8b, 0x8d, 0x44, 0x6b, 0x7e, 0xba, 0x9f,
-    0x72, 0x87, 0x4a, 0x85, 0x31, 0x9c, 0x7c, 0x79, 0x55, 0x99, 0xc1, 0x55,
-    0x94, 0x84, 0x94, 0x80, 0x76, 0x7f, 0x75, 0x7e, 0x7d, 0x76, 0x8e, 0x64,
-    0x68, 0x94, 0x6d, 0x6f, 0x83, 0x90, 0x67, 0x7b, 0x6d, 0x79, 0xc8, 0x72,
-    0x5f, 0x78, 0x76, 0x4e, 0x67, 0x60, 0x7f, 0x93, 0xac, 0x74, 0x7a, 0x75,
-    0x83, 0x8d, 0x76, 0x8a, 0xc8, 0x79, 0x85, 0x7d, 0x6a, 0x79, 0xb7, 0x75,
-    0x74, 0x71, 0x81, 0x7b, 0x84, 0x5a, 0x99, 0x6c, 0x6c, 0x7c, 0x80, 0x86,
-    0x7f, 0x84, 0x56, 0x77, 0x8d, 0x74, 0x7f, 0x87, 0x8e, 0x9b, 0x85, 0x77,
-    0x88, 0x7a, 0x75, 0x5b, 0x51, 0x7b, 0x62, 0x6e, 0x80, 0x75, 0xa4, 0x75,
-    0xa6, 0x99, 0x86, 0x3a, 0x7d, 0x77, 0x78, 0x87, 0x70, 0x79, 0x6d, 0x76,
-    0x76, 0x7b, 0x83, 0x65, 0xc0, 0x84, 0x7e, 0x8f, 0x89, 0x66, 0x99, 0x8b,
-    0x79, 0xa5, 0x67, 0x68, 0x78, 0x49, 0x7c, 0x6f, 0x80, 0xd2, 0x88, 0x61,
-    0x62, 0x6b, 0x6c, 0x7f, 0x67, 0x6b, 0x72, 0x6e, 0x7c, 0x85, 0x7f, 0x6e,
-    0x6b, 0x70, 0x7c, 0x6c, 0x61, 0x6d, 0x6d, 0x65, 0x8d, 0x86, 0x71, 0x80,
-    0x66, 0x63, 0x82, 0x7c, 0x60, 0x6d, 0x7a, 0x7a, 0x67, 0x7a, 0x83, 0x87,
-    0x7f, 0x77, 0x70, 0x69, 0x83, 0x6d, 0x6f, 0x80, 0x6b, 0x7e, 0x71, 0x61,
-    0x64, 0x77, 0x72, 0x65, 0x6b, 0x6d, 0x8b, 0x79, 0x7b, 0x85, 0x87, 0x64,
-    0x73, 0x58, 0x78, 0x90, 0x7b, 0x6c, 0x77, 0x77, 0x59, 0x6c, 0x6f, 0x75,
-    0x79, 0x74, 0x7b, 0x69, 0x70, 0x6e, 0x81, 0x78, 0x7f, 0x79, 0x6c, 0x5a,
-    0x85, 0x77, 0x6d, 0x6c, 0x6f, 0x86, 0x71, 0x7b, 0x6d, 0x73, 0x81, 0x79,
-    0x6b, 0x8d, 0x76, 0x72, 0xac, 0x67, 0x75, 0x79, 0x86, 0x7e, 0x84, 0x59,
-    0x6f, 0x61, 0x77, 0x60, 0x7f, 0x4e, 0x72, 0x6c, 0x7a, 0x9b, 0x7d, 0x79,
-    0x71, 0x78, 0x41, 0x71, 0x75, 0x7a, 0x6c, 0x76, 0x6c, 0x65, 0x74, 0x72,
-    0x7d, 0x7e, 0x70, 0x6f, 0x78, 0x76, 0x74, 0x6f, 0x75, 0x7d, 0x73, 0x67,
-    0x78, 0x72, 0x74, 0x74, 0x7c, 0x78, 0x71, 0x72, 0x74, 0x5e, 0x6a, 0x70,
-    0x76, 0x4e, 0x75, 0x7b, 0x84, 0x7b, 0x73, 0x6e, 0x7a, 0x72, 0x6a, 0x74,
-    0x6b, 0x6f, 0x73, 0x76, 0x6f, 0x76, 0x61, 0x74, 0x72, 0x77, 0x7d, 0x77,
-    0x94, 0x45, 0x69, 0x9e, 0x52, 0x48, 0xa3, 0x8c, 0x8e, 0x68, 0x88, 0x83,
-    0x64, 0x50, 0xca, 0x96, 0x9e, 0xb4, 0x72, 0x4d, 0x50, 0x37, 0x68, 0x6b,
-    0x51, 0x93, 0x75, 0xac, 0xa0, 0x9c, 0x3f, 0x87, 0xab, 0x51, 0x62, 0x4e,
-    0x60, 0x58, 0xa4, 0x58, 0x8d, 0x67, 0x40, 0x8b, 0x76, 0x43, 0x6d, 0x79,
-    0x7b, 0x51, 0x73, 0x47, 0xa5, 0x58, 0x5c, 0xa1, 0x77, 0xca, 0x56, 0x9f,
-    0x73, 0x6b, 0x76, 0x81, 0x79, 0x5c, 0x6f, 0x79, 0x6f, 0x7c, 0x85, 0x6b,
-    0x77, 0x7b, 0x6a, 0x73, 0x6d, 0x73, 0x71, 0x6b, 0x84, 0x98, 0x80, 0x7c,
-    0x76, 0x6f, 0x6d, 0x67, 0x7a, 0x7d, 0x6f, 0x7e, 0x68, 0x70, 0x7b, 0x6b,
-    0x7d, 0x7f, 0x63, 0x76, 0x93, 0x78, 0x75, 0x63, 0x1c, 0x88, 0x84, 0x72,
-    0x7a, 0x6a, 0x6c, 0x86, 0x7e, 0x5b, 0x7c, 0x6d, 0x7a, 0x8a, 0x73, 0x59,
-    0x7a, 0x85, 0x65, 0x89, 0x7b, 0x6f, 0x6c, 0x74, 0x74, 0x7f, 0x66, 0x74,
-    0x77, 0x66, 0x59, 0x75, 0x79, 0x7a, 0x75, 0x74, 0x64, 0x7d, 0x70, 0x68,
-    0x61, 0x71, 0x6c, 0x8b, 0x7b, 0x5d, 0x71, 0x74, 0x77, 0x7a, 0x78, 0x6b,
-    0x7b, 0x6d, 0x71, 0x7b, 0xa0, 0x7d, 0x7d, 0x71, 0x5e, 0x69, 0x3f, 0x77,
-    0x76, 0x76, 0x79, 0x71, 0x72, 0x6c, 0x78, 0x77, 0x78, 0x90, 0x78, 0x7d,
-    0x72, 0x78, 0x7e, 0x78, 0x73, 0x80, 0x77, 0x73, 0x71, 0x76, 0x67, 0x70,
-    0x74, 0x70, 0x6e, 0x75, 0x76, 0x73, 0x7b, 0x72, 0x76, 0x71, 0x75, 0x4a,
-    0x75, 0x78, 0x72, 0x65, 0x70, 0x70, 0x73, 0x79, 0x6f, 0x74, 0x71, 0x77,
-    0x6f, 0x7d, 0x79, 0x7a, 0x8c, 0x72, 0x7a, 0x6d, 0x70, 0x73, 0x6d, 0x70,
-    0x78, 0x73, 0x73, 0x75, 0x76, 0x7b, 0x6b, 0x78, 0x77, 0x75, 0x80, 0x7b,
-    0x70, 0x75, 0x6f, 0x6f, 0x71, 0x71, 0x73, 0x73, 0x74, 0x71, 0x71, 0x70,
-    0x75, 0x72, 0x73, 0x72, 0x77, 0x72, 0x87, 0x72, 0x75, 0x73, 0x71, 0x6d,
-    0x6d, 0x6a, 0x73, 0x71, 0x74, 0x72, 0x71, 0x6c, 0x6f, 0x71, 0x73, 0x71,
-    0x79, 0x6f, 0x6f, 0x6f, 0x6d, 0x73, 0x70, 0x73, 0x70, 0x71, 0x74, 0x72,
-    0x75, 0x6e, 0x72, 0x6f, 0x6d, 0x73, 0x70, 0x74, 0x74, 0x6e, 0x70, 0x72,
-    0x7c, 0x76, 0x7e, 0x80, 0x6f, 0x78, 0x73, 0x6e, 0x76, 0x76, 0x77, 0x71,
-    0x6e, 0x70, 0x79, 0x77, 0x66, 0x74, 0x75, 0x79, 0x6d, 0x6b, 0x7a, 0x7a,
-    0x76, 0x74, 0x78, 0x79, 0x6a, 0x64, 0x74, 0x6e, 0x73, 0x7d, 0x7e, 0x78,
-    0x72, 0x86, 0x76, 0x68, 0x78, 0x75, 0x75, 0x75, 0x73, 0x72, 0x7a, 0x74,
-    0x7d, 0x76, 0x70, 0x6e, 0x75, 0x5d, 0x7b, 0x70, 0x78, 0x6d, 0x6e, 0x76,
-    0x59, 0x50, 0x83, 0x87, 0x6d, 0x65, 0x6f, 0x80, 0x7e, 0x78, 0x70, 0x85,
-    0x71, 0x4e, 0x50, 0x86, 0x74, 0x81, 0x74, 0x85, 0x78, 0x75, 0x8b, 0x83,
-    0x67, 0x88, 0x77, 0x6f, 0x67, 0x64, 0x79, 0x79, 0x76, 0x6e, 0x7f, 0x89,
-    0x62, 0x63, 0x6b, 0x84, 0x9f, 0x72, 0x70, 0x6d, 0x82, 0x75, 0x80, 0x81,
-    0x75, 0x7a, 0x6c, 0x79, 0x76, 0x7d, 0x80, 0x77, 0x6c, 0x78, 0x87, 0x80,
-    0x70, 0x73, 0x7c, 0x7a, 0x77, 0x77, 0x6f, 0x6c, 0x78, 0x72, 0x7b, 0x76,
-    0x73, 0x74, 0x75, 0x70, 0x5e, 0x72, 0x7a, 0x73, 0x76, 0x76, 0x6d, 0x77,
-    0x6d, 0x7a, 0x76, 0x72, 0x71, 0x7b, 0x71, 0x70, 0x6f, 0x77, 0x74, 0x75,
-    0x76, 0x73, 0x71, 0x72, 0x7e, 0x73, 0x76, 0x6c, 0x7a, 0x75, 0x3d, 0x79,
-    0x72, 0x71, 0x73, 0x78, 0x7a, 0x7a, 0x79, 0x72, 0x78, 0x81, 0x72, 0x73,
-    0x81, 0x6f, 0x6f, 0x68, 0x76, 0x73, 0x80, 0x7d, 0x7c, 0x7a, 0x6c, 0x74,
-    0x76, 0x71, 0x77, 0x6e, 0x72, 0x6c, 0x6a, 0x6b, 0x6c, 0x6b, 0x78, 0x72,
-    0x79, 0x72, 0x71, 0x71, 0x71, 0x5c, 0x6d, 0x69, 0x75, 0x70, 0x82, 0x76,
-    0x71, 0x7a, 0x70, 0x79, 0x7a, 0x7f, 0x70, 0x88, 0x76, 0x77, 0x80, 0x7e,
-    0x7b, 0x72, 0x72, 0x6f, 0x57, 0x75, 0x64, 0x7b, 0x61, 0x83, 0x71, 0x79,
-    0x76, 0x82, 0x4f, 0x7f, 0x76, 0x80, 0x61, 0x75, 0x60, 0x6b, 0x6d, 0x61,
-    0x83, 0x71, 0x84, 0x78, 0x78, 0x71, 0x7c, 0x76, 0x79, 0x5e, 0x6a, 0x61,
-    0x8c, 0x68, 0x76, 0x7c, 0x6b, 0x88, 0x68, 0x7b, 0x6b, 0x8d, 0x6d, 0x52,
-    0x5a, 0x86, 0x78, 0x66, 0xa0, 0x60, 0x63, 0x7c, 0x7f, 0x78, 0x84, 0x66,
-    0x7a, 0x54, 0x7b, 0x6c, 0x5b, 0x69, 0x65, 0x71, 0x75, 0x8b, 0x8b, 0x7d,
-    0x71, 0x6c, 0x70, 0x83, 0x7f, 0x6f, 0x73, 0x6b, 0x64, 0x74, 0x89, 0x35,
-    0x76, 0x7c, 0x5b, 0x74, 0x73, 0x76, 0x73, 0x76, 0x83, 0x83, 0x7b, 0x71,
-    0x7b, 0x6f, 0x6f, 0x61, 0x70, 0x62, 0x7b, 0x80, 0x6c, 0x70, 0x7c, 0x71,
-    0x86, 0x73, 0x66, 0x71, 0x91, 0x74, 0x77, 0x69, 0x33, 0x77, 0x80, 0x6d,
-    0x71, 0x77, 0x6e, 0x76, 0x7c, 0x4a, 0x7b, 0x71, 0x7b, 0x82, 0x75, 0x6a,
-    0x5c, 0x6a, 0x71, 0x89, 0x75, 0x75, 0x70, 0x70, 0x73, 0x6e, 0x70, 0x61,
-    0x81, 0x7f, 0x6f, 0x7b, 0x57, 0x77, 0x71, 0x82, 0x7e, 0x69, 0x85, 0x80,
-    0x70, 0x80, 0x7d, 0x53, 0x77, 0x6d, 0x71, 0x7f, 0x79, 0x84, 0x74, 0x70,
-    0x79, 0x6f, 0x7a, 0x75, 0x8a, 0x79, 0x76, 0x72, 0x82, 0x7b, 0x77, 0x7e,
-    0x77, 0x76, 0x71, 0x78, 0x79, 0x81, 0x75, 0x73, 0x63, 0x85, 0x7d, 0x85,
-    0x79, 0x86, 0x64, 0x7f, 0x78, 0x47, 0x7f, 0x74, 0x71, 0x66, 0x85, 0x6f,
-    0x96, 0x54, 0x68, 0x84, 0x8e, 0x8d, 0x49, 0x6b, 0x7d, 0x49, 0x9b, 0x63,
-    0x68, 0x6e, 0x82, 0x6d, 0x7b, 0x8d, 0x79, 0x9e, 0x87, 0x81, 0x57, 0x4e,
-    0x85, 0x48, 0x76, 0x6c, 0xc0, 0x7b, 0x5e, 0xa3, 0x96, 0x8a, 0x92, 0x83,
-    0x5d, 0x75, 0x6a, 0x86, 0x92, 0x53, 0x57, 0x79, 0x89, 0xce, 0x78, 0x9c,
-    0x67, 0xa7, 0x52, 0x98, 0x94, 0x43, 0x93, 0x90, 0x77, 0x60, 0x6b, 0x6a,
-    0xa1, 0xa6, 0x4c, 0x8f, 0x80, 0x97, 0x5e, 0x6b, 0x85, 0x85, 0x77, 0x83,
-    0xa2, 0x6a, 0x70, 0xb8, 0x68, 0x85, 0x6a, 0x8f, 0x8d, 0x92, 0x6e, 0x7b,
-    0x6d, 0x53, 0x70, 0x6f, 0xc1, 0xa4, 0x69, 0x6c, 0x97, 0x71, 0x97, 0x6d,
-    0x5c, 0x4f, 0x7e, 0x8d, 0x7d, 0x52, 0x67, 0x6f, 0x9c, 0xd9, 0x4a, 0x93,
-    0x69, 0x5b, 0x73, 0x7a, 0x83, 0x67, 0x9f, 0x88, 0x56, 0x71, 0x6f, 0x63,
-    0x66, 0x67, 0x84, 0x8a, 0x7f, 0x93, 0x36, 0x5d, 0x47, 0x5e, 0x5c, 0x72,
-    0x5e, 0x84, 0x89, 0x85, 0x8c, 0x6f, 0x58, 0x74, 0x87, 0x6a, 0x5c, 0x7a,
-    0x6c, 0x6b, 0x75, 0x65, 0x84, 0x6e, 0x62, 0x86, 0x85, 0x66, 0x64, 0x6c,
-    0x7b, 0x6e, 0x89, 0x67, 0x8a, 0x63, 0x68, 0x71, 0x8d, 0x8a, 0x65, 0x91,
-    0x63, 0x7e, 0x8b, 0x78, 0x80, 0x9d, 0x65, 0x6d, 0x93, 0x87, 0xa7, 0x6e,
-    0x81, 0x9f, 0xac, 0x5e, 0x66, 0x7b, 0x58, 0x61, 0x64, 0x4f, 0xb5, 0x85,
-    0x63, 0x8d, 0x79, 0x4b, 0x82, 0x74, 0x79, 0xaf, 0x88, 0x70, 0x59, 0x94,
-    0x96, 0x92, 0x7c, 0x76, 0xce, 0x82, 0x8c, 0x52, 0x69, 0x86, 0x7d, 0x70,
-    0x83, 0x84, 0x7c, 0x94, 0x97, 0x66, 0x6a, 0x74, 0x7c, 0xe5, 0x8c, 0x90,
-    0x78, 0x72, 0x73, 0x7c, 0x7a, 0x75, 0x71, 0x73, 0x75, 0x66, 0x72, 0x73,
-    0x85, 0x7a, 0x78, 0x69, 0x68, 0x6e, 0x7c, 0x6e, 0x74, 0x6f, 0x70, 0x7a,
-    0x46, 0x7e, 0x77, 0x70, 0x78, 0x6b, 0x6f, 0x6d, 0x73, 0x72, 0x79, 0x6d,
-    0x78, 0x78, 0x79, 0x76, 0x7a, 0x7c, 0x72, 0x70, 0x7b, 0x6e, 0x7c, 0x71,
-    0x73, 0x73, 0x7b, 0x7e, 0x6f, 0x6d, 0x81, 0x78, 0x6a, 0x78, 0x6f, 0x73,
-    0x7c, 0x71, 0x85, 0x7d, 0x75, 0x6b, 0x73, 0x79, 0x79, 0x72, 0x72, 0x7e,
-    0x6a, 0x7b, 0x6d, 0x72, 0x75, 0x74, 0x79, 0x72, 0x64, 0x64, 0x81, 0x88,
-    0x72, 0x79, 0x7a, 0x74, 0x6d, 0x7a, 0x6c, 0x6f, 0x75, 0x78, 0x79, 0x7a,
-    0x70, 0x83, 0x7f, 0x6f, 0x80, 0x68, 0x71, 0x7b, 0x78, 0x70, 0x61, 0x84,
-    0x69, 0x70, 0x7c, 0x71, 0x70, 0x6f, 0x73, 0x70, 0x6b, 0x73, 0x8a, 0x72,
-    0x81, 0x5a, 0x38, 0x8d, 0x73, 0x7d, 0x69, 0x53, 0x5a, 0x87, 0x69, 0x59,
-    0x7d, 0x4a, 0x91, 0x88, 0x82, 0x70, 0x5a, 0x59, 0x94, 0x7e, 0x51, 0x59,
-    0x88, 0x71, 0x5f, 0x73, 0x8a, 0x7f, 0x74, 0x72, 0x64, 0x7c, 0x65, 0x58,
-    0x85, 0x5c, 0x70, 0x6c, 0xc2, 0x48, 0x5a, 0x81, 0x94, 0x81, 0x91, 0x62,
-    0x64, 0x52, 0x78, 0x54, 0x85, 0x51, 0x6f, 0x70, 0x7a, 0xba, 0x96, 0x70,
-    0x6c, 0x6e, 0x81, 0x75, 0x7a, 0x63, 0x73, 0x70, 0x78, 0x6d, 0x82, 0x7a,
-    0x6d, 0x75, 0x74, 0x70, 0x72, 0x68, 0x76, 0x71, 0x73, 0x78, 0x71, 0x70,
-    0x7b, 0x75, 0x77, 0x74, 0x77, 0x7b, 0x73, 0x63, 0x77, 0x5e, 0x79, 0x6f,
-    0x71, 0x62, 0x77, 0x68, 0x83, 0x73, 0x72, 0x78, 0x4e, 0x70, 0x5b, 0x6e,
-    0x77, 0x6d, 0x79, 0x73, 0x77, 0x5d, 0x56, 0x74, 0x6a, 0x76, 0x63, 0x70,
-    0x6f, 0x72, 0x72, 0x6b, 0x6e, 0x6b, 0x75, 0x6e, 0x78, 0x6d, 0x6f, 0x70,
-    0x66, 0x73, 0x72, 0x72, 0x7a, 0x6a, 0x70, 0x6f, 0x70, 0x73, 0x7a, 0x6a,
-    0x75, 0x6c, 0x75, 0x66, 0x76, 0x70, 0x75, 0x73, 0x6d, 0x6c, 0x73, 0x70,
-    0x75, 0x72, 0x76, 0x70, 0x76, 0x73, 0x72, 0x66, 0x74, 0x78, 0x73, 0x6b,
-    0x76, 0x6f, 0x75, 0x72, 0x76, 0x59, 0x68, 0x72, 0x7a, 0x7a, 0x74, 0x71,
-    0x61, 0x9e, 0x68, 0x78, 0x89, 0x82, 0x7d, 0x6b, 0x80, 0xa9, 0x80, 0x4e,
-    0x8c, 0x88, 0x56, 0x73, 0x65, 0x81, 0xa6, 0x8a, 0xab, 0x95, 0xb0, 0x66,
-    0x98, 0x7c, 0x7d, 0x47, 0x8a, 0x9d, 0x78, 0xa1, 0x8e, 0x95, 0x88, 0x90,
-    0x9f, 0x91, 0x79, 0x73, 0xdb, 0x72, 0x86, 0x6b, 0x72, 0x81, 0x72, 0x84,
-    0x78, 0x4e, 0x8a, 0x83, 0x8e, 0x5d, 0x9a, 0x8e, 0x88, 0xd3, 0xa0, 0x66,
-    0x7b, 0x79, 0x73, 0x7d, 0x66, 0x74, 0x60, 0x72, 0x76, 0x75, 0x6f, 0x7d,
-    0x73, 0x7d, 0x73, 0x6f, 0x74, 0x52, 0x27, 0x78, 0x62, 0x75, 0x7d, 0x6b,
-    0x78, 0x66, 0x6c, 0x6e, 0x67, 0x6e, 0x7a, 0x7a, 0x69, 0x76, 0x70, 0x6f,
-    0x76, 0x73, 0x6c, 0x74, 0x84, 0x74, 0x7b, 0x72, 0x79, 0x79, 0x77, 0x75,
-    0x79, 0x74, 0x6a, 0x79, 0x5f, 0x66, 0x75, 0x78, 0x69, 0x72, 0x74, 0x78,
-    0x7e, 0x72, 0x85, 0x68, 0x74, 0x74, 0x75, 0x76, 0x7f, 0x77, 0x7e, 0x73,
-    0x66, 0x7b, 0x7a, 0x75, 0x71, 0x70, 0x7d, 0x6d, 0x69, 0x61, 0x81, 0x63,
-    0x68, 0x76, 0x75, 0x83, 0x70, 0x80, 0x6c, 0x69, 0x73, 0x84, 0x80, 0x63,
-    0x76, 0x6e, 0x7c, 0x75, 0x7f, 0x70, 0x77, 0x77, 0x89, 0x62, 0x3e, 0x73,
-    0x72, 0x81, 0x7d, 0x6f, 0x72, 0x6e, 0x83, 0x75, 0x67, 0x78, 0x80, 0x73,
-    0x6d, 0x82, 0x70, 0x7e, 0x89, 0xa0, 0x79, 0x88, 0x79, 0xa0, 0x73, 0x6b,
-    0x8d, 0x49, 0x6f, 0x8e, 0x6d, 0x88, 0x9b, 0x74, 0x7f, 0x90, 0xbb, 0x67,
-    0x7c, 0x71, 0x63, 0x54, 0x78, 0x70, 0x86, 0x99, 0x88, 0x92, 0x98, 0x87,
-    0x86, 0x99, 0x6d, 0x7d, 0xcc, 0x8b, 0x88, 0x60, 0x4e, 0x7a, 0x51, 0xa1,
-    0x63, 0x65, 0x83, 0x8e, 0x7c, 0x6e, 0x9a, 0x8f, 0x61, 0x7b, 0x71, 0x95,
-    0x6c, 0x7b, 0x1c, 0x6c, 0x7a, 0x7f, 0x6e, 0x6f, 0x74, 0x79, 0x7f, 0x77,
-    0x89, 0x7d, 0x78, 0x75, 0x73, 0x7e, 0x6a, 0x71, 0x71, 0x6e, 0x7d, 0x72,
-    0x78, 0x73, 0x6c, 0x6c, 0x6d, 0x7d, 0x6d, 0x74, 0x83, 0x60, 0x63, 0x63,
-    0x76, 0x51, 0x68, 0x71, 0x81, 0x85, 0x7a, 0x6c, 0x64, 0x74, 0x6d, 0x74,
-    0x6a, 0x63, 0x71, 0x73, 0x75, 0x76, 0x5b, 0x6b, 0x6b, 0x81, 0x8c, 0x81,
-    0x6a, 0x48, 0x88, 0x80, 0x72, 0x71, 0x6d, 0x7f, 0x7b, 0x7a, 0x78, 0x8a,
-    0x7c, 0x79, 0x53, 0x89, 0x75, 0x7b, 0x73, 0x7b, 0x80, 0x75, 0x85, 0x79,
-    0x73, 0x73, 0x77, 0x5d, 0x5c, 0x71, 0x6d, 0x75, 0x7a, 0x77, 0x7d, 0x7c,
-    0x56, 0x63, 0x61, 0x8d, 0x9e, 0x72, 0x78, 0x65, 0x83, 0x7b, 0x80, 0x7d,
-    0x72, 0x6d, 0x70, 0x72, 0x7b, 0x65, 0x7b, 0x77, 0x84, 0x7a, 0x82, 0x83,
-    0x58, 0x8c, 0x7e, 0x77, 0x8a, 0x74, 0x7a, 0x6a, 0x89, 0x9c, 0x84, 0x6c,
-    0x8d, 0x5a, 0x68, 0x63, 0x62, 0x5d, 0x57, 0x79, 0x69, 0x72, 0x97, 0x62,
-    0x8a, 0x6b, 0x5e, 0x52, 0x76, 0x7f, 0x83, 0x9d, 0x78, 0x7e, 0x93, 0x82,
-    0x75, 0x92, 0x80, 0x86, 0xcf, 0x92, 0x74, 0x85, 0x67, 0x7f, 0x73, 0x7f,
-    0x6f, 0x48, 0x83, 0x80, 0x6b, 0x4b, 0x8c, 0x68, 0x50, 0xd6, 0x9a, 0x67,
-    0x71, 0x6e, 0x71, 0x73, 0x72, 0x75, 0x75, 0x78, 0x69, 0x6e, 0x6f, 0x7a,
-    0x6e, 0x6f, 0x74, 0x85, 0x71, 0x70, 0x1e, 0x66, 0x55, 0x78, 0x71, 0x79,
-    0x73, 0x77, 0x70, 0x78, 0x79, 0x76, 0x6b, 0x79, 0x7a, 0x73, 0x61, 0x6a,
-    0x71, 0x71, 0x6f, 0x6a, 0x89, 0x72, 0x6d, 0x77, 0x7d, 0x75, 0x70, 0x6a,
-    0x6b, 0x71, 0x7d, 0x70, 0x74, 0x63, 0x6f, 0x75, 0x77, 0x85, 0x6c, 0x81,
-    0x73, 0x75, 0x71, 0x79, 0x77, 0x79, 0x7b, 0x73, 0x75, 0x70, 0x75, 0x73,
-    0x72, 0x75, 0x71, 0x70, 0x6e, 0x78, 0x7b, 0x74, 0x70, 0x7c, 0x75, 0x71,
-    0x76, 0x6f, 0x7b, 0x74, 0x74, 0x71, 0x73, 0x73, 0x72, 0x75, 0x78, 0x78,
-    0x6d, 0x78, 0x70, 0x76, 0x7c, 0x71, 0x74, 0x68, 0x75, 0x74, 0x62, 0x72,
-    0x78, 0x6f, 0x6f, 0x77, 0x7d, 0x75, 0x74, 0x76, 0x76, 0x7c, 0x75, 0x75,
-    0x76, 0x71, 0x9e, 0x7a, 0x8e, 0x63, 0x65, 0x71, 0x71, 0x82, 0x87, 0x5c,
-    0x77, 0x7d, 0x7e, 0x99, 0x69, 0x7b, 0x54, 0x7c, 0x8b, 0x74, 0xa6, 0x7e,
-    0x74, 0x6a, 0x85, 0x5c, 0x6b, 0x74, 0x7f, 0x84, 0x8f, 0x8d, 0x8e, 0x76,
-    0x79, 0x6e, 0x9b, 0x79, 0xc6, 0x81, 0x80, 0x60, 0x6d, 0x7e, 0x91, 0x85,
-    0x68, 0x59, 0x7c, 0x7e, 0x7e, 0x59, 0x85, 0x6f, 0x73, 0xd9, 0x5c, 0x75,
-    0x70, 0x6c, 0x78, 0x72, 0x73, 0x6e, 0x97, 0x7e, 0x6e, 0x56, 0x5f, 0x66,
-    0x66, 0x78, 0x77, 0x82, 0x7d, 0x8c, 0x2c, 0x5f, 0x25, 0x6a, 0x67, 0x78,
-    0x56, 0x81, 0x83, 0x83, 0x7a, 0x77, 0x61, 0x7a, 0x84, 0x6b, 0x5a, 0x67,
-    0x71, 0x66, 0x65, 0x77, 0x8e, 0x6d, 0x65, 0x73, 0x8b, 0x6e, 0x6b, 0x60,
-    0x6d, 0x72, 0x87, 0x69, 0x86, 0x5f, 0x76, 0x7f, 0x74, 0x8b, 0x61, 0x89,
-    0x63, 0x54, 0x5f, 0x83, 0x66, 0x45, 0x95, 0x66, 0x78, 0x62, 0x8c, 0x88,
-    0x5d, 0x58, 0xb0, 0x7f, 0x7c, 0x92, 0x59, 0x6b, 0x75, 0x65, 0x64, 0x71,
-    0x5f, 0xa5, 0x64, 0x83, 0x76, 0x8c, 0x60, 0xa1, 0x91, 0x6e, 0x63, 0x54,
-    0x68, 0x6b, 0x83, 0x8b, 0xc8, 0x58, 0x88, 0x71, 0x83, 0x44, 0x6d, 0x71,
-    0x73, 0x58, 0x73, 0x66, 0x77, 0x5b, 0x67, 0xa0, 0x8b, 0xe0, 0x65, 0x95,
-    0x73, 0x5f, 0x80, 0x6b, 0x70, 0x67, 0x72, 0x70, 0x77, 0x7b, 0x76, 0x76,
-    0x67, 0x6b, 0x77, 0x71, 0x69, 0x72, 0x78, 0x75, 0x70, 0x69, 0x77, 0x7a,
-    0x72, 0x79, 0x6b, 0x7c, 0x77, 0x6b, 0x79, 0x76, 0x70, 0x79, 0x7d, 0x6d,
-    0x6b, 0x7a, 0x5c, 0x74, 0x82, 0x78, 0x70, 0x73, 0x76, 0x6e, 0x77, 0x71,
-    0x7e, 0x7b, 0x70, 0x68, 0x7a, 0x57, 0x7f, 0x6e, 0x69, 0x66, 0x7a, 0x71,
-    0x4c, 0x6a, 0x7d, 0x9a, 0x69, 0x87, 0x78, 0x6a, 0x84, 0x79, 0x6c, 0x85,
-    0x76, 0x76, 0x61, 0x7f, 0x78, 0x7d, 0x70, 0x82, 0x7e, 0x5a, 0x7d, 0x78,
-    0x6b, 0x86, 0x81, 0x4f, 0x6a, 0x6b, 0x70, 0x7b, 0x6d, 0x72, 0x7f, 0x8f,
-    0x7e, 0x87, 0x7b, 0x6e, 0x90, 0x78, 0x78, 0x89, 0x75, 0x81, 0x85, 0x83,
-    0x6d, 0x70, 0x67, 0x72, 0x7f, 0x71, 0x7f, 0x7c, 0x6a, 0x74, 0x89, 0x82,
-    0x73, 0x52, 0x78, 0x86, 0x7a, 0x6d, 0x7a, 0x79, 0x7d, 0x6e, 0x81, 0x6d,
-    0x64, 0x7b, 0x62, 0x72, 0x7e, 0x72, 0x7f, 0x75, 0x73, 0x78, 0x71, 0x77,
-    0x81, 0x73, 0x71, 0x73, 0x77, 0x72, 0x79, 0x77, 0x7b, 0x6a, 0x6a, 0x67,
-    0x7b, 0x7e, 0x6d, 0x6d, 0x87, 0x64, 0x76, 0x67, 0x8c, 0x7c, 0x85, 0x6f,
-    0x7c, 0x64, 0x78, 0x77, 0x76, 0x42, 0x7a, 0x72, 0x6c, 0x8b, 0x76, 0x6b,
-    0x7e, 0x6f, 0x80, 0x77, 0x8c, 0xa3, 0x74, 0x78, 0x83, 0x85, 0x64, 0x76,
-    0x81, 0x6d, 0x45, 0x7c, 0x8e, 0x77, 0x5e, 0x81, 0x90, 0x68, 0x98, 0x74,
-    0x71, 0x8d, 0x67, 0x53, 0x98, 0x97, 0x89, 0x9e, 0x5f, 0x92, 0xa3, 0x69,
-    0x69, 0x7b, 0x9c, 0x85, 0xd7, 0x86, 0x93, 0x81, 0x72, 0x7c, 0x74, 0x61,
-    0x81, 0x4e, 0x81, 0x97, 0x86, 0x60, 0x95, 0x7c, 0x77, 0xdb, 0x51, 0x8c,
-    0x7c, 0x76, 0x68, 0x86, 0x96, 0x40, 0xa0, 0x6a, 0x7d, 0x6e, 0x9a, 0x86,
-    0x60, 0x8d, 0x79, 0x7f, 0x7e, 0x71, 0x5c, 0x64, 0x56, 0x3f, 0x89, 0x5f,
-    0x77, 0x9e, 0x62, 0x71, 0x75, 0x7a, 0x6b, 0x87, 0x98, 0x88, 0x6c, 0x48,
-    0x63, 0x52, 0xa0, 0x65, 0xb1, 0x51, 0x7d, 0x89, 0x81, 0x65, 0x71, 0x79,
-    0x90, 0x55, 0x6c, 0x78, 0x7c, 0x5e, 0x61, 0x84, 0x7d, 0xe5, 0x65, 0x9e,
-    0x7f, 0x72, 0x87, 0x5f, 0x73, 0x70, 0x68, 0x74, 0x7f, 0x75, 0x7b, 0x7a,
-    0x5b, 0x82, 0x81, 0x74, 0x70, 0x6f, 0x78, 0x72, 0x6d, 0x65, 0x7e, 0x68,
-    0x6a, 0x76, 0x7e, 0x7e, 0x71, 0x7d, 0x6b, 0x66, 0x79, 0x80, 0x78, 0x71,
-    0x75, 0x79, 0x78, 0x76, 0x84, 0x73, 0x75, 0x7d, 0x8b, 0x5a, 0x6a, 0x74,
-    0x69, 0x80, 0x80, 0x6c, 0x72, 0x6d, 0x83, 0x78, 0x6e, 0x65, 0x7b, 0x7b,
-    0x5a, 0x7a, 0x79, 0x7b, 0x8b, 0x86, 0x78, 0x64, 0x6d, 0x6b, 0x97, 0x5a,
-    0x94, 0x68, 0x6f, 0x79, 0x5c, 0x66, 0x8a, 0x83, 0x87, 0x6e, 0x8f, 0x8a,
-    0x7e, 0x6d, 0x57, 0x44, 0x70, 0x65, 0x77, 0x94, 0x86, 0x67, 0x97, 0x80,
-    0x80, 0x7d, 0x71, 0x8d, 0xd2, 0x8a, 0x87, 0x73, 0x81, 0x66, 0x5a, 0x6d,
-    0x65, 0x41, 0x79, 0x91, 0x7b, 0x5a, 0x93, 0x6c, 0x64, 0xd4, 0x7e, 0x72,
-    0x65, 0x85, 0x74, 0x93, 0x77, 0x4b, 0x72, 0x70, 0x59, 0x75, 0x65, 0x73,
-    0x66, 0x78, 0x57, 0x77, 0x7c, 0x7c, 0x73, 0x71, 0x77, 0x80, 0x5b, 0x3f,
-    0x67, 0x70, 0x88, 0x83, 0x7b, 0x82, 0x7c, 0x6b, 0x79, 0x76, 0x7d, 0x6e,
-    0x7a, 0x6a, 0x81, 0x70, 0xb0, 0x6e, 0x79, 0x62, 0x77, 0x5f, 0x7d, 0x66,
-    0x7a, 0x4f, 0x73, 0x6d, 0x6f, 0x46, 0x82, 0x7f, 0x5b, 0xa2, 0x78, 0x69,
-    0x6f, 0x6c, 0x6b, 0x60, 0x69, 0x6c, 0x6a, 0x6f, 0x6b, 0x6b, 0x64, 0x69,
-    0x6c, 0x68, 0x6c, 0x68, 0x6a, 0x6d, 0x67, 0x6f, 0x6c, 0x6b, 0x62, 0x6b,
-    0x6d, 0x6a, 0x6d, 0x6b, 0x6f, 0x6c, 0x6f, 0x6a, 0x6a, 0x6c, 0x65, 0x69,
-    0x69, 0x6a, 0x6b, 0x69, 0x4d, 0x6b, 0x6c, 0x6c, 0x61, 0x6f, 0x67, 0x6c,
-    0x70, 0x6f, 0x72, 0x6f, 0x6c, 0x6f, 0x6c, 0x6b, 0x6f, 0x5e, 0x64, 0x69,
-    0x54, 0x7c, 0x2f, 0x79, 0x7a, 0x71, 0x6c, 0x76, 0x72, 0x7c, 0x72, 0x6c,
-    0x5d, 0x83, 0x77, 0x79, 0x7b, 0x77, 0x7c, 0x73, 0x81, 0x78, 0x7e, 0x77,
-    0x6b, 0x75, 0x74, 0x6c, 0x6f, 0x72, 0x71, 0x85, 0x7c, 0x67, 0x51, 0x68,
-    0x68, 0x5a, 0x72, 0x79, 0x80, 0x77, 0x6f, 0x70, 0x5b, 0x81, 0x6d, 0x7b,
-    0x75, 0x77, 0x75, 0x7d, 0x78, 0x77, 0x50, 0x73, 0x6d, 0x76, 0x6b, 0x7e,
-    0x5e, 0x78, 0x69, 0x7e, 0x8c, 0x57, 0x86, 0x85, 0x6a, 0x99, 0x8a, 0x6a,
-    0x71, 0x7f, 0x63, 0x80, 0x6e, 0x85, 0x7f, 0x7c, 0x79, 0x79, 0xa2, 0x78,
-    0x8a, 0x6a, 0x5c, 0x53, 0x7a, 0x6c, 0x7f, 0x89, 0x75, 0x84, 0x78, 0x6b,
-    0x7a, 0x80, 0x96, 0x86, 0xc7, 0x79, 0x81, 0x69, 0x4f, 0x7e, 0x54, 0x81,
-    0x70, 0x7d, 0x74, 0x82, 0x6e, 0x4e, 0x80, 0x6e, 0x56, 0xd4, 0x79, 0x7d,
-    0x61, 0x6c, 0x6f, 0x60, 0x79, 0x5b, 0x7a, 0x66, 0x59, 0x79, 0x81, 0x90,
-    0x6b, 0x89, 0x6f, 0x77, 0x66, 0x6f, 0x67, 0x77, 0x74, 0x73, 0x85, 0x7b,
-    0x65, 0x6c, 0x7c, 0x72, 0x53, 0x6a, 0x85, 0x70, 0x87, 0x7a, 0x69, 0x71,
-    0x66, 0x6c, 0x60, 0x8c, 0x21, 0x5f, 0x81, 0x68, 0x6d, 0x73, 0x69, 0x6e,
-    0x5d, 0x6b, 0x5e, 0x6c, 0x80, 0x22, 0x6a, 0x38, 0x61, 0x4d, 0x74, 0x63,
-    0x95, 0x7c, 0x69, 0x93, 0x73, 0x57, 0x83, 0x6a, 0x55, 0x78, 0x89, 0x80,
-    0x64, 0x93, 0x88, 0x7a, 0x89, 0x6b, 0x8d, 0x7a, 0x89, 0x7a, 0x89, 0x60,
-    0x6a, 0x78, 0x6f, 0x80, 0x7c, 0x61, 0x73, 0x6b, 0x7e, 0x73, 0x93, 0x87,
-    0x90, 0x83, 0x74, 0x7e, 0xad, 0x46, 0x6e, 0x77, 0x9d, 0x6f, 0x86, 0x61,
-    0x66, 0x43, 0x7b, 0x78, 0x79, 0x47, 0x81, 0x94, 0x67, 0xab, 0x88, 0x89,
-    0x7d, 0x84, 0x4b, 0x7d, 0x81, 0x72, 0x81, 0x88, 0x76, 0x6b, 0x84, 0x71,
-    0x7b, 0x7e, 0x75, 0x85, 0x7d, 0x78, 0x70, 0x86, 0x74, 0x8b, 0x7c, 0x85,
-    0x83, 0x86, 0x7c, 0x45, 0x73, 0x69, 0x7d, 0x87, 0x73, 0x77, 0x6f, 0x79,
-    0x70, 0x5e, 0x6c, 0x82, 0xb1, 0x65, 0x77, 0x6d, 0x69, 0x70, 0x82, 0x85,
-    0x71, 0x54, 0x79, 0x83, 0x71, 0x41, 0x7c, 0x71, 0x81, 0xc3, 0x7f, 0x5d,
-    0x55, 0xaa, 0x92, 0x7b, 0xa2, 0x9b, 0x62, 0x6d, 0x83, 0x9e, 0x99, 0x65,
-    0x9a, 0x89, 0x61, 0x86, 0x8e, 0x64, 0x9a, 0x88, 0x8c, 0x8a, 0xc6, 0x6b,
-    0xb2, 0x7a, 0x68, 0x52, 0x83, 0x4c, 0x74, 0xa6, 0x7b, 0x8e, 0x9f, 0xa2,
-    0x9d, 0x94, 0xa2, 0x66, 0xd0, 0x82, 0x96, 0x4a, 0x6a, 0x86, 0x64, 0x9c,
-    0x7e, 0x5a, 0x7b, 0x8b, 0x8a, 0x5b, 0x84, 0x88, 0x7b, 0x73, 0xae, 0x75,
-    0x6a, 0x46, 0x79, 0x80, 0x77, 0x6c, 0xa2, 0x85, 0x65, 0x6c, 0x41, 0x75,
-    0x68, 0x64, 0x82, 0x9e, 0x80, 0x9a, 0x61, 0x5e, 0x69, 0x7d, 0x5e, 0x77,
-    0x4e, 0x92, 0x8b, 0x81, 0x95, 0x90, 0x45, 0x71, 0x7c, 0x6c, 0x25, 0x8a,
-    0x60, 0x7c, 0x74, 0x66, 0x83, 0x6a, 0x60, 0x7a, 0x8c, 0x61, 0x66, 0x54,
-    0x88, 0x6c, 0x8d, 0x6b, 0x91, 0x59, 0x70, 0x6f, 0x94, 0x97, 0x5f, 0x97,
-    0x6e, 0x73, 0x89, 0x76, 0x80, 0x7b, 0x82, 0xa3, 0x73, 0x6e, 0x7e, 0x86,
-    0x92, 0x68, 0x72, 0x8f, 0x8a, 0x79, 0x74, 0x81, 0x77, 0x80, 0xa9, 0x42,
-    0x75, 0x75, 0x73, 0x61, 0x7f, 0x60, 0x7e, 0x90, 0x72, 0x85, 0x8d, 0x5f,
-    0x7d, 0x84, 0x8a, 0x88, 0xc4, 0x8b, 0x86, 0x44, 0x95, 0x6a, 0x8e, 0x73,
-    0x74, 0x8f, 0x62, 0x74, 0x7a, 0x4a, 0x86, 0x71, 0x82, 0xdb, 0x7b, 0x70,
-    0x77, 0x60, 0x45, 0x90, 0x89, 0x5d, 0x77, 0x66, 0x65, 0x74, 0x67, 0x76,
-    0xad, 0x6d, 0x86, 0x67, 0x7c, 0x79, 0x77, 0x6b, 0x8d, 0x74, 0x56, 0x45,
-    0x8e, 0x63, 0x69, 0x7c, 0x73, 0x80, 0x66, 0x88, 0x70, 0x8a, 0x88, 0x67,
-    0x70, 0x6c, 0x95, 0x75, 0xa8, 0x38, 0x69, 0x84, 0x8e, 0x7f, 0x8b, 0x53,
-    0x5c, 0x74, 0x74, 0x55, 0x72, 0x43, 0x74, 0x7d, 0x80, 0xaa, 0x88, 0x8f,
-    0x79, 0x8a, 0x51, 0x9d, 0x7f, 0x63, 0x65, 0x65, 0x4a, 0x7b, 0x7a, 0x72,
-    0x95, 0x87, 0x7e, 0x72, 0x96, 0x69, 0x6d, 0x70, 0x6e, 0x72, 0x8b, 0x52,
-    0x77, 0x75, 0x77, 0x78, 0x83, 0x92, 0x7e, 0x6a, 0x74, 0x69, 0x67, 0x9c,
-    0x80, 0x86, 0x83, 0x76, 0xac, 0x4d, 0x76, 0x78, 0x96, 0x86, 0x8e, 0x6d,
-    0x6a, 0x54, 0x6e, 0x72, 0x86, 0x91, 0x91, 0x9c, 0x86, 0x9a, 0x8d, 0x83,
-    0x7f, 0x6f, 0x9d, 0x7c, 0xab, 0x93, 0x6c, 0x6f, 0x87, 0x69, 0xaa, 0x85,
-    0x85, 0x9a, 0x5a, 0x81, 0x7f, 0x79, 0x88, 0x66, 0x73, 0x60, 0xb6, 0x66,
-    0x5b, 0x7c, 0x65, 0x64, 0x76, 0x6d, 0x76, 0x9c, 0x7d, 0x80, 0x60, 0x7b,
-    0x90, 0x8f, 0x89, 0x7c, 0xbf, 0xa4, 0x5d, 0x6c, 0x70, 0x6c, 0x7a, 0x74,
-    0x65, 0x5f, 0x77, 0x83, 0x7e, 0x5e, 0x6f, 0x75, 0x8f, 0xd6, 0x7b, 0x7f,
-    0x65, 0x7e, 0x5a, 0x7b, 0x78, 0x91, 0x6b, 0x68, 0x6a, 0xad, 0x6e, 0x7d,
-    0x85, 0x76, 0x80, 0x57, 0x7c, 0x87, 0x6a, 0x7b, 0x88, 0x39, 0x96, 0x50,
-    0x84, 0x7f, 0x6e, 0x5c, 0x80, 0x4b, 0x7f, 0x84, 0x8e, 0x80, 0x68, 0x67,
-    0x69, 0x91, 0x8c, 0x6a, 0xcc, 0x84, 0x77, 0x90, 0x64, 0x6b, 0x72, 0x7f,
-    0x68, 0x3f, 0x65, 0x99, 0x7b, 0x54, 0x93, 0x76, 0x73, 0xc6, 0x8a, 0x5d,
-    0x6a, 0x88, 0x70, 0x96, 0x6b, 0x7c, 0x80, 0x69, 0x7d, 0x84, 0x8c, 0x71,
-    0x81, 0x8c, 0x74, 0x8d, 0x5f, 0x7c, 0x71, 0x5a, 0x80, 0x7e, 0xa9, 0xb9,
-    0x5e, 0x94, 0x64, 0x6e, 0x85, 0x84, 0x7e, 0x85, 0x82, 0x74, 0x79, 0x70,
-    0x7a, 0x83, 0x84, 0x6c, 0xd2, 0x7c, 0x6f, 0x5e, 0x72, 0x89, 0x72, 0x61,
-    0x81, 0x6e, 0x85, 0x72, 0x9d, 0x66, 0x6f, 0x77, 0x7a, 0x83, 0xa4, 0x9b,
-    0x70, 0x6a, 0x75, 0x86, 0x81, 0x49, 0x73, 0x74, 0x61, 0x76, 0x88, 0x7b,
-    0x62, 0x72, 0x72, 0x7c, 0x7d, 0x71, 0x7f, 0x79, 0x73, 0x86, 0x72, 0x6d,
-    0x81, 0x7d, 0x78, 0x75, 0x87, 0x7e, 0x71, 0x57, 0x78, 0x7b, 0x7c, 0x67,
-    0x77, 0x85, 0x70, 0x6a, 0x9c, 0x72, 0x68, 0x75, 0x88, 0x77, 0x8a, 0x74,
-    0x6e, 0x58, 0x70, 0x7a, 0x7e, 0x4b, 0x6f, 0x80, 0x7c, 0x94, 0x64, 0x75,
-    0x79, 0x69, 0x5b, 0x72, 0x70, 0x75, 0x6d, 0x76, 0x76, 0x65, 0x6d, 0x75,
-    0x65, 0x74, 0x78, 0x6a, 0x6e, 0x72, 0x72, 0x72, 0x72, 0x73, 0x6e, 0x6b,
-    0x39, 0x74, 0x78, 0x72, 0x72, 0x71, 0x73, 0x6f, 0x6c, 0x6a, 0x72, 0x69,
-    0x6e, 0x78, 0x6e, 0x70, 0x71, 0x75, 0x75, 0x73, 0x78, 0x77, 0x73, 0x70,
-    0x7c, 0x68, 0x73, 0x6d, 0x6b, 0x36, 0x73, 0x78, 0x73, 0x5a, 0x70, 0x6d,
-    0x6f, 0x7b, 0x42, 0x9a, 0x86, 0x5e, 0x8f, 0x7b, 0x6b, 0x7d, 0x6d, 0x66,
-    0x8c, 0x55, 0x93, 0x6b, 0x62, 0x68, 0x83, 0x5b, 0x8b, 0x56, 0x4d, 0x57,
-    0x74, 0x62, 0x6f, 0x59, 0x7b, 0x81, 0x6b, 0x7b, 0x79, 0x7a, 0x80, 0x5e,
-    0x8c, 0x6c, 0x8e, 0x52, 0xb7, 0x47, 0x68, 0x89, 0x8f, 0x65, 0x8b, 0x53,
-    0x7f, 0x89, 0x78, 0x61, 0x7f, 0x68, 0x84, 0x7f, 0x85, 0xae, 0x9a, 0x79,
-    0x69, 0x70, 0x63, 0x74, 0x77, 0x72, 0x79, 0x79, 0x7e, 0x78, 0x7e, 0x71,
-    0x64, 0x80, 0x7c, 0x6a, 0x75, 0x6d, 0x79, 0x71, 0x7c, 0x76, 0x7c, 0x69,
-    0x6a, 0x73, 0x74, 0x7c, 0x74, 0x75, 0x78, 0x7b, 0x7a, 0x6c, 0x78, 0x5a,
-    0x6d, 0x3e, 0x77, 0x6b, 0x87, 0x72, 0x6d, 0x74, 0x5a, 0x73, 0x6b, 0x7e,
-    0x6f, 0x69, 0x7a, 0x75, 0x73, 0x6b, 0x63, 0x79, 0x6a, 0x6a, 0x64, 0x74,
-    0x75, 0x72, 0x80, 0x7a, 0x73, 0x73, 0x74, 0x71, 0x65, 0x79, 0x4f, 0x75,
-    0x79, 0x65, 0x7e, 0x7b, 0x75, 0x75, 0x6e, 0x75, 0x73, 0x70, 0x63, 0x99,
-    0x73, 0x79, 0x75, 0x7e, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x7e, 0x72, 0x66,
-    0x7d, 0x7a, 0x77, 0x75, 0x81, 0x6c, 0x6f, 0x76, 0x88, 0x72, 0x55, 0x6d,
-    0x75, 0x7c, 0x72, 0x6a, 0x73, 0x6c, 0x80, 0x75, 0x7d, 0x78, 0x80, 0x77,
-    0x71, 0x6d, 0x6f, 0x67, 0x6a, 0x6f, 0x6c, 0x69, 0x6c, 0x6f, 0x66, 0x69,
-    0x6f, 0x6b, 0x6d, 0x58, 0x5c, 0x71, 0x6b, 0x74, 0x6e, 0x70, 0x68, 0x6c,
-    0x6f, 0x6d, 0x71, 0x6e, 0x72, 0x6f, 0x70, 0x6e, 0x6e, 0x6c, 0x69, 0x6d,
-    0x6e, 0x68, 0x69, 0x6a, 0x5a, 0x6f, 0x6b, 0x72, 0x68, 0x6f, 0x6d, 0x6d,
-    0x74, 0x71, 0x70, 0x6b, 0x72, 0x6e, 0x6e, 0x70, 0x70, 0x63, 0x68, 0x6f,
-    0x77, 0x73, 0x9d, 0x7e, 0x79, 0x93, 0x80, 0x64, 0x74, 0x9f, 0x87, 0x70,
-    0x8f, 0x66, 0x61, 0x88, 0x62, 0x71, 0x6c, 0x6d, 0x79, 0x85, 0x9f, 0x82,
-    0xa1, 0x69, 0x69, 0x5b, 0x71, 0x4f, 0x6b, 0x8e, 0x78, 0x99, 0x9b, 0x97,
-    0x8a, 0x9b, 0x75, 0x70, 0xce, 0x8c, 0x96, 0x68, 0x86, 0x83, 0xa4, 0x76,
-    0x62, 0x58, 0x85, 0x70, 0x7f, 0x5a, 0x89, 0x70, 0x51, 0x7b, 0x9a, 0x6f,
-    0x7a, 0x75, 0x70, 0x7a, 0x75, 0x75, 0x70, 0x78, 0x68, 0x76, 0x6d, 0x74,
-    0x76, 0x75, 0x71, 0x79, 0x63, 0x76, 0x76, 0x75, 0x70, 0x76, 0x71, 0x72,
-    0x75, 0x7b, 0x74, 0x72, 0x74, 0x71, 0x73, 0x7a, 0x76, 0x76, 0x71, 0x76,
-    0x78, 0x72, 0x70, 0x71, 0x7d, 0x75, 0x72, 0x5a, 0x73, 0x72, 0x70, 0x6b,
-    0x77, 0x6c, 0x76, 0x75, 0x72, 0x74, 0x74, 0x76, 0x70, 0x72, 0x77, 0x76,
-    0x55, 0x6b, 0x73, 0x73, 0x7e, 0x8b, 0x89, 0x82, 0x86, 0xa4, 0x8c, 0x54,
-    0x5f, 0xa8, 0x46, 0x91, 0x75, 0x90, 0x67, 0x74, 0x72, 0x73, 0xaa, 0x73,
-    0x58, 0x71, 0x76, 0x48, 0x74, 0x4f, 0x6d, 0x99, 0x91, 0x7b, 0x5b, 0x9e,
-    0x8b, 0x59, 0x7f, 0x76, 0xc6, 0x9f, 0x91, 0x5e, 0x72, 0x77, 0x73, 0xa6,
-    0x65, 0x55, 0x6d, 0x97, 0x8c, 0x5b, 0x89, 0x81, 0x7f, 0x81, 0x68, 0x6c,
-    0x8d, 0x5e, 0x56, 0x94, 0x94, 0x7f, 0x84, 0x71, 0x64, 0x99, 0xa3, 0x7b,
-    0x61, 0x81, 0x7c, 0x9d, 0x7e, 0x77, 0x3f, 0x63, 0x4b, 0x3b, 0x92, 0x79,
-    0x60, 0x6f, 0x9e, 0x92, 0x7e, 0xa1, 0x5e, 0x9a, 0x8b, 0x87, 0x35, 0x4e,
-    0x5b, 0x42, 0x86, 0x71, 0xc8, 0xb3, 0x5a, 0x83, 0xad, 0x5a, 0x54, 0x5b,
-    0x77, 0x50, 0x62, 0x9f, 0x96, 0x60, 0x61, 0x72, 0x97, 0xe6, 0x60, 0x97,
-    0x84, 0x70, 0x6b, 0x7d, 0x81, 0x7e, 0x8a, 0x6c, 0x83, 0x94, 0xaa, 0x7f,
-    0x8a, 0x80, 0x6a, 0x96, 0x95, 0x82, 0x58, 0x7c, 0x7b, 0x8f, 0xb0, 0x70,
-    0x9b, 0x9e, 0x6e, 0x6d, 0x7d, 0x85, 0x6b, 0x89, 0x79, 0xa2, 0x59, 0x6a,
-    0x91, 0x7f, 0x86, 0x8b, 0xcf, 0x94, 0x7b, 0x7f, 0x79, 0x80, 0x72, 0x84,
-    0x97, 0xb1, 0x84, 0x94, 0x81, 0x5e, 0xa8, 0xa2, 0x93, 0xd9, 0x85, 0x71,
-    0x65, 0x74, 0xa8, 0x84, 0x7d, 0x91, 0x81, 0x6b, 0x8e, 0x85, 0x98, 0x85,
-    0x7a, 0x84, 0x57, 0x74, 0x6b, 0x65, 0x8d, 0x80, 0x8c, 0x7a, 0xae, 0x6d,
-    0x98, 0x6b, 0x80, 0x59, 0x7f, 0x5a, 0x7b, 0x99, 0x78, 0x86, 0x91, 0x87,
-    0xa8, 0x97, 0x7d, 0x7b, 0xc9, 0x9c, 0x8b, 0xb0, 0x71, 0x74, 0x65, 0x64,
-    0x65, 0x59, 0x85, 0x8b, 0x7c, 0x5b, 0x96, 0x6e, 0x53, 0xcf, 0x6c, 0x83,
-    0x5c, 0x88, 0x90, 0x7b, 0x9a, 0x75, 0x60, 0x88, 0x9a, 0x9d, 0x98, 0x7c,
-    0x88, 0x8e, 0xa6, 0x77, 0x52, 0x73, 0x5e, 0x75, 0x9a, 0x8e, 0xbc, 0x66,
-    0x94, 0x71, 0x7a, 0x49, 0x96, 0x6c, 0x6f, 0x88, 0x8b, 0x97, 0x6f, 0x86,
-    0x8d, 0x90, 0x7f, 0x81, 0xc8, 0x8a, 0x86, 0x8d, 0x72, 0x6d, 0x77, 0x83,
-    0x65, 0x65, 0x7f, 0x84, 0x6f, 0x6d, 0xb8, 0x7a, 0x5b, 0xd4, 0x9c, 0x92,
-    0x66, 0x6f, 0x7f, 0x73, 0x7a, 0x75, 0x9a, 0x7d, 0x4a, 0x6d, 0x5c, 0x67,
-    0x67, 0x5c, 0x7d, 0x93, 0x7e, 0x95, 0x4b, 0x60, 0x46, 0x74, 0x66, 0x78,
-    0x43, 0x88, 0x89, 0x81, 0x83, 0x87, 0x54, 0x71, 0x81, 0x6c, 0x30, 0x75,
-    0x68, 0x71, 0x68, 0x77, 0x87, 0x69, 0x64, 0x7f, 0x8a, 0x5f, 0x6d, 0x6a,
-    0x68, 0x66, 0x8d, 0x69, 0x83, 0x65, 0x6f, 0x79, 0x86, 0x91, 0x5f, 0x8c,
-    0x71, 0x73, 0x75, 0x70, 0x73, 0x6f, 0x71, 0x77, 0x74, 0x70, 0x70, 0x72,
-    0x74, 0x69, 0x78, 0x76, 0x75, 0x6e, 0x70, 0x70, 0x6f, 0x74, 0x71, 0x6f,
-    0x70, 0x6f, 0x6d, 0x75, 0x71, 0x74, 0x74, 0x64, 0x6b, 0x70, 0x6b, 0x70,
-    0x73, 0x75, 0x74, 0x74, 0x75, 0x74, 0x6c, 0x6b, 0x76, 0x73, 0x75, 0x73,
-    0x77, 0x71, 0x72, 0x75, 0x75, 0x6f, 0x71, 0x79, 0x71, 0x75, 0x71, 0x70,
-    0x7d, 0x84, 0x72, 0x93, 0x7e, 0x56, 0x88, 0x59, 0x67, 0x6e, 0x6d, 0x6c,
-    0x77, 0x58, 0x86, 0x84, 0x89, 0x72, 0x6a, 0x73, 0x70, 0x73, 0x60, 0x5c,
-    0x4d, 0x6e, 0x62, 0x6e, 0x6c, 0x87, 0x7a, 0x83, 0x63, 0x72, 0x7c, 0x7e,
-    0x86, 0x88, 0x5c, 0x64, 0xae, 0x72, 0x76, 0x6e, 0x6a, 0x69, 0x98, 0x63,
-    0x73, 0x6d, 0x78, 0x6f, 0x7f, 0x46, 0x72, 0x77, 0x7a, 0x9d, 0x7c, 0x6f,
-    0x75, 0x4b, 0x84, 0x77, 0x7b, 0x74, 0x75, 0x7a, 0x7a, 0x7c, 0x74, 0x81,
-    0x7f, 0x7d, 0x5c, 0x88, 0x85, 0x83, 0x6f, 0x70, 0x80, 0x87, 0x88, 0x7f,
-    0x6c, 0x7c, 0x77, 0x70, 0x6a, 0x7b, 0x73, 0x82, 0x73, 0x79, 0x7f, 0x83,
-    0x5e, 0x6a, 0x50, 0x86, 0x93, 0x7f, 0x70, 0x58, 0x8a, 0x6f, 0x85, 0x7e,
-    0x5f, 0x61, 0x6d, 0x7b, 0x73, 0x73, 0x6d, 0x7a, 0x7f, 0x70, 0x8b, 0x82,
-    0x7f, 0x7a, 0x73, 0x7a, 0x62, 0x74, 0x62, 0x68, 0x7e, 0x73, 0x75, 0x84,
-    0x75, 0x7b, 0x75, 0x62, 0x7b, 0x20, 0x3f, 0x80, 0x76, 0x72, 0x83, 0x63,
-    0x82, 0x67, 0x65, 0x69, 0x60, 0x6f, 0x7d, 0x77, 0x5c, 0x7a, 0x7a, 0x6f,
-    0x75, 0x6c, 0x75, 0x6a, 0x83, 0x77, 0x87, 0x78, 0x6d, 0x77, 0x78, 0x7a,
-    0x7c, 0x74, 0x62, 0x79, 0x5d, 0x74, 0x73, 0x78, 0x6b, 0x71, 0x79, 0x78,
-    0x70, 0x2f, 0x81, 0x90, 0x78, 0x60, 0x76, 0x7a, 0x78, 0x71, 0x80, 0x76,
-    0x80, 0x77, 0x60, 0x6d, 0x6f, 0x69, 0x7e, 0x72, 0x7a, 0x96, 0x86, 0x74,
-    0x66, 0x79, 0x72, 0x69, 0x6f, 0x76, 0x75, 0x84, 0x79, 0x76, 0x71, 0x68,
-    0x7f, 0x77, 0x5a, 0x78, 0xa5, 0x80, 0x69, 0x70, 0x91, 0x68, 0x83, 0x79,
-    0x74, 0x5e, 0x72, 0x7c, 0x86, 0x47, 0x76, 0x73, 0x89, 0x8a, 0x8a, 0x78,
-    0x53, 0x91, 0xb8, 0x7a, 0x8f, 0x67, 0x6d, 0x88, 0x76, 0x94, 0x96, 0x57,
-    0x8c, 0x9c, 0x75, 0x89, 0x5c, 0x8f, 0x8d, 0x7f, 0x7d, 0x83, 0xc4, 0x63,
-    0x84, 0x6f, 0x77, 0x6e, 0x84, 0x79, 0x77, 0x9c, 0xa0, 0x85, 0x9f, 0x8a,
-    0x8c, 0x8d, 0x77, 0x75, 0xcc, 0x8c, 0x7d, 0x6b, 0x71, 0x78, 0x73, 0x80,
-    0x69, 0x57, 0x80, 0x86, 0x89, 0x65, 0x7a, 0x8e, 0x65, 0x72, 0xb2, 0x7b,
-    0x83, 0x6f, 0x5e, 0x7d, 0x7f, 0x67, 0x6c, 0x6b, 0x62, 0x9c, 0x85, 0x73,
-    0x59, 0x57, 0x5c, 0x6a, 0x78, 0x65, 0x5b, 0x68, 0x75, 0x71, 0xc5, 0x7c,
-    0x65, 0x83, 0x63, 0x74, 0x73, 0x6b, 0x7f, 0xa7, 0x8b, 0x99, 0x51, 0x72,
-    0x64, 0x8f, 0x70, 0x94, 0xc9, 0x84, 0x8b, 0x70, 0x67, 0x83, 0x8c, 0x7c,
-    0x7a, 0x64, 0x7f, 0x9d, 0xa0, 0x62, 0x74, 0x88, 0x82, 0xca, 0x8c, 0x8d,
-    0x78, 0x70, 0x71, 0x77, 0x76, 0x6f, 0x69, 0x77, 0x6e, 0x6e, 0x6b, 0x7d,
-    0x77, 0x7b, 0x70, 0x79, 0x6d, 0x63, 0x22, 0x71, 0x5c, 0x72, 0x71, 0x75,
-    0x61, 0x71, 0x73, 0x71, 0x6d, 0x71, 0x75, 0x7e, 0x78, 0x76, 0x65, 0x6f,
-    0x6d, 0x74, 0x7a, 0x79, 0x87, 0x6f, 0x71, 0x72, 0x7d, 0x70, 0x72, 0x6f,
-    0x75, 0x75, 0x73, 0x7b, 0x6c, 0x6e, 0x73, 0x74, 0x73, 0x77, 0x6b, 0x75,
-    0x72, 0x75, 0x77, 0x7c, 0x76, 0x73, 0x6c, 0x72, 0x70, 0x75, 0x73, 0x76,
-    0x78, 0x76, 0x72, 0x77, 0x7b, 0x77, 0x79, 0x73, 0x76, 0x76, 0x6d, 0x76,
-    0x78, 0x6e, 0x79, 0x76, 0x75, 0x75, 0x73, 0x76, 0x73, 0x75, 0x78, 0x71,
-    0x74, 0x77, 0x73, 0x73, 0x7f, 0x73, 0x76, 0x74, 0x78, 0x75, 0x61, 0x72,
-    0x6f, 0x73, 0x72, 0x73, 0x75, 0x73, 0x7a, 0x78, 0x7a, 0x56, 0x71, 0x76,
-    0x70, 0x61, 0x65, 0x8a, 0x8f, 0x7f, 0x81, 0x7b, 0x8c, 0x8f, 0x81, 0x81,
-    0x58, 0x59, 0xa4, 0x92, 0x6d, 0x87, 0x62, 0x6d, 0x7a, 0x58, 0xc4, 0x6d,
-    0x79, 0x6d, 0x6c, 0x8d, 0x7a, 0x7f, 0x6d, 0x96, 0x87, 0x9e, 0x6d, 0x78,
-    0x82, 0x7f, 0x77, 0x77, 0xc1, 0x77, 0x9a, 0x84, 0x90, 0x7a, 0x7b, 0x7b,
-    0x66, 0x80, 0x7f, 0x88, 0x87, 0x5b, 0x7a, 0x8d, 0x61, 0xe3, 0x64, 0x9a,
-    0x74, 0x71, 0x6d, 0x7e, 0x8f, 0x67, 0x70, 0x6f, 0x78, 0x77, 0x79, 0x6f,
-    0x6b, 0x85, 0x82, 0x87, 0x83, 0x70, 0x7b, 0x65, 0x79, 0x83, 0x86, 0x72,
-    0x79, 0x7b, 0x72, 0x71, 0x7e, 0x84, 0x75, 0x68, 0x7e, 0x74, 0x78, 0x78,
-    0x58, 0x8b, 0x6f, 0x80, 0xa1, 0x62, 0x7e, 0x7b, 0x87, 0x72, 0x7d, 0x6d,
-    0x7e, 0x58, 0x74, 0x6a, 0x7a, 0x4e, 0x7b, 0x81, 0x5d, 0x82, 0x8b, 0x86,
-    0x83, 0x6c, 0x6f, 0x7d, 0x8d, 0x6e, 0x85, 0x8e, 0x87, 0x77, 0x8c, 0x8a,
-    0x75, 0x54, 0xac, 0x87, 0x5b, 0x66, 0x6c, 0x7a, 0x78, 0x79, 0xa6, 0x7f,
-    0x8d, 0x8e, 0x77, 0x79, 0x7c, 0x7d, 0x93, 0x90, 0x8b, 0x9a, 0x51, 0x78,
-    0x5c, 0x70, 0x7b, 0x79, 0xd3, 0x5d, 0x8c, 0x9c, 0x71, 0x76, 0x71, 0x7a,
-    0x4e, 0x56, 0x7d, 0x62, 0x84, 0x4b, 0x8d, 0x7c, 0x68, 0xe2, 0x9a, 0x93,
-    0x69, 0x61, 0x44, 0x83, 0x6f, 0x67, 0x94, 0x92, 0x69, 0x6a, 0x4c, 0x7c,
-    0x56, 0x6b, 0x92, 0xab, 0x77, 0xa6, 0x41, 0x48, 0x74, 0x9a, 0x61, 0x80,
-    0x43, 0x98, 0x8d, 0x9a, 0xa0, 0xa0, 0x51, 0x79, 0x94, 0x5a, 0x48, 0x75,
-    0x6d, 0x3a, 0x8a, 0x5b, 0x86, 0x71, 0x5a, 0x8a, 0xa2, 0x65, 0x67, 0x46,
-    0x8a, 0x61, 0x87, 0x6b, 0x99, 0x58, 0x77, 0x8d, 0x9f, 0xa1, 0x7b, 0x94,
-    0x7d, 0x72, 0x74, 0x79, 0x76, 0x76, 0x65, 0x71, 0x73, 0x6f, 0x75, 0x71,
-    0x74, 0x77, 0x78, 0x6c, 0x6d, 0x67, 0x7b, 0x6d, 0x70, 0x75, 0x6c, 0x71,
-    0x66, 0x82, 0x6f, 0x71, 0x72, 0x75, 0x6e, 0x74, 0x71, 0x72, 0x82, 0x6f,
-    0x77, 0x70, 0x7e, 0x71, 0x7a, 0x7e, 0x70, 0x62, 0x7c, 0x6f, 0x6f, 0x72,
-    0x7d, 0x6d, 0x74, 0x6f, 0x6c, 0x72, 0x67, 0x77, 0x74, 0x7b, 0x72, 0x7a,
-    0x9c, 0x55, 0x61, 0x81, 0x92, 0x81, 0x57, 0x89, 0x91, 0x5b, 0x8c, 0x9f,
-    0x64, 0x6c, 0x81, 0x72, 0x72, 0x61, 0x4b, 0x61, 0x5d, 0x64, 0xa2, 0x70,
-    0x64, 0x9e, 0x62, 0x86, 0x82, 0x76, 0x7b, 0x86, 0x7c, 0x56, 0x7a, 0x75,
-    0x60, 0x4b, 0xa3, 0x7f, 0xcb, 0x78, 0x57, 0x84, 0xac, 0x74, 0x6b, 0x7d,
-    0x80, 0x8b, 0x82, 0x7d, 0x8a, 0x63, 0x60, 0x83, 0x5e, 0xcb, 0x8c, 0x7c,
-    0x84, 0x7a, 0x58, 0x7b, 0x74, 0x67, 0x6c, 0x63, 0x80, 0x6e, 0x91, 0x79,
-    0x5c, 0x9f, 0x83, 0x5e, 0x8d, 0x7e, 0x87, 0x61, 0x6c, 0x5e, 0xae, 0x74,
-    0x86, 0x63, 0x7a, 0x67, 0x83, 0x84, 0x5f, 0x84, 0x65, 0x9c, 0x70, 0x76,
-    0x90, 0x92, 0x6b, 0x76, 0xc6, 0x7b, 0x89, 0x8c, 0x70, 0x6b, 0x6a, 0x49,
-    0x77, 0x4d, 0x7f, 0x90, 0x7a, 0x58, 0x62, 0x8a, 0x68, 0xdc, 0x6a, 0x90,
-    0x76, 0x4d, 0x80, 0x7d, 0x77, 0x76, 0x70, 0x76, 0x80, 0x81, 0x76, 0x87,
-    0x76, 0x69, 0x47, 0x8b, 0x75, 0x7c, 0x7a, 0x80, 0x83, 0x64, 0x84, 0x84,
-    0x58, 0x8c, 0x84, 0x6c, 0x66, 0x73, 0x71, 0x78, 0x72, 0x68, 0x6f, 0x81,
-    0x79, 0x6f, 0x6d, 0x84, 0xa6, 0x6e, 0x80, 0x5d, 0x84, 0x7c, 0x76, 0x82,
-    0x6d, 0x77, 0x70, 0x77, 0x76, 0x85, 0x7e, 0x7a, 0x77, 0x72, 0x8c, 0x87,
-    0x61, 0x8a, 0xc0, 0x96, 0x99, 0x7c, 0x78, 0x52, 0x8c, 0x7b, 0x81, 0x5d,
-    0x99, 0x63, 0x81, 0x69, 0x46, 0x6d, 0x6f, 0x95, 0x77, 0x50, 0x9c, 0x4b,
-    0x98, 0x77, 0x7c, 0x3f, 0x70, 0x8a, 0x85, 0x89, 0x82, 0x85, 0x8a, 0x8a,
-    0x84, 0x9c, 0x73, 0x7e, 0xc4, 0x87, 0x7a, 0x4b, 0x6f, 0x94, 0x93, 0x63,
-    0x91, 0x44, 0x7d, 0x77, 0x6a, 0x5f, 0x9d, 0x7d, 0x85, 0xd5, 0x8b, 0x75,
-    0x7f, 0x4b, 0x88, 0x7f, 0x98, 0x87, 0x8e, 0x59, 0x8b, 0x87, 0x95, 0x65,
-    0xa2, 0x8c, 0x70, 0x53, 0x77, 0x7b, 0x55, 0x66, 0x78, 0x68, 0xa4, 0x72,
-    0x60, 0x76, 0x8d, 0x8f, 0x7f, 0x8d, 0x80, 0x91, 0x71, 0x7a, 0x6d, 0x8f,
-    0x9b, 0x98, 0x8a, 0x7a, 0xcf, 0x7f, 0x8c, 0x75, 0x59, 0x64, 0x67, 0x6d,
-    0x72, 0x4e, 0x71, 0x89, 0x8b, 0x5b, 0x85, 0x78, 0x7f, 0xcf, 0x87, 0x89,
-    0x7e, 0x7d, 0x6c, 0x8c, 0x7d, 0x78, 0x6a, 0x76, 0x76, 0x7d, 0x5e, 0x70,
-    0x6b, 0x67, 0x7f, 0x71, 0x78, 0x76, 0x77, 0x72, 0x6b, 0x74, 0x73, 0x6d,
-    0x6e, 0x70, 0x65, 0x8e, 0x73, 0x64, 0x7b, 0x78, 0x73, 0x79, 0x81, 0x71,
-    0x6b, 0x75, 0x7f, 0x75, 0x9f, 0x83, 0x74, 0x7c, 0x52, 0x75, 0x2b, 0x71,
-    0x75, 0x7c, 0x75, 0x74, 0x71, 0x73, 0x6e, 0x7f, 0x78, 0x8b, 0x80, 0x77,
-    0x6b, 0x70, 0x73, 0x6e, 0x6f, 0x71, 0x72, 0x72, 0x72, 0x75, 0x71, 0x6e,
-    0x6d, 0x6f, 0x73, 0x72, 0x63, 0x78, 0x71, 0x6f, 0x77, 0x6a, 0x76, 0x75,
-    0x71, 0x76, 0x73, 0x72, 0x74, 0x6c, 0x71, 0x74, 0x7b, 0x72, 0x74, 0x70,
-    0x6b, 0x75, 0x69, 0x72, 0x74, 0x71, 0x78, 0x74, 0x73, 0x70, 0x75, 0x72,
-    0x71, 0x6c, 0x76, 0x67, 0x6b, 0x5d, 0x71, 0x83, 0x78, 0x71, 0x70, 0x6c,
-    0x70, 0x71, 0x5d, 0x76, 0x76, 0x75, 0x75, 0x74, 0x71, 0x6c, 0x71, 0x72,
-    0x77, 0x73, 0x6d, 0x6f, 0x77, 0x73, 0x73, 0x70, 0x73, 0x75, 0x6f, 0x71,
-    0x79, 0x70, 0x74, 0x70, 0x79, 0x77, 0x73, 0x72, 0x76, 0x6d, 0x6c, 0x73,
-    0x77, 0x6c, 0x78, 0x76, 0x82, 0x74, 0x75, 0x6f, 0x72, 0x7a, 0x5b, 0x76,
-    0x69, 0x70, 0x72, 0x75, 0x72, 0x7b, 0x68, 0x75, 0x76, 0x76, 0x6d, 0x71,
-    0x8e, 0x83, 0x5d, 0x77, 0x70, 0x5d, 0x91, 0x83, 0x6e, 0x71, 0xae, 0x68,
-    0x55, 0x65, 0x99, 0x81, 0x5d, 0x82, 0x56, 0x5a, 0x78, 0x7b, 0xb4, 0x68,
-    0x93, 0xb5, 0x9c, 0x92, 0x76, 0x80, 0x7a, 0x95, 0x79, 0x4f, 0x62, 0x82,
-    0x64, 0x81, 0x79, 0x6b, 0xd1, 0x63, 0x8e, 0x85, 0xa7, 0x67, 0x6a, 0x67,
-    0x7f, 0x5f, 0x73, 0xaa, 0x87, 0x5d, 0x8c, 0x75, 0x91, 0xd2, 0x5e, 0x86,
-    0x82, 0x58, 0x5a, 0x7e, 0x90, 0x47, 0x89, 0x5e, 0xa0, 0x8d, 0xa2, 0x8e,
-    0x5b, 0x56, 0x71, 0x97, 0x76, 0x7f, 0x76, 0x51, 0x68, 0x47, 0xb8, 0x4b,
-    0x60, 0x6d, 0x7b, 0x77, 0x9a, 0x89, 0x6f, 0x93, 0x67, 0x4d, 0x40, 0x48,
-    0x56, 0x72, 0x96, 0x51, 0xc1, 0x95, 0x82, 0x80, 0x74, 0x5c, 0x5b, 0x7e,
-    0x81, 0x12, 0x6d, 0xaa, 0x7d, 0x5c, 0x60, 0x76, 0x5e, 0xe3, 0x87, 0x7c,
-    0x86, 0x69, 0x74, 0x76, 0x82, 0x5f, 0x6d, 0x6d, 0x71, 0x74, 0x7a, 0x59,
-    0x74, 0x73, 0x71, 0x86, 0x72, 0x72, 0x6b, 0x5b, 0x77, 0x7a, 0xa6, 0x9e,
-    0x6d, 0x70, 0x92, 0x58, 0x9a, 0x6e, 0x6a, 0xa0, 0x89, 0x84, 0x8e, 0x90,
-    0x7b, 0x8c, 0x93, 0x6e, 0xce, 0x94, 0x85, 0x7a, 0x67, 0x6b, 0x71, 0x75,
-    0x75, 0x57, 0x6c, 0x77, 0x86, 0x5c, 0x79, 0x76, 0x85, 0x74, 0x6c, 0x81,
-    0x73, 0x73, 0x70, 0x73, 0x74, 0x72, 0x6b, 0x74, 0x74, 0x6d, 0x73, 0x70,
-    0x69, 0x6d, 0x73, 0x71, 0x75, 0x71, 0x73, 0x71, 0x70, 0x72, 0x70, 0x6f,
-    0x78, 0x71, 0x71, 0x75, 0x76, 0x72, 0x72, 0x6e, 0x72, 0x74, 0x6e, 0x6a,
-    0x73, 0x6f, 0x72, 0x75, 0x73, 0x7a, 0x71, 0x6e, 0x71, 0x73, 0x77, 0x72,
-    0x71, 0x72, 0x75, 0x70, 0x6f, 0x62, 0x74, 0x77, 0x73, 0x71, 0x71, 0x71,
-    0x54, 0x75, 0x75, 0x7a, 0x7d, 0x76, 0x7f, 0x6c, 0xb0, 0x9a, 0x79, 0x79,
-    0xad, 0x81, 0x65, 0x63, 0x7b, 0x7f, 0x8a, 0x71, 0x8e, 0x7d, 0xb0, 0xad,
-    0x92, 0x7b, 0x68, 0x63, 0x75, 0x56, 0x64, 0x5f, 0x66, 0x8e, 0x68, 0x99,
-    0xb5, 0x83, 0x7f, 0x7e, 0xca, 0x98, 0x83, 0x46, 0x71, 0x7d, 0x84, 0x92,
-    0x94, 0x65, 0x7a, 0xa0, 0x90, 0x58, 0x98, 0x69, 0x87, 0x77, 0x95, 0x6e,
-    0x64, 0x67, 0x82, 0x7e, 0x93, 0x85, 0x64, 0x6b, 0x87, 0x88, 0x8b, 0x4e,
-    0x87, 0xa4, 0x61, 0x57, 0x79, 0x8f, 0x6c, 0x63, 0x8c, 0x90, 0x90, 0x7a,
-    0x96, 0x72, 0x59, 0x51, 0x74, 0x87, 0x78, 0x7f, 0xb7, 0x9a, 0x9a, 0x87,
-    0x85, 0x8b, 0x80, 0x69, 0xd0, 0x9d, 0x7d, 0x85, 0x71, 0x76, 0x72, 0x64,
-    0x87, 0x82, 0x7a, 0x83, 0x86, 0x61, 0xb1, 0x80, 0x76, 0xda, 0x77, 0x6f,
-    0x6b, 0x6b, 0x67, 0x7f, 0x89, 0x66, 0x7d, 0x5e, 0x6c, 0x80, 0x80, 0x67,
-    0x88, 0x6a, 0x85, 0x73, 0x73, 0x7e, 0x74, 0x6b, 0x87, 0x6e, 0x7b, 0x64,
-    0x9b, 0x71, 0x5e, 0x85, 0x7a, 0x73, 0x65, 0x8b, 0x6c, 0x8a, 0x7f, 0x60,
-    0x68, 0x6c, 0x8f, 0x5c, 0xa0, 0x7c, 0x6f, 0x7f, 0x85, 0x6f, 0x83, 0x67,
-    0x65, 0x55, 0x7b, 0x6f, 0x77, 0x45, 0x71, 0x76, 0x69, 0x86, 0x73, 0x61,
-    0x50, 0x80, 0x96, 0x7b, 0x91, 0x9d, 0x7d, 0x80, 0x77, 0xa9, 0x91, 0x7e,
-    0x8d, 0x88, 0x69, 0x8f, 0x97, 0x68, 0x7c, 0x76, 0x78, 0x96, 0x8b, 0x63,
-    0x90, 0x6b, 0x66, 0x52, 0x70, 0x79, 0x78, 0x94, 0x81, 0x96, 0x84, 0x99,
-    0x9b, 0xa1, 0x7b, 0x9a, 0xd3, 0x9e, 0x87, 0x52, 0x75, 0x69, 0x69, 0x6f,
-    0x78, 0x91, 0x91, 0x86, 0x82, 0x5a, 0x7e, 0x82, 0x75, 0xdc, 0xa7, 0x61,
-    0x72, 0x3d, 0x7a, 0x8a, 0x68, 0x5f, 0x73, 0x7c, 0x7e, 0x69, 0x7e, 0x6d,
-    0x7d, 0x72, 0x64, 0x6f, 0x7f, 0x79, 0x7d, 0x79, 0x73, 0x78, 0x76, 0x7c,
-    0x73, 0x75, 0x73, 0x70, 0x71, 0x74, 0x7c, 0x80, 0x79, 0x6e, 0x6f, 0x6e,
-    0x82, 0x80, 0x7a, 0x6e, 0x85, 0x7f, 0x73, 0x70, 0x8d, 0x76, 0x7c, 0x7c,
-    0x80, 0x6c, 0x6e, 0x7b, 0x7b, 0x62, 0x73, 0x77, 0x7a, 0x88, 0x7f, 0x7c,
-    0x65, 0x6e, 0x75, 0x7a, 0x93, 0xa7, 0x82, 0x84, 0x85, 0x9b, 0x8e, 0x7a,
-    0x93, 0x8e, 0x73, 0x6e, 0x5f, 0x64, 0x7f, 0x74, 0x76, 0x77, 0x60, 0x5f,
-    0xa5, 0x81, 0x7f, 0x64, 0x73, 0x57, 0x6f, 0x9c, 0x65, 0xa1, 0x8b, 0x85,
-    0x82, 0x91, 0x80, 0x6a, 0xc9, 0x80, 0x80, 0x51, 0x6d, 0x87, 0x9c, 0x8e,
-    0x89, 0x51, 0x6d, 0x85, 0x76, 0x53, 0x7c, 0x84, 0x5e, 0xd2, 0x81, 0x82,
-    0x72, 0x78, 0x78, 0x80, 0x6b, 0x6e, 0x80, 0x76, 0x76, 0x72, 0x80, 0x79,
-    0x77, 0x78, 0x72, 0x73, 0x6c, 0x6f, 0x6c, 0x71, 0x73, 0x6e, 0x7d, 0x72,
-    0x7b, 0x51, 0x4f, 0x74, 0x76, 0x6b, 0x72, 0x7b, 0x75, 0x6f, 0x80, 0x76,
-    0x6f, 0x7f, 0x7e, 0x73, 0x83, 0x7b, 0x73, 0x5f, 0x78, 0x70, 0x77, 0x7b,
-    0x70, 0x7f, 0x74, 0x6c, 0x73, 0x68, 0x72, 0x79, 0x67, 0x77, 0x74, 0x82,
-    0x83, 0x63, 0x7f, 0x82, 0x7a, 0x7b, 0x7a, 0x57, 0x7f, 0x8a, 0x83, 0x8e,
-    0x75, 0x77, 0x68, 0x8d, 0x73, 0x75, 0x63, 0x88, 0x75, 0x74, 0x6b, 0x7c,
-    0x80, 0x88, 0x78, 0x5a, 0x81, 0x6a, 0x69, 0x83, 0x75, 0x6a, 0x86, 0x8f,
-    0x73, 0x7f, 0x90, 0x7b, 0xad, 0x6d, 0x83, 0x5e, 0x83, 0x7f, 0x81, 0x88,
-    0x73, 0x71, 0x6b, 0x77, 0x70, 0x7c, 0x70, 0x79, 0x71, 0x80, 0x83, 0x89,
-    0x71, 0x68, 0x69, 0x77, 0x78, 0x68, 0x73, 0x6b, 0x72, 0x6b, 0x73, 0x73,
-    0x73, 0x65, 0x63, 0x6a, 0x78, 0x6f, 0x6c, 0x74, 0x70, 0x7a, 0x64, 0x7b,
-    0x72, 0x70, 0x74, 0x62, 0x74, 0x72, 0x71, 0x7b, 0x6d, 0x6e, 0x75, 0x70,
-    0x78, 0x6f, 0x75, 0x6b, 0x7b, 0x7d, 0x76, 0x6c, 0x7a, 0x6c, 0x69, 0x6c,
-    0x74, 0x76, 0x72, 0x78, 0x79, 0x5c, 0x76, 0x6f, 0x79, 0x7b, 0x66, 0x6b,
-    0x6e, 0x79, 0x71, 0x7c, 0x74, 0x77, 0x7a, 0x78, 0x74, 0x78, 0x72, 0x7a,
-    0x73, 0x6a, 0x70, 0x7a, 0x80, 0x76, 0x6c, 0x72, 0x74, 0x74, 0x76, 0x76,
-    0x73, 0x47, 0x70, 0x78, 0x76, 0x7b, 0x72, 0x73, 0x7b, 0x72, 0x72, 0x7e,
-    0x5e, 0x7a, 0x79, 0x75, 0x7f, 0x6f, 0x78, 0x73, 0x73, 0x74, 0x85, 0x79,
-    0x77, 0x74, 0x76, 0x70, 0x6d, 0x71, 0x78, 0x74, 0x75, 0x78, 0x77, 0x75,
-    0x68, 0x74, 0x64, 0x7a, 0x85, 0x8f, 0x84, 0x86, 0x6d, 0x7c, 0x7a, 0x5d,
-    0x91, 0x7a, 0x5f, 0x77, 0x74, 0x64, 0x5a, 0x50, 0x73, 0x82, 0xca, 0x7b,
-    0x9b, 0x68, 0x72, 0x4f, 0x87, 0x8a, 0x74, 0xbf, 0x78, 0x58, 0x5b, 0x75,
-    0x62, 0x5a, 0x86, 0x64, 0xc9, 0x9c, 0xa7, 0x79, 0x81, 0x8c, 0x4b, 0x97,
-    0x7f, 0x59, 0x74, 0x82, 0x75, 0x5d, 0x5a, 0x75, 0x5a, 0xdd, 0x93, 0x9e,
-    0x8d, 0x5b, 0x75, 0x89, 0xa6, 0x58, 0x8e, 0x63, 0x91, 0x91, 0xb9, 0x5d,
-    0x8a, 0x64, 0x71, 0x89, 0x5d, 0x8f, 0x61, 0x69, 0x82, 0x45, 0xbb, 0x66,
-    0x7e, 0xa5, 0x71, 0xac, 0x80, 0x9d, 0x84, 0x90, 0x90, 0x96, 0x65, 0x6a,
-    0x6d, 0x70, 0x7c, 0x5b, 0xcb, 0x8a, 0x81, 0x75, 0x72, 0x73, 0x72, 0x7d,
-    0x81, 0x70, 0x85, 0xa0, 0x87, 0x64, 0x84, 0x75, 0x90, 0x7a, 0xa1, 0x66,
-    0x4d, 0x5c, 0x8d, 0x7c, 0x7a, 0x7b, 0x76, 0x79, 0x73, 0x5c, 0x6e, 0x8d,
-    0x7f, 0x6a, 0x67, 0x70, 0x57, 0x7b, 0x8e, 0x87, 0x7a, 0x81, 0x7c, 0x7c,
-    0x7f, 0x8e, 0x8b, 0x7f, 0x67, 0x7c, 0x69, 0x76, 0x5e, 0x7a, 0x8c, 0x82,
-    0x88, 0x64, 0x7c, 0x78, 0x8d, 0x80, 0x6d, 0x82, 0x89, 0x5f, 0x7a, 0x8a,
-    0x6d, 0x68, 0x64, 0x78, 0x7b, 0x95, 0x89, 0x80, 0x5c, 0x86, 0x7f, 0x91,
-    0x58, 0x6e, 0x59, 0x80, 0x7f, 0x5d, 0x5c, 0x7e, 0x95, 0x7e, 0x9e, 0x68,
-    0x5c, 0x6b, 0x76, 0x82, 0x5a, 0x8e, 0x68, 0x77, 0x86, 0x7d, 0xa0, 0x52,
-    0x83, 0x97, 0x6a, 0x61, 0x77, 0x75, 0x6d, 0x8b, 0x8e, 0x67, 0x7e, 0x85,
-    0x91, 0x52, 0x8f, 0x54, 0xaa, 0x8f, 0x81, 0x95, 0x71, 0x45, 0x7a, 0x5e,
-    0x7d, 0x52, 0x7a, 0x8c, 0x8a, 0x61, 0x5f, 0x7d, 0x83, 0x95, 0x5e, 0x84,
-    0x79, 0x74, 0x70, 0x7a, 0x72, 0x77, 0x7b, 0x72, 0x71, 0x6d, 0x72, 0x6f,
-    0x7b, 0x7c, 0x7d, 0x78, 0x6e, 0x6f, 0x73, 0x6d, 0x76, 0x74, 0x70, 0x72,
-    0x6d, 0x74, 0x73, 0x74, 0x70, 0x6a, 0x6f, 0x73, 0x72, 0x74, 0x7f, 0x70,
-    0x78, 0x7e, 0x73, 0x6e, 0x7a, 0x7c, 0x70, 0x80, 0x71, 0x6f, 0x83, 0x7c,
-    0x7b, 0x73, 0x75, 0x76, 0x68, 0x77, 0x7f, 0x7b, 0x6f, 0x6e, 0x7c, 0x76,
-    0x7e, 0x59, 0x71, 0x77, 0x77, 0x77, 0x8c, 0x78, 0x95, 0x73, 0x88, 0x7a,
-    0x72, 0x78, 0x60, 0x80, 0x88, 0x73, 0x84, 0x68, 0x5c, 0x77, 0xa6, 0x53,
-    0x4c, 0x67, 0x83, 0x55, 0x83, 0x94, 0x6a, 0x8b, 0x7a, 0x92, 0x4c, 0x64,
-    0x71, 0x73, 0x9a, 0x67, 0xc0, 0x81, 0x64, 0x71, 0x99, 0x71, 0x47, 0x89,
-    0x84, 0x87, 0x76, 0x86, 0x83, 0x57, 0x89, 0x7f, 0x7e, 0xbd, 0x66, 0x91,
-    0x79, 0x76, 0x7a, 0x7a, 0x79, 0x75, 0x73, 0x71, 0x74, 0x73, 0x70, 0x70,
-    0x79, 0x76, 0x75, 0x71, 0x5d, 0x7a, 0x73, 0x76, 0x73, 0x75, 0x6c, 0x70,
-    0x66, 0x7f, 0x78, 0x72, 0x73, 0x79, 0x73, 0x75, 0x70, 0x78, 0x77, 0x74,
-    0x7b, 0x6d, 0x74, 0x74, 0x81, 0x76, 0x71, 0x7f, 0x74, 0x7b, 0x8b, 0x6e,
-    0x72, 0x71, 0x74, 0x72, 0x78, 0x77, 0x71, 0x73, 0x73, 0x79, 0x76, 0x72,
-    0x67, 0x8a, 0x94, 0x7f, 0x82, 0x86, 0x80, 0x5f, 0x95, 0x92, 0x95, 0x54,
-    0x95, 0x8f, 0x76, 0x83, 0x6a, 0x7b, 0x8b, 0x72, 0x7e, 0x7c, 0xb4, 0x64,
-    0x94, 0x67, 0x7d, 0x46, 0x84, 0x64, 0x76, 0x96, 0x83, 0x85, 0x76, 0x9c,
-    0x94, 0xa1, 0x97, 0x7f, 0xca, 0x98, 0x85, 0x4d, 0x2f, 0x76, 0x6a, 0x9e,
-    0x84, 0x81, 0x83, 0x78, 0x80, 0x5d, 0x95, 0x76, 0x5f, 0xdc, 0x78, 0x7c,
-    0x75, 0x6f, 0x79, 0x8d, 0x7a, 0x68, 0x78, 0x63, 0x63, 0x6b, 0x6e, 0x6a,
-    0x70, 0x71, 0x78, 0x7a, 0x73, 0x6f, 0x73, 0x81, 0x7d, 0x6c, 0x76, 0x4a,
-    0x7b, 0x79, 0x73, 0x69, 0x77, 0x8a, 0x77, 0x6c, 0x6c, 0x70, 0x87, 0x68,
-    0x7f, 0x7e, 0x69, 0x6d, 0xa4, 0x69, 0x68, 0x70, 0x77, 0x73, 0x87, 0x61,
-    0x6f, 0x71, 0x77, 0x6f, 0x71, 0x43, 0x7b, 0x6e, 0x79, 0x9d, 0x62, 0x81,
-    0x6e, 0x56, 0x61, 0x77, 0x35, 0x64, 0x72, 0x71, 0x6b, 0x6f, 0x6d, 0x78,
-    0x6e, 0x69, 0x69, 0x35, 0x73, 0x6a, 0x80, 0x5d, 0x6f, 0x53, 0x6f, 0x75,
-    0x76, 0x73, 0x75, 0x67, 0x7c, 0x6f, 0x71, 0x76, 0x67, 0x68, 0x77, 0x42,
-    0x76, 0x4d, 0x6e, 0x63, 0x69, 0x6c, 0x74, 0x76, 0x66, 0x3a, 0x6f, 0x64,
-    0x88, 0x71, 0x70, 0x5c, 0x44, 0x74, 0x6c, 0x7c, 0x69, 0x78, 0x59, 0x72,
-    0x6c, 0x85, 0x75, 0x7b, 0x81, 0x93, 0x78, 0x78, 0x7e, 0xb3, 0x8d, 0x70,
-    0x8a, 0x49, 0x70, 0x7e, 0x4b, 0x57, 0x78, 0x7f, 0x83, 0x57, 0xa5, 0x63,
-    0x7f, 0x9b, 0x95, 0x5e, 0x7d, 0x5e, 0x84, 0x97, 0x8d, 0x59, 0x9b, 0x8e,
-    0x90, 0x81, 0x7e, 0x79, 0xc5, 0x91, 0x82, 0x6c, 0xa4, 0x86, 0x70, 0x8d,
-    0x65, 0x7e, 0x8b, 0x7e, 0x7b, 0x64, 0x8b, 0x88, 0x42, 0xb8, 0x88, 0x9a,
-    0x6f, 0x79, 0x7d, 0x85, 0x75, 0x74, 0x70, 0x79, 0x7d, 0x6e, 0x73, 0x6e,
-    0x65, 0x72, 0x78, 0x78, 0x7c, 0x7a, 0x59, 0x70, 0x77, 0x75, 0x80, 0x79,
-    0x7f, 0x6b, 0x6d, 0x72, 0x71, 0x74, 0x71, 0x76, 0x79, 0x73, 0x7a, 0x82,
-    0x77, 0x83, 0x74, 0x73, 0x8f, 0x84, 0x70, 0x77, 0x7d, 0x73, 0x84, 0x7a,
-    0x6b, 0x7f, 0x73, 0x72, 0x78, 0x76, 0x67, 0x75, 0x77, 0x82, 0x85, 0x71,
-    0x70, 0x5e, 0x3d, 0x95, 0x7e, 0x5c, 0x84, 0x89, 0x69, 0x57, 0x4c, 0xab,
-    0x46, 0x58, 0xae, 0xa8, 0x9b, 0x95, 0x4c, 0x43, 0x90, 0x68, 0x49, 0x75,
-    0x24, 0x98, 0x7d, 0x98, 0x87, 0xbf, 0x64, 0x92, 0x95, 0x53, 0x44, 0x69,
-    0x6f, 0x6e, 0x90, 0x65, 0x9b, 0x6d, 0x51, 0x9b, 0xa4, 0x4c, 0x8d, 0x54,
-    0x7d, 0x54, 0xa0, 0x66, 0x80, 0x3d, 0x7e, 0xa4, 0xa4, 0x92, 0x57, 0x81,
-    0x78, 0x6f, 0x95, 0x7d, 0x8c, 0x6a, 0x6f, 0x65, 0x77, 0x71, 0x76, 0x6a,
-    0x8d, 0x88, 0x35, 0x68, 0x79, 0x50, 0x89, 0x7a, 0x7c, 0x93, 0x9e, 0x51,
-    0x93, 0x75, 0x86, 0x46, 0x74, 0x4b, 0x79, 0x98, 0x7c, 0x89, 0x71, 0x78,
-    0xa6, 0x7e, 0x84, 0x74, 0xce, 0xa0, 0x6c, 0x7c, 0x7e, 0x7d, 0x86, 0x65,
-    0x89, 0x4d, 0x6c, 0x87, 0x77, 0x57, 0x9b, 0x71, 0x58, 0xcf, 0x8f, 0x76,
-    0x7a, 0x72, 0x79, 0x77, 0x6d, 0x65, 0x87, 0x74, 0x7c, 0x70, 0x74, 0x70,
-    0x81, 0x77, 0x7a, 0x74, 0x67, 0x79, 0x64, 0x70, 0x7d, 0x6f, 0x7e, 0x7d,
-    0x7c, 0x66, 0x6f, 0x72, 0x72, 0x6d, 0x71, 0x74, 0x76, 0x75, 0x7b, 0x69,
-    0x72, 0x7f, 0x78, 0x78, 0x7b, 0x70, 0x74, 0x89, 0x7d, 0x74, 0x82, 0x7b,
-    0x71, 0x78, 0x71, 0x69, 0x5f, 0x73, 0x6b, 0x74, 0x73, 0x76, 0x78, 0x76,
-    0x86, 0x4e, 0x80, 0x8b, 0x4e, 0x5b, 0x7d, 0x65, 0x67, 0x76, 0x82, 0x73,
-    0x84, 0x7d, 0x71, 0x78, 0x7d, 0x76, 0x89, 0x70, 0x73, 0x8c, 0x8b, 0x82,
-    0x82, 0x76, 0x7f, 0x78, 0x70, 0x7a, 0x73, 0x80, 0x81, 0x78, 0x7b, 0x6d,
-    0x74, 0x71, 0x7c, 0x6c, 0xa8, 0x8a, 0x65, 0x73, 0x8a, 0x7d, 0x92, 0x5e,
-    0x67, 0x61, 0x6d, 0x6e, 0x8f, 0x4d, 0x73, 0x78, 0x5a, 0x9a, 0x6b, 0x76,
-    0x59, 0x73, 0x61, 0x79, 0x88, 0x5f, 0x70, 0x6a, 0x96, 0x6b, 0x7c, 0x8a,
-    0x98, 0x3b, 0x80, 0x7d, 0x81, 0x73, 0x84, 0x82, 0x96, 0x97, 0x94, 0x74,
-    0x75, 0x80, 0x6c, 0x8f, 0x76, 0x86, 0x61, 0x9f, 0x91, 0x78, 0x68, 0x69,
-    0x86, 0x5a, 0x7c, 0x7a, 0xcb, 0xb0, 0x7a, 0xac, 0x72, 0x93, 0x7a, 0x6c,
-    0x68, 0x56, 0x82, 0x8d, 0x87, 0x60, 0x88, 0x71, 0x51, 0xa3, 0xa7, 0xa3,
-    0x6c, 0x6c, 0x6e, 0x76, 0x76, 0x6c, 0x73, 0x6e, 0x6d, 0x70, 0x74, 0x74,
-    0x75, 0x6e, 0x6e, 0x70, 0x73, 0x6d, 0x72, 0x71, 0x72, 0x78, 0x64, 0x73,
-    0x71, 0x73, 0x77, 0x70, 0x74, 0x74, 0x71, 0x70, 0x70, 0x73, 0x6b, 0x71,
-    0x73, 0x6c, 0x75, 0x72, 0x74, 0x7c, 0x73, 0x70, 0x75, 0x6e, 0x6f, 0x6f,
-    0x78, 0x71, 0x72, 0x75, 0x74, 0x63, 0x74, 0x70, 0x7a, 0x71, 0x65, 0x70,
-    0x7e, 0xb2, 0x99, 0x54, 0xb1, 0x95, 0x21, 0x42, 0x98, 0x87, 0xc1, 0x12,
-    0x98, 0xd8, 0x3a, 0x58, 0x42, 0x30, 0xbd, 0xad, 0xa0, 0x7b, 0xd3, 0x9e,
-    0xb7, 0x1e, 0x31, 0x4f, 0x64, 0x33, 0xa0, 0x18, 0x52, 0x93, 0x70, 0xdd,
-    0x9b, 0x71, 0x4f, 0xe3, 0x61, 0x89, 0xb0, 0x2d, 0x55, 0x93, 0xbc, 0x93,
-    0x13, 0x7a, 0x80, 0x86, 0x2f, 0xae, 0x86, 0x39, 0x50, 0x1e, 0xca, 0x3d,
-    0x93, 0x4d, 0x66, 0x7b, 0x7c, 0xb6, 0x5e, 0x6e, 0xa3, 0x79, 0x78, 0x8b,
-    0x63, 0x61, 0xae, 0xb2, 0x8c, 0x92, 0x75, 0x62, 0x80, 0x78, 0x7b, 0x63,
-    0x5e, 0x7d, 0x5b, 0x94, 0x70, 0x7c, 0x5e, 0x95, 0x90, 0x6e, 0x85, 0x6b,
-    0x7d, 0x58, 0xae, 0x7e, 0xcd, 0xa8, 0x5e, 0x71, 0x93, 0x72, 0x6c, 0x6b,
-    0x61, 0x6c, 0x84, 0x8c, 0x66, 0x65, 0x82, 0x88, 0x4e, 0xd7, 0x65, 0x84,
-    0x77, 0x78, 0x69, 0x81, 0x72, 0x4e, 0x70, 0x76, 0x6a, 0x71, 0x7c, 0x74,
-    0x74, 0x71, 0x78, 0x7d, 0x74, 0x76, 0x72, 0x74, 0x70, 0x7f, 0x66, 0x66,
-    0x74, 0x64, 0x7a, 0x75, 0x71, 0x6c, 0x74, 0x65, 0x6c, 0x72, 0x75, 0x7d,
-    0x7f, 0x86, 0x75, 0x73, 0x96, 0x71, 0x6a, 0x6f, 0x6a, 0x6f, 0x83, 0x5f,
-    0x79, 0x6e, 0x73, 0x73, 0x71, 0x67, 0x80, 0x73, 0x7c, 0x83, 0x74, 0x7e,
-    0x73, 0x80, 0x76, 0x81, 0x6d, 0x75, 0x80, 0x73, 0x70, 0x7c, 0x7d, 0x6c,
-    0x62, 0x5d, 0x5d, 0x7a, 0x74, 0x76, 0x75, 0x71, 0x6a, 0x66, 0x73, 0x84,
-    0x70, 0x7d, 0x76, 0x77, 0x71, 0x7d, 0x7c, 0x6e, 0x76, 0x77, 0x8d, 0x76,
-    0x75, 0x7f, 0x64, 0x6e, 0x85, 0x6c, 0x6c, 0x73, 0x55, 0x77, 0x43, 0x71,
-    0x72, 0x73, 0x71, 0x74, 0x71, 0x70, 0x6b, 0x71, 0x80, 0x82, 0x85, 0x6a,
-    0x68, 0x7c, 0x6a, 0x80, 0x73, 0x71, 0x7a, 0x6f, 0x6d, 0x71, 0x82, 0x49,
-    0x7c, 0x66, 0x34, 0x74, 0x71, 0x74, 0x73, 0x73, 0x7d, 0x7b, 0x7d, 0x6f,
-    0x7d, 0x72, 0x6e, 0x61, 0x77, 0x6f, 0x7c, 0x78, 0x71, 0x73, 0x7f, 0x79,
-    0x79, 0x77, 0x6e, 0x7b, 0x8f, 0x78, 0x72, 0x6d, 0x32, 0x79, 0x75, 0x68,
-    0x74, 0x6f, 0x6b, 0x72, 0x77, 0x46, 0x78, 0x78, 0x77, 0x82, 0x6f, 0x77,
-    0x70, 0x72, 0x74, 0x73, 0x6f, 0x71, 0x73, 0x70, 0x72, 0x71, 0x70, 0x6a,
-    0x76, 0x6e, 0x75, 0x70, 0x74, 0x70, 0x76, 0x71, 0x73, 0x74, 0x73, 0x71,
-    0x6c, 0x73, 0x75, 0x76, 0x74, 0x68, 0x72, 0x74, 0x70, 0x73, 0x71, 0x6f,
-    0x73, 0x6e, 0x77, 0x70, 0x73, 0x71, 0x71, 0x76, 0x7a, 0x76, 0x74, 0x72,
-    0x74, 0x74, 0x74, 0x71, 0x75, 0x70, 0x71, 0x72, 0x74, 0x73, 0x75, 0x71,
-    0x89, 0x61, 0x78, 0x93, 0x5e, 0x55, 0x83, 0x7c, 0x60, 0x84, 0x78, 0x86,
-    0x6a, 0xa2, 0x89, 0x6d, 0x71, 0x76, 0x90, 0x53, 0x6d, 0x8c, 0x82, 0x77,
-    0x98, 0x76, 0x67, 0x6d, 0x78, 0x8e, 0x7a, 0x7e, 0x78, 0x87, 0x73, 0x7d,
-    0x82, 0x79, 0x65, 0x78, 0x83, 0x4b, 0x7f, 0x5a, 0x95, 0x64, 0x92, 0x65,
-    0x92, 0x5e, 0x6d, 0x7b, 0x8d, 0x5c, 0x69, 0x78, 0x6c, 0xb2, 0x93, 0x83,
-    0x6d, 0x4d, 0x71, 0x78, 0x7a, 0x6a, 0x9e, 0x8e, 0x66, 0x75, 0x5e, 0x67,
-    0x62, 0x66, 0x7d, 0x9c, 0x80, 0x93, 0x46, 0x5b, 0x56, 0x31, 0x4a, 0x74,
-    0x52, 0x89, 0x93, 0x91, 0x96, 0x7d, 0x53, 0x78, 0x82, 0x62, 0x2d, 0x73,
-    0x57, 0x63, 0x80, 0x76, 0x87, 0x6a, 0x58, 0x78, 0x8d, 0x61, 0x61, 0x65,
-    0x64, 0x63, 0x8b, 0x70, 0x8e, 0x6b, 0x71, 0x78, 0x8d, 0x8d, 0x65, 0x97,
-    0x69, 0x78, 0x83, 0x72, 0x63, 0x5b, 0x71, 0x78, 0x81, 0x86, 0x75, 0x78,
-    0x73, 0x73, 0x7b, 0x7a, 0x5b, 0x70, 0x7b, 0x83, 0x7c, 0x68, 0x7f, 0x7b,
-    0x67, 0x75, 0x59, 0x71, 0x63, 0x6f, 0x6d, 0x73, 0x6e, 0x7b, 0x7b, 0x5c,
-    0x6f, 0x87, 0x36, 0x72, 0x7c, 0x72, 0x7a, 0x6f, 0x72, 0x5f, 0x71, 0x6a,
-    0x80, 0x7f, 0x73, 0x60, 0x7b, 0x69, 0x7a, 0x80, 0x64, 0x70, 0x71, 0x78,
-    0x61, 0x71, 0x45, 0x7c, 0x7b, 0x7b, 0x73, 0x6f, 0x6e, 0x6d, 0x81, 0x6c,
-    0x77, 0x95, 0x94, 0x79, 0x80, 0x74, 0x83, 0x67, 0x7f, 0x89, 0x8b, 0x67,
-    0x53, 0x8e, 0x72, 0x55, 0x7e, 0x77, 0x6f, 0x92, 0x72, 0x7d, 0x8f, 0x75,
-    0x6c, 0x8b, 0x74, 0x63, 0x9c, 0x4d, 0x80, 0x84, 0x8c, 0x73, 0x8e, 0x79,
-    0x78, 0x5c, 0x6c, 0x7b, 0x7e, 0x57, 0x88, 0x8e, 0x6e, 0x85, 0x7a, 0x7b,
-    0x7f, 0x70, 0x82, 0x49, 0x73, 0x71, 0x70, 0x79, 0x85, 0x68, 0x88, 0x82,
-    0x6c, 0x83, 0x8e, 0x71, 0x72, 0x6f, 0x7b, 0x70, 0x70, 0x68, 0x82, 0x9a,
-    0x65, 0x7a, 0x73, 0x86, 0x74, 0x5e, 0x6a, 0x72, 0x75, 0x83, 0x7c, 0x69,
-    0x74, 0x7d, 0x7b, 0x7a, 0x84, 0x7f, 0x72, 0x83, 0x93, 0x63, 0x5a, 0x76,
-    0x70, 0x7d, 0x7c, 0x6f, 0x73, 0x74, 0x89, 0x79, 0x67, 0x6e, 0x15, 0x76,
-    0x5b, 0x96, 0x80, 0x7d, 0x83, 0xaa, 0x53, 0x6f, 0x88, 0x8d, 0x9b, 0x4d,
-    0xaa, 0x76, 0x50, 0x56, 0x61, 0x96, 0x7c, 0x68, 0x8e, 0x68, 0xb5, 0x66,
-    0x97, 0x77, 0x66, 0x6a, 0x6a, 0x4f, 0x78, 0x91, 0x86, 0x86, 0x98, 0x81,
-    0x93, 0x95, 0x77, 0x78, 0xcc, 0x8b, 0x98, 0x69, 0x5a, 0x79, 0x66, 0x5a,
-    0x7c, 0x58, 0x78, 0x8a, 0x8c, 0x51, 0x9f, 0x6a, 0x68, 0x73, 0xb3, 0x8d,
-    0x7f, 0x64, 0x7d, 0x80, 0x7a, 0x79, 0x79, 0x67, 0x7e, 0x88, 0x88, 0x80,
-    0x55, 0x63, 0x55, 0x97, 0x70, 0x55, 0x46, 0x68, 0x95, 0x64, 0xbe, 0x9d,
-    0x5e, 0x5c, 0x78, 0x6a, 0x6a, 0x82, 0x78, 0x8f, 0x6c, 0xa0, 0x67, 0x7f,
-    0x9a, 0x8b, 0x88, 0x76, 0xcb, 0x7e, 0x77, 0x86, 0x6e, 0x83, 0x72, 0x6e,
-    0x87, 0x9f, 0x8b, 0x93, 0x86, 0x61, 0x8b, 0x7a, 0x65, 0xda, 0x79, 0x7f,
-    0x71, 0x50, 0x78, 0x85, 0x61, 0x68, 0x6b, 0x78, 0x73, 0x62, 0x83, 0x75,
-    0x43, 0x84, 0x6d, 0x7e, 0x7f, 0x71, 0x83, 0x7a, 0x71, 0x79, 0x70, 0x73,
-    0x7d, 0x7a, 0x6f, 0x74, 0x78, 0x7a, 0x79, 0x77, 0x79, 0x6a, 0x7b, 0x6f,
-    0x75, 0x83, 0x72, 0x6e, 0x95, 0x66, 0x72, 0x77, 0x91, 0x76, 0x88, 0x66,
-    0x7f, 0x6a, 0x74, 0x77, 0x79, 0x45, 0x7f, 0x76, 0x78, 0x88, 0x7d, 0x76,
-    0x74, 0x72, 0x7e, 0x80, 0x76, 0x7c, 0x78, 0x75, 0x6d, 0x6f, 0x6d, 0x71,
-    0x73, 0x5d, 0x68, 0x75, 0x78, 0x76, 0x78, 0x73, 0x70, 0x70, 0x76, 0x43,
-    0x74, 0x77, 0x77, 0x71, 0x75, 0x78, 0x6f, 0x7b, 0x71, 0x76, 0x7e, 0x74,
-    0x6b, 0x78, 0x76, 0x75, 0x78, 0x72, 0x79, 0x71, 0x71, 0x70, 0x66, 0x7f,
-    0x78, 0x76, 0x74, 0x74, 0x70, 0x77, 0x64, 0x76, 0x71, 0x76, 0x70, 0x7a,
-    0x64, 0x81, 0x5e, 0x92, 0x71, 0x5c, 0x7f, 0x73, 0x6e, 0x70, 0x58, 0x85,
-    0x70, 0x75, 0x98, 0x6e, 0x5b, 0x78, 0x82, 0x6c, 0x6d, 0x5a, 0x76, 0x52,
-    0x78, 0x7a, 0x73, 0x68, 0x6f, 0x82, 0x78, 0x75, 0x6d, 0x7f, 0x6f, 0x7c,
-    0x70, 0x8b, 0x7d, 0x81, 0xa3, 0x67, 0x6b, 0x72, 0x81, 0x7e, 0x7a, 0x58,
-    0x75, 0x55, 0x78, 0x74, 0x6c, 0x72, 0x76, 0x6c, 0x7e, 0xa9, 0x7c, 0x64,
-    0x41, 0x56, 0x61, 0x47, 0x68, 0x6b, 0x73, 0x65, 0x65, 0x6b, 0x65, 0x76,
-    0x7c, 0x6d, 0x5c, 0x4e, 0x6f, 0x63, 0x72, 0x53, 0x67, 0x33, 0x68, 0x7a,
-    0x72, 0x72, 0x7e, 0x55, 0x73, 0x6a, 0x6e, 0x80, 0x63, 0x6b, 0x70, 0x36,
-    0x70, 0x58, 0x5e, 0x6b, 0x4f, 0x67, 0x6c, 0x6d, 0x53, 0x60, 0x69, 0x59,
-    0x87, 0x77, 0x79, 0x60, 0x70, 0x74, 0x6e, 0x78, 0x59, 0x72, 0x5a, 0x69,
-    0x8e, 0x7c, 0x83, 0x89, 0x97, 0x9d, 0x72, 0x89, 0x89, 0x6a, 0x95, 0x55,
-    0x9f, 0x75, 0x84, 0x71, 0x67, 0x79, 0x56, 0x79, 0x7f, 0x84, 0xb6, 0x5a,
-    0x89, 0x6c, 0x5e, 0x6e, 0x8f, 0x77, 0x6d, 0x83, 0x85, 0x97, 0x8d, 0x90,
-    0x9f, 0x8b, 0x81, 0x88, 0xcc, 0x9b, 0x9a, 0x6d, 0x77, 0x8a, 0x86, 0x65,
-    0x62, 0x55, 0x8d, 0x83, 0x96, 0x5f, 0xa0, 0x6c, 0x73, 0x7f, 0x9e, 0x6c,
-    0x69, 0x6c, 0x6f, 0x8f, 0x8a, 0x90, 0x7c, 0x66, 0x61, 0x6e, 0x5a, 0x81,
-    0x6b, 0x90, 0x68, 0x4e, 0x75, 0x90, 0x4b, 0x70, 0x59, 0x4b, 0x74, 0x88,
-    0x70, 0x9f, 0x8f, 0x61, 0x82, 0x7d, 0x72, 0x7e, 0x7d, 0x64, 0x6e, 0x47,
-    0x6f, 0x88, 0x91, 0x76, 0xd4, 0x82, 0x5d, 0x9c, 0x7e, 0x60, 0x72, 0x8d,
-    0x71, 0x61, 0x59, 0x81, 0xa8, 0x68, 0x69, 0x7d, 0x84, 0x74, 0x5a, 0xa9,
-    0x85, 0x71, 0x6e, 0x89, 0x92, 0x72, 0x81, 0x76, 0x49, 0x71, 0x7b, 0x76,
-    0x6f, 0x7f, 0x5f, 0x97, 0x99, 0x75, 0x48, 0x73, 0x80, 0x55, 0x76, 0x70,
-    0x7e, 0x78, 0x62, 0x86, 0x90, 0x7c, 0x6e, 0x92, 0x88, 0x6d, 0x55, 0x86,
-    0x8e, 0x73, 0x7d, 0x83, 0xd5, 0x89, 0x84, 0x71, 0x72, 0x76, 0x72, 0x8a,
-    0x92, 0x67, 0x82, 0x62, 0x82, 0x55, 0x8b, 0x71, 0x99, 0x76, 0x9a, 0x85,
-    0x6d, 0x62, 0x7c, 0x7b, 0x80, 0x60, 0x72, 0x73, 0x7d, 0x6e, 0x74, 0x6d,
-    0x6d, 0x76, 0x75, 0x76, 0x81, 0x73, 0x7d, 0x79, 0x79, 0x7b, 0x7c, 0x81,
-    0x6f, 0x71, 0x70, 0x7a, 0x7d, 0x77, 0x73, 0x73, 0x7c, 0x67, 0x70, 0x5d,
-    0x6c, 0x75, 0x77, 0x79, 0x91, 0x74, 0x71, 0x67, 0x82, 0x7b, 0x7d, 0x7b,
-    0x7e, 0x69, 0x73, 0x77, 0x75, 0x51, 0x76, 0x74, 0x67, 0x7f, 0x81, 0x77,
-    0x75, 0x7c, 0x6b, 0x81, 0x75, 0x7c, 0x74, 0x77, 0x5d, 0x77, 0x59, 0x6a,
-    0x54, 0x6c, 0x64, 0x74, 0x78, 0x74, 0x7a, 0x73, 0x72, 0x7b, 0x74, 0x34,
-    0x52, 0x6d, 0x7b, 0x77, 0x78, 0x7e, 0x70, 0x73, 0x6d, 0x7e, 0x7e, 0x69,
-    0x70, 0x85, 0x73, 0x75, 0x9c, 0x7d, 0x7a, 0x77, 0x5d, 0x74, 0x77, 0x62,
-    0x7c, 0x6a, 0x7a, 0x6f, 0x70, 0x6d, 0x71, 0x6d, 0x6d, 0x85, 0x56, 0x76,
-    0x68, 0x75, 0x7b, 0x7a, 0x79, 0x75, 0x70, 0x75, 0x71, 0x75, 0x73, 0x72,
-    0x71, 0x6e, 0x70, 0x78, 0x80, 0x79, 0x66, 0x74, 0x71, 0x72, 0x73, 0x77,
-    0x7b, 0x3e, 0x79, 0x79, 0x72, 0x71, 0x73, 0x7b, 0x77, 0x71, 0x6d, 0x74,
-    0x64, 0x78, 0x76, 0x72, 0x82, 0x6e, 0x75, 0x75, 0x7b, 0x70, 0x43, 0x73,
-    0x6f, 0x74, 0x75, 0x75, 0x76, 0x73, 0x75, 0x76, 0x76, 0x7f, 0x7c, 0x73,
-    0x73, 0x72, 0x71, 0x71, 0x70, 0x72, 0x77, 0x72, 0x71, 0x71, 0x6f, 0x6d,
-    0x6f, 0x6f, 0x6f, 0x74, 0x77, 0x70, 0x4c, 0x70, 0x70, 0x71, 0x70, 0x71,
-    0x6c, 0x69, 0x71, 0x72, 0x72, 0x70, 0x71, 0x71, 0x6d, 0x71, 0x6f, 0x6e,
-    0x71, 0x70, 0x6f, 0x71, 0x6e, 0x71, 0x71, 0x82, 0x70, 0x73, 0x6e, 0x71,
-    0x71, 0x6e, 0x74, 0x75, 0x70, 0x70, 0x72, 0x74, 0x73, 0x71, 0x71, 0x6f,
-    0x6c, 0x74, 0x5a, 0x70, 0x7b, 0x73, 0x6b, 0x75, 0x7d, 0x66, 0x74, 0x79,
-    0x80, 0x7d, 0x6d, 0x70, 0x6d, 0x73, 0x76, 0x72, 0x74, 0x79, 0x6c, 0x7a,
-    0x72, 0x74, 0x7c, 0x71, 0x78, 0x83, 0x6d, 0x74, 0x77, 0x65, 0x66, 0x71,
-    0x7f, 0x4f, 0x84, 0x76, 0x84, 0x76, 0x78, 0x7b, 0x85, 0x81, 0x5a, 0x6e,
-    0x64, 0x61, 0x73, 0x70, 0x6f, 0x7c, 0x67, 0x79, 0x74, 0x7e, 0x85, 0x6c,
-    0x71, 0x75, 0x75, 0x6e, 0x70, 0x77, 0x5f, 0x5f, 0x76, 0x76, 0x75, 0x69,
-    0x75, 0x78, 0x70, 0x4d, 0x6f, 0x6f, 0x58, 0x77, 0x61, 0x6b, 0x79, 0x79,
-    0x79, 0x72, 0x6c, 0x6d, 0x6c, 0x71, 0x79, 0x6b, 0x64, 0x78, 0x77, 0x65,
-    0x7d, 0x74, 0x76, 0x79, 0x70, 0x76, 0x74, 0x75, 0x71, 0x75, 0x78, 0x79,
-    0x75, 0x74, 0x6a, 0x7b, 0x67, 0x71, 0x75, 0x79, 0x72, 0x60, 0x75, 0x52,
-    0x78, 0x6f, 0x80, 0x79, 0x7e, 0x78, 0x6f, 0x70, 0x79, 0x74, 0x7e, 0x70,
-    0x7e, 0x73, 0x70, 0x84, 0x72, 0x75, 0x77, 0x78, 0x74, 0x75, 0x7b, 0x78,
-    0x7e, 0x79, 0x73, 0x6d, 0x7b, 0x7a, 0x71, 0x79, 0x77, 0x73, 0x6c, 0x73,
-    0x60, 0x80, 0x7e, 0x76, 0x94, 0x80, 0x76, 0x71, 0x80, 0x70, 0x7f, 0x7c,
-    0x63, 0x6b, 0x75, 0x73, 0x71, 0x49, 0x73, 0x7c, 0x6c, 0x64, 0x83, 0x79,
-    0x86, 0x70, 0x5e, 0x73, 0x66, 0x82, 0x77, 0x7c, 0x95, 0x7d, 0xb1, 0x6e,
-    0x62, 0x7f, 0x66, 0x8c, 0x6a, 0x6e, 0x54, 0x75, 0x81, 0x86, 0x9a, 0x7c,
-    0x9a, 0x93, 0x97, 0x7e, 0x87, 0x4e, 0x69, 0x94, 0x91, 0x78, 0x53, 0x7c,
-    0x66, 0x90, 0x98, 0x8d, 0xda, 0x85, 0x95, 0x99, 0x71, 0x87, 0x56, 0x85,
-    0x6b, 0x46, 0x77, 0x7a, 0x87, 0x5f, 0x77, 0x7b, 0x86, 0xea, 0x87, 0x9d,
-    0x8e, 0x59, 0xb1, 0x7a, 0x9f, 0x84, 0x76, 0x55, 0x85, 0x89, 0x8f, 0x66,
-    0x88, 0x8e, 0x4c, 0x64, 0x6d, 0x4f, 0x4d, 0x69, 0x7e, 0x8b, 0xb1, 0x6f,
-    0x7a, 0x61, 0x6c, 0x46, 0x76, 0x52, 0x7b, 0x87, 0x66, 0x95, 0x95, 0x91,
-    0x9d, 0x7e, 0x79, 0x89, 0xd8, 0xa2, 0x72, 0x67, 0x6f, 0x81, 0x72, 0x71,
-    0x6e, 0x68, 0x7b, 0x90, 0x87, 0x62, 0x85, 0x7d, 0x4e, 0x75, 0xa0, 0x7d,
-    0x55, 0x83, 0x6a, 0x7b, 0x88, 0x64, 0x52, 0x6e, 0x78, 0x74, 0x86, 0x78,
-    0x8d, 0x53, 0x58, 0x89, 0x6d, 0x74, 0x5f, 0x68, 0x81, 0x6e, 0xa6, 0x69,
-    0x7a, 0x83, 0x73, 0x81, 0x75, 0x66, 0x7f, 0x87, 0x85, 0x9f, 0x8e, 0x74,
-    0x90, 0x6b, 0x81, 0x9d, 0xbb, 0x9d, 0x7f, 0x39, 0x69, 0x82, 0x7f, 0x86,
-    0x77, 0x7f, 0x7d, 0x71, 0x90, 0x53, 0x93, 0x73, 0x78, 0xdd, 0x72, 0x83,
-    0x72, 0x75, 0x61, 0x78, 0x7a, 0x76, 0x71, 0x75, 0x6e, 0x69, 0x71, 0x76,
-    0x78, 0x6f, 0x6e, 0x72, 0x73, 0x71, 0x73, 0x71, 0x73, 0x70, 0x76, 0x76,
-    0x79, 0x72, 0x70, 0x69, 0x78, 0x73, 0x71, 0x73, 0x74, 0x72, 0x6c, 0x79,
-    0x7a, 0x6b, 0x71, 0x73, 0x82, 0x71, 0x70, 0x7f, 0x71, 0x79, 0x7f, 0x71,
-    0x6b, 0x6e, 0x73, 0x7a, 0x74, 0x7a, 0x69, 0x75, 0x76, 0x7b, 0x82, 0x74,
-    0x6c, 0x77, 0x71, 0x6c, 0x6c, 0x61, 0x77, 0x71, 0x66, 0x78, 0x78, 0x72,
-    0x77, 0x74, 0x69, 0x6e, 0x66, 0x78, 0x6f, 0x75, 0x77, 0x6c, 0x7a, 0x72,
-    0x6e, 0x77, 0x7d, 0x6e, 0x69, 0x6a, 0x70, 0x79, 0x7a, 0x78, 0x77, 0x7d,
-    0x6d, 0x71, 0x66, 0x75, 0x74, 0x75, 0x7c, 0x78, 0x75, 0x6a, 0x80, 0x74,
-    0x7a, 0x6c, 0x76, 0x63, 0x6a, 0x77, 0x73, 0x82, 0x6f, 0x74, 0x76, 0x78,
-    0x69, 0x63, 0x6a, 0x78, 0x76, 0x5a, 0x81, 0x5b, 0x72, 0x6b, 0x6f, 0x6c,
-    0x70, 0x77, 0x4d, 0x54, 0x75, 0x6a, 0x75, 0x77, 0x75, 0x6f, 0x64, 0x75,
-    0x6b, 0x6e, 0x71, 0x61, 0x7f, 0x79, 0x72, 0x80, 0x6f, 0x61, 0x6c, 0x64,
-    0x6f, 0x65, 0x78, 0x6d, 0x7b, 0x7f, 0x77, 0x5a, 0x81, 0x67, 0x65, 0x69,
-    0x6e, 0x7c, 0x6f, 0x83, 0x7a, 0x51, 0x7e, 0x73, 0x7a, 0x84, 0x6f, 0x6e,
-    0x76, 0x72, 0x7b, 0x79, 0x6e, 0x6a, 0x7a, 0x70, 0x71, 0x7a, 0x77, 0x73,
-    0x5e, 0x71, 0x78, 0x7a, 0x75, 0x75, 0x77, 0x78, 0x73, 0x77, 0x7e, 0x78,
-    0x6d, 0x7b, 0x6f, 0x72, 0x6f, 0x6c, 0x71, 0x77, 0x71, 0x7d, 0x7e, 0x6f,
-    0x72, 0x80, 0x70, 0x6f, 0x7d, 0x77, 0x70, 0x73, 0x70, 0x71, 0x7c, 0x71,
-    0x7d, 0x7a, 0x71, 0x73, 0x6f, 0x69, 0x79, 0x6e, 0x74, 0x72, 0x72, 0x75,
-    0x69, 0x6c, 0x73, 0x91, 0x79, 0x75, 0x67, 0x75, 0x69, 0x73, 0x90, 0x7d,
-    0x81, 0x87, 0x85, 0x7a, 0x75, 0x6f, 0x90, 0x70, 0x59, 0x9c, 0x82, 0x5a,
-    0x7a, 0x80, 0x55, 0x8d, 0x7e, 0x9c, 0x68, 0x7d, 0x7b, 0x6d, 0x7c, 0x50,
-    0x67, 0x87, 0x73, 0x76, 0xae, 0x35, 0x7a, 0x63, 0x6d, 0x67, 0x89, 0x7c,
-    0x97, 0x70, 0x68, 0x82, 0x58, 0x4c, 0x92, 0x71, 0x6d, 0xa7, 0x8d, 0x73,
-    0x76, 0x72, 0x6c, 0x8b, 0x6e, 0x62, 0x7a, 0x6f, 0x79, 0x7d, 0x92, 0x5b,
-    0x77, 0x7e, 0x45, 0x78, 0x6d, 0x67, 0x72, 0x77, 0x71, 0x97, 0x66, 0x77,
-    0x76, 0x6a, 0x4f, 0x73, 0x75, 0x7d, 0x6d, 0x6e, 0x61, 0x73, 0x80, 0x87,
-    0x81, 0x71, 0x5e, 0x85, 0x94, 0x82, 0x76, 0x6d, 0x25, 0x73, 0x82, 0x75,
-    0x59, 0x72, 0x72, 0x77, 0x75, 0x64, 0x7a, 0x6b, 0x53, 0x8f, 0x7d, 0x61,
-    0x76, 0x62, 0x7e, 0x5f, 0x41, 0x62, 0x86, 0x88, 0x6d, 0x72, 0x5b, 0x7d,
-    0x66, 0x73, 0x76, 0x8e, 0x77, 0x8c, 0x8b, 0x68, 0x7b, 0x80, 0x11, 0x5c,
-    0x6a, 0x7c, 0x76, 0x75, 0x82, 0x7e, 0x53, 0x8a, 0x8c, 0x73, 0x8e, 0x8b,
-    0x6e, 0x6c, 0x7b, 0x61, 0x6e, 0x65, 0x62, 0x6b, 0x6a, 0x68, 0x73, 0x64,
-    0x6d, 0x59, 0x89, 0x5b, 0x89, 0x73, 0x71, 0x43, 0x7a, 0x8d, 0x6d, 0x92,
-    0x63, 0x9e, 0x77, 0x80, 0x7c, 0x76, 0x77, 0x8c, 0x95, 0x7e, 0x7c, 0x78,
-    0x71, 0x99, 0x78, 0x85, 0x54, 0x74, 0x5c, 0x6f, 0x81, 0x88, 0x70, 0x7c,
-    0x6c, 0x9a, 0x53, 0x55, 0x81, 0x83, 0x7a, 0x85, 0x90, 0x83, 0x78, 0x88,
-    0x80, 0x6f, 0x7b, 0x74, 0xcf, 0x76, 0x71, 0x5a, 0x81, 0x84, 0x9d, 0x6f,
-    0x90, 0x59, 0x7c, 0x87, 0x75, 0x5a, 0x8d, 0x8b, 0x47, 0xda, 0xa7, 0x70,
-    0x75, 0x6e, 0x84, 0x7a, 0x71, 0x65, 0x7a, 0x70, 0x61, 0x67, 0x80, 0x7a,
-    0x69, 0x75, 0x6b, 0x78, 0x76, 0x6d, 0x6c, 0x6f, 0x71, 0x79, 0x6f, 0x59,
-    0x80, 0x74, 0x6f, 0x6c, 0x76, 0x76, 0x71, 0x61, 0x70, 0x63, 0x73, 0x77,
-    0x77, 0x7d, 0x73, 0x6b, 0x84, 0x73, 0x75, 0x73, 0x41, 0x75, 0x4a, 0x62,
-    0x7a, 0x70, 0x76, 0x79, 0x73, 0x71, 0x60, 0x6b, 0x75, 0x7a, 0x6c, 0x76,
-    0x67, 0x5d, 0x7a, 0x7e, 0x7b, 0x6e, 0x8f, 0x7e, 0x6a, 0x79, 0x45, 0x81,
-    0x60, 0x5e, 0x86, 0x95, 0x9d, 0xa0, 0x4e, 0x57, 0x4f, 0x67, 0x68, 0x78,
-    0x57, 0x9a, 0x93, 0x82, 0x89, 0x90, 0x4e, 0x7c, 0x95, 0x63, 0x2d, 0x6b,
-    0x55, 0x6c, 0x98, 0x6b, 0x8a, 0x6b, 0x63, 0x97, 0x8f, 0x64, 0x66, 0x58,
-    0x81, 0x66, 0x86, 0x63, 0x9a, 0x5c, 0x73, 0x78, 0x95, 0x9d, 0x60, 0x86,
-    0x77, 0x78, 0x6f, 0x8b, 0x6a, 0x61, 0x80, 0x6b, 0x56, 0x66, 0x7a, 0x70,
-    0x68, 0x72, 0x70, 0x78, 0x77, 0x6d, 0x7f, 0x76, 0x78, 0x7c, 0x75, 0x6a,
-    0x73, 0x72, 0x7a, 0x75, 0x78, 0x8a, 0x78, 0x75, 0x76, 0x7a, 0x78, 0x67,
-    0x83, 0x81, 0x77, 0x6a, 0x9a, 0x72, 0x6d, 0x6a, 0x7d, 0x7b, 0x86, 0x5c,
-    0x7c, 0x60, 0x74, 0x73, 0x75, 0x5c, 0x79, 0x6d, 0x6e, 0x7a, 0x6d, 0x79,
-    0x75, 0x6f, 0x73, 0x71, 0x70, 0x71, 0x73, 0x6e, 0x71, 0x6d, 0x6f, 0x70,
-    0x6e, 0x70, 0x72, 0x70, 0x31, 0x72, 0x4d, 0x71, 0x6c, 0x73, 0x71, 0x76,
-    0x7c, 0x81, 0x6f, 0x6f, 0x72, 0x73, 0x71, 0x72, 0x72, 0x73, 0x6a, 0x73,
-    0x63, 0x71, 0x76, 0x70, 0x70, 0x6d, 0x71, 0x67, 0x70, 0x6f, 0x73, 0x71,
-    0x76, 0x78, 0x74, 0x6c, 0x72, 0x6f, 0x75, 0x71, 0x6e, 0x68, 0x6f, 0x71,
-    0x74, 0x7f, 0x71, 0x7c, 0x83, 0x7d, 0x45, 0x5a, 0x7b, 0x72, 0x7f, 0x48,
-    0x88, 0x7e, 0x6d, 0x4c, 0x67, 0x55, 0x65, 0x87, 0x51, 0x6f, 0x7b, 0x75,
-    0x7f, 0x6c, 0x57, 0x63, 0x5f, 0x6c, 0x8d, 0x67, 0x5b, 0x7b, 0x77, 0x7b,
-    0x85, 0x80, 0x56, 0x82, 0x78, 0x81, 0x7b, 0x74, 0x6d, 0x80, 0x7e, 0x7c,
-    0x72, 0x7b, 0x58, 0x82, 0x62, 0x7e, 0x76, 0x7d, 0x64, 0x4b, 0x82, 0x53,
-    0x66, 0x7c, 0x73, 0x7d, 0x85, 0x91, 0x63, 0x64, 0x7e, 0x81, 0x73, 0x7e,
-    0x8b, 0x92, 0x61, 0x78, 0x91, 0x81, 0x78, 0x7f, 0x77, 0x80, 0x8a, 0x8e,
-    0x76, 0x81, 0x4c, 0x74, 0x83, 0x62, 0x7d, 0x90, 0x95, 0x80, 0x7b, 0x77,
-    0x82, 0xa0, 0x77, 0x83, 0xba, 0x6f, 0x72, 0x72, 0x57, 0x82, 0x97, 0x76,
-    0x87, 0x50, 0x7c, 0x78, 0x7a, 0x5b, 0x6d, 0x71, 0x6c, 0xd1, 0x8c, 0x6c,
-    0x78, 0x73, 0x66, 0x74, 0x75, 0x71, 0x73, 0x72, 0x6f, 0x70, 0x75, 0x74,
-    0x77, 0x72, 0x71, 0x72, 0x76, 0x72, 0x74, 0x73, 0x71, 0x76, 0x71, 0x70,
-    0x77, 0x73, 0x74, 0x71, 0x75, 0x70, 0x72, 0x72, 0x70, 0x73, 0x73, 0x73,
-    0x76, 0x71, 0x76, 0x74, 0x81, 0x72, 0x71, 0x73, 0x77, 0x75, 0x78, 0x75,
-    0x71, 0x71, 0x74, 0x77, 0x74, 0x76, 0x6f, 0x73, 0x75, 0x79, 0x75, 0x74,
-    0x57, 0x62, 0x8b, 0x8f, 0x69, 0x80, 0x67, 0x7d, 0x80, 0x76, 0x83, 0x87,
-    0x77, 0x72, 0x59, 0x86, 0x84, 0x7c, 0x7e, 0x71, 0x77, 0x55, 0x85, 0x7f,
-    0x82, 0x72, 0x71, 0x5a, 0x74, 0x6b, 0x72, 0x7c, 0x7e, 0x77, 0x82, 0x8b,
-    0x72, 0x77, 0x73, 0x95, 0x9b, 0x6b, 0x69, 0x78, 0x87, 0x7a, 0x8a, 0x6d,
-    0x7d, 0x5e, 0x75, 0x7d, 0x79, 0x6b, 0x77, 0x63, 0x6b, 0x74, 0x93, 0x85,
-    0x63, 0x7c, 0x6f, 0x81, 0x6a, 0x8e, 0x83, 0x6e, 0x8b, 0x7b, 0x66, 0x85,
-    0x80, 0x92, 0x72, 0x74, 0x7d, 0x82, 0x6e, 0x79, 0x82, 0x67, 0x80, 0x76,
-    0x97, 0x82, 0x8c, 0x49, 0x66, 0x74, 0x6a, 0x83, 0x6b, 0x78, 0x6e, 0x8e,
-    0x87, 0x8e, 0x5a, 0x77, 0x99, 0x6a, 0x75, 0x7a, 0x71, 0x7a, 0x73, 0x8a,
-    0x6f, 0x78, 0x74, 0x6d, 0x6e, 0x78, 0x7c, 0x86, 0x6e, 0x93, 0x86, 0x83,
-    0x72, 0x71, 0x73, 0x71, 0x73, 0x71, 0x3d, 0x74, 0x71, 0x71, 0x70, 0x71,
-    0x73, 0x74, 0x72, 0x72, 0x72, 0x73, 0x28, 0x71, 0x72, 0x71, 0x70, 0x72,
-    0x6c, 0x6d, 0x73, 0x71, 0x72, 0x74, 0x72, 0x77, 0x74, 0x6f, 0x75, 0x6e,
-    0x71, 0x71, 0x6d, 0x71, 0x6f, 0x73, 0x70, 0x6b, 0x72, 0x74, 0x6e, 0x71,
-    0x72, 0x73, 0x72, 0x76, 0x76, 0x74, 0x71, 0x74, 0x73, 0x74, 0x73, 0x72,
-    0x74, 0x59, 0x73, 0x84, 0x7d, 0x47, 0x7b, 0x7b, 0x75, 0x72, 0x81, 0x79,
-    0x55, 0x82, 0x76, 0x73, 0x82, 0x75, 0x89, 0x72, 0x78, 0x86, 0x6a, 0x76,
-    0x6a, 0x87, 0x75, 0x6e, 0x76, 0x7a, 0x7c, 0x7c, 0x75, 0x6e, 0x77, 0x73,
-    0x67, 0x80, 0x71, 0x5f, 0x9e, 0x7c, 0x78, 0x71, 0x8e, 0x70, 0x88, 0x82,
-    0x79, 0x74, 0x72, 0x5a, 0x66, 0x3d, 0x79, 0x7c, 0x76, 0x8b, 0x77, 0x75,
-    0x6f, 0x5f, 0x7b, 0x79, 0x78, 0x63, 0x70, 0x85, 0x76, 0x77, 0x7c, 0x75,
-    0x77, 0x7f, 0x7c, 0x78, 0x73, 0x65, 0x7a, 0x71, 0x87, 0x86, 0x77, 0x6f,
-    0x72, 0x79, 0x7a, 0x7b, 0x73, 0x76, 0x73, 0x6e, 0x78, 0x6c, 0x70, 0x74,
-    0x5e, 0x74, 0x7d, 0x75, 0x90, 0x67, 0x72, 0x7d, 0x7f, 0x7c, 0x7c, 0x72,
-    0x6b, 0x70, 0x75, 0x7b, 0x75, 0x44, 0x73, 0x6a, 0x7a, 0x90, 0x74, 0x67,
-    0x75, 0x70, 0x80, 0x82, 0x88, 0x7d, 0x72, 0x6c, 0x64, 0x7b, 0x82, 0x69,
-    0x4d, 0x80, 0x7b, 0x8e, 0x9d, 0x8f, 0x7b, 0x5e, 0x6c, 0x7d, 0x80, 0x86,
-    0x83, 0x6f, 0x4f, 0xaa, 0x6f, 0x76, 0x77, 0x89, 0x76, 0x9c, 0x76, 0x81,
-    0x6f, 0x78, 0x62, 0x7c, 0x9d, 0x44, 0x76, 0x7f, 0x92, 0x76, 0x86, 0x73,
-    0x7e, 0x4f, 0x64, 0x70, 0x73, 0x7c, 0x6f, 0x90, 0x78, 0x8c, 0x71, 0x77,
-    0x75, 0x72, 0x81, 0x75, 0x73, 0x6f, 0x6b, 0x73, 0x5d, 0x6e, 0x46, 0x6e,
-    0x76, 0x65, 0x50, 0x78, 0x75, 0x73, 0x71, 0x71, 0x71, 0x72, 0x67, 0x57,
-    0x74, 0x75, 0x6a, 0x71, 0x74, 0x74, 0x72, 0x70, 0x68, 0x6a, 0x72, 0x74,
-    0x6f, 0x7f, 0x72, 0x6f, 0x89, 0x77, 0x75, 0x71, 0x4f, 0x6c, 0x4e, 0x58,
-    0x77, 0x74, 0x71, 0x70, 0x76, 0x75, 0x76, 0x70, 0x79, 0x7d, 0x6c, 0x70,
-    0x6e, 0x7c, 0x74, 0x77, 0x6f, 0x72, 0x74, 0x6b, 0x6c, 0x73, 0x75, 0x6c,
-    0x7d, 0x7d, 0x5f, 0x75, 0x6f, 0x72, 0x76, 0x74, 0x76, 0x78, 0x83, 0x68,
-    0x7e, 0x7d, 0x6e, 0x6d, 0x78, 0x6f, 0x7b, 0x7e, 0x76, 0x74, 0x77, 0x7a,
-    0x7c, 0x6a, 0x6f, 0x7d, 0x91, 0x6d, 0x78, 0x6f, 0x66, 0x77, 0x73, 0x66,
-    0x79, 0x74, 0x6b, 0x74, 0x75, 0x84, 0x6f, 0x77, 0x79, 0x84, 0x76, 0x75,
-    0x64, 0x86, 0x72, 0x73, 0x85, 0x83, 0x2f, 0x64, 0x7f, 0x70, 0x8b, 0x2a,
-    0x90, 0x8e, 0x63, 0x4c, 0x7f, 0x3c, 0x81, 0xa5, 0x85, 0x88, 0x75, 0x7e,
-    0x81, 0x0d, 0x27, 0x6c, 0x44, 0x65, 0x8d, 0x22, 0x47, 0x69, 0xa6, 0x87,
-    0x80, 0x57, 0x57, 0x92, 0x87, 0x9e, 0xac, 0x3d, 0x6d, 0x86, 0x70, 0x93,
-    0x4f, 0x93, 0x4d, 0x81, 0x56, 0xa2, 0x72, 0x7c, 0x5f, 0x71, 0x8a, 0x69,
-    0x72, 0x96, 0xad, 0x8d, 0xa2, 0x84, 0x60, 0x5f, 0x80, 0x8a, 0x8f, 0x93,
-    0x67, 0x97, 0x42, 0x7d, 0x9b, 0x65, 0x98, 0x94, 0x80, 0x8f, 0x9f, 0x7c,
-    0x96, 0x68, 0x70, 0x55, 0x73, 0x6b, 0x7f, 0x9c, 0x83, 0x9a, 0x8d, 0xae,
-    0x98, 0xb7, 0x71, 0x96, 0xbf, 0x7a, 0x9b, 0x3d, 0x70, 0x95, 0x99, 0x77,
-    0x80, 0x43, 0x88, 0x88, 0x7c, 0x6e, 0x82, 0x99, 0x4f, 0xde, 0xc1, 0x7c,
-    0x77, 0x6f, 0x81, 0x7d, 0x79, 0x72, 0x6d, 0x78, 0x73, 0x71, 0x73, 0x7a,
-    0x69, 0x75, 0x5f, 0x73, 0x78, 0x75, 0x7b, 0x70, 0x66, 0x6b, 0x80, 0x66,
-    0x71, 0x77, 0x80, 0x73, 0x71, 0x79, 0x6c, 0x70, 0x77, 0x78, 0x79, 0x76,
-    0x69, 0x73, 0x76, 0x6d, 0x7e, 0x72, 0x77, 0x7a, 0x7d, 0x70, 0x58, 0x84,
-    0x74, 0x70, 0x78, 0x73, 0x75, 0x72, 0x6c, 0x71, 0x70, 0x75, 0x8c, 0x75,
-    0x7b, 0x5d, 0x7a, 0x86, 0x62, 0x78, 0x7e, 0x76, 0x7f, 0x6b, 0x89, 0x79,
-    0x5c, 0x79, 0x70, 0x77, 0x82, 0x74, 0x79, 0x7b, 0x70, 0x79, 0x63, 0x77,
-    0x6c, 0x76, 0x74, 0x7d, 0x7a, 0x70, 0x74, 0x6c, 0x7e, 0x6e, 0x7f, 0x6f,
-    0x84, 0x83, 0x56, 0x65, 0x7b, 0x63, 0x76, 0x6a, 0x8b, 0x6f, 0x84, 0x7e,
-    0x7c, 0x56, 0x6e, 0x76, 0x7f, 0x5d, 0x7b, 0x79, 0x64, 0x90, 0x6b, 0x74,
-    0x7d, 0x7b, 0x70, 0x71, 0x85, 0x72, 0x74, 0x68, 0x6b, 0x5a, 0x64, 0x65,
-    0x70, 0x63, 0x3c, 0x6b, 0x6e, 0x75, 0x61, 0x42, 0x67, 0x34, 0x40, 0x77,
-    0x70, 0x69, 0x75, 0x65, 0x6e, 0x6a, 0x47, 0x74, 0x4c, 0x36, 0x42, 0x6d,
-    0x64, 0x62, 0x7d, 0x55, 0x7b, 0x64, 0x24, 0x76, 0x72, 0x6a, 0x74, 0x6b,
-    0x7e, 0x76, 0x87, 0x6d, 0x7c, 0x78, 0x6a, 0x75, 0x71, 0x69, 0x6b, 0x6b,
-    0x66, 0x85, 0x84, 0x91, 0x7d, 0x84, 0x7d, 0x72, 0x61, 0x65, 0x7d, 0x68,
-    0x83, 0x77, 0x8d, 0x79, 0x8d, 0x86, 0x97, 0x71, 0x8b, 0x7a, 0x91, 0x58,
-    0x50, 0x72, 0x66, 0x6b, 0x68, 0x74, 0x69, 0x68, 0x83, 0x7c, 0x81, 0x7b,
-    0x72, 0x62, 0x91, 0x71, 0xa1, 0x69, 0x74, 0x62, 0xa6, 0x63, 0x8c, 0x5f,
-    0x7b, 0x70, 0x70, 0x97, 0x8d, 0x50, 0x79, 0x7e, 0x76, 0x98, 0x7f, 0x76,
-    0x69, 0x76, 0x48, 0x80, 0x76, 0x7d, 0x6e, 0x74, 0x75, 0x79, 0x78, 0x73,
-    0x5d, 0x7a, 0x75, 0x70, 0x79, 0x7c, 0x7f, 0x75, 0x76, 0x75, 0x81, 0x75,
-    0x52, 0x71, 0x70, 0x66, 0x70, 0x7a, 0x73, 0x86, 0x78, 0x65, 0x50, 0x84,
-    0x63, 0x65, 0x60, 0x73, 0x81, 0x80, 0x71, 0x69, 0x5f, 0x7d, 0x70, 0x7b,
-    0x67, 0x72, 0x76, 0x79, 0x7e, 0x74, 0x58, 0x7c, 0x60, 0x56, 0x6c, 0x7c,
-    0x66, 0x68, 0x88, 0x81, 0x85, 0xa3, 0x68, 0x69, 0x87, 0xb6, 0x9e, 0x59,
-    0x6f, 0x91, 0x92, 0x60, 0x53, 0x56, 0x5e, 0x69, 0x63, 0x75, 0xaa, 0x62,
-    0x83, 0x84, 0x89, 0x74, 0x79, 0x54, 0x76, 0x89, 0x61, 0x8e, 0xa2, 0x6d,
-    0x81, 0x95, 0x9a, 0x72, 0xd0, 0xa2, 0x93, 0x64, 0x58, 0x6e, 0x87, 0x8a,
-    0x75, 0x99, 0x68, 0x8f, 0x6f, 0x54, 0x7b, 0x70, 0x60, 0x73, 0xa9, 0x77,
-    0x87, 0x7f, 0xa4, 0x7a, 0xae, 0x85, 0x63, 0x7e, 0x7a, 0x87, 0x7d, 0x5d,
-    0x88, 0x76, 0x8c, 0x66, 0x8c, 0x78, 0x7d, 0x77, 0x74, 0x83, 0xba, 0x66,
-    0x7f, 0x81, 0x6d, 0x5b, 0x75, 0x84, 0x78, 0x8b, 0x60, 0xa1, 0x99, 0x75,
-    0x90, 0x9b, 0x91, 0x81, 0xca, 0x7f, 0x7f, 0x68, 0x6c, 0x76, 0x72, 0x73,
-    0x75, 0x4d, 0x75, 0x79, 0x88, 0x5a, 0x90, 0x6a, 0x5e, 0xe0, 0x8a, 0x6b,
-    0x71, 0x77, 0x7c, 0x7f, 0x7c, 0x74, 0x78, 0x76, 0x81, 0x7f, 0x78, 0x73,
-    0x75, 0x75, 0x7b, 0x73, 0x7d, 0x6c, 0x70, 0x74, 0x7a, 0x73, 0x7c, 0x7a,
-    0x78, 0x6a, 0x67, 0x6c, 0x7e, 0x74, 0x71, 0x78, 0x79, 0x66, 0x75, 0x6b,
-    0x6e, 0x73, 0x76, 0x7e, 0x8b, 0x7b, 0x75, 0x6a, 0x81, 0x76, 0x85, 0x7c,
-    0x77, 0x5d, 0x77, 0x77, 0x78, 0x48, 0x7a, 0x76, 0x64, 0x6e, 0x7f, 0x7a,
-    0x63, 0x79, 0x87, 0x7e, 0x89, 0x8e, 0x7a, 0x6f, 0x71, 0x80, 0x89, 0x72,
-    0x72, 0x70, 0x75, 0x80, 0x4b, 0x7a, 0x71, 0x8a, 0x86, 0x6d, 0x91, 0x67,
-    0x62, 0x80, 0x73, 0x44, 0x78, 0x6c, 0x82, 0x84, 0x75, 0x82, 0x81, 0x84,
-    0x6b, 0x69, 0x87, 0x75, 0xb7, 0x81, 0x81, 0x70, 0x4c, 0x80, 0x6e, 0x86,
-    0x7b, 0x6d, 0x79, 0x70, 0x7e, 0x50, 0x85, 0x71, 0x6c, 0xc4, 0x76, 0x84,
-    0x75, 0x75, 0x6d, 0x74, 0x75, 0x72, 0x70, 0x74, 0x70, 0x6d, 0x79, 0x72,
-    0x70, 0x76, 0x74, 0x77, 0x59, 0x6d, 0x7f, 0x6d, 0x70, 0x78, 0x72, 0x77,
-    0x6c, 0x78, 0x75, 0x72, 0x75, 0x75, 0x70, 0x74, 0x74, 0x76, 0x71, 0x74,
-    0x79, 0x7b, 0x73, 0x71, 0x7e, 0x75, 0x77, 0x48, 0x7a, 0x6d, 0x3f, 0x74,
-    0x7e, 0x6e, 0x75, 0x76, 0x74, 0x75, 0x78, 0x74, 0x74, 0x79, 0x70, 0x74,
-    0x7c, 0x6c, 0x5e, 0x6b, 0x66, 0x6d, 0x6d, 0x72, 0x6f, 0x48, 0x66, 0x72,
-    0x5e, 0x6b, 0x6e, 0x6b, 0x6e, 0x67, 0x68, 0x71, 0x6a, 0x74, 0x49, 0x57,
-    0x60, 0x6e, 0x70, 0x6b, 0x71, 0x6b, 0x70, 0x61, 0x60, 0x5f, 0x6c, 0x6b,
-    0x5e, 0x69, 0x61, 0x6e, 0x65, 0x6b, 0x72, 0x72, 0x52, 0x6e, 0x5b, 0x6d,
-    0x83, 0x69, 0x70, 0x6f, 0x68, 0x60, 0x60, 0x6f, 0x6b, 0x1e, 0x67, 0x66,
-    0x72, 0x68, 0x79, 0x83, 0x65, 0x78, 0x7b, 0x73, 0x7a, 0x77, 0x76, 0x70,
-    0x5c, 0x4d, 0x55, 0x73, 0x71, 0x74, 0x71, 0x67, 0x7e, 0x76, 0x80, 0x3a,
-    0x66, 0x71, 0x68, 0x8e, 0x65, 0x7c, 0x75, 0x6e, 0x7a, 0x75, 0x7b, 0x79,
-    0x81, 0x71, 0x80, 0x7a, 0x89, 0x4b, 0x7c, 0x64, 0x51, 0x72, 0x34, 0x79,
-    0x6e, 0x90, 0x7a, 0x73, 0x70, 0x6d, 0x73, 0x7d, 0x87, 0x87, 0x75, 0x79,
-    0x4d, 0x96, 0x96, 0x40, 0x9b, 0x87, 0x82, 0x96, 0x61, 0x76, 0xb9, 0x72,
-    0x9e, 0x56, 0x77, 0x97, 0x46, 0x77, 0x93, 0x82, 0x8e, 0x8e, 0x98, 0x69,
-    0x7e, 0x6d, 0x5d, 0x90, 0x61, 0x4e, 0x6b, 0xbc, 0xa2, 0x6d, 0xaa, 0x7f,
-    0x88, 0xb3, 0x50, 0x9b, 0x28, 0xb0, 0xa2, 0x6a, 0xaa, 0x84, 0x65, 0x83,
-    0x3a, 0x94, 0x76, 0x8e, 0x70, 0xb0, 0x8e, 0x3c, 0x83, 0x71, 0xaa, 0x70,
-    0x5d, 0x87, 0x91, 0x80, 0x87, 0x85, 0x4d, 0x57, 0x89, 0xa1, 0x8a, 0x57,
-    0x8e, 0x6a, 0x5d, 0x5a, 0x56, 0x64, 0x72, 0x78, 0x7b, 0x7d, 0xa7, 0x6a,
-    0x5b, 0x88, 0x6b, 0x41, 0x83, 0x72, 0x66, 0x81, 0x69, 0x88, 0xa4, 0x7b,
-    0x9c, 0x9b, 0x8d, 0x87, 0xd2, 0x99, 0x86, 0x4e, 0x7f, 0x75, 0x5c, 0xa7,
-    0x63, 0x8b, 0x8c, 0x82, 0x89, 0x59, 0xb4, 0x77, 0x53, 0x77, 0x92, 0x69,
-    0x5d, 0x84, 0x94, 0x8b, 0x85, 0x7f, 0x5d, 0x6d, 0x5b, 0x96, 0x83, 0x63,
-    0x81, 0x7c, 0x68, 0x5e, 0x75, 0x70, 0x63, 0x7b, 0x86, 0x92, 0xc5, 0x88,
-    0xa0, 0x72, 0x5b, 0x5e, 0x6c, 0x54, 0x68, 0x86, 0x57, 0x95, 0x99, 0x93,
-    0xa3, 0x9e, 0x7a, 0x78, 0xc1, 0x77, 0xa6, 0x77, 0x6f, 0x71, 0x91, 0x8b,
-    0x7f, 0x5a, 0x86, 0x7b, 0x7d, 0x6a, 0x76, 0x78, 0x60, 0xcd, 0x98, 0x6c,
-    0x70, 0x8c, 0x95, 0x7a, 0x8f, 0x73, 0x7b, 0x6a, 0x60, 0x92, 0x7d, 0x85,
-    0x87, 0x46, 0x76, 0x70, 0x72, 0x7f, 0x6c, 0x89, 0x8d, 0x99, 0xb9, 0x68,
-    0x64, 0x76, 0x67, 0x99, 0x8a, 0x87, 0x76, 0x84, 0x8a, 0x90, 0x51, 0xae,
-    0x8b, 0x8c, 0xa5, 0x98, 0xcd, 0x7f, 0x8e, 0x85, 0x72, 0x81, 0x58, 0x71,
-    0x69, 0x43, 0x9f, 0x73, 0x82, 0x5b, 0xaa, 0x87, 0x5d, 0xd6, 0x65, 0x8e,
-    0x83, 0x7e, 0x6b, 0x83, 0x96, 0x4d, 0x5f, 0x7a, 0x83, 0x8a, 0x87, 0x8f,
-    0x67, 0x68, 0x98, 0x72, 0x66, 0x6c, 0x88, 0x81, 0x5f, 0x78, 0xa8, 0x6e,
-    0x64, 0x7c, 0x6e, 0x60, 0x8a, 0x75, 0x5e, 0x99, 0x91, 0x4b, 0x58, 0x5e,
-    0x94, 0xa0, 0x8d, 0x4f, 0xd2, 0xb9, 0x78, 0x43, 0x6f, 0x6d, 0x7d, 0x84,
-    0x8b, 0x80, 0x75, 0x85, 0x92, 0x5a, 0x6c, 0x91, 0x64, 0xe2, 0x62, 0x79,
-    0x56, 0x81, 0x5d, 0x7a, 0x9b, 0x5a, 0x80, 0x88, 0x7c, 0x70, 0x7e, 0x7d,
-    0x60, 0x41, 0x60, 0x8e, 0x72, 0x68, 0x68, 0x83, 0x5c, 0x80, 0x9a, 0x69,
-    0x50, 0x76, 0x75, 0x5c, 0x74, 0x5b, 0x71, 0x93, 0x93, 0x96, 0x4c, 0x93,
-    0xa2, 0x6b, 0x86, 0x7d, 0xd7, 0x90, 0x7c, 0x83, 0x70, 0x6f, 0x6a, 0x7c,
-    0x4a, 0x5e, 0x6a, 0x78, 0x85, 0x53, 0x7f, 0x70, 0x70, 0xd8, 0x9a, 0x71,
-    0x75, 0x99, 0x7c, 0x8d, 0x5e, 0x52, 0x67, 0x7f, 0x7c, 0x7a, 0x74, 0x6a,
-    0x73, 0x82, 0x6a, 0x83, 0x85, 0x8c, 0x91, 0x7c, 0x73, 0x8e, 0xa4, 0x76,
-    0x83, 0x69, 0x73, 0x56, 0x8c, 0x8c, 0x72, 0x93, 0xae, 0x62, 0x8f, 0x94,
-    0x72, 0x8c, 0x73, 0x66, 0xd0, 0x89, 0x7d, 0x65, 0x88, 0x66, 0x7d, 0x7a,
-    0x73, 0x8b, 0x7f, 0x7e, 0x83, 0x6c, 0x68, 0x76, 0x69, 0xd0, 0x78, 0x7e,
-    0x6b, 0x7b, 0x70, 0x7f, 0x79, 0x73, 0x78, 0x6e, 0x6c, 0x76, 0x70, 0x64,
-    0x79, 0x7c, 0x62, 0x7a, 0x75, 0x75, 0x7a, 0x77, 0x78, 0x71, 0x7d, 0x6f,
-    0x7b, 0x75, 0x6b, 0x5c, 0x76, 0x69, 0x75, 0x7d, 0x76, 0x72, 0x6e, 0x7e,
-    0x79, 0x77, 0x74, 0x7b, 0x90, 0x7a, 0x76, 0x70, 0x69, 0x7c, 0x70, 0x6e,
-    0x7b, 0x75, 0x69, 0x78, 0x74, 0x80, 0x62, 0x76, 0x7d, 0x82, 0x64, 0x6c,
-    0x67, 0x80, 0x7b, 0x7f, 0x88, 0x6e, 0x79, 0x83, 0x7e, 0x81, 0x99, 0x88,
-    0x75, 0xa1, 0x5e, 0x6a, 0x87, 0x76, 0x7c, 0x79, 0x7c, 0x8b, 0xae, 0x79,
-    0x6e, 0x72, 0x60, 0x67, 0x73, 0x95, 0x79, 0x8c, 0x68, 0x83, 0x45, 0x86,
-    0x9a, 0x80, 0x81, 0x8a, 0xcd, 0x6c, 0x76, 0x93, 0x65, 0x82, 0x4f, 0x7c,
-    0x67, 0x4c, 0x80, 0x8c, 0x83, 0x51, 0x9b, 0x6a, 0x75, 0xd8, 0x9f, 0x68,
-    0x78, 0x59, 0x74, 0x82, 0x7b, 0x49, 0x77, 0x72, 0x6a, 0x73, 0x8c, 0x47,
-    0x76, 0x73, 0x67, 0x69, 0x67, 0x7a, 0x6d, 0x77, 0x78, 0x85, 0x7a, 0x79,
-    0x7c, 0x70, 0x70, 0x62, 0x73, 0x73, 0x7f, 0x7a, 0x6c, 0x76, 0x7d, 0x63,
-    0x84, 0x77, 0x6e, 0x55, 0x96, 0x79, 0x73, 0x60, 0x1f, 0x7b, 0x7f, 0x71,
-    0x6f, 0x6b, 0x66, 0x79, 0x77, 0x56, 0x78, 0x72, 0x7c, 0x84, 0x78, 0x6f,
-    0x69, 0x75, 0x9b, 0x73, 0x96, 0x7b, 0x62, 0x6a, 0x71, 0xae, 0x92, 0x69,
-    0x7e, 0xa4, 0x7d, 0x71, 0x67, 0x71, 0x76, 0x7e, 0x7f, 0x7d, 0xad, 0x5d,
-    0xa1, 0x93, 0x66, 0x5a, 0x87, 0x56, 0x7f, 0x98, 0x7f, 0x7a, 0x91, 0x96,
-    0x8d, 0xad, 0x8c, 0x68, 0xcd, 0x89, 0x8f, 0x65, 0x75, 0x83, 0x7f, 0x86,
-    0x7a, 0x61, 0x8a, 0x86, 0x6e, 0x5e, 0x8a, 0x7e, 0x7e, 0xd5, 0x9e, 0x72,
-    0x67, 0x6b, 0x7d, 0x84, 0x71, 0x5d, 0x75, 0x77, 0x7b, 0x66, 0x81, 0x71,
-    0x70, 0x74, 0x63, 0x6d, 0x7c, 0x74, 0x7f, 0x73, 0x75, 0x7a, 0x7c, 0x79,
-    0x6c, 0x75, 0x63, 0x64, 0x79, 0x6f, 0x7c, 0x89, 0x76, 0x79, 0x75, 0x63,
-    0x80, 0x78, 0x6c, 0x6a, 0x96, 0x79, 0x76, 0x77, 0x8f, 0x73, 0x83, 0x7a,
-    0x70, 0x60, 0x70, 0x78, 0x7e, 0x5f, 0x7a, 0x6c, 0x88, 0x7f, 0x85, 0x76,
-    0x80, 0x5b, 0x83, 0x8a, 0x67, 0xa0, 0x67, 0x66, 0x92, 0x8b, 0x90, 0x77,
-    0x7b, 0x67, 0x79, 0x87, 0x89, 0x68, 0x68, 0x70, 0x5d, 0x44, 0x9d, 0x5e,
-    0x65, 0x8b, 0x78, 0x66, 0x7f, 0x7e, 0x67, 0xb2, 0x93, 0x70, 0x4f, 0x57,
-    0x90, 0x90, 0xaa, 0x68, 0xcd, 0x96, 0x79, 0x83, 0x94, 0x7f, 0x75, 0x6c,
-    0x80, 0x6f, 0x76, 0x7e, 0x87, 0x5a, 0x70, 0x8a, 0x91, 0xe1, 0x82, 0x69,
-    0x86, 0x7e, 0x70, 0x8b, 0x65, 0x5f, 0x7a, 0x84, 0x5b, 0x6c, 0x6d, 0x6b,
-    0x96, 0x74, 0x7f, 0x69, 0x6b, 0x68, 0x62, 0x6b, 0x97, 0x8b, 0x5b, 0x4d,
-    0x81, 0x5f, 0x7c, 0x6b, 0x78, 0x83, 0x70, 0x7f, 0x6b, 0x7b, 0x55, 0x55,
-    0x8f, 0x76, 0x68, 0x6f, 0xb0, 0x66, 0x72, 0x7b, 0x72, 0x7c, 0x89, 0x62,
-    0x7a, 0x74, 0x78, 0x56, 0x6f, 0x97, 0x75, 0x7a, 0x6f, 0x8e, 0x68, 0x7f,
-    0x51, 0x4b, 0x8b, 0x7f, 0x7e, 0x5e, 0x6f, 0x7b, 0x78, 0x76, 0x7c, 0x88,
-    0x79, 0x6f, 0x65, 0x89, 0x5b, 0x78, 0x78, 0x73, 0x8b, 0x67, 0x8b, 0x82,
-    0x6f, 0x7f, 0x7a, 0x60, 0x6f, 0x5d, 0x73, 0x7a, 0x7c, 0x83, 0x7f, 0x90,
-    0x56, 0x69, 0x57, 0x80, 0x9b, 0x7b, 0x82, 0x70, 0x84, 0x7b, 0x80, 0x7e,
-    0x80, 0x7a, 0x6b, 0x78, 0x85, 0x85, 0x6f, 0x7a, 0x83, 0x77, 0x8d, 0x84,
-    0x71, 0x6d, 0x78, 0x67, 0x69, 0x6b, 0x83, 0x80, 0x77, 0x74, 0x74, 0x68,
-    0x65, 0x72, 0x75, 0x71, 0x73, 0x83, 0x69, 0x68, 0x7d, 0x78, 0x6c, 0x6e,
-    0x6e, 0x7d, 0x7b, 0x79, 0x7d, 0x76, 0x6f, 0x73, 0x7a, 0x72, 0x6d, 0x6a,
-    0x61, 0x73, 0x71, 0x6a, 0x6f, 0x67, 0x66, 0x6d, 0x74, 0x6a, 0x73, 0x70,
-    0x75, 0x6d, 0x7c, 0x65, 0x6b, 0x71, 0x70, 0x6a, 0x76, 0x7d, 0x74, 0x58,
-    0x6e, 0x74, 0x73, 0x6b, 0x71, 0x72, 0x6b, 0x6d, 0x73, 0x76, 0x77, 0x61,
-    0x6c, 0x75, 0x72, 0x60, 0x72, 0x7a, 0x53, 0x6f, 0x78, 0x6f, 0x73, 0x73,
-    0x75, 0x71, 0x7c, 0x6f, 0x78, 0x6e, 0x75, 0x68, 0x6a, 0x74, 0x6c, 0x5c,
-    0x6c, 0x76, 0x70, 0x73, 0x6f, 0x70, 0x6e, 0x73, 0x71, 0x74, 0x78, 0x73,
-    0x77, 0x73, 0x74, 0x74, 0x6c, 0x75, 0x76, 0x74, 0x74, 0x64, 0x78, 0x51,
-    0x52, 0x4e, 0x83, 0x66, 0x73, 0x64, 0x76, 0x7a, 0x7a, 0x6e, 0x76, 0x80,
-    0x7b, 0x6e, 0x5a, 0x80, 0x7f, 0x7e, 0x6f, 0x84, 0x7f, 0x6c, 0x94, 0x7c,
-    0x77, 0x7f, 0x74, 0x6d, 0x62, 0x73, 0x74, 0x7e, 0x77, 0x7b, 0x80, 0x82,
-    0x5d, 0x61, 0x65, 0x7a, 0x9f, 0x77, 0x6f, 0x70, 0x88, 0x73, 0x80, 0x7e,
-    0x6c, 0x80, 0x71, 0x73, 0x78, 0x7e, 0x76, 0x7a, 0x80, 0x6b, 0x88, 0x83,
-    0x6e, 0x75, 0x75, 0x6e, 0x74, 0x78, 0x63, 0x68, 0x75, 0x71, 0x77, 0x68,
-    0x73, 0x72, 0x71, 0x53, 0x76, 0x77, 0x49, 0x71, 0x6f, 0x69, 0x73, 0x78,
-    0x72, 0x75, 0x72, 0x6d, 0x72, 0x71, 0x77, 0x6c, 0x64, 0x75, 0x74, 0x77,
-    0x71, 0x7b, 0x6f, 0x6f, 0x73, 0x71, 0x77, 0x78, 0x74, 0x78, 0x78, 0x75,
-    0x6f, 0x74, 0x70, 0x74, 0x6e, 0x6c, 0x74, 0x79, 0x73, 0x5f, 0x79, 0x54,
-    0x53, 0x82, 0x3b, 0x80, 0x71, 0x80, 0x79, 0x78, 0x79, 0x72, 0x77, 0x6f,
-    0x60, 0x77, 0x74, 0x79, 0x71, 0x7a, 0x86, 0x76, 0x6c, 0x70, 0x82, 0x76,
-    0x79, 0x78, 0x73, 0x6f, 0x6f, 0x6e, 0x6a, 0x82, 0x75, 0x5f, 0x6a, 0x8e,
-    0x70, 0x6b, 0x76, 0x7a, 0x82, 0x79, 0x71, 0x67, 0x5a, 0x7a, 0x70, 0x7c,
-    0x6c, 0x72, 0x72, 0x7a, 0x73, 0x78, 0x63, 0x7c, 0x6b, 0x7d, 0x65, 0x7e,
-    0x7a, 0x48, 0x88, 0x76, 0x81, 0x74, 0x77, 0x73, 0x73, 0x90, 0x7b, 0x78,
-    0x78, 0x50, 0x40, 0x8b, 0x4a, 0x7a, 0x83, 0x86, 0x80, 0x88, 0x7e, 0x82,
-    0x8d, 0x8c, 0x6e, 0x5d, 0x6e, 0x75, 0x7c, 0x7f, 0x7a, 0x47, 0x7d, 0x8e,
-    0x6d, 0x65, 0x85, 0x7d, 0x99, 0x62, 0x7b, 0x79, 0x7d, 0x76, 0x7a, 0x83,
-    0x7e, 0x79, 0x6d, 0x82, 0x86, 0x8d, 0x7a, 0x7c, 0x77, 0x7d, 0x8e, 0x84,
-    0x6c, 0x71, 0x75, 0x6b, 0x6f, 0x73, 0x7a, 0x78, 0x77, 0x77, 0x76, 0x6a,
-    0x69, 0x74, 0x72, 0x63, 0x6e, 0x7f, 0x43, 0x6e, 0x75, 0x75, 0x70, 0x71,
-    0x76, 0x78, 0x78, 0x78, 0x79, 0x72, 0x73, 0x6b, 0x6f, 0x71, 0x6b, 0x69,
-    0x6d, 0x73, 0x73, 0x72, 0x71, 0x6c, 0x6b, 0x72, 0x6f, 0x6f, 0x76, 0x73,
-    0x75, 0x70, 0x76, 0x6d, 0x69, 0x6c, 0x70, 0x74, 0x74, 0x74, 0x76, 0x5c,
-    0x75, 0x82, 0x9a, 0x78, 0x85, 0xb3, 0x65, 0x70, 0x7b, 0x70, 0x7b, 0x6e,
-    0xa8, 0x85, 0x76, 0x91, 0x96, 0x97, 0x4e, 0x75, 0x89, 0x75, 0xaa, 0x68,
-    0x97, 0x7b, 0x6d, 0x5b, 0x80, 0x72, 0x73, 0x9a, 0x85, 0x97, 0x4a, 0x83,
-    0x84, 0x9a, 0x7e, 0x7c, 0xce, 0x86, 0x70, 0x40, 0xa3, 0x73, 0x70, 0x80,
-    0x7f, 0x61, 0x75, 0x8d, 0x87, 0x57, 0x78, 0x70, 0x60, 0xda, 0x98, 0x77,
-    0x78, 0x67, 0x87, 0x78, 0x73, 0x58, 0x63, 0x6d, 0x71, 0x6f, 0x77, 0x7b,
-    0x7d, 0x4e, 0x60, 0x7a, 0x6f, 0x7b, 0x7c, 0x86, 0x7d, 0x71, 0x74, 0x7e,
-    0x7c, 0x99, 0x8b, 0x71, 0x6a, 0x7c, 0x5e, 0x82, 0x70, 0x83, 0x76, 0x7f,
-    0x80, 0x54, 0x64, 0x70, 0x90, 0x8a, 0x77, 0x8a, 0x85, 0x7d, 0x80, 0x82,
-    0x73, 0x74, 0x6d, 0x78, 0x83, 0x98, 0x7d, 0x79, 0x63, 0xa1, 0x7a, 0x66,
-    0x67, 0x71, 0x70, 0x44, 0x70, 0x71, 0x6d, 0x6f, 0x6f, 0x73, 0x6b, 0x69,
-    0x71, 0x6c, 0x6e, 0x6e, 0x6e, 0x72, 0x6d, 0x6f, 0x70, 0x6b, 0x6e, 0x6e,
-    0x72, 0x6d, 0x6f, 0x6e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x74, 0x6a, 0x6f,
-    0x72, 0x6f, 0x71, 0x6c, 0x27, 0x70, 0x6d, 0x70, 0x69, 0x71, 0x6b, 0x6f,
-    0x67, 0x72, 0x73, 0x70, 0x6f, 0x6f, 0x72, 0x6f, 0x72, 0x6e, 0x6b, 0x70,
-    0x7b, 0x63, 0x74, 0x73, 0x6c, 0x7c, 0x73, 0x79, 0x76, 0x57, 0x71, 0x71,
-    0x77, 0x74, 0x6e, 0x6d, 0x70, 0x71, 0x72, 0x74, 0x6f, 0x72, 0x59, 0x5f,
-    0x67, 0x76, 0x76, 0x74, 0x74, 0x70, 0x73, 0x6c, 0x69, 0x6e, 0x78, 0x70,
-    0x70, 0x73, 0x63, 0x74, 0x72, 0x73, 0x73, 0x74, 0x6e, 0x74, 0x6f, 0x70,
-    0x7d, 0x6a, 0x74, 0x75, 0x70, 0x38, 0x6d, 0x6d, 0x6f, 0x61, 0x71, 0x76,
-    0x77, 0x6e, 0x6e, 0x75, 0x6d, 0x71, 0x84, 0x8b, 0x56, 0x72, 0x69, 0x6e,
-    0x63, 0x59, 0x79, 0x87, 0x73, 0x81, 0x2b, 0x60, 0x66, 0x7a, 0x61, 0x81,
-    0x5c, 0x77, 0x77, 0x73, 0x7b, 0x7b, 0x5e, 0x7c, 0x7c, 0x6a, 0x4d, 0x62,
-    0x6b, 0x78, 0x72, 0x77, 0x82, 0x70, 0x70, 0x6e, 0x87, 0x69, 0x71, 0x62,
-    0x74, 0x6d, 0x85, 0x71, 0x79, 0x58, 0x6e, 0x72, 0x7e, 0x88, 0x56, 0x89,
-    0x74, 0x82, 0x6e, 0x78, 0x5e, 0x87, 0x65, 0x5b, 0x6e, 0xa9, 0x6f, 0x82,
-    0x66, 0x6d, 0x89, 0x70, 0x5a, 0x76, 0x9b, 0x6c, 0x9f, 0x6e, 0x6f, 0x5d,
-    0x8f, 0x78, 0x7a, 0x69, 0x80, 0x7d, 0x76, 0x9e, 0x75, 0x92, 0xa5, 0x7f,
-    0x79, 0x7a, 0x79, 0x6e, 0xc9, 0x6d, 0x78, 0x78, 0x72, 0x70, 0x89, 0x73,
-    0x69, 0x55, 0x6e, 0x75, 0x81, 0x6a, 0x99, 0x98, 0x8d, 0x79, 0x7c, 0x73,
-    0x76, 0x71, 0x77, 0x78, 0x78, 0x85, 0x85, 0x74, 0x79, 0x71, 0x79, 0x70,
-    0x68, 0x73, 0x7d, 0x71, 0x6e, 0x70, 0x63, 0x6f, 0x71, 0x7a, 0x73, 0x6f,
-    0x63, 0x6f, 0x6a, 0x70, 0x74, 0x68, 0x6f, 0x74, 0x71, 0x74, 0x81, 0x80,
-    0x7f, 0x7c, 0x71, 0x6d, 0x77, 0x7f, 0x66, 0x87, 0x71, 0x6e, 0x80, 0x6f,
-    0x79, 0x7d, 0x73, 0x77, 0x6a, 0x75, 0x65, 0x77, 0x69, 0x77, 0x7a, 0x76,
-    0x8a, 0x8c, 0x9d, 0x80, 0x92, 0x57, 0x52, 0x62, 0x8d, 0xaa, 0x83, 0x72,
-    0x64, 0x9b, 0x73, 0x66, 0x77, 0x83, 0x64, 0x72, 0x95, 0x7a, 0xd6, 0x85,
-    0x81, 0x62, 0x65, 0x57, 0x80, 0x4d, 0x82, 0x63, 0x6c, 0x81, 0x9d, 0x8e,
-    0x9c, 0x8c, 0x80, 0x85, 0xd0, 0x77, 0x75, 0x44, 0x6d, 0x7f, 0xb2, 0x82,
-    0x74, 0x5c, 0x84, 0x7d, 0x75, 0x60, 0x91, 0x72, 0x5c, 0x72, 0xae, 0x4f,
-    0x75, 0x6d, 0x7a, 0x83, 0x77, 0x7a, 0x6f, 0x74, 0x7d, 0x76, 0x75, 0x76,
-    0x67, 0x7d, 0x79, 0x7a, 0x77, 0x7a, 0x66, 0x6e, 0x6c, 0x4a, 0x7f, 0x76,
-    0x78, 0x7a, 0x75, 0x73, 0x76, 0x69, 0x69, 0x75, 0x78, 0x76, 0x79, 0x84,
-    0x76, 0x7f, 0x74, 0x76, 0x8b, 0x7c, 0x70, 0x75, 0x7c, 0x75, 0x84, 0x83,
-    0x6e, 0x7b, 0x71, 0x72, 0x69, 0x7b, 0x7c, 0x75, 0x62, 0x86, 0x7f, 0x72,
-    0x79, 0x77, 0x77, 0x70, 0x6f, 0x76, 0x6e, 0x78, 0x6f, 0x7a, 0x6d, 0x75,
-    0x5b, 0x75, 0x77, 0x76, 0x6d, 0x7b, 0x6f, 0x70, 0x71, 0x69, 0x77, 0x73,
-    0x75, 0x73, 0x71, 0x71, 0x6c, 0x75, 0x74, 0x70, 0x73, 0x70, 0x73, 0x6f,
-    0x76, 0x78, 0x68, 0x76, 0x6e, 0x63, 0x72, 0x74, 0x6f, 0x75, 0x71, 0x76,
-    0x70, 0x6f, 0x74, 0x6a, 0x68, 0x70, 0x71, 0x78, 0x64, 0x6f, 0x79, 0x78,
-    0x8a, 0x55, 0x53, 0xb1, 0x5f, 0x4a, 0x94, 0x7c, 0x8e, 0x62, 0x90, 0xa9,
-    0x5c, 0x56, 0xbe, 0xae, 0xbc, 0xaa, 0x4c, 0x42, 0x44, 0x35, 0x59, 0x64,
-    0x58, 0x83, 0x6e, 0xbc, 0x8a, 0x8f, 0x36, 0x8b, 0xab, 0x49, 0x5c, 0x51,
-    0x60, 0x4c, 0x9b, 0x4b, 0x83, 0x5a, 0x3a, 0x94, 0xa5, 0x43, 0x47, 0x56,
-    0x68, 0x4f, 0x5f, 0x4e, 0x9e, 0x61, 0x4e, 0xa6, 0xb7, 0xdd, 0x4e, 0xa7,
-    0x6c, 0x5a, 0x77, 0x80, 0x59, 0x56, 0x79, 0x76, 0x7b, 0x67, 0x82, 0x7f,
-    0x74, 0x6d, 0x4e, 0x91, 0x6e, 0x78, 0x83, 0x7f, 0x76, 0x7e, 0x85, 0x7b,
-    0x77, 0x83, 0x7a, 0x6e, 0x5d, 0x65, 0x79, 0x77, 0x71, 0x81, 0x83, 0x8b,
-    0x5f, 0x75, 0x4a, 0x6d, 0xa0, 0x74, 0x74, 0x60, 0x85, 0x77, 0x84, 0x7e,
-    0x72, 0x8b, 0x70, 0x70, 0x7f, 0x7f, 0x73, 0x81, 0x79, 0x92, 0x8a, 0x80,
-    0x81, 0x74, 0x7b, 0x81, 0x61, 0x69, 0x78, 0x8f, 0x5a, 0x7d, 0x8d, 0x7b,
-    0x6c, 0x81, 0x9c, 0x80, 0x69, 0x76, 0x6c, 0x7d, 0x63, 0x5d, 0x80, 0x79,
-    0x59, 0x64, 0x74, 0x75, 0x66, 0x74, 0x6d, 0x7a, 0x6e, 0x70, 0x63, 0x65,
-    0x80, 0x81, 0x7c, 0x71, 0x9a, 0x7b, 0x81, 0x82, 0x8a, 0x7a, 0x92, 0x63,
-    0x62, 0x7a, 0x6d, 0x77, 0x74, 0x55, 0x83, 0x79, 0x6f, 0x85, 0x92, 0x7d,
-    0x71, 0x76, 0x6d, 0x79, 0x76, 0x75, 0x75, 0x76, 0x77, 0x74, 0x70, 0x76,
-    0x72, 0x6d, 0x70, 0x79, 0x7f, 0x6f, 0x70, 0x74, 0x75, 0x76, 0x78, 0x77,
-    0x79, 0x6f, 0x77, 0x78, 0x75, 0x79, 0x76, 0x6f, 0x70, 0x76, 0x7c, 0x7b,
-    0x6f, 0x74, 0x72, 0x79, 0x80, 0x6d, 0x77, 0x60, 0x76, 0x77, 0x81, 0x77,
-    0x75, 0x74, 0x70, 0x6d, 0x73, 0x70, 0x7b, 0x74, 0x76, 0x7a, 0x6f, 0x78,
-    0x6a, 0x66, 0x73, 0x8a, 0x6e, 0x6c, 0x6f, 0x70, 0x79, 0x74, 0x92, 0x62,
-    0x85, 0x81, 0x46, 0x76, 0x5e, 0x6d, 0x6a, 0x7b, 0x6f, 0x80, 0x6b, 0x73,
-    0x6b, 0x74, 0x6b, 0x56, 0x75, 0x76, 0x80, 0x4a, 0x5b, 0x6c, 0x7e, 0x69,
-    0x7f, 0x75, 0x7b, 0x68, 0x92, 0x62, 0x6e, 0x7e, 0x2f, 0x82, 0x82, 0x6a,
-    0x76, 0x76, 0x6e, 0x76, 0x70, 0x69, 0x6d, 0x5d, 0x6f, 0x82, 0x74, 0x69,
-    0x70, 0x70, 0x71, 0x76, 0x76, 0x6c, 0x6a, 0x72, 0x75, 0x6e, 0x72, 0x71,
-    0x73, 0x6c, 0x6e, 0x72, 0x73, 0x71, 0x70, 0x72, 0x71, 0x7b, 0x6e, 0x74,
-    0x73, 0x75, 0x70, 0x74, 0x77, 0x77, 0x70, 0x77, 0x70, 0x73, 0x6a, 0x73,
-    0x73, 0x73, 0x75, 0x6c, 0x77, 0x73, 0x72, 0x74, 0x75, 0x6e, 0x73, 0x72,
-    0x74, 0x73, 0x71, 0x73, 0x73, 0x70, 0x76, 0x73, 0x72, 0x6f, 0x5b, 0x6e,
-    0x5f, 0x76, 0x81, 0x82, 0x8e, 0xa0, 0x76, 0x6e, 0x90, 0xb8, 0x7c, 0x8b,
-    0x86, 0x55, 0x78, 0x6f, 0x64, 0x79, 0x9d, 0x81, 0x95, 0x8a, 0xc4, 0x62,
-    0x81, 0x94, 0x8b, 0xa7, 0x86, 0x69, 0x87, 0xa9, 0xa5, 0x87, 0x69, 0x79,
-    0x62, 0x8b, 0x6a, 0x5c, 0xd3, 0xa1, 0x9d, 0x76, 0x74, 0x8a, 0x73, 0x88,
-    0x6f, 0x64, 0x8a, 0x93, 0x99, 0x60, 0xa3, 0x76, 0x52, 0x78, 0x9b, 0x5f,
-    0x79, 0x63, 0xaa, 0x83, 0x9f, 0x85, 0x7a, 0x76, 0xa6, 0xa2, 0x9f, 0x7e,
-    0x8d, 0x76, 0x6b, 0x72, 0x7f, 0x73, 0x8a, 0x72, 0x8e, 0x6d, 0xa3, 0x7d,
-    0x72, 0x70, 0x79, 0x6a, 0x72, 0x55, 0x65, 0xa4, 0x7a, 0x80, 0x83, 0x91,
-    0x81, 0xa4, 0x83, 0x8f, 0xc2, 0x8a, 0x79, 0x53, 0x6c, 0x83, 0x57, 0x86,
-    0x64, 0x8c, 0x79, 0x92, 0x82, 0x5a, 0x71, 0x73, 0x6a, 0x89, 0x8d, 0x77,
-    0x85, 0x7f, 0x67, 0x70, 0x9f, 0x81, 0x92, 0x63, 0x72, 0xa8, 0x84, 0x56,
-    0x85, 0x73, 0x6f, 0x82, 0x7f, 0x6f, 0x58, 0x73, 0x6f, 0x5f, 0x89, 0x8c,
-    0x67, 0x6d, 0x8d, 0x51, 0x83, 0x5c, 0x7b, 0x92, 0x90, 0x8a, 0x84, 0x79,
-    0x8c, 0x82, 0xa0, 0x6e, 0xce, 0x7d, 0x7c, 0x83, 0x90, 0x7f, 0x96, 0x82,
-    0x7c, 0x92, 0x83, 0x81, 0x7f, 0x60, 0x97, 0x73, 0x9b, 0x78, 0x8c, 0x7a,
-    0x78, 0x79, 0x4b, 0x72, 0x6d, 0x3f, 0x71, 0x67, 0x76, 0x57, 0x72, 0x73,
-    0x5f, 0x6e, 0x72, 0x75, 0x78, 0x6d, 0x6d, 0x6f, 0x71, 0x79, 0x6b, 0x58,
-    0x75, 0x6f, 0x6e, 0x6f, 0x74, 0x6e, 0x6e, 0x77, 0x6b, 0x6c, 0x6e, 0x77,
-    0x6a, 0x73, 0x73, 0x72, 0x6e, 0x69, 0x77, 0x74, 0x74, 0x6e, 0x6d, 0x73,
-    0x77, 0x7a, 0x71, 0x70, 0x6f, 0x61, 0x6a, 0x77, 0x64, 0x5e, 0x6f, 0x68,
-    0x7f, 0x75, 0x83, 0x84, 0x80, 0x88, 0x75, 0x68, 0x5d, 0x6c, 0x76, 0x61,
-    0x50, 0x63, 0x95, 0x71, 0x70, 0x6f, 0x60, 0x6a, 0x78, 0x7d, 0x5e, 0x56,
-    0x57, 0x76, 0x86, 0x6c, 0x61, 0x7c, 0x7a, 0x83, 0x66, 0x80, 0x94, 0x6c,
-    0x4b, 0x89, 0x70, 0x56, 0xbe, 0x47, 0x6b, 0x86, 0x8f, 0x74, 0x83, 0x58,
-    0x69, 0x6a, 0x6f, 0x77, 0x8d, 0x4d, 0x84, 0x82, 0x81, 0xa6, 0x71, 0x87,
-    0x4e, 0x4e, 0x75, 0x7c, 0x8b, 0x6f, 0xa3, 0x62, 0x8a, 0x6d, 0x91, 0x80,
-    0x5b, 0x95, 0x70, 0x7d, 0x90, 0x74, 0x64, 0x68, 0x3c, 0x44, 0xa7, 0x62,
-    0x57, 0x7f, 0x73, 0x83, 0x90, 0x9b, 0x4d, 0x95, 0x8f, 0x7d, 0x4f, 0x61,
-    0x57, 0x93, 0x7f, 0x81, 0xc4, 0x89, 0x47, 0x78, 0xa8, 0x52, 0x60, 0x68,
-    0x5e, 0x8a, 0x68, 0x93, 0x83, 0x5d, 0x5f, 0x73, 0xa4, 0xf1, 0x38, 0x8d,
-    0x78, 0x7b, 0x6c, 0x8b, 0x7b, 0x76, 0x78, 0x73, 0x6a, 0x7b, 0x68, 0x6e,
-    0x6b, 0x6a, 0x83, 0x79, 0x76, 0x77, 0x77, 0x71, 0x66, 0x7b, 0x78, 0x78,
-    0x73, 0x71, 0x6c, 0x80, 0x7d, 0x74, 0x75, 0x76, 0x73, 0x76, 0x6f, 0x70,
-    0x71, 0x7a, 0x6f, 0x6e, 0x9f, 0x87, 0x73, 0x70, 0x59, 0x74, 0x3b, 0x77,
-    0x6e, 0x6c, 0x77, 0x72, 0x6e, 0x73, 0x6e, 0x6d, 0x76, 0x89, 0x7e, 0x79,
-    0x74, 0x76, 0x76, 0x7b, 0x74, 0x74, 0x7a, 0x76, 0x75, 0x74, 0x70, 0x74,
-    0x74, 0x72, 0x73, 0x74, 0x4e, 0x77, 0x79, 0x76, 0x77, 0x77, 0x73, 0x77,
-    0x74, 0x72, 0x75, 0x73, 0x74, 0x75, 0x73, 0x74, 0x72, 0x76, 0x76, 0x78,
-    0x79, 0x79, 0x6f, 0x76, 0x7c, 0x76, 0x76, 0x5e, 0x7c, 0x72, 0x5f, 0x74,
-    0x72, 0x68, 0x6f, 0x76, 0x76, 0x76, 0x78, 0x76, 0x75, 0x71, 0x70, 0x75,
-    0x70, 0x77, 0x6b, 0x98, 0x7a, 0x5e, 0x69, 0x74, 0x54, 0x70, 0x7a, 0x6f,
-    0x72, 0x6e, 0x75, 0x71, 0x77, 0x78, 0x7b, 0x75, 0x79, 0x7e, 0x6f, 0x7d,
-    0x6f, 0x71, 0x7d, 0x75, 0x75, 0x85, 0x70, 0x7a, 0x72, 0x73, 0x77, 0x68,
-    0x77, 0x83, 0x78, 0x73, 0xa1, 0x5e, 0x70, 0x73, 0x73, 0x75, 0x81, 0x60,
-    0x82, 0x6d, 0x76, 0x7b, 0x77, 0x63, 0x84, 0x6f, 0x75, 0x84, 0x7b, 0x7e,
-    0x72, 0x72, 0x71, 0x71, 0x72, 0x71, 0x71, 0x70, 0x72, 0x71, 0x6d, 0x74,
-    0x73, 0x71, 0x72, 0x72, 0x76, 0x70, 0x6a, 0x72, 0x72, 0x6e, 0x70, 0x6e,
-    0x71, 0x71, 0x72, 0x6c, 0x72, 0x71, 0x70, 0x6f, 0x6f, 0x6f, 0x6f, 0x73,
-    0x74, 0x73, 0x70, 0x70, 0x71, 0x71, 0x72, 0x6f, 0x6e, 0x71, 0x73, 0x70,
-    0x73, 0x71, 0x72, 0x72, 0x6f, 0x72, 0x6f, 0x71, 0x75, 0x71, 0x71, 0x70,
-    0x62, 0x6e, 0x75, 0x74, 0x86, 0x51, 0x73, 0x62, 0x7e, 0x72, 0x82, 0x70,
-    0x5c, 0x61, 0x7d, 0x6e, 0x7c, 0x78, 0x6f, 0x88, 0x77, 0x77, 0x9e, 0x39,
-    0x83, 0x73, 0x6e, 0x4d, 0x7f, 0x57, 0x83, 0x93, 0x72, 0x89, 0x71, 0x76,
-    0x7b, 0x87, 0x84, 0x77, 0xb8, 0x6e, 0x74, 0x66, 0x79, 0x83, 0x7d, 0x7b,
-    0x6d, 0x6f, 0x7e, 0x6b, 0x6f, 0x3b, 0x82, 0x69, 0x61, 0xc6, 0x6f, 0x5f,
-    0x79, 0x79, 0x63, 0x7f, 0x6b, 0x7a, 0x72, 0x73, 0x57, 0x72, 0x54, 0x70,
-    0x73, 0x72, 0x54, 0x75, 0x78, 0x77, 0x71, 0x76, 0x72, 0x78, 0x6e, 0x64,
-    0x75, 0x77, 0x7b, 0x6d, 0x71, 0x74, 0x74, 0x72, 0x73, 0x78, 0x7b, 0x78,
-    0x6b, 0x75, 0x73, 0x77, 0x93, 0x74, 0x73, 0x7a, 0x61, 0x6e, 0x7e, 0x62,
-    0x71, 0x72, 0x73, 0x76, 0x72, 0x77, 0x70, 0x78, 0x72, 0x7d, 0x5b, 0x76,
-    0x7b, 0x72, 0x6b, 0x7e, 0x82, 0x5c, 0x5d, 0x86, 0x76, 0x91, 0x7e, 0x67,
-    0x7b, 0x52, 0x71, 0x92, 0x5c, 0x83, 0x72, 0x6a, 0x76, 0x83, 0xae, 0x6b,
-    0x6c, 0x75, 0x80, 0x7f, 0x63, 0x5d, 0x7f, 0x86, 0x8f, 0x86, 0x54, 0x6e,
-    0x70, 0x95, 0x78, 0x7e, 0xc6, 0x80, 0x78, 0x78, 0x7b, 0x73, 0xb2, 0x92,
-    0x71, 0x8c, 0x83, 0x83, 0x9b, 0x50, 0x78, 0x6e, 0x69, 0xd3, 0x7e, 0x95,
-    0x79, 0x8d, 0x80, 0x71, 0x8d, 0x76, 0x6b, 0x39, 0x80, 0xaa, 0x99, 0x4d,
-    0x98, 0xab, 0x33, 0x45, 0x1b, 0x64, 0xb6, 0xbb, 0x90, 0x99, 0xae, 0x9f,
-    0xba, 0x13, 0x2a, 0x65, 0x5f, 0x59, 0xb1, 0x34, 0x2d, 0xa5, 0xc4, 0x9b,
-    0x92, 0x97, 0x76, 0x79, 0x7a, 0x9c, 0xa4, 0x69, 0x7a, 0x97, 0xac, 0x8d,
-    0x4b, 0x85, 0x62, 0x7d, 0x4d, 0xae, 0x9c, 0x69, 0x5b, 0x79, 0xc0, 0x33,
-    0x77, 0x48, 0x60, 0x76, 0x8b, 0x4a, 0x84, 0x82, 0x80, 0x6d, 0x9f, 0x87,
-    0x64, 0x3f, 0x39, 0x92, 0x74, 0x7d, 0x77, 0x6e, 0x7d, 0x6e, 0x77, 0x6d,
-    0x8f, 0x81, 0x5e, 0x62, 0x73, 0x80, 0x66, 0x85, 0x7f, 0x8a, 0x97, 0x69,
-    0x80, 0x7d, 0x86, 0x50, 0xcd, 0x69, 0x85, 0x58, 0x96, 0x6f, 0x8c, 0x6d,
-    0x70, 0x67, 0x72, 0x66, 0x7f, 0x56, 0x70, 0x9d, 0x6a, 0xda, 0x7a, 0x93,
-    0x6b, 0x71, 0x6c, 0x7c, 0x90, 0x9a, 0x87, 0x66, 0x7f, 0x91, 0x99, 0x6c,
-    0x9a, 0x96, 0x58, 0x87, 0x5b, 0x5c, 0x6e, 0x6c, 0x71, 0x5b, 0x8f, 0x5a,
-    0x65, 0x8e, 0x69, 0x5e, 0x78, 0x7b, 0x6a, 0xa7, 0x90, 0x81, 0x6c, 0x7c,
-    0xa2, 0x93, 0x83, 0x8f, 0xca, 0xb0, 0x79, 0x5c, 0x72, 0x80, 0x7a, 0x74,
-    0x83, 0x8d, 0x79, 0x77, 0x99, 0x5a, 0x8b, 0x89, 0x63, 0xda, 0x73, 0x90,
-    0x91, 0x71, 0x91, 0x78, 0x6f, 0x6c, 0x6e, 0x75, 0x92, 0x66, 0x77, 0x7c,
-    0x77, 0x46, 0x90, 0x82, 0x57, 0x68, 0x61, 0x71, 0x82, 0x71, 0x90, 0x62,
-    0x89, 0x74, 0x78, 0x87, 0x6d, 0x62, 0x83, 0x89, 0x78, 0x9d, 0x5d, 0x86,
-    0x7f, 0x69, 0x8a, 0x91, 0xb7, 0x9d, 0x5c, 0x93, 0x7d, 0x8b, 0x73, 0x73,
-    0x60, 0x72, 0x81, 0x6b, 0x82, 0x54, 0x7f, 0x74, 0x5b, 0xc9, 0x68, 0x76,
-    0x71, 0x79, 0x8a, 0x7f, 0x80, 0x66, 0x7a, 0x7e, 0x96, 0x95, 0x9f, 0x85,
-    0x83, 0x85, 0x66, 0x7d, 0x88, 0x72, 0x75, 0x64, 0x79, 0x87, 0xab, 0x70,
-    0x53, 0x72, 0x88, 0x48, 0x75, 0x7d, 0x71, 0x9a, 0x77, 0x8e, 0x9e, 0x71,
-    0x9e, 0xaa, 0x81, 0x7e, 0xc6, 0x8b, 0x8a, 0x62, 0x72, 0x65, 0x73, 0x75,
-    0x5d, 0x58, 0x76, 0x68, 0x7f, 0x59, 0xa7, 0x70, 0x5b, 0xdd, 0x6a, 0x6a,
-    0x6e, 0x6b, 0x84, 0x86, 0x7a, 0x87, 0x82, 0x7e, 0x7e, 0x48, 0x9f, 0x7e,
-    0x8d, 0x7b, 0x72, 0x8d, 0x71, 0x7c, 0x78, 0x8c, 0x82, 0x91, 0x9e, 0x6a,
-    0x71, 0x74, 0x8f, 0x86, 0x58, 0x8e, 0x7b, 0x95, 0x79, 0x7e, 0x8a, 0x87,
-    0x64, 0x81, 0x56, 0x9c, 0x91, 0x80, 0x7d, 0x7b, 0x6e, 0x6c, 0xa1, 0x77,
-    0x81, 0x85, 0x75, 0x74, 0x81, 0xa5, 0x65, 0x50, 0x65, 0x88, 0x6f, 0x89,
-    0x7c, 0x70, 0x5e, 0x79, 0x7d, 0x64, 0x92, 0x7d, 0x83, 0x64, 0x8b, 0x82,
-    0x5c, 0x9c, 0x55, 0x92, 0x9e, 0x80, 0x50, 0x5b, 0x4a, 0x7e, 0x9f, 0x72,
-    0x5e, 0x75, 0x78, 0x6a, 0x90, 0x59, 0x77, 0x9f, 0x93, 0x83, 0x6e, 0x64,
-    0x68, 0x66, 0xa2, 0x7d, 0xcf, 0x83, 0x5d, 0x66, 0x52, 0x77, 0x74, 0x6f,
-    0x84, 0x7d, 0x78, 0x91, 0x7c, 0x5b, 0x7e, 0x7d, 0x8e, 0xe1, 0x74, 0x90,
-    0x83, 0x6b, 0x69, 0x7d, 0x7e, 0x64, 0x70, 0x7e, 0x70, 0x6d, 0x7e, 0x8f,
-    0x60, 0x8d, 0x75, 0x8b, 0xa5, 0x61, 0x6c, 0x69, 0x7b, 0x74, 0x72, 0x65,
-    0x6f, 0x6a, 0x6c, 0x6b, 0x7d, 0x90, 0x74, 0x94, 0x95, 0x90, 0x5a, 0x5a,
-    0x60, 0x76, 0x94, 0x7d, 0xce, 0x8f, 0x85, 0x79, 0x81, 0x79, 0x5d, 0x63,
-    0x80, 0x68, 0x7d, 0x70, 0x77, 0x5d, 0x82, 0x7c, 0x72, 0x95, 0x57, 0x8f,
-    0x70, 0x6f, 0x6e, 0x68, 0x6c, 0x6e, 0x69, 0x72, 0x70, 0x6f, 0x6c, 0x66,
-    0x6a, 0x6c, 0x71, 0x6c, 0x6b, 0x72, 0x69, 0x71, 0x6e, 0x6c, 0x67, 0x66,
-    0x6e, 0x6a, 0x66, 0x6f, 0x6e, 0x6f, 0x70, 0x5c, 0x6d, 0x6d, 0x67, 0x6a,
-    0x6d, 0x6c, 0x6f, 0x6b, 0x5c, 0x6f, 0x6e, 0x70, 0x69, 0x71, 0x68, 0x6f,
-    0x65, 0x6e, 0x6f, 0x72, 0x6e, 0x6f, 0x6e, 0x69, 0x72, 0x5e, 0x68, 0x6d,
-    0x74, 0x67, 0x72, 0x8a, 0x78, 0x76, 0x76, 0x6f, 0x72, 0x77, 0x77, 0x71,
-    0x7a, 0x4c, 0x7b, 0x62, 0x62, 0x68, 0x69, 0x7f, 0x5b, 0x85, 0x6e, 0x76,
-    0x6b, 0x72, 0x7c, 0x61, 0x6f, 0x76, 0x6b, 0x6c, 0x76, 0x75, 0x70, 0x61,
-    0x7f, 0x77, 0x81, 0x45, 0x76, 0x77, 0x70, 0x7b, 0x79, 0x81, 0x74, 0x74,
-    0x71, 0x8b, 0x6f, 0x8a, 0x7a, 0x69, 0x6a, 0x4f, 0x6e, 0x6f, 0x75, 0x7c,
-    0x79, 0x57, 0x7d, 0x8d, 0x7c, 0x77, 0x6a, 0x71, 0x68, 0x68, 0x81, 0x72,
-    0x69, 0x79, 0x6e, 0x74, 0x75, 0x6e, 0x77, 0x74, 0x77, 0x7d, 0x79, 0x6e,
-    0x7b, 0x75, 0x76, 0x79, 0x7a, 0x7e, 0x76, 0x79, 0x79, 0x79, 0x7a, 0x6a,
-    0x70, 0x7a, 0x7a, 0x73, 0xa2, 0x77, 0x6a, 0x73, 0x90, 0x76, 0x8b, 0x60,
-    0x73, 0x67, 0x75, 0x7c, 0x7c, 0x4a, 0x78, 0x71, 0x6f, 0x7d, 0x7a, 0x75,
-    0x73, 0x61, 0x69, 0x6d, 0x7c, 0x6c, 0x91, 0x8a, 0x62, 0x70, 0x60, 0x6a,
-    0x6b, 0x70, 0x83, 0x9a, 0x77, 0x95, 0x4f, 0x55, 0x7c, 0x7d, 0x5a, 0x75,
-    0x44, 0x86, 0x8e, 0x87, 0x9a, 0x81, 0x56, 0x72, 0x81, 0x63, 0x60, 0x55,
-    0x59, 0x70, 0x6f, 0x6b, 0x88, 0x71, 0x63, 0x7f, 0x89, 0x59, 0x6e, 0x65,
-    0x70, 0x69, 0x83, 0x68, 0x88, 0x54, 0x69, 0x77, 0x8b, 0x9e, 0x55, 0x8e,
-    0x6f, 0x68, 0x7b, 0x76, 0x7b, 0x67, 0x6f, 0x77, 0x7f, 0x71, 0x7a, 0x6e,
-    0x6a, 0x77, 0x7d, 0x7c, 0x77, 0x77, 0x77, 0x78, 0x73, 0x7d, 0x7e, 0x7b,
-    0x71, 0x72, 0x6f, 0x74, 0x79, 0x7c, 0x74, 0x77, 0x78, 0x6f, 0x78, 0x67,
-    0x7b, 0x7e, 0x78, 0x70, 0x90, 0x79, 0x6f, 0x78, 0x81, 0x78, 0x7f, 0x77,
-    0x79, 0x63, 0x74, 0x79, 0x75, 0x41, 0x74, 0x73, 0x70, 0x73, 0x74, 0x73,
-    0x64, 0x99, 0x6e, 0x70, 0x94, 0x48, 0x93, 0x7c, 0x6b, 0x7e, 0xa8, 0x7a,
-    0x78, 0x87, 0x62, 0x85, 0x71, 0x83, 0x63, 0x75, 0x60, 0x6b, 0xa4, 0x6c,
-    0x9a, 0x8f, 0x6f, 0x89, 0x88, 0x59, 0x6e, 0x97, 0x84, 0x65, 0x60, 0x80,
-    0x7e, 0x69, 0x7f, 0x5d, 0xd0, 0x6e, 0x84, 0x79, 0x72, 0x67, 0x67, 0x86,
-    0x86, 0x56, 0x84, 0x67, 0x96, 0x63, 0x63, 0x7e, 0x8e, 0xa0, 0x83, 0x6e,
-    0x71, 0x99, 0x8a, 0x7d, 0x87, 0x90, 0x7b, 0x72, 0x73, 0x78, 0xa2, 0x78,
-    0x8e, 0x84, 0x7f, 0x47, 0x5b, 0x8a, 0x6f, 0x60, 0x86, 0x7e, 0xcd, 0x5b,
-    0x93, 0x6b, 0x6c, 0x4b, 0x72, 0x6e, 0x82, 0x7a, 0x6f, 0x80, 0x8d, 0x68,
-    0x8f, 0x81, 0x77, 0x7f, 0xd4, 0xad, 0x94, 0x96, 0x78, 0x7a, 0x60, 0x8f,
-    0x6f, 0x56, 0x84, 0x73, 0x96, 0x5b, 0x83, 0x72, 0x57, 0x76, 0x8d, 0x79,
-    0x71, 0x7e, 0x46, 0x75, 0x79, 0x73, 0x7a, 0x75, 0x74, 0x70, 0x79, 0x73,
-    0x78, 0x73, 0x70, 0x74, 0x70, 0x74, 0x74, 0x6f, 0x6e, 0x7e, 0x6c, 0x71,
-    0x66, 0x5f, 0x7f, 0x6e, 0x6f, 0x7e, 0x70, 0x73, 0x75, 0x65, 0x76, 0x7b,
-    0x72, 0x70, 0x77, 0x71, 0x8d, 0x71, 0x75, 0x70, 0x77, 0x80, 0x62, 0x6e,
-    0x6d, 0x6b, 0x75, 0x77, 0x77, 0x75, 0x63, 0x70, 0x74, 0x79, 0x78, 0x70,
-    0x61, 0x7b, 0x71, 0x7b, 0x77, 0x95, 0x58, 0x71, 0x7e, 0x92, 0x7c, 0x71,
-    0x91, 0x4e, 0x8d, 0x67, 0x7a, 0x8e, 0x41, 0x77, 0x76, 0x61, 0xae, 0x84,
-    0x81, 0x5f, 0x59, 0x9a, 0x78, 0x6d, 0x69, 0x7c, 0xa1, 0x7f, 0xa3, 0x9d,
-    0x72, 0x7a, 0xa3, 0x59, 0xdb, 0x9a, 0x98, 0x51, 0x71, 0x6c, 0x89, 0x8a,
-    0x88, 0x71, 0x78, 0x99, 0x7f, 0x60, 0x8a, 0x71, 0x73, 0x74, 0x89, 0x7e,
-    0x73, 0x9a, 0x3b, 0x80, 0x80, 0x7b, 0x63, 0x85, 0x4c, 0x76, 0x6a, 0x66,
-    0x7d, 0x49, 0x92, 0x74, 0x86, 0x77, 0x77, 0x5b, 0x86, 0x7e, 0x55, 0x4c,
-    0x66, 0x6b, 0x69, 0x80, 0x7c, 0x6e, 0x58, 0x78, 0x6d, 0x90, 0x77, 0x6a,
-    0x58, 0x81, 0x7e, 0x70, 0x9f, 0x49, 0x67, 0x7c, 0x86, 0x76, 0x85, 0x70,
-    0x78, 0x5a, 0x6f, 0x62, 0x79, 0x4e, 0x80, 0x82, 0x7b, 0x88, 0xa1, 0x67,
-    0x5e, 0x8e, 0x84, 0x91, 0x97, 0x53, 0x7d, 0x6f, 0x57, 0x70, 0x70, 0x74,
-    0x73, 0x6d, 0x94, 0x8a, 0x7c, 0x6b, 0x80, 0x76, 0x64, 0x78, 0x7a, 0x47,
-    0x6a, 0x8e, 0x8e, 0x70, 0x64, 0x77, 0x66, 0x8f, 0x75, 0x83, 0x90, 0x97,
-    0x6e, 0x7f, 0x84, 0x74, 0xb5, 0x75, 0x79, 0x63, 0x9b, 0x72, 0x90, 0x79,
-    0x78, 0x70, 0x6e, 0x7d, 0x77, 0x6c, 0x61, 0x77, 0x7b, 0xa4, 0x83, 0x76,
-    0x6e, 0x6d, 0x7e, 0x7c, 0x7f, 0x76, 0x75, 0x79, 0x7f, 0x77, 0x77, 0x6b,
-    0x69, 0x79, 0x7a, 0x78, 0x7f, 0x71, 0x71, 0x76, 0x77, 0x79, 0x73, 0x75,
-    0x6e, 0x77, 0x72, 0x72, 0x7c, 0x77, 0x77, 0x67, 0x7a, 0x6c, 0x78, 0x68,
-    0x75, 0x83, 0x74, 0x6b, 0x91, 0x68, 0x6c, 0x78, 0x7d, 0x74, 0x7f, 0x77,
-    0x7d, 0x63, 0x74, 0x76, 0x71, 0x43, 0x74, 0x74, 0x61, 0x78, 0x70, 0x74,
-    0x5c, 0x6b, 0x70, 0x82, 0x92, 0x92, 0x79, 0x61, 0x87, 0x9b, 0x93, 0x5a,
-    0xb3, 0x92, 0x6b, 0x5d, 0x43, 0x70, 0x6b, 0x79, 0x86, 0x60, 0xb4, 0x94,
-    0x8c, 0x6f, 0x65, 0x63, 0x78, 0x71, 0x72, 0x97, 0x77, 0x85, 0xa5, 0x87,
-    0xa2, 0xac, 0x7f, 0x87, 0xd5, 0x7b, 0x72, 0x6f, 0x72, 0x86, 0x6c, 0x7f,
-    0x79, 0x49, 0x7e, 0x7e, 0x8a, 0x59, 0x8c, 0x69, 0x70, 0x77, 0x9f, 0x7f,
-    0x79, 0x54, 0x6f, 0x86, 0x77, 0x7b, 0x7a, 0x84, 0x77, 0x82, 0x76, 0x81,
-    0x86, 0x7c, 0x63, 0x6e, 0x71, 0x6f, 0x66, 0x6a, 0x7a, 0x83, 0x86, 0x7e,
-    0x61, 0x78, 0x63, 0x7e, 0x8e, 0x76, 0x7d, 0x7d, 0x80, 0x6e, 0x72, 0x71,
-    0x43, 0x5d, 0x74, 0x82, 0xa6, 0x82, 0x81, 0x72, 0x8e, 0x6d, 0x7f, 0x76,
-    0x62, 0x7a, 0x6b, 0x7b, 0x6a, 0x45, 0x76, 0x65, 0x64, 0x8b, 0x60, 0x7c,
-    0x96, 0x5c, 0x75, 0x74, 0x6e, 0x57, 0x91, 0x96, 0x4f, 0x5c, 0x88, 0xa4,
-    0x38, 0x65, 0xa0, 0x9f, 0x97, 0x99, 0x3b, 0x52, 0x65, 0x8f, 0x74, 0x5d,
-    0x79, 0x8d, 0x7e, 0x98, 0x9b, 0xb7, 0x50, 0x94, 0xa3, 0x42, 0x39, 0x6e,
-    0x2c, 0x92, 0x7a, 0x59, 0xa1, 0x3e, 0x54, 0x98, 0xa3, 0x62, 0x84, 0x67,
-    0x94, 0x78, 0x9c, 0x57, 0x83, 0x3b, 0x40, 0x80, 0x97, 0x8f, 0x1c, 0x87,
-    0x73, 0x73, 0x70, 0x6f, 0x6f, 0x71, 0x6f, 0x72, 0x74, 0x73, 0x71, 0x6f,
-    0x70, 0x6c, 0x71, 0x71, 0x6e, 0x76, 0x71, 0x72, 0x71, 0x6e, 0x73, 0x74,
-    0x75, 0x71, 0x70, 0x72, 0x76, 0x72, 0x72, 0x71, 0x78, 0x71, 0x6f, 0x72,
-    0x75, 0x75, 0x70, 0x73, 0x73, 0x73, 0x74, 0x74, 0x72, 0x6d, 0x74, 0x72,
-    0x70, 0x71, 0x75, 0x6a, 0x72, 0x5d, 0x72, 0x82, 0x76, 0x6d, 0x72, 0x6f,
-    0x76, 0x7d, 0x6a, 0x7b, 0x73, 0x7c, 0x74, 0x76, 0x5d, 0x74, 0x52, 0x71,
-    0x70, 0x71, 0x4b, 0x78, 0x78, 0x75, 0x75, 0x75, 0x74, 0x72, 0x70, 0x4b,
-    0x77, 0x7a, 0x76, 0x67, 0x72, 0x72, 0x75, 0x75, 0x71, 0x77, 0x7c, 0x78,
-    0x70, 0x78, 0x6c, 0x70, 0x92, 0x71, 0x74, 0x7b, 0x58, 0x69, 0x73, 0x6c,
-    0x78, 0x70, 0x70, 0x78, 0x73, 0x70, 0x68, 0x78, 0x7a, 0x7e, 0x6d, 0x71,
-    0x75, 0x54, 0x7c, 0x82, 0x8d, 0x63, 0x6e, 0x83, 0x90, 0x70, 0x9a, 0x69,
-    0x6a, 0x5e, 0x53, 0x7a, 0x87, 0x69, 0x71, 0x63, 0x71, 0x74, 0xb6, 0x73,
-    0x5f, 0x7f, 0x75, 0x7b, 0x6d, 0x7f, 0x7c, 0x95, 0x8f, 0x76, 0x62, 0x58,
-    0x64, 0x5f, 0x7b, 0x74, 0xd1, 0x9b, 0x8e, 0x79, 0x92, 0x73, 0x70, 0x6f,
-    0x83, 0x5c, 0x87, 0x7e, 0x74, 0x59, 0x7e, 0x72, 0x73, 0x73, 0x64, 0x87,
-    0x5c, 0x63, 0x77, 0x79, 0x77, 0x65, 0x6e, 0x81, 0x7b, 0x80, 0x83, 0x77,
-    0x60, 0x8c, 0x8b, 0x84, 0x69, 0x72, 0x71, 0x69, 0x6d, 0x8e, 0x87, 0x7b,
-    0x62, 0x7d, 0x67, 0x70, 0x77, 0x85, 0x6d, 0x76, 0x82, 0x8b, 0x65, 0x64,
-    0x79, 0x8b, 0x72, 0x86, 0x99, 0x7b, 0x7e, 0x8c, 0x8e, 0x5c, 0x87, 0x65,
-    0x7f, 0x5b, 0x75, 0x63, 0x65, 0x4a, 0x5f, 0x7a, 0x69, 0x96, 0x80, 0x67,
-    0x50, 0x5b, 0x83, 0x89, 0x74, 0x6d, 0x76, 0x68, 0x7b, 0x77, 0x7e, 0x61,
-    0x7c, 0x56, 0x47, 0x90, 0x84, 0x73, 0x72, 0x7f, 0x72, 0x76, 0x8d, 0x7c,
-    0x86, 0x7e, 0x77, 0x6b, 0x6c, 0x7a, 0x7e, 0x73, 0x7e, 0x75, 0x8d, 0x9c,
-    0x77, 0x62, 0x6b, 0x73, 0xa7, 0x7b, 0x6e, 0x60, 0x85, 0x77, 0x8d, 0x7c,
-    0x75, 0x73, 0x76, 0x81, 0x7e, 0x7e, 0x73, 0x7f, 0x71, 0x81, 0x7a, 0x82,
-    0x91, 0x54, 0x69, 0x71, 0x87, 0xae, 0x7d, 0x79, 0x7f, 0x67, 0x7e, 0x87,
-    0x6b, 0x80, 0x9a, 0x97, 0x8b, 0x85, 0x71, 0x5b, 0x6b, 0x59, 0x98, 0x66,
-    0x65, 0x98, 0x90, 0x76, 0x6f, 0x81, 0x79, 0x8f, 0x85, 0x66, 0x64, 0x62,
-    0x68, 0x63, 0x8d, 0x75, 0xd1, 0x63, 0x87, 0x7a, 0x6f, 0x73, 0x72, 0x65,
-    0x77, 0x71, 0x83, 0x9b, 0xae, 0x5d, 0x64, 0x7f, 0x6d, 0x7e, 0x55, 0x94,
-    0x6f, 0x68, 0x72, 0x76, 0x77, 0x74, 0x78, 0x7f, 0x6c, 0x6a, 0x63, 0x59,
-    0x64, 0x82, 0x73, 0x85, 0x73, 0x72, 0x26, 0x66, 0x57, 0x74, 0x67, 0x74,
-    0x6d, 0x7b, 0x7e, 0x7b, 0x79, 0x78, 0x6b, 0x81, 0x7f, 0x6f, 0x5d, 0x6f,
-    0x6c, 0x6a, 0x74, 0x77, 0x83, 0x6a, 0x67, 0x7c, 0x81, 0x74, 0x72, 0x67,
-    0x73, 0x77, 0x7c, 0x73, 0x79, 0x70, 0x71, 0x73, 0x7e, 0x84, 0x67, 0x7d,
-    0x55, 0x8e, 0x68, 0x63, 0x98, 0x6c, 0x6c, 0x6a, 0x27, 0x72, 0x24, 0x4d,
-    0x74, 0x78, 0x46, 0x8f, 0x82, 0x77, 0x5a, 0x6d, 0x5b, 0x60, 0x2a, 0x3d,
-    0x6e, 0x62, 0x38, 0x5b, 0x3e, 0x5b, 0x78, 0x88, 0x8d, 0x6a, 0x91, 0x3a,
-    0x64, 0x97, 0x76, 0x69, 0x6b, 0x38, 0xa5, 0x6b, 0x8e, 0x55, 0x4a, 0x42,
-    0x5e, 0x8b, 0x60, 0x83, 0x9b, 0x28, 0x51, 0x5f, 0x70, 0x71, 0xa1, 0x92,
-    0x83, 0x86, 0x98, 0x78, 0x90, 0x9d, 0x56, 0x61, 0x86, 0x90, 0x80, 0x97,
-    0x99, 0xa1, 0x60, 0x79, 0x7b, 0x53, 0xa4, 0x7b, 0x8c, 0x7f, 0xc6, 0x67,
-    0x58, 0x6f, 0x75, 0x66, 0x8a, 0xa6, 0x6c, 0xab, 0x83, 0x90, 0x78, 0x96,
-    0x99, 0x9f, 0x75, 0x9a, 0xd0, 0x9b, 0x8d, 0x41, 0x6a, 0x8d, 0x74, 0x73,
-    0x74, 0xb4, 0x7e, 0x92, 0x9c, 0x62, 0x5f, 0x72, 0x4e, 0x73, 0x8b, 0x80,
-    0x68, 0x79, 0x76, 0x7b, 0x6d, 0x71, 0x79, 0x77, 0x75, 0x79, 0x7e, 0x70,
-    0x85, 0x6f, 0x6c, 0x70, 0x6c, 0x7f, 0x6b, 0x72, 0x70, 0x77, 0x7d, 0x78,
-    0x7c, 0x6f, 0x6b, 0x79, 0x7b, 0x77, 0x78, 0x74, 0x79, 0x6d, 0x60, 0x7e,
-    0x6d, 0x70, 0x75, 0x75, 0x7d, 0x6f, 0x73, 0x76, 0x73, 0x76, 0x7c, 0x74,
-    0x74, 0x78, 0x6f, 0x6d, 0x7a, 0x72, 0x71, 0x79, 0x61, 0x6f, 0x81, 0x75,
-    0x75, 0x7c, 0x66, 0x8d, 0x80, 0x7c, 0x74, 0x7d, 0x70, 0x79, 0x65, 0x71,
-    0x7d, 0x4e, 0x7f, 0x71, 0x79, 0x78, 0x75, 0x70, 0x7a, 0x69, 0x7f, 0x4d,
-    0x75, 0x70, 0x73, 0x68, 0x7a, 0x63, 0x77, 0x6f, 0x76, 0x70, 0x77, 0x71,
-    0x7d, 0x6f, 0x7b, 0x78, 0xa2, 0x6c, 0x7a, 0x77, 0x4e, 0x77, 0x5c, 0x78,
-    0x73, 0x87, 0x77, 0x79, 0x73, 0x6a, 0x78, 0x83, 0x71, 0x8f, 0x6b, 0x7c,
-    0x58, 0x6e, 0xab, 0x80, 0x85, 0x7b, 0x54, 0x61, 0xae, 0x89, 0x95, 0x6a,
-    0xad, 0xa4, 0x96, 0x70, 0x6f, 0x66, 0x8e, 0xaa, 0x84, 0x71, 0x95, 0x5f,
-    0x9d, 0x64, 0x62, 0x5c, 0x6c, 0x67, 0x8b, 0x62, 0x72, 0x87, 0x71, 0xce,
-    0x67, 0x96, 0x59, 0x99, 0x80, 0xa3, 0x7e, 0x68, 0x70, 0x97, 0x73, 0xa6,
-    0x65, 0x63, 0x41, 0x85, 0x88, 0xbe, 0x8c, 0x60, 0x6b, 0x61, 0xb7, 0x53,
-    0x75, 0x89, 0x76, 0x7a, 0x9b, 0x7e, 0x6b, 0x61, 0x79, 0xa4, 0x91, 0x75,
-    0x67, 0x68, 0x7c, 0x68, 0x6a, 0x81, 0x4c, 0x88, 0x7d, 0x87, 0x9e, 0x53,
-    0xac, 0x89, 0x7c, 0x78, 0x78, 0x80, 0x6c, 0x8f, 0x6c, 0x5d, 0x7a, 0x84,
-    0x7e, 0x64, 0x84, 0x7c, 0xc6, 0x82, 0x8d, 0x76, 0xa3, 0x7f, 0x6f, 0x7e,
-    0x69, 0x63, 0x82, 0x5c, 0x88, 0x53, 0x63, 0x77, 0x62, 0xd7, 0x5f, 0x5e,
-    0x67, 0x89, 0x8a, 0x7d, 0x74, 0x82, 0x7d, 0x82, 0x84, 0x8c, 0x8d, 0x86,
-    0x7b, 0x7b, 0x6d, 0x7e, 0x74, 0x72, 0x97, 0x83, 0x68, 0x82, 0xc1, 0x70,
-    0xa4, 0x83, 0x61, 0x5a, 0x75, 0x6f, 0x74, 0x93, 0x61, 0x74, 0x65, 0xa6,
-    0x9d, 0x8a, 0x89, 0x77, 0xcd, 0x92, 0x71, 0x7a, 0x8f, 0x87, 0xb4, 0x84,
-    0x7c, 0x7f, 0x86, 0x82, 0x78, 0x64, 0x76, 0x76, 0x62, 0x70, 0x6c, 0x6f,
-    0x70, 0x53, 0x7d, 0x6c, 0x77, 0x68, 0x83, 0x71, 0x80, 0x71, 0x80, 0x69,
-    0x81, 0x87, 0x7c, 0x72, 0x79, 0x67, 0x73, 0x78, 0x75, 0x72, 0x86, 0x5f,
-    0x78, 0x6c, 0x6f, 0x77, 0x80, 0x85, 0x77, 0x7e, 0x84, 0x6d, 0x71, 0x7e,
-    0x83, 0x86, 0x7e, 0x62, 0x8a, 0x6d, 0x70, 0x7b, 0x8c, 0x79, 0x80, 0x63,
-    0x78, 0x6c, 0x74, 0x6d, 0x72, 0x54, 0x6f, 0x76, 0x59, 0x8b, 0x74, 0x6d,
-    0x77, 0x73, 0x7f, 0x82, 0x76, 0x73, 0x70, 0x6e, 0x78, 0x72, 0x79, 0x78,
-    0x7b, 0x7c, 0x6c, 0x79, 0x74, 0x7a, 0x75, 0x7b, 0x79, 0x54, 0x7c, 0x76,
-    0x6c, 0x74, 0x77, 0x6a, 0x7f, 0x73, 0x74, 0x7c, 0x7c, 0x74, 0x6b, 0x70,
-    0x69, 0x7c, 0x76, 0x7e, 0x91, 0x77, 0x71, 0x63, 0x80, 0x74, 0x7a, 0x81,
-    0x66, 0x71, 0x74, 0x7b, 0x71, 0x74, 0x74, 0x76, 0x64, 0x76, 0x7f, 0x80,
-    0x5f, 0x6d, 0x9a, 0x99, 0x96, 0x96, 0x6e, 0x5c, 0x9a, 0x74, 0x83, 0x4b,
-    0x9f, 0x8f, 0x76, 0x78, 0x65, 0x7a, 0x82, 0x69, 0x89, 0x82, 0xc5, 0x77,
-    0x7b, 0x77, 0x98, 0x5a, 0x89, 0x8d, 0x6a, 0x91, 0x73, 0x89, 0x9b, 0x80,
-    0x76, 0x9e, 0x8e, 0x73, 0xd1, 0x93, 0x79, 0x4d, 0x9d, 0x79, 0x72, 0x7f,
-    0x8b, 0x61, 0x74, 0x62, 0x76, 0x62, 0xba, 0x70, 0x56, 0x72, 0x5d, 0x9e,
-    0x66, 0x6d, 0x5f, 0x7c, 0x77, 0x79, 0x94, 0x5b, 0x9a, 0x6c, 0x85, 0x7f,
-    0x67, 0x52, 0x5e, 0xb1, 0x7b, 0x6f, 0x65, 0x7b, 0x75, 0x75, 0x7a, 0x5b,
-    0x64, 0x86, 0x79, 0x46, 0x72, 0x69, 0x61, 0x85, 0x97, 0x7e, 0x95, 0x75,
-    0x7a, 0x74, 0x7e, 0x52, 0xce, 0x94, 0x8c, 0x7a, 0x7f, 0x6b, 0x71, 0x56,
-    0x6e, 0x87, 0x6a, 0x98, 0x76, 0x5d, 0x9c, 0x90, 0x91, 0x71, 0x5d, 0xa6,
-    0x77, 0x73, 0x76, 0x7a, 0x72, 0x78, 0x6c, 0x77, 0x70, 0x77, 0x75, 0x75,
-    0x77, 0x73, 0x70, 0x78, 0x6f, 0x71, 0x71, 0x76, 0x79, 0x70, 0x6c, 0x76,
-    0x78, 0x78, 0x75, 0x75, 0x72, 0x79, 0x70, 0x76, 0x75, 0x73, 0x70, 0x72,
-    0x7b, 0x6f, 0x74, 0x77, 0x81, 0x6e, 0x76, 0x6c, 0x7c, 0x73, 0x6c, 0x74,
-    0x70, 0x70, 0x75, 0x75, 0x6e, 0x73, 0x7a, 0x78, 0x77, 0x7d, 0x72, 0x73,
-    0x75, 0x57, 0xa7, 0x7c, 0x9c, 0xaa, 0x83, 0x5f, 0x87, 0x7a, 0x90, 0x78,
-    0x71, 0x52, 0x84, 0x7a, 0x58, 0x89, 0x65, 0x6e, 0x6d, 0x52, 0x8f, 0x53,
-    0x5b, 0x67, 0x80, 0x6a, 0x8c, 0x9c, 0x73, 0x9b, 0x94, 0x8b, 0x7e, 0x56,
-    0x56, 0x71, 0x81, 0x74, 0xbd, 0x8f, 0x83, 0x5c, 0x83, 0x77, 0x84, 0x62,
-    0x77, 0x75, 0x70, 0x79, 0x85, 0x53, 0x89, 0x70, 0x54, 0xc8, 0x5c, 0x75,
-    0x71, 0x9b, 0x8b, 0x78, 0xb8, 0x76, 0xa9, 0x8e, 0x7f, 0xc3, 0x84, 0x67,
-    0x80, 0xa7, 0x7a, 0x58, 0x73, 0x7e, 0x83, 0x78, 0xa5, 0x87, 0xae, 0x72,
-    0xa7, 0x8d, 0x7f, 0x86, 0x70, 0x62, 0x76, 0x9d, 0x7e, 0x8b, 0x7f, 0x7c,
-    0x63, 0x5e, 0x8b, 0x84, 0xd6, 0x81, 0x54, 0x8d, 0x71, 0x81, 0x73, 0x83,
-    0x70, 0x4f, 0x75, 0x73, 0x82, 0x58, 0x90, 0x70, 0x5f, 0x87, 0x72, 0x52,
-    0x5a, 0x68, 0x7a, 0x77, 0x8e, 0x84, 0x75, 0x73, 0x88, 0x81, 0x7f, 0x70,
-    0x74, 0xac, 0x82, 0x6c, 0x6d, 0x86, 0x55, 0x7c, 0x76, 0x62, 0xb6, 0x5d,
-    0x91, 0x6e, 0x6f, 0x6b, 0x7b, 0x5f, 0x6d, 0x8e, 0x7a, 0x7f, 0x66, 0x66,
-    0x8d, 0x90, 0x8e, 0x7c, 0xce, 0x81, 0x7d, 0x6c, 0x63, 0x73, 0x85, 0x8a,
-    0x79, 0x90, 0x82, 0x7c, 0x86, 0x61, 0xa8, 0x70, 0x54, 0xdc, 0x80, 0x87,
-    0x7a, 0x76, 0x5e, 0x70, 0x9a, 0x8a, 0x72, 0x62, 0x77, 0x7c, 0x86, 0x7a,
-    0x61, 0x5b, 0x60, 0x72, 0x80, 0x66, 0x7f, 0x69, 0x4f, 0x81, 0xb9, 0x4e,
-    0x80, 0x80, 0x71, 0x74, 0x8e, 0x5b, 0x60, 0x8b, 0x8c, 0x71, 0x56, 0x73,
-    0x78, 0x62, 0x96, 0x84, 0xcc, 0xae, 0x89, 0x85, 0x71, 0x85, 0x68, 0x72,
-    0x81, 0x5a, 0x7c, 0x7c, 0x7e, 0x5d, 0x99, 0x97, 0x7c, 0xe9, 0x6f, 0x75,
-    0x76, 0x70, 0x7e, 0x7a, 0x6e, 0x6a, 0x73, 0x73, 0x63, 0x6b, 0x76, 0x73,
-    0x7a, 0x69, 0x77, 0x78, 0x71, 0x70, 0x71, 0x71, 0x6b, 0x78, 0x6b, 0x77,
-    0x77, 0x76, 0x6c, 0x6d, 0x74, 0x78, 0x72, 0x6b, 0x67, 0x63, 0x75, 0x77,
-    0x78, 0x89, 0x74, 0x70, 0x86, 0x74, 0x75, 0x6f, 0x4c, 0x71, 0x5b, 0x57,
-    0x7b, 0x74, 0x73, 0x74, 0x74, 0x74, 0x6d, 0x71, 0x7a, 0x7b, 0x60, 0x72,
-    0x6d, 0x77, 0x2b, 0x72, 0x77, 0x71, 0x65, 0x75, 0x7a, 0x73, 0x78, 0x71,
-    0x5c, 0x7e, 0x77, 0x67, 0x7e, 0x7b, 0x74, 0x72, 0x77, 0x7f, 0x81, 0x71,
-    0x67, 0x74, 0x72, 0x72, 0x6c, 0x75, 0x78, 0x81, 0x79, 0x6b, 0x62, 0x6e,
-    0x64, 0x57, 0x66, 0x71, 0x88, 0x7f, 0x72, 0x72, 0x5b, 0x6f, 0x51, 0x81,
-    0x6f, 0x70, 0x77, 0x75, 0x74, 0x6f, 0x57, 0x7c, 0x67, 0x75, 0x70, 0x77,
-    0x72, 0x75, 0x75, 0x7c, 0x77, 0x77, 0x6a, 0x6e, 0x6c, 0x73, 0x73, 0x73,
-    0x72, 0x73, 0x74, 0x76, 0x4b, 0x74, 0x75, 0x72, 0x72, 0x77, 0x6e, 0x74,
-    0x72, 0x7c, 0x77, 0x72, 0x6d, 0x77, 0x72, 0x73, 0x74, 0x75, 0x72, 0x72,
-    0x7d, 0x6c, 0x72, 0x72, 0x81, 0x72, 0x72, 0x64, 0x76, 0x75, 0x60, 0x73,
-    0x78, 0x71, 0x77, 0x77, 0x78, 0x74, 0x76, 0x72, 0x77, 0x76, 0x76, 0x74,
-    0x7b, 0x7b, 0xa9, 0x81, 0x85, 0x7f, 0x61, 0x8d, 0x8e, 0x9b, 0x9c, 0x58,
-    0x8e, 0xa9, 0x67, 0x7d, 0x78, 0x77, 0x8b, 0x7a, 0x77, 0x94, 0xbd, 0x8c,
-    0x97, 0x6c, 0x6a, 0x77, 0x71, 0x5b, 0x77, 0x96, 0x61, 0x9a, 0x6b, 0x9b,
-    0x8e, 0xa3, 0x7b, 0x7a, 0xcf, 0x81, 0x76, 0x47, 0x70, 0x76, 0x7f, 0x9b,
-    0x64, 0xa3, 0x7c, 0x7f, 0x7f, 0x61, 0x89, 0x72, 0x62, 0x70, 0x77, 0x6e,
-    0x5b, 0x81, 0x3b, 0x86, 0x6c, 0x7f, 0x81, 0x76, 0x74, 0x60, 0x80, 0x72,
-    0x5a, 0x7c, 0x7e, 0x73, 0x6b, 0x79, 0x80, 0x77, 0x6e, 0x6c, 0x7a, 0x77,
-    0x79, 0x75, 0x7c, 0x7d, 0x6b, 0x72, 0x66, 0x81, 0x66, 0x4c, 0x6c, 0x92,
-    0x88, 0x33, 0x6e, 0x83, 0x77, 0x77, 0x78, 0x6f, 0x65, 0x7a, 0x61, 0x7a,
-    0x71, 0x74, 0x70, 0x7c, 0x70, 0x7e, 0x66, 0x76, 0x66, 0x82, 0x74, 0x74,
-    0x75, 0x71, 0x6e, 0x73, 0x71, 0x74, 0x75, 0x6f, 0x78, 0x6f, 0x6d, 0x70,
-    0x63, 0x74, 0x74, 0x72, 0x75, 0x70, 0x73, 0x70, 0x73, 0x73, 0x77, 0x66,
-    0x76, 0x76, 0x70, 0x67, 0x75, 0x6f, 0x75, 0x70, 0x70, 0x6d, 0x75, 0x77,
-    0x75, 0x70, 0x78, 0x70, 0x75, 0x70, 0x70, 0x6a, 0x76, 0x76, 0x76, 0x68,
-    0x76, 0x76, 0x74, 0x77, 0x72, 0x6d, 0x67, 0x72, 0x78, 0x76, 0x69, 0x73,
-    0x6b, 0x76, 0x6c, 0x75, 0x6d, 0x76, 0x74, 0x72, 0x66, 0x6e, 0x72, 0x6b,
-    0x74, 0x79, 0x72, 0x76, 0x6f, 0x7b, 0x76, 0x7e, 0x74, 0x6c, 0x6d, 0x75,
-    0x75, 0x7b, 0x73, 0x62, 0x72, 0x71, 0x74, 0x78, 0x7a, 0x77, 0x72, 0x78,
-    0x71, 0x70, 0x68, 0x6e, 0x7a, 0x74, 0x6d, 0x77, 0x6f, 0x6c, 0x70, 0x79,
-    0x6c, 0x81, 0x71, 0x6d, 0x75, 0x6b, 0x72, 0x78, 0x53, 0x76, 0x79, 0x76,
-    0x57, 0x88, 0x8f, 0x7b, 0x9b, 0x89, 0x98, 0x67, 0x94, 0x86, 0x85, 0x79,
-    0x9f, 0x72, 0x78, 0x8c, 0x85, 0x71, 0x6d, 0x79, 0x67, 0x7f, 0x8b, 0x65,
-    0xbb, 0x9d, 0x76, 0x7e, 0x7b, 0x58, 0x83, 0xa1, 0xa0, 0x6f, 0x97, 0x81,
-    0x83, 0x75, 0x99, 0x71, 0xcf, 0x89, 0x8c, 0x82, 0x71, 0x7d, 0x84, 0x77,
-    0x6b, 0x62, 0x83, 0x7d, 0x82, 0x73, 0x98, 0x7f, 0x68, 0x7a, 0x93, 0x68,
-    0x6f, 0x76, 0x77, 0x7d, 0x78, 0x65, 0x77, 0x6e, 0x71, 0x82, 0x7d, 0x73,
-    0x80, 0x88, 0x77, 0x93, 0x7a, 0x6a, 0x6d, 0x69, 0x6c, 0x8d, 0x78, 0x71,
-    0x72, 0x79, 0x7a, 0x84, 0x76, 0x6d, 0x7a, 0x6a, 0x70, 0x78, 0x90, 0x6e,
-    0x46, 0x71, 0x71, 0x6c, 0xa0, 0x72, 0x7c, 0x7e, 0x84, 0x68, 0x8d, 0x6a,
-    0x79, 0x5c, 0x75, 0x7a, 0x84, 0x50, 0x7b, 0x67, 0x5a, 0x80, 0x7c, 0x7c,
-    0x74, 0x74, 0x83, 0x81, 0x7a, 0x78, 0x71, 0x7a, 0x71, 0x6a, 0x6e, 0x74,
-    0x7a, 0x64, 0x6f, 0x70, 0x77, 0x75, 0x70, 0x72, 0x6a, 0x74, 0x81, 0x7f,
-    0x52, 0x6c, 0x79, 0x6a, 0x6f, 0x77, 0x6f, 0x71, 0x72, 0x79, 0x81, 0x72,
-    0x6e, 0x78, 0x7a, 0x75, 0x75, 0x71, 0x79, 0x78, 0x80, 0x72, 0x66, 0x81,
-    0x72, 0x66, 0x78, 0x6c, 0x70, 0x76, 0x65, 0x7b, 0x70, 0x73, 0x7c, 0x7f,
-    0x65, 0x6d, 0x60, 0x7d, 0x94, 0x6d, 0x79, 0x70, 0x93, 0x84, 0x8f, 0x86,
-    0xac, 0x76, 0x59, 0x65, 0x90, 0x9a, 0x94, 0x80, 0x79, 0x6d, 0xc4, 0x87,
-    0x76, 0x60, 0x68, 0x75, 0x83, 0x9f, 0x5b, 0xa8, 0x84, 0x86, 0x94, 0xa4,
-    0x9c, 0x92, 0x79, 0x74, 0xd1, 0x93, 0x81, 0x71, 0x60, 0x75, 0xb8, 0x6f,
-    0x89, 0x6c, 0x7f, 0x80, 0x82, 0x62, 0x90, 0x88, 0x80, 0x7f, 0x81, 0x6a,
-    0x7b, 0x5c, 0x62, 0x71, 0x78, 0x96, 0x6b, 0x77, 0x89, 0x9b, 0x85, 0x6c,
-    0x84, 0x7c, 0x80, 0x6f, 0x5f, 0x6b, 0x7e, 0x7a, 0x84, 0x9d, 0xa4, 0x6c,
-    0x6f, 0x65, 0x76, 0x77, 0x88, 0x52, 0x72, 0x98, 0x9a, 0x89, 0x7f, 0x6b,
-    0x89, 0x86, 0x74, 0x65, 0x98, 0x7f, 0x8a, 0x66, 0x80, 0x7c, 0xa8, 0x8c,
-    0x75, 0x7b, 0x7e, 0x62, 0xa1, 0x50, 0x7a, 0x80, 0x6f, 0xd1, 0x7e, 0x79,
-    0x7f, 0x83, 0x6b, 0x8a, 0x7e, 0x76, 0x75, 0x7a, 0x76, 0x80, 0x63, 0x74,
-    0x66, 0x70, 0x61, 0x71, 0x7e, 0x7a, 0x78, 0x75, 0x64, 0x70, 0x74, 0x74,
-    0x75, 0x76, 0x5a, 0x8d, 0x76, 0x67, 0x79, 0x76, 0x70, 0x7b, 0x7c, 0x6d,
-    0x6b, 0x6f, 0x78, 0x70, 0xa4, 0x81, 0x7a, 0x72, 0x50, 0x76, 0x39, 0x76,
-    0x73, 0x7c, 0x75, 0x6f, 0x6f, 0x6d, 0x6f, 0x81, 0x71, 0x87, 0x7b, 0x7c,
-    0x7c, 0x6c, 0x7d, 0x8c, 0x78, 0x73, 0x72, 0x77, 0x6e, 0x64, 0x74, 0x7e,
-    0x92, 0x9e, 0x8f, 0x7e, 0x87, 0x7c, 0x6f, 0x76, 0x6e, 0x7b, 0x90, 0x47,
-    0x7b, 0x5e, 0x8b, 0x93, 0x74, 0x76, 0x6d, 0x86, 0x7f, 0x81, 0x77, 0x6c,
-    0x56, 0x85, 0x89, 0x81, 0xb1, 0x4c, 0x70, 0x77, 0x9a, 0x7e, 0x8f, 0x7c,
-    0x65, 0x5c, 0x64, 0x8f, 0x7e, 0x48, 0x8b, 0x96, 0x6f, 0x9c, 0x82, 0x7c,
-    0x7a, 0x70, 0x77, 0x71, 0x86, 0x5a, 0x76, 0x6a, 0x8d, 0x87, 0x86, 0x79,
-    0x92, 0x7d, 0x73, 0x8d, 0x6b, 0x6b, 0x79, 0x82, 0x7c, 0x8a, 0x9b, 0x54,
-    0x8d, 0x86, 0x6f, 0x5f, 0x72, 0x60, 0x7a, 0x8f, 0x78, 0x74, 0x73, 0x77,
-    0x87, 0x8e, 0x9e, 0x84, 0xc8, 0x7a, 0x7b, 0x7b, 0x6e, 0x75, 0xc9, 0x7d,
-    0x78, 0x50, 0x76, 0x79, 0x80, 0x58, 0x82, 0x7a, 0x65, 0xd7, 0x68, 0x5c,
-    0x75, 0x65, 0x70, 0x72, 0x7b, 0x73, 0x87, 0x88, 0x65, 0x67, 0x6c, 0x5f,
-    0x71, 0x53, 0x74, 0x88, 0x76, 0x87, 0x27, 0x62, 0x64, 0x75, 0x66, 0x79,
-    0x63, 0x7b, 0x7d, 0x77, 0x7c, 0x74, 0x5e, 0x7b, 0x80, 0x69, 0x56, 0x55,
-    0x65, 0x65, 0x80, 0x75, 0x89, 0x6c, 0x6f, 0x73, 0x82, 0x61, 0x6f, 0x67,
-    0x70, 0x6c, 0x82, 0x6e, 0x83, 0x5d, 0x72, 0x77, 0x7a, 0x8b, 0x65, 0x81,
-    0x88, 0x91, 0x62, 0x82, 0x85, 0x59, 0x80, 0x6e, 0x7b, 0x67, 0x61, 0x7f,
-    0x56, 0x4e, 0x7c, 0x7e, 0x64, 0x6f, 0x48, 0x67, 0x5a, 0x73, 0x6d, 0x5b,
-    0x71, 0x91, 0x81, 0x97, 0x6a, 0x7e, 0x5d, 0x8c, 0xa0, 0x56, 0x5e, 0x86,
-    0x5a, 0x7e, 0x96, 0x48, 0x9d, 0x67, 0x85, 0x8e, 0xbc, 0x55, 0x79, 0x5a,
-    0x79, 0x54, 0x78, 0x94, 0x7d, 0x62, 0x5d, 0x8d, 0x6c, 0x94, 0x92, 0x8e,
-    0x6c, 0xa5, 0x81, 0x67, 0xa1, 0x9a, 0x5f, 0x63, 0x93, 0x89, 0x9a, 0x5f,
-    0x97, 0x74, 0x6f, 0x6d, 0x65, 0x6b, 0xb7, 0xab, 0xa3, 0x9a, 0x7e, 0x71,
-    0x94, 0x6b, 0x60, 0x6a, 0x6d, 0x6d, 0xac, 0x60, 0x71, 0x96, 0xb6, 0xa5,
-    0x91, 0x9b, 0x6e, 0xa4, 0x68, 0xa7, 0xaa, 0x6f, 0x71, 0xa2, 0x73, 0xa9,
-    0x6b, 0x9b, 0x5e, 0xa0, 0x6a, 0x93, 0x8f, 0x6f, 0x6b, 0x6d, 0xaf, 0x6f,
-    0x7a, 0x51, 0x71, 0x6a, 0x8e, 0x72, 0x66, 0x6f, 0x4e, 0x6b, 0x71, 0x77,
-    0x78, 0x65, 0x46, 0x7b, 0x6c, 0x6e, 0x72, 0x8c, 0x7b, 0x74, 0x89, 0x67,
-    0x68, 0x66, 0x5a, 0x46, 0x8e, 0x80, 0x7a, 0x71, 0x7f, 0x69, 0x71, 0x7a,
-    0x79, 0x6f, 0x7b, 0x65, 0x89, 0x7f, 0x6d, 0x59, 0x59, 0x6f, 0x76, 0x7f,
-    0x7c, 0x4a, 0x5e, 0x76, 0x7d, 0x75, 0x5e, 0x8d, 0x71, 0x81, 0x79, 0x6a,
-    0x76, 0x70, 0x62, 0x78, 0x77, 0x70, 0x74, 0x73, 0x74, 0x81, 0x40, 0x72,
-    0x77, 0x56, 0x7a, 0x7a, 0x75, 0x72, 0x74, 0x73, 0x75, 0x70, 0x61, 0x5d,
-    0x70, 0x72, 0x79, 0x7b, 0x70, 0x64, 0x75, 0x6e, 0x71, 0x87, 0x77, 0x70,
-    0x6d, 0x72, 0x74, 0x72, 0x84, 0x65, 0x71, 0x7c, 0x60, 0x72, 0x59, 0x6f,
-    0x6d, 0x7d, 0x73, 0x71, 0x74, 0x6c, 0x85, 0x76, 0x79, 0x76, 0x7d, 0x72,
-    0x7f, 0x91, 0x8a, 0x83, 0x82, 0x6a, 0x7e, 0x69, 0xac, 0x97, 0x89, 0x6c,
-    0x75, 0x67, 0x76, 0x5d, 0x59, 0x77, 0x6c, 0x67, 0x71, 0x6c, 0xa9, 0x6d,
-    0xa1, 0x8b, 0x8d, 0x7b, 0x61, 0x71, 0x72, 0x91, 0x86, 0x71, 0x56, 0x59,
-    0x9b, 0x80, 0x84, 0x6e, 0xce, 0x63, 0x7d, 0x80, 0x5a, 0x67, 0x73, 0x8f,
-    0x7d, 0x7a, 0x67, 0x6a, 0x92, 0x53, 0x6b, 0x7e, 0x8b, 0xca, 0x87, 0x84,
-    0x76, 0x87, 0x78, 0x7b, 0x8b, 0x67, 0x7e, 0x77, 0x98, 0x8d, 0x97, 0x76,
-    0x75, 0x5c, 0x8c, 0x87, 0x71, 0x75, 0x64, 0x85, 0x8b, 0x77, 0xa8, 0x6b,
-    0x6b, 0x67, 0x89, 0x51, 0x70, 0x7f, 0x78, 0x9c, 0x90, 0x65, 0x59, 0x6f,
-    0x59, 0x7c, 0x9a, 0x8e, 0xc1, 0x9b, 0x8d, 0x8e, 0xa3, 0x66, 0x68, 0x6e,
-    0x62, 0x45, 0x75, 0x62, 0x79, 0x55, 0x58, 0x7a, 0x5c, 0xd9, 0x44, 0x75,
-    0x9f, 0x48, 0x45, 0x91, 0x52, 0x34, 0x92, 0xa2, 0x55, 0x5b, 0x60, 0x9e,
-    0x64, 0x64, 0xa6, 0xa4, 0xa5, 0x89, 0x29, 0x17, 0x4f, 0x72, 0x7e, 0x62,
-    0x3b, 0x9d, 0xbb, 0x9d, 0x84, 0xac, 0x39, 0x8d, 0xa6, 0x3c, 0x35, 0x38,
-    0x30, 0x75, 0x95, 0x6d, 0x99, 0x17, 0x51, 0x93, 0xaa, 0x66, 0x48, 0x36,
-    0x8a, 0x59, 0x8b, 0x29, 0x7f, 0x47, 0x30, 0x72, 0x77, 0x9f, 0x45, 0xae,
-    0x61, 0x6f, 0xac, 0x80, 0x9e, 0x70, 0x4e, 0x5c, 0xa4, 0x7e, 0x88, 0x6d,
-    0x9a, 0xa2, 0x40, 0x99, 0x7e, 0x58, 0x8a, 0x65, 0x89, 0x7b, 0xc5, 0x6a,
-    0x84, 0x73, 0x53, 0x57, 0x6f, 0x57, 0x74, 0x7c, 0x8f, 0x8b, 0x83, 0x74,
-    0x87, 0xa9, 0x82, 0x78, 0xd0, 0x92, 0x80, 0x5b, 0x70, 0x75, 0x72, 0x7c,
-    0x7b, 0x5b, 0x7d, 0x8c, 0x81, 0x69, 0x91, 0x70, 0x75, 0x86, 0xa3, 0x88,
-    0x6e, 0x5e, 0x71, 0x84, 0x7b, 0x6a, 0x73, 0x6c, 0x6f, 0x78, 0x8c, 0x66,
-    0x81, 0x7d, 0x61, 0x6f, 0x71, 0x77, 0x74, 0x7a, 0x76, 0x7e, 0x78, 0x66,
-    0x82, 0x71, 0x6d, 0x68, 0x77, 0x6e, 0x7c, 0x7e, 0x6f, 0x6f, 0x7a, 0x75,
-    0x7f, 0x78, 0x6d, 0x76, 0x90, 0x79, 0x74, 0x6e, 0x2d, 0x82, 0x7b, 0x63,
-    0x6d, 0x6e, 0x6b, 0x71, 0x79, 0x57, 0x71, 0x78, 0x75, 0x7b, 0x6c, 0x70,
-    0x73, 0x74, 0x6f, 0x74, 0x72, 0x74, 0x73, 0x73, 0x79, 0x6f, 0x6f, 0x72,
-    0x6a, 0x73, 0x74, 0x74, 0x74, 0x6f, 0x73, 0x71, 0x74, 0x6f, 0x6d, 0x6e,
-    0x72, 0x6e, 0x73, 0x70, 0x74, 0x73, 0x73, 0x6f, 0x6e, 0x6e, 0x71, 0x73,
-    0x72, 0x74, 0x77, 0x6e, 0x78, 0x6f, 0x70, 0x73, 0x74, 0x74, 0x78, 0x6e,
-    0x73, 0x73, 0x73, 0x75, 0x72, 0x78, 0x6c, 0x72, 0x75, 0x70, 0x6f, 0x6f,
-    0x62, 0x71, 0x81, 0x7e, 0x7d, 0x8d, 0x9f, 0x85, 0x97, 0x94, 0x84, 0x8b,
-    0x87, 0x7e, 0x70, 0x6e, 0x8a, 0x7d, 0x9f, 0x73, 0x7b, 0x57, 0x97, 0x5a,
-    0x82, 0x8e, 0x62, 0x4f, 0x72, 0x5c, 0x73, 0x92, 0x86, 0x93, 0x87, 0x85,
-    0x77, 0x88, 0x8f, 0x89, 0xbe, 0x74, 0x77, 0x6a, 0x6f, 0x7f, 0x65, 0x6e,
-    0x6e, 0x6c, 0x89, 0x89, 0x94, 0x62, 0x83, 0x74, 0x57, 0xca, 0x95, 0x87,
-    0x6b, 0x97, 0x75, 0x76, 0x98, 0x95, 0x27, 0x49, 0x87, 0x6a, 0x8c, 0x34,
-    0x91, 0x8e, 0x5e, 0x6b, 0x73, 0x49, 0x7f, 0x8f, 0x95, 0x81, 0xa1, 0x95,
-    0x8b, 0x5d, 0x50, 0x72, 0x59, 0x5b, 0x93, 0x1e, 0x5e, 0x6f, 0x97, 0x81,
-    0x7b, 0x76, 0x58, 0x86, 0x75, 0x90, 0x9a, 0x6c, 0x75, 0x87, 0xa1, 0x68,
-    0x6f, 0x6e, 0x4f, 0x82, 0x50, 0x98, 0x72, 0x74, 0x2e, 0x59, 0x8e, 0x5f,
-    0x68, 0x6f, 0x74, 0x97, 0x76, 0x54, 0x84, 0x70, 0x75, 0x6d, 0x89, 0x7e,
-    0x8d, 0x76, 0x72, 0x71, 0x70, 0x84, 0x71, 0x67, 0x83, 0xa4, 0x86, 0x68,
-    0x9b, 0x7f, 0x6d, 0x7a, 0x7b, 0x54, 0x6a, 0x6e, 0x73, 0x6e, 0x78, 0x62,
-    0x76, 0x82, 0x85, 0x88, 0xaf, 0x80, 0x7e, 0x88, 0x93, 0x6f, 0x88, 0x6a,
-    0x64, 0x7c, 0x76, 0x6e, 0x8b, 0x61, 0x80, 0x84, 0x8a, 0x9c, 0x78, 0x74,
-    0x79, 0x6c, 0x85, 0x7c, 0x82, 0x86, 0x6a, 0x86, 0x77, 0x7d, 0x83, 0x88,
-    0x57, 0x48, 0x8b, 0x7a, 0x74, 0x7d, 0x69, 0x83, 0x8b, 0x77, 0xa2, 0x5a,
-    0x90, 0x83, 0x70, 0x7e, 0x79, 0x83, 0x7d, 0x88, 0xab, 0x55, 0x33, 0x7c,
-    0x9b, 0x89, 0x81, 0x76, 0xc2, 0x9c, 0x7c, 0x4e, 0x72, 0x75, 0x6f, 0x7f,
-    0x36, 0x5f, 0x71, 0x89, 0x9a, 0x57, 0x8b, 0x7d, 0x8a, 0xc1, 0x8e, 0x75,
-    0x6e, 0x7d, 0x78, 0x7e, 0x6d, 0x7a, 0x77, 0x74, 0x6b, 0x74, 0x6c, 0x76,
-    0x74, 0x70, 0x62, 0x78, 0x79, 0x73, 0x79, 0x6f, 0x70, 0x76, 0x7c, 0x54,
-    0x75, 0x7b, 0x6b, 0x6d, 0x72, 0x7b, 0x73, 0x78, 0x72, 0x77, 0x72, 0x78,
-    0x6e, 0x6f, 0x72, 0x72, 0x8b, 0x76, 0x74, 0x6f, 0x73, 0x73, 0x6f, 0x7d,
-    0x76, 0x72, 0x75, 0x75, 0x76, 0x74, 0x6b, 0x7b, 0x77, 0x75, 0x77, 0x78,
-    0x7c, 0x64, 0x85, 0x86, 0x93, 0x60, 0x83, 0x69, 0x6a, 0x6b, 0x83, 0x6e,
-    0x8d, 0x6b, 0x79, 0x84, 0x68, 0x7a, 0x7a, 0x85, 0x73, 0x7c, 0x8f, 0x81,
-    0x8e, 0x8c, 0x7a, 0x75, 0x8e, 0x85, 0x67, 0x7f, 0x8f, 0x7b, 0x7c, 0x9c,
-    0x8b, 0x93, 0x62, 0x86, 0xba, 0x83, 0x74, 0x7d, 0x95, 0x6a, 0x97, 0x70,
-    0x8b, 0x70, 0x62, 0x78, 0x7f, 0x5b, 0x6f, 0x90, 0x84, 0x99, 0x8d, 0x73,
-    0x6d, 0x64, 0x6e, 0x76, 0x6f, 0x6c, 0x88, 0x73, 0x62, 0x6a, 0x6b, 0x70,
-    0x73, 0x69, 0x77, 0x8a, 0x6d, 0x7e, 0x2e, 0x67, 0x58, 0x77, 0x6c, 0x74,
-    0x3b, 0x7f, 0x7b, 0x7c, 0x85, 0x78, 0x61, 0x6f, 0x85, 0x6d, 0x54, 0x82,
-    0x6a, 0x75, 0x6f, 0x66, 0x86, 0x6a, 0x5e, 0x7a, 0x83, 0x72, 0x69, 0x68,
-    0x69, 0x68, 0x7f, 0x72, 0x80, 0x66, 0x75, 0x72, 0x7b, 0x96, 0x5c, 0x80,
-    0x7a, 0x75, 0x71, 0x77, 0x77, 0x6b, 0x79, 0x72, 0x63, 0x72, 0x52, 0x70,
-    0x79, 0x75, 0x68, 0x78, 0x77, 0x78, 0x74, 0x73, 0x75, 0x74, 0x67, 0x5e,
-    0x75, 0x77, 0x6e, 0x78, 0x6b, 0x70, 0x71, 0x5c, 0x6e, 0x7c, 0x7c, 0x65,
-    0x70, 0x80, 0x77, 0x73, 0x80, 0x73, 0x71, 0x51, 0x67, 0x72, 0x64, 0x74,
-    0x7b, 0x6e, 0x70, 0x71, 0x73, 0x71, 0x76, 0x77, 0x7b, 0x7f, 0x7e, 0x78,
-    0x79, 0x67, 0x77, 0x80, 0x7a, 0x67, 0x76, 0x7b, 0x72, 0x71, 0x7c, 0x74,
-    0x68, 0x77, 0x7a, 0x79, 0x7a, 0x71, 0x78, 0x6f, 0x76, 0x7e, 0x79, 0x71,
-    0x7a, 0x67, 0x79, 0x69, 0x77, 0x71, 0x7a, 0x6f, 0x74, 0x6c, 0x73, 0x64,
-    0x75, 0x85, 0x6a, 0x6f, 0x92, 0x74, 0x70, 0x6b, 0x7f, 0x73, 0x82, 0x6c,
-    0x75, 0x71, 0x77, 0x77, 0x76, 0x35, 0x78, 0x79, 0x71, 0x66, 0x70, 0x74,
-    0x7a, 0x6e, 0x80, 0x78, 0x73, 0x73, 0x71, 0x78, 0x4c, 0x81, 0x51, 0x6f,
-    0x79, 0x6c, 0x7f, 0x7a, 0x73, 0x72, 0x70, 0x71, 0x71, 0x6e, 0x5b, 0x60,
-    0x76, 0x6a, 0x76, 0x7d, 0x78, 0x5b, 0x79, 0x67, 0x6f, 0x7d, 0x78, 0x6a,
-    0x75, 0x71, 0x73, 0x74, 0x84, 0x6d, 0x70, 0x71, 0x7f, 0x72, 0x4a, 0x6f,
-    0x71, 0x7b, 0x71, 0x70, 0x73, 0x6f, 0x82, 0x79, 0x77, 0x78, 0x78, 0x70,
-    0x97, 0x48, 0x6a, 0xa5, 0x4e, 0x49, 0x90, 0x72, 0x75, 0x6e, 0x51, 0x88,
-    0x66, 0x57, 0xbe, 0xae, 0x8e, 0x8a, 0x5d, 0x48, 0x5a, 0x3c, 0x6a, 0x6b,
-    0x57, 0x83, 0x70, 0x85, 0x94, 0x8e, 0x38, 0x99, 0x97, 0x5b, 0x5f, 0x4d,
-    0x68, 0x60, 0x89, 0x4c, 0x7b, 0x4f, 0x3d, 0x9b, 0xb5, 0x40, 0x89, 0x41,
-    0x93, 0x49, 0x63, 0x4a, 0x74, 0x57, 0x6b, 0xbf, 0xad, 0xf9, 0x59, 0xac,
-    0x66, 0x69, 0x78, 0x74, 0x7b, 0x75, 0x78, 0x85, 0x60, 0x6a, 0x69, 0x69,
-    0x6d, 0x6e, 0x74, 0x87, 0x6f, 0x74, 0x2f, 0x62, 0x59, 0x70, 0x6e, 0x7c,
-    0x6e, 0x7d, 0x78, 0x7b, 0x7b, 0x6a, 0x63, 0x81, 0x7d, 0x76, 0x5a, 0x76,
-    0x71, 0x68, 0x67, 0x76, 0x8e, 0x6d, 0x69, 0x78, 0x85, 0x70, 0x6e, 0x65,
-    0x6e, 0x70, 0x81, 0x71, 0x75, 0x67, 0x6d, 0x70, 0x7b, 0x80, 0x63, 0x88,
-    0x7c, 0x5c, 0x73, 0x75, 0x6b, 0x75, 0x79, 0x76, 0x74, 0x7c, 0x49, 0x73,
-    0x7d, 0x60, 0x61, 0x78, 0x70, 0x6e, 0x6d, 0x6f, 0x79, 0x73, 0x6d, 0x7f,
-    0x6c, 0x7a, 0x83, 0x64, 0x7b, 0x75, 0x75, 0x6f, 0x70, 0x8a, 0x6b, 0x71,
-    0x70, 0x79, 0x7c, 0x79, 0x82, 0x4a, 0x72, 0x80, 0xa1, 0x74, 0x81, 0x72,
-    0x70, 0x76, 0x72, 0x72, 0x71, 0x6f, 0x85, 0x74, 0x72, 0x7d, 0x7e, 0x6f,
-    0x7a, 0x7d, 0x6b, 0x7e, 0x71, 0x7c, 0x7a, 0x6e, 0x76, 0x7d, 0x78, 0x71,
-    0x69, 0x5e, 0x6c, 0x7c, 0x7d, 0x78, 0x75, 0x73, 0x69, 0x65, 0x72, 0x7c,
-    0x6d, 0x70, 0x77, 0x70, 0x76, 0x75, 0x76, 0x70, 0x77, 0x6f, 0x76, 0x76,
-    0x7c, 0x7f, 0x6a, 0x6d, 0x8c, 0x65, 0x76, 0x73, 0x4f, 0x74, 0x50, 0x74,
-    0x6d, 0x77, 0x72, 0x70, 0x71, 0x69, 0x6d, 0x79, 0x78, 0x7e, 0x7e, 0x74,
-    0x74, 0x63, 0x74, 0x75, 0x6e, 0x71, 0x7d, 0x79, 0x6e, 0x71, 0x70, 0x73,
-    0x74, 0x72, 0x76, 0x70, 0x63, 0x78, 0x67, 0x7a, 0x6d, 0x66, 0x6f, 0x73,
-    0x75, 0x71, 0x72, 0x73, 0x6e, 0x70, 0x6e, 0x6f, 0x74, 0x77, 0x6b, 0x6f,
-    0x72, 0x76, 0x77, 0x7a, 0x6e, 0x73, 0x74, 0x74, 0x71, 0x68, 0x73, 0x73,
-    0x6a, 0x77, 0x74, 0x73, 0x63, 0x70, 0x7d, 0x6d, 0x6e, 0x80, 0x6f, 0x78,
-    0x68, 0x6b, 0x9a, 0x87, 0xa3, 0x92, 0x83, 0x73, 0x81, 0x67, 0xa2, 0x9c,
-    0x86, 0xa3, 0x6a, 0x7f, 0x65, 0x6e, 0x55, 0x67, 0x6f, 0x81, 0x9e, 0x61,
-    0x8e, 0x73, 0x78, 0x62, 0x76, 0x4d, 0x6a, 0x9b, 0x7c, 0x86, 0x65, 0x7c,
-    0x67, 0xa8, 0x83, 0x7a, 0xd5, 0x78, 0x81, 0xa2, 0x72, 0x6a, 0xb5, 0xa1,
-    0x65, 0x6f, 0x82, 0x8b, 0x87, 0x67, 0x80, 0x94, 0x79, 0xe6, 0x99, 0x7e,
-    0x73, 0x6d, 0x62, 0x8a, 0x8c, 0x69, 0x7b, 0x5c, 0x79, 0x7d, 0xb1, 0x89,
-    0x6d, 0x80, 0x8f, 0x7f, 0xa8, 0x68, 0x58, 0x5d, 0x80, 0x5e, 0x80, 0xa9,
-    0xa1, 0x8e, 0x5f, 0x95, 0x74, 0x84, 0x64, 0x8e, 0x8c, 0x69, 0x61, 0x92,
-    0x9d, 0x5f, 0x95, 0x6e, 0xc4, 0x9f, 0x8b, 0x67, 0x6c, 0x77, 0x72, 0x81,
-    0x74, 0x71, 0x70, 0x8d, 0x60, 0x5c, 0x67, 0x7a, 0x4a, 0x7e, 0x7b, 0x98,
-    0x6a, 0x7e, 0x69, 0x76, 0x74, 0x70, 0x73, 0x6f, 0x64, 0x77, 0x7f, 0x60,
-    0x7c, 0x71, 0x63, 0x72, 0x71, 0x76, 0x75, 0x78, 0x7a, 0x78, 0x7f, 0x62,
-    0x7b, 0x74, 0x64, 0x66, 0x76, 0x6a, 0x7a, 0x7c, 0x76, 0x6b, 0x7b, 0x76,
-    0x80, 0x71, 0x70, 0x7b, 0x92, 0x72, 0x74, 0x6d, 0x62, 0x77, 0x74, 0x5d,
-    0x76, 0x73, 0x6b, 0x75, 0x78, 0x82, 0x71, 0x7a, 0x77, 0x86, 0x70, 0x76,
-    0x6a, 0x72, 0x82, 0x7a, 0x6d, 0x7f, 0x7b, 0x77, 0x78, 0x70, 0x83, 0x74,
-    0x77, 0x6e, 0x77, 0x7b, 0x68, 0x7a, 0x62, 0x71, 0x7e, 0x7e, 0x85, 0x78,
-    0x69, 0x66, 0x6f, 0x70, 0x76, 0x79, 0x75, 0x73, 0x73, 0x6e, 0x6c, 0x71,
-    0x7b, 0x7d, 0x7d, 0x6c, 0x82, 0x7c, 0x67, 0x81, 0x78, 0x70, 0x83, 0x71,
-    0x6a, 0x81, 0x75, 0x71, 0x6e, 0x72, 0x71, 0x79, 0x67, 0x75, 0x7f, 0x71,
-    0x67, 0x6b, 0x68, 0x82, 0x96, 0x6f, 0x85, 0x73, 0x82, 0x87, 0x74, 0x8f,
-    0x98, 0x45, 0x6b, 0x8e, 0x86, 0x90, 0x6e, 0x7d, 0x75, 0x8c, 0xa2, 0x96,
-    0x6c, 0x5d, 0x67, 0x8e, 0x76, 0x81, 0x83, 0x8d, 0x91, 0xa4, 0x43, 0x5d,
-    0x93, 0x70, 0x73, 0x7e, 0xb9, 0x87, 0x71, 0x5a, 0x96, 0x80, 0x65, 0x6e,
-    0x69, 0x79, 0x8f, 0x6c, 0x74, 0x5a, 0x7e, 0x6a, 0x5c, 0xd2, 0x78, 0x7d,
-    0x71, 0x78, 0x56, 0x75, 0x74, 0x77, 0x70, 0x75, 0x6d, 0x67, 0x75, 0x72,
-    0x76, 0x74, 0x6f, 0x72, 0x78, 0x77, 0x75, 0x6d, 0x73, 0x77, 0x70, 0x6c,
-    0x79, 0x70, 0x76, 0x72, 0x76, 0x77, 0x74, 0x6f, 0x74, 0x66, 0x6f, 0x76,
-    0x74, 0x67, 0x78, 0x79, 0x84, 0x71, 0x76, 0x74, 0x75, 0x76, 0x7c, 0x78,
-    0x68, 0x6f, 0x72, 0x77, 0x72, 0x7e, 0x68, 0x76, 0x73, 0x7c, 0x70, 0x76,
-    0x6a, 0x7a, 0x78, 0x76, 0x73, 0x7b, 0x7c, 0x74, 0x65, 0x78, 0x6a, 0x6d,
-    0x79, 0x58, 0x5f, 0x73, 0x74, 0x74, 0x7a, 0x76, 0x79, 0x77, 0x73, 0x6d,
-    0x7b, 0x75, 0x5e, 0x5f, 0x75, 0x6c, 0x77, 0x74, 0x74, 0x6f, 0x72, 0x7c,
-    0x6d, 0x77, 0x77, 0x7d, 0x8f, 0x6e, 0x75, 0x73, 0x70, 0x79, 0x6f, 0x61,
-    0x80, 0x72, 0x6c, 0x6e, 0x73, 0x7c, 0x68, 0x77, 0x77, 0x76, 0x77, 0x7a,
-    0x65, 0x71, 0x6f, 0x44, 0x70, 0x70, 0x6e, 0x6f, 0x6e, 0x72, 0x6b, 0x69,
-    0x72, 0x6d, 0x6e, 0x6e, 0x6e, 0x72, 0x6d, 0x6f, 0x71, 0x6a, 0x6e, 0x6e,
-    0x73, 0x6e, 0x6f, 0x6e, 0x71, 0x71, 0x6e, 0x70, 0x71, 0x73, 0x6b, 0x6f,
-    0x72, 0x70, 0x72, 0x6d, 0x28, 0x6f, 0x6b, 0x6f, 0x69, 0x70, 0x6b, 0x6f,
-    0x66, 0x72, 0x73, 0x70, 0x70, 0x6e, 0x71, 0x70, 0x72, 0x6e, 0x6b, 0x6f,
-    0x77, 0x77, 0x75, 0x7c, 0x78, 0x6f, 0x76, 0x73, 0x77, 0x78, 0x69, 0x76,
-    0x70, 0x74, 0x6d, 0x78, 0x68, 0x6e, 0x6f, 0x6e, 0x7b, 0x69, 0x7f, 0x7e,
-    0x70, 0x55, 0x6e, 0x78, 0x6f, 0x78, 0x76, 0x79, 0x75, 0x72, 0x79, 0x72,
-    0x6d, 0x82, 0x79, 0x73, 0x86, 0x6e, 0x71, 0x69, 0x7f, 0x73, 0x73, 0x7e,
-    0x6e, 0x79, 0x75, 0x70, 0x70, 0x71, 0x7a, 0x78, 0x66, 0x87, 0x6c, 0x7c,
-    0x5d, 0x4a, 0x74, 0x86, 0x82, 0x7b, 0x78, 0x74, 0x86, 0x94, 0x72, 0x9d,
-    0x7c, 0x72, 0x35, 0x96, 0x6d, 0x82, 0x6d, 0x85, 0x81, 0x7b, 0x7b, 0x78,
-    0x5f, 0x83, 0x67, 0x4e, 0x6c, 0x70, 0x74, 0x72, 0x70, 0x67, 0x6c, 0x96,
-    0x70, 0x8d, 0x8b, 0x86, 0xa6, 0x74, 0x7a, 0x90, 0x7f, 0x6c, 0x76, 0x79,
-    0x76, 0x6f, 0x6e, 0x82, 0x81, 0x7d, 0x72, 0x7b, 0x70, 0x8b, 0x8c, 0x8a,
-    0x6a, 0x6e, 0x91, 0x7c, 0x97, 0x9c, 0x67, 0x66, 0x8d, 0xa0, 0x9e, 0x73,
-    0x71, 0x7f, 0x4d, 0x6c, 0x6c, 0x65, 0xa4, 0x7a, 0x8d, 0x6d, 0xb4, 0x64,
-    0x7f, 0x8d, 0x62, 0x51, 0x73, 0x4e, 0x79, 0xaa, 0x68, 0x94, 0x63, 0x77,
-    0xad, 0x9f, 0x7b, 0x70, 0xcf, 0x90, 0x9a, 0x39, 0x7d, 0x7b, 0x75, 0x7f,
-    0x60, 0x8f, 0x71, 0x88, 0x7c, 0x5d, 0x99, 0x6d, 0x53, 0x76, 0x98, 0x53,
-    0x87, 0x7d, 0x70, 0x83, 0x9e, 0x58, 0x70, 0x6c, 0x6c, 0x7e, 0x70, 0x79,
-    0x6b, 0x98, 0x79, 0x7f, 0x97, 0x81, 0x89, 0x77, 0x7d, 0x73, 0x83, 0x76,
-    0x84, 0x71, 0x85, 0x82, 0x88, 0x73, 0x6e, 0x74, 0x7b, 0x67, 0x83, 0x86,
-    0x86, 0x81, 0x81, 0x6f, 0xa2, 0x86, 0x80, 0x8d, 0x78, 0x64, 0x8b, 0x55,
-    0x67, 0x56, 0x6c, 0x5f, 0x78, 0x6e, 0x77, 0x90, 0x5b, 0x9e, 0x70, 0x77,
-    0x77, 0x6e, 0x74, 0x7a, 0x73, 0x7a, 0x76, 0x6f, 0x75, 0x6f, 0x68, 0x74,
-    0x77, 0x83, 0x6f, 0x72, 0x77, 0x6f, 0x73, 0x73, 0x6c, 0x84, 0x50, 0x6f,
-    0x77, 0x73, 0x71, 0x70, 0x73, 0x76, 0x71, 0x74, 0x37, 0x6d, 0x77, 0x63,
-    0x79, 0x70, 0x72, 0x2d, 0x77, 0x70, 0x5b, 0x6e, 0x70, 0x77, 0x6f, 0x71,
-    0x71, 0x77, 0x6e, 0x7f, 0x77, 0x7b, 0x74, 0x55, 0x72, 0x74, 0x75, 0x77,
-    0x87, 0x57, 0xc8, 0x70, 0x7f, 0x5a, 0x75, 0x48, 0xa8, 0x68, 0x8d, 0xa5,
-    0x7e, 0x93, 0x77, 0x71, 0x7f, 0x5e, 0x6f, 0x6e, 0x64, 0x57, 0xa0, 0x79,
-    0x92, 0x89, 0x6d, 0x82, 0x6d, 0x93, 0x55, 0x80, 0x67, 0x88, 0x7f, 0x59,
-    0x6d, 0x91, 0xb4, 0x83, 0xb9, 0x6d, 0x85, 0x60, 0x60, 0x7c, 0x82, 0x62,
-    0x6c, 0x79, 0x83, 0x7e, 0x7c, 0x59, 0x58, 0x84, 0x7e, 0xda, 0x64, 0x94,
-    0x7b, 0x91, 0x88, 0x76, 0x80, 0x9c, 0x73, 0x60, 0x79, 0x69, 0x54, 0x77,
-    0x90, 0x67, 0x89, 0x97, 0x5d, 0x72, 0x7e, 0x7b, 0x8a, 0x7f, 0x96, 0x65,
-    0x81, 0x83, 0x7a, 0x82, 0x6f, 0x4e, 0x80, 0x9d, 0x74, 0x98, 0x5d, 0x77,
-    0x9f, 0x86, 0x82, 0x7b, 0xbd, 0x7c, 0x64, 0x6c, 0x63, 0x90, 0x64, 0x77,
-    0x6a, 0x44, 0x76, 0x82, 0x83, 0x65, 0x85, 0x75, 0x5c, 0xd8, 0x8a, 0x79,
-    0x4e, 0x79, 0xba, 0x75, 0x74, 0x7b, 0x83, 0x6a, 0x7e, 0x8c, 0x68, 0x7f,
-    0xaa, 0x93, 0x68, 0x8a, 0x81, 0x81, 0x47, 0x77, 0x7c, 0x7c, 0xb3, 0x6f,
-    0x7a, 0x88, 0x72, 0x6a, 0x86, 0x80, 0x7b, 0xa5, 0x92, 0x87, 0xae, 0x7d,
-    0x98, 0xa6, 0x72, 0x83, 0xcb, 0xb3, 0x68, 0x85, 0x72, 0x84, 0x89, 0x5b,
-    0x68, 0x6a, 0x75, 0x80, 0x91, 0x51, 0x8e, 0x7b, 0x7b, 0xd8, 0x9e, 0x92,
-    0x7e, 0xa2, 0xa7, 0x5c, 0x91, 0x89, 0x1f, 0x64, 0xa7, 0x9e, 0xb2, 0x33,
-    0xa0, 0xa5, 0x79, 0x3d, 0x27, 0x54, 0xb0, 0x96, 0x86, 0x83, 0xab, 0x9b,
-    0x85, 0x12, 0x5e, 0x38, 0x44, 0x7c, 0x8f, 0x15, 0x3b, 0xa4, 0xb4, 0xa4,
-    0x86, 0x9e, 0x3d, 0xb8, 0x75, 0x7f, 0x98, 0x25, 0x53, 0x6c, 0xc1, 0x94,
-    0x2a, 0x7f, 0x49, 0x81, 0x25, 0x8f, 0x8e, 0x66, 0x33, 0x32, 0xa3, 0x2f,
-    0x88, 0x68, 0x6c, 0x7d, 0x7e, 0x57, 0x99, 0x62, 0x85, 0x71, 0x98, 0x7d,
-    0x66, 0x77, 0x86, 0x6c, 0x7e, 0x69, 0x58, 0x6f, 0x4d, 0x7c, 0xba, 0x70,
-    0x8d, 0x9c, 0x67, 0x5a, 0x6e, 0x48, 0x7b, 0x8b, 0x92, 0xa6, 0x86, 0x56,
-    0x68, 0x8a, 0x83, 0x86, 0xd2, 0x9c, 0x90, 0x85, 0x91, 0x7e, 0x70, 0x8e,
-    0x88, 0x80, 0x84, 0xa0, 0x7f, 0x5b, 0x91, 0x71, 0x6f, 0x84, 0x8c, 0x8e,
-    0x62, 0x7d, 0x79, 0x78, 0x75, 0x73, 0x63, 0x5c, 0x7a, 0x96, 0x88, 0x92,
-    0x6a, 0x9b, 0x46, 0x6a, 0x8f, 0x77, 0x93, 0x6c, 0x72, 0x73, 0x8b, 0x74,
-    0x74, 0x79, 0x63, 0x59, 0x77, 0x7d, 0x7c, 0x8e, 0x72, 0x6c, 0x8b, 0x68,
-    0xa2, 0xa2, 0x7b, 0x87, 0xd0, 0x7c, 0x91, 0x91, 0x77, 0x79, 0x6a, 0x6f,
-    0x69, 0x91, 0x74, 0x9a, 0x70, 0x66, 0x70, 0x9b, 0x5b, 0x79, 0xa7, 0x97,
-    0x79, 0x54, 0x5f, 0x96, 0x6f, 0x8a, 0x84, 0x72, 0x77, 0x7f, 0xa8, 0x50,
-    0x83, 0x9a, 0x57, 0x88, 0x78, 0x89, 0x5a, 0x84, 0x74, 0x83, 0xa0, 0x76,
-    0x6b, 0x78, 0x5c, 0x81, 0x6f, 0x58, 0x55, 0x6f, 0x66, 0x71, 0x6d, 0x81,
-    0x8f, 0x7d, 0x56, 0x84, 0x98, 0x76, 0x7d, 0x33, 0x34, 0x62, 0x72, 0x65,
-    0x56, 0x78, 0x6a, 0x6c, 0x61, 0x5c, 0x7a, 0x4f, 0x76, 0x5f, 0x82, 0x4d,
-    0x6e, 0x77, 0x48, 0x77, 0x76, 0x7e, 0x71, 0x71, 0x6f, 0x5e, 0x71, 0x71,
-    0x79, 0x75, 0x6c, 0x73, 0x77, 0x77, 0x74, 0x6f, 0x71, 0x76, 0x70, 0x72,
-    0x79, 0x6c, 0x71, 0x6c, 0x76, 0x71, 0x73, 0x6f, 0x74, 0x59, 0x6e, 0x76,
-    0x76, 0x5e, 0x73, 0x75, 0x82, 0x72, 0x77, 0x69, 0x68, 0x76, 0x65, 0x74,
-    0x69, 0x67, 0x75, 0x78, 0x72, 0x7a, 0x40, 0x74, 0x72, 0x7d, 0x7b, 0x77,
-    0x73, 0x7a, 0x77, 0x86, 0x5f, 0x78, 0x73, 0x70, 0x74, 0x80, 0x86, 0x77,
-    0x7b, 0x7e, 0x81, 0x89, 0x75, 0x80, 0x6d, 0x73, 0x78, 0x68, 0x7d, 0x7f,
-    0x79, 0x63, 0x88, 0x70, 0x6b, 0x5a, 0x73, 0x6f, 0x7a, 0x7d, 0x89, 0x7b,
-    0x6f, 0x66, 0x71, 0x78, 0x85, 0x81, 0x79, 0x69, 0x77, 0x7d, 0x73, 0x7f,
-    0x6a, 0x92, 0x75, 0x89, 0x6d, 0x68, 0x74, 0x69, 0x79, 0x80, 0x6b, 0x8d,
-    0x51, 0x7a, 0x7b, 0x77, 0x8e, 0x9a, 0x70, 0x69, 0x6c, 0x7e, 0x80, 0x62,
-    0x87, 0x5a, 0x4b, 0x85, 0x4c, 0x7d, 0x80, 0x90, 0x7e, 0x73, 0xa9, 0x5c,
-    0x93, 0x8b, 0x6e, 0x49, 0x75, 0x4a, 0x78, 0xae, 0x7e, 0x85, 0x8c, 0x68,
-    0x86, 0x72, 0x6f, 0x80, 0xcc, 0x83, 0x83, 0x65, 0x90, 0x96, 0x6d, 0x83,
-    0x83, 0x55, 0x6d, 0x9e, 0x80, 0x5b, 0x85, 0x7d, 0x5f, 0x8b, 0x8e, 0x5d,
-    0x5f, 0x7f, 0x99, 0x73, 0x7e, 0x6f, 0x74, 0x66, 0x8f, 0xa1, 0x84, 0x59,
-    0x9b, 0x5d, 0x6c, 0x74, 0x67, 0x7b, 0x92, 0x76, 0x76, 0x6a, 0xa4, 0x50,
-    0xa2, 0x8b, 0x82, 0x39, 0x71, 0x68, 0x82, 0x8e, 0x76, 0x72, 0x69, 0x5c,
-    0x8a, 0x79, 0x81, 0x91, 0xd4, 0x8b, 0x7b, 0x89, 0x71, 0x7b, 0x7d, 0x79,
-    0x6a, 0x4c, 0x7d, 0x77, 0x73, 0x56, 0x8b, 0x7f, 0x5b, 0xbf, 0x92, 0x85,
-    0x75, 0x74, 0x7e, 0x80, 0x77, 0x7a, 0x70, 0x73, 0x6a, 0x6c, 0x6e, 0x72,
-    0x72, 0x70, 0x5f, 0x76, 0x78, 0x75, 0x7c, 0x6f, 0x6b, 0x6a, 0x77, 0x61,
-    0x6c, 0x74, 0x7a, 0x76, 0x74, 0x72, 0x6f, 0x71, 0x70, 0x76, 0x5f, 0x6f,
-    0x5d, 0x72, 0x75, 0x73, 0x78, 0x75, 0x7b, 0x6d, 0x80, 0x73, 0x50, 0x80,
-    0x71, 0x73, 0x78, 0x73, 0x6c, 0x6e, 0x53, 0x78, 0x6b, 0x7c, 0x7d, 0x7a,
-    0x75, 0x5f, 0x43, 0x84, 0x7f, 0x64, 0x8a, 0x75, 0x52, 0x89, 0x66, 0x72,
-    0x78, 0x6a, 0x94, 0x6f, 0x7b, 0x51, 0x70, 0x64, 0x8e, 0x75, 0x5f, 0x67,
-    0x82, 0x8b, 0x5d, 0x7b, 0x84, 0x6a, 0x72, 0x83, 0x81, 0x77, 0xa5, 0x87,
-    0x4b, 0x88, 0x7b, 0x5f, 0x94, 0x76, 0x6f, 0x98, 0x8f, 0x7b, 0x8c, 0x64,
-    0x76, 0x82, 0x70, 0x5a, 0x71, 0x53, 0x84, 0x80, 0x74, 0x96, 0x6d, 0x7c,
-    0x7c, 0x71, 0x83, 0x78, 0x70, 0x73, 0x78, 0x74, 0x66, 0x6c, 0x44, 0x70,
-    0x79, 0x62, 0x66, 0x78, 0x75, 0x72, 0x72, 0x75, 0x72, 0x70, 0x63, 0x72,
-    0x7a, 0x76, 0x69, 0x7e, 0x74, 0x6e, 0x72, 0x6a, 0x70, 0x83, 0x78, 0x6e,
-    0x78, 0x78, 0x73, 0x71, 0x7f, 0x7d, 0x6f, 0x77, 0x74, 0x73, 0x37, 0x71,
-    0x77, 0x70, 0x6f, 0x6c, 0x74, 0x71, 0x74, 0x77, 0x78, 0x76, 0x7f, 0x71,
-    0x6e, 0x6d, 0x66, 0x61, 0x70, 0x71, 0x6f, 0x7e, 0x71, 0x67, 0x6e, 0x71,
-    0x65, 0x6e, 0x71, 0x7f, 0x81, 0x6a, 0x65, 0x63, 0x69, 0x5a, 0x62, 0x72,
-    0x6b, 0x6f, 0x67, 0x69, 0x69, 0x6e, 0x6f, 0x6b, 0x69, 0x73, 0x64, 0x6a,
-    0x66, 0x7a, 0x77, 0x6f, 0x57, 0x6a, 0x73, 0x67, 0x63, 0x70, 0x5f, 0x6d,
-    0x69, 0x69, 0x78, 0x7a, 0x4e, 0x75, 0x6d, 0x69, 0x71, 0x6b, 0x69, 0x57,
-    0x6b, 0x68, 0x64, 0x75, 0x7c, 0x62, 0x93, 0x8d, 0x52, 0x73, 0x67, 0x62,
-    0x66, 0x68, 0x77, 0x8f, 0x82, 0x8c, 0x46, 0x59, 0x59, 0x70, 0x5f, 0x78,
-    0x47, 0x8b, 0x78, 0x83, 0x91, 0x80, 0x55, 0x7b, 0x85, 0x67, 0x58, 0x7a,
-    0x64, 0x6c, 0x6b, 0x6f, 0x88, 0x72, 0x6b, 0x7c, 0x88, 0x72, 0x6c, 0x65,
-    0x71, 0x6b, 0x84, 0x6c, 0x80, 0x69, 0x6a, 0x7d, 0x7b, 0x8f, 0x69, 0x8e,
-    0x54, 0x6b, 0x70, 0x7b, 0x72, 0x89, 0x90, 0x60, 0x6f, 0x8d, 0x79, 0x80,
-    0x88, 0x60, 0x4b, 0x6a, 0x6d, 0x7d, 0x96, 0x7a, 0x73, 0x73, 0x7e, 0x7c,
-    0x78, 0x6d, 0x7f, 0x5a, 0x6e, 0x84, 0x5d, 0x9e, 0x5a, 0x7a, 0x73, 0x98,
-    0x8c, 0x5b, 0x69, 0x87, 0x94, 0x6e, 0x7f, 0x6b, 0x83, 0x85, 0x7f, 0x59,
-    0x7d, 0x79, 0x72, 0x68, 0x7d, 0x9b, 0x8a, 0x72, 0x57, 0x90, 0x8c, 0x71,
-    0x7a, 0x70, 0x88, 0x76, 0x7b, 0x76, 0x73, 0x78, 0x78, 0x74, 0x7b, 0x7d,
-    0x72, 0x6d, 0x73, 0x75, 0x75, 0x75, 0x7b, 0x6e, 0x67, 0x69, 0x81, 0x77,
-    0x6b, 0x7a, 0x73, 0x7a, 0x71, 0x7b, 0x6a, 0x6c, 0x70, 0x78, 0x7a, 0x71,
-    0x6f, 0x7e, 0x7b, 0x74, 0x7f, 0x69, 0x77, 0x7a, 0x7d, 0x69, 0x6d, 0x7a,
-    0x70, 0x76, 0x7c, 0x6f, 0x71, 0x65, 0x83, 0x73, 0x6e, 0x6d, 0x7f, 0x72,
-    0x84, 0x85, 0x8a, 0x84, 0x94, 0x6a, 0x70, 0x6f, 0x77, 0x93, 0x85, 0x7b,
-    0x84, 0x6b, 0x87, 0x7f, 0x68, 0x85, 0x86, 0x76, 0x70, 0x77, 0x93, 0x7a,
-    0x95, 0x82, 0x68, 0x68, 0x84, 0x78, 0x74, 0x95, 0xa4, 0x7b, 0x6f, 0x52,
-    0x91, 0x95, 0x8d, 0x83, 0xc7, 0x78, 0x70, 0x72, 0x8a, 0x6d, 0x76, 0x50,
-    0x7d, 0x62, 0x6f, 0x79, 0x89, 0x6c, 0x9e, 0x6f, 0x72, 0x7f, 0xa8, 0x61,
-    0x74, 0x6e, 0x63, 0x7e, 0x7f, 0x5d, 0x73, 0x71, 0x78, 0x7b, 0x89, 0x46,
-    0x70, 0x71, 0x6d, 0x70, 0x5a, 0x73, 0x67, 0x83, 0x79, 0x92, 0x87, 0x76,
-    0x7c, 0x6f, 0x6b, 0x66, 0x82, 0x82, 0x6b, 0x79, 0x65, 0x73, 0x7b, 0x84,
-    0x7f, 0x85, 0x66, 0x63, 0xa1, 0x80, 0x67, 0x6e, 0x22, 0x81, 0x82, 0x77,
-    0x74, 0x67, 0x69, 0x87, 0x70, 0x66, 0x7c, 0x77, 0x7c, 0x73, 0x7a, 0x6b,
-    0x6c, 0x73, 0x74, 0x6e, 0x6c, 0x67, 0x78, 0x73, 0x6e, 0x76, 0x71, 0x6d,
-    0x68, 0x6d, 0x6d, 0x71, 0x68, 0x7b, 0x6c, 0x71, 0x79, 0x6a, 0x7b, 0x76,
-    0x72, 0x7a, 0x74, 0x75, 0x72, 0x6d, 0x71, 0x7c, 0x7b, 0x76, 0x6d, 0x7e,
-    0x6d, 0x7a, 0x5d, 0x75, 0x77, 0x6e, 0x79, 0x7b, 0x75, 0x6a, 0x77, 0x71,
-    0x75, 0x6b, 0x76, 0x68, 0x67, 0x68, 0x6d, 0x80, 0x74, 0x69, 0x75, 0x63,
-    0x5f, 0x82, 0x84, 0x78, 0x90, 0x71, 0x7a, 0x70, 0x85, 0x85, 0x65, 0x6c,
-    0x87, 0x7d, 0x78, 0x75, 0x65, 0x67, 0x65, 0x8e, 0x7c, 0x7e, 0x93, 0x6a,
-    0x87, 0x7d, 0x68, 0x3a, 0x75, 0x4d, 0x85, 0x8e, 0x4b, 0x78, 0x7c, 0x87,
-    0x82, 0x89, 0x7b, 0x6b, 0xc0, 0x7f, 0x7b, 0x7e, 0x64, 0x72, 0x69, 0x80,
-    0x70, 0x8a, 0x7e, 0x72, 0x8c, 0x50, 0x79, 0x7a, 0x7e, 0xcd, 0x69, 0x69,
-    0x62, 0x7e, 0x82, 0x7b, 0x7f, 0x66, 0x4e, 0x7d, 0x79, 0x86, 0x80, 0x54,
-    0x5c, 0x69, 0x82, 0x75, 0x55, 0x68, 0x88, 0x64, 0x8d, 0x86, 0x96, 0x6e,
-    0x85, 0x88, 0x61, 0x40, 0x75, 0x6e, 0x7d, 0x81, 0x8d, 0x8e, 0x5c, 0x79,
-    0xa4, 0x97, 0x6e, 0x72, 0xcd, 0x6c, 0x7d, 0x59, 0x61, 0x80, 0x73, 0x8a,
-    0x62, 0x63, 0x7d, 0x5e, 0x90, 0x5e, 0x94, 0x7b, 0x5e, 0xc7, 0x76, 0x59,
-    0x75, 0x81, 0x71, 0x8e, 0x8e, 0x5a, 0x6c, 0x78, 0x52, 0x68, 0x89, 0x6a,
-    0x6b, 0x84, 0x70, 0x8a, 0x6b, 0x76, 0x88, 0x7a, 0x78, 0x6e, 0x6f, 0x7b,
-    0x58, 0x6d, 0x8a, 0x73, 0x6f, 0x88, 0x74, 0x7e, 0x80, 0x77, 0x4a, 0x50,
-    0x71, 0x82, 0x82, 0x61, 0xa6, 0x74, 0x64, 0x48, 0x84, 0x63, 0x8d, 0x5f,
-    0x7d, 0x57, 0x75, 0x6a, 0x89, 0x64, 0x9b, 0x8c, 0x5b, 0x7d, 0x59, 0x65,
-    0x80, 0x8c, 0x77, 0x6e, 0x58, 0x7a, 0x65, 0x6e, 0x74, 0x7f, 0x6d, 0x6a,
-    0x67, 0x7b, 0x71, 0x7d, 0x7b, 0x7f, 0x70, 0x80, 0x77, 0x52, 0x7d, 0x6b,
-    0x76, 0x77, 0x6e, 0x62, 0x63, 0x54, 0x6f, 0x6a, 0x7d, 0x75, 0x63, 0x79,
-    0x74, 0x6f, 0x65, 0x75, 0x72, 0x4a, 0x65, 0x77, 0x71, 0x7a, 0x70, 0x72,
-    0x68, 0x70, 0x71, 0x78, 0x68, 0x5f, 0x6f, 0x75, 0x7c, 0x7a, 0x78, 0x79,
-    0x75, 0x6a, 0x79, 0x76, 0x81, 0x5b, 0x77, 0x78, 0x7e, 0x75, 0x7c, 0x77,
-    0x6f, 0x7b, 0x7d, 0x75, 0x78, 0x72, 0x79, 0x77, 0x74, 0x84, 0x77, 0x77,
-    0x79, 0x6c, 0x69, 0x78, 0x7c, 0x7c, 0x71, 0x74, 0x77, 0x6d, 0x78, 0x5a,
-    0x73, 0x81, 0x74, 0x72, 0x92, 0x75, 0x70, 0x72, 0x7e, 0x7a, 0x80, 0x69,
-    0x77, 0x71, 0x72, 0x75, 0x77, 0x39, 0x72, 0x79, 0x6b, 0x7e, 0x67, 0x6d,
-    0xa1, 0x53, 0x66, 0xa7, 0x66, 0x54, 0x79, 0x80, 0x89, 0x6c, 0x56, 0xa7,
-    0x69, 0x46, 0xa9, 0x9f, 0xa7, 0x8b, 0x60, 0x4a, 0x46, 0x39, 0x9e, 0x88,
-    0x5d, 0x7d, 0x83, 0x9c, 0x7e, 0xb4, 0x37, 0x83, 0xc1, 0x5d, 0x63, 0x57,
-    0x6a, 0x52, 0x97, 0x4a, 0x94, 0x5d, 0x43, 0xaa, 0x7f, 0x50, 0x6b, 0x68,
-    0x91, 0x68, 0x6f, 0x4b, 0xac, 0x63, 0x63, 0xb2, 0xa8, 0xe8, 0x60, 0xb5,
-    0x67, 0x7a, 0x63, 0x7b, 0x6c, 0x68, 0x75, 0x72, 0x71, 0x76, 0x79, 0x67,
-    0x7e, 0x77, 0x64, 0x6f, 0x72, 0x74, 0x76, 0x75, 0x80, 0x7b, 0x84, 0x6f,
-    0x82, 0x76, 0x6c, 0x69, 0x75, 0x72, 0x7b, 0x7e, 0x75, 0x70, 0x79, 0x78,
-    0x75, 0x74, 0x6f, 0x7c, 0x90, 0x6e, 0x72, 0x6c, 0x36, 0x76, 0x75, 0x61,
-    0x76, 0x76, 0x6c, 0x7a, 0x79, 0x74, 0x74, 0x7a, 0x75, 0x83, 0x6d, 0x76,
-    0x63, 0x73, 0x87, 0x69, 0x65, 0x58, 0x74, 0x75, 0x7e, 0x82, 0x77, 0x46,
-    0x6f, 0x53, 0x7b, 0x7f, 0x40, 0x6d, 0x76, 0x77, 0x79, 0x6b, 0x83, 0x79,
-    0x6e, 0x72, 0x6c, 0x7e, 0x5b, 0x80, 0x7c, 0x7c, 0x72, 0x7b, 0x7c, 0x7a,
-    0x61, 0x88, 0x66, 0x71, 0x8e, 0x69, 0x6a, 0x62, 0x75, 0x6c, 0x71, 0x68,
-    0x81, 0x79, 0x6c, 0x6e, 0x6c, 0x72, 0x78, 0x81, 0x61, 0x76, 0x75, 0x7a,
-    0x6a, 0x75, 0x76, 0x7c, 0x77, 0x75, 0x70, 0x75, 0x74, 0x73, 0x77, 0x75,
-    0x74, 0x76, 0x6e, 0x78, 0x78, 0x71, 0x79, 0x72, 0x72, 0x7a, 0x71, 0x7b,
-    0x7b, 0x6c, 0x7d, 0x73, 0x76, 0x77, 0x74, 0x77, 0x78, 0x73, 0x6f, 0x71,
-    0x72, 0x74, 0x71, 0x70, 0x80, 0x73, 0x76, 0x71, 0x79, 0x75, 0x48, 0x71,
-    0x71, 0x74, 0x71, 0x75, 0x76, 0x76, 0x7b, 0x75, 0x76, 0x79, 0x73, 0x71,
-    0x7e, 0x72, 0x70, 0x7c, 0x74, 0x78, 0x73, 0x70, 0x69, 0x73, 0x74, 0x6e,
-    0x6f, 0x72, 0x77, 0x6e, 0x6d, 0x6c, 0x7b, 0x73, 0x6c, 0x76, 0x6f, 0x73,
-    0x6b, 0x7a, 0x72, 0x70, 0x73, 0x7e, 0x70, 0x76, 0x71, 0x74, 0x70, 0x6f,
-    0x7a, 0x77, 0x76, 0x6f, 0x7c, 0x71, 0x70, 0x67, 0x7a, 0x71, 0x57, 0x77,
-    0x79, 0x69, 0x74, 0x73, 0x70, 0x78, 0x6e, 0x76, 0x76, 0x7e, 0x6a, 0x74,
-    0x67, 0x77, 0x76, 0x7b, 0x77, 0x72, 0x66, 0x72, 0x74, 0x77, 0x78, 0x75,
-    0x72, 0x6d, 0x71, 0x7e, 0x77, 0x7b, 0x68, 0x77, 0x6e, 0x79, 0x79, 0x7c,
-    0x78, 0x69, 0x81, 0x75, 0x72, 0x74, 0x78, 0x76, 0x6c, 0x70, 0x70, 0x78,
-    0x6c, 0x78, 0x75, 0x79, 0x82, 0x6f, 0x73, 0x69, 0x7d, 0x74, 0x54, 0x71,
-    0x74, 0x73, 0x6a, 0x70, 0x7c, 0x70, 0x7c, 0x73, 0x76, 0x81, 0x7c, 0x76,
-    0x76, 0x7a, 0x9c, 0x78, 0x7c, 0x95, 0x4d, 0x50, 0x96, 0x78, 0x7c, 0x6b,
-    0x8b, 0x96, 0x8a, 0x68, 0x65, 0x6a, 0x57, 0x71, 0x7e, 0x5c, 0xb4, 0x64,
-    0x70, 0x70, 0x94, 0x70, 0x76, 0x68, 0x70, 0x98, 0x96, 0x85, 0x77, 0x73,
-    0x87, 0x6c, 0x86, 0x76, 0xcb, 0x8d, 0x87, 0x67, 0x80, 0x7e, 0x92, 0x72,
-    0x8c, 0x5c, 0x71, 0x8d, 0x7d, 0x55, 0x71, 0x6c, 0x7b, 0x75, 0x9a, 0x84,
-    0x70, 0x67, 0x6e, 0x65, 0x65, 0x6f, 0x6b, 0x6e, 0x6f, 0x6e, 0x69, 0x6d,
-    0x6d, 0x69, 0x6b, 0x64, 0x69, 0x6d, 0x6f, 0x72, 0x6b, 0x6c, 0x68, 0x6e,
-    0x6f, 0x6d, 0x6b, 0x6c, 0x6e, 0x70, 0x6e, 0x65, 0x66, 0x6d, 0x4e, 0x6b,
-    0x69, 0x60, 0x6b, 0x6c, 0x50, 0x70, 0x64, 0x6a, 0x5e, 0x71, 0x72, 0x6e,
-    0x72, 0x67, 0x75, 0x6f, 0x60, 0x71, 0x71, 0x6f, 0x71, 0x60, 0x57, 0x61,
-    0x60, 0x6f, 0x7b, 0x77, 0x76, 0x6f, 0x7a, 0x75, 0x7c, 0x6e, 0x78, 0x84,
-    0x81, 0x52, 0x6a, 0x6f, 0x64, 0x75, 0x7d, 0x89, 0x78, 0x6e, 0x7e, 0x70,
-    0x74, 0x79, 0x7a, 0x5b, 0x75, 0x77, 0x67, 0x7f, 0x5f, 0x7b, 0x72, 0x72,
-    0x76, 0x65, 0x79, 0x7b, 0x93, 0x7b, 0x7c, 0x5d, 0x7f, 0x85, 0x6f, 0x5a,
-    0x79, 0x6c, 0x73, 0x71, 0x80, 0x87, 0x7c, 0x75, 0x69, 0x84, 0x87, 0x81,
-}};
-
-const union {
-  uint8_t bytes[4];
-  float values[1];
-} dnn_hiddenlayer_0_weights__1__cf__1_quantized_min = {{
-    0x77, 0xe6, 0x47, 0xc1,
-}};
-
-const int32_t dnn_logits_weights__3__cf__3_shape[2] = {DNN_BIASES_SIZE, 1};
-const union {
-  uint8_t bytes[2 * 2 * DNN_BIASES_SIZE];
-  float values[DNN_BIASES_SIZE];
-} dnn_logits_weights__3__cf__3 = {{
-    0xef, 0x68, 0x61, 0xbd, 0xe0, 0x99, 0x5a, 0x3d, 0x5a, 0x63, 0xb4, 0x3d,
-    0x87, 0x88, 0x26, 0xbe, 0x71, 0x95, 0x75, 0x3d, 0x88, 0x5b, 0x46, 0x3d,
-    0x35, 0x40, 0x47, 0xbd, 0xdd, 0x36, 0x62, 0xbd, 0x4d, 0x0e, 0x8e, 0x3d,
-    0x0f, 0x5e, 0x69, 0x3d, 0x94, 0x0d, 0xd4, 0x3d, 0x2d, 0xc7, 0x8b, 0xbd,
-    0xe1, 0x18, 0x52, 0x3d, 0x54, 0xbd, 0xb3, 0x3d, 0x15, 0x2e, 0xbf, 0xbd,
-    0xf7, 0xae, 0xb3, 0xbd, 0x0f, 0x85, 0x77, 0xbd, 0xdd, 0x25, 0xad, 0xbd,
-    0x15, 0xac, 0x06, 0x3e, 0x61, 0xc3, 0x9a, 0x3d, 0xc4, 0xca, 0x6a, 0x3d,
-    0xe7, 0x15, 0x7a, 0x3d, 0xf6, 0xd5, 0xbb, 0x3d, 0x73, 0x68, 0xb4, 0x3d,
-    0x4f, 0xea, 0x65, 0x3d, 0x82, 0x9f, 0x11, 0xbd, 0xc0, 0x41, 0x56, 0xbd,
-    0x6a, 0x7b, 0x8b, 0xbd, 0x00, 0xb4, 0x75, 0xbd, 0x1d, 0x7e, 0x3a, 0xbd,
-    0x6a, 0x66, 0xaa, 0x3d, 0x2f, 0x8c, 0xa8, 0xbd, 0x43, 0xfb, 0xd5, 0xbd,
-    0xcd, 0x19, 0x9d, 0x3d, 0xa3, 0x23, 0x0a, 0x3e, 0x19, 0xfa, 0x2a, 0x3d,
-    0x86, 0x8e, 0xf7, 0x3c, 0xcc, 0x5e, 0x81, 0x3d, 0xde, 0x0a, 0x55, 0xbd,
-    0x68, 0x3d, 0x85, 0x3d, 0x0f, 0x91, 0x4d, 0xbe, 0xe5, 0x67, 0x87, 0x3d,
-    0x9d, 0xf3, 0x89, 0x3d, 0xeb, 0x10, 0x76, 0xbd, 0x6a, 0xaf, 0x77, 0xbe,
-    0x8b, 0x90, 0x39, 0x3d, 0xbb, 0x92, 0x0f, 0x3e, 0xab, 0x86, 0x56, 0x3d,
-    0x43, 0xa0, 0x3b, 0xbd, 0xc0, 0xd0, 0x6e, 0x3d, 0x44, 0xf3, 0xc4, 0xbd,
-    0xc9, 0xa8, 0x1d, 0x3d, 0xe7, 0xd9, 0x6a, 0xbd, 0xfe, 0x78, 0x46, 0x3d,
-    0x57, 0x98, 0x86, 0x3d, 0x05, 0xb3, 0xa2, 0xbd, 0x13, 0xaa, 0x37, 0xbd,
-    0xd2, 0x77, 0x8e, 0xbd, 0xfa, 0x3e, 0xc3, 0x3d, 0x62, 0x28, 0xcb, 0xbd,
-}};
-
-const union {
-  uint8_t bytes[4];
-  float values[1];
-} dnn_hiddenlayer_0_weights__1__cf__1_quantized_max = {{
-    0x33, 0x8b, 0x75, 0x41,
-}};
-
-const int32_t dnn_hiddenlayer_0_biases__0__cf__0_shape[1] = {DNN_BIASES_SIZE};
-const union {
-  uint8_t bytes[2 * 2 * DNN_BIASES_SIZE];
-  float values[DNN_BIASES_SIZE];
-} dnn_hiddenlayer_0_biases__0__cf__0 = {{
-    0xc9, 0x07, 0xbd, 0xbe, 0xa3, 0xf2, 0x2d, 0xbf, 0x33, 0x91, 0x43, 0xbf,
-    0x03, 0xfc, 0x00, 0xc0, 0xb7, 0x9e, 0x82, 0xbf, 0x6a, 0xd2, 0x0c, 0xbf,
-    0x4e, 0x99, 0x64, 0xbf, 0x7f, 0xfc, 0xe6, 0xbe, 0x11, 0xed, 0x3b, 0xbf,
-    0x50, 0xf0, 0x34, 0xbf, 0xcd, 0xbc, 0xbb, 0xbf, 0x80, 0xdb, 0x73, 0xbf,
-    0x82, 0x41, 0x3d, 0xbf, 0xee, 0xd3, 0x8c, 0xbf, 0xa1, 0x42, 0x28, 0xbf,
-    0x34, 0xb4, 0x87, 0xbf, 0x70, 0x7e, 0x51, 0xbf, 0x55, 0xce, 0x08, 0xbf,
-    0x2e, 0xf1, 0x9b, 0xbf, 0x8e, 0xc4, 0xa3, 0xbe, 0x13, 0x63, 0x39, 0xbf,
-    0xbf, 0x11, 0x41, 0xbf, 0xdb, 0xc7, 0xe1, 0xbf, 0x4e, 0x84, 0x31, 0xbf,
-    0xc9, 0xa0, 0x1f, 0xbf, 0xf4, 0x51, 0x4b, 0xbf, 0xf6, 0xb6, 0x21, 0xbf,
-    0x5a, 0x73, 0x4c, 0xbf, 0x14, 0xac, 0xb6, 0xbe, 0x9a, 0x26, 0x28, 0xbf,
-    0x8f, 0x03, 0xcf, 0xbe, 0x0a, 0x7c, 0x61, 0xbf, 0x4c, 0x6a, 0x52, 0xbf,
-    0x1c, 0x11, 0x3b, 0xbf, 0x5c, 0xe5, 0xbe, 0xbf, 0xb0, 0xfa, 0x76, 0xbf,
-    0xce, 0x1f, 0x5b, 0xbf, 0xe1, 0x69, 0x66, 0xbf, 0x34, 0x39, 0x51, 0xbf,
-    0xdb, 0xc0, 0x68, 0xbf, 0xca, 0x5a, 0x7d, 0xc0, 0x6a, 0xe3, 0x41, 0xbf,
-    0x30, 0x7b, 0x38, 0xbf, 0x7a, 0x50, 0x1d, 0xbf, 0x19, 0x17, 0xef, 0xbf,
-    0x30, 0xdc, 0xce, 0xbe, 0x67, 0x8e, 0xa7, 0xbf, 0x2e, 0x03, 0x35, 0xbf,
-    0xbb, 0x71, 0x89, 0xbe, 0x78, 0xae, 0xbb, 0xbe, 0xf3, 0xd1, 0x97, 0xbc,
-    0xf0, 0xbe, 0xc1, 0xbe, 0x92, 0x6d, 0x34, 0xbf, 0xde, 0xc5, 0xc3, 0xbe,
-    0xe2, 0x48, 0x30, 0xbf, 0x69, 0x13, 0x25, 0xbf, 0x91, 0xea, 0xb6, 0xbe,
-    0x35, 0xea, 0x11, 0xc0, 0x9d, 0xa5, 0xc5, 0xbf, 0xb5, 0xe4, 0x82, 0xbf,
-}};
-
-}  // anonymous namespace
-
-// -----------------------------------------------------------------------------
-// INFERENCE
-// -----------------------------------------------------------------------------
-
-void Inference(const float* __restrict features /* shape: 1,FEATURES_SIZE */
-               ,
-               float* __restrict prediction /* shape: 1,1 */
-               ,
-               FixedAllocations* __restrict fixed) {
-  const int32_t features_shape[] = {1, FEATURES_SIZE};
-
-  // dnn/hiddenlayer_0/weights/_1__cf__1
-  DequantizeMinFirst<uint8_t>(
-      2, dnn_hiddenlayer_0_weights__1__cf__1_quantized_const_shape,
-      dnn_hiddenlayer_0_weights__1__cf__1_quantized_const.values,
-      dnn_hiddenlayer_0_weights__1__cf__1_quantized_min.values,
-      dnn_hiddenlayer_0_weights__1__cf__1_quantized_max.values, fixed->alloc0);
-
-  fixed->alloc0_shape[0] = FEATURES_SIZE;
-  fixed->alloc0_shape[1] = DNN_BIASES_SIZE;
-
-  // dnn/hiddenlayer_0/MatMul_merged_with_dnn/hiddenlayer_0/BiasAdd
-  FullyConnected<float>(features_shape, features, fixed->alloc0_shape,
-                        fixed->alloc0, dnn_hiddenlayer_0_biases__0__cf__0_shape,
-                        dnn_hiddenlayer_0_biases__0__cf__0.values,
-                        fixed->alloc1);
-  fixed->alloc1_shape[0] = 1;
-  fixed->alloc1_shape[1] = DNN_BIASES_SIZE;
-
-  // dnn/hiddenlayer_0/hiddenlayer_0/Relu
-  Relu<float>(2,  // rank
-              fixed->alloc1_shape, fixed->alloc1, fixed->alloc0);
-  fixed->alloc0_shape[0] = 1;
-  fixed->alloc0_shape[1] = DNN_BIASES_SIZE;
-
-  // dnn/logits/MatMul_merged_with_dnn/logits/BiasAdd
-  FullyConnected<float>(
-      fixed->alloc0_shape, fixed->alloc0, dnn_logits_weights__3__cf__3_shape,
-      dnn_logits_weights__3__cf__3.values, dnn_logits_biases__2__cf__2_shape,
-      dnn_logits_biases__2__cf__2.values, prediction);
-}
-
-}  // namespace tfnative_model
-}  // namespace ml
-}  // namespace power
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h b/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h
deleted file mode 100644
index c7a6858..0000000
--- a/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h
+++ /dev/null
@@ -1,43 +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.
-
-// This file was generated using tf.native from a neural network trained by
-// TensorFlow, then cleaned up by hand. Please do not edit except to update
-// the constants for a new model.
-
-#ifndef CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_TF_NATIVE_INFERENCE_H_
-#define CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_TF_NATIVE_INFERENCE_H_
-
-#include <cstdint>
-
-namespace chromeos {
-namespace power {
-namespace ml {
-namespace tfnative_model {
-
-constexpr int DNN_WEIGHTS_SIZE = 33900;
-constexpr int DNN_RANK = 2;
-constexpr int FEATURES_SIZE = 565;
-constexpr int DNN_BIASES_SIZE = 60;
-
-struct alignas(16) FixedAllocations {
-  float alloc0[DNN_WEIGHTS_SIZE];
-  int32_t alloc0_shape[DNN_RANK];
-  float alloc1[DNN_BIASES_SIZE];
-  int32_t alloc1_shape[DNN_RANK];
-};
-
-void Inference(
-    /* size: FEATURES_SIZE */
-    const float* __restrict features,
-    /* size: 1 */
-    float* __restrict prediction,
-    FixedAllocations* __restrict fixed);
-
-}  // namespace tfnative_model
-}  // namespace ml
-}  // namespace power
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_TF_NATIVE_INFERENCE_H_
diff --git a/chrome/browser/chromeos/power/ml/user_activity_controller.cc b/chrome/browser/chromeos/power/ml/user_activity_controller.cc
index a87dcc50d..8506ecc 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_controller.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_controller.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/chromeos/power/ml/user_activity_controller.h"
 
-#include "ash/shell.h"
 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
 #include "chromeos/constants/devicetype.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
@@ -44,8 +43,7 @@
   idle_event_notifier_ = std::make_unique<IdleEventNotifier>(
       power_manager_client, detector,
       mojo::MakeRequest(&video_observer_idle_notifier));
-  ash::Shell::Get()
-      ->aura_env()
+  aura::Env::GetInstance()
       ->context_factory_private()
       ->GetHostFrameSinkManager()
       ->AddVideoDetectorObserver(std::move(video_observer_idle_notifier));
@@ -56,8 +54,7 @@
       power_manager_client, session_manager,
       mojo::MakeRequest(&video_observer_user_logger),
       chromeos::ChromeUserManager::Get(), &smart_dim_model_);
-  ash::Shell::Get()
-      ->aura_env()
+  aura::Env::GetInstance()
       ->context_factory_private()
       ->GetHostFrameSinkManager()
       ->AddVideoDetectorObserver(std::move(video_observer_user_logger));
diff --git a/chrome/browser/chromeos/printing/automatic_usb_printer_configurer_unittest.cc b/chrome/browser/chromeos/printing/automatic_usb_printer_configurer_unittest.cc
index 78a4b35..4e8dd7a 100644
--- a/chrome/browser/chromeos/printing/automatic_usb_printer_configurer_unittest.cc
+++ b/chrome/browser/chromeos/printing/automatic_usb_printer_configurer_unittest.cc
@@ -142,6 +142,10 @@
     NOTIMPLEMENTED();
   }
 
+  void ShowConfigurationNotification(const Printer& printer) override {
+    NOTIMPLEMENTED();
+  }
+
   void RemoveNotification(const std::string& printer_id) override {
     open_notifications_.erase(printer_id);
   }
diff --git a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
index 81f663a..9ecff60 100644
--- a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
+++ b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
@@ -22,8 +22,8 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/printing/cups_print_job.h"
-#include "chrome/browser/chromeos/printing/synced_printers_manager.h"
-#include "chrome/browser/chromeos/printing/synced_printers_manager_factory.h"
+#include "chrome/browser/chromeos/printing/cups_printers_manager.h"
+#include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h"
 #include "chrome/browser/printing/print_job.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_context.h"
@@ -320,8 +320,9 @@
                       int total_page_number) {
     DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-    auto printer = SyncedPrintersManagerFactory::GetForBrowserContext(profile_)
-                       ->GetPrinter(printer_name);
+    auto printer =
+        CupsPrintersManagerFactory::GetForBrowserContext(profile_)->GetPrinter(
+            printer_name);
     if (!printer) {
       LOG(WARNING)
           << "Printer was removed while job was in progress.  It cannot "
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
index b9c73fd..6175e63c 100644
--- a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
+++ b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
@@ -306,6 +306,9 @@
   void ShowEphemeralNotification(const Printer& printer) override {
     NOTIMPLEMENTED();
   }
+  void ShowConfigurationNotification(const Printer& printer) override {
+    NOTIMPLEMENTED();
+  }
   void ShowSavedNotification(const Printer& printer) override {
     open_notifications_.insert(printer.id());
   }
diff --git a/chrome/browser/chromeos/printing/usb_printer_detector.cc b/chrome/browser/chromeos/printing/usb_printer_detector.cc
index 7362ee2..db93a4f 100644
--- a/chrome/browser/chromeos/printing/usb_printer_detector.cc
+++ b/chrome/browser/chromeos/printing/usb_printer_detector.cc
@@ -30,9 +30,9 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/service_manager_connection.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 namespace chromeos {
diff --git a/chrome/browser/chromeos/printing/usb_printer_detector.h b/chrome/browser/chromeos/printing/usb_printer_detector.h
index 27ce72e9..501c78652 100644
--- a/chrome/browser/chromeos/printing/usb_printer_detector.h
+++ b/chrome/browser/chromeos/printing/usb_printer_detector.h
@@ -9,7 +9,7 @@
 
 #include "base/macros.h"
 #include "chrome/browser/chromeos/printing/printer_detector.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 
 namespace chromeos {
 
diff --git a/chrome/browser/chromeos/printing/usb_printer_detector_unittest.cc b/chrome/browser/chromeos/printing/usb_printer_detector_unittest.cc
index bdf5f62..a0da73a 100644
--- a/chrome/browser/chromeos/printing/usb_printer_detector_unittest.cc
+++ b/chrome/browser/chromeos/printing/usb_printer_detector_unittest.cc
@@ -10,10 +10,10 @@
 #include "base/bind.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification.cc b/chrome/browser/chromeos/printing/usb_printer_notification.cc
index 4f77464..e0d4ea1 100644
--- a/chrome/browser/chromeos/printing/usb_printer_notification.cc
+++ b/chrome/browser/chromeos/printing/usb_printer_notification.cc
@@ -11,6 +11,9 @@
 #include "chrome/browser/notifications/notification_display_service.h"
 #include "chrome/browser/notifications/notification_handler.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/browser/ui/settings_window_manager_chromeos.h"
+#include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/image/image.h"
@@ -77,6 +80,13 @@
   if (!button_index) {
     // Body of notification clicked.
     visible_ = false;
+    if (type_ == Type::kConfigurationRequired) {
+      auto* const settings_manager =
+          chrome::SettingsWindowManager::GetInstance();
+      settings_manager->ShowChromePageForProfile(
+          profile_,
+          chrome::GetSettingsUrl(chrome::kNativePrintingSettingsSubPage));
+    }
     return;
   }
 
@@ -101,6 +111,13 @@
           IDS_USB_PRINTER_NOTIFICATION_CONNECTED_MESSAGE,
           base::UTF8ToUTF16(printer_.display_name())));
       return;
+    case Type::kConfigurationRequired:
+      notification_->set_title(l10n_util::GetStringUTF16(
+          IDS_USB_PRINTER_NOTIFICATION_CONFIGURATION_REQUIRED_TITLE));
+      notification_->set_message(l10n_util::GetStringFUTF16(
+          IDS_USB_PRINTER_NOTIFICATION_CONFIGURATION_REQUIRED_MESSAGE,
+          base::UTF8ToUTF16(printer_.display_name())));
+      return;
   }
   NOTREACHED();
 }
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification.h b/chrome/browser/chromeos/printing/usb_printer_notification.h
index f0a2161f..fc11849b 100644
--- a/chrome/browser/chromeos/printing/usb_printer_notification.h
+++ b/chrome/browser/chromeos/printing/usb_printer_notification.h
@@ -26,7 +26,7 @@
 // according to its state and respond to the user's action.
 class UsbPrinterNotification : public message_center::NotificationObserver {
  public:
-  enum class Type { kEphemeral, kSaved };
+  enum class Type { kEphemeral, kSaved, kConfigurationRequired };
 
   UsbPrinterNotification(const Printer& printer,
                          const std::string& notification_id,
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc b/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc
index 154b95f..5b55bb2 100644
--- a/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc
+++ b/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc
@@ -19,17 +19,7 @@
   ~UsbPrinterNotificationControllerImpl() override = default;
 
   void ShowEphemeralNotification(const Printer& printer) override {
-    if (!base::FeatureList::IsEnabled(features::kStreamlinedUsbPrinterSetup)) {
-      return;
-    }
-
-    if (base::ContainsKey(notifications_, printer.id())) {
-      return;
-    }
-
-    notifications_[printer.id()] = std::make_unique<UsbPrinterNotification>(
-        printer, GetUniqueNotificationId(),
-        UsbPrinterNotification::Type::kEphemeral, profile_);
+    ShowNotification(printer, UsbPrinterNotification::Type::kEphemeral);
   }
 
   void RemoveNotification(const std::string& printer_id) override {
@@ -45,6 +35,17 @@
   }
 
   void ShowSavedNotification(const Printer& printer) override {
+    ShowNotification(printer, UsbPrinterNotification::Type::kSaved);
+  }
+
+  void ShowConfigurationNotification(const Printer& printer) override {
+    ShowNotification(printer,
+                     UsbPrinterNotification::Type::kConfigurationRequired);
+  }
+
+ private:
+  void ShowNotification(const Printer& printer,
+                        UsbPrinterNotification::Type type) {
     if (!base::FeatureList::IsEnabled(features::kStreamlinedUsbPrinterSetup)) {
       return;
     }
@@ -54,11 +55,9 @@
     }
 
     notifications_[printer.id()] = std::make_unique<UsbPrinterNotification>(
-        printer, GetUniqueNotificationId(),
-        UsbPrinterNotification::Type::kSaved, profile_);
+        printer, GetUniqueNotificationId(), type, profile_);
   }
 
- private:
   std::string GetUniqueNotificationId() {
     return base::StringPrintf("usb_printer_notification_%d",
                               next_notification_id_++);
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification_controller.h b/chrome/browser/chromeos/printing/usb_printer_notification_controller.h
index 7b33be85..776c0f9 100644
--- a/chrome/browser/chromeos/printing/usb_printer_notification_controller.h
+++ b/chrome/browser/chromeos/printing/usb_printer_notification_controller.h
@@ -33,6 +33,10 @@
   // is already an existing notification for |printer|.
   virtual void ShowSavedNotification(const Printer& printer) = 0;
 
+  // Creates a notification for a printer that needs configuration. This is a
+  // no-op if there is already an existing notification for |printer|.
+  virtual void ShowConfigurationNotification(const Printer& printer) = 0;
+
   // Closes the notification for |printer_id|. This is a no-op if the
   // notification has already been closed by the user.
   virtual void RemoveNotification(const std::string& printer_id) = 0;
diff --git a/chrome/browser/chromeos/printing/usb_printer_util.cc b/chrome/browser/chromeos/printing/usb_printer_util.cc
index 58ec26f6..fe57a93 100644
--- a/chrome/browser/chromeos/printing/usb_printer_util.cc
+++ b/chrome/browser/chromeos/printing/usb_printer_util.cc
@@ -19,9 +19,9 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/printing/printer_configuration.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
 
 using device::mojom::UsbDeviceInfo;
diff --git a/chrome/browser/chromeos/printing/usb_printer_util.h b/chrome/browser/chromeos/printing/usb_printer_util.h
index 46d85454..76066b5 100644
--- a/chrome/browser/chromeos/printing/usb_printer_util.h
+++ b/chrome/browser/chromeos/printing/usb_printer_util.h
@@ -9,7 +9,7 @@
 
 #include <memory>
 
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace chromeos {
 
diff --git a/chrome/browser/chromeos/smb_client/discovery/network_scanner.cc b/chrome/browser/chromeos/smb_client/discovery/network_scanner.cc
index 315a49bb..3c553fd 100644
--- a/chrome/browser/chromeos/smb_client/discovery/network_scanner.cc
+++ b/chrome/browser/chromeos/smb_client/discovery/network_scanner.cc
@@ -40,6 +40,7 @@
   DCHECK(!running_);
 
   if (locators_.empty()) {
+    find_hosts_returned_ = true;
     // Fire the callback immediately if there are no registered HostLocators.
     std::move(callback).Run(false /* success */, HostMap());
     return;
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system.cc b/chrome/browser/chromeos/smb_client/smb_file_system.cc
index c9ca802..bd49601 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system.cc
+++ b/chrome/browser/chromeos/smb_client/smb_file_system.cc
@@ -123,10 +123,12 @@
 
 SmbFileSystem::SmbFileSystem(
     const file_system_provider::ProvidedFileSystemInfo& file_system_info,
+    MountIdCallback mount_id_callback,
     UnmountCallback unmount_callback,
     RequestCredentialsCallback request_creds_callback,
     RequestUpdatedSharePathCallback request_path_callback)
     : file_system_info_(file_system_info),
+      mount_id_callback_(std::move(mount_id_callback)),
       unmount_callback_(std::move(unmount_callback)),
       request_creds_callback_(std::move(request_creds_callback)),
       request_path_callback_(std::move(request_path_callback)),
@@ -135,7 +137,7 @@
 SmbFileSystem::~SmbFileSystem() {}
 
 int32_t SmbFileSystem::GetMountId() const {
-  return GetMountIdFromFileSystemId(file_system_info_.file_system_id());
+  return mount_id_callback_.Run(file_system_info_);
 }
 
 std::string SmbFileSystem::GetMountPath() const {
@@ -195,7 +197,13 @@
     smbprovider::ErrorType error) {
   task_queue_.TaskFinished();
   base::File::Error result = TranslateToFileError(error);
-  if (result == base::File::FILE_OK) {
+  if (result == base::File::FILE_OK ||
+      // Mount ID wasn't found. smbprovider might have crashed and restarted.
+      // This shouldn't prevent the user from removing the share.
+      result == base::File::FILE_ERROR_NOT_FOUND ||
+      // Mount process either has not yet completed, or failed. This also
+      // shouldn't prevent the user from removing the share.
+      GetMountId() < 0) {
     result =
         RunUnmountCallback(file_system_info_.file_system_id(),
                            file_system_provider::Service::UNMOUNT_REASON_USER);
@@ -211,11 +219,38 @@
     return HandleSyncRedundantGetMetadata(fields, std::move(callback));
   }
 
+  int32_t mount_id = GetMountId();
+  if (mount_id < 0 && entry_path.value() == "/") {
+    // If the mount process hasn't completed, return a dummy entry for the root
+    // directory. This is needed for the Files app to see the share has been
+    // mounted.
+    std::unique_ptr<file_system_provider::EntryMetadata> metadata =
+        std::make_unique<file_system_provider::EntryMetadata>();
+    if (RequestedIsDirectory(fields)) {
+      metadata->is_directory = std::make_unique<bool>(true);
+    }
+    if (RequestedName(fields)) {
+      metadata->name = std::make_unique<std::string>();
+    }
+    if (RequestedSize(fields)) {
+      metadata->size = std::make_unique<int64_t>(0);
+    }
+    if (RequestedModificationTime(fields)) {
+      metadata->modification_time = std::make_unique<base::Time>();
+    }
+    if (RequestedThumbnail(fields)) {
+      metadata->thumbnail = std::make_unique<std::string>(kUnknownImageDataUri);
+    }
+    // Mime types are not supported.
+    std::move(callback).Run(std::move(metadata), base::File::FILE_OK);
+    return CreateAbortCallback();
+  }
+
   auto reply =
       base::BindOnce(&SmbFileSystem::HandleRequestGetMetadataEntryCallback,
                      AsWeakPtr(), fields, std::move(callback));
   SmbTask task = base::BindOnce(&SmbProviderClient::GetMetadataEntry,
-                                GetWeakSmbProviderClient(), GetMountId(),
+                                GetWeakSmbProviderClient(), mount_id,
                                 entry_path, std::move(reply));
 
   return EnqueueTaskAndGetCallback(std::move(task));
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system.h b/chrome/browser/chromeos/smb_client/smb_file_system.h
index aafd390f..036bb87 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system.h
+++ b/chrome/browser/chromeos/smb_client/smb_file_system.h
@@ -45,6 +45,8 @@
 class SmbFileSystem : public file_system_provider::ProvidedFileSystemInterface,
                       public base::SupportsWeakPtr<SmbFileSystem> {
  public:
+  using MountIdCallback =
+      base::RepeatingCallback<int32_t(const ProvidedFileSystemInfo&)>;
   using UnmountCallback = base::OnceCallback<base::File::Error(
       const std::string&,
       file_system_provider::Service::UnmountReason)>;
@@ -60,6 +62,7 @@
 
   SmbFileSystem(
       const file_system_provider::ProvidedFileSystemInfo& file_system_info,
+      MountIdCallback mount_id_callback,
       UnmountCallback unmount_callback,
       RequestCredentialsCallback request_creds_callback,
       RequestUpdatedSharePathCallback request_path_callback);
@@ -364,6 +367,7 @@
   // opened_files_ is marked const since is currently unsupported.
   const file_system_provider::OpenedFiles opened_files_;
 
+  MountIdCallback mount_id_callback_;
   UnmountCallback unmount_callback_;
   RequestCredentialsCallback request_creds_callback_;
   RequestUpdatedSharePathCallback request_path_callback_;
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system_id.cc b/chrome/browser/chromeos/smb_client/smb_file_system_id.cc
index adcedc9..e266b3c 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system_id.cc
+++ b/chrome/browser/chromeos/smb_client/smb_file_system_id.cc
@@ -7,6 +7,7 @@
 #include <string>
 
 #include "base/files/file_path.h"
+#include "base/rand_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -17,6 +18,7 @@
 
 constexpr char kDelimiter[] = "@@";
 constexpr char kKerberosSymbol[] = "kerberos_chromad";
+constexpr int kRandomIdBytes = 8;
 
 std::vector<std::string> GetComponents(const std::string& file_system_id) {
   const std::vector<std::string> components =
@@ -29,30 +31,26 @@
   return components;
 }
 
+std::string GenerateRandomId() {
+  char rand_bytes[kRandomIdBytes];
+  base::RandBytes(rand_bytes, sizeof(rand_bytes));
+  // Encoding to hex ensure that there are no non-alpha characters in the id
+  // (i.e. no @ delimiters).
+  return base::HexEncode(rand_bytes, sizeof(rand_bytes));
+}
+
 }  // namespace.
 
-std::string CreateFileSystemId(int32_t mount_id,
-                               const base::FilePath& share_path,
+std::string CreateFileSystemId(const base::FilePath& share_path,
                                bool is_kerberos_chromad) {
-  const std::string file_system_id = base::StrCat(
-      {base::NumberToString(mount_id), kDelimiter, share_path.value()});
+  const std::string file_system_id =
+      base::StrCat({GenerateRandomId(), kDelimiter, share_path.value()});
   if (is_kerberos_chromad) {
     return base::StrCat({file_system_id, kDelimiter, kKerberosSymbol});
   }
   return file_system_id;
 }
 
-int32_t GetMountIdFromFileSystemId(const std::string& file_system_id) {
-  const std::vector<std::string> components = GetComponents(file_system_id);
-  DCHECK_GE(components.size(), 1u);
-
-  int32_t mount_id;
-  const bool result = base::StringToInt(components[0], &mount_id);
-  DCHECK(result);
-
-  return mount_id;
-}
-
 base::FilePath GetSharePathFromFileSystemId(const std::string& file_system_id) {
   const std::vector<std::string> components = GetComponents(file_system_id);
   DCHECK_GE(components.size(), 1u);
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system_id.h b/chrome/browser/chromeos/smb_client/smb_file_system_id.h
index 4c8eddac..453838c 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system_id.h
+++ b/chrome/browser/chromeos/smb_client/smb_file_system_id.h
@@ -12,16 +12,13 @@
 namespace chromeos {
 namespace smb_client {
 
-// Creates a FileSystemId by concatenating |mount_id| and |share_path| with a
-// delimiter. If |is_kerberos_chromad| is set, an additional symbol is appended.
-std::string CreateFileSystemId(int32_t mount_id,
-                               const base::FilePath& share_path,
+// Creates a FileSystemId by concatenating a random filesystem identifier and
+// |share_path| with a delimiter. The random ID is used so that the same share
+// path can be mounted multiple times. If |is_kerberos_chromad| is set, an
+// additional symbol is appended.
+std::string CreateFileSystemId(const base::FilePath& share_path,
                                bool is_kerberos_chromad);
 
-// Returns the MountId component of a |file_system_id|. |file_system_id| must be
-// well-formed (e.g. 2@@smb://192.168.1.1/testShare).
-int32_t GetMountIdFromFileSystemId(const std::string& file_system_id);
-
 // Returns the SharePath component of a |file_system_id|. |file_system_id| must
 // be well-formed (e.g. 2@@smb://192.168.1.1/testShare).
 base::FilePath GetSharePathFromFileSystemId(const std::string& file_system_id);
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system_id_test.cc b/chrome/browser/chromeos/smb_client/smb_file_system_id_test.cc
index 81127458..db25800 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system_id_test.cc
+++ b/chrome/browser/chromeos/smb_client/smb_file_system_id_test.cc
@@ -7,11 +7,22 @@
 #include <string>
 
 #include "base/files/file_path.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::MatchesRegex;
+
 namespace chromeos {
 namespace smb_client {
 
+namespace {
+// gmock "regex" support is very basic and doesn't support [] or + operations.
+// So write out the \w 16 times. This will incorrectly match _, but we can live
+// with that.
+constexpr char kRandomIdRegex[] =
+    "^\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w\\w";
+}  // namespace
+
 class SmbFileSystemIdTest : public testing::Test {
  public:
   SmbFileSystemIdTest() = default;
@@ -23,35 +34,33 @@
 
 TEST_F(SmbFileSystemIdTest, ShouldCreateFileSystemIdCorrectly) {
   const base::FilePath share_path("smb://192.168.0.0/test");
-  const int32_t mount_id = 12;
 
-  EXPECT_EQ("12@@smb://192.168.0.0/test",
-            CreateFileSystemId(mount_id, share_path, false /* is_kerberos */));
-  EXPECT_EQ("12@@smb://192.168.0.0/test@@kerberos_chromad",
-            CreateFileSystemId(mount_id, share_path, true /* is_kerberos */));
-}
-
-TEST_F(SmbFileSystemIdTest, ShouldParseMountIdCorrectly) {
-  const std::string file_system_id_1 = "12@@smb://192.168.0.0/test";
-  const std::string file_system_id_2 =
-      "13@@smb://192.168.0.1/test@@kerberos_chromad";
-
-  EXPECT_EQ(12, GetMountIdFromFileSystemId(file_system_id_1));
-  EXPECT_EQ(13, GetMountIdFromFileSystemId(file_system_id_2));
+  EXPECT_THAT(
+      CreateFileSystemId(share_path, false /* is_kerberos */),
+      MatchesRegex(std::string(kRandomIdRegex) + "@@smb://192.168.0.0/test"));
+  EXPECT_THAT(CreateFileSystemId(share_path, true /* is_kerberos */),
+              MatchesRegex(std::string(kRandomIdRegex) +
+                           "@@smb://192.168.0.0/test@@kerberos_chromad"));
 }
 
 TEST_F(SmbFileSystemIdTest, ShouldParseSharePathCorrectly) {
+  // Note: These are still valid because existing users might have saved shares.
   const std::string file_system_id_1 = "12@@smb://192.168.0.0/test";
   const base::FilePath expected_share_path_1("smb://192.168.0.0/test");
-
   const std::string file_system_id_2 =
       "13@@smb://192.168.0.1/test@@kerberos_chromad";
   const base::FilePath expected_share_path_2("smb://192.168.0.1/test");
 
+  const std::string file_system_id_3 =
+      "EFAFF3864D0FE389@@smb://192.168.0.1/test@@kerberos_chromad";
+  const base::FilePath expected_share_path_3("smb://192.168.0.1/test");
+
   EXPECT_EQ(expected_share_path_1,
             GetSharePathFromFileSystemId(file_system_id_1));
   EXPECT_EQ(expected_share_path_2,
             GetSharePathFromFileSystemId(file_system_id_2));
+  EXPECT_EQ(expected_share_path_3,
+            GetSharePathFromFileSystemId(file_system_id_3));
 }
 
 TEST_F(SmbFileSystemIdTest, IsKerberosChromadReturnsCorrectly) {
diff --git a/chrome/browser/chromeos/smb_client/smb_provider.cc b/chrome/browser/chromeos/smb_client/smb_provider.cc
index 4d2cabd..9d9bf22 100644
--- a/chrome/browser/chromeos/smb_client/smb_provider.cc
+++ b/chrome/browser/chromeos/smb_client/smb_provider.cc
@@ -21,6 +21,7 @@
 namespace smb_client {
 
 SmbProvider::SmbProvider(
+    MountIdCallback mount_id_callback,
     UnmountCallback unmount_callback,
     SmbFileSystem::RequestCredentialsCallback request_creds_callback,
     SmbFileSystem::RequestUpdatedSharePathCallback request_path_callback)
@@ -30,6 +31,7 @@
                     true /* multiple_mounts */,
                     extensions::SOURCE_NETWORK),
       name_(l10n_util::GetStringUTF8(IDS_SMB_SHARES_ADD_SERVICE_MENU_OPTION)),
+      mount_id_callback_(std::move(mount_id_callback)),
       unmount_callback_(std::move(unmount_callback)),
       request_creds_callback_(std::move(request_creds_callback)),
       request_path_callback_(std::move(request_path_callback)) {
@@ -46,9 +48,9 @@
     Profile* profile,
     const ProvidedFileSystemInfo& file_system_info) {
   DCHECK(profile);
-  return std::make_unique<SmbFileSystem>(file_system_info, unmount_callback_,
-                                         request_creds_callback_,
-                                         request_path_callback_);
+  return std::make_unique<SmbFileSystem>(
+      file_system_info, mount_id_callback_, unmount_callback_,
+      request_creds_callback_, request_path_callback_);
 }
 
 const Capabilities& SmbProvider::GetCapabilities() const {
diff --git a/chrome/browser/chromeos/smb_client/smb_provider.h b/chrome/browser/chromeos/smb_client/smb_provider.h
index b747db2..270d65d7 100644
--- a/chrome/browser/chromeos/smb_client/smb_provider.h
+++ b/chrome/browser/chromeos/smb_client/smb_provider.h
@@ -28,10 +28,13 @@
 
 class SmbProvider : public ProviderInterface {
  public:
+  using MountIdCallback = SmbFileSystem::MountIdCallback;
   using UnmountCallback = base::RepeatingCallback<base::File::Error(
       const std::string&,
       file_system_provider::Service::UnmountReason)>;
+
   SmbProvider(
+      MountIdCallback mount_id_callback,
       UnmountCallback unmount_callback,
       SmbFileSystem::RequestCredentialsCallback request_creds_callback,
       SmbFileSystem::RequestUpdatedSharePathCallback request_path_callback);
@@ -52,6 +55,7 @@
   std::string name_;
   IconSet icon_set_;
 
+  MountIdCallback mount_id_callback_;
   UnmountCallback unmount_callback_;
   SmbFileSystem::RequestCredentialsCallback request_creds_callback_;
   SmbFileSystem::RequestUpdatedSharePathCallback request_path_callback_;
diff --git a/chrome/browser/chromeos/smb_client/smb_service.cc b/chrome/browser/chromeos/smb_client/smb_service.cc
index bbf59b5..ffa6d01 100644
--- a/chrome/browser/chromeos/smb_client/smb_service.cc
+++ b/chrome/browser/chromeos/smb_client/smb_service.cc
@@ -50,6 +50,8 @@
 const char kModePreMountValue[] = "pre_mount";
 const char kModeUnknownValue[] = "unknown";
 const base::TimeDelta kHostDiscoveryInterval = base::TimeDelta::FromSeconds(60);
+// -3 is chosen because -1 and -2 have special meaning in smbprovider.
+const int32_t kInvalidMountId = -3;
 
 net::NetworkInterfaceList GetInterfaces() {
   net::NetworkInterfaceList list;
@@ -106,6 +108,7 @@
 }  // namespace
 
 bool SmbService::service_should_run_ = false;
+bool SmbService::disable_share_discovery_for_testing_ = false;
 
 SmbService::SmbService(Profile* profile,
                        std::unique_ptr<base::TickClock> tick_clock)
@@ -282,6 +285,7 @@
   GetSmbProviderClient()->Mount(
       mount_path, IsNTLMAuthenticationEnabled(), workgroup, username,
       temp_file_manager_->WritePasswordToFile(password),
+      false /* skip_connect */,
       base::BindOnce(&SmbService::OnMountResponse, AsWeakPtr(),
                      base::Passed(&callback), options, share_path,
                      use_chromad_kerberos,
@@ -308,7 +312,8 @@
 
   file_system_provider::MountOptions mount_options(options);
   mount_options.file_system_id =
-      CreateFileSystemId(mount_id, share_path, is_kerberos_chromad);
+      CreateFileSystemId(share_path, is_kerberos_chromad);
+  mount_id_map_[mount_options.file_system_id] = mount_id;
 
   base::File::Error result =
       GetProviderService()->MountFileSystem(provider_id_, mount_options);
@@ -323,11 +328,25 @@
   RecordMountCount();
 }
 
+int32_t SmbService::GetMountId(const ProvidedFileSystemInfo& info) const {
+  const auto iter = mount_id_map_.find(info.file_system_id());
+  if (iter == mount_id_map_.end()) {
+    // Either the mount process has not yet completed, or it failed to provide
+    // us with a mount id.
+    return kInvalidMountId;
+  }
+  return iter->second;
+}
+
 base::File::Error SmbService::Unmount(
     const std::string& file_system_id,
-    file_system_provider::Service::UnmountReason reason) const {
-  return GetProviderService()->UnmountFileSystem(provider_id_, file_system_id,
-                                                 reason);
+    file_system_provider::Service::UnmountReason reason) {
+  base::File::Error result = GetProviderService()->UnmountFileSystem(
+      provider_id_, file_system_id, reason);
+  // Always erase the mount_id, because at this point, the share has already
+  // been unmounted in smbprovider.
+  mount_id_map_.erase(file_system_id);
+  return result;
 }
 
 Service* SmbService::GetProviderService() const {
@@ -385,8 +404,6 @@
 void SmbService::Remount(const ProvidedFileSystemInfo& file_system_info) {
   const base::FilePath share_path =
       GetSharePathFromFileSystemId(file_system_info.file_system_id());
-  const int32_t mount_id =
-      GetMountIdFromFileSystemId(file_system_info.file_system_id());
   const bool is_kerberos_chromad =
       IsKerberosChromadFileSystemId(file_system_info.file_system_id());
 
@@ -405,7 +422,7 @@
   SmbUrl parsed_url(share_path.value());
   if (!parsed_url.IsValid()) {
     OnRemountResponse(file_system_info.file_system_id(),
-                      smbprovider::ERROR_INVALID_URL);
+                      smbprovider::ERROR_INVALID_URL, kInvalidMountId);
     return;
   }
 
@@ -413,31 +430,37 @@
   // service tickets are keyed on hosname.
   const base::FilePath mount_path =
       is_kerberos_chromad
-          ? share_path
+          ? base::FilePath(parsed_url.ToString())
           : base::FilePath(share_finder_->GetResolvedUrl(parsed_url));
 
-  // An empty password is passed to Remount to conform with the credentials API
+  // An empty password is passed to Mount to conform with the credentials API
   // which expects username & workgroup strings along with a password file
   // descriptor.
-  GetSmbProviderClient()->Remount(
-      mount_path, mount_id, IsNTLMAuthenticationEnabled(), workgroup, username,
+  GetSmbProviderClient()->Mount(
+      mount_path, IsNTLMAuthenticationEnabled(), workgroup, username,
       temp_file_manager_->WritePasswordToFile("" /* password */),
+      true /* skip_connect */,
       base::BindOnce(&SmbService::OnRemountResponse, AsWeakPtr(),
                      file_system_info.file_system_id()));
 }
 
 void SmbService::OnRemountResponse(const std::string& file_system_id,
-                                   smbprovider::ErrorType error) {
+                                   smbprovider::ErrorType error,
+                                   int32_t mount_id) {
   RecordRemountResult(TranslateErrorToMountResult(error));
 
-  if (error != smbprovider::ERROR_OK &&
-      error != smbprovider::ERROR_ACCESS_DENIED &&
-      error != smbprovider::ERROR_NOT_FOUND) {
-    // If the remount "fails" because the share is not found on the network or
-    // because authentication fails, the share is left in a dormant state.
-    LOG(ERROR) << "SmbService: failed to restore filesystem: ";
-    Unmount(file_system_id, file_system_provider::Service::UNMOUNT_REASON_USER);
+  if (error != smbprovider::ERROR_OK) {
+    LOG(ERROR) << "SmbService: failed to restore filesystem with error: "
+               << error;
+    // Note: The filesystem isn't removed on failure because doing so will
+    // stop persisting the mount. The mount should only be removed as a result
+    // of user action, and not due to failures, which might be transient (i.e.
+    // smbprovider crashed).
+    return;
   }
+
+  DCHECK_GE(mount_id, 0);
+  mount_id_map_[file_system_id] = mount_id;
 }
 
 void SmbService::Premount(const base::FilePath& share_path) {
@@ -460,9 +483,10 @@
   // was mounted with chromad kerberos.
   // TODO(jimmyxgong): Support chromad kerberos for premount.
   mount_options.file_system_id =
-      CreateFileSystemId(mount_id, share_path, false /* is_chromad_kerberos */);
+      CreateFileSystemId(share_path, false /* is_chromad_kerberos */);
   // Disable remounting of preconfigured shares.
   mount_options.persistent = false;
+  mount_id_map_[mount_options.file_system_id] = mount_id;
 
   const base::File::Error result =
       GetProviderService()->MountFileSystem(provider_id_, mount_options);
@@ -531,6 +555,7 @@
   RegisterHostLocators();
 
   GetProviderService()->RegisterProvider(std::make_unique<SmbProvider>(
+      base::BindRepeating(&SmbService::GetMountId, base::Unretained(this)),
       base::BindRepeating(&SmbService::Unmount, base::Unretained(this)),
       base::BindRepeating(&SmbService::RequestCredentials,
                           base::Unretained(this)),
@@ -548,6 +573,10 @@
 }
 
 void SmbService::RegisterHostLocators() {
+  if (disable_share_discovery_for_testing_) {
+    return;
+  }
+
   SetUpMdnsHostLocator();
   if (IsNetBiosDiscoveryEnabled()) {
     SetUpNetBiosHostLocator();
diff --git a/chrome/browser/chromeos/smb_client/smb_service.h b/chrome/browser/chromeos/smb_client/smb_service.h
index 3a282314..4caac6d 100644
--- a/chrome/browser/chromeos/smb_client/smb_service.h
+++ b/chrome/browser/chromeos/smb_client/smb_service.h
@@ -8,6 +8,7 @@
 #include <map>
 #include <memory>
 #include <string>
+#include <unordered_map>
 #include <vector>
 
 #include "base/callback.h"
@@ -104,6 +105,11 @@
                        const std::string& share_path,
                        StartReadDirIfSuccessfulCallback reply);
 
+  // Disable share discovery in test.
+  static void DisableShareDiscoveryForTesting() {
+    disable_share_discovery_for_testing_ = true;
+  }
+
  private:
   friend class SmbServiceTest;
 
@@ -117,10 +123,13 @@
                  bool should_open_file_manager_after_mount,
                  MountResponse callback);
 
+  // Retrieves the mount_id for |file_system_info|.
+  int32_t GetMountId(const ProvidedFileSystemInfo& info) const;
+
   // Calls file_system_provider::Service::UnmountFileSystem().
   base::File::Error Unmount(
       const std::string& file_system_id,
-      file_system_provider::Service::UnmountReason reason) const;
+      file_system_provider::Service::UnmountReason reason);
 
   Service* GetProviderService() const;
 
@@ -148,7 +157,8 @@
   // remounting fails, this logs and removes the file_system from the volume
   // manager.
   void OnRemountResponse(const std::string& file_system_id,
-                         smbprovider::ErrorType error);
+                         smbprovider::ErrorType error,
+                         int32_t mount_id);
 
   // Calls SmbProviderClient::Premount(). |temp_file_manager_| must be
   // initialized before this is called.
@@ -261,6 +271,8 @@
   void RecordMountCount() const;
 
   static bool service_should_run_;
+  static bool disable_share_discovery_for_testing_;
+
   base::TimeTicks previous_host_discovery_time_;
   const ProviderId provider_id_;
   Profile* profile_;
@@ -269,6 +281,8 @@
   std::unique_ptr<SmbShareFinder> share_finder_;
   // |mount_id| -> |reply|. Stored callbacks to run after updating credential.
   std::map<int32_t, base::OnceClosure> update_credential_replies_;
+  // |file_system_id| -> |mount_id|
+  std::unordered_map<std::string, int32_t> mount_id_map_;
 
   DISALLOW_COPY_AND_ASSIGN(SmbService);
 };
diff --git a/chrome/browser/chromeos/smb_client/smb_service_unittest.cc b/chrome/browser/chromeos/smb_client/smb_service_unittest.cc
index b9b7b0ee..45b8eae 100644
--- a/chrome/browser/chromeos/smb_client/smb_service_unittest.cc
+++ b/chrome/browser/chromeos/smb_client/smb_service_unittest.cc
@@ -9,64 +9,114 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind.h"
+#include "base/run_loop.h"
 #include "base/test/simple_test_tick_clock.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system.h"
 #include "chrome/browser/chromeos/file_system_provider/fake_registry.h"
+#include "chrome/browser/chromeos/file_system_provider/icon_set.h"
 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
 #include "chrome/browser/chromeos/file_system_provider/service.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/chromeos/smb_client/smb_file_system_id.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/fake_smb_provider_client.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "extensions/browser/extension_registry.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::_;
+using ::testing::Invoke;
+using ::testing::WithArg;
+
 namespace chromeos {
 namespace smb_client {
 
 namespace {
 
+const ProviderId kProviderId = ProviderId::CreateFromNativeId("smb");
+const char kTestDomain[] = "EXAMPLE.COM";
+
 void SaveMountResult(SmbMountResult* out, SmbMountResult result) {
   *out = result;
 }
 
+class MockSmbProviderClient : public chromeos::FakeSmbProviderClient {
+ public:
+  MockSmbProviderClient()
+      : FakeSmbProviderClient(true /* should_run_synchronously */) {}
+
+  MOCK_METHOD7(Mount,
+               void(const base::FilePath& share_path,
+                    bool ntlm_enabled,
+                    const std::string& workgroup,
+                    const std::string& username,
+                    base::ScopedFD password_fd,
+                    bool skip_connect,
+                    SmbProviderClient::MountCallback callback));
+  MOCK_METHOD2(SetupKerberos,
+               void(const std::string& account_id,
+                    SmbProviderClient::SetupKerberosCallback callback));
+};
+
 }  // namespace
 
 class SmbServiceTest : public testing::Test {
  protected:
-  SmbServiceTest() : profile_(NULL) {
+  SmbServiceTest()
+      : thread_bundle_(content::TestBrowserThreadBundle::REAL_IO_THREAD) {
     profile_manager_ = std::make_unique<TestingProfileManager>(
         TestingBrowserProcess::GetGlobal());
     EXPECT_TRUE(profile_manager_->SetUp());
-    profile_ = profile_manager_->CreateTestingProfile(
-        "test-user@example.com");  // Not owned by profile_.
+
     std::unique_ptr<FakeChromeUserManager> user_manager_temp =
         std::make_unique<FakeChromeUserManager>();
 
+    profile_ = profile_manager_->CreateTestingProfile("test-user@example.com");
     user_manager_temp->AddUser(
         AccountId::FromUserEmail(profile_->GetProfileUserName()));
 
+    ad_profile_ =
+        profile_manager_->CreateTestingProfile("ad-test-user@example.com");
+    user_manager_temp->AddUserWithAffiliationAndTypeAndProfile(
+        AccountId::AdFromUserEmailObjGuid(ad_profile_->GetProfileUserName(),
+                                          "abc"),
+        false, user_manager::UserType::USER_TYPE_ACTIVE_DIRECTORY, ad_profile_);
+
     user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
         std::move(user_manager_temp));
 
-    // Create FSP service.
-    extension_registry_ =
-        std::make_unique<extensions::ExtensionRegistry>(profile_);
-    fsp_service_ = std::make_unique<file_system_provider::Service>(
-        profile_, extension_registry_.get());
-
-    fsp_service_->SetRegistryForTesting(
-        std::make_unique<file_system_provider::FakeRegistry>());
-
-    // Create smb service.
-    smb_service_ = std::make_unique<SmbService>(
-        profile_, std::make_unique<base::SimpleTestTickClock>());
+    mock_client_ = new MockSmbProviderClient;
+    // The mock needs to be marked as leaked because ownership is passed to
+    // DBusThreadManager.
+    testing::Mock::AllowLeak(mock_client_);
+    chromeos::DBusThreadManager::GetSetterForTesting()->SetSmbProviderClient(
+        base::WrapUnique(mock_client_));
   }
 
   ~SmbServiceTest() override {}
 
+  void CreateFspRegistry(TestingProfile* profile) {
+    // Create FSP service.
+    registry_ = new file_system_provider::FakeRegistry;
+    file_system_provider::Service::Get(profile)->SetRegistryForTesting(
+        base::WrapUnique(registry_));
+  }
+
+  void CreateService(TestingProfile* profile) {
+    SmbService::DisableShareDiscoveryForTesting();
+
+    // Create smb service.
+    smb_service_ = std::make_unique<SmbService>(
+        profile, std::make_unique<base::SimpleTestTickClock>());
+  }
+
   void ExpectInvalidUrl(const std::string& url) {
     SmbMountResult result = SmbMountResult::SUCCESS;
     smb_service_->CallMount({} /* options */, base::FilePath(url),
@@ -89,17 +139,22 @@
 
   content::TestBrowserThreadBundle
       thread_bundle_;        // Included so tests magically don't crash.
-  TestingProfile* profile_;  // Not owned.
+  TestingProfile* profile_ = nullptr;     // Not owned.
+  TestingProfile* ad_profile_ = nullptr;  // Not owned.
   std::unique_ptr<TestingProfileManager> profile_manager_;
   std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
+  MockSmbProviderClient* mock_client_;  // Owned by DBusThreadManager.
   std::unique_ptr<SmbService> smb_service_;
 
   std::unique_ptr<file_system_provider::Service> fsp_service_;
+  file_system_provider::FakeRegistry* registry_;  // Owned by |fsp_service_|.
   // Extension Registry and Registry needed for fsp_service.
   std::unique_ptr<extensions::ExtensionRegistry> extension_registry_;
 };
 
 TEST_F(SmbServiceTest, InvalidUrls) {
+  CreateService(profile_);
+
   ExpectInvalidUrl("");
   ExpectInvalidUrl("foo");
   ExpectInvalidUrl("\\foo");
@@ -113,6 +168,8 @@
 }
 
 TEST_F(SmbServiceTest, InvalidSsoUrls) {
+  CreateService(profile_);
+
   ExpectInvalidSsoUrl("\\\\192.168.1.1\\foo");
   ExpectInvalidSsoUrl("\\\\[0:0:0:0:0:0:0:1]\\foo");
   ExpectInvalidSsoUrl("\\\\[::1]\\foo");
@@ -121,5 +178,77 @@
   ExpectInvalidSsoUrl("smb://[::1]/foo");
 }
 
+TEST_F(SmbServiceTest, Remount) {
+  const char* kSharePath = "\\\\server\\foobar";
+  const char* kRemountPath = "smb://server/foobar";
+
+  file_system_provider::MountOptions mount_options(
+      CreateFileSystemId(base::FilePath(kSharePath),
+                         false /* is_kerberos_chromad */),
+      "Foo");
+  ProvidedFileSystemInfo file_system_info(
+      kProviderId, mount_options, base::FilePath(kSharePath),
+      false /* configurable */, false /* watchable */,
+      extensions::SOURCE_NETWORK, chromeos::file_system_provider::IconSet());
+  CreateFspRegistry(profile_);
+  registry_->RememberFileSystem(file_system_info, {});
+
+  base::RunLoop run_loop;
+  EXPECT_CALL(*mock_client_, Mount(base::FilePath(kRemountPath), _, "", "", _,
+                                   true /* skip_connect */, _))
+      .WillOnce(WithArg<6>(
+          Invoke([&run_loop](SmbProviderClient::MountCallback callback) {
+            std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7);
+            run_loop.Quit();
+          })));
+
+  CreateService(profile_);
+  run_loop.Run();
+
+  // Because the mock is potentially leaked, expectations needs to be manually
+  // verified.
+  EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_));
+}
+
+TEST_F(SmbServiceTest, Remount_ActiveDirectory) {
+  const char* kSharePath = "\\\\krbserver\\foobar";
+  const char* kRemountPath = "smb://krbserver/foobar";
+
+  file_system_provider::MountOptions mount_options(
+      CreateFileSystemId(base::FilePath(kSharePath),
+                         true /* is_kerberos_chromad */),
+      "Foo");
+  ProvidedFileSystemInfo file_system_info(
+      kProviderId, mount_options, base::FilePath(kSharePath),
+      false /* configurable */, false /* watchable */,
+      extensions::SOURCE_NETWORK, chromeos::file_system_provider::IconSet());
+  CreateFspRegistry(ad_profile_);
+  registry_->RememberFileSystem(file_system_info, {});
+
+  base::RunLoop run_loop;
+
+  EXPECT_CALL(*mock_client_, SetupKerberos(_, _))
+      .WillOnce(WithArg<1>(
+          Invoke([](SmbProviderClient::SetupKerberosCallback callback) {
+            base::ThreadTaskRunnerHandle::Get()->PostTask(
+                FROM_HERE, base::BindOnce(std::move(callback), true));
+          })));
+  EXPECT_CALL(*mock_client_,
+              Mount(base::FilePath(kRemountPath), _, kTestDomain,
+                    "ad-test-user", _, true /* skip_connect */, _))
+      .WillOnce(WithArg<6>(
+          Invoke([&run_loop](SmbProviderClient::MountCallback callback) {
+            std::move(callback).Run(smbprovider::ErrorType::ERROR_OK, 7);
+            run_loop.Quit();
+          })));
+
+  CreateService(ad_profile_);
+  run_loop.Run();
+
+  // Because the mock is potentially leaked, expectations needs to be manually
+  // verified.
+  EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(mock_client_));
+}
+
 }  // namespace smb_client
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/supervision/mojom/BUILD.gn b/chrome/browser/chromeos/supervision/mojom/BUILD.gn
index 59ed51f5..0603a84 100644
--- a/chrome/browser/chromeos/supervision/mojom/BUILD.gn
+++ b/chrome/browser/chromeos/supervision/mojom/BUILD.gn
@@ -8,4 +8,8 @@
   sources = [
     "onboarding_controller.mojom",
   ]
+
+  public_deps = [
+    "//url/mojom:url_mojom_gurl",
+  ]
 }
diff --git a/chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom b/chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom
index 6b3317e..7370e202 100644
--- a/chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom
+++ b/chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom
@@ -4,8 +4,10 @@
 
 module chromeos.supervision.mojom;
 
+import "url/mojom/url.mojom";
+
 // Represents user actions that the OnboardingController can handle.
-enum OnboardingFlowAction {
+enum OnboardingAction {
   // The user has expressed intent to skip the remaining screens of the flow.
   // When receiving this we will most likely perform cleanup functions and
   // order the WebviewHost to exit the flow.
@@ -16,19 +18,40 @@
   kShowPreviousPage,
 };
 
+struct OnboardingPage {
+  // Url for the page that needs to be loaded by the webview host.
+  url.mojom.Url url;
+
+  // Only requests to URLs that pass this pattern should be authenticated
+  // or have their custom headers extracted.
+  // Documentation on how to write these patterns can be found in:
+  // https://developer.chrome.com/extensions/match_patterns
+  string url_filter_pattern;
+
+  // Access token used to authenticate the flow page requests. Note that this
+  // should only be used in requests to URLs that match |url_filter_pattern|.
+  string access_token;
+
+  // Some flow pages are expected to return a custom header in their HTTP
+  // responses. If this field is set, we will extract the given header from
+  // responses and return its value when the page fully loads.
+  // Note that this should only be used in requests to URLs that match
+  // |url_filter_pattern|.
+  string? custom_header_name;
+};
 
 // Represents a webview host, responsible for displaying supervision
 // onboarding pages. This will usually be a WebUI page that contains a
 // webview tag and manages its properties.
 // TODO(958995): Complete this interface.
 interface OnboardingWebviewHost {
-  // Requests that the webview load the page with the given url.
-  LoadPage(string url);
+  // Requests the host to load the given page.
+  LoadPage(OnboardingPage page) => (string? custom_header_value);
 
   // Requests that the host exit the flow immediately. This might mean
-  // different things depending on the type of host. If we are running in the
-  // OOBE we will exit the supervision screen and move the the next OOBE step,
-  // if we are running in a custom WebUI, we should close it.
+  // different things depending on the type of host. If we are running in OOBE
+  // we will exit the supervision screen and move to the next OOBE step, if we
+  // are running in a custom WebUI, we should close it.
   ExitFlow();
 };
 
@@ -41,5 +64,5 @@
 
   // Requests the controller to handle the given action.
   // The controller will decide the next step to continue/end the flow.
-  HandleAction(OnboardingFlowAction action);
+  HandleAction(OnboardingAction action);
 };
diff --git a/chrome/browser/chromeos/supervision/onboarding_controller_impl.cc b/chrome/browser/chromeos/supervision/onboarding_controller_impl.cc
index f3c70a53..c594f27b 100644
--- a/chrome/browser/chromeos/supervision/onboarding_controller_impl.cc
+++ b/chrome/browser/chromeos/supervision/onboarding_controller_impl.cc
@@ -4,12 +4,25 @@
 
 #include "chrome/browser/chromeos/supervision/onboarding_controller_impl.h"
 
+#include "base/bind.h"
 #include "base/command_line.h"
 #include "base/logging.h"
+#include "base/strings/string_util.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
 #include "chromeos/constants/chromeos_switches.h"
+#include "services/identity/public/cpp/access_token_fetcher.h"
+#include "url/gurl.h"
 
 namespace chromeos {
 namespace supervision {
+namespace {
+
+// OAuth scope necessary to access the Supervision server.
+const char kSupervisionScope[] =
+    "https://www.googleapis.com/auth/kid.family.readonly";
+
+}  // namespace
 
 OnboardingControllerImpl::OnboardingControllerImpl() = default;
 OnboardingControllerImpl::~OnboardingControllerImpl() = default;
@@ -23,27 +36,82 @@
     mojom::OnboardingWebviewHostPtr webview_host) {
   webview_host_ = std::move(webview_host);
 
-  std::string start_page_url =
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          chromeos::switches::kSupervisionOnboardingStartPageUrl);
-  if (start_page_url.empty()) {
+  Profile* profile = ProfileManager::GetPrimaryUserProfile();
+  DCHECK(profile);
+
+  identity::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile);
+
+  std::string account_id = identity_manager->GetPrimaryAccountId();
+
+  OAuth2TokenService::ScopeSet scopes{kSupervisionScope};
+
+  // base::Unretained is safe here since |access_token_fetcher_| is owned by
+  // |this|.
+  access_token_fetcher_ = identity_manager->CreateAccessTokenFetcherForAccount(
+      account_id, "supervision_onboarding_controller", scopes,
+      base::BindOnce(&OnboardingControllerImpl::AccessTokenCallback,
+                     base::Unretained(this)),
+      identity::AccessTokenFetcher::Mode::kImmediate);
+}
+
+void OnboardingControllerImpl::HandleAction(mojom::OnboardingAction action) {
+  DCHECK(webview_host_);
+  switch (action) {
+    // TODO(958985): Implement the full flow state machine.
+    case mojom::OnboardingAction::kSkipFlow:
+    case mojom::OnboardingAction::kShowNextPage:
+    case mojom::OnboardingAction::kShowPreviousPage:
+      webview_host_->ExitFlow();
+  }
+}
+
+void OnboardingControllerImpl::AccessTokenCallback(
+    GoogleServiceAuthError error,
+    identity::AccessTokenInfo access_token_info) {
+  DCHECK(webview_host_);
+  if (error.state() != GoogleServiceAuthError::NONE) {
     webview_host_->ExitFlow();
     return;
   }
 
-  webview_host_->LoadPage(start_page_url);
+  mojom::OnboardingPage page;
+  page.access_token = access_token_info.token;
+  page.url_filter_pattern =
+      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+          chromeos::switches::kSupervisionOnboardingPageUrlPattern);
+  page.custom_header_name =
+      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+          chromeos::switches::kSupervisionOnboardingHttpResponseHeader);
+
+  page.url = GURL(base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+      chromeos::switches::kSupervisionOnboardingStartPageUrl));
+
+  if (!page.url.is_valid() || page.url_filter_pattern.empty() ||
+      page.custom_header_name->empty()) {
+    DVLOG(1) << "Exiting Supervision Onboarding flow since the required flags "
+                "are unset or invalid.";
+    webview_host_->ExitFlow();
+    return;
+  }
+
+  webview_host_->LoadPage(
+      page.Clone(), base::BindOnce(&OnboardingControllerImpl::LoadPageCallback,
+                                   base::Unretained(this)));
 }
 
-void OnboardingControllerImpl::HandleAction(
-    mojom::OnboardingFlowAction action) {
+void OnboardingControllerImpl::LoadPageCallback(
+    const base::Optional<std::string>& custom_header_value) {
   DCHECK(webview_host_);
-  switch (action) {
-    // TODO(958985): Implement the full flow state machine.
-    case mojom::OnboardingFlowAction::kSkipFlow:
-    case mojom::OnboardingFlowAction::kShowNextPage:
-    case mojom::OnboardingFlowAction::kShowPreviousPage:
-      webview_host_->ExitFlow();
-      return;
+
+  std::string expected_header_value =
+      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+          chromeos::switches::kSupervisionOnboardingHttpResponseHeaderValue);
+
+  if (!custom_header_value.has_value() ||
+      !base::EqualsCaseInsensitiveASCII(custom_header_value.value(),
+                                        expected_header_value)) {
+    webview_host_->ExitFlow();
   }
 }
 
diff --git a/chrome/browser/chromeos/supervision/onboarding_controller_impl.h b/chrome/browser/chromeos/supervision/onboarding_controller_impl.h
index c8c3418..5afef1d 100644
--- a/chrome/browser/chromeos/supervision/onboarding_controller_impl.h
+++ b/chrome/browser/chromeos/supervision/onboarding_controller_impl.h
@@ -5,12 +5,18 @@
 #ifndef CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_CONTROLLER_IMPL_H_
 #define CHROME_BROWSER_CHROMEOS_SUPERVISION_ONBOARDING_CONTROLLER_IMPL_H_
 
+#include <memory>
 #include <string>
-#include <vector>
 
 #include "base/macros.h"
+#include "base/optional.h"
 #include "chrome/browser/chromeos/supervision/mojom/onboarding_controller.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/identity/public/cpp/identity_manager.h"
+
+namespace identity {
+class AccessTokenFetcher;
+}
 
 namespace chromeos {
 namespace supervision {
@@ -25,10 +31,18 @@
  private:
   // mojom::OnboardingController:
   void BindWebviewHost(mojom::OnboardingWebviewHostPtr webview_host) override;
-  void HandleAction(mojom::OnboardingFlowAction action) override;
+  void HandleAction(mojom::OnboardingAction action) override;
+
+  // Callback to get the access token from the IdentityManager.
+  void AccessTokenCallback(GoogleServiceAuthError error,
+                           identity::AccessTokenInfo access_token_info);
+
+  // Callback to OnboardingWebviewHost::LoadPage.
+  void LoadPageCallback(const base::Optional<std::string>& custom_header_value);
 
   mojom::OnboardingWebviewHostPtr webview_host_;
   mojo::BindingSet<mojom::OnboardingController> bindings_;
+  std::unique_ptr<identity::AccessTokenFetcher> access_token_fetcher_;
 
   DISALLOW_COPY_AND_ASSIGN(OnboardingControllerImpl);
 };
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector.cc b/chrome/browser/chromeos/usb/cros_usb_detector.cc
index 71f9f03..b21b932 100644
--- a/chrome/browser/chromeos/usb/cros_usb_detector.cc
+++ b/chrome/browser/chromeos/usb/cros_usb_detector.cc
@@ -21,9 +21,9 @@
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/vector_icons/vector_icons.h"
 #include "content/public/common/service_manager_connection.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
 #include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector.h b/chrome/browser/chromeos/usb/cros_usb_detector.h
index 426678f..f642098 100644
--- a/chrome/browser/chromeos/usb/cros_usb_detector.h
+++ b/chrome/browser/chromeos/usb/cros_usb_detector.h
@@ -14,10 +14,10 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
 
 namespace chromeos {
 
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc b/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc
index 1907ca7..ac1b81c4 100644
--- a/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc
+++ b/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc
@@ -26,10 +26,10 @@
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/fake_cicerone_client.h"
 #include "chromeos/dbus/fake_concierge_client.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/message_center/public/cpp/notification.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/content_settings/host_content_settings_map_factory.cc b/chrome/browser/content_settings/host_content_settings_map_factory.cc
index 1e31094..87ac06d4 100644
--- a/chrome/browser/content_settings/host_content_settings_map_factory.cc
+++ b/chrome/browser/content_settings/host_content_settings_map_factory.cc
@@ -82,8 +82,7 @@
   }
 
   scoped_refptr<HostContentSettingsMap> settings_map(new HostContentSettingsMap(
-      profile->GetPrefs(), profile->IsIncognito(),
-      profile->GetProfileType() == Profile::GUEST_PROFILE,
+      profile->GetPrefs(), profile->IsIncognito(), profile->IsGuestProfile(),
       /*store_last_modified=*/true,
       base::FeatureList::IsEnabled(features::kPermissionDelegation)));
 
diff --git a/chrome/browser/devtools/device/android_device_manager.h b/chrome/browser/devtools/device/android_device_manager.h
index e90561e..76d82ef9 100644
--- a/chrome/browser/devtools/device/android_device_manager.h
+++ b/chrome/browser/devtools/device/android_device_manager.h
@@ -18,7 +18,7 @@
 #include "base/single_thread_task_runner.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_thread.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace net {
diff --git a/chrome/browser/devtools/device/usb/android_usb_browsertest.cc b/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
index 59515f2..b664a3b 100644
--- a/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
+++ b/chrome/browser/devtools/device/usb/android_usb_browsertest.cc
@@ -27,12 +27,12 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_utils.h"
-#include "device/usb/public/cpp/fake_usb_device.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using content::BrowserThread;
diff --git a/chrome/browser/devtools/device/usb/android_usb_device.h b/chrome/browser/devtools/device/usb/android_usb_device.h
index 0e92f18..815f13b8 100644
--- a/chrome/browser/devtools/device/usb/android_usb_device.h
+++ b/chrome/browser/devtools/device/usb/android_usb_device.h
@@ -18,7 +18,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/devtools/device/usb/usb_device_manager_helper.h"
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace base {
 class RefCountedBytes;
diff --git a/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc b/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc
index 1c1673b..8703dbc 100644
--- a/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc
+++ b/chrome/browser/devtools/device/usb/usb_device_manager_helper.cc
@@ -14,9 +14,9 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/service_manager_connection.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
 #include "mojo/public/cpp/bindings/callback_helpers.h"
 #include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 using device::mojom::UsbTransferDirection;
diff --git a/chrome/browser/devtools/device/usb/usb_device_manager_helper.h b/chrome/browser/devtools/device/usb/usb_device_manager_helper.h
index d180043..04c6fb4 100644
--- a/chrome/browser/devtools/device/usb/usb_device_manager_helper.h
+++ b/chrome/browser/devtools/device/usb/usb_device_manager_helper.h
@@ -9,8 +9,8 @@
 #include <vector>
 
 #include "base/threading/thread_checker.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 
 struct AndroidInterfaceInfo {
   AndroidInterfaceInfo(
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 36fa4727..fae50ef 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -80,6 +80,7 @@
 #include "chrome/browser/android/download/download_location_dialog_bridge_impl.h"
 #include "chrome/browser/android/download/download_manager_service.h"
 #include "chrome/browser/android/download/download_utils.h"
+#include "chrome/browser/android/feature_utilities.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #endif
 
@@ -848,7 +849,8 @@
 #if defined(OS_ANDROID)
   content::WebContents* web_contents =
       content::DownloadItemUtils::GetWebContents(download);
-  if (base::FeatureList::IsEnabled(features::kDownloadsLocationChange)) {
+  if (!chrome::android::IsNoTouchModeEnabled() &&
+      base::FeatureList::IsEnabled(features::kDownloadsLocationChange)) {
     if (reason == DownloadConfirmationReason::SAVE_AS) {
       // If this is a 'Save As' download, just run without confirmation.
       callback.Run(DownloadConfirmationResult::CONTINUE_WITHOUT_CONFIRMATION,
diff --git a/chrome/browser/download/download_service_factory.cc b/chrome/browser/download/download_service_factory.cc
index bc6386a6..a0d2ddc 100644
--- a/chrome/browser/download/download_service_factory.cc
+++ b/chrome/browser/download/download_service_factory.cc
@@ -33,7 +33,7 @@
 #include "components/download/public/background_service/features.h"
 #include "components/download/public/common/simple_download_manager_coordinator.h"
 #include "components/download/public/task/task_scheduler.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/core/simple_dependency_manager.h"
 #include "components/leveldb_proto/content/proto_database_provider_factory.h"
 #include "components/offline_pages/buildflags/buildflags.h"
 #include "content/public/browser/browser_context.h"
@@ -78,9 +78,8 @@
 class DownloadBlobContextGetterFactory
     : public download::BlobContextGetterFactory {
  public:
-  explicit DownloadBlobContextGetterFactory(ProfileKey* profile_key)
-      : profile_key_(profile_key) {
-    DCHECK(profile_key_);
+  explicit DownloadBlobContextGetterFactory(SimpleFactoryKey* key) : key_(key) {
+    DCHECK(key_);
   }
   ~DownloadBlobContextGetterFactory() override = default;
 
@@ -89,11 +88,10 @@
   void RetrieveBlobContextGetter(
       download::BlobContextGetterCallback callback) override {
     FullBrowserTransitionManager::Get()->RegisterCallbackOnProfileCreation(
-        profile_key_,
-        base::BindOnce(&DownloadOnProfileCreated, std::move(callback)));
+        key_, base::BindOnce(&DownloadOnProfileCreated, std::move(callback)));
   }
 
-  ProfileKey* profile_key_;
+  SimpleFactoryKey* key_;
   DISALLOW_COPY_AND_ASSIGN(DownloadBlobContextGetterFactory);
 };
 
@@ -105,16 +103,22 @@
 }
 
 // static
+download::DownloadService* DownloadServiceFactory::GetForKey(
+    SimpleFactoryKey* key) {
+  return static_cast<download::DownloadService*>(
+      GetInstance()->GetServiceForKey(key, true));
+}
+
+// static
 download::DownloadService* DownloadServiceFactory::GetForBrowserContext(
     content::BrowserContext* context) {
-  return static_cast<download::DownloadService*>(
-      GetInstance()->GetServiceForBrowserContext(context, true));
+  Profile* profile = Profile::FromBrowserContext(context);
+  return GetForKey(profile->GetProfileKey());
 }
 
 DownloadServiceFactory::DownloadServiceFactory()
-    : BrowserContextKeyedServiceFactory(
-          "download::DownloadService",
-          BrowserContextDependencyManager::GetInstance()) {
+    : SimpleKeyedServiceFactory("download::DownloadService",
+                                SimpleDependencyManager::GetInstance()) {
   DependsOn(SimpleDownloadManagerCoordinatorFactory::GetInstance());
   DependsOn(download::NavigationMonitorFactory::GetInstance());
   DependsOn(leveldb_proto::ProtoDatabaseProviderFactory::GetInstance());
@@ -122,44 +126,38 @@
 
 DownloadServiceFactory::~DownloadServiceFactory() = default;
 
-KeyedService* DownloadServiceFactory::BuildServiceInstanceFor(
-    content::BrowserContext* context) const {
-  Profile* profile = Profile::FromBrowserContext(context);
-
+std::unique_ptr<KeyedService> DownloadServiceFactory::BuildServiceInstanceFor(
+    SimpleFactoryKey* key) const {
   auto clients = std::make_unique<download::DownloadClientMap>();
 
 #if BUILDFLAG(ENABLE_OFFLINE_PAGES)
   // Offline prefetch doesn't support incognito.
-  if (!context->IsOffTheRecord()) {
+  if (!key->IsOffTheRecord()) {
     clients->insert(std::make_pair(
         download::DownloadClient::OFFLINE_PAGE_PREFETCH,
-        std::make_unique<offline_pages::OfflinePrefetchDownloadClient>(
-            context)));
+        std::make_unique<offline_pages::OfflinePrefetchDownloadClient>(key)));
   }
 #endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
 
-  clients->insert(
-      std::make_pair(download::DownloadClient::BACKGROUND_FETCH,
-                     std::make_unique<download::DeferredClientWrapper>(
-                         base::BindOnce(&CreateBackgroundFetchDownloadClient),
-                         profile->GetProfileKey())));
+  clients->insert(std::make_pair(
+      download::DownloadClient::BACKGROUND_FETCH,
+      std::make_unique<download::DeferredClientWrapper>(
+          base::BindOnce(&CreateBackgroundFetchDownloadClient), key)));
 
 #if defined(CHROMEOS)
-  if (!context->IsOffTheRecord()) {
-    clients->insert(
-        std::make_pair(download::DownloadClient::PLUGIN_VM_IMAGE,
-                       std::make_unique<download::DeferredClientWrapper>(
-                           base::BindOnce(&CreatePluginVmImageDownloadClient),
-                           profile->GetProfileKey())));
+  if (!key->IsOffTheRecord()) {
+    clients->insert(std::make_pair(
+        download::DownloadClient::PLUGIN_VM_IMAGE,
+        std::make_unique<download::DeferredClientWrapper>(
+            base::BindOnce(&CreatePluginVmImageDownloadClient), key)));
   }
 #endif
 
   // Build in memory download service for incognito profile.
-  if (context->IsOffTheRecord() &&
+  if (key->IsOffTheRecord() &&
       base::FeatureList::IsEnabled(download::kDownloadServiceIncognito)) {
     auto blob_context_getter_factory =
-        std::make_unique<DownloadBlobContextGetterFactory>(
-            profile->GetProfileKey());
+        std::make_unique<DownloadBlobContextGetterFactory>(key);
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner =
         base::CreateSingleThreadTaskRunnerWithTraits(
             {content::BrowserThread::IO});
@@ -167,17 +165,15 @@
         SystemNetworkContextManager::GetInstance()->GetSharedURLLoaderFactory();
 
     return download::BuildInMemoryDownloadService(
-               profile->GetProfileKey(), std::move(clients),
-               content::GetNetworkConnectionTracker(), base::FilePath(),
-               std::move(blob_context_getter_factory), io_task_runner,
-               url_loader_factory)
-        .release();
+        key, std::move(clients), content::GetNetworkConnectionTracker(),
+        base::FilePath(), std::move(blob_context_getter_factory),
+        io_task_runner, url_loader_factory);
   } else {
     // Build download service for normal profile.
     base::FilePath storage_dir;
-    if (!context->IsOffTheRecord() && !context->GetPath().empty()) {
+    if (!key->IsOffTheRecord() && !key->GetPath().empty()) {
       storage_dir =
-          context->GetPath().Append(chrome::kDownloadServiceStorageDirname);
+          key->GetPath().Append(chrome::kDownloadServiceStorageDirname);
     }
     scoped_refptr<base::SequencedTaskRunner> background_task_runner =
         base::CreateSequencedTaskRunnerWithTraits(
@@ -188,26 +184,21 @@
     task_scheduler =
         std::make_unique<download::android::DownloadTaskScheduler>();
 #else
-    task_scheduler = std::make_unique<DownloadTaskSchedulerImpl>(context);
+    task_scheduler = std::make_unique<DownloadTaskSchedulerImpl>(key);
 #endif
     // Some tests doesn't initialize DownloadManager when profile is created,
     // and cause the download service to fail. Call
     // InitializeSimpleDownloadManager() to initialize the DownloadManager
     // whenever profile becomes available.
-    DownloadManagerUtils::InitializeSimpleDownloadManager(
-        profile->GetProfileKey());
+    DownloadManagerUtils::InitializeSimpleDownloadManager(key);
     return download::BuildDownloadService(
-               profile->GetProfileKey(), profile->GetPrefs(),
-               std::move(clients), content::GetNetworkConnectionTracker(),
-               storage_dir,
-               SimpleDownloadManagerCoordinatorFactory::GetForKey(
-                   profile->GetProfileKey()),
-               background_task_runner, std::move(task_scheduler))
-        .release();
+        key, std::move(clients), content::GetNetworkConnectionTracker(),
+        storage_dir, SimpleDownloadManagerCoordinatorFactory::GetForKey(key),
+        background_task_runner, std::move(task_scheduler));
   }
 }
 
-content::BrowserContext* DownloadServiceFactory::GetBrowserContextToUse(
-    content::BrowserContext* context) const {
-  return chrome::GetBrowserContextOwnInstanceInIncognito(context);
+SimpleFactoryKey* DownloadServiceFactory::GetKeyToUse(
+    SimpleFactoryKey* key) const {
+  return key;
 }
diff --git a/chrome/browser/download/download_service_factory.h b/chrome/browser/download/download_service_factory.h
index ef49d79..36db493 100644
--- a/chrome/browser/download/download_service_factory.h
+++ b/chrome/browser/download/download_service_factory.h
@@ -5,8 +5,12 @@
 #ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_FACTORY_H_
 #define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SERVICE_FACTORY_H_
 
+#include <memory>
+
 #include "base/macros.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+#include "components/keyed_service/core/simple_keyed_service_factory.h"
+
+class SimpleFactoryKey;
 
 namespace base {
 template <typename T>
@@ -23,12 +27,17 @@
 
 // DownloadServiceFactory is the main client class for interaction with the
 // download component.
-class DownloadServiceFactory : public BrowserContextKeyedServiceFactory {
+class DownloadServiceFactory : public SimpleKeyedServiceFactory {
  public:
   // Returns singleton instance of DownloadServiceFactory.
   static DownloadServiceFactory* GetInstance();
 
-  // Returns the DownloadService associated with |context|.
+  // Returns the DownloadService associated with |key|.
+  static download::DownloadService* GetForKey(SimpleFactoryKey* key);
+
+  // Helper method that calls GetForKey().
+  // Returns the DownloadService associated with the key associated with
+  // |context|.
   static download::DownloadService* GetForBrowserContext(
       content::BrowserContext* context);
 
@@ -38,11 +47,10 @@
   DownloadServiceFactory();
   ~DownloadServiceFactory() override;
 
-  // BrowserContextKeyedServiceFactory overrides:
-  KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* context) const override;
-  content::BrowserContext* GetBrowserContextToUse(
-      content::BrowserContext* context) const override;
+  // SimpleKeyedServiceFactory overrides:
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      SimpleFactoryKey* key) const override;
+  SimpleFactoryKey* GetKeyToUse(SimpleFactoryKey* key) const override;
 
   DISALLOW_COPY_AND_ASSIGN(DownloadServiceFactory);
 };
diff --git a/chrome/browser/download/download_task_scheduler_impl.cc b/chrome/browser/download/download_task_scheduler_impl.cc
index d12556d..94d64e1 100644
--- a/chrome/browser/download/download_task_scheduler_impl.cc
+++ b/chrome/browser/download/download_task_scheduler_impl.cc
@@ -13,11 +13,9 @@
 #include "base/time/time.h"
 #include "chrome/browser/download/download_service_factory.h"
 #include "components/download/public/background_service/download_service.h"
-#include "content/public/browser/browser_context.h"
 
-DownloadTaskSchedulerImpl::DownloadTaskSchedulerImpl(
-    content::BrowserContext* context)
-    : context_(context), weak_factory_(this) {}
+DownloadTaskSchedulerImpl::DownloadTaskSchedulerImpl(SimpleFactoryKey* key)
+    : key_(key), weak_factory_(this) {}
 
 DownloadTaskSchedulerImpl::~DownloadTaskSchedulerImpl() = default;
 
@@ -55,7 +53,7 @@
   }
 
   download::DownloadService* download_service =
-      DownloadServiceFactory::GetForBrowserContext(context_);
+      DownloadServiceFactory::GetForKey(key_);
   download_service->OnStartScheduledTask(
       task_type, base::BindOnce(&DownloadTaskSchedulerImpl::OnTaskFinished,
                                 weak_factory_.GetWeakPtr()));
diff --git a/chrome/browser/download/download_task_scheduler_impl.h b/chrome/browser/download/download_task_scheduler_impl.h
index 5385040e..6e2e1d0 100644
--- a/chrome/browser/download/download_task_scheduler_impl.h
+++ b/chrome/browser/download/download_task_scheduler_impl.h
@@ -13,16 +13,14 @@
 #include "base/memory/weak_ptr.h"
 #include "components/download/public/task/task_scheduler.h"
 
-namespace content {
-class BrowserContext;
-}  // namespace content
+class SimpleFactoryKey;
 
 // A TaskScheduler implementation that doesn't do anything but posts the task
 // after the specified delay.
 // If Chrome is shut down, the implementation will not automatically restart it.
 class DownloadTaskSchedulerImpl : public download::TaskScheduler {
  public:
-  explicit DownloadTaskSchedulerImpl(content::BrowserContext* context);
+  explicit DownloadTaskSchedulerImpl(SimpleFactoryKey* key);
   ~DownloadTaskSchedulerImpl() override;
 
   // TaskScheduler implementation.
@@ -38,7 +36,7 @@
   void RunScheduledTask(download::DownloadTaskType task_type);
   void OnTaskFinished(bool reschedule);
 
-  content::BrowserContext* context_;
+  SimpleFactoryKey* key_;
 
   // Keeps track of scheduled tasks so that they can be cancelled.
   std::map<download::DownloadTaskType, base::CancelableClosure>
diff --git a/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc b/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
index b9c4b02..2b44f3e0 100644
--- a/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
+++ b/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
@@ -17,6 +17,7 @@
 #include "chrome/common/extensions/api/autofill_private.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
+#include "components/autofill/core/browser/autofill_address_util.h"
 #include "components/autofill/core/browser/autofill_manager.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/form_data_importer.h"
@@ -39,110 +40,6 @@
 static const char kSettingsOrigin[] = "Chrome settings";
 static const char kErrorDataUnavailable[] = "Autofill data unavailable.";
 
-// TODO(crbug.com/903594): This does basically the same thing as
-//            components/autofill/core/browser/autofill_address_util.cc, we
-//            should refactor to use a single code path for this.
-// Fills |components| with the address UI components that should be used to
-// input an address for |country_code| when UI BCP 47 language code is
-// |ui_language_code|.
-void PopulateAddressComponents(
-    const std::string& country_code,
-    const std::string& ui_language_code,
-    autofill_private::AddressComponents* address_components) {
-  DCHECK(address_components);
-
-  i18n::addressinput::Localization localization;
-  localization.SetGetter(l10n_util::GetStringUTF8);
-  std::string best_address_language_code;
-  std::vector<addressinput::AddressUiComponent> components =
-      i18n::addressinput::BuildComponents(
-          country_code,
-          localization,
-          ui_language_code,
-          &best_address_language_code);
-  if (components.empty()) {
-    static const char kDefaultCountryCode[] = "US";
-    components = i18n::addressinput::BuildComponents(
-        kDefaultCountryCode,
-        localization,
-        ui_language_code,
-        &best_address_language_code);
-  }
-  address_components->language_code = best_address_language_code;
-  DCHECK(!components.empty());
-
-  autofill_private::AddressComponentRow* row = nullptr;
-  for (size_t i = 0; i < components.size(); ++i) {
-    if (components[i].field == ::i18n::addressinput::ORGANIZATION &&
-        !base::FeatureList::IsEnabled(
-            autofill::features::kAutofillEnableCompanyName)) {
-      continue;
-    }
-    if (!row ||
-        components[i - 1].length_hint ==
-            addressinput::AddressUiComponent::HINT_LONG ||
-        components[i].length_hint ==
-            addressinput::AddressUiComponent::HINT_LONG) {
-      address_components->components.push_back(
-          autofill_private::AddressComponentRow());
-      row = &address_components->components.back();
-    }
-
-    autofill_private::AddressComponent component;
-    component.field_name = components[i].name;
-
-    switch (components[i].field) {
-      case i18n::addressinput::COUNTRY:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_COUNTRY_CODE;
-        break;
-      case i18n::addressinput::ADMIN_AREA:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_ADDRESS_LEVEL_1;
-        break;
-      case i18n::addressinput::LOCALITY:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_ADDRESS_LEVEL_2;
-        break;
-      case i18n::addressinput::DEPENDENT_LOCALITY:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_ADDRESS_LEVEL_3;
-        break;
-      case i18n::addressinput::SORTING_CODE:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_SORTING_CODE;
-        break;
-      case i18n::addressinput::POSTAL_CODE:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_POSTAL_CODE;
-        break;
-      case i18n::addressinput::STREET_ADDRESS:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_ADDRESS_LINES;
-        break;
-      case i18n::addressinput::ORGANIZATION:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_COMPANY_NAME;
-        break;
-      case i18n::addressinput::RECIPIENT:
-        component.field =
-            autofill_private::AddressField::ADDRESS_FIELD_FULL_NAME;
-        break;
-    }
-
-    switch (components[i].length_hint) {
-      case addressinput::AddressUiComponent::HINT_LONG:
-        component.is_long_field = true;
-        break;
-      case addressinput::AddressUiComponent::HINT_SHORT:
-        component.is_long_field = false;
-        break;
-    }
-
-    row->row.push_back(std::move(component));
-  }
-}
-
 // Searches the |list| for the value at |index|.  If this value is present in
 // any of the rest of the list, then the item (at |index|) is removed. The
 // comparison of phone number values is done on normalized versions of the phone
@@ -344,13 +241,28 @@
           api::autofill_private::GetAddressComponents::Params::Create(*args_);
   EXTENSION_FUNCTION_VALIDATE(parameters.get());
 
-  autofill_private::AddressComponents components;
-  PopulateAddressComponents(
-      parameters->country_code,
-      g_browser_process->GetApplicationLocale(),
-      &components);
+  auto components = std::make_unique<base::ListValue>();
+  std::string language_code_;
 
-  return RespondNow(OneArgument(components.ToValue()));
+  autofill::GetAddressComponents(parameters->country_code,
+                                 g_browser_process->GetApplicationLocale(),
+                                 components.get(), &language_code_);
+
+  // Convert ListValue to AddressComponents
+  base::Value address_components(base::Value::Type::DICTIONARY);
+  base::Value rows(base::Value::Type::LIST);
+
+  for (auto& component : components->GetList()) {
+    base::Value row(base::Value::Type::DICTIONARY);
+    row.SetKey("row", std::move(component));
+    rows.GetList().emplace_back(std::move(row));
+  }
+
+  address_components.SetKey("components", std::move(rows));
+  address_components.SetKey("languageCode", base::Value(language_code_));
+
+  return RespondNow(OneArgument(
+      base::Value::ToUniquePtrValue(std::move(address_components))));
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/extensions/api/device_permissions_manager_unittest.cc b/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
index b8555d6..e025c5a9 100644
--- a/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
+++ b/chrome/browser/extensions/api/device_permissions_manager_unittest.cc
@@ -12,15 +12,15 @@
 #include "base/test/values_test_util.h"
 #include "chrome/browser/extensions/test_extension_environment.h"
 #include "chrome/test/base/testing_profile.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "extensions/browser/api/device_permissions_manager.h"
 #include "extensions/browser/api/hid/hid_device_manager.h"
 #include "extensions/browser/api/usb/usb_device_manager.h"
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/common/extension.h"
 #include "services/device/public/cpp/hid/fake_hid_manager.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
 #include "services/device/public/mojom/hid.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index 0d620192..524ae75 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -31,6 +31,10 @@
 #include "chrome/browser/password_manager/password_manager_util_win.h"
 #elif defined(OS_MACOSX)
 #include "chrome/browser/password_manager/password_manager_util_mac.h"
+#elif defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/login/quick_unlock/auth_token.h"
+#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_factory.h"
+#include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_storage.h"
 #endif
 
 namespace {
@@ -41,6 +45,14 @@
 // The error message returned to the UI when the user fails to reauthenticate.
 const char kReauthenticationFailed[] = "reauth-failed";
 
+#if defined(OS_CHROMEOS)
+constexpr static base::TimeDelta kShowPasswordAuthTokenLifetime =
+    base::TimeDelta::FromSeconds(
+        PasswordAccessAuthenticator::kAuthValidityPeriodSeconds);
+constexpr static base::TimeDelta kExportPasswordsAuthTokenLifetime =
+    base::TimeDelta::FromSeconds(5);
+#endif
+
 // Map password_manager::ExportProgressStatus to
 // extensions::api::passwords_private::ExportProgressStatus.
 extensions::api::passwords_private::ExportProgressStatus ConvertStatus(
@@ -204,6 +216,18 @@
       web_contents_->GetTopLevelNativeWindow(), purpose);
 #elif defined(OS_MACOSX)
   return password_manager_util_mac::AuthenticateUser(purpose);
+#elif defined(OS_CHROMEOS)
+  chromeos::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
+      chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(profile_);
+  const chromeos::quick_unlock::AuthToken* auth_token =
+      quick_unlock_storage->GetAuthToken();
+  if (!auth_token || !auth_token->GetAge())
+    return false;
+  const base::TimeDelta auth_token_lifespan =
+      (purpose == password_manager::ReauthPurpose::EXPORT)
+          ? kExportPasswordsAuthTokenLifetime
+          : kShowPasswordAuthTokenLifetime;
+  return auth_token->GetAge() <= auth_token_lifespan;
 #else
   return true;
 #endif
diff --git a/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc b/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
index d09e42c..9e731b9 100644
--- a/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
@@ -9,6 +9,8 @@
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/voice_interaction/voice_interaction_controller_client.h"
+#include "chrome/browser/chromeos/assistant/assistant_util.h"
 #include "chrome/browser/ui/ash/chrome_screenshot_grabber.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_command_controller.h"
@@ -60,6 +62,12 @@
         arc_session_manager->RequestEnable();
     }
   }
+
+  if (assistant::IsAssistantAllowedForProfile(profile) ==
+      ash::mojom::AssistantAllowedState::ALLOWED) {
+    arc::VoiceInteractionControllerClient::Get()
+        ->NotifyLockedFullScreenStateChanged(locked);
+  }
 }
 
 }  // namespace tabs_util
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
index 0c1ea72..b2c394a 100644
--- a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
+++ b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -64,8 +64,6 @@
       return keyboard::mojom::ContainerType::kFullWidth;
     case keyboard_api::KEYBOARD_MODE_FLOATING:
       return keyboard::mojom::ContainerType::kFloating;
-    case keyboard_api::KEYBOARD_MODE_FULLSCREEN:
-      return keyboard::mojom::ContainerType::kFullscreen;
   }
 
   NOTREACHED();
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 6282019..2f9aa1ad 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -970,11 +970,6 @@
     "expiry_milestone": 76
   },
   {
-    "name": "enable-desktop-pwas-custom-tab-ui",
-    "owners": [ "desktop-pwas-team@google.com" ],
-    "expiry_milestone": 76
-  },
-  {
     "name": "enable-desktop-pwas-link-capturing",
     "owners": [ "desktop-pwas-team@google.com" ],
     "expiry_milestone": 76
@@ -1119,11 +1114,6 @@
     "expiry_milestone": -1
   },
   {
-    "name": "enable-hdr",
-    // "owners": [ "your-team" ],
-    "expiry_milestone": 76
-  },
-  {
     "name": "enable-hide-arc-media-notifications",
     "owners": [ "beccahughes", "media-dev" ],
     "expiry_milestone": 80
@@ -1567,6 +1557,11 @@
     "expiry_milestone": 76
   },
   {
+    "name": "enable-sxg-subresource-prefetching",
+    "owners": [ "horo", "//content/browser/web_package/OWNERS" ],
+    "expiry_milestone": 80
+  },
+  {
     "name": "enable-sync-pseudo-uss-app-list",
     "owners": [ "mastiz", "//components/sync/OWNERS" ],
     "expiry_milestone": 76
@@ -2867,6 +2862,11 @@
     "expiry_milestone": 78
   },
   {
+    "name": "translate-ui-bubble-options",
+    "owners": [ "hhw", "anthonyvd", "chrome-language@google.com" ],
+    "expiry_milestone": 78
+  },
+  {
     "name": "try-supported-channel-layouts",
     "owners": [ "dalecurtis" ],
     "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index d8bd2e4..12cc530f 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -37,6 +37,16 @@
     "that do not have CanSignHttpExchangesDraft extension. Warning: Enabling "
     "this may pose a security risk.";
 
+const char kEnableSignedExchangeSubresourcePrefetchName[] =
+    "Enable Signed Exchange subresource prefetching";
+const char kEnableSignedExchangeSubresourcePrefetchDescription[] =
+    "When enabled, the distributors of signed exchanges can let Chrome know "
+    "alternative signed exchange subresources by setting \"alternate\" link "
+    "header. Chrome will prefetch the alternate signed exchange subresources "
+    "and will load them if the publisher of the main signed exchange has set "
+    "\"allowed-alt-sxg\" link header in the signed inner response of the "
+    "main signed exchange.";
+
 const char kAllowStartingServiceManagerOnlyName[] =
     "Allow starting service manager only";
 const char kAllowStartingServiceManagerOnlyDescription[] =
@@ -520,11 +530,6 @@
     "URLs that are in-scope of Desktop PWAs will open in a window. Requires "
     "#enable-desktop-pwas.";
 
-const char kDesktopPWAsCustomTabUIName[] = "Desktop PWAs Custom Tab UI";
-const char kDesktopPWAsCustomTabUIDescription[] =
-    "Browsing out-of-scope links in a desktop PWA will use the custom tab UI "
-    "for displaying the page title and origin instead of the location bar.";
-
 const char kDesktopPWAsStayInWindowName[] =
     "Desktop PWAs out-of-scope links open in the app window";
 const char kDesktopPWAsStayInWindowDescription[] =
@@ -573,10 +578,6 @@
 const char kEnableGpuServiceLoggingDescription[] =
     "Enable printing the actual GL driver calls.";
 
-const char kEnableHDRName[] = "HDR mode";
-const char kEnableHDRDescription[] =
-    "Enables HDR support on compatible displays.";
-
 const char kEnableImplicitRootScrollerName[] = "Implicit Root Scroller";
 const char kEnableImplicitRootScrollerDescription[] =
     "Enables implicitly choosing which scroller on a page is the 'root "
@@ -1823,6 +1824,11 @@
     "Force the Translate Triggering on English pages experiment to be enabled "
     "with the selected language model active.";
 
+const char kTranslateBubbleUIName[] =
+    "Select which UI to use for translate bubble";
+const char kTranslateBubbleUIDescription[] =
+    "Three bubble options to choose. Existing UI is selected by default";
+
 const char kTreatInsecureOriginAsSecureName[] =
     "Insecure origins treated as secure";
 const char kTreatInsecureOriginAsSecureDescription[] =
@@ -2205,7 +2211,7 @@
 const char kEnableWebNfcName[] = "WebNFC";
 const char kEnableWebNfcDescription[] = "Enable WebNFC support.";
 
-const char kEphemeralTabName[] = "An Ephemeral Tab in an Overlay Panel";
+const char kEphemeralTabName[] = "An ephemeral Preview Tab in an Overlay Panel";
 const char kEphemeralTabDescription[] =
     "Enable a 'Preview page/image' at a linked page into an overlay.";
 
@@ -3181,11 +3187,6 @@
     " until Chrome OS is unlocked to protect against malicious USB devices."
     " Already connected USB devices will continue to function.";
 
-const char kUserActivityPredictionMlServiceName[] =
-    "ML Service Smart Dim model";
-const char kUserActivityPredictionMlServiceDescription[] =
-    "Uses the new ML Service model for user activity prediction (Smart Dim).";
-
 const char kVaapiJpegImageDecodeAccelerationName[] =
     "VA-API JPEG decode acceleration for images";
 const char kVaapiJpegImageDecodeAccelerationDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 51ce1f68..405ceadb 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -55,6 +55,9 @@
 extern const char kAllowSignedHTTPExchangeCertsWithoutExtensionName[];
 extern const char kAllowSignedHTTPExchangeCertsWithoutExtensionDescription[];
 
+extern const char kEnableSignedExchangeSubresourcePrefetchName[];
+extern const char kEnableSignedExchangeSubresourcePrefetchDescription[];
+
 extern const char kAllowStartingServiceManagerOnlyName[];
 extern const char kAllowStartingServiceManagerOnlyDescription[];
 
@@ -335,9 +338,6 @@
 extern const char kEnableDesktopPWAsLinkCapturingName[];
 extern const char kEnableDesktopPWAsLinkCapturingDescription[];
 
-extern const char kDesktopPWAsCustomTabUIName[];
-extern const char kDesktopPWAsCustomTabUIDescription[];
-
 extern const char kDesktopPWAsStayInWindowName[];
 extern const char kDesktopPWAsStayInWindowDescription[];
 
@@ -362,9 +362,6 @@
 extern const char kEnableGpuServiceLoggingName[];
 extern const char kEnableGpuServiceLoggingDescription[];
 
-extern const char kEnableHDRName[];
-extern const char kEnableHDRDescription[];
-
 extern const char kEnableImplicitRootScrollerName[];
 extern const char kEnableImplicitRootScrollerDescription[];
 
@@ -1091,6 +1088,9 @@
 extern const char kTranslateForceTriggerOnEnglishName[];
 extern const char kTranslateForceTriggerOnEnglishDescription[];
 
+extern const char kTranslateBubbleUIName[];
+extern const char kTranslateBubbleUIDescription[];
+
 extern const char kTreatInsecureOriginAsSecureName[];
 extern const char kTreatInsecureOriginAsSecureDescription[];
 
@@ -1918,9 +1918,6 @@
 extern const char kUseMonitorColorSpaceName[];
 extern const char kUseMonitorColorSpaceDescription[];
 
-extern const char kUserActivityPredictionMlServiceName[];
-extern const char kUserActivityPredictionMlServiceDescription[];
-
 extern const char kVaapiJpegImageDecodeAccelerationName[];
 extern const char kVaapiJpegImageDecodeAccelerationDescription[];
 
diff --git a/chrome/browser/media/media_engagement_contents_observer.cc b/chrome/browser/media/media_engagement_contents_observer.cc
index d637ecd1..c3ebfdd4 100644
--- a/chrome/browser/media/media_engagement_contents_observer.cc
+++ b/chrome/browser/media/media_engagement_contents_observer.cc
@@ -605,11 +605,8 @@
 content::WebContents* MediaEngagementContentsObserver::GetOpener() const {
 #if !defined(OS_ANDROID)
   for (auto* browser : *BrowserList::GetInstance()) {
-    if (!browser->profile()->IsSameProfile(service_->profile()) ||
-        browser->profile()->GetProfileType() !=
-            service_->profile()->GetProfileType()) {
+    if (!browser->profile()->IsSameProfileAndType(service_->profile()))
       continue;
-    }
 
     int index =
         browser->tab_strip_model()->GetIndexOfWebContents(web_contents());
diff --git a/chrome/browser/metrics/power_metrics_provider_mac.mm b/chrome/browser/metrics/power_metrics_provider_mac.mm
index 5740009..63a77c4 100644
--- a/chrome/browser/metrics/power_metrics_provider_mac.mm
+++ b/chrome/browser/metrics/power_metrics_provider_mac.mm
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/metrics/power_metrics_provider_mac.h"
 
+#import <Foundation/Foundation.h>
 #include <IOKit/IOKitLib.h>
 #include <libkern/OSByteOrder.h>
 
@@ -165,6 +166,30 @@
   SMCParamStruct::SMCKeyInfoData keyInfo_{};
 };
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class ThermalStateUMA {
+  kNominal = 0,
+  kFair = 1,
+  kSerious = 2,
+  kCritical = 3,
+  kMaxValue = kCritical,
+};
+
+ThermalStateUMA ThermalStateToUmaEnumValue(NSProcessInfoThermalState state)
+    API_AVAILABLE(macos(10.10.3)) {
+  switch (state) {
+    case NSProcessInfoThermalStateNominal:
+      return ThermalStateUMA::kNominal;
+    case NSProcessInfoThermalStateFair:
+      return ThermalStateUMA::kFair;
+    case NSProcessInfoThermalStateSerious:
+      return ThermalStateUMA::kSerious;
+    case NSProcessInfoThermalStateCritical:
+      return ThermalStateUMA::kCritical;
+  }
+}
+
 }  // namespace
 
 class PowerMetricsProvider::Impl : public base::RefCountedThreadSafe<Impl> {
@@ -186,9 +211,7 @@
         cpu_package_cpu_power_key_(connect, SMCParamStruct::SMCKey::CPUPower),
         cpu_package_gpu_power_key_(connect, SMCParamStruct::SMCKey::iGPUPower),
         gpu_0_power_key_(connect, SMCParamStruct::SMCKey::GPU0Power),
-        gpu_1_power_key_(connect, SMCParamStruct::SMCKey::GPU0Power)
-
-  {}
+        gpu_1_power_key_(connect, SMCParamStruct::SMCKey::GPU0Power) {}
 
   ~Impl() = default;
 
@@ -212,13 +235,17 @@
   void Collect() {
     ScheduleCollection();
 
-    if (IsInStartup())
-      Record("DuringStartup");
-    else
-      Record("All");
+    if (IsInStartup()) {
+      RecordSMC("DuringStartup");
+    } else {
+      RecordSMC("All");
+      if (@available(macOS 10.10.3, *)) {
+        RecordThermal();
+      }
+    }
   }
 
-  void Record(const std::string& name) {
+  void RecordSMC(const std::string& name) {
     const struct {
       const char* uma_prefix;
       SMCKey& smc_key;
@@ -237,6 +264,12 @@
     }
   }
 
+  void RecordThermal() API_AVAILABLE(macos(10.10.3)) {
+    UMA_HISTOGRAM_ENUMERATION(
+        "Power.Mac.ThermalState",
+        ThermalStateToUmaEnumValue([[NSProcessInfo processInfo] thermalState]));
+  }
+
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
   bool could_be_in_startup_ = true;
 
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.cc b/chrome/browser/navigation_predictor/navigation_predictor.cc
index 448a2bb..7e1d59b 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor.cc
@@ -136,8 +136,7 @@
           base::GetFieldTrialParamByFeatureAsBool(
               blink::features::kNavigationPredictor,
               "same_origin_preconnecting_allowed",
-              false))
-{
+              false)) {
   DCHECK(browser_context_);
   DETACH_FROM_SEQUENCE(sequence_checker_);
   DCHECK_LE(0, preconnect_origin_score_threshold_);
@@ -317,14 +316,24 @@
   if (current_visibility_ != content::Visibility::VISIBLE)
     return;
 
-  // Set/Reset the timer to fire after the pre-connect times out. Add an extra
-  // 50ms to make sure the preconnect has expired if it wasn't used.
+  // The delay beyond the idle socket timeout that net uses when
+  // re-preconnecting. If negative, no retries occur.
+  int retry_delay_ms = base::GetFieldTrialParamByFeatureAsInt(
+      blink::features::kNavigationPredictor, "retry_preconnect_wait_time_ms",
+      50);
+
+  if (retry_delay_ms < 0) {
+    return;
+  }
+
+  // Set/Reset the timer to fire after the preconnect times out. Add an extra
+  // delay to make sure the preconnect has expired if it wasn't used.
   timer_.Start(
       FROM_HERE,
       base::TimeDelta::FromSeconds(base::GetFieldTrialParamByFeatureAsInt(
           net::features::kNetUnusedIdleSocketTimeout,
           "unused_idle_socket_timeout_seconds", 10)) +
-          base::TimeDelta::FromMilliseconds(50),
+          base::TimeDelta::FromMilliseconds(retry_delay_ms),
       base::BindOnce(&NavigationPredictor::MaybePreconnectNow,
                      base::Unretained(this), Action::kPreconnectAfterTimeout));
 }
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc b/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc
index 9571518..88c0613 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc
@@ -396,6 +396,33 @@
                        NavigationPredictor::Action::kPreconnectAfterTimeout)));
 }
 
+// Test that we don't preconnect after the last preconnect timed out when
+// retry_preconnect_wait_time_ms is negative.
+IN_PROC_BROWSER_TEST_F(NavigationPredictorBrowserTest,
+                       DISABLE_ON_CHROMEOS(ActionAccuracy_timeout_no_retry)) {
+  base::HistogramTester histogram_tester;
+
+  base::test::ScopedFeatureList scoped_feature_list_net;
+  // -1 would force synchronous retries if retries were not disabled.
+  scoped_feature_list_net.InitAndEnableFeatureWithParameters(
+      net::features::kNetUnusedIdleSocketTimeout,
+      {{"unused_idle_socket_timeout_seconds", "-1"}});
+
+  base::test::ScopedFeatureList scoped_feature_list_predictor;
+  scoped_feature_list_predictor.InitAndEnableFeatureWithParameters(
+      blink::features::kNavigationPredictor,
+      {{"retry_preconnect_wait_time_ms", "-1"}});
+
+  const GURL& url = GetTestURL("/page_with_same_host_anchor_element.html");
+  ui_test_utils::NavigateToURL(browser(), url);
+  WaitForLayout(&histogram_tester);
+
+  EXPECT_EQ(0, histogram_tester.GetBucketCount(
+                   "NavigationPredictor.OnNonDSE.ActionTaken",
+                   static_cast<base::HistogramBase::Sample>(
+                       NavigationPredictor::Action::kPreconnectAfterTimeout)));
+}
+
 // Test that the action accuracy is properly recorded and when same origin
 // preconnections are enabled, then navigation predictor initiates the
 // preconnection.
diff --git a/chrome/browser/net/chrome_net_log_helper.cc b/chrome/browser/net/chrome_net_log_helper.cc
deleted file mode 100644
index bd63d69..0000000
--- a/chrome/browser/net/chrome_net_log_helper.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/net/chrome_net_log_helper.h"
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "chrome/common/chrome_switches.h"
-
-net::NetLogCaptureMode GetNetCaptureModeFromCommandLine(
-    const base::CommandLine& command_line) {
-  if (command_line.HasSwitch(switches::kNetLogCaptureMode)) {
-    std::string capture_mode_string =
-        command_line.GetSwitchValueASCII(switches::kNetLogCaptureMode);
-    if (capture_mode_string == "Default")
-      return net::NetLogCaptureMode::Default();
-    if (capture_mode_string == "IncludeCookiesAndCredentials")
-      return net::NetLogCaptureMode::IncludeCookiesAndCredentials();
-    if (capture_mode_string == "IncludeSocketBytes")
-      return net::NetLogCaptureMode::IncludeSocketBytes();
-
-    LOG(ERROR) << "Unrecognized value for --" << switches::kNetLogCaptureMode;
-  }
-
-  return net::NetLogCaptureMode::Default();
-}
diff --git a/chrome/browser/net/chrome_net_log_helper.h b/chrome/browser/net/chrome_net_log_helper.h
deleted file mode 100644
index 6e1d90b..0000000
--- a/chrome/browser/net/chrome_net_log_helper.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_NET_CHROME_NET_LOG_HELPER_H_
-#define CHROME_BROWSER_NET_CHROME_NET_LOG_HELPER_H_
-
-#include "net/log/net_log_capture_mode.h"
-
-namespace base {
-class CommandLine;
-}
-
-// Returns the capture mode to be used with the net log.
-net::NetLogCaptureMode GetNetCaptureModeFromCommandLine(
-    const base::CommandLine& command_line);
-
-#endif  // CHROME_BROWSER_NET_CHROME_NET_LOG_HELPER_H_
diff --git a/chrome/browser/net/log_net_log_browsertest.cc b/chrome/browser/net/log_net_log_browsertest.cc
index 88350ec..34a67615 100644
--- a/chrome/browser/net/log_net_log_browsertest.cc
+++ b/chrome/browser/net/log_net_log_browsertest.cc
@@ -13,8 +13,13 @@
 namespace chrome_browser_net {
 namespace {
 
-// Tests for the --log-net-log command line flag.
-class LogNetLogTest : public InProcessBrowserTest {
+// Test fixture for running tests with --log-net-log, and a parameterized value
+// for --net-log-capture-mode.
+//
+// Asserts that a netlog file was created, appears valid, and stripped cookies
+// in accordance to the --net-log-capture-mode flag.
+class LogNetLogTest : public InProcessBrowserTest,
+                      public testing::WithParamInterface<const char*> {
  public:
   LogNetLogTest() = default;
 
@@ -24,12 +29,18 @@
 
     command_line->AppendSwitchPath(network::switches::kLogNetLog,
                                    net_log_path_);
+
+    if (GetParam()) {
+      command_line->AppendSwitchASCII(network::switches::kNetLogCaptureMode,
+                                      GetParam());
+    }
   }
 
   void TearDownInProcessBrowserTestFixture() override { VerifyNetLog(); }
 
  private:
-  // Verify that the netlog file was written and appears to be well formed.
+  // Verify that the netlog file was written, appears to be well formed, and
+  // includes the requested level of data.
   void VerifyNetLog() {
     // Read the netlog from disk.
     std::string file_contents;
@@ -53,6 +64,20 @@
     base::ListValue* events;
     ASSERT_TRUE(main->GetList("events", &events));
     ASSERT_FALSE(events->empty());
+
+    // Verify that cookies were stripped when the --net-log-capture-mode flag
+    // was omitted, and not stripped when it was given a value of
+    // IncludeCookiesAndCredentials
+    bool include_cookies = GetParam() && base::StringPiece(GetParam()) ==
+                                             "IncludeCookiesAndCredentials";
+
+    if (include_cookies) {
+      EXPECT_TRUE(file_contents.find("Set-Cookie: name=Good;Max-Age=3600") !=
+                  std::string::npos);
+    } else {
+      EXPECT_TRUE(file_contents.find("Set-Cookie: [22 bytes were stripped]") !=
+                  std::string::npos);
+    }
   }
 
   base::FilePath net_log_path_;
@@ -61,11 +86,15 @@
   DISALLOW_COPY_AND_ASSIGN(LogNetLogTest);
 };
 
-IN_PROC_BROWSER_TEST_F(LogNetLogTest, Basic) {
-  // Do an action that will result in the output of netlog events. This isn't
-  // strictly necessary since there is other networking that will happen
-  // implicitly to generate events.
-  ui_test_utils::NavigateToURL(browser(), GURL("http://127.0.0.1/foo"));
+INSTANTIATE_TEST_SUITE_P(,
+                         LogNetLogTest,
+                         ::testing::Values(nullptr,
+                                           "IncludeCookiesAndCredentials"));
+
+IN_PROC_BROWSER_TEST_P(LogNetLogTest, Basic) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL url(embedded_test_server()->GetURL("/set_cookie_header.html"));
+  ui_test_utils::NavigateToURL(browser(), url);
 }
 
 }  // namespace
diff --git a/chrome/browser/net/variations_http_headers_browsertest.cc b/chrome/browser/net/variations_http_headers_browsertest.cc
index c96ed960..3d97f9e 100644
--- a/chrome/browser/net/variations_http_headers_browsertest.cc
+++ b/chrome/browser/net/variations_http_headers_browsertest.cc
@@ -364,9 +364,17 @@
   EXPECT_FALSE(HasReceivedHeader(GetExampleUrl(), "X-Client-Data"));
 }
 
+#if defined(OS_CHROMEOS)
+// See https://crbug.com/964338
+#define MAYBE_TestStrippingHeadersFromRequestUsingSimpleURLLoaderWithGlobalSystemNetworkContext \
+  DISABLED_TestStrippingHeadersFromRequestUsingSimpleURLLoaderWithGlobalSystemNetworkContext
+#else
+#define MAYBE_TestStrippingHeadersFromRequestUsingSimpleURLLoaderWithGlobalSystemNetworkContext \
+  TestStrippingHeadersFromRequestUsingSimpleURLLoaderWithGlobalSystemNetworkContext
+#endif
 IN_PROC_BROWSER_TEST_F(
     VariationsHttpHeadersBrowserTest,
-    TestStrippingHeadersFromRequestUsingSimpleURLLoaderWithGlobalSystemNetworkContext) {
+    MAYBE_TestStrippingHeadersFromRequestUsingSimpleURLLoaderWithGlobalSystemNetworkContext) {
   GURL url = GetGoogleRedirectUrl1();
 
   auto resource_request = std::make_unique<network::ResourceRequest>();
diff --git a/chrome/browser/offline_pages/offline_page_tab_helper_unittest.cc b/chrome/browser/offline_pages/offline_page_tab_helper_unittest.cc
index d86d1a0..55a995c 100644
--- a/chrome/browser/offline_pages/offline_page_tab_helper_unittest.cc
+++ b/chrome/browser/offline_pages/offline_page_tab_helper_unittest.cc
@@ -13,6 +13,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/offline_pages/prefetch/prefetch_service_factory.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/keyed_service/core/simple_key_map.h"
 #include "components/offline_pages/core/model/offline_page_model_utils.h"
 #include "components/offline_pages/core/offline_page_item.h"
 #include "components/offline_pages/core/prefetch/offline_metrics_collector.h"
@@ -69,8 +70,7 @@
 };
 
 // This is used by KeyedServiceFactory::SetTestingFactoryAndUse.
-std::unique_ptr<KeyedService> BuildTestPrefetchService(
-    content::BrowserContext*) {
+std::unique_ptr<KeyedService> BuildTestPrefetchService(SimpleFactoryKey*) {
   auto taco = std::make_unique<PrefetchServiceTestTaco>();
   taco->SetOfflineMetricsCollector(std::make_unique<TestMetricsCollector>());
   return taco->CreateAndReturnPrefetchService();
@@ -116,10 +116,12 @@
 void OfflinePageTabHelperTest::SetUp() {
   content::RenderViewHostTestHarness::SetUp();
 
+  SimpleFactoryKey* key =
+      SimpleKeyMap::GetInstance()->GetForBrowserContext(browser_context());
+
   PrefetchServiceFactory::GetInstance()->SetTestingFactoryAndUse(
-      browser_context(), base::BindRepeating(&BuildTestPrefetchService));
-  prefetch_service_ =
-      PrefetchServiceFactory::GetForBrowserContext(browser_context());
+      key, base::BindRepeating(&BuildTestPrefetchService));
+  prefetch_service_ = PrefetchServiceFactory::GetForKey(key);
 
   OfflinePageTabHelper::CreateForWebContents(web_contents());
   tab_helper_ = OfflinePageTabHelper::FromWebContents(web_contents());
diff --git a/chrome/browser/offline_pages/offline_page_url_loader.cc b/chrome/browser/offline_pages/offline_page_url_loader.cc
index 4d2a9e7a..c6d049c6 100644
--- a/chrome/browser/offline_pages/offline_page_url_loader.cc
+++ b/chrome/browser/offline_pages/offline_page_url_loader.cc
@@ -10,6 +10,7 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "chrome/browser/offline_pages/offline_page_utils.h"
 #include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
+#include "components/offline_pages/core/offline_page_feature.h"
 #include "components/offline_pages/core/offline_page_item.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
@@ -45,6 +46,9 @@
 }
 
 bool ShouldCreateLoader(const network::ResourceRequest& resource_request) {
+  if (!IsOfflinePagesEnabled())
+    return false;
+
   // Ignore the requests not for the main frame.
   if (resource_request.resource_type !=
       static_cast<int>(content::ResourceType::kMainFrame))
diff --git a/chrome/browser/offline_pages/offline_page_utils.cc b/chrome/browser/offline_pages/offline_page_utils.cc
index 1b1072f..66f63329 100644
--- a/chrome/browser/offline_pages/offline_page_utils.cc
+++ b/chrome/browser/offline_pages/offline_page_utils.cc
@@ -333,6 +333,9 @@
 bool OfflinePageUtils::CanDownloadAsOfflinePage(
     const GURL& url,
     const std::string& contents_mime_type) {
+  if (!IsOfflinePagesEnabled())
+    return false;
+
   return url.SchemeIsHTTPOrHTTPS() &&
          (net::MatchesMimeType(contents_mime_type, "text/html") ||
           net::MatchesMimeType(contents_mime_type, "application/xhtml+xml"));
diff --git a/chrome/browser/offline_pages/offline_page_utils_unittest.cc b/chrome/browser/offline_pages/offline_page_utils_unittest.cc
index cd4e214..fdc4165 100644
--- a/chrome/browser/offline_pages/offline_page_utils_unittest.cc
+++ b/chrome/browser/offline_pages/offline_page_utils_unittest.cc
@@ -350,7 +350,12 @@
   EXPECT_EQ(OfflinePageUtils::DuplicateCheckResult::NOT_FOUND, result);
 }
 
-TEST_F(OfflinePageUtilsTest, ScheduleDownload) {
+#if defined(DISABLE_OFFLINE_PAGES_TOUCHLESS)
+#define MAYBE_ScheduleDownload DISABLED_ScheduleDownload
+#else
+#define MAYBE_ScheduleDownload ScheduleDownload
+#endif
+TEST_F(OfflinePageUtilsTest, MAYBE_ScheduleDownload) {
   // Pre-check.
   ASSERT_EQ(0, FindRequestByNamespaceAndURL(kDownloadNamespace, kTestPage1Url));
   ASSERT_EQ(1, FindRequestByNamespaceAndURL(kDownloadNamespace, kTestPage3Url));
diff --git a/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.cc b/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.cc
index 233eea4..e2042f9 100644
--- a/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.cc
+++ b/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h"
 
+#include <limits>
 #include <map>
 #include <set>
 #include <utility>
@@ -21,8 +22,8 @@
 namespace offline_pages {
 
 OfflinePrefetchDownloadClient::OfflinePrefetchDownloadClient(
-    content::BrowserContext* context)
-    : context_(context) {}
+    SimpleFactoryKey* simple_factory_key)
+    : simple_factory_key_(simple_factory_key) {}
 
 OfflinePrefetchDownloadClient::~OfflinePrefetchDownloadClient() = default;
 
@@ -101,7 +102,7 @@
 PrefetchDownloader* OfflinePrefetchDownloadClient::GetPrefetchDownloader()
     const {
   PrefetchService* prefetch_service =
-      PrefetchServiceFactory::GetForBrowserContext(context_);
+      PrefetchServiceFactory::GetForKey(simple_factory_key_);
   if (!prefetch_service)
     return nullptr;
   return prefetch_service->GetPrefetchDownloader();
diff --git a/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h b/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h
index 5c4193d8a..21e474f3 100644
--- a/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h
+++ b/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h
@@ -5,12 +5,13 @@
 #ifndef CHROME_BROWSER_OFFLINE_PAGES_PREFETCH_OFFLINE_PREFETCH_DOWNLOAD_CLIENT_H_
 #define CHROME_BROWSER_OFFLINE_PAGES_PREFETCH_OFFLINE_PREFETCH_DOWNLOAD_CLIENT_H_
 
+#include <string>
+#include <vector>
+
 #include "base/macros.h"
 #include "components/download/public/background_service/client.h"
 
-namespace content {
-class BrowserContext;
-}  // namespace content
+class SimpleFactoryKey;
 
 namespace download {
 struct CompletionInfo;
@@ -23,7 +24,7 @@
 
 class OfflinePrefetchDownloadClient : public download::Client {
  public:
-  explicit OfflinePrefetchDownloadClient(content::BrowserContext* context);
+  explicit OfflinePrefetchDownloadClient(SimpleFactoryKey* simple_factory_key);
   ~OfflinePrefetchDownloadClient() override;
 
  private:
@@ -45,7 +46,7 @@
 
   PrefetchDownloader* GetPrefetchDownloader() const;
 
-  content::BrowserContext* context_;
+  SimpleFactoryKey* simple_factory_key_;
 
   DISALLOW_COPY_AND_ASSIGN(OfflinePrefetchDownloadClient);
 };
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc b/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc
index 486805f3..fd3bb48e 100644
--- a/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc
+++ b/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/offline_pages/prefetch/prefetch_service_factory.h"
 
 #include <memory>
+#include <string>
 #include <utility>
 
 #include "base/bind_helpers.h"
@@ -24,6 +25,7 @@
 #include "chrome/browser/offline_pages/prefetch/prefetch_instance_id_proxy.h"
 #include "chrome/browser/offline_pages/prefetch/thumbnail_fetcher_impl.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_key.h"
 #include "chrome/browser/transition_manager/full_browser_transition_manager.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_constants.h"
@@ -31,7 +33,7 @@
 #include "components/image_fetcher/core/cached_image_fetcher.h"
 #include "components/image_fetcher/core/image_fetcher_impl.h"
 #include "components/image_fetcher/core/image_fetcher_service.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/core/simple_dependency_manager.h"
 #include "components/offline_pages/core/offline_page_feature.h"
 #include "components/offline_pages/core/prefetch/prefetch_dispatcher_impl.h"
 #include "components/offline_pages/core/prefetch/prefetch_downloader_impl.h"
@@ -41,8 +43,8 @@
 #include "components/offline_pages/core/prefetch/prefetch_service_impl.h"
 #include "components/offline_pages/core/prefetch/store/prefetch_store.h"
 #include "components/offline_pages/core/prefetch/suggested_articles_observer.h"
-#include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace offline_pages {
@@ -72,9 +74,8 @@
 }  // namespace
 
 PrefetchServiceFactory::PrefetchServiceFactory()
-    : BrowserContextKeyedServiceFactory(
-          "OfflinePagePrefetchService",
-          BrowserContextDependencyManager::GetInstance()) {
+    : SimpleKeyedServiceFactory("OfflinePagePrefetchService",
+                                SimpleDependencyManager::GetInstance()) {
   DependsOn(DownloadServiceFactory::GetInstance());
   DependsOn(OfflinePageModelFactory::GetInstance());
   DependsOn(ImageFetcherServiceFactory::GetInstance());
@@ -86,27 +87,33 @@
 }
 
 // static
-PrefetchService* PrefetchServiceFactory::GetForBrowserContext(
-    content::BrowserContext* context) {
+PrefetchService* PrefetchServiceFactory::GetForKey(SimpleFactoryKey* key) {
   return static_cast<PrefetchService*>(
-      GetInstance()->GetServiceForBrowserContext(context, true));
+      GetInstance()->GetServiceForKey(key, true));
 }
 
-KeyedService* PrefetchServiceFactory::BuildServiceInstanceFor(
-    content::BrowserContext* context) const {
+// static
+PrefetchService* PrefetchServiceFactory::GetForBrowserContext(
+    content::BrowserContext* context) {
+  Profile* profile = Profile::FromBrowserContext(context);
+  return GetForKey(profile->GetProfileKey());
+}
+
+std::unique_ptr<KeyedService> PrefetchServiceFactory::BuildServiceInstanceFor(
+    SimpleFactoryKey* key) const {
+  ProfileKey* profile_key = ProfileKey::FromSimpleFactoryKey(key);
+
   const bool feed_enabled =
       base::FeatureList::IsEnabled(feed::kInterestFeedContentSuggestions);
-  Profile* profile = Profile::FromBrowserContext(context);
-  DCHECK(profile);
   OfflinePageModel* offline_page_model =
-      OfflinePageModelFactory::GetForBrowserContext(context);
+      OfflinePageModelFactory::GetForKey(profile_key);
   DCHECK(offline_page_model);
 
   auto offline_metrics_collector =
-      std::make_unique<OfflineMetricsCollectorImpl>(profile->GetPrefs());
+      std::make_unique<OfflineMetricsCollectorImpl>(profile_key->GetPrefs());
 
   auto prefetch_dispatcher =
-      std::make_unique<PrefetchDispatcherImpl>(profile->GetPrefs());
+      std::make_unique<PrefetchDispatcherImpl>(profile_key->GetPrefs());
 
   auto* system_network_context_manager =
       SystemNetworkContextManager::GetInstance();
@@ -123,12 +130,12 @@
   auto prefetch_network_request_factory =
       std::make_unique<PrefetchNetworkRequestFactoryImpl>(
           url_loader_factory, chrome::GetChannel(), GetUserAgent(),
-          profile->GetPrefs());
+          profile_key->GetPrefs());
 
   scoped_refptr<base::SequencedTaskRunner> background_task_runner =
       base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()});
   base::FilePath store_path =
-      profile->GetPath().Append(chrome::kOfflinePagePrefetchStoreDirname);
+      profile_key->GetPath().Append(chrome::kOfflinePagePrefetchStoreDirname);
   auto prefetch_store =
       std::make_unique<PrefetchStore>(background_task_runner, store_path);
 
@@ -142,25 +149,25 @@
     suggested_articles_observer = std::make_unique<SuggestedArticlesObserver>();
     thumbnail_fetcher = std::make_unique<ThumbnailFetcherImpl>();
   } else {
-    SimpleFactoryKey* simple_factory_key = profile->GetProfileKey();
     image_fetcher::ImageFetcherService* image_fetcher_service =
-        ImageFetcherServiceFactory::GetForKey(simple_factory_key);
+        ImageFetcherServiceFactory::GetForKey(profile_key);
     DCHECK(image_fetcher_service);
     image_fetcher = image_fetcher_service->GetImageFetcher(
         image_fetcher::ImageFetcherConfig::kDiskCacheOnly);
   }
 
   auto prefetch_downloader = std::make_unique<PrefetchDownloaderImpl>(
-      DownloadServiceFactory::GetForBrowserContext(context),
-      chrome::GetChannel(), profile->GetPrefs());
+      DownloadServiceFactory::GetForKey(profile_key), chrome::GetChannel(),
+      profile_key->GetPrefs());
 
   auto prefetch_importer = std::make_unique<PrefetchImporterImpl>(
       prefetch_dispatcher.get(), offline_page_model, background_task_runner);
 
   auto prefetch_background_task_handler =
-      std::make_unique<PrefetchBackgroundTaskHandlerImpl>(profile->GetPrefs());
+      std::make_unique<PrefetchBackgroundTaskHandlerImpl>(
+          profile_key->GetPrefs());
 
-  auto* service = new PrefetchServiceImpl(
+  auto service = std::make_unique<PrefetchServiceImpl>(
       std::move(offline_metrics_collector), std::move(prefetch_dispatcher),
       std::move(prefetch_network_request_factory), offline_page_model,
       std::move(prefetch_store), std::move(suggested_articles_observer),
@@ -168,9 +175,9 @@
       std::move(prefetch_background_task_handler), std::move(thumbnail_fetcher),
       image_fetcher);
 
-  auto callback = base::BindOnce(&OnProfileCreated, service);
+  auto callback = base::BindOnce(&OnProfileCreated, service.get());
   FullBrowserTransitionManager::Get()->RegisterCallbackOnProfileCreation(
-      profile->GetProfileKey(), std::move(callback));
+      profile_key, std::move(callback));
 
   return service;
 }
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_service_factory.h b/chrome/browser/offline_pages/prefetch/prefetch_service_factory.h
index dac9fe12..f62ff51 100644
--- a/chrome/browser/offline_pages/prefetch/prefetch_service_factory.h
+++ b/chrome/browser/offline_pages/prefetch/prefetch_service_factory.h
@@ -5,14 +5,20 @@
 #ifndef CHROME_BROWSER_OFFLINE_PAGES_PREFETCH_PREFETCH_SERVICE_FACTORY_H_
 #define CHROME_BROWSER_OFFLINE_PAGES_PREFETCH_PREFETCH_SERVICE_FACTORY_H_
 
+#include <memory>
+
 #include "base/macros.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+#include "components/keyed_service/core/simple_keyed_service_factory.h"
 
 namespace base {
 template <typename T>
 struct DefaultSingletonTraits;
 }  // namespace base
 
+namespace content {
+class BrowserContext;
+}  // namespace content
+
 namespace offline_pages {
 
 class PrefetchService;
@@ -20,9 +26,14 @@
 // A factory to create one PrefetchServiceImpl per browser context. Prefetching
 // Offline Pages is not supported in incognito, so this class uses default
 // implementation of |GetBrowserContextToUse|.
-class PrefetchServiceFactory : public BrowserContextKeyedServiceFactory {
+class PrefetchServiceFactory : public SimpleKeyedServiceFactory {
  public:
   static PrefetchServiceFactory* GetInstance();
+  static PrefetchService* GetForKey(SimpleFactoryKey* key);
+
+  // Helper method that calls GetForKey().
+  // Returns the DownloadService associated with the key associated with
+  // |context|.
   static PrefetchService* GetForBrowserContext(
       content::BrowserContext* context);
 
@@ -32,8 +43,8 @@
   PrefetchServiceFactory();
   ~PrefetchServiceFactory() override {}
 
-  KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* context) const override;
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      SimpleFactoryKey* key) const override;
 
   DISALLOW_COPY_AND_ASSIGN(PrefetchServiceFactory);
 };
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc
index 4b9099a4..276e560 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.cc
@@ -131,6 +131,24 @@
   return CONTINUE_OBSERVING;
 }
 
+void AdsPageLoadMetricsObserver::OnTimingUpdate(
+    content::RenderFrameHost* subframe_rfh,
+    const page_load_metrics::mojom::PageLoadTiming& timing,
+    const page_load_metrics::PageLoadExtraInfo& extra_info) {
+  if (!subframe_rfh)
+    return;
+  const auto& id_and_data =
+      ad_frames_data_.find(subframe_rfh->GetFrameTreeNodeId());
+  if (id_and_data == ad_frames_data_.end())
+    return;
+  FrameData* ancestor_data = id_and_data->second;
+
+  // Only update the frame with the root frames timing updates.
+  if (ancestor_data &&
+      ancestor_data->frame_tree_node_id() == subframe_rfh->GetFrameTreeNodeId())
+    ancestor_data->set_timing(timing.Clone());
+}
+
 void AdsPageLoadMetricsObserver::OnCpuTimingUpdate(
     content::RenderFrameHost* subframe_rfh,
     const page_load_metrics::mojom::CpuTiming& timing) {
@@ -206,6 +224,11 @@
     ad_data->UpdateForNavigation(ad_host, frame_navigated);
   }
 
+  // Maybe update frame depth based on the new ad frames distance to the ad
+  // root.
+  if (ad_data)
+    ad_data->MaybeUpdateFrameDepth(ad_host);
+
   // If there was previous data, then we don't want to overwrite this frame.
   if (!previous_data)
     ad_frames_data_[ad_id] = ad_data;
@@ -416,11 +439,13 @@
     const page_load_metrics::mojom::ResourceDataUpdatePtr& resource) {
   auto mime_type = FrameData::GetResourceMimeType(resource);
   int unaccounted_ad_bytes = GetUnaccountedAdBytes(process_id, resource);
-  aggregate_frame_data_->ProcessResourceLoadInFrame(resource);
+  aggregate_frame_data_->ProcessResourceLoadInFrame(
+      resource, process_id, GetDelegate()->GetResourceTracker());
   if (unaccounted_ad_bytes)
     aggregate_frame_data_->AdjustAdBytes(unaccounted_ad_bytes, mime_type);
   if (resource->is_main_frame_resource) {
-    main_frame_data_->ProcessResourceLoadInFrame(resource);
+    main_frame_data_->ProcessResourceLoadInFrame(
+        resource, process_id, GetDelegate()->GetResourceTracker());
     if (unaccounted_ad_bytes)
       main_frame_data_->AdjustAdBytes(unaccounted_ad_bytes, mime_type);
   }
@@ -462,7 +487,8 @@
 
   auto mime_type = FrameData::GetResourceMimeType(resource);
   int unaccounted_ad_bytes = GetUnaccountedAdBytes(process_id, resource);
-  ancestor_data->ProcessResourceLoadInFrame(resource);
+  ancestor_data->ProcessResourceLoadInFrame(
+      resource, process_id, GetDelegate()->GetResourceTracker());
   if (unaccounted_ad_bytes)
     ancestor_data->AdjustAdBytes(unaccounted_ad_bytes, mime_type);
 
@@ -474,6 +500,11 @@
   }
 }
 
+void AdsPageLoadMetricsObserver::RecordAdFrameUkm(ukm::SourceId source_id) {
+  for (const FrameData& ad_frame_data : ad_frames_data_storage_)
+    ad_frame_data.RecordAdFrameLoadUkmEvent(source_id);
+}
+
 void AdsPageLoadMetricsObserver::RecordPageResourceTotalHistograms(
     ukm::SourceId source_id) {
   // Only records histograms on pages that have some ad bytes.
@@ -527,6 +558,7 @@
   RecordHistogramsForAdTagging(FrameData::FrameVisibility::kNonVisible);
   RecordHistogramsForAdTagging(FrameData::FrameVisibility::kVisible);
   RecordHistogramsForAdTagging(FrameData::FrameVisibility::kAnyVisibility);
+  RecordAdFrameUkm(source_id);
   RecordPageResourceTotalHistograms(source_id);
 }
 
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.h
index 5d02163..fffa37a 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.h
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer.h
@@ -52,6 +52,10 @@
                         bool started_in_foreground) override;
   ObservePolicy OnCommit(content::NavigationHandle* navigation_handle,
                          ukm::SourceId source_id) override;
+  void OnTimingUpdate(
+      content::RenderFrameHost* subframe_rfh,
+      const page_load_metrics::mojom::PageLoadTiming& timing,
+      const page_load_metrics::PageLoadExtraInfo& extra_info) override;
   void OnCpuTimingUpdate(
       content::RenderFrameHost* subframe_rfh,
       const page_load_metrics::mojom::CpuTiming& timing) override;
@@ -119,6 +123,9 @@
       int process_id,
       const page_load_metrics::mojom::ResourceDataUpdatePtr& resource);
 
+  void RecordAdFrameLoadUkmEvent(ukm::SourceId source_id,
+                                 const FrameData& frame_data);
+  void RecordAdFrameUkm(ukm::SourceId source_id);
   void RecordPageResourceTotalHistograms(ukm::SourceId source_id);
   void RecordHistograms(ukm::SourceId source_id);
   void RecordHistogramsForAdTagging(FrameData::FrameVisibility visibility);
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
index bce5149..91b3b41 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -36,6 +36,7 @@
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/controllable_http_response.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_source.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -136,6 +137,7 @@
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest,
                        OriginStatusMetricSame) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(
       browser(),
@@ -146,6 +148,12 @@
   ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
   histogram_tester.ExpectUniqueSample(kCrossOriginHistogramId,
                                       FrameData::OriginStatus::kSame, 1);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kStatus_CrossOriginName,
+      static_cast<int>(FrameData::OriginStatus::kSame));
 }
 
 // Test that an ad with a different origin as the main page is cross origin.
@@ -153,6 +161,7 @@
                        OriginStatusMetricCross) {
   // Note: Cannot navigate cross-origin without dynamically generating the URL.
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   auto waiter = CreatePageLoadMetricsTestWaiter();
 
   ui_test_utils::NavigateToURL(
@@ -172,11 +181,18 @@
   ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
   histogram_tester.ExpectUniqueSample(kCrossOriginHistogramId,
                                       FrameData::OriginStatus::kCross, 1);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kStatus_CrossOriginName,
+      static_cast<int>(FrameData::OriginStatus::kCross));
 }
 
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest,
                        UserActivationSetOnFrame) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(
       browser(), embedded_test_server()->GetURL(
@@ -208,6 +224,17 @@
   histogram_tester.ExpectBucketCount(
       kAdUserActivationHistogramId,
       FrameData::UserActivationStatus::kNoActivation, 1);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(2u, entries.size());
+
+  // Verify that one ad was reported to be activated and the other was not.
+  EXPECT_TRUE(*ukm_recorder.GetEntryMetric(
+                  entries.front(),
+                  ukm::builders::AdFrameLoad::kStatus_UserActivationName) !=
+              *ukm_recorder.GetEntryMetric(
+                  entries.back(),
+                  ukm::builders::AdFrameLoad::kStatus_UserActivationName));
 }
 
 // Test that a subframe that aborts (due to doc.write) doesn't cause a crash
@@ -238,6 +265,7 @@
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest,
                        DocWriteAboutBlankAdframe) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(browser(),
                                embedded_test_server()->GetURL(
@@ -252,12 +280,19 @@
       1, 1);
   histogram_tester.ExpectUniqueSample(
       "PageLoad.Clients.Ads.Bytes.AdFrames.Aggregate.Total", 0 /* < 1 KB */, 1);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  EXPECT_GT(*ukm_recorder.GetEntryMetric(
+                entries.front(),
+                ukm::builders::AdFrameLoad::kLoading_NetworkBytesName),
+            0);
 }
 
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest,
                        SubresourceFilter) {
   base::HistogramTester histogram_tester;
-
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   // cross_site_iframe_factory loads URLs like:
   // http://b.com:40919/cross_site_iframe_factory.html?b()
   SetRulesetToDisallowURLsWithPathSuffix("b()");
@@ -278,12 +313,41 @@
       "PageLoad.Clients.Ads.FrameCounts.AnyParentFrame."
       "AdFrames",
       2, 1);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(2u, entries.size());
+}
+
+IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest, FrameDepth) {
+  base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
+  // cross_site_iframe_factory loads URLs like:
+  // http://b.com:40919/cross_site_iframe_factory.html?b()
+  SetRulesetToDisallowURLsWithPathSuffix("b()))");
+  const GURL main_url(embedded_test_server()->GetURL(
+      "a.com", "/cross_site_iframe_factory.html?a(b(b(b())))"));
+
+  auto waiter = CreatePageLoadMetricsTestWaiter();
+  ui_test_utils::NavigateToURL(browser(), main_url);
+
+  // One favicon resource and 2 resources for each frame.
+  waiter->AddMinimumCompleteResourcesExpectation(9);
+  waiter->Wait();
+
+  // Navigate away to force the histogram recording.
+  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kFrameDepthName, 2);
 }
 
 // Test that a frame without display:none is reported as visible.
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest,
                        VisibleAdframeRecorded) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(browser(),
                                embedded_test_server()->GetURL(
@@ -297,11 +361,18 @@
       "PageLoad.Clients.Ads.Bytes.AdFrames.PerFrame.Total", 1);
   histogram_tester.ExpectTotalCount(
       "PageLoad.Clients.Ads.NonVisible.Bytes.AdFrames.PerFrame.Total", 0);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kVisibility_HiddenName,
+      false);
 }
 
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest,
                        DisplayNoneAdframeRecorded) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(browser(),
                                embedded_test_server()->GetURL(
@@ -316,6 +387,12 @@
       "PageLoad.Clients.Ads.Bytes.AdFrames.PerFrame.Total", 1);
   histogram_tester.ExpectTotalCount(
       "PageLoad.Clients.Ads.Visible.Bytes.AdFrames.PerFrame.Total", 0);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kVisibility_HiddenName,
+      true);
 }
 
 // TODO(https://crbug.com/929136): Investigate why setting display: none on the
@@ -323,30 +400,36 @@
 // correct sizes for display: none iframes.
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest, FramePixelSize) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(
       browser(), embedded_test_server()->GetURL(
                      "/ads_observer/blank_with_adiframe_writer.html"));
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
+  std::map<std::pair<int, int>, int> expected_dimension_counts;
+  std::map<std::pair<int, int>, int> expected_bucketed_dimension_counts;
+  expected_dimension_counts[std::make_pair(100, 100)] = 1;
+  expected_dimension_counts[std::make_pair(0, 0)] = 1;
+  expected_dimension_counts[std::make_pair(10, 1000)] = 1;
 
-  // Create a 100x100 iframe.
-  ASSERT_TRUE(ExecJs(
-      web_contents,
-      "let frame = createAdIframe(); frame.width=100; frame.height = 100; "
-      "frame.src = '/ads_observer/pixel.png';"));
-
-  // Create a 0x0 iframe.
-  ASSERT_TRUE(ExecJs(
-      web_contents,
-      "frame = createAdIframe(); frame.width=0; frame.height = 0; frame.src = "
-      "'/ads_observer/pixel.png';"));
-
-  // Create a 10 x 1000 iframe.
-  ASSERT_TRUE(
-      ExecJs(web_contents,
-             "frame = createAdIframe(); frame.width=10; frame.height = 1000; "
-             "frame.src = '/ads_observer/pixel.png';"));
+  for (auto const& dimension_and_count : expected_dimension_counts) {
+    // Convert the expected dimensions into exponential buckets.
+    expected_bucketed_dimension_counts[std::make_pair(
+        ukm::GetExponentialBucketMinForCounts1000(
+            dimension_and_count.first.first),
+        ukm::GetExponentialBucketMinForCounts1000(
+            dimension_and_count.first.second))] = 1;
+    // Create an iframe with the given dimensions.
+    ASSERT_TRUE(
+        ExecJs(web_contents,
+               "let frame = createAdIframe(); frame.width=" +
+                   base::NumberToString(dimension_and_count.first.first) +
+                   "; frame.height = " +
+                   base::NumberToString(dimension_and_count.first.second) +
+                   "; "
+                   "frame.src = '/ads_observer/pixel.png';"));
+  }
 
   // Wait for each frames resource to load so that they will have non-zero
   // bytes.
@@ -363,6 +446,19 @@
   histogram_tester.ExpectBucketCount(kSmallestDimensionHistogramId, 0, 1);
   histogram_tester.ExpectBucketCount(kSmallestDimensionHistogramId, 10, 1);
   histogram_tester.ExpectBucketCount(kSmallestDimensionHistogramId, 100, 1);
+
+  // Verify each UKM entry has a corresponding, unique size.
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(3u, entries.size());
+  for (auto* const entry : entries) {
+    auto dimension = std::make_pair(
+        *ukm_recorder.GetEntryMetric(
+            entry, ukm::builders::AdFrameLoad::kVisibility_FrameWidthName),
+        *ukm_recorder.GetEntryMetric(
+            entry, ukm::builders::AdFrameLoad::kVisibility_FrameHeightName));
+    EXPECT_EQ(1u, expected_bucketed_dimension_counts.erase(dimension));
+  }
 }
 
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverBrowserTest,
@@ -649,6 +745,7 @@
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverResourceBrowserTest,
                        IncompleteResourcesRecordedToFrameMetrics) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   SetRulesetWithRules(
       {subresource_filter::testing::CreateSuffixRule("ad_iframe_writer.js")});
   embedded_test_server()->ServeFilesFromSourceDirectory(
@@ -703,11 +800,20 @@
       "PageLoad.Clients.Ads.Bytes.AdFrames.PerFrame.Network", 2, 1);
   histogram_tester.ExpectBucketCount(
       "PageLoad.Clients.Ads.Bytes.AdFrames.PerFrame.Total", 2, 1);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kLoading_NetworkBytesName,
+      ukm::GetExponentialBucketMinForBytes(2048));
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kLoading_CacheBytesName, 0);
 }
 
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverResourceBrowserTest,
                        AdFrameSizeInterventionTriggered) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   SetRulesetWithRules(
       {subresource_filter::testing::CreateSuffixRule("ad_iframe_writer.js")});
   embedded_test_server()->ServeFilesFromSourceDirectory(
@@ -757,6 +863,13 @@
   histogram_tester.ExpectBucketCount(
       "Blink.UseCounter.Features",
       blink::mojom::WebFeature::kAdFrameSizeIntervention, 1);
+
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kStatus_MediaName,
+      static_cast<int>(FrameData::MediaStatus::kNotPlayed));
 }
 
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverResourceBrowserTest,
@@ -822,11 +935,19 @@
   histogram_tester.ExpectBucketCount(
       "Blink.UseCounter.Features",
       blink::mojom::WebFeature::kAdFrameSizeIntervention, 1);
+
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kStatus_MediaName,
+      static_cast<int>(FrameData::MediaStatus::kPlayed));
 }
 
 IN_PROC_BROWSER_TEST_F(AdsPageLoadMetricsObserverResourceBrowserTest,
                        AdFrameSizeInterventionNotActivatedOnFrameWithGesture) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
   SetRulesetWithRules(
       {subresource_filter::testing::CreateSuffixRule("ad_iframe_writer.js")});
   embedded_test_server()->ServeFilesFromSourceDirectory(
@@ -881,6 +1002,12 @@
   histogram_tester.ExpectBucketCount(
       "Blink.UseCounter.Features",
       blink::mojom::WebFeature::kAdFrameSizeIntervention, 0);
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  ukm_recorder.ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kStatus_UserActivationName,
+      static_cast<int>(FrameData::UserActivationStatus::kReceivedActivation));
 }
 
 // Verify that UKM metrics are recorded correctly.
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
index be7f104..20296d25 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
@@ -40,6 +40,7 @@
 #include "content/public/test/test_navigation_throttle_inserter.h"
 #include "content/public/test/test_renderer_host.h"
 #include "net/base/host_port_pair.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "url/gurl.h"
 
@@ -55,6 +56,11 @@
       : cached_kb(cached_kb), uncached_kb(uncached_kb) {}
   size_t cached_kb;
   size_t uncached_kb;
+
+  bool operator<(const ExpectedFrameBytes& other) const {
+    return cached_kb < other.cached_kb ||
+           (cached_kb == other.cached_kb && uncached_kb < other.uncached_kb);
+  }
 };
 
 enum class ResourceCached { NOT_CACHED = false, CACHED = true };
@@ -125,6 +131,7 @@
 
 // Verifies that the histograms match what is expected.
 void TestHistograms(const base::HistogramTester& histograms,
+                    const ukm::TestAutoSetUkmRecorder& ukm_recorder,
                     const std::vector<ExpectedFrameBytes>& ad_frames,
                     size_t non_ad_cached_kb,
                     size_t non_ad_uncached_kb) {
@@ -137,6 +144,9 @@
   std::map<size_t, int> frames_with_network_byte_count;
   std::map<size_t, int> frames_with_percent_network_count;
 
+  // This map is keyed by (total bytes, network bytes).
+  std::map<ExpectedFrameBytes, int> frame_byte_counts;
+
   // Perform some initial calculations on the number of bytes, of each type,
   // in each ad frame.
   for (const ExpectedFrameBytes& bytes : ad_frames) {
@@ -155,6 +165,7 @@
     frames_with_network_byte_count[bytes.uncached_kb] += 1;
     frames_with_percent_network_count[(bytes.uncached_kb * 100) /
                                       total_frame_kb] += 1;
+    frame_byte_counts[bytes] += 1;
   }
 
   // Test the histograms.
@@ -208,6 +219,29 @@
       (total_ad_uncached_kb * 100) /
           (total_ad_uncached_kb + non_ad_uncached_kb),
       1);
+
+  // Verify AdFrameLoad UKM metrics.
+  auto entries =
+      ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(ad_frame_count, entries.size());
+
+  for (const auto& byte_count : frame_byte_counts) {
+    size_t cached_bytes = byte_count.first.cached_kb * 1024;
+    size_t network_bytes = byte_count.first.uncached_kb * 1024;
+    int matching_entries = 0;
+    for (auto const* entry : entries) {
+      int64_t entry_cache_bytes = *ukm_recorder.GetEntryMetric(
+          entry, ukm::builders::AdFrameLoad::kLoading_CacheBytesName);
+      int64_t entry_network_bytes = *ukm_recorder.GetEntryMetric(
+          entry, ukm::builders::AdFrameLoad::kLoading_NetworkBytesName);
+      if (entry_cache_bytes ==
+              ukm::GetExponentialBucketMinForBytes(cached_bytes) &&
+          entry_network_bytes ==
+              ukm::GetExponentialBucketMinForBytes(network_bytes))
+        matching_entries++;
+    }
+    EXPECT_EQ(matching_entries, byte_count.second);
+  }
 }
 
 }  // namespace
@@ -324,6 +358,10 @@
 
   base::HistogramTester& histogram_tester() { return histogram_tester_; }
 
+  const ukm::TestAutoSetUkmRecorder& test_ukm_recorder() const {
+    return test_ukm_recorder_;
+  }
+
   void OverrideVisibilityTrackerWithMockClock() {
     clock_ = std::make_unique<base::SimpleTestTickClock>();
   }
@@ -385,6 +423,7 @@
   }
 
   base::HistogramTester histogram_tester_;
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder_;
   std::unique_ptr<page_load_metrics::PageLoadMetricsObserverTester> tester_;
   // The clock used by the ScopedVisibilityTracker, assigned if non-null.
   std::unique_ptr<base::SimpleTestTickClock> clock_;
@@ -405,8 +444,9 @@
   // Navigate again to trigger histograms.
   NavigateFrame(kNonAdUrl, main_frame);
 
-  TestHistograms(histogram_tester(), std::vector<ExpectedFrameBytes>(),
-                 0 /* non_ad_cached_kb */, 30 /* non_ad_uncached_kb */);
+  TestHistograms(histogram_tester(), test_ukm_recorder(),
+                 std::vector<ExpectedFrameBytes>(), 0 /* non_ad_cached_kb */,
+                 30 /* non_ad_uncached_kb */);
 
   // Verify that other UMA wasn't written.
   histogram_tester().ExpectTotalCount(
@@ -424,8 +464,49 @@
   // Navigate again to trigger histograms.
   NavigateFrame(kNonAdUrl, main_frame);
 
-  TestHistograms(histogram_tester(), {{0, 10}}, 0 /* non_ad_cached_kb */,
-                 20 /* non_ad_uncached_kb */);
+  TestHistograms(histogram_tester(), test_ukm_recorder(), {{0, 10}},
+                 0 /* non_ad_cached_kb */, 20 /* non_ad_uncached_kb */);
+}
+
+TEST_F(AdsPageLoadMetricsObserverTest, AdFrameMimeTypeBytes) {
+  RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
+  RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
+  ResourceDataUpdate(main_frame, ResourceCached::NOT_CACHED, 10);
+  ResourceDataUpdate(
+      ad_frame, ResourceCached::NOT_CACHED, 10 /* resource_size_in_kbyte */,
+      "application/javascript" /* mime_type */, true /* is_ad_resource */);
+  ResourceDataUpdate(ad_frame, ResourceCached::NOT_CACHED,
+                     20 /* resource_size_in_kbyte */,
+                     "image/png" /* mime_type */, true /* is_ad_resource */);
+  ResourceDataUpdate(ad_frame, ResourceCached::NOT_CACHED,
+                     30 /* resource_size_in_kbyte */,
+                     "video/webm" /* mime_type */, true /* is_ad_resource */);
+
+  // Cached resource not counted.
+  ResourceDataUpdate(ad_frame, ResourceCached::CACHED,
+                     40 /* resource_size_in_kbyte */,
+                     "video/webm" /* mime_type */, true /* is_ad_resource */);
+
+  // Navigate again to trigger histograms.
+  NavigateFrame(kNonAdUrl, main_frame);
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kLoading_JavascriptBytesName,
+      ukm::GetExponentialBucketMinForBytes(10 * 1024));
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kLoading_ImageBytesName,
+      ukm::GetExponentialBucketMinForBytes(20 * 1024));
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kLoading_VideoBytesName,
+      ukm::GetExponentialBucketMinForBytes(30 * 1024));
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kLoading_NetworkBytesName,
+      ukm::GetExponentialBucketMinForBytes(60 * 1024));
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kLoading_CacheBytesName,
+      ukm::GetExponentialBucketMinForBytes(40 * 1024));
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest, ResourceBeforeAdFrameCommits) {
@@ -444,8 +525,8 @@
   // Navigate again to trigger histograms.
   NavigateFrame(kNonAdUrl, main_frame);
 
-  TestHistograms(histogram_tester(), {{0, 10}}, 0 /* non_ad_cached_kb */,
-                 10 /*non_ad_uncached_kb*/);
+  TestHistograms(histogram_tester(), test_ukm_recorder(), {{0, 10}},
+                 0 /* non_ad_cached_kb */, 10 /*non_ad_uncached_kb*/);
 }
 
 // Test that the cross-origin ad subframe navigation metric works as it's
@@ -461,6 +542,7 @@
   // indirect ad subframes.
   {
     base::HistogramTester histograms;
+    ukm::TestAutoSetUkmRecorder ukm_recorder;
     RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
     RenderFrameHost* ad_sub_frame =
         CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -472,12 +554,19 @@
     NavigateFrame(kAdUrl, main_frame);
     histograms.ExpectUniqueSample(kCrossOriginHistogramId,
                                   FrameData::OriginStatus::kCross, 1);
+    auto entries =
+        ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+    EXPECT_EQ(1u, entries.size());
+    ukm_recorder.ExpectEntryMetric(
+        entries.front(), ukm::builders::AdFrameLoad::kStatus_CrossOriginName,
+        static_cast<int64_t>(FrameData::OriginStatus::kCross));
   }
 
   // Add a non-ad subframe and an ad subframe and make sure the total count
   // only adjusts by one.
   {
     base::HistogramTester histograms;
+    ukm::TestAutoSetUkmRecorder ukm_recorder;
     RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
     ResourceDataUpdate(main_frame, ResourceCached::NOT_CACHED, 10);
     ResourceDataUpdate(CreateAndNavigateSubFrame(kAdUrl, main_frame),
@@ -488,6 +577,12 @@
     NavigateFrame(kAdUrl, main_frame);
     histograms.ExpectUniqueSample(kCrossOriginHistogramId,
                                   FrameData::OriginStatus::kCross, 1);
+    auto entries =
+        ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+    EXPECT_EQ(1u, entries.size());
+    ukm_recorder.ExpectEntryMetric(
+        entries.front(), ukm::builders::AdFrameLoad::kStatus_CrossOriginName,
+        static_cast<int64_t>(FrameData::OriginStatus::kCross));
   }
 
   // Add an ad subframe in the same origin as the parent frame and make sure it
@@ -495,6 +590,7 @@
   // considered to be ads.
   {
     base::HistogramTester histograms;
+    ukm::TestAutoSetUkmRecorder ukm_recorder;
     RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrlSameOrigin);
     ResourceDataUpdate(main_frame, ResourceCached::NOT_CACHED, 10);
     ResourceDataUpdate(CreateAndNavigateSubFrame(kAdUrl, main_frame),
@@ -503,6 +599,12 @@
     NavigateFrame(kAdUrl, main_frame);
     histograms.ExpectUniqueSample(kCrossOriginHistogramId,
                                   FrameData::OriginStatus::kSame, 1);
+    auto entries =
+        ukm_recorder.GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName);
+    EXPECT_EQ(1u, entries.size());
+    ukm_recorder.ExpectEntryMetric(
+        entries.front(), ukm::builders::AdFrameLoad::kStatus_CrossOriginName,
+        static_cast<int64_t>(FrameData::OriginStatus::kSame));
   }
 }
 
@@ -522,8 +624,8 @@
   // Navigate again to trigger histograms.
   NavigateFrame(kNonAdUrl, main_frame);
 
-  TestHistograms(histogram_tester(), {{0, 20}}, 0 /* non_ad_cached_kb */,
-                 10 /* non_ad_uncached_kb */);
+  TestHistograms(histogram_tester(), test_ukm_recorder(), {{0, 20}},
+                 0 /* non_ad_cached_kb */, 10 /* non_ad_uncached_kb */);
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest, PageWithNonAdFrameThatRenavigatesToAd) {
@@ -552,7 +654,7 @@
   // Navigate again to trigger histograms.
   NavigateFrame(kNonAdUrl, main_frame);
 
-  TestHistograms(histogram_tester(), {{0, 10}, {0, 10}},
+  TestHistograms(histogram_tester(), test_ukm_recorder(), {{0, 10}, {0, 10}},
                  0 /* non_ad_cached_kb */, 20 /* non_ad_uncached_kb */);
 }
 
@@ -580,8 +682,8 @@
   // Navigate again to trigger histograms.
   NavigateFrame(kNonAdUrl, main_frame);
 
-  TestHistograms(histogram_tester(), {{0, 20}}, 0 /* non_ad_cached_kb */,
-                 10 /* non_ad_uncached_kb */);
+  TestHistograms(histogram_tester(), test_ukm_recorder(), {{0, 20}},
+                 0 /* non_ad_cached_kb */, 10 /* non_ad_uncached_kb */);
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest, CountAbortedSecondNavigationForFrame) {
@@ -609,8 +711,8 @@
   // Navigate again to trigger histograms.
   NavigateFrame(kNonAdUrl, main_frame);
 
-  TestHistograms(histogram_tester(), {{0, 20}}, 0 /* non_ad_cached_kb */,
-                 20 /* non_ad_uncached_kb */);
+  TestHistograms(histogram_tester(), test_ukm_recorder(), {{0, 20}},
+                 0 /* non_ad_cached_kb */, 20 /* non_ad_uncached_kb */);
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest, TwoResourceLoadsBeforeCommit) {
@@ -639,8 +741,8 @@
   // Navigate again to trigger histograms.
   NavigateFrame(kNonAdUrl, main_frame);
 
-  TestHistograms(histogram_tester(), {{0, 20}}, 0 /* non_ad_cached_kb */,
-                 10 /* non_ad_uncached_kb */);
+  TestHistograms(histogram_tester(), test_ukm_recorder(), {{0, 20}},
+                 0 /* non_ad_cached_kb */, 10 /* non_ad_uncached_kb */);
 }
 
 // This tests an issue that is believed to be the cause of
@@ -706,6 +808,9 @@
   EXPECT_EQ(3u, histogram_tester()
                     .GetTotalCountsForPrefix("PageLoad.Clients.Ads.")
                     .size());
+  EXPECT_EQ(0u, test_ukm_recorder()
+                    .GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName)
+                    .size());
 }
 
 // Make sure that ads histograms aren't recorded if the tracker never commits
@@ -731,6 +836,9 @@
   EXPECT_EQ(0u, histogram_tester()
                     .GetTotalCountsForPrefix("PageLoad.Clients.Ads.")
                     .size());
+  EXPECT_EQ(0u, test_ukm_recorder()
+                    .GetEntriesByName(ukm::builders::AdFrameLoad::kEntryName)
+                    .size());
 }
 
 // Frames that are disallowed (and filtered) by the subresource filter should
@@ -755,8 +863,9 @@
             simulator->GetLastThrottleCheckResult());
 
   NavigateMainFrame(kNonAdUrl);
-  TestHistograms(histogram_tester(), std::vector<ExpectedFrameBytes>(),
-                 0u /* non_ad_cached_kb */, 0u /* non_ad_uncached_kb */);
+  TestHistograms(histogram_tester(), test_ukm_recorder(),
+                 std::vector<ExpectedFrameBytes>(), 0u /* non_ad_cached_kb */,
+                 0u /* non_ad_uncached_kb */);
 }
 
 // Tests that main frame ad bytes are recorded correctly.
@@ -818,29 +927,29 @@
   OnCpuTimingUpdate(main_rfh(), base::TimeDelta::FromMilliseconds(500));
   NavigateMainFrame(kNonAdUrl);
 
-  auto entries =
-      ukm_recorder.GetEntriesByName(ukm::builders::AdPageLoad::kEntryName);
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdPageLoad::kEntryName);
   EXPECT_EQ(1u, entries.size());
 
-  EXPECT_EQ(*ukm_recorder.GetEntryMetric(
+  EXPECT_EQ(*test_ukm_recorder().GetEntryMetric(
                 entries.front(), ukm::builders::AdPageLoad::kTotalBytesName),
             30);
-  EXPECT_EQ(*ukm_recorder.GetEntryMetric(
+  EXPECT_EQ(*test_ukm_recorder().GetEntryMetric(
                 entries.front(), ukm::builders::AdPageLoad::kAdBytesName),
             20);
   EXPECT_EQ(
-      *ukm_recorder.GetEntryMetric(
+      *test_ukm_recorder().GetEntryMetric(
           entries.front(), ukm::builders::AdPageLoad::kAdJavascriptBytesName),
       10);
-  EXPECT_EQ(*ukm_recorder.GetEntryMetric(
+  EXPECT_EQ(*test_ukm_recorder().GetEntryMetric(
                 entries.front(), ukm::builders::AdPageLoad::kAdVideoBytesName),
             10);
   EXPECT_GT(
-      *ukm_recorder.GetEntryMetric(
+      *test_ukm_recorder().GetEntryMetric(
           entries.front(), ukm::builders::AdPageLoad::kAdBytesPerSecondName),
       0);
   EXPECT_GT(
-      *ukm_recorder.GetEntryMetric(
+      *test_ukm_recorder().GetEntryMetric(
           entries.front(),
           ukm::builders::AdPageLoad::kAdBytesPerSecondAfterInteractiveName),
       0);
@@ -885,6 +994,17 @@
   CheckCpuHistograms("Cpu.AdFrames.PerFrame", "Unactivated", /*pre_tasks=*/500,
                      /*pre_time=*/2000, /*post_tasks=*/1000,
                      /*post_time=*/2000);
+
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_TotalName, 1500);
+  EXPECT_FALSE(test_ukm_recorder().EntryHasMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_PreActivationName));
+  EXPECT_FALSE(test_ukm_recorder().EntryHasMetric(
+      entries.front(),
+      ukm::builders::AdFrameLoad::kTiming_PreActivationForegroundDurationName));
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest,
@@ -928,6 +1048,17 @@
   CheckCpuHistograms("Cpu.AdFrames.PerFrame", "Unactivated", /*pre_tasks=*/500,
                      /*pre_time=*/2000, /*post_tasks=*/1000,
                      /*post_time=*/1500);
+
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_TotalName, 1500);
+  EXPECT_FALSE(test_ukm_recorder().EntryHasMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_PreActivationName));
+  EXPECT_FALSE(test_ukm_recorder().EntryHasMetric(
+      entries.front(),
+      ukm::builders::AdFrameLoad::kTiming_PreActivationForegroundDurationName));
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest, TestCpuTimingMetricsOnActivation) {
@@ -974,6 +1105,19 @@
                      /*pre_tasks=*/500 + 500, /*pre_time=*/2500,
                      /*post_tasks=*/500,
                      /*post_time=*/1500);
+
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_TotalName, 1500);
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_PreActivationName,
+      1000);
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(),
+      ukm::builders::AdFrameLoad::kTiming_PreActivationForegroundDurationName,
+      2500);
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest, TestNoReportingWhenAlwaysBackgrounded) {
@@ -1011,6 +1155,17 @@
   CheckCpuHistograms("Cpu.FullPage", "", 0, 0, 0, 0);
   CheckCpuHistograms("Cpu.AdFrames.PerFrame", "Unactivated", 0, 0, 0, 0);
   CheckCpuHistograms("Cpu.AdFrames.PerFrame", "Activated", 0, 0, 0, 0);
+
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_TotalName, 0);
+  EXPECT_FALSE(test_ukm_recorder().EntryHasMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_PreActivationName));
+  EXPECT_FALSE(test_ukm_recorder().EntryHasMetric(
+      entries.front(),
+      ukm::builders::AdFrameLoad::kTiming_PreActivationForegroundDurationName));
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest, TestCpuTimingMetricsNoInteractive) {
@@ -1037,6 +1192,12 @@
   CheckCpuHistograms("Cpu.AdFrames.PerFrame", "Activated", 0, 0, 0, 0);
   CheckCpuHistograms("Cpu.AdFrames.PerFrame", "Unactivated", /*pre_tasks=*/500,
                      /*pre_time=*/2000, /*post_tasks=*/0, /*post_time=*/0);
+
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_TotalName, 500);
 }
 
 TEST_F(AdsPageLoadMetricsObserverTest, TestCpuTimingMetricsShortTimeframes) {
@@ -1070,4 +1231,49 @@
   CheckCpuHistograms("Cpu.FullPage", "", 0, 0, 0, 0);
   CheckCpuHistograms("Cpu.AdFrames.PerFrame", "Activated", 0, 0, 0, 0);
   CheckCpuHistograms("Cpu.AdFrames.PerFrame", "Unactivated", 0, 0, 0, 0);
+
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kCpuTime_TotalName, 1500);
+}
+
+TEST_F(AdsPageLoadMetricsObserverTest, AdFrameLoadTiming) {
+  RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
+  RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
+
+  // Load bytes in frame to record ukm event.
+  ResourceDataUpdate(ad_frame, ResourceCached::NOT_CACHED, 10);
+
+  page_load_metrics::mojom::PageLoadTiming subframe_timing;
+  page_load_metrics::InitPageLoadTimingForTest(&subframe_timing);
+  subframe_timing.navigation_start = base::Time::FromDoubleT(2);
+  subframe_timing.paint_timing->first_contentful_paint =
+      base::TimeDelta::FromMilliseconds(0);
+  subframe_timing.interactive_timing->interactive =
+      base::TimeDelta::FromMilliseconds(0);
+  PopulateRequiredTimingFields(&subframe_timing);
+  tester()->SimulateTimingUpdate(subframe_timing, ad_frame);
+
+  // Send an updated timing that should be recorded.
+  page_load_metrics::InitPageLoadTimingForTest(&subframe_timing);
+  subframe_timing.navigation_start = base::Time::FromDoubleT(2);
+  subframe_timing.paint_timing->first_contentful_paint =
+      base::TimeDelta::FromMilliseconds(5);
+  subframe_timing.interactive_timing->interactive =
+      base::TimeDelta::FromMilliseconds(20);
+  PopulateRequiredTimingFields(&subframe_timing);
+  tester()->SimulateTimingUpdate(subframe_timing, ad_frame);
+
+  // Navigate again to trigger histograms.
+  NavigateFrame(kNonAdUrl, main_frame);
+  auto entries = test_ukm_recorder().GetEntriesByName(
+      ukm::builders::AdFrameLoad::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(),
+      ukm::builders::AdFrameLoad::kTiming_FirstContentfulPaintName, 5);
+  test_ukm_recorder().ExpectEntryMetric(
+      entries.front(), ukm::builders::AdFrameLoad::kTiming_InteractiveName, 20);
 }
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/frame_data.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/frame_data.cc
index e79d71e..b54548b 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/frame_data.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/frame_data.cc
@@ -12,6 +12,9 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "net/base/mime_util.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
 #include "third_party/blink/public/common/mime_util/mime_util.h"
 #include "url/gurl.h"
 
@@ -82,16 +85,24 @@
   origin_ = frame_navigated
                 ? render_frame_host->GetLastCommittedOrigin()
                 : render_frame_host->GetParent()->GetLastCommittedOrigin();
+
+  root_frame_depth_ = render_frame_host->GetFrameDepth();
 }
 
 void FrameData::ProcessResourceLoadInFrame(
-    const page_load_metrics::mojom::ResourceDataUpdatePtr& resource) {
+    const page_load_metrics::mojom::ResourceDataUpdatePtr& resource,
+    int process_id,
+    const page_load_metrics::ResourceTracker& resource_tracker) {
   bool is_same_origin = origin_.IsSameOriginWith(resource->origin);
   bytes_ += resource->delta_bytes;
   network_bytes_ += resource->delta_bytes;
   if (is_same_origin)
     same_origin_bytes_ += resource->delta_bytes;
 
+  content::GlobalRequestID global_id(process_id, resource->request_id);
+  if (!resource_tracker.HasPreviousUpdateForResource(global_id))
+    num_resources_++;
+
   // Report cached resource body bytes to overall frame bytes.
   if (resource->is_complete && resource->was_fetched_via_cache) {
     bytes_ += resource->encoded_body_length;
@@ -174,3 +185,68 @@
           ? FrameVisibility::kVisible
           : FrameVisibility::kNonVisible;
 }
+
+void FrameData::MaybeUpdateFrameDepth(
+    content::RenderFrameHost* render_frame_host) {
+  if (!render_frame_host)
+    return;
+  DCHECK_GE(render_frame_host->GetFrameDepth(), root_frame_depth_);
+  if (render_frame_host->GetFrameDepth() - root_frame_depth_ > frame_depth_)
+    frame_depth_ = render_frame_host->GetFrameDepth() - root_frame_depth_;
+}
+
+void FrameData::RecordAdFrameLoadUkmEvent(ukm::SourceId source_id) const {
+  // Only record events for frames that have non-zero bytes.
+  if (bytes() == 0)
+    return;
+  auto* ukm_recorder = ukm::UkmRecorder::Get();
+  ukm::builders::AdFrameLoad builder(source_id);
+  builder
+      .SetLoading_NetworkBytes(
+          ukm::GetExponentialBucketMinForBytes(network_bytes()))
+      .SetLoading_CacheBytes(
+          ukm::GetExponentialBucketMinForBytes((bytes() - network_bytes())))
+      .SetLoading_VideoBytes(ukm::GetExponentialBucketMinForBytes(
+          GetAdNetworkBytesForMime(ResourceMimeType::kVideo)))
+      .SetLoading_JavascriptBytes(ukm::GetExponentialBucketMinForBytes(
+          GetAdNetworkBytesForMime(ResourceMimeType::kJavascript)))
+      .SetLoading_ImageBytes(ukm::GetExponentialBucketMinForBytes(
+          GetAdNetworkBytesForMime(ResourceMimeType::kImage)))
+      .SetLoading_NumResources(num_resources_);
+
+  builder.SetCpuTime_Total(GetTotalCpuUsage().InMilliseconds());
+  if (user_activation_status() == UserActivationStatus::kReceivedActivation) {
+    builder.SetCpuTime_PreActivation(
+        GetActivationCpuUsage(UserActivationStatus::kNoActivation)
+            .InMilliseconds());
+    builder.SetTiming_PreActivationForegroundDuration(
+        pre_activation_foreground_duration().InMilliseconds());
+  }
+
+  builder
+      .SetVisibility_FrameWidth(
+          ukm::GetExponentialBucketMinForCounts1000(frame_size().width()))
+      .SetVisibility_FrameHeight(
+          ukm::GetExponentialBucketMinForCounts1000(frame_size().height()))
+      .SetVisibility_Hidden(is_display_none_);
+
+  builder.SetStatus_CrossOrigin(static_cast<int>(origin_status()))
+      .SetStatus_Media(static_cast<int>(media_status()))
+      .SetStatus_UserActivation(static_cast<int>(user_activation_status()));
+
+  builder.SetFrameDepth(frame_depth_);
+
+  if (timing_) {
+    if (!timing_->paint_timing.is_null() &&
+        timing_->paint_timing->first_contentful_paint) {
+      builder.SetTiming_FirstContentfulPaint(
+          timing_->paint_timing->first_contentful_paint->InMilliseconds());
+    }
+    if (!timing_->interactive_timing.is_null() &&
+        timing_->interactive_timing->interactive) {
+      builder.SetTiming_Interactive(
+          timing_->interactive_timing->interactive->InMilliseconds());
+    }
+  }
+  builder.Record(ukm_recorder->Get());
+}
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/frame_data.h b/chrome/browser/page_load_metrics/observers/ad_metrics/frame_data.h
index fb110f4..69272ede 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/frame_data.h
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/frame_data.h
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
 #include "chrome/common/page_load_metrics/page_load_metrics.mojom.h"
+#include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/gfx/geometry/size.h"
 #include "url/origin.h"
 
@@ -100,7 +101,9 @@
 
   // Updates the number of bytes loaded in the frame given a resource load.
   void ProcessResourceLoadInFrame(
-      const page_load_metrics::mojom::ResourceDataUpdatePtr& resource);
+      const page_load_metrics::mojom::ResourceDataUpdatePtr& resource,
+      int process_id,
+      const page_load_metrics::ResourceTracker& resource_tracker);
 
   // Adds additional bytes to the ad resource byte counts. This
   // is used to notify the frame that some bytes were tagged as ad bytes after
@@ -134,6 +137,14 @@
     return pre_activation_foreground_duration_;
   }
 
+  // Updates the max frame depth of this frames tree given the newly seen child
+  // frame.
+  void MaybeUpdateFrameDepth(content::RenderFrameHost* render_frame_host);
+
+  // Construct and record an AdFrameLoad UKM event for this frame. Only records
+  // events for frames that have non-zero bytes.
+  void RecordAdFrameLoadUkmEvent(ukm::SourceId source_id) const;
+
   FrameTreeNodeId frame_tree_node_id() const { return frame_tree_node_id_; }
 
   OriginStatus origin_status() const { return origin_status_; }
@@ -170,10 +181,20 @@
     media_status_ = media_status;
   }
 
+  void set_timing(page_load_metrics::mojom::PageLoadTimingPtr timing) {
+    timing_ = std::move(timing);
+  }
+
  private:
   // Updates whether or not this frame meets the criteria for visibility.
   void UpdateFrameVisibility();
 
+  // The most recently updated timing received for this frame.
+  page_load_metrics::mojom::PageLoadTimingPtr timing_;
+
+  // Number of resources loaded by the frame (both complete and incomplete).
+  int num_resources_;
+
   // Total bytes used to load resources in the frame, including headers.
   size_t bytes_;
   size_t network_bytes_;
@@ -195,6 +216,12 @@
   // Duration of time the page spent in the foreground before activation.
   base::TimeDelta pre_activation_foreground_duration_;
 
+  // The depth of this FrameData's root frame.
+  unsigned int root_frame_depth_ = 0;
+
+  // The max depth of this frames frame tree.
+  unsigned int frame_depth_ = 0;
+
   // Tracks the number of bytes that were used to load resources which were
   // detected to be ads inside of this frame. For ad frames, these counts should
   // match |frame_bytes| and |frame_network_bytes|.
diff --git a/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc
index 4e95d52..55bf1aee 100644
--- a/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc
@@ -147,7 +147,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataSaverSiteBreakdownMetricsObserverBrowserTest,
-                       LazyImagesDataSavings) {
+                       DISABLED_LazyImagesDataSavings) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   GURL test_url(
@@ -226,7 +226,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DataSaverSiteBreakdownMetricsObserverBrowserTest,
-                       LoFiTest) {
+                       DISABLED_LoFiTest) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {previews::features::kPreviews,
diff --git a/chrome/browser/payments/ssl_validity_checker.cc b/chrome/browser/payments/ssl_validity_checker.cc
index aa6ad8e2..cba2dac1 100644
--- a/chrome/browser/payments/ssl_validity_checker.cc
+++ b/chrome/browser/payments/ssl_validity_checker.cc
@@ -4,8 +4,10 @@
 
 #include "chrome/browser/payments/ssl_validity_checker.h"
 
+#include "base/command_line.h"
 #include "base/logging.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
+#include "components/network_session_configurator/common/network_switches.h"
 #include "components/security_state/core/security_state.h"
 
 namespace payments {
@@ -21,7 +23,10 @@
   security_state::SecurityLevel security_level = helper->GetSecurityLevel();
   return security_level == security_state::EV_SECURE ||
          security_level == security_state::SECURE ||
-         security_level == security_state::SECURE_WITH_POLICY_INSTALLED_CERT;
+         security_level == security_state::SECURE_WITH_POLICY_INSTALLED_CERT ||
+         // No early return, so the other code is exercised in tests, too.
+         base::CommandLine::ForCurrentProcess()->HasSwitch(
+             switches::kIgnoreCertificateErrors);
 }
 
 }  // namespace payments
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.cc b/chrome/browser/performance_manager/graph/frame_node_impl.cc
index ccb24a3..e61efe2 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.cc
@@ -7,11 +7,13 @@
 #include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/observers/graph_observer.h"
 #include "chrome/browser/performance_manager/performance_manager_clock.h"
 
 namespace performance_manager {
 
+FrameNodeImplObserver::FrameNodeImplObserver() = default;
+FrameNodeImplObserver::~FrameNodeImplObserver() = default;
+
 FrameNodeImpl::FrameNodeImpl(GraphImpl* graph,
                              ProcessNodeImpl* process_node,
                              PageNodeImpl* page_node,
@@ -138,7 +140,7 @@
 
 const GURL& FrameNodeImpl::url() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return document_.url;
+  return document_.url.value();
 }
 
 bool FrameNodeImpl::is_current() const {
@@ -190,7 +192,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (same_document) {
-    document_.url = url;
+    document_.url.SetAndMaybeNotify(this, url);
     return;
   }
 
@@ -343,10 +345,13 @@
 
 void FrameNodeImpl::DocumentProperties::Reset(FrameNodeImpl* frame_node,
                                               const GURL& url_in) {
-  url = url_in;
+  url.SetAndMaybeNotify(frame_node, url_in);
   has_nonempty_beforeunload = false;
   // Network is busy on navigation.
   network_almost_idle.SetAndMaybeNotify(frame_node, false);
 }
 
+FrameNodeImpl::ObserverDefaultImpl::ObserverDefaultImpl() = default;
+FrameNodeImpl::ObserverDefaultImpl::~ObserverDefaultImpl() = default;
+
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.h b/chrome/browser/performance_manager/graph/frame_node_impl.h
index 88dc109a..ed432b39 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.h
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.h
@@ -11,15 +11,46 @@
 #include "base/macros.h"
 #include "base/unguessable_token.h"
 #include "chrome/browser/performance_manager/graph/node_base.h"
-#include "chrome/browser/performance_manager/observers/graph_observer.h"
 #include "chrome/browser/performance_manager/public/graph/frame_node.h"
 #include "url/gurl.h"
 
 namespace performance_manager {
 
+class FrameNodeImpl;
 class PageNodeImpl;
 class ProcessNodeImpl;
 
+// Observer interface for FrameNodeImpl objects. This must be declared first as
+// the type is referenced by members of FrameNodeImpl.
+class FrameNodeImplObserver {
+ public:
+  FrameNodeImplObserver();
+  virtual ~FrameNodeImplObserver();
+
+  // Notifications of property changes.
+
+  // Invoked when the |is_current| property changes.
+  virtual void OnIsCurrentChanged(FrameNodeImpl* frame_node) = 0;
+
+  // Invoked when the |network_almost_idle| property changes.
+  virtual void OnNetworkAlmostIdleChanged(FrameNodeImpl* frame_node) = 0;
+
+  // Invoked when the |lifecycle_state| property changes.
+  virtual void OnLifecycleStateChanged(FrameNodeImpl* frame_node) = 0;
+
+  // Invoked when the |url| property changes.
+  virtual void OnURLChanged(FrameNodeImpl* frame_node) = 0;
+
+  // Events with no property changes.
+
+  // Invoked when a non-persistent notification has been issued by the frame.
+  virtual void OnNonPersistentNotificationCreated(
+      FrameNodeImpl* frame_node) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FrameNodeImplObserver);
+};
+
 // Frame nodes form a tree structure, each FrameNode at most has one parent that
 // is a FrameNode. Conceptually, a frame corresponds to a
 // content::RenderFrameHost in the browser, and a content::RenderFrameImpl /
@@ -44,9 +75,14 @@
 // active frame.
 class FrameNodeImpl
     : public PublicNodeImpl<FrameNodeImpl, FrameNode>,
-      public TypedNodeBase<FrameNodeImpl>,
+      public TypedNodeBase<FrameNodeImpl, FrameNodeImplObserver>,
       public resource_coordinator::mojom::DocumentCoordinationUnit {
  public:
+  // A do-nothing implementation of the observer. Derive from this if you want
+  // to selectively override a few methods and not have to worry about
+  // continuously updating your implementation as new methods are added.
+  class ObserverDefaultImpl;
+
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kFrame; }
 
   // Construct a frame node associated with a |process_node|, a |page_node| and
@@ -120,13 +156,13 @@
 
     void Reset(FrameNodeImpl* frame_node, const GURL& url_in);
 
-    GURL url;
+    ObservedProperty::NotifiesOnlyOnChanges<GURL, &Observer::OnURLChanged> url;
     bool has_nonempty_beforeunload = false;
 
     // Network is considered almost idle when there are no more than 2 network
     // connections.
     ObservedProperty::
-        NotifiesOnlyOnChanges<bool, &GraphObserver::OnNetworkAlmostIdleChanged>
+        NotifiesOnlyOnChanges<bool, &Observer::OnNetworkAlmostIdleChanged>
             network_almost_idle{false};
   };
 
@@ -159,14 +195,13 @@
   // Does *not* change when a navigation is committed.
   ObservedProperty::NotifiesOnlyOnChanges<
       resource_coordinator::mojom::LifecycleState,
-      &GraphObserver::OnLifecycleStateChanged>
+      &Observer::OnLifecycleStateChanged>
       lifecycle_state_{resource_coordinator::mojom::LifecycleState::kRunning};
 
   // This is a one way switch. Once marked an ad-frame, always an ad-frame.
   bool is_ad_frame_ = false;
 
-  ObservedProperty::NotifiesOnlyOnChanges<bool,
-                                          &GraphObserver::OnIsCurrentChanged>
+  ObservedProperty::NotifiesOnlyOnChanges<bool, &Observer::OnIsCurrentChanged>
       is_current_{false};
 
   // Intervention policy for this frame. These are communicated from the
@@ -190,6 +225,23 @@
   DISALLOW_COPY_AND_ASSIGN(FrameNodeImpl);
 };
 
+// A do-nothing default implementation of a FrameNodeImpl::Observer.
+class FrameNodeImpl::ObserverDefaultImpl : public FrameNodeImpl::Observer {
+ public:
+  ObserverDefaultImpl();
+  ~ObserverDefaultImpl() override;
+
+  // FrameNodeImplObserver implementation:
+  void OnIsCurrentChanged(FrameNodeImpl* frame_node) override {}
+  void OnNetworkAlmostIdleChanged(FrameNodeImpl* frame_node) override {}
+  void OnLifecycleStateChanged(FrameNodeImpl* frame_node) override {}
+  void OnNonPersistentNotificationCreated(FrameNodeImpl* frame_node) override {}
+  void OnURLChanged(FrameNodeImpl* frame_node) override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ObserverDefaultImpl);
+};
+
 }  // namespace performance_manager
 
 #endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_FRAME_NODE_IMPL_H_
diff --git a/chrome/browser/performance_manager/graph/graph_impl.cc b/chrome/browser/performance_manager/graph/graph_impl.cc
index 7065250..0dd47274 100644
--- a/chrome/browser/performance_manager/graph/graph_impl.cc
+++ b/chrome/browser/performance_manager/graph/graph_impl.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/containers/flat_set.h"
 #include "base/macros.h"
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/node_base.h"
@@ -45,7 +46,7 @@
 
 void GraphImpl::RegisterObserver(GraphObserver* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  observer->SetNodeGraph(this);
+  observer->SetGraph(this);
   observers_.push_back(observer);
   observer->OnRegistered();
 }
@@ -58,6 +59,7 @@
       observers_.erase(it);
       removed = true;
       observer->OnUnregistered();
+      observer->SetGraph(nullptr);
       break;
     }
   }
@@ -68,7 +70,24 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   for (auto* observer : observers_) {
     if (observer->ShouldObserve(node)) {
-      node->AddObserver(observer);
+      // TODO(chrisha): Remove this logic once all observers have been migrated.
+      switch (node->type()) {
+        case NodeTypeEnum::kFrame: {
+          FrameNodeImpl::FromNodeBase(node)->AddObserver(observer);
+        } break;
+        case NodeTypeEnum::kPage: {
+          PageNodeImpl::FromNodeBase(node)->AddObserver(observer);
+        } break;
+        case NodeTypeEnum::kProcess: {
+          ProcessNodeImpl::FromNodeBase(node)->AddObserver(observer);
+        } break;
+        case NodeTypeEnum::kSystem: {
+          SystemNodeImpl::FromNodeBase(node)->AddObserver(observer);
+        } break;
+        case NodeTypeEnum::kInvalidType: {
+          NOTREACHED();
+        } break;
+      }
       observer->OnNodeAdded(node);
     }
   }
@@ -76,9 +95,49 @@
 
 void GraphImpl::OnBeforeNodeRemoved(NodeBase* node) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // TODO(chrisha): Kill this logic once observer implementations use distinct
+  // interfaces.
+  switch (node->type()) {
+    case NodeTypeEnum::kFrame: {
+      OnBeforeNodeRemovedImpl(FrameNodeImpl::FromNodeBase(node));
+    } break;
+    case NodeTypeEnum::kPage: {
+      OnBeforeNodeRemovedImpl(PageNodeImpl::FromNodeBase(node));
+    } break;
+    case NodeTypeEnum::kProcess: {
+      OnBeforeNodeRemovedImpl(ProcessNodeImpl::FromNodeBase(node));
+    } break;
+    case NodeTypeEnum::kSystem: {
+      OnBeforeNodeRemovedImpl(SystemNodeImpl::FromNodeBase(node));
+    } break;
+    case NodeTypeEnum::kInvalidType: {
+      NOTREACHED();
+    } break;
+  }
+
+  // Leave the graph only after the OnBeforeNodeRemoved notification so that the
+  // node still observes the graph invariant during that callback.
   node->LeaveGraph();
 }
 
+template <typename NodeType>
+void GraphImpl::OnBeforeNodeRemovedImpl(NodeType* node) {
+  // The current observer logic ensures that OnBeforeNodeRemoved is only fired
+  // for nodes that had an observer added via ShouldObserve. This logic will
+  // be disappearing entirely, but emulate it for correctness right now.
+
+  base::flat_set<typename NodeType::Observer*> node_observers;
+  for (auto& observer : node->observers())
+    node_observers.insert(&observer);
+
+  for (auto* observer : observers_) {
+    typename NodeType::Observer* node_observer = observer;
+    if (base::ContainsKey(node_observers, node_observer))
+      observer->OnBeforeNodeRemoved(node);
+  }
+}
+
 int64_t GraphImpl::GetNextNodeSerializationId() {
   return ++current_node_serialization_id_;
 }
@@ -195,4 +254,14 @@
   return ret;
 }
 
+GraphImpl::Observer::Observer() = default;
+GraphImpl::Observer::~Observer() = default;
+
+GraphImpl::ObserverDefaultImpl::ObserverDefaultImpl() = default;
+GraphImpl::ObserverDefaultImpl::~ObserverDefaultImpl() = default;
+
+void GraphImpl::ObserverDefaultImpl::SetGraph(GraphImpl* graph) {
+  graph_ = graph;
+}
+
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/graph_impl.h b/chrome/browser/performance_manager/graph/graph_impl.h
index 9a83d7b9..0cb8c344 100644
--- a/chrome/browser/performance_manager/graph/graph_impl.h
+++ b/chrome/browser/performance_manager/graph/graph_impl.h
@@ -35,6 +35,16 @@
 // a list of observers that are notified of node addition and removal.
 class GraphImpl : public Graph {
  public:
+  // Pure virtual observer interface. Derive from this if you want to manually
+  // implement the whole interface, and have the compiler enforce that as new
+  // methods are added.
+  class Observer;
+
+  // A do-nothing implementation of the observer. Derive from this if you want
+  // to selectively override a few methods and not have to worry about
+  // continuously updating your implementation as new methods are added.
+  class ObserverDefaultImpl;
+
   using NodeSet = std::unordered_set<NodeBase*>;
 
   GraphImpl();
@@ -83,6 +93,11 @@
   void OnNodeAdded(NodeBase* node);
   void OnBeforeNodeRemoved(NodeBase* node);
 
+  // Templated helper functions for removed nodes.
+  // TODO(chrisha): Kill this off after the observer migration.
+  template <typename NodeType>
+  void OnBeforeNodeRemovedImpl(NodeType* node);
+
   // Returns a new serialization ID.
   friend class NodeBase;
   int64_t GetNextNodeSerializationId();
@@ -115,6 +130,54 @@
   DISALLOW_COPY_AND_ASSIGN(GraphImpl);
 };
 
+// Observer interface for GraphImpl objects.
+class GraphImpl::Observer {
+ public:
+  Observer();
+  virtual ~Observer();
+
+  // Invoked when an observer is added to or removed from the graph. This is a
+  // convenient place for observers to initialize any necessary state, validate
+  // graph invariants, etc.
+  virtual void OnRegistered() = 0;
+  virtual void OnUnregistered() = 0;
+
+  // Called whenever a node has been added to the graph.
+  virtual void OnNodeAdded(NodeBase* node) = 0;
+
+  // Called when the |node| is about to be removed from the graph.
+  virtual void OnBeforeNodeRemoved(NodeBase* node) = 0;
+
+  // This will be called with a non-null |graph| when the observer is attached
+  // to a graph, and then again with a null |graph| when the observer is
+  // removed.
+  virtual void SetGraph(GraphImpl* graph) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(Observer);
+};
+
+// A do-nothing default implementation of a GraphImplObserver.
+class GraphImpl::ObserverDefaultImpl : public GraphImpl::Observer {
+ public:
+  ObserverDefaultImpl();
+  ~ObserverDefaultImpl() override;
+
+  // GraphImplObserver implementation:
+  void OnRegistered() override {}
+  void OnUnregistered() override {}
+  void OnNodeAdded(NodeBase* node) override {}
+  void OnBeforeNodeRemoved(NodeBase* node) override {}
+  void SetGraph(GraphImpl* graph) override;
+
+  GraphImpl* graph() const { return graph_; }
+
+ private:
+  GraphImpl* graph_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(ObserverDefaultImpl);
+};
+
 }  // namespace performance_manager
 
 #endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_GRAPH_IMPL_H_
diff --git a/chrome/browser/performance_manager/graph/node_base.cc b/chrome/browser/performance_manager/graph/node_base.cc
index b932506..715b53e 100644
--- a/chrome/browser/performance_manager/graph/node_base.cc
+++ b/chrome/browser/performance_manager/graph/node_base.cc
@@ -6,7 +6,11 @@
 
 #include <utility>
 
+#include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_impl.h"
+#include "chrome/browser/performance_manager/graph/page_node_impl.h"
+#include "chrome/browser/performance_manager/graph/process_node_impl.h"
+#include "chrome/browser/performance_manager/graph/system_node_impl.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
 
 namespace performance_manager {
@@ -33,14 +37,20 @@
   return node->serialization_id_;
 }
 
-void NodeBase::AddObserver(GraphObserver* observer) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  observers_.AddObserver(observer);
-}
-
+// TODO(chrisha): Remove this!
 void NodeBase::RemoveObserver(GraphObserver* observer) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  observers_.RemoveObserver(observer);
+  switch (type()) {
+    case NodeTypeEnum::kFrame:
+      return FrameNodeImpl::FromNodeBase(this)->RemoveObserver(observer);
+    case NodeTypeEnum::kPage:
+      return PageNodeImpl::FromNodeBase(this)->RemoveObserver(observer);
+    case NodeTypeEnum::kProcess:
+      return ProcessNodeImpl::FromNodeBase(this)->RemoveObserver(observer);
+    case NodeTypeEnum::kSystem:
+      return SystemNodeImpl::FromNodeBase(this)->RemoveObserver(observer);
+    case NodeTypeEnum::kInvalidType:
+      NOTREACHED();
+  }
 }
 
 void NodeBase::JoinGraph() {
@@ -50,9 +60,6 @@
 void NodeBase::LeaveGraph() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(graph_->NodeInGraph(this));
-
-  for (auto& observer : observers_)
-    observer.OnBeforeNodeRemoved(this);
 }
 
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/node_base.h b/chrome/browser/performance_manager/graph/node_base.h
index 5682e14..a7af0b0 100644
--- a/chrome/browser/performance_manager/graph/node_base.h
+++ b/chrome/browser/performance_manager/graph/node_base.h
@@ -17,7 +17,6 @@
 #include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/node_type.h"
 #include "chrome/browser/performance_manager/graph/properties.h"
-#include "chrome/browser/performance_manager/observers/graph_observer.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -25,6 +24,9 @@
 
 namespace performance_manager {
 
+// TODO(chrisha): Remove all of these when GraphObserver is killed.
+class GraphObserver;
+
 // NodeBase implements shared functionality among different types of graph
 // nodes. A specific type of graph node will derive from this class and can
 // override shared functionality when needed.
@@ -38,24 +40,22 @@
   NodeBase(NodeTypeEnum type, GraphImpl* graph);
   virtual ~NodeBase();
 
-  void AddObserver(GraphObserver* observer);
-  void RemoveObserver(GraphObserver* observer);
-
   // May be called on any sequence.
   NodeTypeEnum type() const { return type_; }
 
   // May be called on any sequence.
   GraphImpl* graph() const { return graph_; }
 
-  const base::ObserverList<GraphObserver>::Unchecked& observers() const {
-    return observers_;
-  }
-
   // Returns an opaque ID for |node|, unique across all nodes in the same graph,
   // zero for nullptr. This should never be used to look up nodes, only to
   // provide a stable ID for serialization.
   static int64_t GetSerializationId(NodeBase* node);
 
+  // TODO(chrisha): Remove this after observer migration.
+  // Implementations of these are provided in the *_node_impl.cc translation
+  // units for now.
+  void RemoveObserver(GraphObserver* observer);
+
  protected:
   friend class GraphImpl;
 
@@ -75,8 +75,6 @@
   SEQUENCE_CHECKER(sequence_checker_);
 
  private:
-  base::ObserverList<GraphObserver>::Unchecked observers_;
-
   DISALLOW_COPY_AND_ASSIGN(NodeBase);
 };
 
@@ -97,10 +95,14 @@
   }
 };
 
-template <class NodeImplClass>
+template <class NodeImplClass, class NodeImplObserverClass>
 class TypedNodeBase : public NodeBase {
  public:
-  using ObservedProperty = ObservedPropertyImpl<NodeImplClass, GraphObserver>;
+  using Observer = NodeImplObserverClass;
+  using ObserverList =
+      typename base::ObserverList<NodeImplObserverClass>::Unchecked;
+  using ObservedProperty =
+      ObservedPropertyImpl<NodeImplClass, NodeImplObserverClass>;
 
   explicit TypedNodeBase(GraphImpl* graph)
       : NodeBase(NodeImplClass::Type(), graph) {}
@@ -115,7 +117,21 @@
     return static_cast<NodeImplClass*>(node);
   }
 
+  void AddObserver(Observer* observer) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    observers_.AddObserver(observer);
+  }
+
+  void RemoveObserver(Observer* observer) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    observers_.RemoveObserver(observer);
+  }
+
+  const ObserverList& observers() const { return observers_; }
+
  private:
+  ObserverList observers_;
+
   DISALLOW_COPY_AND_ASSIGN(TypedNodeBase);
 };
 
diff --git a/chrome/browser/performance_manager/graph/page_node_impl.cc b/chrome/browser/performance_manager/graph/page_node_impl.cc
index 350b82a..b07c990 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/page_node_impl.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "chrome/browser/performance_manager/observers/graph_observer.h"
 #include "chrome/browser/performance_manager/performance_manager_clock.h"
 
 namespace performance_manager {
@@ -43,6 +42,9 @@
 
 }  // namespace
 
+PageNodeImplObserver::PageNodeImplObserver() = default;
+PageNodeImplObserver::~PageNodeImplObserver() = default;
+
 PageNodeImpl::PageNodeImpl(GraphImpl* graph,
                            const WebContentsProxy& contents_proxy)
     : TypedNodeBase(graph),
@@ -431,4 +433,7 @@
     ForFrameAndDescendents(main_frame_node, map_function);
 }
 
+PageNodeImpl::ObserverDefaultImpl::ObserverDefaultImpl() = default;
+PageNodeImpl::ObserverDefaultImpl::~ObserverDefaultImpl() = default;
+
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/page_node_impl.h b/chrome/browser/performance_manager/graph/page_node_impl.h
index 60b2017..58595d3 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl.h
+++ b/chrome/browser/performance_manager/graph/page_node_impl.h
@@ -13,7 +13,6 @@
 #include "base/time/time.h"
 #include "chrome/browser/performance_manager/graph/node_attached_data.h"
 #include "chrome/browser/performance_manager/graph/node_base.h"
-#include "chrome/browser/performance_manager/observers/graph_observer.h"
 #include "chrome/browser/performance_manager/public/graph/page_node.h"
 #include "chrome/browser/performance_manager/public/web_contents_proxy.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
@@ -22,11 +21,59 @@
 namespace performance_manager {
 
 class FrameNodeImpl;
+class PageNodeImpl;
 class ProcessNodeImpl;
 
-class PageNodeImpl : public PublicNodeImpl<PageNodeImpl, PageNode>,
-                     public TypedNodeBase<PageNodeImpl> {
+// Observer interface for PageNodeImpl objects. This must be declared first as
+// the type is referenced by members of PageNodeImpl.
+class PageNodeImplObserver {
  public:
+  PageNodeImplObserver();
+  virtual ~PageNodeImplObserver();
+
+  // Notifications of property changes.
+
+  // Invoked when the |is_visible| property changes.
+  virtual void OnIsVisibleChanged(PageNodeImpl* page_node) = 0;
+
+  // Invoked when the |is_loading| property changes.
+  virtual void OnIsLoadingChanged(PageNodeImpl* page_node) = 0;
+
+  // Invoked when the |ukm_source_id| property changes.
+  virtual void OnUkmSourceIdChanged(PageNodeImpl* page_node) = 0;
+
+  // Invoked when the |lifecycle_state| property changes.
+  virtual void OnLifecycleStateChanged(PageNodeImpl* page_node) = 0;
+
+  // Invoked when the |page_almost_idle| property changes.
+  virtual void OnPageAlmostIdleChanged(PageNodeImpl* page_node) = 0;
+
+  // This is fired when a main frame navigation commits. It indicates that the
+  // |navigation_id| and |main_frame_url| properties have changed.
+  virtual void OnMainFrameNavigationCommitted(PageNodeImpl* page_node) = 0;
+
+  // Events with no property changes.
+
+  // Fired when the tab title associated with a page changes. This property is
+  // not directly reflected on the node.
+  virtual void OnTitleUpdated(PageNodeImpl* page_node) = 0;
+
+  // Fired when the favicon associated with a page is updated. This property is
+  // not directly reflected on the node.
+  virtual void OnFaviconUpdated(PageNodeImpl* page_node) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PageNodeImplObserver);
+};
+
+class PageNodeImpl : public PublicNodeImpl<PageNodeImpl, PageNode>,
+                     public TypedNodeBase<PageNodeImpl, PageNodeImplObserver> {
+ public:
+  // A do-nothing implementation of the observer. Derive from this if you want
+  // to selectively override a few methods and not have to worry about
+  // continuously updating your implementation as new methods are added.
+  class ObserverDefaultImpl;
+
   using LifecycleState = resource_coordinator::mojom::LifecycleState;
 
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kPage; }
@@ -220,27 +267,24 @@
 
   // Page almost idle state. This is the output that is driven by the
   // PageAlmostIdleDecorator.
-  ObservedProperty::
-      NotifiesOnlyOnChanges<bool, &GraphObserver::OnPageAlmostIdleChanged>
-          page_almost_idle_{false};
-  // Whether or not the page is visible. Driven by browser instrumentation.
   ObservedProperty::NotifiesOnlyOnChanges<bool,
-                                          &GraphObserver::OnIsVisibleChanged>
+                                          &Observer::OnPageAlmostIdleChanged>
+      page_almost_idle_{false};
+  // Whether or not the page is visible. Driven by browser instrumentation.
+  ObservedProperty::NotifiesOnlyOnChanges<bool, &Observer::OnIsVisibleChanged>
       is_visible_{false};
   // The loading state. This is driven by instrumentation in the browser
   // process.
-  ObservedProperty::NotifiesOnlyOnChanges<bool,
-                                          &GraphObserver::OnIsLoadingChanged>
+  ObservedProperty::NotifiesOnlyOnChanges<bool, &Observer::OnIsLoadingChanged>
       is_loading_{false};
   // The UKM source ID associated with the URL of the main frame of this page.
   ObservedProperty::NotifiesOnlyOnChanges<ukm::SourceId,
-                                          &GraphObserver::OnUkmSourceIdChanged>
+                                          &Observer::OnUkmSourceIdChanged>
       ukm_source_id_{ukm::kInvalidSourceId};
   // The lifecycle state of this page. This is aggregated from the lifecycle
   // state of each frame in the frame tree.
-  ObservedProperty::NotifiesOnlyOnChanges<
-      LifecycleState,
-      &GraphObserver::OnLifecycleStateChanged>
+  ObservedProperty::NotifiesOnlyOnChanges<LifecycleState,
+                                          &Observer::OnLifecycleStateChanged>
       lifecycle_state_{LifecycleState::kRunning};
 
   // Storage for PageAlmostIdle user data.
@@ -252,6 +296,26 @@
   DISALLOW_COPY_AND_ASSIGN(PageNodeImpl);
 };
 
+// A do-nothing default implementation of a PageNodeImpl::Observer.
+class PageNodeImpl::ObserverDefaultImpl : public PageNodeImpl::Observer {
+ public:
+  ObserverDefaultImpl();
+  ~ObserverDefaultImpl() override;
+
+  // PageNodeImpl::Observer implementation:
+  void OnIsVisibleChanged(PageNodeImpl* page_node) override {}
+  void OnIsLoadingChanged(PageNodeImpl* page_node) override {}
+  void OnUkmSourceIdChanged(PageNodeImpl* page_node) override {}
+  void OnLifecycleStateChanged(PageNodeImpl* page_node) override {}
+  void OnPageAlmostIdleChanged(PageNodeImpl* page_node) override {}
+  void OnMainFrameNavigationCommitted(PageNodeImpl* page_node) override {}
+  void OnTitleUpdated(PageNodeImpl* page_node) override {}
+  void OnFaviconUpdated(PageNodeImpl* page_node) override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ObserverDefaultImpl);
+};
+
 }  // namespace performance_manager
 
 #endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_PAGE_NODE_IMPL_H_
diff --git a/chrome/browser/performance_manager/graph/process_node_impl.cc b/chrome/browser/performance_manager/graph/process_node_impl.cc
index b85a5099..f515d6f 100644
--- a/chrome/browser/performance_manager/graph/process_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/process_node_impl.cc
@@ -11,6 +11,9 @@
 
 namespace performance_manager {
 
+ProcessNodeImplObserver::ProcessNodeImplObserver() = default;
+ProcessNodeImplObserver::~ProcessNodeImplObserver() = default;
+
 ProcessNodeImpl::ProcessNodeImpl(GraphImpl* graph)
     : TypedNodeBase(graph), binding_(this) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
@@ -141,4 +144,7 @@
   DCHECK(frame_nodes_.empty());
 }
 
+ProcessNodeImpl::ObserverDefaultImpl::ObserverDefaultImpl() = default;
+ProcessNodeImpl::ObserverDefaultImpl::~ObserverDefaultImpl() = default;
+
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/process_node_impl.h b/chrome/browser/performance_manager/graph/process_node_impl.h
index f47beb5..4fd27bc 100644
--- a/chrome/browser/performance_manager/graph/process_node_impl.h
+++ b/chrome/browser/performance_manager/graph/process_node_impl.h
@@ -14,12 +14,37 @@
 #include "chrome/browser/performance_manager/graph/node_attached_data.h"
 #include "chrome/browser/performance_manager/graph/node_base.h"
 #include "chrome/browser/performance_manager/graph/properties.h"
-#include "chrome/browser/performance_manager/observers/graph_observer.h"
 #include "chrome/browser/performance_manager/public/graph/process_node.h"
 
 namespace performance_manager {
 
 class FrameNodeImpl;
+class ProcessNodeImpl;
+
+// Observer interface for ProcessNodeImpl objects. This must be declared first
+// as the type is referenced by members of ProcessNodeImpl.
+class ProcessNodeImplObserver {
+ public:
+  ProcessNodeImplObserver();
+  virtual ~ProcessNodeImplObserver();
+
+  // Notifications of property changes.
+
+  // Invoked when a new |expected_task_queueing_duration| sample is available.
+  virtual void OnExpectedTaskQueueingDurationSample(
+      ProcessNodeImpl* process_node) = 0;
+
+  // Invoked when the |main_thread_task_load_is_low| property changes.
+  virtual void OnMainThreadTaskLoadIsLow(ProcessNodeImpl* process_node) = 0;
+
+  // Events with no property changes.
+
+  // Fired when all frames in a process have transitioned to being frozen.
+  virtual void OnAllFramesInProcessFrozen(ProcessNodeImpl* process_node) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ProcessNodeImplObserver);
+};
 
 // A process node follows the lifetime of a RenderProcessHost.
 // It may reference zero or one processes at a time, but during its lifetime, it
@@ -33,9 +58,14 @@
 // 4. Back to 2.
 class ProcessNodeImpl
     : public PublicNodeImpl<ProcessNodeImpl, ProcessNode>,
-      public TypedNodeBase<ProcessNodeImpl>,
+      public TypedNodeBase<ProcessNodeImpl, ProcessNodeImplObserver>,
       public resource_coordinator::mojom::ProcessCoordinationUnit {
  public:
+  // A do-nothing implementation of the observer. Derive from this if you want
+  // to selectively override a few methods and not have to worry about
+  // continuously updating your implementation as new methods are added.
+  class ObserverDefaultImpl;
+
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kProcess; }
 
   explicit ProcessNodeImpl(GraphImpl* graph);
@@ -118,11 +148,11 @@
 
   ObservedProperty::NotifiesAlways<
       base::TimeDelta,
-      &GraphObserver::OnExpectedTaskQueueingDurationSample>
+      &Observer::OnExpectedTaskQueueingDurationSample>
       expected_task_queueing_duration_;
-  ObservedProperty::
-      NotifiesOnlyOnChanges<bool, &GraphObserver::OnMainThreadTaskLoadIsLow>
-          main_thread_task_load_is_low_{false};
+  ObservedProperty::NotifiesOnlyOnChanges<bool,
+                                          &Observer::OnMainThreadTaskLoadIsLow>
+      main_thread_task_load_is_low_{false};
   double cpu_usage_ = 0;
 
   base::flat_set<FrameNodeImpl*> frame_nodes_;
@@ -133,6 +163,22 @@
   DISALLOW_COPY_AND_ASSIGN(ProcessNodeImpl);
 };
 
+// A do-nothing default implementation of a ProcessNodeImpl::Observer.
+class ProcessNodeImpl::ObserverDefaultImpl : public ProcessNodeImpl::Observer {
+ public:
+  ObserverDefaultImpl();
+  ~ObserverDefaultImpl() override;
+
+  // ProcessNodeImpl::Observer implementation:
+  void OnExpectedTaskQueueingDurationSample(
+      ProcessNodeImpl* process_node) override {}
+  void OnMainThreadTaskLoadIsLow(ProcessNodeImpl* process_node) override {}
+  void OnAllFramesInProcessFrozen(ProcessNodeImpl* process_node) override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ObserverDefaultImpl);
+};
+
 }  // namespace performance_manager
 
 #endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_PROCESS_NODE_IMPL_H_
diff --git a/chrome/browser/performance_manager/graph/properties.h b/chrome/browser/performance_manager/graph/properties.h
index a46d5d9..b2211a55 100644
--- a/chrome/browser/performance_manager/graph/properties.h
+++ b/chrome/browser/performance_manager/graph/properties.h
@@ -5,8 +5,6 @@
 #ifndef CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_PROPERTIES_H_
 #define CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_PROPERTIES_H_
 
-#include "chrome/browser/performance_manager/observers/graph_observer.h"
-
 namespace performance_manager {
 
 // Helper classes for setting properties and invoking observer callbacks based
@@ -37,7 +35,7 @@
         ((observer).*(NotifyFunctionPtr))(node);
     }
 
-    PropertyType value() const { return value_; }
+    const PropertyType& value() const { return value_; }
 
    private:
     PropertyType value_;
@@ -68,7 +66,7 @@
       return true;
     }
 
-    PropertyType value() const { return value_; }
+    const PropertyType& value() const { return value_; }
 
    private:
     PropertyType value_;
diff --git a/chrome/browser/performance_manager/graph/system_node_impl.cc b/chrome/browser/performance_manager/graph/system_node_impl.cc
index e630354..95a3a9a 100644
--- a/chrome/browser/performance_manager/graph/system_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/system_node_impl.cc
@@ -10,7 +10,6 @@
 #include "base/containers/flat_set.h"
 #include "base/macros.h"
 #include "base/process/process_handle.h"
-
 #include "chrome/browser/performance_manager/graph/frame_node_impl.h"
 #include "chrome/browser/performance_manager/graph/graph_impl.h"
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
@@ -18,6 +17,9 @@
 
 namespace performance_manager {
 
+SystemNodeImplObserver::SystemNodeImplObserver() = default;
+SystemNodeImplObserver::~SystemNodeImplObserver() = default;
+
 ProcessResourceMeasurement::ProcessResourceMeasurement() = default;
 ProcessResourceMeasurementBatch::ProcessResourceMeasurementBatch() = default;
 ProcessResourceMeasurementBatch::~ProcessResourceMeasurementBatch() = default;
@@ -156,4 +158,7 @@
     observer.OnProcessCPUUsageReady(this);
 }
 
+SystemNodeImpl::ObserverDefaultImpl::ObserverDefaultImpl() = default;
+SystemNodeImpl::ObserverDefaultImpl::~ObserverDefaultImpl() = default;
+
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/system_node_impl.h b/chrome/browser/performance_manager/graph/system_node_impl.h
index 852dd52..1f7cf43 100644
--- a/chrome/browser/performance_manager/graph/system_node_impl.h
+++ b/chrome/browser/performance_manager/graph/system_node_impl.h
@@ -17,6 +17,24 @@
 
 namespace performance_manager {
 
+// Observer interface for SystemNodeImpl objects. This must be declared first as
+// the type is referenced by members of SystemNodeImpl.
+class SystemNodeImplObserver {
+ public:
+  SystemNodeImplObserver();
+  virtual ~SystemNodeImplObserver();
+
+  // Events with no property changes.
+
+  // Fired when a batch of consistent process CPU measurements is available on
+  // the graph.
+  // TODO(siggi): Deprecate this as the CPU measurement code is reworked.
+  virtual void OnProcessCPUUsageReady(SystemNodeImpl* system_node) = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SystemNodeImplObserver);
+};
+
 // TODO(siggi): In the end game, this should be private implementation detail
 //     of the performance measurement graph decorator. It's here for now because
 //     there's still a thread hop to get the measurement results into the graph.
@@ -46,9 +64,15 @@
   std::vector<ProcessResourceMeasurement> measurements;
 };
 
-class SystemNodeImpl : public PublicNodeImpl<SystemNodeImpl, SystemNode>,
-                       public TypedNodeBase<SystemNodeImpl> {
+class SystemNodeImpl
+    : public PublicNodeImpl<SystemNodeImpl, SystemNode>,
+      public TypedNodeBase<SystemNodeImpl, SystemNodeImplObserver> {
  public:
+  // A do-nothing implementation of the observer. Derive from this if you want
+  // to selectively override a few methods and not have to worry about
+  // continuously updating your implementation as new methods are added.
+  class ObserverDefaultImpl;
+
   static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kSystem; }
 
   explicit SystemNodeImpl(GraphImpl* graph);
@@ -73,6 +97,19 @@
   DISALLOW_COPY_AND_ASSIGN(SystemNodeImpl);
 };
 
+// A do-nothing default implementation of a SystemNodeImpl::Observer.
+class SystemNodeImpl::ObserverDefaultImpl : public SystemNodeImpl::Observer {
+ public:
+  ObserverDefaultImpl();
+  ~ObserverDefaultImpl() override;
+
+  // SystemNodeImpl::Observer implementation:
+  void OnProcessCPUUsageReady(SystemNodeImpl* system_node) override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ObserverDefaultImpl);
+};
+
 }  // namespace performance_manager
 
 #endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_SYSTEM_NODE_IMPL_H_
diff --git a/chrome/browser/performance_manager/observers/graph_observer.cc b/chrome/browser/performance_manager/observers/graph_observer.cc
index a4417a615..ec0bae9 100644
--- a/chrome/browser/performance_manager/observers/graph_observer.cc
+++ b/chrome/browser/performance_manager/observers/graph_observer.cc
@@ -6,14 +6,21 @@
 
 namespace performance_manager {
 
+GraphObserver::GraphObserver() = default;
+
 GraphObserver::~GraphObserver() = default;
 
 GraphObserverDefaultImpl::GraphObserverDefaultImpl() = default;
 
-GraphObserverDefaultImpl::~GraphObserverDefaultImpl() = default;
+GraphObserverDefaultImpl::~GraphObserverDefaultImpl() {
+  // This observer should have left the graph before being destroyed.
+  DCHECK(!graph_);
+}
 
-void GraphObserverDefaultImpl::SetNodeGraph(GraphImpl* graph) {
-  node_graph_ = graph;
+void GraphObserverDefaultImpl::SetGraph(GraphImpl* graph) {
+  // We can only be going from null to non-null, and vice-versa.
+  DCHECK(!graph || !graph_);
+  graph_ = graph;
 }
 
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/observers/graph_observer.h b/chrome/browser/performance_manager/observers/graph_observer.h
index 765fa72..245ccea 100644
--- a/chrome/browser/performance_manager/observers/graph_observer.h
+++ b/chrome/browser/performance_manager/observers/graph_observer.h
@@ -6,17 +6,15 @@
 #define CHROME_BROWSER_PERFORMANCE_MANAGER_OBSERVERS_GRAPH_OBSERVER_H_
 
 #include "base/macros.h"
+#include "chrome/browser/performance_manager/graph/frame_node_impl.h"
+#include "chrome/browser/performance_manager/graph/graph_impl.h"
+#include "chrome/browser/performance_manager/graph/page_node_impl.h"
+#include "chrome/browser/performance_manager/graph/process_node_impl.h"
+#include "chrome/browser/performance_manager/graph/system_node_impl.h"
 #include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
 
 namespace performance_manager {
 
-class FrameNodeImpl;
-class GraphImpl;
-class NodeBase;
-class PageNodeImpl;
-class ProcessNodeImpl;
-class SystemNodeImpl;
-
 // An observer API for the graph.
 //
 // Observers are generally instantiated when the graph is empty, and outlive it,
@@ -29,56 +27,25 @@
 //   (3) Before destruction, unregister by calling on
 //       |graph().UnregisterObserver|.
 //
-// TODO: Clean up the observer API, and create a wrapper version that sees
-// const Node* rather then mutable NodeImpl* types for external consumers.
-class GraphObserver {
+// NOTE: This interface is deprecated. Please use the individual interfaces
+// that this class is implementing.
+class GraphObserver : public GraphImpl::Observer,
+                      public FrameNodeImpl::Observer,
+                      public PageNodeImpl::Observer,
+                      public ProcessNodeImpl::Observer,
+                      public SystemNodeImpl::Observer {
  public:
-  virtual ~GraphObserver() = 0;
-
-  // Invoked when an observer is added to or removed from the graph. This is a
-  // convenient place for observers to initialize any necessary state, validate
-  // graph invariants, etc.
-  virtual void OnRegistered() = 0;
-  virtual void OnUnregistered() = 0;
+  GraphObserver();
+  ~GraphObserver() override;
 
   // Determines whether or not the observer should be registered with, and
   // invoked for, the |node|.
+  // TODO(chrisha): Kill this function entirely and delegate that logic to the
+  // actual observer implementations.
   virtual bool ShouldObserve(const NodeBase* node) = 0;
 
-  // Called whenever a node has been added to the graph.
-  virtual void OnNodeAdded(NodeBase* node) = 0;
-
-  // Called when the |node| is about to be removed from the graph.
-  virtual void OnBeforeNodeRemoved(NodeBase* node) = 0;
-
-  // FrameNodeImpl notifications.
-  virtual void OnIsCurrentChanged(FrameNodeImpl* frame_node) = 0;
-  virtual void OnNetworkAlmostIdleChanged(FrameNodeImpl* frame_node) = 0;
-  virtual void OnLifecycleStateChanged(FrameNodeImpl* frame_node) = 0;
-  virtual void OnNonPersistentNotificationCreated(
-      FrameNodeImpl* frame_node) = 0;
-
-  // PageNodeImpl notifications.
-  virtual void OnIsVisibleChanged(PageNodeImpl* page_node) = 0;
-  virtual void OnIsLoadingChanged(PageNodeImpl* page_node) = 0;
-  virtual void OnUkmSourceIdChanged(PageNodeImpl* page_node) = 0;
-  virtual void OnLifecycleStateChanged(PageNodeImpl* page_node) = 0;
-  virtual void OnPageAlmostIdleChanged(PageNodeImpl* page_node) = 0;
-  virtual void OnFaviconUpdated(PageNodeImpl* page_node) = 0;
-  virtual void OnTitleUpdated(PageNodeImpl* page_node) = 0;
-  virtual void OnMainFrameNavigationCommitted(PageNodeImpl* page_node) = 0;
-
-  // ProcessNodeImpl notifications.
-  virtual void OnExpectedTaskQueueingDurationSample(
-      ProcessNodeImpl* process_node) = 0;
-  virtual void OnMainThreadTaskLoadIsLow(ProcessNodeImpl* process_node) = 0;
-  virtual void OnRendererIsBloated(ProcessNodeImpl* process_node) = 0;
-  virtual void OnAllFramesInProcessFrozen(ProcessNodeImpl* process_node) = 0;
-
-  // SystemNodeImpl notifications.
-  virtual void OnProcessCPUUsageReady(SystemNodeImpl* system_node) = 0;
-
-  virtual void SetNodeGraph(GraphImpl* graph) = 0;
+ private:
+  DISALLOW_COPY_AND_ASSIGN(GraphObserver);
 };
 
 // An empty implementation of the interface.
@@ -87,25 +54,21 @@
   GraphObserverDefaultImpl();
   ~GraphObserverDefaultImpl() override;
 
-  // Invoked when an observer is added to or removed from the graph. This is a
-  // convenient place for observers to initialize any necessary state, validate
-  // graph invariants, etc.
+  // GraphImplObserver implementation:
   void OnRegistered() override {}
   void OnUnregistered() override {}
-
-  // Called whenever a node has been added to the graph.
   void OnNodeAdded(NodeBase* node) override {}
-
-  // Called when the |node| is about to be removed from the graph.
   void OnBeforeNodeRemoved(NodeBase* node) override {}
+  void SetGraph(GraphImpl* graph) override;
 
-  // FrameNodeImpl notifications.
+  // FrameNodeImplObserver implementation:
   void OnIsCurrentChanged(FrameNodeImpl* frame_node) override {}
   void OnNetworkAlmostIdleChanged(FrameNodeImpl* frame_node) override {}
   void OnLifecycleStateChanged(FrameNodeImpl* frame_node) override {}
+  void OnURLChanged(FrameNodeImpl* frame_node) override {}
   void OnNonPersistentNotificationCreated(FrameNodeImpl* frame_node) override {}
 
-  // PageNodeImpl notifications.
+  // PageNodeImplObserver implementation:
   void OnIsVisibleChanged(PageNodeImpl* page_node) override {}
   void OnIsLoadingChanged(PageNodeImpl* page_node) override {}
   void OnUkmSourceIdChanged(PageNodeImpl* page_node) override {}
@@ -115,22 +78,19 @@
   void OnTitleUpdated(PageNodeImpl* page_node) override {}
   void OnMainFrameNavigationCommitted(PageNodeImpl* page_node) override {}
 
-  // ProcessNodeImpl notifications.
+  // ProcessNodeImplObserver implementation:
   void OnExpectedTaskQueueingDurationSample(
       ProcessNodeImpl* process_node) override {}
   void OnMainThreadTaskLoadIsLow(ProcessNodeImpl* process_node) override {}
-  void OnRendererIsBloated(ProcessNodeImpl* process_node) override {}
   void OnAllFramesInProcessFrozen(ProcessNodeImpl* process_node) override {}
 
-  // SystemNodeImpl notifications.
+  // SystemNodeImplObserver implementation:
   void OnProcessCPUUsageReady(SystemNodeImpl* system_node) override {}
 
-  void SetNodeGraph(GraphImpl* graph) override;
-
-  GraphImpl* graph() const { return node_graph_; }
+  GraphImpl* graph() const { return graph_; }
 
  private:
-  GraphImpl* node_graph_ = nullptr;
+  GraphImpl* graph_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(GraphObserverDefaultImpl);
 };
diff --git a/chrome/browser/performance_manager/webui_graph_dump_impl.cc b/chrome/browser/performance_manager/webui_graph_dump_impl.cc
index 9dc98b9..0f57d07 100644
--- a/chrome/browser/performance_manager/webui_graph_dump_impl.cc
+++ b/chrome/browser/performance_manager/webui_graph_dump_impl.cc
@@ -214,6 +214,11 @@
   SendFrameNotification(frame_node, false);
 }
 
+void WebUIGraphDumpImpl::OnURLChanged(FrameNodeImpl* frame_node) {
+  SendFrameNotification(frame_node, false);
+  StartFrameFaviconRequest(frame_node);
+}
+
 void WebUIGraphDumpImpl::OnIsVisibleChanged(PageNodeImpl* page_node) {
   SendPageNotification(page_node, false);
 }
@@ -256,12 +261,8 @@
   SendProcessNotification(process_node, false);
 }
 
-void WebUIGraphDumpImpl::OnRendererIsBloated(ProcessNodeImpl* process_node) {
-  SendProcessNotification(process_node, false);
-}
-
-void WebUIGraphDumpImpl::SetNodeGraph(GraphImpl* graph) {
-  DCHECK_EQ(graph_, graph);
+void WebUIGraphDumpImpl::SetGraph(GraphImpl* graph) {
+  DCHECK(!graph || graph_ == graph);
 }
 
 WebUIGraphDumpImpl::FaviconRequestHelper*
diff --git a/chrome/browser/performance_manager/webui_graph_dump_impl.h b/chrome/browser/performance_manager/webui_graph_dump_impl.h
index 408970da..edd1a86 100644
--- a/chrome/browser/performance_manager/webui_graph_dump_impl.h
+++ b/chrome/browser/performance_manager/webui_graph_dump_impl.h
@@ -38,6 +38,7 @@
   void OnIsCurrentChanged(FrameNodeImpl* frame_node) override;
   void OnNetworkAlmostIdleChanged(FrameNodeImpl* frame_node) override;
   void OnLifecycleStateChanged(FrameNodeImpl* frame_node) override;
+  void OnURLChanged(FrameNodeImpl* frame_node) override;
   // Event notification.
   void OnNonPersistentNotificationCreated(FrameNodeImpl* frame_node) override {}
   void OnIsVisibleChanged(PageNodeImpl* page_node) override;
@@ -56,14 +57,13 @@
   void OnExpectedTaskQueueingDurationSample(
       ProcessNodeImpl* process_node) override;
   void OnMainThreadTaskLoadIsLow(ProcessNodeImpl* process_node) override;
-  void OnRendererIsBloated(ProcessNodeImpl* process_node) override;
   // Event notification.
   void OnAllFramesInProcessFrozen(ProcessNodeImpl* process_node) override {}
 
   // Ignored
   void OnProcessCPUUsageReady(SystemNodeImpl* system_node) override {}
 
-  void SetNodeGraph(GraphImpl* graph) override;
+  void SetGraph(GraphImpl* graph) override;
 
  private:
   // The favicon requests happen on the UI thread. This helper class
diff --git a/chrome/browser/policy/cloud/cloud_policy_browsertest.cc b/chrome/browser/policy/cloud/cloud_policy_browsertest.cc
index 6ff603b..9495e77 100644
--- a/chrome/browser/policy/cloud/cloud_policy_browsertest.cc
+++ b/chrome/browser/policy/cloud/cloud_policy_browsertest.cc
@@ -60,7 +60,6 @@
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chromeos/cryptohome/cryptohome_parameters.h"
 #include "chromeos/dbus/constants/dbus_paths.h"
 #include "chromeos/dbus/cryptohome/cryptohome_client.h"
@@ -209,8 +208,7 @@
 
 #if defined(OS_CHROMEOS)
     UserCloudPolicyManagerChromeOS* policy_manager =
-        UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-            browser()->profile());
+        browser()->profile()->GetUserCloudPolicyManagerChromeOS();
     ASSERT_TRUE(policy_manager);
 #else
     // Mock a signed-in user. This is used by the UserCloudPolicyStore to pass
diff --git a/chrome/browser/policy/cloud/cloud_policy_manager_browsertest.cc b/chrome/browser/policy/cloud/cloud_policy_manager_browsertest.cc
index de0ed97..a4d6e19a 100644
--- a/chrome/browser/policy/cloud/cloud_policy_manager_browsertest.cc
+++ b/chrome/browser/policy/cloud/cloud_policy_manager_browsertest.cc
@@ -31,7 +31,6 @@
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #else
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
@@ -194,8 +193,7 @@
 
 #if defined(OS_CHROMEOS)
   UserCloudPolicyManagerChromeOS* policy_manager() {
-    return UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-        browser()->profile());
+    return browser()->profile()->GetUserCloudPolicyManagerChromeOS();
   }
 #else
   UserCloudPolicyManager* policy_manager() {
diff --git a/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc b/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
index b24109f..5619a67 100644
--- a/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
+++ b/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
@@ -39,7 +39,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chromeos/constants/chromeos_switches.h"
 #else
 #include "chrome/browser/net/system_network_context_manager.h"
@@ -175,8 +174,7 @@
 
 #if defined(OS_CHROMEOS)
     UserCloudPolicyManagerChromeOS* policy_manager =
-        UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-            browser()->profile());
+        browser()->profile()->GetUserCloudPolicyManagerChromeOS();
     ASSERT_TRUE(policy_manager);
 #else
     // Mock a signed-in user. This is used by the UserCloudPolicyStore to pass
diff --git a/chrome/browser/policy/cloud/policy_header_service_factory.cc b/chrome/browser/policy/cloud/policy_header_service_factory.cc
index 2639d45..0e40ac3 100644
--- a/chrome/browser/policy/cloud/policy_header_service_factory.cc
+++ b/chrome/browser/policy/cloud/policy_header_service_factory.cc
@@ -22,7 +22,6 @@
 #include "chrome/browser/chromeos/policy/active_directory_policy_manager.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #else
 #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
 #endif
@@ -55,12 +54,8 @@
 
 PolicyHeaderServiceFactory::PolicyHeaderServiceFactory()
     : BrowserContextKeyedServiceFactory(
-        "PolicyHeaderServiceFactory",
-        BrowserContextDependencyManager::GetInstance()) {
-#if defined(OS_CHROMEOS)
-  DependsOn(UserPolicyManagerFactoryChromeOS::GetInstance());
-#endif
-}
+          "PolicyHeaderServiceFactory",
+          BrowserContextDependencyManager::GetInstance()) {}
 
 PolicyHeaderServiceFactory::~PolicyHeaderServiceFactory() {
 }
@@ -91,14 +86,12 @@
   Profile* profile = Profile::FromBrowserContext(context);
 #if defined(OS_CHROMEOS)
   CloudPolicyManager* cloud_manager =
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   if (cloud_manager) {
     user_store = cloud_manager->core()->store();
   } else {
     ActiveDirectoryPolicyManager* active_directory_manager =
-        UserPolicyManagerFactoryChromeOS::
-            GetActiveDirectoryPolicyManagerForProfile(profile);
+        profile->GetActiveDirectoryPolicyManager();
     if (!active_directory_manager)
       return nullptr;
     user_store = active_directory_manager->store();
diff --git a/chrome/browser/policy/cloud/user_cloud_policy_invalidator_factory.cc b/chrome/browser/policy/cloud/user_cloud_policy_invalidator_factory.cc
index 4ba524a..87d71f6 100644
--- a/chrome/browser/policy/cloud/user_cloud_policy_invalidator_factory.cc
+++ b/chrome/browser/policy/cloud/user_cloud_policy_invalidator_factory.cc
@@ -11,7 +11,6 @@
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #else
 #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
 #endif
@@ -30,9 +29,6 @@
           BrowserContextDependencyManager::GetInstance()) {
   DependsOn(invalidation::DeprecatedProfileInvalidationProviderFactory::
                 GetInstance());
-#if defined(OS_CHROMEOS)
-  DependsOn(UserPolicyManagerFactoryChromeOS::GetInstance());
-#endif
 }
 
 UserCloudPolicyInvalidatorFactory::~UserCloudPolicyInvalidatorFactory() {}
@@ -42,8 +38,7 @@
   Profile* profile = static_cast<Profile*>(context);
 #if defined(OS_CHROMEOS)
   CloudPolicyManager* policy_manager =
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
 #else
   CloudPolicyManager* policy_manager = profile->GetUserCloudPolicyManager();
 #endif
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 9b9aa32c..838ae00d 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -206,7 +206,6 @@
 #include "content/public/test/url_loader_interceptor.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
 #include "extensions/browser/api/messaging/messaging_delegate.h"
 #include "extensions/browser/disable_reason.h"
 #include "extensions/browser/extension_dialog_auto_confirm.h"
@@ -241,6 +240,7 @@
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_filter.h"
 #include "net/url_request/url_request_interceptor.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/network_switches.h"
 #include "services/network/public/mojom/network_service.mojom.h"
diff --git a/chrome/browser/policy/profile_policy_connector_builder.cc b/chrome/browser/policy/profile_policy_connector_builder.cc
index 37d4d2b..fcdb8a37 100644
--- a/chrome/browser/policy/profile_policy_connector_builder.cc
+++ b/chrome/browser/policy/profile_policy_connector_builder.cc
@@ -18,7 +18,6 @@
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/policy/active_directory_policy_manager.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #else  // Non-ChromeOS.
 #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
@@ -59,11 +58,9 @@
   // UserCloudPolicyManagerChromeOS or a ActiveDirectoryPolicyManager, both of
   // which should be obtained via UserPolicyManagerFactoryChromeOS APIs.
   CloudPolicyManager* cloud_policy_manager =
-      UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   ActiveDirectoryPolicyManager* active_directory_manager =
-      UserPolicyManagerFactoryChromeOS::
-          GetActiveDirectoryPolicyManagerForProfile(profile);
+      profile->GetActiveDirectoryPolicyManager();
   if (cloud_policy_manager) {
     policy_provider = cloud_policy_manager;
     policy_store = cloud_policy_manager->core()->store();
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 3b297f0e..2e080f6 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -115,7 +115,6 @@
 #include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder_factory.h"
 #include "chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h"
 #include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h"
 #include "chrome/browser/chromeos/printing/synced_printers_manager_factory.h"
@@ -346,7 +345,6 @@
 #if defined(OS_CHROMEOS)
   chromeos::OwnerSettingsServiceChromeOSFactory::GetInstance();
   policy::PolicyCertServiceFactory::GetInstance();
-  policy::UserPolicyManagerFactoryChromeOS::GetInstance();
   policy::UserCloudPolicyTokenForwarderFactory::GetInstance();
   policy::UserNetworkConfigurationUpdaterFactory::GetInstance();
 #else  // !defined(OS_CHROMEOS)
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc
index f9e5b1fe..d0bc993 100644
--- a/chrome/browser/profiles/off_the_record_profile_impl.cc
+++ b/chrome/browser/profiles/off_the_record_profile_impl.cc
@@ -250,7 +250,7 @@
 
 #if !defined(OS_ANDROID)
 void OffTheRecordProfileImpl::TrackZoomLevelsFromParent() {
-  DCHECK_NE(INCOGNITO_PROFILE, profile_->GetProfileType());
+  DCHECK(!profile_->IsIncognito());
 
   // Here we only want to use zoom levels stored in the main-context's default
   // storage partition. We're not interested in zoom levels in special
@@ -410,12 +410,22 @@
   return nullptr;
 }
 
-#if !defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS)
+policy::UserCloudPolicyManagerChromeOS*
+OffTheRecordProfileImpl::GetUserCloudPolicyManagerChromeOS() {
+  return GetOriginalProfile()->GetUserCloudPolicyManagerChromeOS();
+}
+
+policy::ActiveDirectoryPolicyManager*
+OffTheRecordProfileImpl::GetActiveDirectoryPolicyManager() {
+  return GetOriginalProfile()->GetActiveDirectoryPolicyManager();
+}
+#else
 policy::UserCloudPolicyManager*
 OffTheRecordProfileImpl::GetUserCloudPolicyManager() {
   return GetOriginalProfile()->GetUserCloudPolicyManager();
 }
-#endif
+#endif  // defined(OS_CHROMEOS)
 
 net::URLRequestContextGetter* OffTheRecordProfileImpl::GetRequestContext() {
   return GetDefaultStoragePartition(this)->GetURLRequestContext();
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.h b/chrome/browser/profiles/off_the_record_profile_impl.h
index e13314c3..0d199fc 100644
--- a/chrome/browser/profiles/off_the_record_profile_impl.h
+++ b/chrome/browser/profiles/off_the_record_profile_impl.h
@@ -58,9 +58,14 @@
   const PrefService* GetPrefs() const override;
   PrefService* GetOffTheRecordPrefs() override;
   policy::SchemaRegistryService* GetPolicySchemaRegistryService() override;
-#if !defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS)
+  policy::UserCloudPolicyManagerChromeOS* GetUserCloudPolicyManagerChromeOS()
+      override;
+  policy::ActiveDirectoryPolicyManager* GetActiveDirectoryPolicyManager()
+      override;
+#else
   policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override;
-#endif
+#endif  // defined(OS_CHROMEOS)
   net::URLRequestContextGetter* GetRequestContext() override;
   base::OnceCallback<net::CookieStore*()> GetExtensionsCookieStoreGetter()
       override;
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc
index aa8b4d51..8a95e22 100644
--- a/chrome/browser/profiles/profile.cc
+++ b/chrome/browser/profiles/profile.cc
@@ -237,6 +237,10 @@
   return GetProfileType() == INCOGNITO_PROFILE;
 }
 
+bool Profile::IsGuestProfile() const {
+  return GetProfileType() == GUEST_PROFILE;
+}
+
 bool Profile::IsGuestSession() const {
 #if defined(OS_CHROMEOS)
   static bool is_guest_session =
diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h
index f5fc256..b5e12192 100644
--- a/chrome/browser/profiles/profile.h
+++ b/chrome/browser/profiles/profile.h
@@ -39,8 +39,13 @@
 
 namespace policy {
 class SchemaRegistryService;
-class UserCloudPolicyManager;
 class ProfilePolicyConnector;
+class UserCloudPolicyManager;
+
+#if defined(OS_CHROMEOS)
+class ActiveDirectoryPolicyManager;
+class UserCloudPolicyManagerChromeOS;
+#endif
 }  // namespace policy
 
 namespace network {
@@ -51,6 +56,8 @@
 class PrefRegistrySyncable;
 }
 
+class OffTheRecordProfileIOData;
+
 // Instead of adding more members to Profile, consider creating a
 // KeyedService. See
 // http://dev.chromium.org/developers/design-documents/profile-architecture
@@ -141,9 +148,6 @@
   // implementations, this is usually the Google-services email address.
   virtual std::string GetProfileUserName() const = 0;
 
-  // Returns the profile type.
-  virtual ProfileType GetProfileType() const = 0;
-
   // Return the incognito version of this profile. The returned pointer
   // is owned by the receiving profile. If the receiving profile is off the
   // record, the same profile is returned.
@@ -223,6 +227,12 @@
   // versa).
   virtual bool IsSameProfile(Profile* profile) = 0;
 
+  // Returns whether two profiles are the same and of the same type.
+  bool IsSameProfileAndType(Profile* profile) {
+    return IsSameProfile(profile) &&
+           GetProfileType() == profile->GetProfileType();
+  }
+
   // Returns the time the profile was started. This is not the time the profile
   // was created, rather it is the time the user started chrome and logged into
   // this profile. For the single profile case, this corresponds to the time
@@ -236,9 +246,15 @@
   // Returns the SchemaRegistryService.
   virtual policy::SchemaRegistryService* GetPolicySchemaRegistryService() = 0;
 
-// In Chrome OS, use UserPolicyManagerFactoryChromeOS::GetCloudPolicyManager()
-// instead.
-#if !defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS)
+  // Returns the UserCloudPolicyManagerChromeOS.
+  virtual policy::UserCloudPolicyManagerChromeOS*
+  GetUserCloudPolicyManagerChromeOS() = 0;
+
+  // Returns the ActiveDirectoryPolicyManager.
+  virtual policy::ActiveDirectoryPolicyManager*
+  GetActiveDirectoryPolicyManager() = 0;
+#else
   // Returns the UserCloudPolicyManager.
   virtual policy::UserCloudPolicyManager* GetUserCloudPolicyManager() = 0;
 #endif
@@ -291,15 +307,25 @@
 
   std::string GetDebugName();
 
-  // Returns whether it's a regular profile. Short-hand for GetProfileType() ==
-  // REGULAR_PROFILE.
+  // IsRegularProfile(), IsIncognito(), and IsGuestProfile() are mutually
+  // exclusive.
+  // IsSystemProfile() implies that IsRegularProfile() is true.
+  // IsOffTheRecord() is an equivalent of IsIncognito() || IsGuestProfile().
+
+  // Returns whether it's a regular profile.
   bool IsRegularProfile() const;
 
-  // Returns whether it is an Incognito session. An Incognito session is an
-  // off-the-record session that is not a guest session.
+  // Returns whether it is an Incognito profile. An Incognito profile is an
+  // off-the-record profile that is not a guest profile.
+  // TODO(https://crbug.com/947933): Replace with IsIncognitProfile.
   bool IsIncognito() const;
 
-  // Returns whether it is a guest session.
+  // Returns whether it is a Guest profile. A Guest profile is an off-the-record
+  // profile in a guest session.
+  bool IsGuestProfile() const;
+
+  // Returns whether it is a guest session. This covers both the guest profile
+  // and its parent.
   virtual bool IsGuestSession() const;
 
   // Returns whether it is a system profile.
@@ -380,6 +406,11 @@
   void Wipe();
 
  protected:
+  friend class OffTheRecordProfileIOData;
+
+  // Returns the profile type.
+  virtual ProfileType GetProfileType() const = 0;
+
   void set_is_guest_profile(bool is_guest_profile) {
     is_guest_profile_ = is_guest_profile;
   }
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 7e53f73..eee5538 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -174,8 +174,9 @@
 #include "chrome/browser/chromeos/multidevice_setup/auth_token_validator_impl.h"
 #include "chrome/browser/chromeos/multidevice_setup/oobe_completion_tracker_factory.h"
 #include "chrome/browser/chromeos/net/delay_network_call.h"
+#include "chrome/browser/chromeos/policy/active_directory_policy_manager.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
+#include "chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.h"
 #include "chrome/browser/chromeos/preferences.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/secure_channel/secure_channel_client_provider.h"
@@ -576,9 +577,11 @@
 #if defined(OS_CHROMEOS)
   if (force_immediate_policy_load)
     chromeos::DeviceSettingsService::Get()->LoadImmediately();
-  configuration_policy_provider_chromeos_ =
-      policy::UserPolicyManagerFactoryChromeOS::CreateForProfile(
-          this, force_immediate_policy_load, io_task_runner_);
+
+  policy::CreateConfigurationPolicyProvider(
+      this, force_immediate_policy_load, io_task_runner_,
+      &user_cloud_policy_manager_chromeos_, &active_directory_policy_manager_);
+
   user_cloud_policy_manager = nullptr;
 #else
   user_cloud_policy_manager_ = CreateUserCloudPolicyManager(
@@ -821,15 +824,9 @@
 
   SimpleKeyMap::GetInstance()->Dissociate(this);
 
-  // TODO(crbug.com/937770): In Chrome OS, UserPolicyManagerFactoryChromeOS
-  // calls Shutdown() in BrowserContextShutdown(), so we should not call it here
-  // despite owning the instance. When the BrowserContextKeyedBaseFactory does
-  // not have the responsibility to call Shutdown() anymore, remove this
-  // condition.
-#if !defined(OS_CHROMEOS)
   profile_policy_connector_->Shutdown();
-  configuration_policy_provider()->Shutdown();
-#endif
+  if (configuration_policy_provider())
+    configuration_policy_provider()->Shutdown();
 
   // This causes the Preferences file to be written to disk.
   if (prefs_loaded)
@@ -1115,16 +1112,30 @@
   return schema_registry_service_.get();
 }
 
-#if !defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS)
+policy::UserCloudPolicyManagerChromeOS*
+ProfileImpl::GetUserCloudPolicyManagerChromeOS() {
+  return user_cloud_policy_manager_chromeos_.get();
+}
+
+policy::ActiveDirectoryPolicyManager*
+ProfileImpl::GetActiveDirectoryPolicyManager() {
+  return active_directory_policy_manager_.get();
+}
+#else
 policy::UserCloudPolicyManager* ProfileImpl::GetUserCloudPolicyManager() {
   return user_cloud_policy_manager_.get();
 }
-#endif
+#endif  // defined(OS_CHROMEOS)
 
 policy::ConfigurationPolicyProvider*
 ProfileImpl::configuration_policy_provider() {
 #if defined(OS_CHROMEOS)
-  return configuration_policy_provider_chromeos_.get();
+  if (user_cloud_policy_manager_chromeos_)
+    return user_cloud_policy_manager_chromeos_.get();
+  if (active_directory_policy_manager_)
+    return active_directory_policy_manager_.get();
+  return nullptr;
 #else
   return user_cloud_policy_manager_.get();
 #endif
diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h
index 1d736cb..2831559 100644
--- a/chrome/browser/profiles/profile_impl.h
+++ b/chrome/browser/profiles/profile_impl.h
@@ -49,9 +49,7 @@
 namespace policy {
 class ConfigurationPolicyProvider;
 class ProfilePolicyConnector;
-class SchemaRegistryService;
-class UserCloudPolicyManager;
-}
+}  // namespace policy
 
 namespace sync_preferences {
 class PrefServiceSyncable;
@@ -147,9 +145,14 @@
   PrefService* GetOffTheRecordPrefs() override;
   PrefService* GetReadOnlyOffTheRecordPrefs() override;
   policy::SchemaRegistryService* GetPolicySchemaRegistryService() override;
-#if !defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS)
+  policy::UserCloudPolicyManagerChromeOS* GetUserCloudPolicyManagerChromeOS()
+      override;
+  policy::ActiveDirectoryPolicyManager* GetActiveDirectoryPolicyManager()
+      override;
+#else
   policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override;
-#endif
+#endif  // defined(OS_CHROMEOS)
   policy::ProfilePolicyConnector* GetProfilePolicyConnector() override;
   const policy::ProfilePolicyConnector* GetProfilePolicyConnector()
       const override;
@@ -243,14 +246,24 @@
   // TODO(mnissler, joaodasilva): The |profile_policy_connector_| provides the
   // PolicyService that the |prefs_| depend on, and must outlive |prefs_|. This
   // can be removed once |prefs_| becomes a KeyedService too.
-  // |profile_policy_connector_| in turn depends on
-  // |user_cloud_policy_manager_| or |configuration_policy_provider_chromeos_|,
-  // which depend on |schema_registry_service_|.
+
+  // - |prefs_| depends on |profile_policy_connector_|
+  // - |profile_policy_connector_| depends on configuration_policy_provider(),
+  //   which can be:
+  //     - |user_cloud_policy_manager_|;
+  //     - |user_cloud_policy_manager_chromeos_|;
+  //     - or |active_directory_policy_manager_|.
+  // - configuration_policy_provider() depends on |schema_registry_service_|
+
   std::unique_ptr<policy::SchemaRegistryService> schema_registry_service_;
 
+  // configuration_policy_provider() is either of these, or nullptr in some
+  // tests.
 #if defined(OS_CHROMEOS)
-  std::unique_ptr<policy::ConfigurationPolicyProvider>
-      configuration_policy_provider_chromeos_;
+  std::unique_ptr<policy::UserCloudPolicyManagerChromeOS>
+      user_cloud_policy_manager_chromeos_;
+  std::unique_ptr<policy::ActiveDirectoryPolicyManager>
+      active_directory_policy_manager_;
 #else
   std::unique_ptr<policy::UserCloudPolicyManager> user_cloud_policy_manager_;
 #endif
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 9e365b7..8e370fac 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -2078,14 +2078,13 @@
     case IDC_SEND_TAB_TO_SELF:
       send_tab_to_self::RecordSendTabToSelfClickResult(
           send_tab_to_self::kContentMenu, SendTabToSelfClickResult::kClickItem);
-      send_tab_to_self::CreateNewEntry(embedder_web_contents_);
+      // TODO(crbug/945988): add histograms to count valid device number.
       break;
 
     case IDC_CONTENT_LINK_SEND_TAB_TO_SELF:
       send_tab_to_self::RecordSendTabToSelfClickResult(
           send_tab_to_self::kLinkMenu, SendTabToSelfClickResult::kClickItem);
-      send_tab_to_self::CreateNewEntry(embedder_web_contents_,
-                                       params_.link_url);
+      // TODO(crbug/945988): add histograms to count valid device number.
       break;
 
     case IDC_RELOAD:
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc
index c5b7507..cb73b901 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_unittest.cc
@@ -39,8 +39,8 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/referrer.h"
 #include "content/public/test/web_contents_tester.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace resource_coordinator {
diff --git a/chrome/browser/resources/chromeos/BUILD.gn b/chrome/browser/resources/chromeos/BUILD.gn
index 587c3ab1..060fd4ba 100644
--- a/chrome/browser/resources/chromeos/BUILD.gn
+++ b/chrome/browser/resources/chromeos/BUILD.gn
@@ -43,6 +43,7 @@
     "internet_detail_dialog:closure_compile",
     "kiosk_next_home:closure_compile",
     "login:closure_compile",
+    "login:closure_compile_supervision",
     "machine_learning:closure_compile",
     "multidevice_setup:closure_compile",
     "network_ui:closure_compile",
diff --git a/chrome/browser/resources/chromeos/camera/src/js/gallerybutton.js b/chrome/browser/resources/chromeos/camera/src/js/gallerybutton.js
index 9d362b66..ab897c2 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/gallerybutton.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/gallerybutton.js
@@ -79,6 +79,11 @@
     const id = 'nlkncpkkdoccmpiclbokaimcnedabhhm|app|open';
     const entry = picture.pictureEntry;
     chrome.fileManagerPrivate.executeTask(id, [entry], (result) => {
+      if (chrome.runtime.lastError) {
+        console.warn(
+            'Unable to open picture: ' + chrome.runtime.lastError.message);
+        return;
+      }
       if (result != 'opened' && result != 'message_sent') {
         console.warn('Unable to open picture: ' + result);
       }
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
index 79d0059..fd68be4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">ምንም ቀዳሚ የጽሑፍ ጥቅስ የለም።</translation>
 <translation id="1321576897702511272">የChromeVox እገዛን ደብቅ</translation>
 <translation id="1325946044405407859">ቡናማ የሚመስል</translation>
-<translation id="1331634987653814322">የብራይል ቅንብሮች</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> ከ<ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">የቁምፊ እና ቃል ማስተጋባት</translation>
 <translation id="1334570596456017464">ግርጌ አደር</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">ውስጣዊ አገናኝ</translation>
 <translation id="4915087353619183190">መማር ሁነታን በማስጀመር ላይ። የqwerty ቁልፍን፣ ሊታደስ የሚችል የብሬይል ቁልፍን ይጫኑ ወይም ተግባሩን ለመረዳት በጣት ይጥረጉ። ለመውጣት control ከw ጋር ወይም escapeን ይጫኑ።</translation>
 <translation id="492295894462528572">መቅድም</translation>
-<translation id="4943781537993885772">የማሳያ ዘይቤ</translation>
 <translation id="495170559598752135">እርምጃዎች</translation>
 <translation id="4953585991029886728">ጽሑፍ ያርትዑ</translation>
 <translation id="4954534434583049121">ቀዳሚ የጽሑፍ ጥቅስ</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">ቅጽ</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{የኋላ እዝባር}one{# የኋላ እዝባሮች}other{# የኋላ እዝባሮች}}</translation>
 <translation id="6017514345406065928">አረንጓዴ</translation>
-<translation id="6021969570711251331">በውስጥ ትቶ መውጣት</translation>
 <translation id="6034000775414344507">ፈካ ያለ ግራጫ</translation>
 <translation id="6037602951055904232">ወደፊት አንፏቅቅ</translation>
 <translation id="6042826534790431634">ለማግበር ፍለጋ+Space ይጫኑ።</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />፣ ምናሌ</translation>
 <translation id="6444046323172968959">የማንቂያ መገናኛ</translation>
 <translation id="6452403590345320472">ማውጫ</translation>
-<translation id="6454456397828627257">ጎን ለጎን</translation>
 <translation id="6459511626086141404">ልሙጥ የቁልፍ አደራደር</translation>
 <translation id="6468049171101508116">ቀጣይ አዝራር</translation>
 <translation id="646954774886932461">መረጃ ጠቋሚ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
index b38c5e0..6ba9a95 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">ليست هناك علامة اقتباس فقرة سابقة.</translation>
 <translation id="1321576897702511272">‏إخفاء مساعدة ChromeVox</translation>
 <translation id="1325946044405407859">أسمر مصفر</translation>
-<translation id="1331634987653814322">إعدادات لغة برايل</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> من <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">صدى الحرف والكلمة</translation>
 <translation id="1334570596456017464">خط منخفض</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">رابط داخلي</translation>
 <translation id="4915087353619183190">‏يمكنك بدء "وضع التعلُّم". ويمكنك الضغط على مفتاح Qwerty أو مفتاح لغة برايل القابل لإعادة التحميل أو إيماءة اللمس لمعرفة وظيفته. ويمكنك الضغط على الزر Control مع W أو الزر Escape للخروج.</translation>
 <translation id="492295894462528572">مقدمة</translation>
-<translation id="4943781537993885772">نمط العرض</translation>
 <translation id="495170559598752135">إجراءات</translation>
 <translation id="4953585991029886728">تعديل النص</translation>
 <translation id="4954534434583049121">الاقتباس الطويل السابق</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">نموذج</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{شرطة واحدة مائلة للخلف}zero{# backslashes}two{شرطتان مائلتان للخلف (#)}few{# شرطات مائلة للخلف}many{# شرطة مائلة للخلف}other{# من الشرطات المائلة للخلف}}</translation>
 <translation id="6017514345406065928">أخضر</translation>
-<translation id="6021969570711251331">المضمَّن</translation>
 <translation id="6034000775414344507">رمادي فاتح</translation>
 <translation id="6037602951055904232">تحريك للأمام</translation>
 <translation id="6042826534790431634">يُرجى الضغط على "بحث" + "مسافة" للتفعيل.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271">القائمة <ph name="NAME" /></translation>
 <translation id="6444046323172968959">مربع حوار للتنبيه</translation>
 <translation id="6452403590345320472">الفهرس</translation>
-<translation id="6454456397828627257">جنبًا إلى جنب</translation>
 <translation id="6459511626086141404">مخطط مفاتيح ثابت</translation>
 <translation id="6468049171101508116">الزر التالي</translation>
 <translation id="646954774886932461">فهرس</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
index 1415a4e7..cda0482 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Няма предишен блоков цитат.</translation>
 <translation id="1321576897702511272">Скриване на помощта за ChromeVox</translation>
 <translation id="1325946044405407859">бледокафяво</translation>
-<translation id="1331634987653814322">Настройки за брайлово писмо</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> от <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">ехо за знаците и думите</translation>
 <translation id="1334570596456017464">Долен индекс</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Вътрешна връзка</translation>
 <translation id="4915087353619183190">Режимът за изговаряне на клавишите стартира. Натиснете стандартен клавиш или клавиш от брайловия дисплей или изпълнете жест с докосване, за да научите функцията му. Натиснете Control и W или Escape, за да излезете.</translation>
 <translation id="492295894462528572">Предговор</translation>
-<translation id="4943781537993885772">Стил на показване</translation>
 <translation id="495170559598752135">Действия</translation>
 <translation id="4953585991029886728">Текстово поле</translation>
 <translation id="4954534434583049121">Предишният блоков цитат</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Формуляр</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{обратна наклонена черта}other{# обратни наклонени черти}}</translation>
 <translation id="6017514345406065928">зелено</translation>
-<translation id="6021969570711251331">Редуване</translation>
 <translation id="6034000775414344507">светлосиво</translation>
 <translation id="6037602951055904232">Панорамно придвижване напред</translation>
 <translation id="6042826534790431634">За активиране натиснете клавиша „търсене“ + интервал.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271">„<ph name="NAME" />“, меню</translation>
 <translation id="6444046323172968959">Диалогов прозорец със сигнал</translation>
 <translation id="6452403590345320472">Съдържание</translation>
-<translation id="6454456397828627257">Редом</translation>
 <translation id="6459511626086141404">Фиксирана клавиатурна подредба</translation>
 <translation id="6468049171101508116">Следващият бутон</translation>
 <translation id="646954774886932461">Показалец</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
index b282af5..13bd944a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">কোনো পূর্ববর্তী অবরুদ্ধ উর্দ্ধৃতি নেই৷</translation>
 <translation id="1321576897702511272">ChromeVox সহায়তা লুকান</translation>
 <translation id="1325946044405407859">তামাটে</translation>
-<translation id="1331634987653814322">ব্রেইল সেটিংস</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" />-এর <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">অক্ষর ও শব্দ ইকো</translation>
 <translation id="1334570596456017464">সাবস্ক্রিপ্ট</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">ইন্টার্নাল লিঙ্ক</translation>
 <translation id="4915087353619183190">লার্ন মোড শুরু করা হচ্ছে। এটির ক্রিয়াকলাপ সম্বন্ধে জানার জন্য কোয়ার্টি কী, রিফ্রেশ করা যায় এমন ব্রেইল কী টিপুন বা স্ক্রিন স্পর্শ করুন। বেরিয়ে আসার জন্য Ctrl কী সহ w অথবা Esc কী টিপুন।</translation>
 <translation id="492295894462528572">মুখবন্ধ</translation>
-<translation id="4943781537993885772">ডিসপ্লে স্টাইল</translation>
 <translation id="495170559598752135">ক্রিয়াসমূহ</translation>
 <translation id="4953585991029886728">পাঠ্য সম্পাদনা করুন</translation>
 <translation id="4954534434583049121">পূর্ববর্তী অবরুদ্ধ উদ্ধৃতি</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">রূপ</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{ব্যাকস্ল্যাশ}one{#টি ব্যাকস্ল্যাশ}other{#টি ব্যাকস্ল্যাশ}}</translation>
 <translation id="6017514345406065928">সবুজ</translation>
-<translation id="6021969570711251331">ইন্টারলিভ</translation>
 <translation id="6034000775414344507">হালকা ধূসর</translation>
 <translation id="6037602951055904232">প্যান ফরওয়ার্ড</translation>
 <translation id="6042826534790431634">চালু করতে Search+Space টিপুন।</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, মেনু</translation>
 <translation id="6444046323172968959">সতর্কতা ডায়ালগ</translation>
 <translation id="6452403590345320472">সূচিপত্র</translation>
-<translation id="6454456397828627257">পাশাপাশি</translation>
 <translation id="6459511626086141404">ফ্ল্যাট কীম্যাপ</translation>
 <translation id="6468049171101508116">পরবর্তী বোতাম</translation>
 <translation id="646954774886932461">সূচি</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
index 1cc6ad6..6952db5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">No hi ha cap cita en bloc anterior.</translation>
 <translation id="1321576897702511272">Amaga l'ajuda de ChromeVox.</translation>
 <translation id="1325946044405407859">Canyella</translation>
-<translation id="1331634987653814322">Configuració de braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> de <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">retorn de caràcters i de paraules</translation>
 <translation id="1334570596456017464">Subíndex</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Enllaç intern</translation>
 <translation id="4915087353619183190">S'està iniciant el mode d'aprenentatge. Fes un gest tàctil o bé prem una tecla qwerty o braille actualitzable per assabentar-te de la funció. Prem Control junt amb w o la tecla d'escapada per sortir.</translation>
 <translation id="492295894462528572">Preàmbul</translation>
-<translation id="4943781537993885772">Estil de visualització</translation>
 <translation id="495170559598752135">Accions</translation>
 <translation id="4953585991029886728">Edita el text</translation>
 <translation id="4954534434583049121">Cita de bloqueig anterior</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Formulari</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{barra invertida}other{# barres invertides}}</translation>
 <translation id="6017514345406065928">Verd</translation>
-<translation id="6021969570711251331">Entrellaça</translation>
 <translation id="6034000775414344507">Gris clar</translation>
 <translation id="6037602951055904232">Desplaça cap endavant.</translation>
 <translation id="6042826534790431634">Prem Cerca+Espai per activar l'opció.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menú</translation>
 <translation id="6444046323172968959">Diàleg d'alerta</translation>
 <translation id="6452403590345320472">Taula de continguts</translation>
-<translation id="6454456397828627257">En paral·lel</translation>
 <translation id="6459511626086141404">Mapa de teclat pla</translation>
 <translation id="6468049171101508116">Botó següent</translation>
 <translation id="646954774886932461">Índex</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
index a284541..7f4968e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Žádná předchozí bloková citace.</translation>
 <translation id="1321576897702511272">Skrýt nápovědu programu ChromeVox</translation>
 <translation id="1325946044405407859">Šedobéžová</translation>
-<translation id="1331634987653814322">Nastavení Brailleova písma</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> z <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">vyslovovat znaky a slova</translation>
 <translation id="1334570596456017464">Dolní index</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Interní odkaz</translation>
 <translation id="4915087353619183190">Spouští se režim výuky. Stisknutím klávesy na běžné klávesnici, tlačítka obnovitelného braillského řádku nebo provedením dotykového gesta získáte informace o jeho funkci. Režim výuky ukončíte stisknutím kombinace kláves Ctrl+W nebo klávesy Escape.</translation>
 <translation id="492295894462528572">Předmluva</translation>
-<translation id="4943781537993885772">Styl zobrazení</translation>
 <translation id="495170559598752135">Akce</translation>
 <translation id="4953585991029886728">Upravit text</translation>
 <translation id="4954534434583049121">Předchozí blok citace</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Formulář</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{zpětné lomítko}few{# zpětná lomítka}many{# backslashes}other{# zpětných lomítek}}</translation>
 <translation id="6017514345406065928">Zelená</translation>
-<translation id="6021969570711251331">Prokládání</translation>
 <translation id="6034000775414344507">Světle šedá</translation>
 <translation id="6037602951055904232">Posunout dopředu</translation>
 <translation id="6042826534790431634">Lze aktivovat stisknutím kláves Hledat + mezerník.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, nabídka</translation>
 <translation id="6444046323172968959">Dialog upozornění</translation>
 <translation id="6452403590345320472">Obsah</translation>
-<translation id="6454456397828627257">Vedle sebe</translation>
 <translation id="6459511626086141404">Plochá mapa kláves</translation>
 <translation id="6468049171101508116">Další tlačítko</translation>
 <translation id="646954774886932461">Rejstřík</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
index e0a6817..816aaa6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Ingen tidligere blockquotes.</translation>
 <translation id="1321576897702511272">Skjul Hjælp til ChromeVox</translation>
 <translation id="1325946044405407859">Gyldenbrun</translation>
-<translation id="1331634987653814322">Indstillinger for braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> af <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">tegn- og ordekko</translation>
 <translation id="1334570596456017464">Sænket skrift</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Internt link</translation>
 <translation id="4915087353619183190">Indlæringstilstanden startes. Tryk på en qwerty-tast, en opdaterbar brailletast eller en berøring for at få indblik i den tilknyttede funktion. Tryk på Ctrl og w eller escape for at afslutte.</translation>
 <translation id="492295894462528572">Forord</translation>
-<translation id="4943781537993885772">Visningsstil</translation>
 <translation id="495170559598752135">Handlinger</translation>
 <translation id="4953585991029886728">Rediger tekst</translation>
 <translation id="4954534434583049121">Forrige citatblok</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formular</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{omvendt skråstreg}one{ # omvendte skråstreger}other{# omvendte skråstreger}}</translation>
 <translation id="6017514345406065928">Grøn</translation>
-<translation id="6021969570711251331">Sammenflet</translation>
 <translation id="6034000775414344507">Lysegrå</translation>
 <translation id="6037602951055904232">Panorer fremad</translation>
 <translation id="6042826534790431634">Tryk på søgetasten+mellemrumstasten for at aktivere.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271">Menuen <ph name="NAME" /></translation>
 <translation id="6444046323172968959">Underretningsdialogboks</translation>
 <translation id="6452403590345320472">Indholdsfortegnelse</translation>
-<translation id="6454456397828627257">Side om side</translation>
 <translation id="6459511626086141404">Flad tasteoversigt</translation>
 <translation id="6468049171101508116">Knappen Næste</translation>
 <translation id="646954774886932461">Indeks</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
index d0d591b..833d0673 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Kein vorheriges blockquote-Element</translation>
 <translation id="1321576897702511272">ChromeVox-Hilfe ausblenden</translation>
 <translation id="1325946044405407859">Gelbbraun</translation>
-<translation id="1331634987653814322">Brailleeinstellungen</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> von <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">Zeichen- und Wortecho</translation>
 <translation id="1334570596456017464">Tiefgestellt</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Interner Link</translation>
 <translation id="4915087353619183190">Der Lernmodus wird gestartet. Drücken Sie eine Taste auf der QWERTZ-Tastatur oder der Braillezeile oder führen Sie eine Bewegung (Geste) auf dem Bildschirm aus, um mehr über die Taste bzw. Bewegung zu erfahren. Zum Beenden drücken Sie "Strg + w" oder "Esc".</translation>
 <translation id="492295894462528572">Vorwort</translation>
-<translation id="4943781537993885772">Anzeigestil</translation>
 <translation id="495170559598752135">Aktionen</translation>
 <translation id="4953585991029886728">Text bearbeiten</translation>
 <translation id="4954534434583049121">Vorheriges Blockzitat</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Formular</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{umgekehrter Schrägstrich}other{# umgekehrte Schrägstriche}}</translation>
 <translation id="6017514345406065928">Grün</translation>
-<translation id="6021969570711251331">Überlappend</translation>
 <translation id="6034000775414344507">Hellgrau</translation>
 <translation id="6037602951055904232">Nach vorn verschieben</translation>
 <translation id="6042826534790431634">Zum Aktivieren Suchtaste + Leertaste drücken.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271">Menü "<ph name="NAME" />"</translation>
 <translation id="6444046323172968959">Benachrichtigungsdialogfeld</translation>
 <translation id="6452403590345320472">Inhaltsverzeichnis</translation>
-<translation id="6454456397828627257">Nebeneinander</translation>
 <translation id="6459511626086141404">Flache Tastaturbelegung</translation>
 <translation id="6468049171101508116">Nächste Schaltfläche</translation>
 <translation id="646954774886932461">Index</translation>
@@ -805,7 +801,7 @@
 <translation id="667999046851023355">Dokument</translation>
 <translation id="6688209025607531203">Eine nicht modale Benachrichtigung</translation>
 <translation id="6689672606256159458">Dunkle Lachsfarbe</translation>
-<translation id="669617842401078250">Download von "<ph name="FILE_NAME" />" angehalten</translation>
+<translation id="669617842401078250">Download von "<ph name="FILE_NAME" />" pausiert</translation>
 <translation id="6696967141280706829">Vorbemerkung</translation>
 <translation id="6697092096875747123">Vorheriges Kombinationsfeld</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{Ausrufezeichen}other{# Ausrufezeichen}}</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
index 75d4194..a3c0afd4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Δεν υπάρχει προηγούμενη ενότητα σε παράθεση.</translation>
 <translation id="1321576897702511272">Απόκρυψη βοήθειας ChromeVox</translation>
 <translation id="1325946044405407859">Ανοιχτό καφέ</translation>
-<translation id="1331634987653814322">Ρυθμίσεις μπράιγ</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> από <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">εκφώνηση χαρακτήρων και λέξεων</translation>
 <translation id="1334570596456017464">Δείκτης</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Ετικέτα "Εσωτερικός σύνδεσμος" (&lt;a&gt;)</translation>
 <translation id="4915087353619183190">Έναρξη Λειτουργίας εκμάθησης. Πατήστε ένα πλήκτρο qwerty, ένα πλήκτρο Μπράιγ με δυνατότητα ανανέωσης ή κάντε μια κίνηση αφής, για να μάθετε πώς λειτουργεί. Πατήστε control και w ή escape για έξοδο.</translation>
 <translation id="492295894462528572">Εισαγωγή</translation>
-<translation id="4943781537993885772">Στιλ προβολής</translation>
 <translation id="495170559598752135">Ενέργειες</translation>
 <translation id="4953585991029886728">Επεξεργασία κειμένου</translation>
 <translation id="4954534434583049121">Προηγούμενο block quote</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Φόρμα</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{ανάστροφη κάθετος}other{# ανάστροφες κάθετοι}}</translation>
 <translation id="6017514345406065928">Πράσινο</translation>
-<translation id="6021969570711251331">Παρεμβολή</translation>
 <translation id="6034000775414344507">Ανοιχτό γκρι</translation>
 <translation id="6037602951055904232">Μετακίνηση προς τα εμπρός</translation>
 <translation id="6042826534790431634">Πατήστε τα πλήκτρα Αναζήτηση+Space για ενεργοποίηση.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, μενού</translation>
 <translation id="6444046323172968959">Παράθυρο διαλόγου ειδοποιήσεων</translation>
 <translation id="6452403590345320472">Πίνακας περιεχομένων</translation>
-<translation id="6454456397828627257">Δίπλα</translation>
 <translation id="6459511626086141404">Σταθερή αντιστοίχιση πλήκτρων</translation>
 <translation id="6468049171101508116">Επόμενο κουμπί</translation>
 <translation id="646954774886932461">Ευρετήριο</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
index 61b28610..c8f0d1da 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_en-GB.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">No previous block quote.</translation>
 <translation id="1321576897702511272">Hide ChromeVox help</translation>
 <translation id="1325946044405407859">Tan</translation>
-<translation id="1331634987653814322">Braille Settings</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> of <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">character and word echo</translation>
 <translation id="1334570596456017464">Subscript</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Internal link</translation>
 <translation id="4915087353619183190">Starting Learn Mode. Press a qwerty key, refreshable braille key or touch gesture to learn its function. Press control with w or escape to exit.</translation>
 <translation id="492295894462528572">Foreword</translation>
-<translation id="4943781537993885772">Display Style</translation>
 <translation id="495170559598752135">Actions</translation>
 <translation id="4953585991029886728">Edit text</translation>
 <translation id="4954534434583049121">Previous block quote</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Form</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{backslash}other{# backslashes}}</translation>
 <translation id="6017514345406065928">Green</translation>
-<translation id="6021969570711251331">Interleave</translation>
 <translation id="6034000775414344507">Light grey</translation>
 <translation id="6037602951055904232">Pan forward</translation>
 <translation id="6042826534790431634">Press Search+Space to activate.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Alert dialogue</translation>
 <translation id="6452403590345320472">Table of contents</translation>
-<translation id="6454456397828627257">Side by side</translation>
 <translation id="6459511626086141404">Flat keymap</translation>
 <translation id="6468049171101508116">Next button</translation>
 <translation id="646954774886932461">Index</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
index 559902e..d952bce 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es-419.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">No hay ninguna etiqueta "blockquote" anterior.</translation>
 <translation id="1321576897702511272">Ocultar ayuda de ChromeVox</translation>
 <translation id="1325946044405407859">Canela</translation>
-<translation id="1331634987653814322">Configuración de braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> de <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">reproducción oral de caracteres y palabras</translation>
 <translation id="1334570596456017464">Subíndice</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Vínculo interno</translation>
 <translation id="4915087353619183190">Se está iniciando el modo de aprendizaje. Presiona una tecla del teclado QWERTY, una tecla de la línea braille o un gesto táctil para conocer su función. Presiona Ctrl+W o Esc para salir.</translation>
 <translation id="492295894462528572">Prefacio</translation>
-<translation id="4943781537993885772">Estilo de la imagen</translation>
 <translation id="495170559598752135">Acciones</translation>
 <translation id="4953585991029886728">Editar texto</translation>
 <translation id="4954534434583049121">Cita de bloque anterior</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formulario</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{barra diagonal inversa}other{# barras diagonales inversas}}</translation>
 <translation id="6017514345406065928">Verde</translation>
-<translation id="6021969570711251331">Intercalar</translation>
 <translation id="6034000775414344507">Gris claro</translation>
 <translation id="6037602951055904232">Desplazar hacia delante</translation>
 <translation id="6042826534790431634">Presiona la tecla de búsqueda+barra espaciadora para activar una opción.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menú</translation>
 <translation id="6444046323172968959">Cuadro de diálogo de alerta</translation>
 <translation id="6452403590345320472">Índice</translation>
-<translation id="6454456397828627257">Lado a lado</translation>
 <translation id="6459511626086141404">Mapa de teclado plano</translation>
 <translation id="6468049171101508116">Botón Siguiente</translation>
 <translation id="646954774886932461">Índice</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
index 302ee96..51f027f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">No hay ninguna etiqueta "blockquote" anterior.</translation>
 <translation id="1321576897702511272">Oculta la ayuda de ChromeVox</translation>
 <translation id="1325946044405407859">Bronce</translation>
-<translation id="1331634987653814322">Ajustes de braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> de <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">decir palabras y caracteres</translation>
 <translation id="1334570596456017464">Subíndice</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Enlace interno</translation>
 <translation id="4915087353619183190">Se está iniciando el modo de aprendizaje. Pulsa una tecla del teclado QWERTY, una tecla de braille actualizable o un gesto táctil para saber su función. Para salir, pulsa Ctrl + W o Esc.</translation>
 <translation id="492295894462528572">Prefacio</translation>
-<translation id="4943781537993885772">Estilo de visualización</translation>
 <translation id="495170559598752135">Acciones</translation>
 <translation id="4953585991029886728">Edita texto</translation>
 <translation id="4954534434583049121">Cita de bloque anterior</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formulario</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{barra inversa}other{# barras inversas}}</translation>
 <translation id="6017514345406065928">Verde</translation>
-<translation id="6021969570711251331">Intercalado</translation>
 <translation id="6034000775414344507">Gris claro</translation>
 <translation id="6037602951055904232">Se desplaza hacia delante</translation>
 <translation id="6042826534790431634">Pulsa la tecla de búsqueda y la barra espaciadora para activar la opción.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menú</translation>
 <translation id="6444046323172968959">Cuadro de diálogo de alerta</translation>
 <translation id="6452403590345320472">Índice</translation>
-<translation id="6454456397828627257">Visualización en paralelo</translation>
 <translation id="6459511626086141404">Mapa de teclado plano</translation>
 <translation id="6468049171101508116">Botón siguiente</translation>
 <translation id="646954774886932461">Índice</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
index 5203062..139b522 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Eelmist plokktsitaati ei ole.</translation>
 <translation id="1321576897702511272">Peida ChromeVoxi abi</translation>
 <translation id="1325946044405407859">Helepruun</translation>
-<translation id="1331634987653814322">Braille' seaded</translation>
 <translation id="1331702245475014624"><ph name="INDEX" />/<ph name="TOTAL" />-st</translation>
 <translation id="1334095593597963605">tähemärkide ja sõnade kaja</translation>
 <translation id="1334570596456017464">Allindeks</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Siselink</translation>
 <translation id="4915087353619183190">Õppimisrežiimi käivitamine. Vajutage qwerty-klahvi, värskendatavat Braille' klahvi või puuteliigutust, et vaadata selle funktsiooni. Väljumiseks vajutage paoklahvi või korraga juhtklahvi ja klahvi W.</translation>
 <translation id="492295894462528572">Eessõna</translation>
-<translation id="4943781537993885772">Kuva stiil</translation>
 <translation id="495170559598752135">Toimingud</translation>
 <translation id="4953585991029886728">Teksti muutmine</translation>
 <translation id="4954534434583049121">Eelmine tsitaat</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Vorm</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{kurakriips}other{# kurakaldkriipsu}}</translation>
 <translation id="6017514345406065928">Roheline</translation>
-<translation id="6021969570711251331">Vaheldumisi tekst</translation>
 <translation id="6034000775414344507">Helehall</translation>
 <translation id="6037602951055904232">Edasi navigeerimine</translation>
 <translation id="6042826534790431634">Aktiveerimiseks vajutage otsinguklahvi + tühikut.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271">Menüü <ph name="NAME" /></translation>
 <translation id="6444046323172968959">Hoiatusdialoog</translation>
 <translation id="6452403590345320472">Sisukord</translation>
-<translation id="6454456397828627257">Kõrvuti</translation>
 <translation id="6459511626086141404">Lame klahvitabel</translation>
 <translation id="6468049171101508116">Järgmine nupp</translation>
 <translation id="646954774886932461">Register</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
index 56b60f7..eba0928 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">نقل قول قبلی موجود نیست.</translation>
 <translation id="1321576897702511272">‏پنهان کردن راهنمای ChromeVox</translation>
 <translation id="1325946044405407859">برنزه کدر</translation>
-<translation id="1331634987653814322">تنظیمات بریل</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> از <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">بازگویی نویسه و کلمه</translation>
 <translation id="1334570596456017464">زیرنگاشت</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">پیوند داخلی</translation>
 <translation id="4915087353619183190">‏درحال شروع حالت یادگیری. یکی از کلیدهای qwerty، کلید بریل قابل‌بازخوانی یا اشاره لمسی را برای یادگیری عملکرد آن فشار دهید. برای خروج کلیدهای control + w یا escape را فشار دهید.</translation>
 <translation id="492295894462528572">پیش‌گفتار</translation>
-<translation id="4943781537993885772">سبک نمایش</translation>
 <translation id="495170559598752135">کنش‌ها</translation>
 <translation id="4953585991029886728">ویرایش نوشتار</translation>
 <translation id="4954534434583049121">نقل قول طولانی قبلی</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">فرم</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{اریب وارو}one{# اریب وارو}other{# اریب وارو}}</translation>
 <translation id="6017514345406065928">سبز</translation>
-<translation id="6021969570711251331">درهم‌چینی</translation>
 <translation id="6034000775414344507">خاکستری کم‌رنگ</translation>
 <translation id="6037602951055904232">حرکت به جلو</translation>
 <translation id="6042826534790431634">‏Search+Space را برای فعال کردن فشار دهید.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />، منو</translation>
 <translation id="6444046323172968959">گفتگوی هشدار</translation>
 <translation id="6452403590345320472">فهرست مطالب</translation>
-<translation id="6454456397828627257">پهلو به پهلو</translation>
 <translation id="6459511626086141404">نقشه کلید مسطح</translation>
 <translation id="6468049171101508116">دکمه بعدی</translation>
 <translation id="646954774886932461">فهرست موضوعی</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
index 3709edc1..4dedb5d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Ei edellisiä lainauksia.</translation>
 <translation id="1321576897702511272">Piilota ChromeVox-ohje</translation>
 <translation id="1325946044405407859">Kellanruskea</translation>
-<translation id="1331634987653814322">Pistekirjoitusasetukset</translation>
 <translation id="1331702245475014624"><ph name="INDEX" />/<ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">merkkien ja sanojen puhuminen</translation>
 <translation id="1334570596456017464">Alaindeksi</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Sisäinen linkki</translation>
 <translation id="4915087353619183190">Opetustila käynnistyy. Kokeile qwerty-näppäintä, pistekirjoitusnäppäintä tai kosketuselettä, niin näet sen toiminnan. Paina Control ja W tai Esc sulkeaksesi tilan.</translation>
 <translation id="492295894462528572">Esipuhe</translation>
-<translation id="4943781537993885772">Näyttötyyli</translation>
 <translation id="495170559598752135">Toiminnot</translation>
 <translation id="4953585991029886728">Muokkaa tekstiä</translation>
 <translation id="4954534434583049121">Edellinen estoviittaus</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Lomake</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{kenoviiva}other{# kenoviivaa}}</translation>
 <translation id="6017514345406065928">Vihreä</translation>
-<translation id="6021969570711251331">Lomittain</translation>
 <translation id="6034000775414344507">Vaaleanharmaa</translation>
 <translation id="6037602951055904232">Panoroi eteenpäin</translation>
 <translation id="6042826534790431634">Aktivoi painamalla haku+välilyönti.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, valikko</translation>
 <translation id="6444046323172968959">Ilmoitusvalintaikkuna</translation>
 <translation id="6452403590345320472">Sisällysluettelo</translation>
-<translation id="6454456397828627257">Vierekkäin</translation>
 <translation id="6459511626086141404">Flat-näppäinkartta</translation>
 <translation id="6468049171101508116">Seuraava-painike</translation>
 <translation id="646954774886932461">Hakemisto</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
index e2dabc8..aaa54ca5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Walang nakaraang blockquote.</translation>
 <translation id="1321576897702511272">Itago ang tulong sa ChromeVox</translation>
 <translation id="1325946044405407859">Tan</translation>
-<translation id="1331634987653814322">Mga Setting ng Braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> ng <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">echo ng character at salita</translation>
 <translation id="1334570596456017464">Subscript</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Internal na link</translation>
 <translation id="4915087353619183190">Sinisimulan ang Learn Mode. Pumindot ng “qwerty key,” nare-refresh na “braille key,” o touch gesture para malaman ang function nito. Pindutin ang Ctrl+W o escape para lumabas.</translation>
 <translation id="492295894462528572">Foreword</translation>
-<translation id="4943781537993885772">Istilo ng Display</translation>
 <translation id="495170559598752135">Mga Pagkilos</translation>
 <translation id="4953585991029886728">I-edit ang text</translation>
 <translation id="4954534434583049121">Nakaraang block quote</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Form</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{backslash}one{# backslash}other{# na backslash}}</translation>
 <translation id="6017514345406065928">Berde</translation>
-<translation id="6021969570711251331">Interleave</translation>
 <translation id="6034000775414344507">Light Grey</translation>
 <translation id="6037602951055904232">I-pan paharap</translation>
 <translation id="6042826534790431634">Pindutin ang Search+Space upang i-activate.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Dialog ng alerto</translation>
 <translation id="6452403590345320472">Talaan ng mga nilalaman</translation>
-<translation id="6454456397828627257">Magkatabi</translation>
 <translation id="6459511626086141404">Flat na keymap</translation>
 <translation id="6468049171101508116">Susunod na button</translation>
 <translation id="646954774886932461">Index</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
index f21bb0d4..7e4f413 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Aucune balise blockquote précédente</translation>
 <translation id="1321576897702511272">Masquer l'aide ChromeVox</translation>
 <translation id="1325946044405407859">Brun clair</translation>
-<translation id="1331634987653814322">Paramètres du braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> sur <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">écho des caractères et des mots</translation>
 <translation id="1334570596456017464">Indice</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Lien interne</translation>
 <translation id="4915087353619183190">Démarrage du mode d'apprentissage. Appuyez sur une touche du clavier, sur une touche braille actualisable ou sur un geste pour en savoir plus sur son fonctionnement. Appuyez sur Ctrl+W ou sur Échap pour quitter.</translation>
 <translation id="492295894462528572">Avant-propos</translation>
-<translation id="4943781537993885772">Style d'affichage</translation>
 <translation id="495170559598752135">Actions</translation>
 <translation id="4953585991029886728">Modifier le texte</translation>
 <translation id="4954534434583049121">Bloc de citation précédent</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formulaire</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{barre oblique inverse}one{# barre oblique inverse}other{# barres obliques inverses}}</translation>
 <translation id="6017514345406065928">Vert</translation>
-<translation id="6021969570711251331">Braille et texte standard</translation>
 <translation id="6034000775414344507">Gris clair</translation>
 <translation id="6037602951055904232">Panoramique avant</translation>
 <translation id="6042826534790431634">Appuyez sur Recherche+Espace pour activer la commande.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Boîte de dialogue d'alerte</translation>
 <translation id="6452403590345320472">Sommaire</translation>
-<translation id="6454456397828627257">Côte à côte</translation>
 <translation id="6459511626086141404">Mappage plat du clavier</translation>
 <translation id="6468049171101508116">Bouton suivant</translation>
 <translation id="646954774886932461">Index</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
index c0975a7..0a0ccece1f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">કોઈ પાછલું બ્લૉકક્વોટ નથી.</translation>
 <translation id="1321576897702511272">ChromeVox સહાય છુપાવો</translation>
 <translation id="1325946044405407859">ટૅન</translation>
-<translation id="1331634987653814322">બ્રેઇલ સેટિંગ</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" /> માંથી <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">અક્ષર અને શબ્દ પડઘો</translation>
 <translation id="1334570596456017464">સબસ્ક્રિપ્ટ</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">આંતરિક લિંક</translation>
 <translation id="4915087353619183190">જાણો મોડ શરૂ કરી રહ્યું છે. qwerty કી, રિફ્રેશ યોગ્ય બ્રેઇલ કી અથવા સ્પર્શ સંકેતના કાર્યને જાણવા માટે તેને દબાવો. બહાર નીકળવા માટે wની સાથે control અથવા escape દબાવો.</translation>
 <translation id="492295894462528572">આમુખ</translation>
-<translation id="4943781537993885772">પ્રદર્શન શૈલી</translation>
 <translation id="495170559598752135">ક્રિયાઓ</translation>
 <translation id="4953585991029886728">ટેક્સ્ટમાંમાં ફેરફાર કરો</translation>
 <translation id="4954534434583049121">પાછલું બ્લૉક ક્વોટ</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">ફોર્મ</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{બેકસ્લેશ}one{# બેકસ્લેશ}other{# બેકસ્લેશ}}</translation>
 <translation id="6017514345406065928">લીલો</translation>
-<translation id="6021969570711251331">ઇન્ટરલીવ</translation>
 <translation id="6034000775414344507">આછો ગ્રે</translation>
 <translation id="6037602951055904232">આગળની તરફ પેન કરો</translation>
 <translation id="6042826534790431634">સક્રિય કરવા માટે Search+Spacebar દબાવો.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, મેનૂ</translation>
 <translation id="6444046323172968959">ચેતવણી સંવાદ</translation>
 <translation id="6452403590345320472">અનુક્રમણિકા</translation>
-<translation id="6454456397828627257">સાથે સાથે</translation>
 <translation id="6459511626086141404">સપાટ કિમેપ</translation>
 <translation id="6468049171101508116">આગલું બટન</translation>
 <translation id="646954774886932461">અનુક્રમણિકા</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
index f9d6c76..fbf154f2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">कोई पिछला ब्‍लॉककोट नहीं.</translation>
 <translation id="1321576897702511272">ChromeVox सहायता छिपाएं</translation>
 <translation id="1325946044405407859">हल्का भूरा रंग</translation>
-<translation id="1331634987653814322">ब्रेल की सेटिंग</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" /> में से <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">वर्ण और शब्द इको</translation>
 <translation id="1334570596456017464">सबस्क्रिप्ट</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">आंतरिक लिंक</translation>
 <translation id="4915087353619183190">'सीखने वाला मोड' शुरू किया जा रहा है. इसके फ़ंक्शन के बारे में जानने के लिए कोई क्वर्टी कुंजी, रीफ्रेश की जा सकने वाली ब्रेल कुंजी या हाथ का जेस्चर (छूना) दबाएं. बाहर निकलने के लिए control और w या escape कुंजी दबाएं.</translation>
 <translation id="492295894462528572">भूमिका</translation>
-<translation id="4943781537993885772">डिसप्ले का प्रकार</translation>
 <translation id="495170559598752135">क्रियाएं</translation>
 <translation id="4953585991029886728">लेख में बदलाव करें</translation>
 <translation id="4954534434583049121">पिछला ब्‍लॉक क्वोट</translation>
@@ -688,7 +686,7 @@
 <translation id="5729047866208036762">गणित के बारे में और जानने के लिए ऊपर, नीचे, बाएं या दाएं वाले तीर दबाएं.</translation>
 <translation id="5732189279857692565">यह दूसरा शीर्षक है. आगे बढ़ते रहें; Search+H या Search+Shift+H दबाएं</translation>
 <translation id="5748623122140342504">पिछला लेवल 5 का शीर्षक</translation>
-<translation id="5750633686117194034">कोई संशोधक नहीं दबाया गया; कृपया एक या ज़्यादा संशोधक दबाकर रखें; पूर्ण हो जाने पर अपनी अंगुलियां उठा लें और आपको सुनाई देगा कि कुंजियां सेट हो गई हैं. बाहर निकलने के लिए टैब दबाएं.</translation>
+<translation id="5750633686117194034">कोई मॉडिफ़ायर नहीं दबाया गया; कृपया एक या ज़्यादा मॉडिफ़ायर दबाकर रखें; पूरा हो जाने पर अपनी अंगुलियां उठा लें और आपको सुनाई देगा कि कुंजियां सेट हो गई हैं. बाहर निकलने के लिए टैब दबाएं.</translation>
 <translation id="5760594853119905566">परिशिष्ट</translation>
 <translation id="5788275253279308023">गुप्‍त विंडो, <ph name="TITLE" />, टैब</translation>
 <translation id="5805940204952508776">दो उंगलियों से टैप करें</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">फ़ॉर्म</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{बैकस्लैश}one{# बैकस्लैश}other{# बैकस्लैश}}</translation>
 <translation id="6017514345406065928">हरा</translation>
-<translation id="6021969570711251331">इंटरलीव</translation>
 <translation id="6034000775414344507">हल्का भूरा</translation>
 <translation id="6037602951055904232">आगे की ओर पैन करें</translation>
 <translation id="6042826534790431634">चालू करने के लिए Search+Space दबाएं.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, मेन्यू</translation>
 <translation id="6444046323172968959">सूचना डॉयलॉग</translation>
 <translation id="6452403590345320472">विषय सूची</translation>
-<translation id="6454456397828627257">साथ-साथ</translation>
 <translation id="6459511626086141404">फ़्लैट कीमैप</translation>
 <translation id="6468049171101508116">अगला बटन</translation>
 <translation id="646954774886932461">इंडेक्स</translation>
@@ -1092,7 +1088,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8183813379996435469">ChromeVox भाषा का अपने आप पता लगाएं और बदलें.</translation>
 <translation id="8184828902145951186">पंक्ति</translation>
-<translation id="8186185314313222077">पूर्ण स्‍क्रीन टॉगल करें</translation>
+<translation id="8186185314313222077">फ़ुल स्‍क्रीन टॉगल करें</translation>
 <translation id="8199231515320852133">वर्तमान सेल के शीर्षलेखों को प्रदर्शित करें</translation>
 <translation id="8202174735952881587">आसमानी नीला</translation>
 <translation id="820417203470636242">खाली सेल.</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
index cbb566344..702e5b3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Nema prethodnog navoda bloka.</translation>
 <translation id="1321576897702511272">Sakrij pomoć za ChromeVox</translation>
 <translation id="1325946044405407859">Boja kože</translation>
-<translation id="1331634987653814322">Postavke za brajicu</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> od <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">odjek znakova i riječi</translation>
 <translation id="1334570596456017464">Indeks</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Interna veza</translation>
 <translation id="4915087353619183190">Pokretanje načina vodiča. Pritisnite tipku qwerty tipkovnice, tipku brajevog retka s mogućnošću osvježavanja ili pokret dodira da biste saznali njezinu funkciju. Pritisnite tipku Control i "w" ili Esc za zatvaranje.</translation>
 <translation id="492295894462528572">Predgovor</translation>
-<translation id="4943781537993885772">Stil prikaza</translation>
 <translation id="495170559598752135">Radnje</translation>
 <translation id="4953585991029886728">Uređivanje teksta</translation>
 <translation id="4954534434583049121">Prethodni blok citata</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Obrazac</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{kosa crta ulijevo}one{# kosa crta ulijevo}few{# kose crte ulijevo}other{# kosih crta ulijevo}}</translation>
 <translation id="6017514345406065928">Zelena</translation>
-<translation id="6021969570711251331">Kombinirani prikaz</translation>
 <translation id="6034000775414344507">Svijetlosiva</translation>
 <translation id="6037602951055904232">Pomiči se prema naprijed</translation>
 <translation id="6042826534790431634">Za aktiviranje pritisnite tipku za pretraživanje i razmaknicu.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, izbornik</translation>
 <translation id="6444046323172968959">Dijaloški okvir upozorenja</translation>
 <translation id="6452403590345320472">Sadržaj</translation>
-<translation id="6454456397828627257">Jedno uz drugo</translation>
 <translation id="6459511626086141404">Plošna karta tipkovnice</translation>
 <translation id="6468049171101508116">Sljedeći gumb</translation>
 <translation id="646954774886932461">Indeks</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
index 0c9c1fa..f65c276 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Nincs előző bekezdésszintű idézet.</translation>
 <translation id="1321576897702511272">ChromeVox súgójának elrejtése</translation>
 <translation id="1325946044405407859">Cserszín</translation>
-<translation id="1331634987653814322">Braille-beállítások</translation>
 <translation id="1331702245475014624"><ph name="INDEX" />/<ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">karakterek és szavak visszaolvasása</translation>
 <translation id="1334570596456017464">Alsó index</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Belső link</translation>
 <translation id="4915087353619183190">A Tanuló mód indítása. Nyomja le a kívánt gombot az eszköz billentyűzetén, a frissíthető Braille-billentyűzeten, vagy válassza ki a kívánt érintési kézmozdulatot, ha szeretné megtanulni a funkcióját. A kilépéshez nyomja le a Control és a W vagy az Escape gombot.</translation>
 <translation id="492295894462528572">Előszó</translation>
-<translation id="4943781537993885772">Megjelenítés stílusa</translation>
 <translation id="495170559598752135">Műveletek</translation>
 <translation id="4953585991029886728">Szöveg szerkesztése</translation>
 <translation id="4954534434583049121">Előző idézetblokk</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Űrlap</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{fordított törtvonal}other{# fordított törtvonal}}</translation>
 <translation id="6017514345406065928">Zöld</translation>
-<translation id="6021969570711251331">Közbeékelt</translation>
 <translation id="6034000775414344507">Világosszürke</translation>
 <translation id="6037602951055904232">Pászt előre</translation>
 <translation id="6042826534790431634">Az aktiváláshoz nyomja le a Keresés+szóköz billentyűparancsot.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menü</translation>
 <translation id="6444046323172968959">Értesítő párbeszédpanel</translation>
 <translation id="6452403590345320472">Tartalomjegyzék</translation>
-<translation id="6454456397828627257">Egymás mellett</translation>
 <translation id="6459511626086141404">Sima billentyűzetkiosztás</translation>
 <translation id="6468049171101508116">Tovább gomb</translation>
 <translation id="646954774886932461">Tárgymutató</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
index ab6c329..6217a2b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Tidak ada blockquote sebelumnya.</translation>
 <translation id="1321576897702511272">Menyembunyikan bantuan ChromeVox</translation>
 <translation id="1325946044405407859">Tan</translation>
-<translation id="1331634987653814322">Setelan Braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> dari <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">pengulangan karakter dan kata</translation>
 <translation id="1334570596456017464">Subskrip</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Tautan internal</translation>
 <translation id="4915087353619183190">Memulai Mode Belajar. Tekan tombol qwerty, tombol braille yang dapat dimuat ulang, atau sentuh gestur untuk mempelajari fungsinya. Tekan tombol Ctrl plus tombol W atau escape untuk keluar.</translation>
 <translation id="492295894462528572">Kata pengantar</translation>
-<translation id="4943781537993885772">Gaya Tampilan</translation>
 <translation id="495170559598752135">Tindakan</translation>
 <translation id="4953585991029886728">Edit teks</translation>
 <translation id="4954534434583049121">Blockquote sebelumnya</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formulir</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{garis miring terbalik}other{# garis miring terbalik}}</translation>
 <translation id="6017514345406065928">Hijau</translation>
-<translation id="6021969570711251331">Dipisahkan</translation>
 <translation id="6034000775414344507">Abu-abu Muda</translation>
 <translation id="6037602951055904232">Geser ke depan</translation>
 <translation id="6042826534790431634">Tekan Search+Space untuk mengaktifkan.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Dialog notifikasi</translation>
 <translation id="6452403590345320472">Daftar isi</translation>
-<translation id="6454456397828627257">Berdampingan</translation>
 <translation id="6459511626086141404">Peta tombol datar</translation>
 <translation id="6468049171101508116">Tombol berikutnya</translation>
 <translation id="646954774886932461">Indeks</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
index 0f5231bf..4b4dae2d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Nessuna citazione lunga precedente.</translation>
 <translation id="1321576897702511272">Nascondi guida di ChromeVox</translation>
 <translation id="1325946044405407859">Marrone chiaro</translation>
-<translation id="1331634987653814322">Impostazioni Braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> di <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">eco caratteri e parole</translation>
 <translation id="1334570596456017464">Pedice</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Link interno</translation>
 <translation id="4915087353619183190">Avvio modalità di apprendimento in corso. Premi un tasto Qwerty o un tasto braille aggiornabile oppure esegui un gesto tattile per imparare come funziona. Premi CTRL + W o ESC per uscire.</translation>
 <translation id="492295894462528572">Premessa</translation>
-<translation id="4943781537993885772">Stile del display</translation>
 <translation id="495170559598752135">Azioni</translation>
 <translation id="4953585991029886728">Modifica testo</translation>
 <translation id="4954534434583049121">Citazione lunga precedente</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Modulo</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{barra rovesciata}other{# barre rovesciate}}</translation>
 <translation id="6017514345406065928">Verde</translation>
-<translation id="6021969570711251331">Interfoliazione</translation>
 <translation id="6034000775414344507">Grigio chiaro</translation>
 <translation id="6037602951055904232">Panoramica avanti</translation>
 <translation id="6042826534790431634">Premi il tasto per la ricerca + barra spaziatrice per attivare.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Finestra di avviso</translation>
 <translation id="6452403590345320472">Sommario</translation>
-<translation id="6454456397828627257">Affiancato</translation>
 <translation id="6459511626086141404">Mappa di chiavi di tipo "flat"</translation>
 <translation id="6468049171101508116">Pulsante Avanti</translation>
 <translation id="646954774886932461">Indice</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
index 540da8fc..e86e6ac 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">‏אין blockquote קודם.</translation>
 <translation id="1321576897702511272">‏הסתר עזרה של ChromeVox</translation>
 <translation id="1325946044405407859">חום צהבהב</translation>
-<translation id="1331634987653814322">הגדרות ברייל</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> מתוך <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">הד תו ומילה</translation>
 <translation id="1334570596456017464">כתב תחתי</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">קישור פנימי</translation>
 <translation id="4915087353619183190">‏הפעלה של מצב למידה. הקשה על מקש במקלדת qwerty, מקש ברייל בתצוגה הניתנת לרענון או ביצוע תנועת מגע יציגו את הפעולה המבוצעת. כדי לצאת יש להקיש על Control יחד עם W, או על מקש Esc.</translation>
 <translation id="492295894462528572">פתח דבר</translation>
-<translation id="4943781537993885772">סגנון תצוגה</translation>
 <translation id="495170559598752135">פעולות</translation>
 <translation id="4953585991029886728">ערוך טקסט</translation>
 <translation id="4954534434583049121">‏Blockquote הקודם</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">טופס</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{קו נטוי שמאלי}two{# סימני קו נטוי שמאלי}many{# סימני קו נטוי שמאלי}other{# סימני קו נטוי שמאלי}}</translation>
 <translation id="6017514345406065928">ירוק</translation>
-<translation id="6021969570711251331">משולב</translation>
 <translation id="6034000775414344507">אפור בהיר</translation>
 <translation id="6037602951055904232">הזז קדימה</translation>
 <translation id="6042826534790431634">כדי להפעיל, יש להקיש על המקשים חיפוש+רווח.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, תפריט</translation>
 <translation id="6444046323172968959">תיבת דו-שיח של התראה</translation>
 <translation id="6452403590345320472">תוכן העניינים</translation>
-<translation id="6454456397828627257">זה לצד זה</translation>
 <translation id="6459511626086141404">מפת מפתחות שטוחה</translation>
 <translation id="6468049171101508116">הלחצן הבא</translation>
 <translation id="646954774886932461">אינדקס</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
index 1a13ba9..6077dca 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">前の引用箇所はありません。</translation>
 <translation id="1321576897702511272">ChromeVox ヘルプを表示しない</translation>
 <translation id="1325946044405407859">タン</translation>
-<translation id="1331634987653814322">点字の設定</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" /> 分 の <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">文字と単語の読み上げ</translation>
 <translation id="1334570596456017464">下付き文字</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">内部リンク</translation>
 <translation id="4915087353619183190">学習モードを開始しました。QWERTY キーまたは点字キーを押すか、タップ操作を行って、機能を認識させてください。終了するには Ctrl+W キーまたは Esc キーを押します。</translation>
 <translation id="492295894462528572">前書き</translation>
-<translation id="4943781537993885772">表示スタイル</translation>
 <translation id="495170559598752135">操作</translation>
 <translation id="4953585991029886728">テキスト編集</translation>
 <translation id="4954534434583049121">前の引用文</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">フォーム</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{バックスラッシュ}other{# 個のバックスラッシュ}}</translation>
 <translation id="6017514345406065928">緑</translation>
-<translation id="6021969570711251331">インターリーブ</translation>
 <translation id="6034000775414344507">ライトグレー</translation>
 <translation id="6037602951055904232">前方にパンします</translation>
 <translation id="6042826534790431634">検索+スペースキーで有効にします。</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />、メニュー</translation>
 <translation id="6444046323172968959">アラート ダイアログ</translation>
 <translation id="6452403590345320472">目次</translation>
-<translation id="6454456397828627257">横並び</translation>
 <translation id="6459511626086141404">フラット キーマップ</translation>
 <translation id="6468049171101508116">次のボタン</translation>
 <translation id="646954774886932461">索引</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
index dd9d8f3a..67c3a3ed 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">ಹಿಂದಿನ ಬ್ಲಾಕ್‌ಕೋಟ್ ಇಲ್ಲ.</translation>
 <translation id="1321576897702511272">ChromeVox ಸಹಾಯವನ್ನು ಮರೆಮಾಡಿ</translation>
 <translation id="1325946044405407859">ಟ್ಯಾನ್</translation>
-<translation id="1331634987653814322">ಬ್ರೈಲ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" /> / <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">ಅಕ್ಷರ ಮತ್ತು ಪದ ಇಕೋ</translation>
 <translation id="1334570596456017464">ಸಬ್‌ಸ್ಕ್ರಿಪ್ಟ್</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">ಆಂತರಿಕ ಲಿಂಕ್</translation>
 <translation id="4915087353619183190">ಕಲಿಕೆ ಮೋಡ್ ಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತಿದೆ. ಅದರ ಕಾರ್ಯವಿಧಾನವನ್ನು ತಿಳಿದುಕೊಳ್ಳಲು qwerty ಕೀ, ರಿಫ್ರೆಶ್ ಮಾಡಬಹುದಾದ ಬ್ರೇಲ್ ಕೀಯನ್ನು ಒತ್ತಿರಿ ಅಥವಾ ಸನ್ನೆಯನ್ನು ಸ್ಪರ್ಶಿಸಿ. ನಿರ್ಗಮಿಸಲು w ಅಥವಾ escape ಜೊತೆಗೆ control ಒತ್ತಿರಿ.</translation>
 <translation id="492295894462528572">ಮುನ್ನುಡಿ</translation>
-<translation id="4943781537993885772">ಡಿಸ್‌ಪ್ಲೇ ಶೈಲಿ</translation>
 <translation id="495170559598752135">ಕ್ರಿಯೆಗಳು</translation>
 <translation id="4953585991029886728">ಪಠ್ಯ ಎಡಿಟ್ ಮಾಡಿ</translation>
 <translation id="4954534434583049121">ಹಿಂದಿನ ನಿರ್ಬಂಧನೆಯ ಖೋಟ್</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">ಫಾರ್ಮ್</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{ಬ್ಯಾಕ್‌ಸ್ಲ್ಯಾಶ್‌}one{# ಬ್ಯಾಕ್‌ಸ್ಲ್ಯಾಶ್‌ಗಳು}other{# ಬ್ಯಾಕ್‌ಸ್ಲ್ಯಾಶ್‌ಗಳು}}</translation>
 <translation id="6017514345406065928">ಹಸಿರು</translation>
-<translation id="6021969570711251331">ಒಂದರ ಮೇಲೆ ಮತ್ತೊಂದು</translation>
 <translation id="6034000775414344507">ತಿಳಿ ಬೂದು</translation>
 <translation id="6037602951055904232">ಮುಂದಕ್ಕೆ ಪ್ಯಾನ್ ಮಾಡಿ</translation>
 <translation id="6042826534790431634">ಸಕ್ರಿಯಗೊಳಿಸಲು, ಹುಡುಕಾಟ+ಸ್ಪೇಸ್ ಕೀಲಿ ಒತ್ತಿರಿ.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, ಮೆನು</translation>
 <translation id="6444046323172968959">ಎಚ್ಚರಿಕೆ ಸಂವಾದ</translation>
 <translation id="6452403590345320472">ಪರಿವಿಡಿ</translation>
-<translation id="6454456397828627257">ಅಕ್ಕ ಪಕ್ಕ</translation>
 <translation id="6459511626086141404">ಚಪ್ಪಟೆ ಕೀಮ್ಯಾಪ್</translation>
 <translation id="6468049171101508116">ಮುಂದಿನ ಬಟನ್</translation>
 <translation id="646954774886932461">ಸೂಚಿಕೆ</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
index e150219..657c9184 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">이전 인용구가 없습니다.</translation>
 <translation id="1321576897702511272">ChromeVox 도움말 숨기기</translation>
 <translation id="1325946044405407859">탠</translation>
-<translation id="1331634987653814322">점자 설정</translation>
 <translation id="1331702245475014624"><ph name="INDEX" />/<ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">문자 및 단어 에코</translation>
 <translation id="1334570596456017464">아래 첨자</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">내부 링크</translation>
 <translation id="4915087353619183190">학습 모드를 시작합니다. 쿼티 키, 새로고침할 수 있는 점자 키, 터치 동작을 눌러 기능을 확인하세요. Control 키와 W를 누르거나 Esc 키로 종료하세요.</translation>
 <translation id="492295894462528572">서문</translation>
-<translation id="4943781537993885772">표시 스타일</translation>
 <translation id="495170559598752135">작업</translation>
 <translation id="4953585991029886728">텍스트 수정</translation>
 <translation id="4954534434583049121">이전 블록 인용</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">양식</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{역슬래시}other{역슬래시 #개}}</translation>
 <translation id="6017514345406065928">녹색</translation>
-<translation id="6021969570711251331">인터리브</translation>
 <translation id="6034000775414344507">연한 회색</translation>
 <translation id="6037602951055904232">앞으로 이동</translation>
 <translation id="6042826534790431634">활성화하려면 Search + Space를 누르세요.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, 메뉴</translation>
 <translation id="6444046323172968959">알림 대화상자</translation>
 <translation id="6452403590345320472">목차</translation>
-<translation id="6454456397828627257">나란히</translation>
 <translation id="6459511626086141404">플랫 키맵</translation>
 <translation id="6468049171101508116">다음 버튼</translation>
 <translation id="646954774886932461">색인</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
index f62ba0d..6e54747 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Nėra ankstesnės įtraukos.</translation>
 <translation id="1321576897702511272">Slėpti „ChromeVox“ pagalbą</translation>
 <translation id="1325946044405407859">Gelsvai ruda spalva</translation>
-<translation id="1331634987653814322">Brailio rašmenų nustatymai</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> iš <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">simbolio ir žodžio aidas</translation>
 <translation id="1334570596456017464">Apatinis indeksas</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Vidinė nuoroda</translation>
 <translation id="4915087353619183190">Paleidžiamas mokomasis režimas. Paspauskite QWERTY klavišą, atnaujinamą Brailio rašto klavišą arba liečiamąjį gestą, kad sužinotumėte, kaip tai veikia. Paspauskite „Control“ ir w arba „Escape“, kad išeitumėte.</translation>
 <translation id="492295894462528572">Pratarmė</translation>
-<translation id="4943781537993885772">Rodymo stilius</translation>
 <translation id="495170559598752135">Veiksmai</translation>
 <translation id="4953585991029886728">Redaguoti tekstą</translation>
 <translation id="4954534434583049121">Ankstesnė įtrauka</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Forma</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{kairinis brūkšnys}one{# kairinis brūkšnys}few{# kairiniai brūkšniai}many{# backslashes}other{# kairinių brūkšnių}}</translation>
 <translation id="6017514345406065928">Žalia</translation>
-<translation id="6021969570711251331">Intarpuojama</translation>
 <translation id="6034000775414344507">Šviesiai pilka</translation>
 <translation id="6037602951055904232">Stumti pirmyn</translation>
 <translation id="6042826534790431634">Kad suaktyvintumėte, paspauskite paieškos ir tarpo klavišus.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, meniu</translation>
 <translation id="6444046323172968959">Įspėjimo dialogo langas</translation>
 <translation id="6452403590345320472">Turinys</translation>
-<translation id="6454456397828627257">Šalia</translation>
 <translation id="6459511626086141404">Plokščiasis klavišų žemėlapis</translation>
 <translation id="6468049171101508116">Kitas mygtukas</translation>
 <translation id="646954774886932461">Rodyklė</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
index 9742c9d..23629bf 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Iepriekš nav neviena citāta bloka.</translation>
 <translation id="1321576897702511272">Slēpt ChromeVox palīdzību</translation>
 <translation id="1325946044405407859">Gaiši brūna</translation>
-<translation id="1331634987653814322">Braila raksta iestatījumi</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> no <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">rakstzīmju un vārdu atbalss</translation>
 <translation id="1334570596456017464">Apakšrakstā</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Iekšējā saite</translation>
 <translation id="4915087353619183190">Notiek mācību režīma aktivizēšana. Lai uzzinātu par šajā režīmā pieejamajām funkcijām, nospiediet Qwerty taustiņu vai atsvaidzināma Braila raksta taustiņu vai arī veiciet kādu žestu. Lai izietu, nospiediet taustiņu kombināciju Ctrl+W vai nospiediet taustiņu Esc.</translation>
 <translation id="492295894462528572">Priekšvārds</translation>
-<translation id="4943781537993885772">Attēlojuma stils</translation>
 <translation id="495170559598752135">Darbības</translation>
 <translation id="4953585991029886728">Rediģējams teksts</translation>
 <translation id="4954534434583049121">Iepriekšējais citāta bloks</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Veidlapa</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{atpakaļvērstā slīpsvītra}zero{# atpakaļvērsto slīpsvītru}one{# atpakaļvērstā slīpsvītra}other{# atpakaļvērstās slīpsvītras}}</translation>
 <translation id="6017514345406065928">Zaļa</translation>
-<translation id="6021969570711251331">Slāņains</translation>
 <translation id="6034000775414344507">Gaiši pelēka</translation>
 <translation id="6037602951055904232">Pārvietot uz priekšu</translation>
 <translation id="6042826534790431634">Lai aktivizētu vienumu, vienlaikus nospiediet meklēšanas un atstarpes taustiņu.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, izvēlne</translation>
 <translation id="6444046323172968959">Brīdinājuma dialoglodziņš</translation>
 <translation id="6452403590345320472">Satura rādītājs</translation>
-<translation id="6454456397828627257">Līdzās</translation>
 <translation id="6459511626086141404">Izplātā taustiņu piesaiste</translation>
 <translation id="6468049171101508116">Nākamā poga</translation>
 <translation id="646954774886932461">Rādītājs</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
index 029dc935..b0b4f829 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">മുൻ ബ്ലോക്ക്ക്വോട്ട് ഒന്നുമില്ല.</translation>
 <translation id="1321576897702511272">ChromeVox സഹായം മറയ്ക്കുക</translation>
 <translation id="1325946044405407859">തവിട്ടുനിറം</translation>
-<translation id="1331634987653814322">ബ്രെയ്‌ലി ക്രമീകരണം</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> / <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">പ്രതീക, പദ എക്കോ</translation>
 <translation id="1334570596456017464">സബ്‌സ്‌ക്രി‌പ്‌റ്റ്</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">ആന്തരിക ലിങ്ക്</translation>
 <translation id="4915087353619183190">'അറിയുക മോഡ്' ആരംഭിക്കുന്നു. ഇതിന്‍റെ പ്രവർത്തനം പഠിക്കാൻ ക്വെട്ടി കീയോ പുതുക്കിയെടുക്കാനാവുന്ന ബ്രെയ്‌ലി കീയോ അമർത്തുകയോ വിരൽ ഉപയോഗിച്ച് സ്‌പർശിക്കുകയോ ചെയ്യുക. പുറത്ത് കടക്കാൻ കൺട്രോൾ, w എന്നീ കീകൾ ഒരുമിച്ച് അമർത്തുകയോ എസ്‌കേപ്പ് കീ അമർത്തുകയോ ചെയ്യുക.</translation>
 <translation id="492295894462528572">മുഖവുര</translation>
-<translation id="4943781537993885772">ഡിസ്‌പ്ലേ സ്‌റ്റൈൽ</translation>
 <translation id="495170559598752135">പ്രവര്‍ത്തനങ്ങള്‍</translation>
 <translation id="4953585991029886728">വാചകം എഡിറ്റുചെയ്യുക</translation>
 <translation id="4954534434583049121">മുൻ ബ്ലോക്ക് ഉദ്ധരണി</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">ഫോം</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{ബാക്ക്‌സ്ലാഷ്}other{# ബാക്ക്‌സ്ലാഷുകൾ}}</translation>
 <translation id="6017514345406065928">പച്ച</translation>
-<translation id="6021969570711251331">ഇടകലർന്നിരിക്കുന്നു</translation>
 <translation id="6034000775414344507">ഇളം ചാരനിറം</translation>
 <translation id="6037602951055904232">മുന്നിലേക്ക് പാൻ ചെയ്യുക</translation>
 <translation id="6042826534790431634">സജീവമാക്കാൻ തിരയൽ+സ്‌പെയ്‌സ് അമർത്തുക.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, മെനു</translation>
 <translation id="6444046323172968959">മുന്നറിയിപ്പ് ഡയലോഗ്</translation>
 <translation id="6452403590345320472">ഉള്ളടക്ക പട്ടിക</translation>
-<translation id="6454456397828627257">വശങ്ങളിലായി</translation>
 <translation id="6459511626086141404">ഫ്ലാറ്റ് കീമാപ്പ്</translation>
 <translation id="6468049171101508116">അടുത്ത ബട്ടൺ</translation>
 <translation id="646954774886932461">സൂചിക</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
index c366683..81a42ce0 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">मागील ब्लॉककोट नाही.</translation>
 <translation id="1321576897702511272">ChromeVox मदत लपवा</translation>
 <translation id="1325946044405407859">बदामी</translation>
-<translation id="1331634987653814322">ब्रेल सेटिंग्ज</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" /> पैकी <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">वर्ण आणि शब्द प्रतिध्वनी</translation>
 <translation id="1334570596456017464">सबस्क्रिप्ट</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">अंतर्गत लिंक</translation>
 <translation id="4915087353619183190">जाणून घ्या मोड सुरू होत आहे. त्याच्या कार्याबद्दल जाणून घेण्यासाठी qwerty की दाबा, रिफ्रेश करण्यायोग्य ब्रेल की किंवा टच जेश्चर दाबा. बाहेर पडण्यासाठी कंट्रोल की सह डब्ल्यू किंवा एस्केप दाबा.</translation>
 <translation id="492295894462528572">प्रस्तावना</translation>
-<translation id="4943781537993885772">डिस्प्ले शैली</translation>
 <translation id="495170559598752135">क्रिया</translation>
 <translation id="4953585991029886728">मजकूर संपादित करा</translation>
 <translation id="4954534434583049121">मागील ब्लॉक कोट</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">फॉर्म</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{बॅकस्लॅश}other{# बॅकस्लॅश}}</translation>
 <translation id="6017514345406065928">हिरवा</translation>
-<translation id="6021969570711251331">एकावर एक</translation>
 <translation id="6034000775414344507">फिकट राखाडी</translation>
 <translation id="6037602951055904232">फॉरवर्ड करणे पॅन करा</translation>
 <translation id="6042826534790431634">सक्रिय करण्यासाठी Search+Space दाबा.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, मेनू</translation>
 <translation id="6444046323172968959">सूचना डायलॉग</translation>
 <translation id="6452403590345320472">अनुक्रमणिका</translation>
-<translation id="6454456397828627257">शेजारी शेजारी</translation>
 <translation id="6459511626086141404">सपाट मुख्य नकाशा</translation>
 <translation id="6468049171101508116">पुढील बटण</translation>
 <translation id="646954774886932461">अनुक्रमणिका</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
index a6a0d8b..2497e16 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Tiada petikan blok terdahulu.</translation>
 <translation id="1321576897702511272">Sembunyikan bantuan ChromeVox</translation>
 <translation id="1325946044405407859">Sawo Matang</translation>
-<translation id="1331634987653814322">Tetapan Braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> daripada <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">gema aksara dan perkataan</translation>
 <translation id="1334570596456017464">Subskrip</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Pautan dalaman</translation>
 <translation id="4915087353619183190">Memulakan Mod Belajar. Tekan kekunci qwerty, kekunci braille boleh dimuat semula atau sentuh gerak isyarat untuk mengetahui fungsinya. Tekan kawalan dengan kekunci w atau escape untuk keluar.</translation>
 <translation id="492295894462528572">Kata pengantar</translation>
-<translation id="4943781537993885772">Gaya Paparan</translation>
 <translation id="495170559598752135">Tindakan</translation>
 <translation id="4953585991029886728">Edit teks</translation>
 <translation id="4954534434583049121">Petikan blok sebelumnya</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Borang</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{garis condong songsang}other{# garis condong songsang}}</translation>
 <translation id="6017514345406065928">Hijau</translation>
-<translation id="6021969570711251331">Antara lembar</translation>
 <translation id="6034000775414344507">Kelabu Cerah</translation>
 <translation id="6037602951055904232">Sorot ke hadapan</translation>
 <translation id="6042826534790431634">Tekan Search+Space untuk mengaktifkan.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271">Menu, <ph name="NAME" /></translation>
 <translation id="6444046323172968959">Dialog makluman</translation>
 <translation id="6452403590345320472">Kandungan</translation>
-<translation id="6454456397828627257">Bersebelahan</translation>
 <translation id="6459511626086141404">Peta kekunci datar</translation>
 <translation id="6468049171101508116">Butang seterusnya</translation>
 <translation id="646954774886932461">Indeks</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
index 66777d2..53e4bca 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Geen vorig blok met geciteerde tekst.</translation>
 <translation id="1321576897702511272">Help van ChromeVox verbergen</translation>
 <translation id="1325946044405407859">Geelbruin</translation>
-<translation id="1331634987653814322">Braille-instellingen</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> van <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">teken- en woordecho</translation>
 <translation id="1334570596456017464">Subscript</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Interne link</translation>
 <translation id="4915087353619183190">Leermodus starten. Druk op een QWERTY-toets, een vernieuwbare brailletoets of tik op een gebaar om de functie ervan te leren. Druk op Control en W of Escape om af te sluiten.</translation>
 <translation id="492295894462528572">Voorwoord</translation>
-<translation id="4943781537993885772">Weergavestijl</translation>
 <translation id="495170559598752135">Acties</translation>
 <translation id="4953585991029886728">Tekst bewerken</translation>
 <translation id="4954534434583049121">Vorig blok met geciteerde tekst</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Formulier</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{backslash}other{# backslashes}}</translation>
 <translation id="6017514345406065928">Groen</translation>
-<translation id="6021969570711251331">Interleave</translation>
 <translation id="6034000775414344507">Lichtgrijs</translation>
 <translation id="6037602951055904232">Vooruit schuiven</translation>
 <translation id="6042826534790431634">Druk op de zoektoets en de spatiebalk om te activeren.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Dialoogvenster voor meldingen</translation>
 <translation id="6452403590345320472">Inhoudsopgave</translation>
-<translation id="6454456397828627257">Naast elkaar</translation>
 <translation id="6459511626086141404">Platte toetsenbordindeling</translation>
 <translation id="6468049171101508116">Volgende knop</translation>
 <translation id="646954774886932461">Index</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
index a24b31a..735a66b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Det finnes ingen tidligere blokksitat-elementer.</translation>
 <translation id="1321576897702511272">Skjul hjelp for ChromeVox</translation>
 <translation id="1325946044405407859">Gyllenbrun</translation>
-<translation id="1331634987653814322">Punktskriftsinnstillinger</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> av <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">tegn- og ordekko</translation>
 <translation id="1334570596456017464">Senket skrift</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Intern link</translation>
 <translation id="4915087353619183190">Starter læremodus. Trykk på en qwerty-tast, en dynamisk punktskrifttast eller en berøringshandling for å lære den tilhørende funksjonen. Trykk på Ctrl + W eller Esc for å avslutte.</translation>
 <translation id="492295894462528572">Forord</translation>
-<translation id="4943781537993885772">Visningsstil</translation>
 <translation id="495170559598752135">Handlinger</translation>
 <translation id="4953585991029886728">Rediger teksten</translation>
 <translation id="4954534434583049121">Forrige blokksitat</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Skjema</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{omvendt skråstrek}other{# omvendte skråstreker}}</translation>
 <translation id="6017514345406065928">Grønn</translation>
-<translation id="6021969570711251331">Innfelt</translation>
 <translation id="6034000775414344507">Lysegrå</translation>
 <translation id="6037602951055904232">Panorer frem</translation>
 <translation id="6042826534790431634">Trykk på Søk + mellomrom for å aktivere.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, meny</translation>
 <translation id="6444046323172968959">Varseldialog</translation>
 <translation id="6452403590345320472">Innhold</translation>
-<translation id="6454456397828627257">Side ved side</translation>
 <translation id="6459511626086141404">Flatt tastaturoppsett</translation>
 <translation id="6468049171101508116">Neste-knappen</translation>
 <translation id="646954774886932461">Stikkordregister</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
index f9e1a30..ea94a17 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Brak poprzedniego cytatu blokowego.</translation>
 <translation id="1321576897702511272">Ukryj pomoc dotyczącą ChromeVox</translation>
 <translation id="1325946044405407859">Pastelowobrązowy</translation>
-<translation id="1331634987653814322">Ustawienia brajla</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> z <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">odczytywanie znaków i słów</translation>
 <translation id="1334570596456017464">Indeks dolny</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Link wewnętrzny</translation>
 <translation id="4915087353619183190">Włączam tryb informacyjny. Naciśnij klawisz na klawiaturze QWERTY lub na monitorze brajlowskim albo wykonaj gest dotykowy, by poznać jego funkcję. Przytrzymaj Control i naciśnij W lub Escape, by wyłączyć tryb informacyjny.</translation>
 <translation id="492295894462528572">Przedmowa</translation>
-<translation id="4943781537993885772">Styl wyświetlania</translation>
 <translation id="495170559598752135">Czynności</translation>
 <translation id="4953585991029886728">Edytowanie tekstu</translation>
 <translation id="4954534434583049121">Poprzedni cytat blokowy</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formularz</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{ukośnik wsteczny}few{# ukośniki wsteczne}many{# ukośników wstecznych}other{# backslashes}}</translation>
 <translation id="6017514345406065928">Zielony</translation>
-<translation id="6021969570711251331">Łączony</translation>
 <translation id="6034000775414344507">Jasnoszary</translation>
 <translation id="6037602951055904232">Przesuń do przodu</translation>
 <translation id="6042826534790431634">Naciśnij klawisz wyszukiwania + spację, aby aktywować.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Okno dialogowe alertu</translation>
 <translation id="6452403590345320472">Spis treści</translation>
-<translation id="6454456397828627257">Obok siebie</translation>
 <translation id="6459511626086141404">Płaska mapa klawiszy</translation>
 <translation id="6468049171101508116">Następny przycisk</translation>
 <translation id="646954774886932461">Indeks</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
index 5d4c7a9a..d6abff6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-BR.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Nenhum bloco de texto anterior.</translation>
 <translation id="1321576897702511272">Ocultar ajuda do ChromeVox</translation>
 <translation id="1325946044405407859">Castanho-claro</translation>
-<translation id="1331634987653814322">Configurações de braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> de <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">eco de caractere e de palavra</translation>
 <translation id="1334570596456017464">Subscrito</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Link interno</translation>
 <translation id="4915087353619183190">Iniciando o modo de aprendizado. Pressione uma tecla do QWERTY, tecla de braille atualizável ou um gesto de toque para aprender a função relacionada. Pressione Control com W ou ESC para sair.</translation>
 <translation id="492295894462528572">Prefácio</translation>
-<translation id="4943781537993885772">Estilo de exibição</translation>
 <translation id="495170559598752135">Ações</translation>
 <translation id="4953585991029886728">Texto de edição</translation>
 <translation id="4954534434583049121">Citação em bloco anterior</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formulário</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{barra invertida}one{# barras invertidas}other{# barras invertidas}}</translation>
 <translation id="6017514345406065928">Verde</translation>
-<translation id="6021969570711251331">Intercalado</translation>
 <translation id="6034000775414344507">Cinza-claro</translation>
 <translation id="6037602951055904232">Mover para a frente</translation>
 <translation id="6042826534790431634">Pressione Pesquisar+Espaço para ativar.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271">Menu <ph name="NAME" /></translation>
 <translation id="6444046323172968959">Diálogo de alerta</translation>
 <translation id="6452403590345320472">Índice</translation>
-<translation id="6454456397828627257">Lado a lado</translation>
 <translation id="6459511626086141404">Keymap plano</translation>
 <translation id="6468049171101508116">Próximo botão</translation>
 <translation id="646954774886932461">Índice</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
index 84f6703..8df3919 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pt-PT.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Não existe nenhum blockquote anterior.</translation>
 <translation id="1321576897702511272">Ocultar ajuda do ChromeVox</translation>
 <translation id="1325946044405407859">Bronzeado</translation>
-<translation id="1331634987653814322">Definições de Braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> de <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">eco do caráter e da palavra</translation>
 <translation id="1334570596456017464">Inferior à linha</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Link interno</translation>
 <translation id="4915087353619183190">A iniciar o Modo de aprendizagem… Prima uma tecla do teclado de esquema QWERTY, uma tecla de braille atualizável ou utilize um gesto de toque para conhecer a respetiva função. Prima control com w ou escape para sair.</translation>
 <translation id="492295894462528572">Prefácio</translation>
-<translation id="4943781537993885772">Estilo de visualização</translation>
 <translation id="495170559598752135">Ações</translation>
 <translation id="4953585991029886728">Editar texto</translation>
 <translation id="4954534434583049121">Blockquote anterior</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formulário</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{barra invertida}other{# barras invertidas}}</translation>
 <translation id="6017514345406065928">Verde</translation>
-<translation id="6021969570711251331">Intercalar</translation>
 <translation id="6034000775414344507">Cinzento-claro</translation>
 <translation id="6037602951055904232">Deslocar para a frente</translation>
 <translation id="6042826534790431634">Prima Pesquisar + Espaço para ativar.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Caixa de diálogo de alerta</translation>
 <translation id="6452403590345320472">Índice</translation>
-<translation id="6454456397828627257">Lado a lado</translation>
 <translation id="6459511626086141404">Mapa de teclas simples</translation>
 <translation id="6468049171101508116">Botão seguinte</translation>
 <translation id="646954774886932461">Índice</translation>
@@ -1155,7 +1151,7 @@
 <translation id="8743786158317878347">inserir o conteúdo estruturado, por exemplo, tabelas</translation>
 <translation id="8747966237988593539">Lista ordenada</translation>
 <translation id="8749988712346667988">Prateado</translation>
-<translation id="875769700429317857">Transferência de <ph name="FILE_NAME" /> concluída</translation>
+<translation id="875769700429317857">A transferência de <ph name="FILE_NAME" /> foi concluída</translation>
 <translation id="8759334257841767240">Não existe nenhum link seguinte.</translation>
 <translation id="8767968232364267681">Título de nível 4 seguinte</translation>
 <translation id="8770473310765924354">sair do conteúdo estruturado, por exemplo, tabelas</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
index 57b558d2..3dd2495a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Nu există un blockquote anterior.</translation>
 <translation id="1321576897702511272">Ascundeți ajutorul pentru ChromeVox</translation>
 <translation id="1325946044405407859">Bronz</translation>
-<translation id="1331634987653814322">Setări braille</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> din <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">ecou caracter și cuvânt</translation>
 <translation id="1334570596456017464">Indice</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Link intern</translation>
 <translation id="4915087353619183190">Începe modul de învățare. Apasă o tastă qwerty, o tastă Braille actualizabilă sau un gest de atingere pentru a-i învăța funcția. Apasă tasta Control împreună cu w sau Esc pentru a ieși.</translation>
 <translation id="492295894462528572">Cuvânt înainte</translation>
-<translation id="4943781537993885772">Stil de afișare</translation>
 <translation id="495170559598752135">Acțiuni</translation>
 <translation id="4953585991029886728">Câmp text de editare</translation>
 <translation id="4954534434583049121">Citatul anterior</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formular</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{bară oblică inversă}few{# bare oblice inverse}other{# de bare oblice inverse}}</translation>
 <translation id="6017514345406065928">Verde</translation>
-<translation id="6021969570711251331">Intercalat</translation>
 <translation id="6034000775414344507">Gri deschis</translation>
 <translation id="6037602951055904232">Deplasează înainte</translation>
 <translation id="6042826534790431634">Apasă pe tasta de căutare + tasta spațiu pentru a activa.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, meniu</translation>
 <translation id="6444046323172968959">Casetă de dialog de alertă</translation>
 <translation id="6452403590345320472">Cuprins</translation>
-<translation id="6454456397828627257">Alăturat</translation>
 <translation id="6459511626086141404">Hartă taste plată</translation>
 <translation id="6468049171101508116">Butonul următor</translation>
 <translation id="646954774886932461">Index</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
index 577f5f9..32ededa 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Предыдущей цитаты нет.</translation>
 <translation id="1321576897702511272">Скрыть справку ChromeVox</translation>
 <translation id="1325946044405407859">Дубильная кора</translation>
-<translation id="1331634987653814322">Настройки шрифта Брайля</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> из <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">Озвучивание символов и слов.</translation>
 <translation id="1334570596456017464">Подстрочный</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Внутренняя ссылка.</translation>
 <translation id="4915087353619183190">Запускается режим обучения. Нажмите клавишу или коснитесь изображения жеста, чтобы узнать, какую функцию они выполняют. Вы можете использовать как стандартную, так и брайлевскую клавиатуру. Для выхода нажмите Ctrl + W или клавишу Esc.</translation>
 <translation id="492295894462528572">Предисловие</translation>
-<translation id="4943781537993885772">Стиль дисплея</translation>
 <translation id="495170559598752135">Действия</translation>
 <translation id="4953585991029886728">Изменение текста</translation>
 <translation id="4954534434583049121">Перейти к предыдущей цитате</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Форма</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{обратная косая черта}one{# обратная косая черта}few{# обратные косые черты}many{# обратных косых черт}other{# backslashes}}</translation>
 <translation id="6017514345406065928">Зеленый</translation>
-<translation id="6021969570711251331">Чередующийся</translation>
 <translation id="6034000775414344507">Светло-серый</translation>
 <translation id="6037602951055904232">Перейти вперед</translation>
 <translation id="6042826534790431634">Чтобы активировать элемент, нажмите Поиск + Пробел.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271">Меню "<ph name="NAME" />"</translation>
 <translation id="6444046323172968959">Диалоговое окно оповещения</translation>
 <translation id="6452403590345320472">Содержание</translation>
-<translation id="6454456397828627257">Параллельный</translation>
 <translation id="6459511626086141404">Обычная раскладка</translation>
 <translation id="6468049171101508116">Перейти к следующей кнопке</translation>
 <translation id="646954774886932461">Указатель</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
index 19daa8ca..1b44748 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Žiadny predchádzajúci prvok blockquote</translation>
 <translation id="1321576897702511272">Skryť pomocníka rozšírenia ChromeVox</translation>
 <translation id="1325946044405407859">Okrová</translation>
-<translation id="1331634987653814322">Nastavenia Braillovho písma</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> z <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">zvuková odozva na znaky a slová</translation>
 <translation id="1334570596456017464">Dolný index</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Interný odkaz</translation>
 <translation id="4915087353619183190">Spúšťa sa režim učenia. Ak sa chcete dozvedieť viac o jeho funkciách, stlačte kláves Qwerty, kláves obnoviteľného braillovho displeja alebo dotykové gesto. Ak ho chcete ukončiť, stlačte klávesy Control a W alebo Escape.</translation>
 <translation id="492295894462528572">Predhovor</translation>
-<translation id="4943781537993885772">Štýl zobrazenia</translation>
 <translation id="495170559598752135">Akcie</translation>
 <translation id="4953585991029886728">Upraviť text</translation>
 <translation id="4954534434583049121">Predchádzajúci blok citácie</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Formulár</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{opačná lomka}few{# opačné lomky}many{# backslashes}other{# opačných lomiek}}</translation>
 <translation id="6017514345406065928">Zelená</translation>
-<translation id="6021969570711251331">Prekladanie</translation>
 <translation id="6034000775414344507">Svetlosivá</translation>
 <translation id="6037602951055904232">Posunúť zobrazenie dopredu</translation>
 <translation id="6042826534790431634">Aktivujete stlačením klávesa Hľadať a medzerníka.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, ponuka</translation>
 <translation id="6444046323172968959">Dialógové okno s upozornením</translation>
 <translation id="6452403590345320472">Obsah</translation>
-<translation id="6454456397828627257">Vedľa seba</translation>
 <translation id="6459511626086141404">Plochá mapa klávesov</translation>
 <translation id="6468049171101508116">Ďalšie tlačidlo</translation>
 <translation id="646954774886932461">Index</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
index 8f3c4dff..82d6c01b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Ni prejšnjega daljšega citata.</translation>
 <translation id="1321576897702511272">Skritje pomoči za ChromeVox</translation>
 <translation id="1325946044405407859">Rumenorjava</translation>
-<translation id="1331634987653814322">Nastavitve za braillovo pisavo</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> od <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">izgovarjanje znakov in besed ob vnosu</translation>
 <translation id="1334570596456017464">Podpisano</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Notranja povezava</translation>
 <translation id="4915087353619183190">Začenjanje načina učenja. Pritisnite tipko na tipkovnici qwerty, tipko na zaslonu braille, ki omogoča osveževanje, ali potezo dotika, če želite izvedeti njeno funkcijo. Pritisnite tipko Control in tipko W ali Escape, če želite zapreti način.</translation>
 <translation id="492295894462528572">Predgovor</translation>
-<translation id="4943781537993885772">Slog prikaza</translation>
 <translation id="495170559598752135">Dejanja</translation>
 <translation id="4953585991029886728">Urejanje besedila</translation>
 <translation id="4954534434583049121">Prejšnji citat v bloku</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Obrazec</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{poševnica nazaj}one{# poševnica nazaj}two{# poševnici nazaj}few{# poševnice nazaj}other{# poševnic nazaj}}</translation>
 <translation id="6017514345406065928">Zelena</translation>
-<translation id="6021969570711251331">Prepleteno</translation>
 <translation id="6034000775414344507">Svetlo siva</translation>
 <translation id="6037602951055904232">Panoramsko premikanje naprej</translation>
 <translation id="6042826534790431634">Pritisnite tipko za iskanje + preslednico, če želite aktivirati.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271">Meni <ph name="NAME" /></translation>
 <translation id="6444046323172968959">Pogovorno okno z opozorilom</translation>
 <translation id="6452403590345320472">Kazalo</translation>
-<translation id="6454456397828627257">Vzporedno</translation>
 <translation id="6459511626086141404">Ploska razporeditev tipk</translation>
 <translation id="6468049171101508116">Gumb Naprej</translation>
 <translation id="646954774886932461">Kazalo</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
index 74950c9..5d15d40 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Нема претходног издвојеног цитата.</translation>
 <translation id="1321576897702511272">Скривање помоћи за ChromeVox</translation>
 <translation id="1325946044405407859">Жутомрка</translation>
-<translation id="1331634987653814322">Подешавања Брајеве азбуке</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> од <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">одјек знакова и речи</translation>
 <translation id="1334570596456017464">Индексни текст</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Интерни линк</translation>
 <translation id="4915087353619183190">Покрећемо режим за учење. Притисните тастер на qwerty тастатури, тастер на Брајевој тастатури који може да се освежи или обавите покрет додира да бисте сазнали његову функцију. Притисните control и w или escape да бисте изашли из њега.</translation>
 <translation id="492295894462528572">Предговор</translation>
-<translation id="4943781537993885772">Стил приказивања</translation>
 <translation id="495170559598752135">Радње</translation>
 <translation id="4953585991029886728">Измена текста</translation>
 <translation id="4954534434583049121">Претходни издвојени цитат</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Образац</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{обрнута коса црта}one{# обрнута коса црта}few{# обрнуте косе црте}other{# обрнутих косих црта}}</translation>
 <translation id="6017514345406065928">Зелена</translation>
-<translation id="6021969570711251331">Преклопљено</translation>
 <translation id="6034000775414344507">Светлосива</translation>
 <translation id="6037602951055904232">Померање унапред</translation>
 <translation id="6042826534790431634">За активирање притисните тастер за претрагу + тастер за размак.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271">Мени <ph name="NAME" /></translation>
 <translation id="6444046323172968959">Дијалог обавештења</translation>
 <translation id="6452403590345320472">Садржај</translation>
-<translation id="6454456397828627257">Упоредо</translation>
 <translation id="6459511626086141404">Равна мапа тастера</translation>
 <translation id="6468049171101508116">Следеће дугме</translation>
 <translation id="646954774886932461">Индекс</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
index 8b65e3d..20e5f423 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Det finns inget föregående citatblock.</translation>
 <translation id="1321576897702511272">Dölj hjälpen för ChromeVox</translation>
 <translation id="1325946044405407859">Mellanbrun</translation>
-<translation id="1331634987653814322">Punktskriftsinställningar</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> av <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">eko för tecken och ord</translation>
 <translation id="1334570596456017464">Nedsänkt</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Intern länk</translation>
 <translation id="4915087353619183190">Inlärningsläget startas. Tryck på en qwerty-tangent, en uppdateringsbar braille-tangent eller en skärmrörelse för att ta reda på vad den har för funktion. Tryck på Ctrl och w eller Escape när du vill avsluta.</translation>
 <translation id="492295894462528572">Förord</translation>
-<translation id="4943781537993885772">Visningsformat</translation>
 <translation id="495170559598752135">Åtgärder</translation>
 <translation id="4953585991029886728">Textinmatning</translation>
 <translation id="4954534434583049121">Föregående citatblock</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Formulär</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{bakstreck}other{# bakstreck}}</translation>
 <translation id="6017514345406065928">Grön</translation>
-<translation id="6021969570711251331">Omlott</translation>
 <translation id="6034000775414344507">Ljusgrå</translation>
 <translation id="6037602951055904232">Panorera framåt</translation>
 <translation id="6042826534790431634">Aktivera med Sök+blanksteg.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, meny</translation>
 <translation id="6444046323172968959">Varningsdialogruta</translation>
 <translation id="6452403590345320472">Innehållsförteckning</translation>
-<translation id="6454456397828627257">Sida vid sida</translation>
 <translation id="6459511626086141404">Platt tangentuppsättning</translation>
 <translation id="6468049171101508116">Nästa knapp</translation>
 <translation id="646954774886932461">Index</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
index 69ac8b0e..6266ed4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -53,7 +53,6 @@
 <translation id="1319608975892113573">Hakuna nukuu la msingi lililotangulia.</translation>
 <translation id="1321576897702511272">Ficha usaidizi wa ChromeVox</translation>
 <translation id="1325946044405407859">Hudhurungi</translation>
-<translation id="1331634987653814322">Mipangilio ya Nukta Nundu</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> kati ya <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">herufi na mwangwi wa neno</translation>
 <translation id="1334570596456017464">Herufi za chini</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Kiungo cha ndani</translation>
 <translation id="4915087353619183190">Inafungua Hali ya Kujifunza. Bonyeza kitufe cha qwerty, kitufe cha nukta nundu unachoweza kuonyesha upya au ishara ya kugusa ili ujue kazi yake. Bonyeza control pamoja na 'w' au escape ili ufunge.</translation>
 <translation id="492295894462528572">Dibaji</translation>
-<translation id="4943781537993885772">Muundo wa Onyesho</translation>
 <translation id="495170559598752135">Vitendo</translation>
 <translation id="4953585991029886728">Badilisha maandishi</translation>
 <translation id="4954534434583049121">Nukuu la msingi lililotangulia</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Fomu</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{mkwaju wa nyuma}other{mikwaju # ya nyuma}}</translation>
 <translation id="6017514345406065928">Kijani</translation>
-<translation id="6021969570711251331">Mchanganyiko</translation>
 <translation id="6034000775414344507">Kijivu Isiyokolea</translation>
 <translation id="6037602951055904232">Elekeza mbele</translation>
 <translation id="6042826534790431634">Bonyeza Search+Space ili uwashe.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menyu</translation>
 <translation id="6444046323172968959">Arifa ya mazungumzo</translation>
 <translation id="6452403590345320472">Yaliyomo</translation>
-<translation id="6454456397828627257">Upande kwa upande</translation>
 <translation id="6459511626086141404">Ramani msingi bapa</translation>
 <translation id="6468049171101508116">Kitufe kinachofuata</translation>
 <translation id="646954774886932461">Faharasa</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
index b873f20..07e3851 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">முன் மேற்கோள் குறி இல்லை</translation>
 <translation id="1321576897702511272">ChromeVox உதவியை மறை</translation>
 <translation id="1325946044405407859">டான்</translation>
-<translation id="1331634987653814322">பிரெயில் அமைப்புகள்</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" /> / <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">எழுத்து மற்றும் சொல் எதிரொலி</translation>
 <translation id="1334570596456017464">சப்ஸ்கிரிப்ட்</translation>
@@ -289,7 +288,7 @@
 <translation id="3084806535845658316">தட்டச்சிடும் எதிரொலி இல்லை</translation>
 <translation id="3086746722712840547">குறிப்பு</translation>
 <translation id="308895241372589742">அடுத்த கணிதக் கோவை இல்லை.</translation>
-<translation id="3090227230165225418">பதிவிறக்க அறிவிப்புகளைப் படிக்கும்</translation>
+<translation id="3090227230165225418">பதிவிறக்க அறிவிப்புகளைத் தெரிவிக்கும்</translation>
 <translation id="3090532668523289635">grp</translation>
 <translation id="3093176084511590672">அடுத்த லேண்ட்மார்க்</translation>
 <translation id="3096671415663099226">cbo</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">அக இணைப்பு</translation>
 <translation id="4915087353619183190">’கற்றல் பயன்முறையைத்’ தொடங்குகிறது. அதன் செயல்பாட்டைப் பற்றி அறிய, ஒரு qwerty விசையையோ புதுப்பிக்கக்கூடிய பிரெய்ல் விசையையோ அல்லது தொடு சைகையையோ அழுத்தவும். வெளியேற, 'control + w' அல்லது escape விசையை அழுத்தவும்.</translation>
 <translation id="492295894462528572">அறிமுகம்</translation>
-<translation id="4943781537993885772">காட்சிப்படுத்தும் விதம்</translation>
 <translation id="495170559598752135">செயல்கள்</translation>
 <translation id="4953585991029886728">உரையைத் திருத்து</translation>
 <translation id="4954534434583049121">முந்தைய மேற்கோள் குறி</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">படிவம்</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{பின்கோடு}other{# பின்கோடுகள்}}</translation>
 <translation id="6017514345406065928">பச்சை</translation>
-<translation id="6021969570711251331">ஒன்றன் மேல் ஒன்று</translation>
 <translation id="6034000775414344507">வெளிர் சாம்பல்</translation>
 <translation id="6037602951055904232">முன்னோக்கி நகர்த்து</translation>
 <translation id="6042826534790431634">செயல்படுத்த, தேடல்+Space விசைகளை அழுத்தவும்.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, மெனு</translation>
 <translation id="6444046323172968959">விழிப்பூட்டல் செய்தி</translation>
 <translation id="6452403590345320472">உள்ளடக்க அட்டவணை</translation>
-<translation id="6454456397828627257">அருகருகே</translation>
 <translation id="6459511626086141404">தட்டையான விசைவரைபடம்</translation>
 <translation id="6468049171101508116">அடுத்த பட்டன்</translation>
 <translation id="646954774886932461">பொருளடக்கம்</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
index 63861f7..edf70b2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">మునుపటి బ్లాక్‌కోట్ లేదు.</translation>
 <translation id="1321576897702511272">ChromeVox సహాయాన్ని దాచండి</translation>
 <translation id="1325946044405407859">లేత సింధూర రంగు</translation>
-<translation id="1331634987653814322">బ్రెయిలీ సెట్టింగ్‌లు</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" />లో <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">అక్షరం మరియు పదం అనుకరణ</translation>
 <translation id="1334570596456017464">సబ్‌స్క్రిప్ట్</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">అంతర్గత లింక్</translation>
 <translation id="4915087353619183190">తెలుసుకునే మోడ్ ప్రారంభించబడుతోంది. కనుక qwerty కీని గానీ, రిఫ్రెష్ చేయదగిన బ్రెయిలీ కీని గానీ లేదంటే, టచ్ సంజ్ఞలను గానీ నొక్కి అదెలా పని చేస్తుందో తెలుసుకోవచ్చు. w అక్షరాన్ని, కంట్రోల్ కీని కలిపి నొక్కడం లేదా ఎస్కేప్ కీని నొక్కడం గానీ చేస్తే దాని నుండి నిష్క్రమించవచ్చు.</translation>
 <translation id="492295894462528572">ముందుమాట</translation>
-<translation id="4943781537993885772">ప్రదర్శన శైలి</translation>
 <translation id="495170559598752135">చర్యలు</translation>
 <translation id="4953585991029886728">వచనాన్ని సవరించండి</translation>
 <translation id="4954534434583049121">మునుపటి బ్లాక్ కోట్</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">ఫారమ్</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{బ్యాక్‌స్లాష్ గుర్తు}other{# బ్యాక్‌స్లాష్ గుర్తులు}}</translation>
 <translation id="6017514345406065928">ఆకుపచ్చ</translation>
-<translation id="6021969570711251331">ఇంటర్‌లీవ్</translation>
 <translation id="6034000775414344507">లేత బూడిద రంగు</translation>
 <translation id="6037602951055904232">ముందుకు ప్యాన్ చేయండి</translation>
 <translation id="6042826534790431634">యాక్టివేట్ చేయడం కోసం శోధన+స్పేస్ నొక్కండి.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, మెను</translation>
 <translation id="6444046323172968959">హెచ్చరిక డైలాగ్</translation>
 <translation id="6452403590345320472">విషయ పట్టిక</translation>
-<translation id="6454456397828627257">పక్కపక్కన</translation>
 <translation id="6459511626086141404">సమతల కీమ్యాప్</translation>
 <translation id="6468049171101508116">తర్వాతి బటన్</translation>
 <translation id="646954774886932461">సూచిక</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
index 3b2b47a..d3e5819 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">ไม่มีข้อความที่ยกมาก่อนหน้า</translation>
 <translation id="1321576897702511272">ซ่อนความช่วยเหลือของ ChromeVox</translation>
 <translation id="1325946044405407859">สีแทน</translation>
-<translation id="1331634987653814322">การตั้งค่าอักษรเบรลล์</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> จาก <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">พูดอักขระและคำ</translation>
 <translation id="1334570596456017464">ตัวห้อย</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">ลิงก์ภายใน</translation>
 <translation id="4915087353619183190">กำลังเริ่มโหมดการเรียนรู้ กดแป้น QWERTY กดแป้นอักษรเบรลล์แบบรีเฟรชได้ หรือใช้ท่าทางสัมผัสด้วยการแตะเพื่อดูข้อมูลเกี่ยวกับฟังก์ชันของแป้นหรือท่าทางสัมผัสนั้น กดปุ่ม Control พร้อมกับแป้น W หรือปุ่ม Escape เพื่อออก</translation>
 <translation id="492295894462528572">คำนำ</translation>
-<translation id="4943781537993885772">รูปแบบที่แสดง</translation>
 <translation id="495170559598752135">การทำงาน</translation>
 <translation id="4953585991029886728">แก้ไขข้อความ</translation>
 <translation id="4954534434583049121">ข้อความอ้างอิงก่อนหน้า</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">ฟอร์ม</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{เครื่องหมายแบ็คสแลช}other{# เครื่องหมายแบ็คสแลช}}</translation>
 <translation id="6017514345406065928">สีเขียว</translation>
-<translation id="6021969570711251331">แทรกสลับ</translation>
 <translation id="6034000775414344507">เทาอ่อน</translation>
 <translation id="6037602951055904232">เลื่อนไปข้างหน้า</translation>
 <translation id="6042826534790431634">กด Search+Space เพื่อเปิดใช้งาน</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271">เมนู <ph name="NAME" /></translation>
 <translation id="6444046323172968959">ช่องโต้ตอบการแจ้งเตือน</translation>
 <translation id="6452403590345320472">สารบัญ</translation>
-<translation id="6454456397828627257">แสดงคู่กัน</translation>
 <translation id="6459511626086141404">รูปแบบแป้นแบบราบ</translation>
 <translation id="6468049171101508116">ปุ่มถัดไป</translation>
 <translation id="646954774886932461">ดัชนี</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
index a795206..c542f075 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Önceki blok alıntı yok.</translation>
 <translation id="1321576897702511272">ChromeVox yardımını gizle</translation>
 <translation id="1325946044405407859">Ten Rengi</translation>
-<translation id="1331634987653814322">Braille Ayarları</translation>
 <translation id="1331702245475014624">toplam: <ph name="TOTAL" />, öğe: <ph name="INDEX" /></translation>
 <translation id="1334095593597963605">karakter ve kelime yansıtma</translation>
 <translation id="1334570596456017464">Alt simge</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Dahili bağlantı</translation>
 <translation id="4915087353619183190">Öğrenme Modu başlatılıyor. İşlevini öğrenmek istediğiniz qwerty tuşuna, yenilenebilir braille tuşuna veya dokunma hareketine basın. Çıkmak için control+w tuş kombinasyonuna ya da escape tuşuna basın.</translation>
 <translation id="492295894462528572">Önsöz</translation>
-<translation id="4943781537993885772">Görüntüleme Stili</translation>
 <translation id="495170559598752135">İşlemler</translation>
 <translation id="4953585991029886728">Metni düzenle</translation>
 <translation id="4954534434583049121">Önceki blok alıntı</translation>
@@ -622,7 +620,7 @@
 <translation id="5349770431644471053">Geri bağlantı</translation>
 <translation id="536031132345979795">Sürekli okuma sırasında geriye doğru atla</translation>
 <translation id="5368000168321181111">Ses sinyalleri kapalı</translation>
-<translation id="5368505757342402527"><ph name="FILE_NAME" /> indirme işleminde %<ph name="PROGRESS" /> tamamlandı. Kalan süre yaklaşık <ph name="TIME" /> <ph name="UNITS" />.</translation>
+<translation id="5368505757342402527"><ph name="FILE_NAME" /> dosyası %<ph name="PROGRESS" /> oranında indirildi. Yaklaşık <ph name="TIME" /> <ph name="UNITS" /> kaldı.</translation>
 <translation id="5374320867641260420">Sonraki düğme yok.</translation>
 <translation id="5376407118396657359">Hücreden hücreye gitmek için Arama+Ctrl+Alt ve ok tuşlarına basın.</translation>
 <translation id="5382299583965267720">Sonraki 1. düzey başlık yok.</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Form</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{ters eğik çizgi}other{# ters eğik çizgi}}</translation>
 <translation id="6017514345406065928">Yeşil</translation>
-<translation id="6021969570711251331">Üst üste</translation>
 <translation id="6034000775414344507">Açık Gri</translation>
 <translation id="6037602951055904232">İleri kaydır</translation>
 <translation id="6042826534790431634">Etkinleştirmek için Arama+Boşluk tuşlarına basın.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menü</translation>
 <translation id="6444046323172968959">Uyarı iletişim kutusu</translation>
 <translation id="6452403590345320472">İçindekiler</translation>
-<translation id="6454456397828627257">Yan yana</translation>
 <translation id="6459511626086141404">Düz tuş eşleme</translation>
 <translation id="6468049171101508116">Sonraki düğmesi</translation>
 <translation id="646954774886932461">Dizin</translation>
@@ -805,7 +801,7 @@
 <translation id="667999046851023355">Doküman</translation>
 <translation id="6688209025607531203">Modal olmayan uyarı</translation>
 <translation id="6689672606256159458">Koyu Somon</translation>
-<translation id="669617842401078250"><ph name="FILE_NAME" /> indirme işlemi duraklatıldı</translation>
+<translation id="669617842401078250"><ph name="FILE_NAME" /> dosyasını indirme işlemi duraklatıldı</translation>
 <translation id="6696967141280706829">Önsöz</translation>
 <translation id="6697092096875747123">Önceki birleşik kutu</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{ünlem}other{# ünlem}}</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
index 7458c904..e44dc37 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Немає попереднього блоку цитати.</translation>
 <translation id="1321576897702511272">Сховати довідку ChromeVox</translation>
 <translation id="1325946044405407859">Жовто-брунатний</translation>
-<translation id="1331634987653814322">Налаштування шрифту Брайля</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> з <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">озвучення символів і слів</translation>
 <translation id="1334570596456017464">Підрядковий текст</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">Внутрішнє посилання</translation>
 <translation id="4915087353619183190">Увімкнення режиму довідки. Натисніть клавішу на клавіатурі QWERTY, клавішу оновлення на брайлівській клавіатурі або торкніться жесту, щоб дізнатися про функції. Щоб вийти з цього режиму, натисніть клавіші Ctrl + w або Esc.</translation>
 <translation id="492295894462528572">Передмова</translation>
-<translation id="4943781537993885772">Стиль відображення</translation>
 <translation id="495170559598752135">Дії</translation>
 <translation id="4953585991029886728">Редагування тексту</translation>
 <translation id="4954534434583049121">Цитування попереднього блока</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">Форма</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{зворотна коса риска}one{# зворотна коса риска}few{# зворотні косі риски}many{# зворотних косих рисок}other{# backslashes}}</translation>
 <translation id="6017514345406065928">Зелений</translation>
-<translation id="6021969570711251331">Чергування</translation>
 <translation id="6034000775414344507">Світло-сірий</translation>
 <translation id="6037602951055904232">На задній план</translation>
 <translation id="6042826534790431634">Натисніть клавішу пошуку та пробіл, щоб активувати.</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, меню</translation>
 <translation id="6444046323172968959">Діалогове вікно сповіщень</translation>
 <translation id="6452403590345320472">Зміст</translation>
-<translation id="6454456397828627257">Поруч</translation>
 <translation id="6459511626086141404">Звичайна розкладка</translation>
 <translation id="6468049171101508116">Наступна кнопка</translation>
 <translation id="646954774886932461">Покажчик</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
index 05a8922..3a36458b8 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">Không có khung trích dẫn trước nào.</translation>
 <translation id="1321576897702511272">Ẩn trợ giúp của ChromeVox</translation>
 <translation id="1325946044405407859">Màu nâu vàng</translation>
-<translation id="1331634987653814322">Cài đặt chữ nổi</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> / <ph name="TOTAL" /></translation>
 <translation id="1334095593597963605">nói ký tự và từ</translation>
 <translation id="1334570596456017464">Chỉ số dưới</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">Liên kết bên trong</translation>
 <translation id="4915087353619183190">Đang bắt đầu Chế độ học. Bạn có thể nhấn một phím trên bàn phím qwerty, phím chữ nổi có thể làm mới hoặc sử dụng cử chỉ chạm để tìm hiểu chức năng của chế độ này. Bạn cũng có thể nhấn tổ hợp phím Control và w hoặc phím Escape để thoát.</translation>
 <translation id="492295894462528572">Lời tựa</translation>
-<translation id="4943781537993885772">Kiểu hiển thị</translation>
 <translation id="495170559598752135">Tác vụ</translation>
 <translation id="4953585991029886728">Chỉnh sửa văn bản</translation>
 <translation id="4954534434583049121">Khối trích dẫn trước</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">Biểu mẫu</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{dấu gạch chéo ngược}other{# dấu gạch chéo ngược}}</translation>
 <translation id="6017514345406065928">Xanh lục</translation>
-<translation id="6021969570711251331">Đan xen</translation>
 <translation id="6034000775414344507">Xám nhạt</translation>
 <translation id="6037602951055904232">Xoay về phía trước</translation>
 <translation id="6042826534790431634">Nhấn tổ hợp phím Tìm kiếm+Dấu cách để kích hoạt.</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />, menu</translation>
 <translation id="6444046323172968959">Hộp thoại thông báo</translation>
 <translation id="6452403590345320472">Mục lục</translation>
-<translation id="6454456397828627257">Cạnh nhau</translation>
 <translation id="6459511626086141404">Sơ đồ bàn phím phẳng</translation>
 <translation id="6468049171101508116">Nút tiếp theo</translation>
 <translation id="646954774886932461">Chú dẫn</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
index c1b171e0..2f756542 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-CN.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">不存在上一段引用。</translation>
 <translation id="1321576897702511272">隐藏ChromeVox帮助</translation>
 <translation id="1325946044405407859">棕褐色</translation>
-<translation id="1331634987653814322">盲文设置</translation>
 <translation id="1331702245475014624">第<ph name="INDEX" />个,共<ph name="TOTAL" />个</translation>
 <translation id="1334095593597963605">字符和字词回显</translation>
 <translation id="1334570596456017464">下标</translation>
@@ -556,7 +555,6 @@
 <translation id="489907760999452556">内部链接</translation>
 <translation id="4915087353619183190">正在启动学习模式。要了解该模式的功能,请按 qwerty 键或可刷新的盲文键,也可以使用触摸手势。按 Ctrl+W 键或按 Esc 键即可退出。</translation>
 <translation id="492295894462528572">前言</translation>
-<translation id="4943781537993885772">显示样式</translation>
 <translation id="495170559598752135">操作</translation>
 <translation id="4953585991029886728">编辑文本</translation>
 <translation id="4954534434583049121">上一个块引用</translation>
@@ -724,7 +722,6 @@
 <translation id="6006050241733874051">表单</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{1个反斜线符号}other{#个反斜线符号}}</translation>
 <translation id="6017514345406065928">绿色</translation>
-<translation id="6021969570711251331">交错</translation>
 <translation id="6034000775414344507">浅灰色</translation>
 <translation id="6037602951055904232">向前平移</translation>
 <translation id="6042826534790431634">同时按搜索键和空格键即可启动。</translation>
@@ -776,7 +773,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />,菜单</translation>
 <translation id="6444046323172968959">提醒对话框</translation>
 <translation id="6452403590345320472">目录</translation>
-<translation id="6454456397828627257">并排</translation>
 <translation id="6459511626086141404">降调按键映射</translation>
 <translation id="6468049171101508116">下一个按钮</translation>
 <translation id="646954774886932461">索引</translation>
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
index 1bcd8da4..42cca6ce 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_zh-TW.xtb
@@ -54,7 +54,6 @@
 <translation id="1319608975892113573">沒有上一個引用標記。</translation>
 <translation id="1321576897702511272">隱藏 ChromeVox 說明</translation>
 <translation id="1325946044405407859">日曬色</translation>
-<translation id="1331634987653814322">點字設定</translation>
 <translation id="1331702245475014624">第 <ph name="INDEX" /> 個,共 <ph name="TOTAL" /> 個</translation>
 <translation id="1334095593597963605">字元和字詞語音回應</translation>
 <translation id="1334570596456017464">下標</translation>
@@ -557,7 +556,6 @@
 <translation id="489907760999452556">內部連結</translation>
 <translation id="4915087353619183190">正在啟動學習模式。按下 Qwerty 鍵、可更新的點字鍵或觸控手勢即可學習相關功能。按下 Ctrl + W 或 Escape 鍵即可結束。</translation>
 <translation id="492295894462528572">前言</translation>
-<translation id="4943781537993885772">顯示樣式</translation>
 <translation id="495170559598752135">動作</translation>
 <translation id="4953585991029886728">編輯文字</translation>
 <translation id="4954534434583049121">上一個區塊引述</translation>
@@ -725,7 +723,6 @@
 <translation id="6006050241733874051">表單</translation>
 <translation id="6006064078185310784">{COUNT,plural, =1{反斜線}other{# 個反斜線}}</translation>
 <translation id="6017514345406065928">綠色</translation>
-<translation id="6021969570711251331">交錯顯示</translation>
 <translation id="6034000775414344507">淺灰色</translation>
 <translation id="6037602951055904232">向前平移</translation>
 <translation id="6042826534790431634">按下搜尋鍵和空格鍵即可啟動。</translation>
@@ -777,7 +774,6 @@
 <translation id="6438968337250688271"><ph name="NAME" />,選單</translation>
 <translation id="6444046323172968959">警示對話方塊</translation>
 <translation id="6452403590345320472">目錄</translation>
-<translation id="6454456397828627257">並排</translation>
 <translation id="6459511626086141404">一般按鍵對應配置</translation>
 <translation id="6468049171101508116">下一個按鈕</translation>
 <translation id="646954774886932461">索引</translation>
diff --git a/chrome/browser/resources/chromeos/kiosk_next_home/api.js b/chrome/browser/resources/chromeos/kiosk_next_home/api.js
index 058ea54f..76ee3c1 100644
--- a/chrome/browser/resources/chromeos/kiosk_next_home/api.js
+++ b/chrome/browser/resources/chromeos/kiosk_next_home/api.js
@@ -25,6 +25,16 @@
   addListener(listener) {}
 
   /**
+   * @return {!Promise<string>} Promise for the user's given name.
+   */
+  getUserGivenName() {}
+
+  /**
+   * @return {!Promise<string>} Promise for the user's display name.
+   */
+  getUserDisplayName() {}
+
+  /**
    * Gets the obfuscated account Gaia ID associated with the current user
    * session.
    * @return {!Promise<string>} Promise for the obfuscated account Gaia ID.
diff --git a/chrome/browser/resources/chromeos/kiosk_next_home/api_impl.js b/chrome/browser/resources/chromeos/kiosk_next_home/api_impl.js
index 41b8ee9a..e98ae5b5 100644
--- a/chrome/browser/resources/chromeos/kiosk_next_home/api_impl.js
+++ b/chrome/browser/resources/chromeos/kiosk_next_home/api_impl.js
@@ -68,6 +68,9 @@
     /** @private @const */
     this.identityAccessorProxy_ = new identity.mojom.IdentityAccessorProxy();
     /** @private @const */
+    this.identityControllerProxy_ =
+        new chromeos.kioskNextHome.mojom.IdentityControllerProxy();
+    /** @private @const */
     this.appControllerProxy_ =
         new chromeos.kioskNextHome.mojom.AppControllerProxy();
     /** @private @const */
@@ -78,6 +81,8 @@
         chromeos.kioskNextHome.mojom.KioskNextHomeInterfaceBroker.getProxy();
     kioskNextHomeInterfaceBrokerProxy.getIdentityAccessor(
         this.identityAccessorProxy_.$.createRequest());
+    kioskNextHomeInterfaceBrokerProxy.getIdentityController(
+        this.identityControllerProxy_.$.createRequest());
     kioskNextHomeInterfaceBrokerProxy.getAppController(
         this.appControllerProxy_.$.createRequest());
 
@@ -110,6 +115,18 @@
   }
 
   /** @override */
+  getUserGivenName() {
+    return this.identityControllerProxy_.getUserInfo().then(
+        result => result.userInfo.givenName);
+  }
+
+  /** @override */
+  getUserDisplayName() {
+    return this.identityControllerProxy_.getUserInfo().then(
+        result => result.userInfo.displayName);
+  }
+
+  /** @override */
   getAccountId() {
     return this.identityAccessorProxy_.getPrimaryAccountWhenAvailable().then(
         account => account.accountInfo.gaia);
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn
index 20bd59fd..307825fc 100644
--- a/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -47,13 +47,26 @@
     ":recommend_apps",
     ":saml_confirm_password",
     ":saml_interstitial",
-    ":supervision_onboarding",
     ":sync_consent",
     ":throbber_notice",
     ":update_required_card",
   ]
 }
 
+# We need to keep the supervision_onboarding compilation separate from the main
+# target since they depend on incompatible extern files.
+#
+# The main compilation target bundles the networking_private.js externs, it
+# gets that transitively from its :network_select_login dep.
+#
+# Supervision needs the chrome_extensions.js extern, but they end up declaring
+# the same types, so compilation fails.
+js_type_check("closure_compile_supervision") {
+  deps = [
+    ":supervision_onboarding",
+  ]
+}
+
 js2gtest("login_unitjs_tests") {
   # These could be unit tests, except they need a browser context in order
   # to construct a DOMParser object - so they are webui tests.
@@ -90,6 +103,7 @@
   deps = [
     ":oobe_types",
     "//ui/login:display_manager_types",
+    "//ui/webui/resources/js:util",
   ]
 }
 
@@ -148,9 +162,15 @@
 
 js_library("supervision_onboarding") {
   deps = [
+    ":login_screen_behavior",
     "//chrome/browser/chromeos/supervision/mojom:mojom_js_library_for_compile",
     "//ui/webui/resources/js:cr",
   ]
+
+  externs_list = [
+    "$externs_path/chrome_extensions.js",
+    "$externs_path/webview_tag.js",
+  ]
 }
 
 js_library("active_directory_password_change") {
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_update.js b/chrome/browser/resources/chromeos/login/oobe_screen_update.js
index bc77fb1..5b91ae5 100644
--- a/chrome/browser/resources/chromeos/login/oobe_screen_update.js
+++ b/chrome/browser/resources/chromeos/login/oobe_screen_update.js
@@ -24,12 +24,6 @@
     /** @param {boolean} enabled */
     setCancelUpdateShortcutEnabled: function(enabled) {
       $('oobe-update-md').cancelAllowed = enabled;
-      var configuration = Oobe.getInstance().getOobeConfiguration();
-      if (!configuration)
-        return;
-      if (configuration.updateSkipNonCritical && enabled) {
-        this.cancel();
-      }
     },
 
     /**
diff --git a/chrome/browser/resources/chromeos/login/oobe_types.js b/chrome/browser/resources/chromeos/login/oobe_types.js
index 143084e..086d958 100644
--- a/chrome/browser/resources/chromeos/login/oobe_types.js
+++ b/chrome/browser/resources/chromeos/login/oobe_types.js
@@ -94,7 +94,6 @@
  *   eulaAutoAccept: (boolean|undefined),
  *   eulaSendStatistics: (boolean|undefined),
  *   networkUseConnected: (boolean|undefined),
- *   updateSkipNonCritical: (boolean|undefined),
  *   arcTosAutoAccept: (boolean|undefined),
  * }}
  */
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.css b/chrome/browser/resources/chromeos/login/screen_gaia_signin.css
index 740fb3b..8755be4 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.css
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.css
@@ -7,11 +7,6 @@
   width: 448px;
 }
 
-#gaia-signin.full-width {
-  padding: 44px 0 0;
-  width: 562px;
-}
-
 #gaia-signin.v2 {
   height: unset;
   padding: unset;
@@ -114,8 +109,7 @@
   z-index: 1;
 }
 
-.loading #gaia-navigation,
-.full-width #gaia-navigation {
+.loading #gaia-navigation {
   color: rgba(0, 0, 0, .54);
 }
 
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index 9da47f2..0e337a9 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -60,11 +60,11 @@
     ],
 
     /**
-     * Saved gaia auth host load params.
+     * Saved authenticator load params.
      * @type {?string}
      * @private
      */
-    gaiaAuthParams_: null,
+    authenticatorParams_: null,
 
     /**
      * Current mode of this screen.
@@ -202,12 +202,12 @@
     decorate: function() {
       this.navigation_ = $('gaia-navigation');
 
-      this.gaiaAuthHost_ = new cr.login.Authenticator($('signin-frame'));
-      this.gaiaAuthHost_.addEventListener(
+      this.authenticator_ = new cr.login.Authenticator($('signin-frame'));
+      this.authenticator_.addEventListener(
           'ready', this.onAuthReady_.bind(this));
 
       var that = this;
-      [this.gaiaAuthHost_, $('offline-gaia'), $('offline-ad-auth')].forEach(
+      [this.authenticator_, $('offline-gaia'), $('offline-ad-auth')].forEach(
           function(frame) {
             // Ignore events from currently inactive frame.
             var frameFilter = function(callback) {
@@ -216,7 +216,7 @@
                 switch (that.screenMode_) {
                   case ScreenMode.DEFAULT:
                   case ScreenMode.SAML_INTERSTITIAL:
-                    currentFrame = that.gaiaAuthHost_;
+                    currentFrame = that.authenticator_;
                     break;
                   case ScreenMode.OFFLINE:
                     currentFrame = $('offline-gaia');
@@ -242,28 +242,29 @@
                 'menuItemClicked', frameFilter(that.onMenuItemClicked_));
           });
 
-      this.gaiaAuthHost_.addEventListener(
+      this.authenticator_.addEventListener(
           'showView', this.onShowView_.bind(this));
-      this.gaiaAuthHost_.confirmPasswordCallback =
+      this.authenticator_.confirmPasswordCallback =
           this.onAuthConfirmPassword_.bind(this);
-      this.gaiaAuthHost_.noPasswordCallback = this.onAuthNoPassword_.bind(this);
-      this.gaiaAuthHost_.insecureContentBlockedCallback =
+      this.authenticator_.noPasswordCallback =
+          this.onAuthNoPassword_.bind(this);
+      this.authenticator_.insecureContentBlockedCallback =
           this.onInsecureContentBlocked_.bind(this);
-      this.gaiaAuthHost_.missingGaiaInfoCallback =
+      this.authenticator_.missingGaiaInfoCallback =
           this.missingGaiaInfo_.bind(this);
-      this.gaiaAuthHost_.samlApiUsedCallback = this.samlApiUsed_.bind(this);
-      this.gaiaAuthHost_.getIsSamlUserPasswordlessCallback =
+      this.authenticator_.samlApiUsedCallback = this.samlApiUsed_.bind(this);
+      this.authenticator_.getIsSamlUserPasswordlessCallback =
           this.getIsSamlUserPasswordless_.bind(this);
-      this.gaiaAuthHost_.addEventListener(
+      this.authenticator_.addEventListener(
           'authDomainChange', this.onAuthDomainChange_.bind(this));
-      this.gaiaAuthHost_.addEventListener(
+      this.authenticator_.addEventListener(
           'authFlowChange', this.onAuthFlowChange_.bind(this));
-      this.gaiaAuthHost_.addEventListener(
+      this.authenticator_.addEventListener(
           'videoEnabledChange', this.onVideoEnabledChange_.bind(this));
 
-      this.gaiaAuthHost_.addEventListener(
+      this.authenticator_.addEventListener(
           'loadAbort', this.onLoadAbortMessage_.bind(this));
-      this.gaiaAuthHost_.addEventListener(
+      this.authenticator_.addEventListener(
           'identifierEntered', this.onIdentifierEnteredMessage_.bind(this));
 
       this.navigation_.addEventListener(
@@ -293,15 +294,15 @@
       $('saml-interstitial')
           .addEventListener('samlPageNextClicked', function() {
             this.screenMode = ScreenMode.DEFAULT;
-            this.loadGaiaAuthHost_(true /* doSamlRedirect */);
+            this.loadAuthenticator_(true /* doSamlRedirect */);
           }.bind(this));
       $('saml-interstitial')
           .addEventListener('samlPageChangeAccountClicked', function() {
             // The user requests to change the account. We must clear the email
             // field of the auth params.
-            this.gaiaAuthParams_.email = '';
+            this.authenticatorParams_.email = '';
             this.screenMode = ScreenMode.DEFAULT;
-            this.loadGaiaAuthHost_(false /* doSamlRedirect */);
+            this.loadAuthenticator_(false /* doSamlRedirect */);
           }.bind(this));
 
       $('offline-ad-auth').addEventListener('cancel', function() {
@@ -328,13 +329,13 @@
      *     authentication by automatic redirection to the SAML-based enrollment
      *     enterprise domain IdP.
      */
-    loadGaiaAuthHost_: function(doSamlRedirect) {
+    loadAuthenticator_: function(doSamlRedirect) {
       this.loading = true;
       this.startLoadingTimer_();
 
-      this.gaiaAuthParams_.doSamlRedirect = doSamlRedirect;
-      this.gaiaAuthHost_.load(
-          cr.login.Authenticator.AuthMode.DEFAULT, this.gaiaAuthParams_);
+      this.authenticatorParams_.doSamlRedirect = doSamlRedirect;
+      this.authenticator_.load(
+          cr.login.Authenticator.AuthMode.DEFAULT, this.authenticatorParams_);
     },
 
     /**
@@ -667,8 +668,8 @@
 
         signinFrameParent.replaceChild(newSigninFrame, signinFrame);
 
-        // Make sure the auth host uses the new webview from now on.
-        this.gaiaAuthHost_.rebindWebview($('signin-frame'));
+        // Make sure the authenticator uses the new webview from now on.
+        this.authenticator_.rebindWebview($('signin-frame'));
       }
     },
 
@@ -682,7 +683,7 @@
       // page from working in a background (see crbug.com/613245).
       if (this.screenMode_ == ScreenMode.DEFAULT &&
           data.screenMode != ScreenMode.DEFAULT) {
-        this.gaiaAuthHost_.resetWebview();
+        this.authenticator_.resetWebview();
       }
 
       this.setSigninFramePartition_(data.webviewPartitionName);
@@ -694,16 +695,11 @@
       this.lastBackMessageValue_ = false;
 
       // Reset SAML
-      this.classList.toggle('full-width', false);
       $('saml-notice-container').hidden = true;
       this.samlPasswordConfirmAttempt_ = 0;
 
       this.updateSigninFrameContainers_();
 
-      // Screen size could have been changed because of 'full-width' classes.
-      if (Oobe.getInstance().currentScreen === this)
-        Oobe.getInstance().updateScreenSize(this);
-
       var params = {};
       for (var i in cr.login.Authenticator.SUPPORTED_PARAMS) {
         var name = cr.login.Authenticator.SUPPORTED_PARAMS[i];
@@ -721,11 +717,11 @@
           !(data.enterpriseManagedDevice || data.hasDeviceOwner);
       params.obfuscatedOwnerId = data.obfuscatedOwnerId;
 
-      this.gaiaAuthParams_ = params;
+      this.authenticatorParams_ = params;
 
       switch (this.screenMode_) {
         case ScreenMode.DEFAULT:
-          this.loadGaiaAuthHost_(false /* doSamlRedirect */);
+          this.loadAuthenticator_(false /* doSamlRedirect */);
           break;
 
         case ScreenMode.OFFLINE:
@@ -772,7 +768,7 @@
      * Whether the current auth flow is SAML.
      */
     isSAML: function() {
-      return this.gaiaAuthHost_.authFlow ==
+      return this.authenticator_.authFlow ==
           cr.login.Authenticator.AuthFlow.SAML;
     },
 
@@ -780,14 +776,14 @@
      * Helper function to update the title bar.
      */
     updateSamlNotice_: function() {
-      if (this.gaiaAuthHost_.videoEnabled) {
+      if (this.authenticator_.videoEnabled) {
         $('saml-notice-message').textContent = loadTimeData.getStringF(
-            'samlNoticeWithVideo', this.gaiaAuthHost_.authDomain);
+            'samlNoticeWithVideo', this.authenticator_.authDomain);
         $('saml-notice-recording-indicator').hidden = false;
         $('saml-notice-container').style.justifyContent = 'flex-start';
       } else {
         $('saml-notice-message').textContent = loadTimeData.getStringF(
-            'samlNotice', this.gaiaAuthHost_.authDomain);
+            'samlNotice', this.authenticator_.authDomain);
         $('saml-notice-recording-indicator').hidden = true;
         $('saml-notice-container').style.justifyContent = 'center';
       }
@@ -804,18 +800,18 @@
     },
 
     /**
-     * Invoked when the authDomain property is changed on the GAIA host.
+     * Invoked when the authDomain property is changed on the authenticator.
      */
     onAuthDomainChange_: function() {
       this.updateSamlNotice_();
     },
 
     /**
-     * Invoked when the videoEnabled property is changed on the GAIA host.
+     * Invoked when the videoEnabled property is changed on the authenticator.
      */
     onVideoEnabledChange_: function() {
       this.updateSamlNotice_();
-      if (this.gaiaAuthHost_.videoEnabled && this.videoTimer_ === undefined) {
+      if (this.authenticator_.videoEnabled && this.videoTimer_ === undefined) {
         this.videoTimer_ =
             setTimeout(this.cancel.bind(this), VIDEO_LOGIN_TIMEOUT);
       } else {
@@ -824,12 +820,11 @@
     },
 
     /**
-     * Invoked when the authFlow property is changed on the GAIA host.
+     * Invoked when the authFlow property is changed on the authenticator.
      */
     onAuthFlowChange_: function() {
       var isSAML = this.isSAML();
 
-      this.classList.toggle('full-width', isSAML);
       $('saml-notice-container').hidden = !isSAML;
       this.classList.toggle('saml', isSAML);
 
@@ -841,7 +836,8 @@
     },
 
     /**
-     * Invoked when the auth host emits 'ready' event.
+     * Invoked when the authenticator emits 'ready' event or when another
+     * authentication frame is completely loaded.
      * @private
      */
     onAuthReady_: function() {
@@ -855,7 +851,7 @@
     },
 
     /**
-     * Invoked when the auth host emits 'dialogShown' event.
+     * Invoked when a frame emits 'dialogShown' event.
      * @private
      */
     onDialogShown_: function() {
@@ -863,7 +859,7 @@
     },
 
     /**
-     * Invoked when the auth host emits 'dialogHidden' event.
+     * Invoked when a frame emits 'dialogHidden' event.
      * @private
      */
     onDialogHidden_: function() {
@@ -884,7 +880,7 @@
     },
 
     /**
-     * Invoked when the the GAIA host requests whether the specified user is a
+     * Invoked when the authenticator requests whether the specified user is a
      * user without a password (neither a manually entered one nor one provided
      * via Credentials Passing API).
      * @param {string} email
@@ -898,7 +894,7 @@
     },
 
     /**
-     * Invoked when the auth host emits 'backButton' event.
+     * Invoked when a frame emits 'backButton' event.
      * @private
      */
     onBackButton_: function(e) {
@@ -908,8 +904,8 @@
     },
 
     /**
-     * Invoked when the auth host emits 'showView' event or when corresponding
-     * guard time fires.
+     * Invoked when the authenticator emits 'showView' event or when
+     * corresponding guard time fires.
      * @private
      */
     onShowView_: function(e) {
@@ -939,8 +935,8 @@
 
     /**
      * Invoked when the user has successfully authenticated via SAML, the
-     * principals API was not used and the auth host needs the user to confirm
-     * the scraped password.
+     * principals API was not used and the authenticator needs the user to
+     * confirm the scraped password.
      * @param {string} email The authenticated user's e-mail.
      * @param {number} passwordCount The number of passwords that were scraped.
      * @private
@@ -962,7 +958,6 @@
             loadTimeData.getString('fatalErrorMessageVerificationFailed'),
             loadTimeData.getString('fatalErrorTryAgainButton'));
       }
-      this.classList.toggle('full-width', false);
     },
 
     /**
@@ -971,7 +966,7 @@
      */
     onConfirmPasswordCollected_: function(password) {
       this.samlPasswordConfirmAttempt_++;
-      this.gaiaAuthHost_.verifyConfirmedPassword(password);
+      this.authenticator_.verifyConfirmedPassword(password);
 
       // Shows signin UI again without changing states.
       Oobe.showScreen({id: SCREEN_GAIA_SIGNIN});
@@ -998,7 +993,7 @@
      *     the same as their SAML password.
      */
     onManualPasswordCollected_: function(password) {
-      this.gaiaAuthHost_.completeAuthWithManualPassword(password);
+      this.authenticator_.completeAuthWithManualPassword(password);
     },
 
     /**
@@ -1112,7 +1107,7 @@
      */
     reset: function(takeFocus, forceOnline) {
       // Reload and show the sign-in UI if needed.
-      this.gaiaAuthHost_.resetStates();
+      this.authenticator_.resetStates();
       if (takeFocus) {
         if (!forceOnline && this.isOffline()) {
           Oobe.getInstance().setSigninUIState(SIGNIN_UI_STATE.GAIA_SIGNIN);
@@ -1129,7 +1124,7 @@
     doReload: function() {
       if (this.screenMode_ != ScreenMode.DEFAULT)
         return;
-      this.gaiaAuthHost_.reload();
+      this.authenticator_.reload();
       this.loading = true;
       this.startLoadingTimer_();
       this.lastBackMessageValue_ = false;
@@ -1240,7 +1235,7 @@
         // reloaded. Otherwise ChromeOS overlays hide and Gaia page is shown
         // somewhere in the middle of animations.
         if (this.screenMode_ == ScreenMode.DEFAULT)
-          this.gaiaAuthHost_.resetWebview();
+          this.authenticator_.resetWebview();
       }
 
       this.classList.toggle('whitelist-error', show);
diff --git a/chrome/browser/resources/chromeos/login/supervision_onboarding.html b/chrome/browser/resources/chromeos/login/supervision_onboarding.html
index dd1cb377..77b93c8 100644
--- a/chrome/browser/resources/chromeos/login/supervision_onboarding.html
+++ b/chrome/browser/resources/chromeos/login/supervision_onboarding.html
@@ -6,7 +6,9 @@
 
 <link rel="import" href="chrome://oobe/custom_elements.html">
 <link rel="import" href="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.html">
-<link rel="import" href="chrome://oobe/supervision_onboarding_controller.mojom.html">
+<link rel="import" href="chrome://resources/mojo/url/mojom/url.mojom.html">
+<script src="chrome://oobe/supervision/onboarding_controller.mojom-lite.js">
+</script>
 
 <!--
   UI for the Supervision Onboarding flow that's displayed for the first login
@@ -15,7 +17,7 @@
   <template>
     <link rel="stylesheet" href="oobe_flex_layout.css">
     <oobe-dialog id="supervision-onboarding-dialog" has-buttons>
-      <webview id="contentWebview" slot="footer"></webview>
+      <webview id="contentWebview" slot="footer" hidden></webview>
       <div slot="bottom-buttons" class="flex layout horizontal">
         <oobe-back-button id="back-button"
           on-tap="onBack_">
diff --git a/chrome/browser/resources/chromeos/login/supervision_onboarding.js b/chrome/browser/resources/chromeos/login/supervision_onboarding.js
index 519e80b2..325bcb4 100644
--- a/chrome/browser/resources/chromeos/login/supervision_onboarding.js
+++ b/chrome/browser/resources/chromeos/login/supervision_onboarding.js
@@ -3,74 +3,201 @@
 // found in the LICENSE file.
 
 /**
- * @fileoverview Supervision Onboarding polymer element. It forwards user input
- * to the C++ handler.
+ * @fileoverview Supervision Onboarding polymer element. It loads onboarding
+ * pages from the web in a webview and forwards user actions to the
+ * OnboardingController, which contains the full flow state machine.
  */
-Polymer({
-  is: 'supervision-onboarding',
 
-  behaviors: [LoginScreenBehavior],
+{
+  class WebviewLoader {
+    /** @param {!WebView} webview */
+    constructor(webview) {
+      this.webview_ = webview;
 
-  /** Overridden from LoginScreenBehavior. */
-  EXTERNAL_API: [
-    'setupMojo',
-  ],
+      /**
+       * Page being currently loaded. If null we are not loading any page yet.
+       * @private {?chromeos.supervision.mojom.OnboardingPage}
+       */
+      this.page_ = null;
 
-  /** @private {?chromeos.supervision.mojom.OnboardingControllerProxy} */
-  controller_: null,
+      /**
+       * Custom header values found in responses to requests made by the
+       * webview.
+       * @private {?string}
+       */
+      this.customHeaderValue_ = null;
 
-  /**
-   * @private {?chromeos.supervision.mojom.
-   *              OnboardingWebviewHostCallbackRouter}
-   */
-  hostCallbackRouter_: null,
+      /**
+       * Pending callback for a webview page load. It will be called with the
+       * list of custom header values if asked by the controller, or an empty
+       * array otherwise.
+       * @private {?function({customHeaderValue: ?string})}
+       */
+      this.pendingLoadPageCallback_ = null;
 
-  setupMojo: function() {
-    this.controller_ =
-            chromeos.supervision.mojom.OnboardingController.getProxy();
+      this.webviewListener_ = this.webviewFinishedLoading_.bind(this);
+      this.webviewHeaderListener_ = this.onHeadersReceived_.bind(this);
+      this.webviewAuthListener_ = this.authorizeRequest_.bind(this);
+    }
 
-    this.hostCallbackRouter_ =
-        new chromeos.supervision.mojom.OnboardingWebviewHostCallbackRouter();
+    /**
+     * @param {!chromeos.supervision.mojom.OnboardingPage} page
+     * @return {!Promise<{customHeaderValue: ?string}>}
+     */
+    loadPage(page) {
+      // TODO(958995): Handle the case where we are still loading the previous
+      // page but the controller wants to load the next one. For now we just
+      // resolve the previous callback.
+      if (this.pendingLoadPageCallback_) {
+        this.pendingLoadPageCallback_({customHeaderValue: null});
+      }
 
-    this.hostCallbackRouter_.loadPage.addListener(pageUrl => {
-      this.$.contentWebview.src = pageUrl;
-    });
-    this.hostCallbackRouter_.exitFlow.addListener(() => {
-      this.exitFlow_();
-    });
+      this.page_ = page;
+      this.customHeaderValue_ = null;
+      this.pendingLoadPageCallback_ = null;
 
-    this.controller_.bindWebviewHost(this.hostCallbackRouter_.createProxy());
-  },
+      this.webview_.request.onBeforeSendHeaders.addListener(
+          this.webviewAuthListener_,
+          {urls: [page.urlFilterPattern], types: ['main_frame']},
+          ['blocking', 'requestHeaders']);
+      this.webview_.request.onHeadersReceived.addListener(
+          this.webviewHeaderListener_,
+          {urls: [page.urlFilterPattern], types: ['main_frame']},
+          ['responseHeaders', 'extraHeaders']);
 
-  /** @override */
-  ready: function() {
-    this.initializeLoginScreen('SupervisionOnboardingScreen', {
-      commonScreenSize: true,
-      resetAllowed: true,
-    });
-  },
+      // TODO(958995): Report load errors through the mojo interface.
+      // At the moment we are treating any loadstop/abort event as a successful
+      // load.
+      this.webview_.addEventListener('loadstop', this.webviewListener_);
+      this.webview_.addEventListener('loadabort', this.webviewListener_);
+      this.webview_.src = page.url.url;
 
-  /** @private */
-  onBack_: function() {
-    this.controller_.handleAction(
-        chromeos.supervision.mojom.OnboardingFlowAction.kShowPreviousPage);
-  },
+      return new Promise(resolve => {
+        this.pendingLoadPageCallback_ = resolve;
+      });
+    }
 
-  /** @private */
-  onSkip_: function() {
-    this.controller_.handleAction(
-        chromeos.supervision.mojom.OnboardingFlowAction.kSkipFlow);
-  },
+    /**
+     * @param {!Object<{responseHeaders:
+     *     !Array<{name: string, value:string}>}>} responseEvent
+     * @return {!BlockingResponse}
+     * @private
+     */
+    onHeadersReceived_(responseEvent) {
+      if (!this.page_.customHeaderName) {
+        return {};
+      }
 
-  /** @private */
-  onNext_: function() {
-    this.controller_.handleAction(
-        chromeos.supervision.mojom.OnboardingFlowAction.kShowNextPage);
-  },
+      const header = responseEvent.responseHeaders.find(
+          h => h.name == this.page_.customHeaderName);
+      this.customHeaderValue_ = header ? header.value : null;
 
-  /** @private */
-  exitFlow_: function() {
-    chrome.send('login.SupervisionOnboardingScreen.userActed',
-        ['setup-finished']);
+      return {};
+    }
+
+    /**
+     * Injects headers into the passed request.
+     *
+     * @param {!Object} requestEvent
+     * @return {!BlockingResponse} Modified headers.
+     * @private
+     */
+    authorizeRequest_(requestEvent) {
+      requestEvent.requestHeaders.push(
+          {name: 'Authorization', value: 'Bearer ' + this.page_.accessToken});
+
+      return /** @type {!BlockingResponse} */ ({
+        requestHeaders: requestEvent.requestHeaders,
+      });
+    }
+
+    /**
+     * Called when the webview sends a loadstop or loadabort event.
+     * @private {!Event} e
+     */
+    webviewFinishedLoading_(e) {
+      this.webview_.request.onBeforeSendHeaders.removeListener(
+          this.webviewAuthListener_);
+      this.webview_.request.onHeadersReceived.removeListener(
+          this.webviewHeaderListener_);
+      this.webview_.removeEventListener('loadstop', this.webviewListener_);
+      this.webview_.removeEventListener('loadabort', this.webviewListener_);
+
+      this.pendingLoadPageCallback_({
+        customHeaderValue: this.customHeaderValue_,
+      });
+
+      this.webview_.hidden = false;
+    }
   }
-});
+
+  Polymer({
+    is: 'supervision-onboarding',
+
+    behaviors: [LoginScreenBehavior],
+
+    /** Overridden from LoginScreenBehavior. */
+    EXTERNAL_API: [
+      'setupMojo',
+    ],
+
+    /** @private {?chromeos.supervision.mojom.OnboardingControllerProxy} */
+    controller_: null,
+
+    /**
+     * @private {?chromeos.supervision.mojom.
+     *     OnboardingWebviewHostCallbackRouter}
+     */
+    hostCallbackRouter_: null,
+
+    /** @private {?WebviewLoader} */
+    webviewLoader_: null,
+
+    setupMojo: function() {
+      this.webviewLoader_ = new WebviewLoader(this.$.contentWebview);
+
+      this.controller_ =
+          chromeos.supervision.mojom.OnboardingController.getProxy();
+
+      this.hostCallbackRouter_ =
+          new chromeos.supervision.mojom.OnboardingWebviewHostCallbackRouter();
+      this.hostCallbackRouter_.loadPage.addListener(
+          this.webviewLoader_.loadPage.bind(this.webviewLoader_));
+      this.hostCallbackRouter_.exitFlow.addListener(this.exitFlow_.bind(this));
+
+      this.controller_.bindWebviewHost(this.hostCallbackRouter_.createProxy());
+    },
+
+    /** @override */
+    ready: function() {
+      this.initializeLoginScreen('SupervisionOnboardingScreen', {
+        commonScreenSize: true,
+        resetAllowed: true,
+      });
+    },
+
+    /** @private */
+    onBack_: function() {
+      this.controller_.handleAction(
+          chromeos.supervision.mojom.OnboardingAction.kShowPreviousPage);
+    },
+
+    /** @private */
+    onSkip_: function() {
+      this.controller_.handleAction(
+          chromeos.supervision.mojom.OnboardingAction.kSkipFlow);
+    },
+
+    /** @private */
+    onNext_: function() {
+      this.controller_.handleAction(
+          chromeos.supervision.mojom.OnboardingAction.kShowNextPage);
+    },
+
+    /** @private */
+    exitFlow_: function() {
+      chrome.send(
+          'login.SupervisionOnboardingScreen.userActed', ['setup-finished']);
+    },
+  });
+}
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.js b/chrome/browser/resources/local_ntp/custom_backgrounds.js
index 29e2594b..84d93c4 100644
--- a/chrome/browser/resources/local_ntp/custom_backgrounds.js
+++ b/chrome/browser/resources/local_ntp/custom_backgrounds.js
@@ -241,10 +241,10 @@
 customBackgrounds.setAttribution = function(
     attributionLine1, attributionLine2, attributionActionUrl) {
   const attributionBox = $(customBackgrounds.IDS.ATTRIBUTIONS);
-  const attr1 = document.createElement('div');
-  attr1.setAttribute('id', customBackgrounds.IDS.ATTR1);
-  const attr2 = document.createElement('div');
-  attr2.setAttribute('id', customBackgrounds.IDS.ATTR2);
+  const attr1 = document.createElement('span');
+  attr1.id = customBackgrounds.IDS.ATTR1;
+  const attr2 = document.createElement('span');
+  attr2.id = customBackgrounds.IDS.ATTR2;
 
   if (attributionLine1 !== '') {
     // Shouldn't be changed from textContent for security assurances.
@@ -272,8 +272,8 @@
     attr.insertBefore(linkIcon, attr.firstChild);
 
     attributionBox.classList.add(customBackgrounds.CLASSES.ATTR_LINK);
+    attributionBox.href = attributionActionUrl;
     attributionBox.onclick = function() {
-      window.open(attributionActionUrl, '_blank');
       ntpApiHandle.logEvent(
           BACKGROUND_CUSTOMIZATION_LOG_TYPE.NTP_CUSTOMIZE_ATTRIBUTION_CLICKED);
     };
@@ -283,6 +283,9 @@
 
 customBackgrounds.clearAttribution = function() {
   const attributions = $(customBackgrounds.IDS.ATTRIBUTIONS);
+  attributions.removeAttribute('href');
+  attributions.className = '';
+  attributions.style.cursor = 'none';
   while (attributions.firstChild) {
     attributions.removeChild(attributions.firstChild);
   }
@@ -678,10 +681,11 @@
       $(customBackgrounds.IDS.CUSTOMIZATION_MENU) :
       $(customBackgrounds.IDS.MENU);
 
-  $(customBackgrounds.IDS.MENU_TITLE).textContent = dialogTitle;
   if (configData.richerPicker) {
+    $(customBackgrounds.IDS.MENU_TITLE).textContent = dialogTitle;
     menu.classList.toggle(customBackgrounds.CLASSES.ON_IMAGE_MENU, true);
   } else {
+    $(customBackgrounds.IDS.TITLE).textContent = dialogTitle;
     menu.classList.remove(customBackgrounds.CLASSES.COLLECTION_DIALOG);
     menu.classList.add(customBackgrounds.CLASSES.IMAGE_DIALOG);
   }
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css
index 3336ba1..e442c9d 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.css
+++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -575,10 +575,6 @@
   width: 100%;
 }
 
-#custom-links-edit.show {
-  display: block;
-}
-
 #one-google {
   display: none;
   position: absolute;
diff --git a/chrome/browser/resources/local_ntp/local_ntp.html b/chrome/browser/resources/local_ntp/local_ntp.html
index 1071e24c..e2059e2 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.html
+++ b/chrome/browser/resources/local_ntp/local_ntp.html
@@ -109,7 +109,7 @@
       <span id="edit-bg-text"></span>
     </div>
 
-    <div id="custom-bg-attr"></div>
+    <a id="custom-bg-attr"></a>
   </div>
 
   <dialog div id="edit-bg-dialog">
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index ce63121c..b0cb002 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -84,11 +84,8 @@
   FAKEBOX_FOCUS: 'fakebox-focused',  // Applies focus styles to the fakebox
   // Shows a search icon in the fakebox.
   SHOW_FAKEBOX_ICON: 'show-fakebox-icon',
-  SHOW_EDIT_DIALOG: 'show',  // Displays the edit custom link dialog.
   // Applied when the fakebox placeholder text should not be hidden on focus.
   SHOW_PLACEHOLDER: 'show-placeholder',
-  HIDE_BODY_OVERFLOW: 'hidden',  // Prevents scrolling while the edit custom
-                                 // link dialog is open.
   // Applies float animations to the Most Visited notification
   FLOAT_DOWN: 'float-down',
   FLOAT_UP: 'float-up',
@@ -127,12 +124,10 @@
   ERROR_NOTIFICATION_LINK: 'error-notice-link',
   ERROR_NOTIFICATION_MSG: 'error-notice-msg',
   FAKEBOX: 'fakebox',
-  FAKEBOX_CONTAINER: 'fakebox-container',
   FAKEBOX_ICON: 'fakebox-search-icon',
   FAKEBOX_INPUT: 'fakebox-input',
   FAKEBOX_TEXT: 'fakebox-text',
   FAKEBOX_MICROPHONE: 'fakebox-microphone',
-  LOGO: 'logo',
   MOST_VISITED: 'most-visited',
   NOTIFICATION: 'mv-notice',
   NOTIFICATION_CONTAINER: 'mv-notice-container',
@@ -150,18 +145,6 @@
 
 
 /**
- * Counterpart of search_provider_logos::LogoType.
- * @enum {string}
- * @const
- */
-const LOGO_TYPE = {
-  SIMPLE: 'SIMPLE',
-  ANIMATED: 'ANIMATED',
-  INTERACTIVE: 'INTERACTIVE',
-};
-
-
-/**
  * The different types of events that are logged from the NTP. This enum is
  * used to transfer information from the NTP JavaScript to the renderer and is
  * not used as a UMA enum histogram's logged value.
diff --git a/chrome/browser/resources/omnibox/omnibox.html b/chrome/browser/resources/omnibox/omnibox.html
index 8b8549e..1df1bef 100644
--- a/chrome/browser/resources/omnibox/omnibox.html
+++ b/chrome/browser/resources/omnibox/omnibox.html
@@ -1,4 +1,4 @@
-<!doctype html>
+<!doctype html>
 <html lang="en">
 <head>
   <meta charset="utf-8">
@@ -181,21 +181,29 @@
             </span>
           </div>
           <div class="buttons-column">
-            <label id="import-clipboard"
-                   class="row icon-button button drag-container" accesskey="v"
-                   tabindex="0"
-                   title="Import JSON from clipboard. Accepts dragged text and files as well.">
-              <i class="icon copy-icon"></i>
-              <span>Paste [<span class="accesskey">v</span>]</span>
-            </label>
-            <label id="import-file"
-                   class="row icon-button button drag-container" accesskey="m"
-                   tabindex="0"
-                   title="Upload previously downloaded responses. Accepts dragged text and files as well.">
-              <input id="import-file-input" type="file" accept=".json">
-              <i class="icon copy-icon"></i>
-              <span>Upload [<span class="accesskey">m</span>]</span>
-            </label>
+              <label id="import-clipboard"
+                     class="row icon-button button drag-container" accesskey="v"
+                     tabindex="0"
+                     title="Import JSON from clipboard. Accepts dragged text and files as well.">
+                  <i class="icon copy-icon"></i>
+                  <span>Paste [<span class="accesskey">v</span>]</span>
+              </label>
+              <label id="import-file"
+                     class="row icon-button button drag-container" accesskey="m"
+                     tabindex="0"
+                     title="Upload previously downloaded responses to load them. Accepts dragged text and files as well.">
+                  <input id="import-file-input" type="file" accept=".json">
+                  <i class="icon copy-icon"></i>
+                  <span>Upload [<span class="accesskey">m</span>]</span>
+              </label>
+              <label id="process-batch"
+                     class="row icon-button button drag-container" accesskey="b"
+                     tabindex="0"
+                     title="Upload a query batch specifier to download a batch export. Accepts dragged text and files as well.">
+                  <input id="process-batch-input" type="file" accept=".json">
+                  <i class="icon copy-icon"></i>
+                  <span>Process <span class="accesskey">b</span>atch</span>
+              </label>
           </div>
         </div>
         <div id="imported-warning" class="row" hidden>
diff --git a/chrome/browser/resources/omnibox/omnibox.js b/chrome/browser/resources/omnibox/omnibox.js
index 1cac3e1..190b77c 100644
--- a/chrome/browser/resources/omnibox/omnibox.js
+++ b/chrome/browser/resources/omnibox/omnibox.js
@@ -28,6 +28,14 @@
 let Request;
 
 /**
+  * @typedef {{
+  *   batchMode: string,
+  *   batchQueryInputs: Array<QueryInputs>,
+  * }}
+  */
+let BatchSpecifier;
+
+/**
  * @typedef {{
  *   queryInputs: QueryInputs,
  *   displayInputs: DisplayInputs,
@@ -155,6 +163,8 @@
       'filter-input-changed', e => omniboxOutput.updateFilterText(e.detail));
   omniboxInput.addEventListener('import', e => exportDelegate.import(e.detail));
   omniboxInput.addEventListener(
+      'process-batch', e => exportDelegate.processBatchData(e.detail));
+  omniboxInput.addEventListener(
       'export-clipboard', () => exportDelegate.exportClipboard());
   omniboxInput.addEventListener(
       'export-file', () => exportDelegate.exportFile());
@@ -178,16 +188,83 @@
     this.omniboxOutput_ = omniboxOutput;
   }
 
-  /** @param {OmniboxExport} importData */
+  /**
+   * Import a single data item previously exported.
+   * @param {OmniboxExport} importData
+   * @return {boolean} true if a single data item was imported for viewing;
+   * false if import failed.
+   */
   import(importData) {
     if (!validateImportData_(importData)) {
-      return;
+      // TODO(manukh): Make use of this return value to fix the UI state
+      // bug in omnibox_input.js -- see the related TODO there.
+      return false;
     }
     this.omniboxInput_.queryInputs = importData.queryInputs;
     this.omniboxInput_.displayInputs = importData.displayInputs;
     this.omniboxOutput_.updateQueryInputs(importData.queryInputs);
     this.omniboxOutput_.updateDisplayInputs(importData.displayInputs);
     this.omniboxOutput_.setResponsesHistory(importData.responsesHistory);
+    return true;
+  }
+
+  /**
+   * This is the worker function that transforms query inputs to accumulate
+   * batch exports, then finally initiates a download for the complete set.
+   * @param {!Array<!QueryInputs>} batchQueryInputs
+   */
+  async processBatch(batchQueryInputs) {
+    const batchExports = [];
+    for (const queryInputs of batchQueryInputs) {
+      const omniboxResponse = await browserProxy
+        .makeRequest(
+          queryInputs.inputText, queryInputs.resetAutocompleteController,
+          queryInputs.cursorPosition, queryInputs.zeroSuggest,
+          queryInputs.preventInlineAutocomplete, queryInputs.preferKeyword,
+          queryInputs.currentUrl, queryInputs.pageClassification, false);
+      const exportData = {
+        queryInputs,
+        // TODO(orinj|manukh): Make the schema consistent and remove
+        // the extra level of array nesting.  [[This]] is done for now
+        // so that elements can be extracted in the form import expects.
+        responsesHistory: [[omniboxResponse]],
+        displayInputs: this.omniboxInput_.displayInputs,
+      };
+      batchExports.push(exportData);
+    }
+    const fileName = `omnibox_batch_${ExportDelegate.getTimeStamp()}.json`;
+    const batchData = { appVersion: navigator.appVersion, batchExports };
+    ExportDelegate.download_(batchData, fileName);
+  }
+
+  /**
+   * Event handler for uploaded batch processing specifier data, kicks off
+   * the processBatch asynchronous pipeline.
+   * @param {!BatchSpecifier} processBatchData
+   */
+  processBatchData(processBatchData) {
+    if (processBatchData.batchMode && processBatchData.batchQueryInputs) {
+      this.processBatch(processBatchData.batchQueryInputs);
+    } else {
+      const expected = {
+        batchMode: "combined",
+        batchQueryInputs: [
+          {
+            inputText: "example input text",
+            cursorPosition: 18,
+            resetAutocompleteController: false,
+            cursorLock: false,
+            zeroSuggest: false,
+            preventInlineAutocomplete: false,
+            preferKeyword: false,
+            currentUrl: "",
+            pageClassification: "4"
+          }
+        ],        
+      };
+      console.error(`Invalid batch specifier data.  Expected format: \n${
+          JSON.stringify(expected, null, 2)}`);
+    }
   }
 
   exportClipboard() {
@@ -197,8 +274,9 @@
 
   exportFile() {
     const exportData = this.exportData_;
-    const fileName = `omnibox_debug_export_${exportData.queryInputs.inputText}_
-        ${new Date().toISOString()}.json`;
+    const timeStamp = ExportDelegate.getTimeStamp();
+    const fileName =
+        `omnibox_debug_export_${exportData.queryInputs.inputText}_${timeStamp}.json`;
     ExportDelegate.download_(exportData, fileName);
   }
 
@@ -225,6 +303,12 @@
     a.download = fileName;
     a.click();
   }
+
+  /** @return {string} A sortable timestamp string for use in filenames. */
+  static getTimeStamp() {
+    const iso = new Date().toISOString();
+    return iso.replace(/:/g, '').split('.')[0];
+  }
 }
 
 /**
diff --git a/chrome/browser/resources/omnibox/omnibox_input.js b/chrome/browser/resources/omnibox/omnibox_input.js
index 2ed0edb..5ce07fc9 100644
--- a/chrome/browser/resources/omnibox/omnibox_input.js
+++ b/chrome/browser/resources/omnibox/omnibox_input.js
@@ -84,10 +84,15 @@
         .addEventListener('click', this.onImportClipboard_.bind(this));
     this.$$('#import-file-input')
         .addEventListener('input', this.onImportFile_.bind(this));
+    this.$$('#process-batch-input')
+        .addEventListener('input', this.onProcessBatchFile_.bind(this));
     ['#import-clipboard', '#import-file'].forEach(query => {
       this.setupDragListeners_(this.$$(query));
       this.$$(query).addEventListener('drop', this.onImportDropped_.bind(this));
     });
+    this.setupDragListeners_(this.$$('#process-batch'));
+    this.$$('#process-batch')
+        .addEventListener('drop', this.onProcessBatchDropped_.bind(this));
   }
 
   /**
@@ -252,6 +257,11 @@
   }
 
   /** @private @param {!Event} event */
+  onProcessBatchFile_(event) {
+    this.processBatchFile_(event.target.files[0]);
+  }
+
+  /** @private @param {!Event} event */
   onImportDropped_(event) {
     const dragText = event.dataTransfer.getData('Text');
     if (dragText) {
@@ -261,23 +271,31 @@
     }
   }
 
+  /** @private @param {!Event} event */
+  onProcessBatchDropped_(event) {
+    const dragText = event.dataTransfer.getData('Text');
+    if (dragText) {
+      this.processBatch_(dragText);
+    } else if (event.dataTransfer.files[0]) {
+      this.processBatchFile_(event.dataTransfer.files[0]);
+    }
+  }
+
   /** @private @param {!File} file */
   importFile_(file) {
-    const reader = new FileReader();
-    reader.onloadend = () => {
-      if (reader.readyState === FileReader.DONE) {
-        this.import_(/** @type {string} */ (reader.result));
-      } else {
-        console.error('error importing, unable to read file:', reader.error);
-      }
-    };
-    reader.readAsText(file);
+    OmniboxInput.readFile_(file).then(this.import_.bind(this));
+  }
+
+  /** @private @param {!File} file */
+  processBatchFile_(file) {
+    OmniboxInput.readFile_(file).then(this.processBatch_.bind(this));
   }
 
   /** @private @param {string} importString */
   import_(importString) {
     try {
       const importData = JSON.parse(importString);
+      // TODO(manukh): If import fails, this UI state change shouldn't happen.
       this.$$('#imported-warning').hidden = false;
       this.dispatchEvent(new CustomEvent('import', {detail: importData}));
     } catch (error) {
@@ -285,6 +303,32 @@
     }
   }
 
+  /** @private @param {string} processBatchString */
+  processBatch_(processBatchString) {
+    try {
+      const processBatchData = JSON.parse(processBatchString);
+      this.dispatchEvent(
+          new CustomEvent('process-batch', {detail: processBatchData}));
+    } catch (error) {
+      console.error('error during process batch, invalid json:', error);
+    }
+  }
+
+  /** @private @param {!File} file */
+  static readFile_(file) {
+    return new Promise(resolve => {
+      const reader = new FileReader();
+      reader.onloadend = () => {
+        if (reader.readyState === FileReader.DONE) {
+          resolve(/** @type {string} */(reader.result));
+        } else {
+          console.error('error importing, unable to read file:', reader.error);
+        }
+      };
+      reader.readAsText(file);
+    });
+  }
+
   /** @return {DisplayInputs} */
   static get defaultDisplayInputs() {
     return {
diff --git a/chrome/browser/resources/print_preview/native_layer.js b/chrome/browser/resources/print_preview/native_layer.js
index 70e3ae5..083782cf 100644
--- a/chrome/browser/resources/print_preview/native_layer.js
+++ b/chrome/browser/resources/print_preview/native_layer.js
@@ -43,7 +43,8 @@
  *   isHeaderFooterManaged: boolean,
  *   serializedAppStateStr: ?string,
  *   serializedDefaultDestinationSelectionRulesStr: ?string,
- *   cloudPrintURL: (string | undefined)
+ *   cloudPrintURL: (string | undefined),
+ *   userAccounts: (Array<string> | undefined)
  * }}
  * @see corresponding field name definitions in print_preview_handler.cc
  */
diff --git a/chrome/browser/resources/settings/autofill_page/BUILD.gn b/chrome/browser/resources/settings/autofill_page/BUILD.gn
index c40261f..84a9f949 100644
--- a/chrome/browser/resources/settings/autofill_page/BUILD.gn
+++ b/chrome/browser/resources/settings/autofill_page/BUILD.gn
@@ -9,6 +9,7 @@
     ":address_edit_dialog",
     ":autofill_page",
     ":autofill_section",
+    ":blocking_request_manager",
     ":credit_card_edit_dialog",
     ":credit_card_list",
     ":credit_card_list_entry",
@@ -50,6 +51,9 @@
   externs_list = [ "$externs_path/autofill_private.js" ]
 }
 
+js_library("blocking_request_manager") {
+}
+
 js_library("payments_section") {
   deps = [
     ":credit_card_edit_dialog",
@@ -134,5 +138,8 @@
 }
 
 js_library("show_password_behavior") {
+  deps = [
+    ":blocking_request_manager",
+  ]
   externs_list = [ "$externs_path/passwords_private.js" ]
 }
diff --git a/chrome/browser/resources/settings/autofill_page/blocking_request_manager.html b/chrome/browser/resources/settings/autofill_page/blocking_request_manager.html
new file mode 100644
index 0000000..12f5388
--- /dev/null
+++ b/chrome/browser/resources/settings/autofill_page/blocking_request_manager.html
@@ -0,0 +1,2 @@
+<link rel="import" href="chrome://resources/html/cr.html">
+<script src="blocking_request_manager.js"></script>
diff --git a/chrome/browser/resources/settings/autofill_page/blocking_request_manager.js b/chrome/browser/resources/settings/autofill_page/blocking_request_manager.js
new file mode 100644
index 0000000..69d4eb6
--- /dev/null
+++ b/chrome/browser/resources/settings/autofill_page/blocking_request_manager.js
@@ -0,0 +1,40 @@
+// 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.
+
+/**
+ * @fileoverview Helper class for making blocking requests that are resolved
+ * elsewhere in the DOM.
+ */
+cr.define('settings', function() {
+  class BlockingRequestManager {
+    /** @param {Function} makeRequest Function to initiate flow for request. */
+    constructor(makeRequest) {
+      this.makeRequest_ = makeRequest;
+      /**
+       * @private {Function} callback Provided in requests and called when the
+       *     request is resolved.
+       */
+      this.callback_ = null;
+    }
+
+    /**
+     * Make a blocking request.
+     * @param {Function} callback Function to be called if/when the request is
+     *     successfully resolved.
+     */
+    request(callback) {
+      this.callback_ = callback;
+      this.makeRequest_();
+    }
+
+    /** Called if/when request is resolved successfully. */
+    resolve() {
+      this.callback_();
+    }
+  }
+
+  return {
+    BlockingRequestManager: BlockingRequestManager,
+  };
+});
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.html b/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.html
index bc044b5..ab305896 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.html
+++ b/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.html
@@ -6,6 +6,9 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-progress/paper-progress.html">
 <link rel="import" href="../settings_shared_css.html">
+<if expr="chromeos">
+<link rel="import" href="blocking_request_manager.html">
+</if>
 
 <dom-module id="passwords-export-dialog">
   <template>
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.js b/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.js
index 094f607..d57d449 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.js
+++ b/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.js
@@ -52,6 +52,11 @@
 
     /** @private */
     showErrorDialog_: Boolean,
+
+    // <if expr="chromeos">
+    /** @type settings.BlockingRequestManager */
+    tokenRequestManager: Object
+    // </if>
   },
 
   listeners: {
@@ -177,11 +182,22 @@
     this.async(() => this.fire('passwords-export-dialog-close'));
   },
 
+  /** @private */
+  onExportTap_: function() {
+    // <if expr="chromeos">
+    this.tokenRequestManager.request(this.exportPasswords_.bind(this));
+    // </if>
+    // <if expr="not chromeos">
+    this.exportPasswords_();
+    // </if>
+  },
+
   /**
-   * Fires an event that should trigger the password export process.
+   * Tells the PasswordsPrivate API to export saved passwords in a .csv pending
+   * security checks.
    * @private
    */
-  onExportTap_: function() {
+  exportPasswords_: function() {
     this.passwordManager_.exportPasswords(() => {
       if (chrome.runtime.lastError &&
           chrome.runtime.lastError.message == 'in-progress') {
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.html b/chrome/browser/resources/settings/autofill_page/passwords_section.html
index 74cd237..2f65256 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_section.html
+++ b/chrome/browser/resources/settings/autofill_page/passwords_section.html
@@ -23,6 +23,10 @@
 <link rel="import" href="passwords_shared_css.html">
 <link rel="import" href="password_list_item.html">
 <link rel="import" href="password_manager_proxy.html">
+<if expr="chromeos">
+<link rel="import" href="../controls/password_prompt_dialog.html">
+<link rel="import" href="blocking_request_manager.html">
+</if>
 
 <dom-module id="passwords-section">
   <template>
@@ -106,6 +110,9 @@
           scroll-target="[[subpageScrollTarget]]" risk-selection>
         <template>
           <password-list-item item="[[item]]" tabindex$="[[tabIndex]]"
+<if expr="chromeos">
+              token-request-manager="[[tokenRequestManager_]]"
+</if>
               first$="[[!index]]" iron-list-tab-index="[[tabIndex]]"
               last-focused="{{lastFocused_}}" list-blurred="{{listBlurred_}}">
           </password-list-item>
@@ -134,14 +141,27 @@
     </cr-action-menu>
     <template is="dom-if" if="[[showPasswordsExportDialog_]]" restamp>
       <passwords-export-dialog
-          on-passwords-export-dialog-close="onPasswordsExportDialogClosed_">
+<if expr="chromeos">
+        token-request-manager="[[tokenRequestManager_]]"
+</if>
+        on-passwords-export-dialog-close="onPasswordsExportDialogClosed_">
       </passwords-export-dialog>
     </template>
     <template is="dom-if" if="[[showPasswordEditDialog_]]" restamp>
       <password-edit-dialog on-close="onPasswordEditDialogClosed_"
+<if expr="chromeos">
+          token-request-manager="[[tokenRequestManager_]]"
+</if>
           item="[[activePassword.item]]">
       </password-edit-dialog>
     </template>
+<if expr="chromeos">
+    <template is="dom-if" if="[[showPasswordPromptDialog_]]" restamp>
+      <settings-password-prompt-dialog auth-token="{{authToken_}}"
+          on-close="onPasswordPromptClosed_">
+      </settings-password-prompt-dialog>
+    </template>
+</if>
     <cr-toast id="undoToast" duration="[[toastDuration_]]">
       <div id="undoLabel">$i18n{passwordDeleted}</div>
       <paper-button on-click="onUndoButtonTap_">
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.js b/chrome/browser/resources/settings/autofill_page/passwords_section.js
index 2dc5b59..1603dc8 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_section.js
+++ b/chrome/browser/resources/settings/autofill_page/passwords_section.js
@@ -122,11 +122,28 @@
 
     /** @private */
     listBlurred_: Boolean,
+
+    // <if expr="chromeos">
+    /**
+     * Auth token for retrieving passwords if required by OS.
+     * @private
+     */
+    authToken_: {
+      type: String,
+      value: '',
+      observer: 'onAuthTokenChanged_',
+    },
+
+    /** @private */
+    showPasswordPromptDialog_: Boolean,
+
+    /** @private {settings.BlockingRequestManager} */
+    tokenRequestManager_: Object
+    // </if>
   },
 
   listeners: {
     'password-menu-tap': 'onPasswordMenuTap_',
-    'export-passwords': 'onExportPasswords_',
   },
 
   keyBindings: {
@@ -184,6 +201,11 @@
     // Set the manager. These can be overridden by tests.
     this.passwordManager_ = PasswordManagerImpl.getInstance();
 
+    // <if expr="chromeos">
+    this.tokenRequestManager_ = new settings.BlockingRequestManager(
+        () => this.showPasswordPromptDialog_ = true);
+    // </if>
+
     // Request initial data.
     this.passwordManager_.getSavedPasswordList(setSavedPasswordsListener);
     this.passwordManager_.getExceptionList(setPasswordExceptionsListener);
@@ -219,6 +241,33 @@
     }
   },
 
+  // <if expr="chromeos">
+  /**
+   * When |authToken_| changes to a new non-empty value, it means that the
+   * password-prompt-dialog succeeded in creating a fresh token in the
+   * quickUnlockPrivate API. Because new tokens can only ever be created
+   * immediately following a GAIA password check, the passwordsPrivate API can
+   * now safely grant requests for secure data (i.e. saved passwords) for a
+   * limited time. This observer resolves the request, triggering a callback
+   * that requires a fresh auth token to succeed and that was provided to the
+   * BlockingRequestManager by another DOM element seeking secure data.
+   *
+   * @param {string} newToken The newly created auth token. Note that its
+   *     precise value is not relevant here, only the facts that it changed and
+   *     that it is non-empty (i.e. not expired).
+   * @private
+   */
+  onAuthTokenChanged_: function(newToken) {
+    if (newToken) {
+      this.tokenRequestManager_.resolve();
+    }
+  },
+
+  onPasswordPromptClosed_: function() {
+    this.showPasswordPromptDialog_ = false;
+  },
+  // </if>
+
   /**
    * Shows the edit password dialog.
    * @param {!Event} e
diff --git a/chrome/browser/resources/settings/autofill_page/show_password_behavior.html b/chrome/browser/resources/settings/autofill_page/show_password_behavior.html
index 73ee8c0..f9787f2a 100644
--- a/chrome/browser/resources/settings/autofill_page/show_password_behavior.html
+++ b/chrome/browser/resources/settings/autofill_page/show_password_behavior.html
@@ -1,2 +1,6 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
+<if expr="chromeos">
+<link rel="import" href="blocking_request_manager.html">
+</if>
+
 <script src="show_password_behavior.js"></script>
diff --git a/chrome/browser/resources/settings/autofill_page/show_password_behavior.js b/chrome/browser/resources/settings/autofill_page/show_password_behavior.js
index 097bdb2..4f73b4d 100644
--- a/chrome/browser/resources/settings/autofill_page/show_password_behavior.js
+++ b/chrome/browser/resources/settings/autofill_page/show_password_behavior.js
@@ -16,6 +16,11 @@
      * @type {!ShowPasswordBehavior.UiEntryWithPassword}
      */
     item: Object,
+
+    // <if expr="chromeos">
+    /** @type settings.BlockingRequestManager */
+    tokenRequestManager: Object
+    // </if>
   },
 
   /**
@@ -69,13 +74,22 @@
   onShowPasswordButtonTap_: function() {
     if (this.item.password) {
       this.set('item.password', '');
-    } else {
-      PasswordManagerImpl.getInstance()
-          .getPlaintextPassword(this.item.entry.id)
-          .then(password => {
-            this.set('item.password', password);
-          });
+      return;
     }
+    PasswordManagerImpl.getInstance()
+        .getPlaintextPassword(this.item.entry.id)
+        .then(password => {
+          if (password) {
+            this.set('item.password', password);
+          }
+          // <if expr="chromeos">
+          if (!password) {
+            // If no password was found, refresh auth token and retry.
+            this.tokenRequestManager.request(
+                this.onShowPasswordButtonTap_.bind(this));
+          }
+          // </if>
+        });
   },
 };
 
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd
index d8021a7..eebda2c 100644
--- a/chrome/browser/resources/settings/os_settings_resources.grd
+++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -1232,8 +1232,13 @@
                  type="chrome_html"/>
       <structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ACCOUNTS_JS"
                  file="people_page/kerberos_accounts.js"
-                 type="chrome_html"
-                 preprocess="true" />
+                 type="chrome_html"/>
+      <structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ADD_ACCOUNT_DIALOG_HTML"
+                 file="people_page/kerberos_add_account_dialog.html"
+                 type="chrome_html"/>
+      <structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ADD_ACCOUNT_DIALOG_JS"
+                 file="people_page/kerberos_add_account_dialog.js"
+                 type="chrome_html"/>
       <structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KEREROS_ACCOUNTS_BROWSER_PROXY_HTML"
                  file="people_page/kerberos_accounts_browser_proxy.html"
                  type="chrome_html"/>
diff --git a/chrome/browser/resources/settings/people_page/BUILD.gn b/chrome/browser/resources/settings/people_page/BUILD.gn
index 6750eb3..68f69699 100644
--- a/chrome/browser/resources/settings/people_page/BUILD.gn
+++ b/chrome/browser/resources/settings/people_page/BUILD.gn
@@ -33,6 +33,7 @@
       ":fingerprint_list",
       ":kerberos_accounts",
       ":kerberos_accounts_browser_proxy",
+      ":kerberos_add_account_dialog",
       ":lock_screen",
       ":lock_screen_password_prompt_dialog",
       ":lock_state_behavior",
@@ -125,6 +126,15 @@
   ]
 }
 
+js_library("kerberos_add_account_dialog") {
+  deps = [
+    ":kerberos_accounts_browser_proxy",
+    "//ui/webui/resources/cr_elements/cr_input:cr_input",
+    "//ui/webui/resources/js:cr",
+    "//ui/webui/resources/js:i18n_behavior",
+    "//ui/webui/resources/js:web_ui_listener_behavior",
+  ]
+}
 js_library("lock_screen") {
   deps = [
     ":fingerprint_browser_proxy",
diff --git a/chrome/browser/resources/settings/people_page/kerberos_accounts.html b/chrome/browser/resources/settings/people_page/kerberos_accounts.html
index b977bbc..b7b295f 100644
--- a/chrome/browser/resources/settings/people_page/kerberos_accounts.html
+++ b/chrome/browser/resources/settings/people_page/kerberos_accounts.html
@@ -11,6 +11,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
 <link rel="import" href="../settings_shared_css.html">
 <link rel="import" href="kerberos_accounts_browser_proxy.html">
+<link rel="import" href="kerberos_add_account_dialog.html">
 
 <dom-module id="settings-kerberos-accounts">
   <template>
@@ -63,7 +64,7 @@
       <div id="account-list-header" class="flex">
         <h2>$i18n{kerberosAccountsListHeader}</h2>
       </div>
-      <paper-button id="add-account-button" on-click="addAccount_">
+      <paper-button id="add-account-button" on-click="onAddAccountClick_">
         <div id="add-account-icon"></div>
         $i18n{kerberosAccountsAddAccountLabel}
       </paper-button>
@@ -112,6 +113,12 @@
         </button>
       </cr-action-menu>
     </div>
+
+    <template is="dom-if" if="[[showAddAccountDialog_]]" restamp>
+      <kerberos-add-account-dialog username="[[addAccountPresetUsername_]]"
+          on-close="onAddAccountDialogClosed_">
+      </kerberos-add-account-dialog>
+    </template>
   </template>
   <script src="kerberos_accounts.js"></script>
 </dom-module>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/people_page/kerberos_accounts.js b/chrome/browser/resources/settings/people_page/kerberos_accounts.js
index cf85a05..219fe4f 100644
--- a/chrome/browser/resources/settings/people_page/kerberos_accounts.js
+++ b/chrome/browser/resources/settings/people_page/kerberos_accounts.js
@@ -32,6 +32,15 @@
      * @private {?settings.KerberosAccount}
      */
     actionMenuAccount_: Object,
+
+    /** @private */
+    addAccountPresetUsername_: {
+      type: String,
+      value: '',
+    },
+
+    /** @private */
+    showAddAccountDialog_: Boolean,
   },
 
   /** @private {?settings.KerberosAccountsBrowserProxy} */
@@ -63,8 +72,9 @@
    * @param {!Event} event
    * @private
    */
-  addAccount_: function(event) {
-    this.browserProxy_.addAccount();
+  onAddAccountClick_: function(event) {
+    this.addAccountPresetUsername_ = '';
+    this.showAddAccountDialog_ = true;
   },
 
   /**
@@ -72,7 +82,13 @@
    * @private
    */
   onReauthenticationClick_: function(event) {
-    this.browserProxy_.reauthenticateAccount(event.model.item.principalName);
+    this.addAccountPresetUsername_ = event.model.item.principalName;
+    this.showAddAccountDialog_ = true;
+  },
+
+  /** @private */
+  onAddAccountDialogClosed_: function() {
+    this.showAddAccountDialog_ = false;
   },
 
   /**
diff --git a/chrome/browser/resources/settings/people_page/kerberos_accounts_browser_proxy.html b/chrome/browser/resources/settings/people_page/kerberos_accounts_browser_proxy.html
index 7ca5511cc..c74b570 100644
--- a/chrome/browser/resources/settings/people_page/kerberos_accounts_browser_proxy.html
+++ b/chrome/browser/resources/settings/people_page/kerberos_accounts_browser_proxy.html
@@ -1 +1,2 @@
+<link rel="import" href="chrome://resources/html/cr.html">
 <script src="kerberos_accounts_browser_proxy.js"></script>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/people_page/kerberos_accounts_browser_proxy.js b/chrome/browser/resources/settings/people_page/kerberos_accounts_browser_proxy.js
index a9731c7..25ec4f1 100644
--- a/chrome/browser/resources/settings/people_page/kerberos_accounts_browser_proxy.js
+++ b/chrome/browser/resources/settings/people_page/kerberos_accounts_browser_proxy.js
@@ -20,6 +20,33 @@
 settings.KerberosAccount;
 
 cr.define('settings', function() {
+  /**
+   *  @enum {number}
+   *  These values must be kept in sync with the ErrorType enum in
+   *  third_party/cros_system_api/dbus/kerberos/kerberos_service.proto.
+   */
+  const KerberosErrorType = {
+    kNone: 0,
+    kUnknown: 1,
+    kDBusFailure: 2,
+    kNetworkProblem: 3,
+    kUnknownKrb5Error: 4,
+    kBadPrincipal: 5,
+    kBadPassword: 6,
+    kPasswordExpired: 7,
+    kPasswordRejected: 8,
+    kNoCredentialsCacheFound: 9,
+    kKerberosTicketExpired: 10,
+    kKdcDoesNotSupportEncryptionType: 11,
+    kContactingKdcFailed: 12,
+    kParseRequestFailed: 13,
+    kLocalIo: 14,
+    kUnknownPrincipalName: 15,
+    kDuplicatePrincipalName: 16,
+    kInProgress: 17,
+    kParsePrincipalFailed: 18,
+  };
+
   /** @interface */
   class KerberosAccountsBrowserProxy {
     /**
@@ -30,16 +57,12 @@
     getAccounts() {}
 
     /**
-     * Triggers the 'Add account' flow.
+     * Attempts to add a new (or update an existing) Kerberos account.
+     * @param {string} principalName Kerberos principal (user@realm.com).
+     * @param {string} password Account password.
+     * @return {!Promise<!settings.KerberosErrorType>}
      */
-    addAccount() {}
-
-    /**
-     * Triggers the re-authentication flow for the account pointed to by
-     * |principalName|.
-     * @param {!string} principalName
-     */
-    reauthenticateAccount(principalName) {}
+    addAccount(principalName, password) {}
 
     /**
      * Removes |account| from the set of Kerberos accounts.
@@ -58,13 +81,8 @@
     }
 
     /** @override */
-    addAccount() {
-      chrome.send('addKerberosAccount');
-    }
-
-    /** @override */
-    reauthenticateAccount(principalName) {
-      chrome.send('reauthenticateKerberosAccount', [principalName]);
+    addAccount(principalName, password) {
+      return cr.sendWithPromise('addKerberosAccount', principalName, password);
     }
 
     /** @override */
@@ -76,6 +94,7 @@
   cr.addSingletonGetter(KerberosAccountsBrowserProxyImpl);
 
   return {
+    KerberosErrorType: KerberosErrorType,
     KerberosAccountsBrowserProxy: KerberosAccountsBrowserProxy,
     KerberosAccountsBrowserProxyImpl: KerberosAccountsBrowserProxyImpl,
   };
diff --git a/chrome/browser/resources/settings/people_page/kerberos_add_account_dialog.html b/chrome/browser/resources/settings/people_page/kerberos_add_account_dialog.html
new file mode 100644
index 0000000..c6a15532
--- /dev/null
+++ b/chrome/browser/resources/settings/people_page/kerberos_add_account_dialog.html
@@ -0,0 +1,63 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
+<link rel="import" href="chrome://resources/cr_elements/icons.html">
+<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html">
+<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/html/load_time_data.html">
+<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="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="kerberos_accounts_browser_proxy.html">
+
+<dom-module id="kerberos-add-account-dialog">
+  <template>
+    <style include="paper-button-style">
+      .label {
+        @apply --cr-form-field-label;
+      }
+
+      #credentials > cr-input:not(:last-child) {
+        margin-bottom: var(--cr-form-field-bottom-spacing);
+      }
+
+      #general-error-container {
+        height: 48px;
+      }
+    </style>
+    <cr-dialog id="dialog">
+      <div slot="title">$i18n{addKerberosAccount}</div>
+      <div slot="body" spellcheck="false">
+        <div id="general-error-container">
+          <div hidden="[[!showError_(generalErrorText_)]]">
+            <iron-icon id="general-error-icon" icon="cr:warning"></iron-icon>
+            <div id="general-error-message">[[generalErrorText_]]</div>
+          </div>
+        </div>
+        <div id="credentials">
+          <cr-input id="username" label="$i18n{kerberosUsername}"
+              value="{{username}}" invalid="[[showError_(usernameErrorText_)]]"
+              error-message="[[usernameErrorText_]]">
+          </cr-input>
+          <cr-input id="password" type="password"
+              label="$i18n{kerberosPassword}" value="{{password_}}"
+              invalid="[[showError_(passwordErrorText_)]]"
+              error-message="[[passwordErrorText_]]">
+          </cr-input>
+        </div>
+      </div>
+      <div slot="button-container">
+        <paper-button class="cancel-button" on-click="onCancel_" id="cancel">
+          $i18n{cancel}
+        </paper-button>
+        <paper-button class="action-button" on-click="onAdd_"
+            disabled="[[inProgress_]]">
+          $i18n{add}
+        </paper-button>
+      </div>
+    </cr-dialog>
+  </template>
+  <script src="kerberos_add_account_dialog.js"></script>
+</dom-module>
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/people_page/kerberos_add_account_dialog.js b/chrome/browser/resources/settings/people_page/kerberos_add_account_dialog.js
new file mode 100644
index 0000000..2b139099
--- /dev/null
+++ b/chrome/browser/resources/settings/people_page/kerberos_add_account_dialog.js
@@ -0,0 +1,151 @@
+// 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.
+
+/**
+ * @fileoverview
+ * 'kerberos-add-account-dialog' is an element to add Kerberos accounts.
+ */
+
+Polymer({
+  is: 'kerberos-add-account-dialog',
+
+  behaviors: [I18nBehavior],
+
+  properties: {
+    username: {
+      type: String,
+      value: '',
+    },
+
+    /** @private */
+    password_: {
+      type: String,
+      value: '',
+    },
+
+    /** @private */
+    generalErrorText_: {
+      type: String,
+      value: '',
+    },
+
+    /** @private */
+    usernameErrorText_: {
+      type: String,
+      value: '',
+    },
+
+    /** @private */
+    passwordErrorText_: {
+      type: String,
+      value: '',
+    },
+
+    /** @private */
+    inProgress_: {
+      type: Boolean,
+      value: false,
+    },
+  },
+
+  /** @private {?settings.KerberosAccountsBrowserProxy} */
+  browserProxy_: null,
+
+  /** @private {!settings.KerberosErrorType} */
+  lastError_: settings.KerberosErrorType.kNone,
+
+  /** @override */
+  attached: function() {
+    this.$.dialog.showModal();
+
+    // If a non-empty username is preset, make the UI read-only.
+    // Note: At least the focus() part needs to be after showModal.
+    if (this.username) {
+      this.$.username.disabled = true;
+      this.$.password.focus();
+    }
+  },
+
+  /** @private */
+  onCancel_: function() {
+    this.$.dialog.cancel();
+  },
+
+  /** @private */
+  onAdd_: function() {
+    this.inProgress_ = true;
+    this.updateErrorMessages_(settings.KerberosErrorType.kNone);
+
+    settings.KerberosAccountsBrowserProxyImpl.getInstance()
+        .addAccount(this.username, this.password_)
+        .then(error => {
+          this.inProgress_ = false;
+
+          // Success case. Close dialog.
+          if (error == settings.KerberosErrorType.kNone) {
+            this.$.dialog.close();
+            return;
+          }
+
+          // Triggers the UI to update error messages.
+          this.updateErrorMessages_(error);
+        });
+  },
+
+  /**
+   * @param {!settings.KerberosErrorType} error Current error enum
+   * @private
+   */
+  updateErrorMessages_: function(error) {
+    this.lastError_ = error;
+
+    this.generalErrorText_ = '';
+    this.usernameErrorText_ = '';
+    this.passwordErrorText_ = '';
+
+    switch (error) {
+      // TODO(ljusten): Proper errors
+      case settings.KerberosErrorType.kNone:
+        break;
+
+      case settings.KerberosErrorType.kNetworkProblem:
+        this.generalErrorText_ = 'Network problem or bad realm';
+        break;
+      case settings.KerberosErrorType.kParsePrincipalFailed:
+        this.usernameErrorText_ = 'Username invalid (should be user@realm.com)';
+        break;
+      case settings.KerberosErrorType.kBadPrincipal:
+        this.usernameErrorText_ = 'Username not known to server';
+        break;
+      case settings.KerberosErrorType.kContactingKdcFailed:
+        this.usernameErrorText_ = 'Contacting server for realm failed';
+        break;
+
+      case settings.KerberosErrorType.kBadPassword:
+        this.passwordErrorText_ = 'Password invalid';
+        break;
+      case settings.KerberosErrorType.kPasswordExpired:
+        this.passwordErrorText_ = 'Password expired';
+        break;
+
+      case settings.KerberosErrorType.kKdcDoesNotSupportEncryptionType:
+        this.generalErrorText_ = 'KDC does not support encryption type';
+        break;
+      default:
+        this.generalErrorText_ = this.i18nDynamic(
+            this.locale, 'kerberosGeneralErrorMessage', String(error));
+    }
+  },
+
+  /**
+   * Whether an error element should be shown.
+   * Note that !! is not supported in Polymer bindings.
+   * @param {?string} errorText Error text to be displayed. Empty if no error.
+   * @return {boolean} True iff errorText is not empty.
+   * @private
+   */
+  showError_: function(errorText) {
+    return !!errorText;
+  }
+});
\ No newline at end of file
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index 56b7350f..4b220cb 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -742,12 +742,22 @@
       <structure name="IDR_SETTINGS_ADDRESS_EDIT_DIALOG_JS"
                  file="autofill_page/address_edit_dialog.js"
                  type="chrome_html" />
+      <if expr="chromeos">
+        <structure name="IDR_SETTINGS_BLOCKING_REQUEST_MANAGER_HTML"
+                   file="autofill_page/blocking_request_manager.html"
+                   type="chrome_html" />
+        <structure name="IDR_SETTINGS_BLOCKING_REQUEST_MANAGER_JS"
+                   file="autofill_page/blocking_request_manager.js"
+                   type="chrome_html" />
+      </if>
       <structure name="IDR_SETTINGS_SHOW_PASSWORD_BEHAVIOR_HTML"
                  file="autofill_page/show_password_behavior.html"
-                 type="chrome_html" />
+                 type="chrome_html"
+                 preprocess="true" />
       <structure name="IDR_SETTINGS_SHOW_PASSWORD_BEHAVIOR_JS"
                  file="autofill_page/show_password_behavior.js"
-                 type="chrome_html" />
+                 type="chrome_html"
+                 preprocess="true" />
       <structure name="IDR_SETTINGS_PASSWORD_LIST_ITEM_HTML"
                  file="autofill_page/password_list_item.html"
                  type="chrome_html"
@@ -763,7 +773,8 @@
                  type="chrome_html" />
       <structure name="IDR_SETTINGS_PASSWORDS_SECTION_HTML"
                  file="autofill_page/passwords_section.html"
-                 type="chrome_html" />
+                 type="chrome_html"
+                 preprocess="true" />
       <structure name="IDR_SETTINGS_PASSWORDS_SECTION_JS"
                  file="autofill_page/passwords_section.js"
                  type="chrome_html"
@@ -777,10 +788,12 @@
                  type="chrome_html" />
       <structure name="IDR_SETTINGS_PASSWORDS_EXPORT_DIALOG_HTML"
                  file="autofill_page/passwords_export_dialog.html"
-                 type="chrome_html" />
+                 type="chrome_html"
+                 preprocess="true" />
       <structure name="IDR_SETTINGS_PASSWORDS_EXPORT_DIALOG_JS"
                  file="autofill_page/passwords_export_dialog.js"
-                 type="chrome_html" />
+                 type="chrome_html"
+                 preprocess="true" />
       <structure name="IDR_SETTINGS_PAYMENTS_SECTION_HTML"
                  file="autofill_page/payments_section.html"
                  type="chrome_html" />
@@ -1506,6 +1519,12 @@
         <structure name="IDR_SETTINGS_PEOPLE_PAGE_KERBEROS_ACCOUNTS_JS"
                    file="people_page/kerberos_accounts.js"
                    type="chrome_html"/>
+        <structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ADD_ACCOUNT_DIALOG_HTML"
+                   file="people_page/kerberos_add_account_dialog.html"
+                   type="chrome_html"/>
+        <structure name="IDR_OS_SETTINGS_PEOPLE_PAGE_KERBEROS_ADD_ACCOUNT_DIALOG_JS"
+                   file="people_page/kerberos_add_account_dialog.js"
+                   type="chrome_html"/>
         <structure name="IDR_SETTINGS_PEOPLE_PAGE_KERBEROS_ACCOUNTS_BROWSER_PROXY_HTML"
                    file="people_page/kerberos_accounts_browser_proxy.html"
                    type="chrome_html"/>
diff --git a/chrome/browser/resources/usb_internals/usb_internals.html b/chrome/browser/resources/usb_internals/usb_internals.html
index 6fee6e1..1450f51 100644
--- a/chrome/browser/resources/usb_internals/usb_internals.html
+++ b/chrome/browser/resources/usb_internals/usb_internals.html
@@ -23,11 +23,11 @@
   <script src="chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js"></script>
   <script src="chrome://resources/mojo/url/mojom/url.mojom-lite.js"></script>
 
-  <script src="device.mojom-lite.js"></script>
-  <script src="device_manager_client.mojom-lite.js"></script>
-  <script src="device_enumeration_options.mojom-lite.js"></script>
-  <script src="device_manager.mojom-lite.js"></script>
-  <script src="device_manager_test.mojom-lite.js"></script>
+  <script src="usb_device.mojom-lite.js"></script>
+  <script src="usb_manager_client.mojom-lite.js"></script>
+  <script src="usb_enumeration_options.mojom-lite.js"></script>
+  <script src="usb_manager.mojom-lite.js"></script>
+  <script src="usb_manager_test.mojom-lite.js"></script>
   <script src="usb_internals.mojom-lite.js"></script>
 
   <script src="descriptor_panel.js"></script>
@@ -199,4 +199,4 @@
   <script src="usb_internals.js"></script>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.cc
index e4943d6..8d182ed 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.cc
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.cc
@@ -27,7 +27,10 @@
 
 namespace send_tab_to_self {
 
-void CreateNewEntry(content::WebContents* tab, const GURL& link_url) {
+void CreateNewEntry(content::WebContents* tab,
+                    const std::string& target_device_name,
+                    const std::string& target_device_guid,
+                    const GURL& link_url) {
   content::NavigationEntry* navigation_entry =
       tab->GetController().GetLastCommittedEntry();
   Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext());
@@ -35,9 +38,6 @@
   std::string title = base::UTF16ToUTF8(navigation_entry->GetTitle());
   base::Time navigation_time = navigation_entry->GetTimestamp();
 
-  // TODO(crbug/946804) Add target device.
-  std::string target_device_guid;
-  std::string target_device_name;
   SendTabToSelfModel* model =
       SendTabToSelfSyncServiceFactory::GetForProfile(profile)
           ->GetSendTabToSelfModel();
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h b/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h
index 1355085..f99e01d 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h
@@ -37,7 +37,10 @@
 
 // Add a new entry to SendTabToSelfModel when user click "Share to your
 // devices" option.
-void CreateNewEntry(content::WebContents* tab, const GURL& link_url = GURL());
+void CreateNewEntry(content::WebContents* tab,
+                    const std::string& target_device_name,
+                    const std::string& target_device_guid,
+                    const GURL& link_url = GURL());
 
 // Get the icon for send tab to self menu item.
 gfx::ImageSkia* GetImageSkia();
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util_unittest.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util_unittest.cc
index d1c1a77..a011010 100644
--- a/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util_unittest.cc
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util_unittest.cc
@@ -96,23 +96,25 @@
   GURL url = entry->GetURL();
   std::string title = base::UTF16ToUTF8(entry->GetTitle());
   base::Time navigation_time = entry->GetTimestamp();
+  std::string target_device_sync_cache_name;
   std::string target_device_sync_cache_guid;
 
   SendTabToSelfModelMock* model_mock = static_cast<SendTabToSelfModelMock*>(
       SendTabToSelfSyncServiceFactory::GetForProfile(profile())
           ->GetSendTabToSelfModel());
 
-  // TODO(crbug/946804) Add target Device to createNewEntry call.
   EXPECT_CALL(*model_mock, AddEntry(url, title, navigation_time,
                                     target_device_sync_cache_guid))
       .WillOnce(testing::Return(nullptr));
-  CreateNewEntry(tab);
+  CreateNewEntry(tab, target_device_sync_cache_name,
+                 target_device_sync_cache_guid);
 
   GURL link_url = GURL("https://www.1112233.com");
   EXPECT_CALL(*model_mock, AddEntry(link_url, "", base::Time(),
                                     target_device_sync_cache_guid))
       .WillOnce(testing::Return(nullptr));
-  CreateNewEntry(tab, link_url);
+  CreateNewEntry(tab, target_device_sync_cache_name,
+                 target_device_sync_cache_guid, link_url);
 }
 
 }  // namespace
diff --git a/chrome/browser/service_process/service_process_control_browsertest.cc b/chrome/browser/service_process/service_process_control_browsertest.cc
index e915bd8..87b7a3a 100644
--- a/chrome/browser/service_process/service_process_control_browsertest.cc
+++ b/chrome/browser/service_process/service_process_control_browsertest.cc
@@ -23,6 +23,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_constants.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/cloud_print.mojom.h"
 #include "chrome/common/service_process_util.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -90,12 +91,24 @@
     // point to a bundle so that the service process has an Info.plist.
     base::FilePath exe_path;
     ASSERT_TRUE(base::PathService::Get(base::DIR_EXE, &exe_path));
+#if BUILDFLAG(NEW_MAC_BUNDLE_STRUCTURE)
+    exe_path = exe_path.DirName()
+                   .DirName()
+                   .Append("Contents")
+                   .Append("Frameworks")
+                   .Append(chrome::kFrameworkName)
+                   .Append("Versions")
+                   .Append(chrome::kChromeVersion)
+                   .Append("Helpers")
+                   .Append(chrome::kHelperProcessExecutablePath);
+#else
     exe_path = exe_path.DirName()
                    .DirName()
                    .Append("Contents")
                    .Append("Versions")
                    .Append(chrome::kChromeVersion)
                    .Append(chrome::kHelperProcessExecutablePath);
+#endif
     child_process_exe_override_ = std::make_unique<base::ScopedPathOverride>(
         content::CHILD_PROCESS_EXE, exe_path);
 #endif
diff --git a/chrome/browser/signin/dice_browsertest.cc b/chrome/browser/signin/dice_browsertest.cc
index 2e1327c..8963a30e 100644
--- a/chrome/browser/signin/dice_browsertest.cc
+++ b/chrome/browser/signin/dice_browsertest.cc
@@ -528,7 +528,8 @@
     }
   }
 
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override {
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override {
     ++token_revoked_notification_count_;
   }
 
diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc
index 076001e0..9ef3345 100644
--- a/chrome/browser/supervised_user/supervised_user_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_service.cc
@@ -87,14 +87,16 @@
 const char kBlacklistFilename[] = "su-blacklist.bin";
 
 const char* const kCustodianInfoPrefs[] = {
-  prefs::kSupervisedUserCustodianName,
-  prefs::kSupervisedUserCustodianEmail,
-  prefs::kSupervisedUserCustodianProfileImageURL,
-  prefs::kSupervisedUserCustodianProfileURL,
-  prefs::kSupervisedUserSecondCustodianName,
-  prefs::kSupervisedUserSecondCustodianEmail,
-  prefs::kSupervisedUserSecondCustodianProfileImageURL,
-  prefs::kSupervisedUserSecondCustodianProfileURL,
+    prefs::kSupervisedUserCustodianName,
+    prefs::kSupervisedUserCustodianEmail,
+    prefs::kSupervisedUserCustodianObfuscatedGaiaId,
+    prefs::kSupervisedUserCustodianProfileImageURL,
+    prefs::kSupervisedUserCustodianProfileURL,
+    prefs::kSupervisedUserSecondCustodianName,
+    prefs::kSupervisedUserSecondCustodianEmail,
+    prefs::kSupervisedUserSecondCustodianObfuscatedGaiaId,
+    prefs::kSupervisedUserSecondCustodianProfileImageURL,
+    prefs::kSupervisedUserSecondCustodianProfileURL,
 };
 
 void CreateURLAccessRequest(const GURL& url,
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index e2ce1741..9c7f737 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -758,9 +758,9 @@
       "//components/navigation_interception",
       "//components/subresource_filter/core/browser",
       "//crypto:platform",
-      "//device/usb/public/cpp",
-      "//device/usb/public/mojom",
       "//device/vr/buildflags",
+      "//services/device/public/cpp/usb",
+      "//services/device/public/mojom:usb",
       "//ui/android",
     ]
   } else {
@@ -1864,7 +1864,6 @@
       "//services/data_decoder/public/cpp",
       "//services/device/public/cpp:device_features",
       "//services/device/public/mojom",
-      "//services/ws/public/cpp",
       "//services/ws/public/mojom",
       "//ui/base/ime/chromeos",
       "//ui/chromeos",
@@ -2873,6 +2872,8 @@
       "views/sad_tab_view.h",
       "views/safe_browsing/password_reuse_modal_warning_dialog.cc",
       "views/safe_browsing/password_reuse_modal_warning_dialog.h",
+      "views/send_tab_to_self/send_tab_to_self_bubble_device_button.cc",
+      "views/send_tab_to_self/send_tab_to_self_bubble_device_button.h",
       "views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc",
       "views/send_tab_to_self/send_tab_to_self_bubble_view_impl.h",
       "views/send_tab_to_self/send_tab_to_self_icon_view.cc",
@@ -3095,10 +3096,7 @@
     }
 
     if (use_aura) {
-      deps += [
-        "//services/ws/public/cpp",
-        "//services/ws/public/mojom",
-      ]
+      deps += [ "//services/ws/public/mojom" ]
 
       # These files can do Gtk+-based theming for builds with gtk enabled.
       if (is_desktop_linux) {
@@ -3683,8 +3681,8 @@
       "webui/print_preview/sticky_settings.h",
     ]
     deps += [
-      "//device/usb/public/cpp",
-      "//device/usb/public/mojom",
+      "//services/device/public/cpp/usb",
+      "//services/device/public/mojom:usb",
     ]
 
     if (is_chromeos) {
diff --git a/chrome/browser/ui/app_list/app_list_client_impl.cc b/chrome/browser/ui/app_list/app_list_client_impl.cc
index 400e24c..472d97f 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl.cc
+++ b/chrome/browser/ui/app_list/app_list_client_impl.cc
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "ash/public/cpp/app_list/app_list_controller.h"
-#include "ash/public/interfaces/constants.mojom.h"
 #include "base/bind.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
@@ -35,11 +34,9 @@
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
-#include "content/public/common/service_manager_connection.h"
 #include "extensions/common/extension.h"
 #include "services/content/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
-#include "ui/base/models/menu_model.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/display/types/display_constants.h"
@@ -56,23 +53,9 @@
 
 }  // namespace
 
-AppListClientImpl::MojoRecorderForTest::MojoRecorderForTest() = default;
-AppListClientImpl::MojoRecorderForTest::~MojoRecorderForTest() = default;
-
-int AppListClientImpl::MojoRecorderForTest::Query(int profile_id) const {
-  auto iter = recorder_.find(profile_id);
-  return iter == recorder_.end() ? 0 : iter->second;
-}
-///////////////////////////////////////////////////////////////////////////////
-
-AppListClientImpl::AppListClientImpl() {
-  app_list::AppListController::Get()->SetClient(this);
-
-  // Get the mojo AppListController in Ash.
-  content::ServiceManagerConnection::GetForProcess()
-      ->GetConnector()
-      ->BindInterface(ash::mojom::kServiceName, &app_list_controller_);
-
+AppListClientImpl::AppListClientImpl()
+    : app_list_controller_(app_list::AppListController::Get()) {
+  app_list_controller_->SetClient(this);
   user_manager::UserManager::Get()->AddSessionStateObserver(this);
 
   DCHECK(!g_app_list_client_instance);
@@ -80,7 +63,6 @@
 }
 
 AppListClientImpl::~AppListClientImpl() {
-  app_list_controller_.reset();
   SetProfile(nullptr);
 
   user_manager::UserManager::Get()->RemoveSessionStateObserver(this);
@@ -88,8 +70,8 @@
   DCHECK_EQ(this, g_app_list_client_instance);
   g_app_list_client_instance = nullptr;
 
-  if (app_list::AppListController::Get())
-    app_list::AppListController::Get()->SetClient(nullptr);
+  if (app_list_controller_)
+    app_list_controller_->SetClient(nullptr);
 }
 
 // static
@@ -97,6 +79,14 @@
   return g_app_list_client_instance;
 }
 
+void AppListClientImpl::OnAppListControllerDestroyed() {
+  // |app_list_controller_| could be released earlier, e.g. starting a kiosk
+  // next session.
+  app_list_controller_ = nullptr;
+  if (current_model_updater_)
+    current_model_updater_->SetActive(false);
+}
+
 void AppListClientImpl::StartSearch(const base::string16& trimmed_query) {
   if (search_controller_) {
     search_controller_->Start(trimmed_query);
@@ -164,18 +154,6 @@
       std::move(callback)));
 }
 
-void AppListClientImpl::SearchResultContextMenuItemSelected(
-    const std::string& result_id,
-    int command_id,
-    int event_flags) {
-  if (!search_controller_)
-    return;
-  ChromeSearchResult* result = search_controller_->FindSearchResult(result_id);
-  if (!result)
-    return;
-  result->ContextMenuItemSelected(command_id, event_flags);
-}
-
 void AppListClientImpl::ViewClosing() {
   display_id_ = display::kInvalidDisplayId;
   if (search_controller_)
@@ -236,19 +214,6 @@
               std::move(callback)));
 }
 
-void AppListClientImpl::ContextMenuItemSelected(int profile_id,
-                                                const std::string& id,
-                                                int command_id,
-                                                int event_flags) {
-  auto* requested_model_updater = profile_model_mappings_[profile_id];
-  if (requested_model_updater != current_model_updater_ ||
-      !requested_model_updater) {
-    return;
-  }
-
-  requested_model_updater->ContextMenuItemSelected(id, command_id, event_flags);
-}
-
 void AppListClientImpl::OnAppListTargetVisibilityChanged(bool visible) {
   app_list_target_visibility_ = visible;
 }
@@ -260,9 +225,6 @@
 void AppListClientImpl::OnFolderCreated(
     int profile_id,
     ash::mojom::AppListItemMetadataPtr item) {
-  if (mojo_recorder_for_test_.get())
-    mojo_recorder_for_test_->Record(profile_id);
-
   auto* requested_model_updater = profile_model_mappings_[profile_id];
   if (!requested_model_updater)
     return;
@@ -411,15 +373,6 @@
   return current_model_updater_;
 }
 
-void AppListClientImpl::SetUpMojoRecorderForTest() {
-  mojo_recorder_for_test_ = std::make_unique<MojoRecorderForTest>();
-}
-
-int AppListClientImpl::QueryMojoRecorderForTest(int profile_id) {
-  DCHECK(mojo_recorder_for_test_.get());
-  return mojo_recorder_for_test_->Query(profile_id);
-}
-
 void AppListClientImpl::OnTemplateURLServiceChanged() {
   DCHECK(current_model_updater_);
 
@@ -453,8 +406,8 @@
   return ChromeLauncherController::instance()->profile();
 }
 
-ash::mojom::AppListController* AppListClientImpl::GetAppListController() const {
-  return app_list_controller_.get();
+app_list::AppListController* AppListClientImpl::GetAppListController() const {
+  return app_list_controller_;
 }
 
 void AppListClientImpl::DismissView() {
@@ -558,7 +511,3 @@
       return ash::LAUNCH_FROM_UNKNOWN;
   }
 }
-
-void AppListClientImpl::FlushMojoForTesting() {
-  app_list_controller_.FlushForTesting();
-}
diff --git a/chrome/browser/ui/app_list/app_list_client_impl.h b/chrome/browser/ui/app_list/app_list_client_impl.h
index 9b30a672..ceff688 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl.h
+++ b/chrome/browser/ui/app_list/app_list_client_impl.h
@@ -12,7 +12,6 @@
 
 #include "ash/public/cpp/app_list/app_list_client.h"
 #include "ash/public/cpp/shelf_types.h"
-#include "ash/public/interfaces/app_list.mojom.h"
 #include "base/callback_forward.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
@@ -41,29 +40,13 @@
       public user_manager::UserManager::UserSessionStateObserver,
       public TemplateURLServiceObserver {
  public:
-  class MojoRecorderForTest {
-   public:
-    MojoRecorderForTest();
-    ~MojoRecorderForTest();
-
-    void Record(int profile_id) { recorder_[profile_id]++; }
-
-    int Query(int profile_id) const;
-
-   private:
-    // For each pair in the map, the key is a profile id while the value is the
-    // mojo calling times associated with the particular profile.
-    std::map<int, int> recorder_;
-
-    DISALLOW_COPY_AND_ASSIGN(MojoRecorderForTest);
-  };
-
   AppListClientImpl();
   ~AppListClientImpl() override;
 
   static AppListClientImpl* GetInstance();
 
   // app_list::AppListClient:
+  void OnAppListControllerDestroyed() override;
   void StartSearch(const base::string16& trimmed_query) override;
   void OpenSearchResult(const std::string& result_id,
                         int event_flags,
@@ -76,9 +59,6 @@
   void GetSearchResultContextMenuModel(
       const std::string& result_id,
       GetContextMenuModelCallback callback) override;
-  void SearchResultContextMenuItemSelected(const std::string& result_id,
-                                           int command_id,
-                                           int event_flags) override;
   void ViewClosing() override;
   void ViewShown(int64_t display_id) override;
   void ActivateItem(int profile_id,
@@ -87,10 +67,6 @@
   void GetContextMenuModel(int profile_id,
                            const std::string& id,
                            GetContextMenuModelCallback callback) override;
-  void ContextMenuItemSelected(int profile_id,
-                               const std::string& id,
-                               int command_id,
-                               int event_flags) override;
   void OnAppListTargetVisibilityChanged(bool visible) override;
   void OnAppListVisibilityChanged(bool visible) override;
   void OnFolderCreated(int profile_id,
@@ -152,7 +128,7 @@
   bool app_list_visible() const { return app_list_visible_; }
 
   // Returns a pointer to control the app list views in ash.
-  ash::mojom::AppListController* GetAppListController() const;
+  app_list::AppListController* GetAppListController() const;
 
   AppListControllerDelegate* GetControllerDelegate();
   Profile* GetCurrentAppListProfile() const;
@@ -161,13 +137,6 @@
 
   AppListModelUpdater* GetModelUpdaterForTest();
 
-  void SetUpMojoRecorderForTest();
-
-  int QueryMojoRecorderForTest(int profile_id);
-
-  // Flushes all pending mojo call to Ash for testing.
-  void FlushMojoForTesting();
-
  private:
   FRIEND_TEST_ALL_PREFIXES(AppListClientWithProfileTest, CheckDataRace);
 
@@ -206,12 +175,10 @@
   std::unique_ptr<app_list::SearchController> search_controller_;
   std::unique_ptr<AppSyncUIStateWatcher> app_sync_ui_state_watcher_;
 
-  std::unique_ptr<MojoRecorderForTest> mojo_recorder_for_test_;
-
   ScopedObserver<TemplateURLService, AppListClientImpl>
       template_url_service_observer_{this};
 
-  ash::mojom::AppListControllerPtr app_list_controller_;
+  app_list::AppListController* app_list_controller_ = nullptr;
 
   bool app_list_target_visibility_ = false;
   bool app_list_visible_ = false;
diff --git a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
index 1c10efd..83e2365 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
+++ b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
@@ -246,7 +246,6 @@
 
   // Show the app list first, otherwise we won't have a search box to update.
   client->ShowAppList();
-  client->FlushMojoForTesting();
 
   // Currently the search box is empty, so we have no result.
   EXPECT_FALSE(search_controller->GetResultByTitleForTest(title));
@@ -255,16 +254,11 @@
   model_updater->UpdateSearchBox(base::ASCIIToUTF16(title),
                                  true /* initiated_by_user */);
 
-  // Ensure everything is done, from Chrome to Ash and backwards.
-  client->FlushMojoForTesting();
   EXPECT_TRUE(search_controller->GetResultByTitleForTest(title));
 
   // Uninstall the extension.
   UninstallExtension(extension->id());
 
-  // Ensure everything is done, from Chrome to Ash and backwards.
-  client->FlushMojoForTesting();
-
   // We cannot find the extension any more.
   EXPECT_FALSE(search_controller->GetResultByTitleForTest(title));
 
@@ -363,124 +357,3 @@
       "DemoMode.AppLaunchSource",
       chromeos::DemoSession::AppLaunchSource::kAppList, 1);
 }
-
-class AppListClientWithProfileTest : public InProcessBrowserTest {
- protected:
-  AppListClientWithProfileTest()
-      : account_id1_(
-            AccountId::FromUserEmailGaiaId("test1@example.com", "ID1")),
-        account_id2_(
-            AccountId::FromUserEmailGaiaId("test2@example.com", "ID2")) {}
-  ~AppListClientWithProfileTest() override {}
-
-  static std::unique_ptr<KeyedService> BuildTestSyncService(
-      content::BrowserContext* context) {
-    Profile* profile = Profile::FromBrowserContext(context);
-    return std::make_unique<app_list::AppListSyncableService>(
-        profile, extensions::ExtensionSystem::Get(profile));
-  }
-
-  static std::unique_ptr<KeyedService> BuildTestURLService(
-      content::BrowserContext* context) {
-    return std::make_unique<TemplateURLService>(nullptr, 0);
-  }
-
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    // Disable the password sync service. Otherwise the test will crash.
-    command_line->AppendSwitchASCII(
-        switches::kDisableSyncTypes,
-        syncer::ModelTypeSetToString(syncer::PASSWORDS));
-  }
-
-  void SetUpOnMainThread() override {
-    user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
-        std::make_unique<chromeos::FakeChromeUserManager>());
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-
-    profile1_ = BuildProfile(account_id1_);
-    profile2_ = BuildProfile(account_id2_);
-
-    AppListClientImpl::GetInstance()->SetUpMojoRecorderForTest();
-  }
-
-  void TearDownOnMainThread() override {
-    GetFakeUserManager()->RemoveUserFromList(account_id1_);
-    profile1_.reset();
-    profile2_.reset();
-    base::RunLoop().RunUntilIdle();
-    user_manager_enabler_.reset();
-  }
-
-  chromeos::FakeChromeUserManager* GetFakeUserManager() const {
-    return static_cast<chromeos::FakeChromeUserManager*>(
-        user_manager::UserManager::Get());
-  }
-
-  TestingProfile* GetProfile1() { return profile1_.get(); }
-  TestingProfile* GetProfile2() { return profile2_.get(); }
-
- private:
-  std::unique_ptr<TestingProfile> BuildProfile(AccountId account_id) {
-    GetFakeUserManager()->AddUser(account_id);
-    GetFakeUserManager()->LoginUser(account_id);
-
-    TestingProfile::Builder profile_builder;
-    profile_builder.SetPath(
-        temp_dir_.GetPath().AppendASCII(account_id.GetUserEmail()));
-    profile_builder.SetProfileName(account_id.GetUserEmail());
-
-    // Add service factories needed by AppListClientImpl::SetProfile.
-    profile_builder.AddTestingFactory(
-        app_list::AppListSyncableServiceFactory::GetInstance(),
-        base::BindRepeating(&BuildTestSyncService));
-    profile_builder.AddTestingFactory(
-        TemplateURLServiceFactory::GetInstance(),
-        base::BindRepeating(&BuildTestURLService));
-
-    return IdentityTestEnvironmentProfileAdaptor::
-        CreateProfileForIdentityTestEnvironment(profile_builder);
-  }
-
-  AccountId account_id1_;
-  AccountId account_id2_;
-  std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
-  std::unique_ptr<TestingProfile> profile1_;
-  std::unique_ptr<TestingProfile> profile2_;
-  base::ScopedTempDir temp_dir_;
-};
-
-// Verifies that in multi-profile mode, mojo callings from Ash side to access
-// the app list are handled by the correct AppListModelUpdater. (see
-// https://crbug.com/939755)
-IN_PROC_BROWSER_TEST_F(AppListClientWithProfileTest, CheckDataRace) {
-  AppListClientImpl* client = AppListClientImpl::GetInstance();
-
-  // Emulate that the default profile is the profile 1.
-  client->SetProfile(GetProfile1());
-  int profile_id1 = client->GetModelUpdaterForTest()->model_id();
-
-  // Emulate that the AppListSyncableService adds an item within the folder.
-  // So the AppListClientImpl should receive OnFolderCreated event later.
-  auto* model_updater = client->GetModelUpdaterForTest();
-  std::unique_ptr<ChromeAppListItem> item = std::make_unique<ChromeAppListItem>(
-      GetProfile1(), "item 1", model_updater);
-  item->SetFolderId("folder");
-  model_updater->AddItem(std::move(item));
-
-  // Emulate that the current profile is switched to the profile 2. Wait until
-  // the AppListClientImpl receives the mojo callings from Ash side.
-  client->SetProfile(GetProfile2());
-  client->FlushMojoForTesting();
-
-  int profile_id2 = client->GetModelUpdaterForTest()->model_id();
-
-  // Check the following things:
-  // (1) The model updater associated with the profile 2 should not process the
-  // OnFolderCreated event.
-  // (2) The model updater associated with the profile 1 should process the On-
-  // FolderCreated event.
-  EXPECT_EQ(0, client->QueryMojoRecorderForTest(profile_id2));
-  EXPECT_EQ(1, client->QueryMojoRecorderForTest(profile_id1));
-
-  client->SetProfile(nullptr);
-}
diff --git a/chrome/browser/ui/app_list/app_list_client_interactive_uitest.cc b/chrome/browser/ui/app_list/app_list_client_interactive_uitest.cc
index 434b1dea..f4ebf55 100644
--- a/chrome/browser/ui/app_list/app_list_client_interactive_uitest.cc
+++ b/chrome/browser/ui/app_list/app_list_client_interactive_uitest.cc
@@ -18,9 +18,7 @@
   AppListClientImpl* client = AppListClientImpl::GetInstance();
   ASSERT_FALSE(client->app_list_visible());
   client->ShowAppList();
-  client->FlushMojoForTesting();
   ASSERT_TRUE(client->app_list_visible());
   client->DismissView();
-  client->FlushMojoForTesting();
   ASSERT_FALSE(client->app_list_target_visibility());
 }
diff --git a/chrome/browser/ui/app_list/app_list_model_updater.h b/chrome/browser/ui/app_list/app_list_model_updater.h
index ca4a51b1..aa462f47 100644
--- a/chrome/browser/ui/app_list/app_list_model_updater.h
+++ b/chrome/browser/ui/app_list/app_list_model_updater.h
@@ -111,9 +111,6 @@
       base::OnceCallback<void(const base::flat_map<std::string, uint16_t>&)>;
   virtual void GetIdToAppListIndexMap(GetIdToAppListIndexMapCallback callback) {
   }
-  virtual void ContextMenuItemSelected(const std::string& id,
-                                       int command_id,
-                                       int event_flags) {}
   virtual syncer::StringOrdinal GetFirstAvailablePosition() const = 0;
 
   // Methods for AppListSyncableService:
diff --git a/chrome/browser/ui/app_list/chrome_app_list_item.cc b/chrome/browser/ui/app_list/chrome_app_list_item.cc
index 8b14929..28c223f 100644
--- a/chrome/browser/ui/app_list/chrome_app_list_item.cc
+++ b/chrome/browser/ui/app_list/chrome_app_list_item.cc
@@ -132,13 +132,6 @@
   }
 }
 
-void ChromeAppListItem::ContextMenuItemSelected(int command_id,
-                                                int event_flags) {
-  app_list::AppContextMenu* menu = GetAppContextMenu();
-  if (menu)
-    menu->ExecuteCommand(command_id, event_flags);
-}
-
 extensions::AppSorting* ChromeAppListItem::GetAppSorting() {
   return extensions::ExtensionSystem::Get(profile())->app_sorting();
 }
diff --git a/chrome/browser/ui/app_list/chrome_app_list_item.h b/chrome/browser/ui/app_list/chrome_app_list_item.h
index 16e77c58..4b9a617 100644
--- a/chrome/browser/ui/app_list/chrome_app_list_item.h
+++ b/chrome/browser/ui/app_list/chrome_app_list_item.h
@@ -107,9 +107,6 @@
   // has its Android analog installed.
   virtual bool IsBadged() const;
 
-  // Invoked when a context menu item of this item is selected.
-  void ContextMenuItemSelected(int command_id, int event_flags);
-
   bool CompareForTest(const ChromeAppListItem* other) const;
 
   std::string ToDebugString() const;
diff --git a/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc b/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc
index 29aa515..6dbde0e 100644
--- a/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc
+++ b/chrome/browser/ui/app_list/chrome_app_list_model_updater.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "ash/public/cpp/app_list/app_list_config.h"
+#include "ash/public/cpp/app_list/app_list_controller.h"
 #include "base/bind.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ui/app_list/app_list_client_impl.h"
@@ -378,14 +379,6 @@
   item->GetContextMenuModel(std::move(callback));
 }
 
-void ChromeAppListModelUpdater::ContextMenuItemSelected(const std::string& id,
-                                                        int command_id,
-                                                        int event_flags) {
-  ChromeAppListItem* chrome_item = FindItem(id);
-  if (chrome_item)
-    chrome_item->ContextMenuItemSelected(command_id, event_flags);
-}
-
 syncer::StringOrdinal ChromeAppListModelUpdater::GetFirstAvailablePosition()
     const {
   std::vector<ChromeAppListItem*> top_level_items;
diff --git a/chrome/browser/ui/app_list/chrome_app_list_model_updater.h b/chrome/browser/ui/app_list/chrome_app_list_model_updater.h
index f6f2db73..a84b6b2 100644
--- a/chrome/browser/ui/app_list/chrome_app_list_model_updater.h
+++ b/chrome/browser/ui/app_list/chrome_app_list_model_updater.h
@@ -14,6 +14,10 @@
 #include "base/observer_list.h"
 #include "chrome/browser/ui/app_list/app_list_model_updater.h"
 
+namespace app_list {
+class AppListController;
+}  // namespace app_list
+
 class ChromeAppListItem;
 
 class ChromeAppListModelUpdater : public AppListModelUpdater {
@@ -87,9 +91,6 @@
   size_t BadgedItemCount() override;
   void GetContextMenuModel(const std::string& id,
                            GetMenuModelCallback callback) override;
-  void ContextMenuItemSelected(const std::string& id,
-                               int command_id,
-                               int event_flags) override;
   syncer::StringOrdinal GetFirstAvailablePosition() const override;
 
   // Methods for AppListSyncableService:
@@ -123,7 +124,7 @@
   std::map<std::string, std::unique_ptr<ChromeAppListItem>> items_;
   Profile* const profile_ = nullptr;
   base::ObserverList<AppListModelUpdaterObserver> observers_;
-  ash::mojom::AppListController* app_list_controller_ = nullptr;
+  app_list::AppListController* app_list_controller_ = nullptr;
   bool search_engine_is_google_ = false;
 
   base::WeakPtrFactory<ChromeAppListModelUpdater> weak_ptr_factory_;
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.cc b/chrome/browser/ui/app_list/search/chrome_search_result.cc
index 2856c465..ffb4714 100644
--- a/chrome/browser/ui/app_list/search/chrome_search_result.cc
+++ b/chrome/browser/ui/app_list/search/chrome_search_result.cc
@@ -189,13 +189,6 @@
   std::move(callback).Run(nullptr);
 }
 
-void ChromeSearchResult::ContextMenuItemSelected(int command_id,
-                                                 int event_flags) {
-  app_list::AppContextMenu* menu = GetAppContextMenu();
-  if (menu)
-    menu->ExecuteCommand(command_id, event_flags);
-}
-
 // static
 std::string ChromeSearchResult::TagsDebugStringForTest(const std::string& text,
                                                        const Tags& tags) {
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.h b/chrome/browser/ui/app_list/search/chrome_search_result.h
index 0be59cb..5cb8b37 100644
--- a/chrome/browser/ui/app_list/search/chrome_search_result.h
+++ b/chrome/browser/ui/app_list/search/chrome_search_result.h
@@ -125,9 +125,6 @@
       base::OnceCallback<void(std::unique_ptr<ui::SimpleMenuModel>)>;
   virtual void GetContextMenuModel(GetMenuModelCallback callback);
 
-  // Invoked when a context menu item of this search result is selected.
-  void ContextMenuItemSelected(int command_id, int event_flags);
-
   static std::string TagsDebugStringForTest(const std::string& text,
                                             const Tags& tags);
 
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.cc b/chrome/browser/ui/ash/chrome_new_window_client.cc
index ef80c12..4d991206 100644
--- a/chrome/browser/ui/ash/chrome_new_window_client.cc
+++ b/chrome/browser/ui/ash/chrome_new_window_client.cc
@@ -72,7 +72,7 @@
 
 bool IsIncognitoAllowed() {
   Profile* profile = ProfileManager::GetActiveUserProfile();
-  return profile && profile->GetProfileType() != Profile::GUEST_PROFILE &&
+  return profile && !profile->IsGuestProfile() &&
          IncognitoModePrefs::GetAvailability(profile->GetPrefs()) !=
              IncognitoModePrefs::DISABLED;
 }
diff --git a/chrome/browser/ui/ash/ime_controller_client.cc b/chrome/browser/ui/ash/ime_controller_client.cc
index 3be4f82..3e610ddd 100644
--- a/chrome/browser/ui/ash/ime_controller_client.cc
+++ b/chrome/browser/ui/ash/ime_controller_client.cc
@@ -134,15 +134,6 @@
   std::move(callback).Run();
 }
 
-// chromeos::input_method::InputMethodManager::Observer:
-void ImeControllerClient::InputMethodChanged(InputMethodManager* manager,
-                                             Profile* profile,
-                                             bool show_message) {
-  RefreshIme();
-  if (show_message)
-    ShowModeIndicator();
-}
-
 void ImeControllerClient::ShowModeIndicator() {
   // Get the short name of the changed input method (e.g. US, JA, etc.)
   const InputMethodDescriptor descriptor =
@@ -171,6 +162,15 @@
   ime_controller_ptr_->ShowModeIndicator(anchor_bounds, short_name);
 }
 
+// chromeos::input_method::InputMethodManager::Observer:
+void ImeControllerClient::InputMethodChanged(InputMethodManager* manager,
+                                             Profile* profile,
+                                             bool show_message) {
+  RefreshIme();
+  if (show_message)
+    ShowModeIndicator();
+}
+
 // chromeos::input_method::InputMethodManager::ImeMenuObserver:
 void ImeControllerClient::ImeMenuActivationChanged(bool is_active) {
   ime_controller_ptr_->ShowImeMenuOnShelf(is_active);
diff --git a/chrome/browser/ui/ash/ime_controller_client.h b/chrome/browser/ui/ash/ime_controller_client.h
index 997c31d0..73da8e50 100644
--- a/chrome/browser/ui/ash/ime_controller_client.h
+++ b/chrome/browser/ui/ash/ime_controller_client.h
@@ -46,6 +46,7 @@
   void UpdateCastingState(bool casting_enabled) override;
   void OverrideKeyboardKeyset(chromeos::input_method::mojom::ImeKeyset keyset,
                               OverrideKeyboardKeysetCallback callback) override;
+  void ShowModeIndicator() override;
 
   // chromeos::input_method::InputMethodManager::Observer:
   void InputMethodChanged(chromeos::input_method::InputMethodManager* manager,
@@ -87,8 +88,6 @@
   // Sends information about current and available IMEs to ash.
   void RefreshIme();
 
-  void ShowModeIndicator();
-
   chromeos::input_method::InputMethodManager* const input_method_manager_;
 
   // Binds this object to the mojo interface.
diff --git a/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc b/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
index 3f00f22..7a25f536 100644
--- a/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
+++ b/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
@@ -20,9 +20,9 @@
 namespace {
 
 // The total number of Ash accelerators.
-constexpr int kAshAcceleratorsTotalNum = 103;
+constexpr int kAshAcceleratorsTotalNum = 104;
 // The hash of Ash accelerators.
-constexpr char kAshAcceleratorsHash[] = "66c583323442f52e04d8b29ea7e2db59";
+constexpr char kAshAcceleratorsHash[] = "1e3e31c4f37997da2a04d438bf150cd6";
 #if defined(GOOGLE_CHROME_BUILD)
 // Internal builds add an extra accelerator for the Feedback app.
 // The total number of Chrome accelerators (available on Chrome OS).
diff --git a/chrome/browser/ui/ash/launcher/DEPS b/chrome/browser/ui/ash/launcher/DEPS
index 8d4d790..7f61b0c 100644
--- a/chrome/browser/ui/ash/launcher/DEPS
+++ b/chrome/browser/ui/ash/launcher/DEPS
@@ -3,20 +3,8 @@
   "app_window_launcher_controller\.cc": [
     "+ash/shell.h",
   ],
-  # https://crbug.com/887156
-  "arc_app_window_launcher_controller\.cc": [
-    "+ash/shell.h",
-  ],
   # https://crbug.com/875111
   "chrome_launcher_controller_unittest\.cc": [
     "+ash/multi_user/multi_user_window_manager_impl.h",
   ],
-  # https://crbug.com/887156
-  "crostini_app_window_shelf_controller\.cc": [
-    "+ash/shell.h",
-  ],
-  # https://crbug.com/887156
-  "internal_app_window_shelf_controller\.cc": [
-    "+ash/shell.h",
-  ],
 }
diff --git a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc
index 745c6918..0672e0e 100644
--- a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc
@@ -12,7 +12,6 @@
 #include "ash/public/cpp/multi_user_window_manager.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/window_properties.h"
-#include "ash/shell.h"
 #include "base/bind.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
@@ -456,10 +455,7 @@
 }
 
 void ArcAppWindowLauncherController::StartObserving(Profile* profile) {
-  // TODO(mash): Find another way to observe for ARC++ window creation.
-  // https://crbug.com/887156
-  if (!features::IsMultiProcessMash())
-    ash::Shell::Get()->aura_env()->AddObserver(this);
+  aura::Env::GetInstance()->AddObserver(this);
   ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile);
   DCHECK(prefs);
   prefs->AddObserver(this);
@@ -470,8 +466,7 @@
     window->RemoveObserver(this);
   ArcAppListPrefs* prefs = ArcAppListPrefs::Get(profile);
   prefs->RemoveObserver(this);
-  if (!features::IsMultiProcessMash())
-    ash::Shell::Get()->aura_env()->RemoveObserver(this);
+  aura::Env::GetInstance()->RemoveObserver(this);
 }
 
 ArcAppWindowLauncherItemController*
diff --git a/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.cc b/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.cc
index 8e595617f2..0ff055fa 100644
--- a/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.cc
+++ b/chrome/browser/ui/ash/launcher/crostini_app_window_shelf_controller.cc
@@ -11,7 +11,6 @@
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/window_properties.h"
-#include "ash/shell.h"
 #include "base/bind.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service.h"
@@ -71,27 +70,13 @@
 CrostiniAppWindowShelfController::CrostiniAppWindowShelfController(
     ChromeLauncherController* owner)
     : AppWindowLauncherController(owner) {
-  // TODO(mash): Find another way to observe for crostini app window creation.
-  // https://crbug.com/887156
-  if (!features::IsMultiProcessMash())
-    ash::Shell::Get()->aura_env()->AddObserver(this);
-  // When window service is enabled, aura::Env::GetInstance() is a different
-  // instance from ash::Shell::Get()->aura_env(), and it needs to be observed
-  // for the Crostini terminal, which is a Chrome app window. Note that it still
-  // needs to observe ash::Shell::Get()->aura_env() too for other crostini apps,
-  // which are hosted by exo.
-  // TODO(mukai): clean this up. https://crbug.com/887156
-  if (features::IsUsingWindowService())
-    aura::Env::GetInstance()->AddObserver(this);
+  aura::Env::GetInstance()->AddObserver(this);
 }
 
 CrostiniAppWindowShelfController::~CrostiniAppWindowShelfController() {
   for (auto* window : observed_windows_)
     window->RemoveObserver(this);
-  if (features::IsUsingWindowService())
-    aura::Env::GetInstance()->RemoveObserver(this);
-  if (!features::IsMultiProcessMash())
-    ash::Shell::Get()->aura_env()->RemoveObserver(this);
+  aura::Env::GetInstance()->RemoveObserver(this);
 }
 
 void CrostiniAppWindowShelfController::AddToShelf(aura::Window* window,
diff --git a/chrome/browser/ui/ash/launcher/internal_app_window_shelf_controller.cc b/chrome/browser/ui/ash/launcher/internal_app_window_shelf_controller.cc
index 07baec7..171bbb39 100644
--- a/chrome/browser/ui/ash/launcher/internal_app_window_shelf_controller.cc
+++ b/chrome/browser/ui/ash/launcher/internal_app_window_shelf_controller.cc
@@ -8,7 +8,6 @@
 #include "ash/public/cpp/multi_user_window_manager.h"
 #include "ash/public/cpp/shelf_model.h"
 #include "ash/public/cpp/window_properties.h"
-#include "ash/shell.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
@@ -30,18 +29,13 @@
 InternalAppWindowShelfController::InternalAppWindowShelfController(
     ChromeLauncherController* owner)
     : AppWindowLauncherController(owner) {
-  // TODO(mash): Find another way to observe for internal app window creation.
-  // https://crbug.com/887156
-  if (!features::IsMultiProcessMash())
-    ash::Shell::Get()->aura_env()->AddObserver(this);
+  aura::Env::GetInstance()->AddObserver(this);
 }
 
 InternalAppWindowShelfController::~InternalAppWindowShelfController() {
   for (auto* window : observed_windows_)
     window->RemoveObserver(this);
-
-  if (!features::IsMultiProcessMash())
-    ash::Shell::Get()->aura_env()->RemoveObserver(this);
+  aura::Env::GetInstance()->RemoveObserver(this);
 }
 
 void InternalAppWindowShelfController::ActiveUserChanged(
diff --git a/chrome/browser/ui/ash/login_screen_client.cc b/chrome/browser/ui/ash/login_screen_client.cc
index 83a4d42..a6828a7 100644
--- a/chrome/browser/ui/ash/login_screen_client.cc
+++ b/chrome/browser/ui/ash/login_screen_client.cc
@@ -138,7 +138,7 @@
 }
 
 void LoginScreenClient::ValidateParentAccessCode(
-    const AccountId& account_id,
+    const base::Optional<AccountId>& account_id,
     const std::string& access_code,
     ValidateParentAccessCodeCallback callback) {
   bool result = chromeos::parent_access::ParentAccessService::Get()
diff --git a/chrome/browser/ui/ash/login_screen_client.h b/chrome/browser/ui/ash/login_screen_client.h
index 6c9bad1..9602a77b 100644
--- a/chrome/browser/ui/ash/login_screen_client.h
+++ b/chrome/browser/ui/ash/login_screen_client.h
@@ -101,7 +101,7 @@
       EnrollUserWithExternalBinaryCallback callback) override;
   void AuthenticateUserWithEasyUnlock(const AccountId& account_id) override;
   void ValidateParentAccessCode(
-      const AccountId& account_id,
+      const base::Optional<AccountId>& account_id,
       const std::string& access_code,
       ValidateParentAccessCodeCallback callback) override;
   void HardlockPod(const AccountId& account_id) override;
diff --git a/chrome/browser/ui/ash/screen_rotation_interactive_uitest.cc b/chrome/browser/ui/ash/screen_rotation_interactive_uitest.cc
index e12b763..5ece549 100644
--- a/chrome/browser/ui/ash/screen_rotation_interactive_uitest.cc
+++ b/chrome/browser/ui/ash/screen_rotation_interactive_uitest.cc
@@ -4,6 +4,7 @@
 
 #include "ash/public/cpp/ash_pref_names.h"
 #include "ash/public/cpp/shell_window_ids.h"
+#include "ash/public/cpp/test/shell_test_api.h"
 #include "ash/rotator/screen_rotation_animator.h"
 #include "ash/rotator/screen_rotation_animator_observer.h"
 #include "base/macros.h"
@@ -17,6 +18,9 @@
 #include "chrome/test/base/perf/performance_test.h"
 #include "ui/aura/window.h"
 #include "ui/base/test/ui_controls.h"
+#include "ui/compositor/layer_animation_observer.h"
+
+namespace {
 
 // Test overview enter/exit animations with following conditions
 // int: number of windows : 2, 8
@@ -97,7 +101,37 @@
   DISALLOW_COPY_AND_ASSIGN(ScreenRotationWaiter);
 };
 
-IN_PROC_BROWSER_TEST_P(ScreenRotationTest, RotateInTable) {
+class WindowAnimationWaiter : public ui::LayerAnimationObserver {
+ public:
+  explicit WindowAnimationWaiter(aura::Window* window)
+      : animator_(window->layer()->GetAnimator()) {
+    animator_->AddObserver(this);
+  }
+  ~WindowAnimationWaiter() override = default;
+
+  // ui::LayerAnimationObserver:
+  void OnLayerAnimationEnded(ui::LayerAnimationSequence* sequence) override {
+    if (!animator_->is_animating()) {
+      animator_->RemoveObserver(this);
+      run_loop_.Quit();
+    }
+  }
+  void OnLayerAnimationAborted(ui::LayerAnimationSequence* sequence) override {}
+  void OnLayerAnimationScheduled(
+      ui::LayerAnimationSequence* sequence) override {}
+
+  void Wait() { run_loop_.Run(); }
+
+ private:
+  ui::LayerAnimator* animator_;
+  base::RunLoop run_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(WindowAnimationWaiter);
+};
+
+}  // namespace
+
+IN_PROC_BROWSER_TEST_P(ScreenRotationTest, RotateInTablet) {
   // Browser window is used just to identify display.
   BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
   gfx::NativeWindow browser_window =
@@ -113,6 +147,36 @@
   waiter.Wait();
 }
 
+IN_PROC_BROWSER_TEST_P(ScreenRotationTest, RotateInTableOverview) {
+  // Browser window is used just to identify display.
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
+  gfx::NativeWindow browser_window =
+      browser_view->GetWidget()->GetNativeWindow();
+  ui_controls::SendKeyPress(browser_window, ui::VKEY_MEDIA_LAUNCH_APP1,
+                            /*control=*/false,
+                            /*shift=*/false,
+                            /*alt=*/false,
+                            /*command=*/false);
+  ash::ShellTestApi().WaitForOverviewAnimationState(
+      ash::OverviewAnimationState::kEnterAnimationComplete);
+  // Wait until the window labels are shown.
+  {
+    auto windows = ash::ShellTestApi().GetItemWindowListInOverviewGrids();
+    ASSERT_TRUE(windows.size() > 0);
+    WindowAnimationWaiter waiter(windows[0]);
+    waiter.Wait();
+  }
+
+  ScreenRotationWaiter waiter(browser_window->GetRootWindow());
+
+  ui_controls::SendKeyPress(browser_window, ui::VKEY_BROWSER_REFRESH,
+                            /*control=*/true,
+                            /*shift=*/true,
+                            /*alt=*/false,
+                            /*command=*/false);
+  waiter.Wait();
+}
+
 // TODO(oshma): Support split screen in tablet mode.
 // TODO(oshma): Support overview mode.
 
diff --git a/chrome/browser/ui/ash/system_tray_client.cc b/chrome/browser/ui/ash/system_tray_client.cc
index 16a9d757..f9daef0 100644
--- a/chrome/browser/ui/ash/system_tray_client.cc
+++ b/chrome/browser/ui/ash/system_tray_client.cc
@@ -53,7 +53,6 @@
 #include "extensions/browser/api/vpn_provider/vpn_service_factory.h"
 #include "net/base/escape.h"
 #include "services/service_manager/public/cpp/connector.h"
-#include "services/ws/public/cpp/property_type_converters.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 #include "ui/events/event_constants.h"
 
diff --git a/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller.cc b/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller.cc
index 8f43308..9fff16f 100644
--- a/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller.cc
+++ b/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ui/bluetooth/bluetooth_chooser_desktop.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index f574695c..9124409f 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -169,8 +169,7 @@
            ++browser_it) {
         Browser* browser = *browser_it;
         // When tab switching, only look at same profile and anonymity level.
-        if (browser->profile()->IsSameProfile(profile) &&
-            browser->profile()->GetProfileType() == profile->GetProfileType()) {
+        if (browser->profile()->IsSameProfileAndType(profile)) {
           int index = GetIndexOfExistingTab(browser, params);
           if (index >= 0)
             return {browser, index};
diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
index 86f37a5..b662d05 100644
--- a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
@@ -256,12 +256,9 @@
 }
 
 base::string16 HostedAppBrowserController::GetTitle() const {
-  // When showing the location bar, display the name of the app, instead of the
+  // When showing the toolbar, display the name of the app, instead of the
   // current page as the title.
-  // Note: We only do this when the CustomTab UI is enabled, as otherwise the
-  // title of the current page will not be displayed anywhere.
-  if (ShouldShowToolbar() &&
-      base::FeatureList::IsEnabled(features::kDesktopPWAsCustomTabUI)) {
+  if (ShouldShowToolbar()) {
     const Extension* extension = GetExtension();
     return base::UTF8ToUTF16(extension->name());
   }
diff --git a/chrome/browser/ui/extensions/hosted_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
index be0c086..cefd537 100644
--- a/chrome/browser/ui/extensions/hosted_app_browsertest.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
@@ -260,7 +260,7 @@
 // kDesktopPWAWindowing flag.
 class HostedAppTest
     : public extensions::ExtensionBrowserTest,
-      public ::testing::WithParamInterface<std::tuple<AppType, bool, bool>> {
+      public ::testing::WithParamInterface<std::tuple<AppType, bool>> {
  public:
   HostedAppTest()
       : app_browser_(nullptr),
@@ -272,9 +272,8 @@
     https_server_.AddDefaultHandlers(GetChromeTestDataDir());
 
     bool desktop_pwa_flag;
-    bool use_custom_tab_flag;
 
-    std::tie(app_type_, desktop_pwa_flag, use_custom_tab_flag) = GetParam();
+    std::tie(app_type_, desktop_pwa_flag) = GetParam();
     std::vector<base::Feature> enabled_features;
     std::vector<base::Feature> disabled_features = {
         predictors::kSpeculativePreconnectFeature};
@@ -284,9 +283,6 @@
       disabled_features.push_back(features::kDesktopPWAWindowing);
     }
 
-    auto& features = use_custom_tab_flag ? enabled_features : disabled_features;
-    features.push_back(features::kDesktopPWAsCustomTabUI);
-
     scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features);
     extensions::ExtensionBrowserTest::SetUp();
   }
@@ -861,12 +857,9 @@
             app_browser->GetWindowTitleForCurrentTab(false));
 }
 
-using HostedAppCustomTabBarOnlyTest = HostedAppTest;
-
 // Ensure that hosted app windows display the app title instead of the page
 // title when off scope.
-IN_PROC_BROWSER_TEST_P(HostedAppCustomTabBarOnlyTest,
-                       OffScopeUrlsDisplayAppTitle) {
+IN_PROC_BROWSER_TEST_P(HostedAppTest, OffScopeUrlsDisplayAppTitle) {
   ASSERT_TRUE(https_server()->Start());
   GURL url = GetSecureAppURL();
 
@@ -895,8 +888,7 @@
 
 // Ensure that hosted app windows display the app title instead of the page
 // title when using http.
-IN_PROC_BROWSER_TEST_P(HostedAppCustomTabBarOnlyTest,
-                       InScopeHttpUrlsDisplayAppTitle) {
+IN_PROC_BROWSER_TEST_P(HostedAppTest, InScopeHttpUrlsDisplayAppTitle) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url = embedded_test_server()->GetURL("app.site.com", "/simple.html");
   WebApplicationInfo web_app_info;
@@ -2788,45 +2780,34 @@
 INSTANTIATE_TEST_SUITE_P(/* no prefix */,
                          HostedAppTest,
                          ::testing::Combine(kAppTypeValues,
-                                            ::testing::Bool(),
                                             ::testing::Bool()));
 
-INSTANTIATE_TEST_SUITE_P(/* no prefix */,
-                         HostedAppCustomTabBarOnlyTest,
-                         ::testing::Combine(kAppTypeValues,
-                                            ::testing::Bool(),
-                                            ::testing::Values(true)));
 INSTANTIATE_TEST_SUITE_P(
     /* no prefix */,
     HostedAppPWAOnlyTest,
     ::testing::Combine(::testing::Values(AppType::BOOKMARK_APP),
-                       ::testing::Values(true),
-                       ::testing::Bool()));
+                       ::testing::Values(true)));
 INSTANTIATE_TEST_SUITE_P(
     /* no prefix */,
     BookmarkAppOnlyTest,
     ::testing::Combine(::testing::Values(AppType::BOOKMARK_APP),
-                       ::testing::Bool(),
                        ::testing::Bool()));
 
 INSTANTIATE_TEST_SUITE_P(
     /* no prefix */,
     HostedAppProcessModelTest,
     ::testing::Combine(::testing::Values(AppType::HOSTED_APP),
-                       ::testing::Bool(),
                        ::testing::Bool()));
 INSTANTIATE_TEST_SUITE_P(
     /* no prefix */,
     HostedAppIsolatedOriginTest,
     ::testing::Combine(::testing::Values(AppType::HOSTED_APP),
-                       ::testing::Bool(),
                        ::testing::Bool()));
 
 INSTANTIATE_TEST_SUITE_P(
     /* no prefix */,
     HostedAppSitePerProcessTest,
     ::testing::Combine(::testing::Values(AppType::HOSTED_APP),
-                       ::testing::Bool(),
                        ::testing::Bool()));
 
 #if !defined(OS_CHROMEOS)
@@ -2834,6 +2815,5 @@
     /* no prefix */,
     HostedAppBadgingTest,
     ::testing::Combine(::testing::Values(AppType::BOOKMARK_APP),
-                       ::testing::Values(true),
-                       ::testing::Bool()));
+                       ::testing::Values(true)));
 #endif  // !defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/login/login_handler.cc b/chrome/browser/ui/login/login_handler.cc
index 1c13aa99..c5f8f23 100644
--- a/chrome/browser/ui/login/login_handler.cc
+++ b/chrome/browser/ui/login/login_handler.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -21,6 +22,7 @@
 #include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/tab_contents/tab_util.h"
 #include "chrome/browser/ui/login/login_interstitial_delegate.h"
+#include "chrome/common/chrome_features.h"
 #include "components/password_manager/core/browser/browser_save_password_progress_logger.h"
 #include "components/password_manager/core/browser/log_manager.h"
 #include "components/password_manager/core/browser/password_manager.h"
@@ -122,7 +124,8 @@
     const content::GlobalRequestID& request_id,
     bool is_main_frame,
     const GURL& request_url,
-    scoped_refptr<net::HttpResponseHeaders> response_headers) {
+    scoped_refptr<net::HttpResponseHeaders> response_headers,
+    HandlerMode mode) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(web_contents());
   DCHECK(!WasAuthHandled());
@@ -134,9 +137,9 @@
   auto* api =
       extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get(
           web_contents()->GetBrowserContext());
-  auto continuation =
-      base::BindOnce(&LoginHandler::MaybeSetUpLoginPrompt,
-                     weak_factory_.GetWeakPtr(), request_url, is_main_frame);
+  auto continuation = base::BindOnce(&LoginHandler::MaybeSetUpLoginPrompt,
+                                     weak_factory_.GetWeakPtr(), request_url,
+                                     is_main_frame, mode);
   if (api->MaybeProxyAuthRequest(web_contents()->GetBrowserContext(),
                                  auth_info_, std::move(response_headers),
                                  request_id, is_main_frame,
@@ -152,7 +155,7 @@
       FROM_HERE, {BrowserThread::UI},
       base::BindOnce(&LoginHandler::MaybeSetUpLoginPrompt,
                      weak_factory_.GetWeakPtr(), request_url, is_main_frame,
-                     base::nullopt, false /* should_cancel */));
+                     mode, base::nullopt, false /* should_cancel */));
 }
 
 void LoginHandler::SetAuth(const base::string16& username,
@@ -413,6 +416,7 @@
 void LoginHandler::MaybeSetUpLoginPrompt(
     const GURL& request_url,
     bool is_request_for_main_frame,
+    HandlerMode mode,
     const base::Optional<net::AuthCredentials>& credentials,
     bool should_cancel) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -476,6 +480,25 @@
           blink::kWebDisplayModeStandalone) {
     RecordHttpAuthPromptType(AUTH_PROMPT_TYPE_WITH_INTERSTITIAL);
 
+    if (base::FeatureList::IsEnabled(
+            features::kHTTPAuthCommittedInterstitials)) {
+      switch (mode) {
+        case PRE_COMMIT:
+          prompt_started_ = false;
+          CancelAuth();
+          return;
+        case POST_COMMIT:
+          // TODO(https://crbug.com/963313): add a WebContentsObserver which
+          // observes when LoginHandler does the PRE_COMMIT cancel and triggers
+          // the login prompt in POST_COMMIT mode on top of the committed error
+          // page.
+          NOTREACHED();
+          ShowLoginPrompt(request_url);
+          return;
+      }
+      NOTREACHED();
+    }
+
     // Show a blank interstitial for main-frame, cross origin requests
     // so that the correct URL is shown in the omnibox.
     base::OnceClosure callback =
@@ -575,10 +598,11 @@
     bool is_request_for_main_frame,
     const GURL& url,
     scoped_refptr<net::HttpResponseHeaders> response_headers,
+    LoginHandler::HandlerMode mode,
     LoginAuthRequiredCallback auth_required_callback) {
   std::unique_ptr<LoginHandler> handler = LoginHandler::Create(
       auth_info, web_contents, std::move(auth_required_callback));
   handler->Start(request_id, is_request_for_main_frame, url,
-                 std::move(response_headers));
+                 std::move(response_headers), mode);
   return handler;
 }
diff --git a/chrome/browser/ui/login/login_handler.h b/chrome/browser/ui/login/login_handler.h
index a14fd1c..3dfc1bd 100644
--- a/chrome/browser/ui/login/login_handler.h
+++ b/chrome/browser/ui/login/login_handler.h
@@ -38,6 +38,17 @@
                      public content::NotificationObserver,
                      public content::WebContentsObserver {
  public:
+  // When committed interstitials are enabled, LoginHandler has pre-commit and
+  // post-commit modes that determines how main-frame cross-origin navigations
+  // are handled. Pre-commit, login challenges on such navigations are
+  // optionally handled by extensions and then cancelled so that an error page
+  // can commit. Post-commit, LoginHandler shows a login prompt on top of the
+  // committed error page.
+  enum HandlerMode {
+    PRE_COMMIT,
+    POST_COMMIT,
+  };
+
   // The purpose of this struct is to enforce that BuildViewImpl receives either
   // both the login model and the observed form, or none. That is a bit spoiled
   // by the fact that the model is a pointer to LoginModel, as opposed to a
@@ -68,10 +79,14 @@
       content::WebContents* web_contents,
       LoginAuthRequiredCallback auth_required_callback);
 
+  // |mode| is ignored when committed interstitials are disabled. See the
+  // comment on HandlerMode for a description of how it affects LoginHandler's
+  // behavior when committed interstitials are enabled.
   void Start(const content::GlobalRequestID& request_id,
              bool is_main_frame,
              const GURL& request_url,
-             scoped_refptr<net::HttpResponseHeaders> response_headers);
+             scoped_refptr<net::HttpResponseHeaders> response_headers,
+             HandlerMode mode);
 
   // Resend the request with authentication credentials.
   // This function can be called from either thread.
@@ -151,11 +166,14 @@
   // Continuation from |Start| after any potential interception from the
   // extensions WebRequest API. If |should_cancel| is |true| the request is
   // cancelled. Otherwise |credentials| are used if supplied. Finally if the
-  // request is NOT cancelled AND |credentials| is empty, then we'll actually
-  // show a login prompt.
+  // request is NOT cancelled AND |credentials| is empty, then we'll take the
+  // necessary steps to show a login prompt, depending on |mode| and whether
+  // committed interstitials are enabled (see comment on
+  // LoginHandler::HandlerMode).
   void MaybeSetUpLoginPrompt(
       const GURL& request_url,
       bool is_main_frame,
+      HandlerMode mode,
       const base::Optional<net::AuthCredentials>& credentials,
       bool should_cancel);
 
@@ -235,6 +253,7 @@
     bool is_main_frame,
     const GURL& url,
     scoped_refptr<net::HttpResponseHeaders> response_headers,
+    LoginHandler::HandlerMode mode,
     LoginAuthRequiredCallback auth_required_callback);
 
 #endif  // CHROME_BROWSER_UI_LOGIN_LOGIN_HANDLER_H_
diff --git a/chrome/browser/ui/login/login_handler_browsertest.cc b/chrome/browser/ui/login/login_handler_browsertest.cc
index 9930929..6981c88b 100644
--- a/chrome/browser/ui/login/login_handler_browsertest.cc
+++ b/chrome/browser/ui/login/login_handler_browsertest.cc
@@ -52,13 +52,13 @@
 
 namespace {
 
-bool AreCommittedInterstitialsEnabled() {
+bool AreSSLCommittedInterstitialsEnabled() {
   return base::FeatureList::IsEnabled(features::kSSLCommittedInterstitials);
 }
 
 content::InterstitialPageDelegate* GetInterstitialDelegate(
     content::WebContents* tab) {
-  if (AreCommittedInterstitialsEnabled()) {
+  if (AreSSLCommittedInterstitialsEnabled()) {
     security_interstitials::SecurityInterstitialTabHelper* helper =
         security_interstitials::SecurityInterstitialTabHelper::FromWebContents(
             tab);
@@ -1507,7 +1507,7 @@
     ui_test_utils::NavigateToURL(browser(), broken_ssl_page);
     ASSERT_EQ("127.0.0.1", contents->GetURL().host());
     ASSERT_TRUE(contents->GetURL().SchemeIs("https"));
-    if (AreCommittedInterstitialsEnabled()) {
+    if (AreSSLCommittedInterstitialsEnabled()) {
       ASSERT_TRUE(WaitForRenderFrameReady(contents->GetMainFrame()));
     } else {
       content::WaitForInterstitialAttach(contents);
@@ -1580,7 +1580,7 @@
 
   // Redirect to a broken SSL page. This redirect should not accidentally
   // proceed through the SSL interstitial.
-  if (AreCommittedInterstitialsEnabled()) {
+  if (AreSSLCommittedInterstitialsEnabled()) {
     content::TestNavigationObserver observer(contents);
     EXPECT_TRUE(content::ExecuteScript(
         browser()->tab_strip_model()->GetActiveWebContents(),
@@ -1646,4 +1646,30 @@
   }
 }
 
+// Tests that when HTTP Auth committed interstitials are enabled, a cross-origin
+// main-frame auth challenge cancels the auth request.
+IN_PROC_BROWSER_TEST_F(
+    LoginPromptBrowserTest,
+    TestAuthChallengeCancelsNavigationWithCommittedInterstitials) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      features::kHTTPAuthCommittedInterstitials);
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  content::WebContents* contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  NavigationController* controller = &contents->GetController();
+  LoginPromptBrowserTestObserver observer;
+  observer.Register(content::Source<NavigationController>(controller));
+
+  GURL test_page = embedded_test_server()->GetURL(kAuthBasicPage);
+  ui_test_utils::NavigateToURL(browser(), test_page);
+
+  const base::string16 kExpectedTitle =
+      base::ASCIIToUTF16("Denied: Missing Authorization Header");
+  content::TitleWatcher title_watcher(contents, kExpectedTitle);
+  EXPECT_EQ(kExpectedTitle, title_watcher.WaitAndGetTitle());
+
+  EXPECT_EQ(0, observer.auth_cancelled_count());
+}
 }  // namespace
diff --git a/chrome/browser/ui/page_info/page_info_unittest.cc b/chrome/browser/ui/page_info/page_info_unittest.cc
index 8a3114f7..2ea89fce 100644
--- a/chrome/browser/ui/page_info/page_info_unittest.cc
+++ b/chrome/browser/ui/page_info/page_info_unittest.cc
@@ -32,8 +32,6 @@
 #include "content/public/browser/ssl_host_state_delegate.h"
 #include "content/public/browser/ssl_status.h"
 #include "content/public/common/content_switches.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "net/cert/cert_status_flags.h"
 #include "net/cert/x509_certificate.h"
 #include "net/ssl/ssl_connection_status_flags.h"
@@ -41,6 +39,8 @@
 #include "net/test/test_certificate_data.h"
 #include "net/test/test_data_directory.h"
 #include "ppapi/buildflags/buildflags.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.cc b/chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.cc
index d8a2685..2b4a2085 100644
--- a/chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.cc
+++ b/chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.cc
@@ -7,11 +7,14 @@
 
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h"
+#include "chrome/browser/sync/send_tab_to_self_sync_service_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_view.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/send_tab_to_self/send_tab_to_self_model.h"
+#include "components/send_tab_to_self/send_tab_to_self_sync_service.h"
 #include "components/send_tab_to_self/target_device_info.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -86,8 +89,18 @@
 }
 
 void SendTabToSelfBubbleController::FetchDeviceInfo() {
-  // TODO(crbug/960595): get devices info map from SendTabToSelfModel.
-  NOTIMPLEMENTED();
+  valid_devices_.clear();
+  send_tab_to_self::SendTabToSelfSyncService* service =
+      SendTabToSelfSyncServiceFactory::GetForProfile(GetProfile());
+  if (!service) {
+    return;
+  }
+  send_tab_to_self::SendTabToSelfModel* model =
+      service->GetSendTabToSelfModel();
+  if (!model) {
+    return;
+  }
+  valid_devices_ = model->GetTargetDeviceNameToCacheInfoMap();
 }
 
 WEB_CONTENTS_USER_DATA_KEY_IMPL(SendTabToSelfBubbleController)
diff --git a/chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.h b/chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.h
index ecc4e1b..96df435 100644
--- a/chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.h
+++ b/chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.h
@@ -9,6 +9,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "base/strings/string16.h"
 #include "content/public/browser/web_contents_user_data.h"
 
 class Profile;
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc
index bda509d..88fe742 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -1191,7 +1191,7 @@
     case CommandSendTabToSelf: {
       send_tab_to_self::RecordSendTabToSelfClickResult(
           send_tab_to_self::kTabMenu, SendTabToSelfClickResult::kClickItem);
-      send_tab_to_self::CreateNewEntry(GetActiveWebContents());
+      // TODO(crbug/945988): add histograms to count valid device number.
       break;
     }
 
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
index 22fa67eb..1458431 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
@@ -132,6 +132,18 @@
                                 ui::NativeTheme::kColorId_DefaultIconColor)));
 }
 
+bool GetSyncedFaviconForPageURL(
+    sync_sessions::SessionSyncService* session_sync_service,
+    const GURL& page_url,
+    scoped_refptr<base::RefCountedMemory>* sync_bitmap) {
+  if (!session_sync_service)
+    return false;
+  sync_sessions::OpenTabsUIDelegate* open_tabs =
+      session_sync_service->GetOpenTabsUIDelegate();
+  return open_tabs &&
+         open_tabs->GetSyncedFaviconForPageURL(page_url.spec(), sync_bitmap);
+}
+
 }  // namespace
 
 enum RecentTabAction {
@@ -565,62 +577,37 @@
 void RecentTabsSubMenuModel::AddTabFavicon(int command_id, const GURL& url) {
   int index_in_menu = GetIndexOfCommandId(command_id);
 
-  // Start to fetch the favicon from local history asynchronously.
   // Set default icon first.
   SetIcon(index_in_menu, favicon::GetDefaultFavicon());
-  // Start request to fetch actual icon if possible.
-  favicon::FaviconService* favicon_service =
-      FaviconServiceFactory::GetForProfile(browser_->profile(),
-                                           ServiceAccessType::EXPLICIT_ACCESS);
-  if (!favicon_service)
-    return;
 
   bool is_local_tab = command_id < kFirstOtherDevicesTabCommandId;
-  favicon_service->GetFaviconImageForPageURL(
+  favicon_request_handler_.GetFaviconImageForPageURL(
       url,
-      base::Bind(&RecentTabsSubMenuModel::OnFaviconDataAvailable,
-                 weak_ptr_factory_.GetWeakPtr(), url, command_id),
+      base::BindRepeating(&RecentTabsSubMenuModel::OnFaviconDataAvailable,
+                          base::Unretained(this), command_id),
+      favicon::FaviconRequestOrigin::RECENTLY_CLOSED_TABS,
+      FaviconServiceFactory::GetForProfile(browser_->profile(),
+                                           ServiceAccessType::EXPLICIT_ACCESS),
+      base::BindOnce(&GetSyncedFaviconForPageURL,
+                     base::Unretained(session_sync_service_)),
       is_local_tab ? &local_tab_cancelable_task_tracker_
                    : &other_devices_tab_cancelable_task_tracker_);
 }
 
 void RecentTabsSubMenuModel::OnFaviconDataAvailable(
-    const GURL& page_url,
     int command_id,
     const favicon_base::FaviconImageResult& image_result) {
+  if (image_result.image.IsEmpty()) {
+    // Default icon has already been set.
+    return;
+  }
   int index_in_menu = GetIndexOfCommandId(command_id);
-  if (!image_result.image.IsEmpty()) {
-    favicon::RecordFaviconRequestMetric(
-        favicon::FaviconRequestOrigin::RECENTLY_CLOSED_TABS,
-        favicon::FaviconAvailability::kLocal);
-    DCHECK_GT(index_in_menu, -1);
-    SetIcon(index_in_menu, image_result.image);
-    ui::MenuModelDelegate* delegate = menu_model_delegate();
-    if (delegate)
-      delegate->OnIconChanged(index_in_menu);
-    return;
-  }
-
-  // If tab has synced favicon, use it.
-  // Note that currently, other devices' tabs only have favicons if
-  // --sync-tab-favicons switch is on; according to zea@, this flag is now
-  // automatically enabled for iOS and android, and they're looking into
-  // enabling it for other platforms.
-  sync_sessions::OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate();
-  scoped_refptr<base::RefCountedMemory> favicon_png;
-  if (open_tabs &&
-      open_tabs->GetSyncedFaviconForPageURL(page_url.spec(), &favicon_png)) {
-    favicon::RecordFaviconRequestMetric(
-        favicon::FaviconRequestOrigin::RECENTLY_CLOSED_TABS,
-        favicon::FaviconAvailability::kSync);
-    gfx::Image image = gfx::Image::CreateFrom1xPNGBytes(favicon_png);
-    SetIcon(index_in_menu, image);
-    return;
-  }
-
-  favicon::RecordFaviconRequestMetric(
-      favicon::FaviconRequestOrigin::RECENTLY_CLOSED_TABS,
-      favicon::FaviconAvailability::kNotAvailable);
+  DCHECK_GT(index_in_menu, -1);
+  SetIcon(index_in_menu, image_result.image);
+  ui::MenuModelDelegate* delegate = menu_model_delegate();
+  if (delegate)
+    delegate->OnIconChanged(index_in_menu);
+  return;
 }
 
 int RecentTabsSubMenuModel::CommandIdToTabVectorIndex(
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h
index bb359723..53be110d 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.h
@@ -16,6 +16,7 @@
 #include "base/scoped_observer.h"
 #include "base/task/cancelable_task_tracker.h"
 #include "base/timer/elapsed_timer.h"
+#include "components/favicon/core/favicon_request_handler.h"
 #include "components/favicon/core/favicon_service.h"
 #include "components/sessions/core/session_id.h"
 #include "components/sessions/core/tab_restore_service.h"
@@ -119,7 +120,6 @@
   // OnFaviconDataAvailable() will be invoked when the favicon is ready.
   void AddTabFavicon(int command_id, const GURL& url);
   void OnFaviconDataAvailable(
-      const GURL& page_url,
       int command_id,
       const favicon_base::FaviconImageResult& image_result);
 
@@ -188,6 +188,7 @@
   std::unique_ptr<base::CallbackList<void()>::Subscription>
       foreign_session_updated_subscription_;
 
+  favicon::FaviconRequestHandler favicon_request_handler_;
   base::WeakPtrFactory<RecentTabsSubMenuModel> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(RecentTabsSubMenuModel);
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
index c6cb007..2d46ea0 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/web_contents.h"
-#include "services/ws/public/cpp/property_type_converters.h"
 #include "services/ws/public/mojom/window_manager.mojom.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
diff --git a/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc b/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
index 4bf7e9d..b29e23b 100644
--- a/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
@@ -190,8 +190,7 @@
 
   void SetUpOnMainThread() override {
     scoped_feature_list_.InitWithFeatures(
-        {features::kDesktopPWAsStayInWindow, features::kDesktopPWAWindowing,
-         features::kDesktopPWAsCustomTabUI},
+        {features::kDesktopPWAsStayInWindow, features::kDesktopPWAWindowing},
         {});
     https_server_.AddDefaultHandlers(GetChromeTestDataDir());
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index e6020bcc..c5b8e6b 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -497,7 +497,7 @@
     case IDC_SEND_TAB_TO_SELF:
       send_tab_to_self::RecordSendTabToSelfClickResult(
           send_tab_to_self::kOmniboxMenu, SendTabToSelfClickResult::kClickItem);
-      send_tab_to_self::CreateNewEntry(location_bar_view_->GetWebContents());
+      // TODO(crbug/945988): add histograms to count valid device number.
       return;
 
     // These commands do invoke the popup.
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
index 6e9b6ca..17c0aa8f 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_browsertest.cc
@@ -5,10 +5,12 @@
 #include "chrome/browser/ui/views/page_info/page_info_bubble_view.h"
 
 #include "base/run_loop.h"
+#include "base/scoped_observer.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/safe_browsing/chrome_password_protection_service.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
 #include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/page_info/page_info.h"
 #include "chrome/browser/ui/page_info/page_info_dialog.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -43,6 +45,7 @@
 #include "ui/accessibility/ax_action_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/events/event_constants.h"
+#include "ui/views/test/widget_test.h"
 
 namespace {
 
@@ -277,6 +280,23 @@
     run_loop.Run();
   }
 
+  void TriggerReloadPromptOnClose() const {
+    PageInfoBubbleView* const page_info_bubble_view =
+        static_cast<PageInfoBubbleView*>(
+            PageInfoBubbleView::GetPageInfoBubble());
+    ASSERT_NE(nullptr, page_info_bubble_view);
+
+    // Set some dummy non-default permissions. This will trigger a reload prompt
+    // when the bubble is closed.
+    PageInfoUI::PermissionInfo permission;
+    permission.type = ContentSettingsType::CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
+    permission.setting = ContentSetting::CONTENT_SETTING_BLOCK;
+    permission.default_setting = ContentSetting::CONTENT_SETTING_ASK;
+    permission.source = content_settings::SettingSource::SETTING_SOURCE_USER;
+    permission.is_incognito = false;
+    page_info_bubble_view->OnPermissionChanged(permission);
+  }
+
  private:
 
   DISALLOW_COPY_AND_ASSIGN(PageInfoBubbleViewBrowserTest);
@@ -645,3 +665,146 @@
   EXPECT_EQ(page_info->GetWindowTitle(),
             l10n_util::GetStringUTF16(IDS_PAGE_INFO_MIXED_CONTENT_SUMMARY));
 }
+
+namespace {
+
+// Tracks focus of an arbitrary UI element.
+class FocusTracker {
+ public:
+  bool focused() const { return focused_; }
+
+  // Wait for focused() to be in state |target_state_is_focused|. If focused()
+  // is already in the desired state, returns immediately, otherwise waits until
+  // it is.
+  void WaitForFocus(bool target_state_is_focused) {
+    if (focused_ == target_state_is_focused)
+      return;
+    target_state_is_focused_ = target_state_is_focused;
+    run_loop_.Run();
+  }
+
+ protected:
+  explicit FocusTracker(bool initially_focused) : focused_(initially_focused) {}
+  virtual ~FocusTracker() {}
+
+  void OnFocused() {
+    focused_ = true;
+    if (run_loop_.running() && target_state_is_focused_ == focused_)
+      run_loop_.Quit();
+  }
+
+  void OnBlurred() {
+    focused_ = false;
+    if (run_loop_.running() && target_state_is_focused_ == focused_)
+      run_loop_.Quit();
+  }
+
+ private:
+  // Whether the tracked visual element is currently focused.
+  bool focused_ = false;
+
+  // Desired state when waiting for focus to change.
+  bool target_state_is_focused_;
+
+  base::RunLoop run_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(FocusTracker);
+};
+
+// Watches a WebContents for focus changes.
+class WebContentsFocusTracker : public FocusTracker,
+                                public content::WebContentsObserver {
+ public:
+  explicit WebContentsFocusTracker(content::WebContents* web_contents)
+      : FocusTracker(IsWebContentsFocused(web_contents)),
+        WebContentsObserver(web_contents) {}
+
+  void OnWebContentsFocused(
+      content::RenderWidgetHost* render_widget_host) override {
+    OnFocused();
+  }
+
+  void OnWebContentsLostFocus(
+      content::RenderWidgetHost* render_widget_host) override {
+    OnBlurred();
+  }
+
+ private:
+  static bool IsWebContentsFocused(content::WebContents* web_contents) {
+    Browser* const browser = chrome::FindBrowserWithWebContents(web_contents);
+    if (!browser)
+      return false;
+    if (browser->tab_strip_model()->GetActiveWebContents() != web_contents)
+      return false;
+    return BrowserView::GetBrowserViewForBrowser(browser)
+        ->contents_web_view()
+        ->HasFocus();
+  }
+};
+
+// Watches a View for focus changes.
+class ViewFocusTracker : public FocusTracker, public views::ViewObserver {
+ public:
+  explicit ViewFocusTracker(views::View* view)
+      : FocusTracker(view->HasFocus()) {
+    scoped_observer_.Add(view);
+  }
+
+  void OnViewFocused(views::View* observed_view) override { OnFocused(); }
+
+  void OnViewBlurred(views::View* observed_view) override { OnBlurred(); }
+
+ private:
+  ScopedObserver<views::View, ViewFocusTracker> scoped_observer_{this};
+};
+
+}  // namespace
+
+// Test that when the PageInfo bubble is closed, focus is returned to the web
+// contents pane.
+IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest,
+                       FocusReturnsToContentOnClose) {
+  content::WebContents* const web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  WebContentsFocusTracker web_contents_focus_tracker(web_contents);
+  web_contents->Focus();
+  web_contents_focus_tracker.WaitForFocus(true);
+
+  OpenPageInfoBubble(browser());
+  PageInfoBubbleView* page_info_bubble_view =
+      static_cast<PageInfoBubbleView*>(PageInfoBubbleView::GetPageInfoBubble());
+  EXPECT_FALSE(web_contents_focus_tracker.focused());
+
+  page_info_bubble_view->GetWidget()->CloseWithReason(
+      views::Widget::ClosedReason::kEscKeyPressed);
+  web_contents_focus_tracker.WaitForFocus(true);
+  EXPECT_TRUE(web_contents_focus_tracker.focused());
+}
+
+// Test that when the PageInfo bubble is closed and a reload prompt is
+// displayed, focus is NOT returned to the web contents pane, but rather returns
+// to the location bar so accessibility users must tab through the reload prompt
+// before getting back to web contents (see https://crbug.com/910067).
+IN_PROC_BROWSER_TEST_F(PageInfoBubbleViewBrowserTest,
+                       FocusDoesNotReturnToContentsOnReloadPrompt) {
+  content::WebContents* const web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  WebContentsFocusTracker web_contents_focus_tracker(web_contents);
+  ViewFocusTracker location_bar_focus_tracker(
+      BrowserView::GetBrowserViewForBrowser(browser())->GetLocationBarView());
+  web_contents->Focus();
+  web_contents_focus_tracker.WaitForFocus(true);
+
+  OpenPageInfoBubble(browser());
+  PageInfoBubbleView* page_info_bubble_view =
+      static_cast<PageInfoBubbleView*>(PageInfoBubbleView::GetPageInfoBubble());
+  EXPECT_FALSE(web_contents_focus_tracker.focused());
+
+  TriggerReloadPromptOnClose();
+  page_info_bubble_view->GetWidget()->CloseWithReason(
+      views::Widget::ClosedReason::kEscKeyPressed);
+  location_bar_focus_tracker.WaitForFocus(true);
+  web_contents_focus_tracker.WaitForFocus(false);
+  EXPECT_TRUE(location_bar_focus_tracker.focused());
+  EXPECT_FALSE(web_contents_focus_tracker.focused());
+}
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
index fbdf4db..2d03575 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
@@ -26,12 +26,12 @@
 #include "content/public/test/navigation_simulator.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_web_contents_factory.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "net/ssl/ssl_connection_status_flags.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/test_data_directory.h"
 #include "ppapi/buildflags/buildflags.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_base_features.h"
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
index f285514..a027c65 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
@@ -457,8 +457,8 @@
         NOTREACHED();
         return;
       }
-      std::string field_length;
-      if (!component->GetString(autofill::kFieldLengthKey, &field_length)) {
+      bool field_length;
+      if (!component->GetBoolean(autofill::kFieldLengthKey, &field_length)) {
         NOTREACHED();
         return;
       }
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.cc b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.cc
new file mode 100644
index 0000000..23da85c
--- /dev/null
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.cc
@@ -0,0 +1,70 @@
+// 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/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/app/vector_icons/vector_icons.h"
+#include "components/send_tab_to_self/target_device_info.h"
+#include "components/sync/protocol/sync.pb.h"
+#include "ui/gfx/color_palette.h"
+#include "ui/gfx/paint_vector_icon.h"
+
+namespace send_tab_to_self {
+
+namespace {
+
+// Icon sizes in DIP.
+constexpr int kPrimaryIconSize = 20;
+
+enum class DeviceIconType {
+  DESKTOP = 0,
+  PHONE = 1,
+  TOTAL_COUNT = 2  // Add new types above this line.
+};
+
+gfx::ImageSkia CreateDeviceIcon(DeviceIconType icon_type, bool enabled = true) {
+  const gfx::VectorIcon* vector_icon;
+  switch (icon_type) {
+    case DeviceIconType::DESKTOP:
+      vector_icon = &kHardwareComputerIcon;
+      break;
+    case DeviceIconType::PHONE:
+      vector_icon = &kHardwareSmartphoneIcon;
+      break;
+    default:
+      vector_icon = &kSendTabToSelfIcon;
+  }
+  SkColor icon_color = enabled ? gfx::kChromeIconGrey : gfx::kGoogleGrey500;
+  return gfx::CreateVectorIcon(*vector_icon, kPrimaryIconSize, icon_color);
+}
+
+gfx::ImageSkia CreateIconView(
+    const sync_pb::SyncEnums::DeviceType device_type) {
+  if (device_type == sync_pb::SyncEnums::TYPE_PHONE) {
+    return CreateDeviceIcon(DeviceIconType::PHONE);
+  }
+  return CreateDeviceIcon(DeviceIconType::DESKTOP);
+}
+
+}  // namespace
+
+SendTabToSelfBubbleDeviceButton::SendTabToSelfBubbleDeviceButton(
+    views::ButtonListener* button_listener,
+    const std::string& device_name,
+    const TargetDeviceInfo& device_info,
+    int button_tag)
+    : HoverButton(button_listener,
+                  CreateIconView(device_info.device_type),
+                  base::UTF8ToUTF16(device_name)) {
+  device_name_ = device_name;
+  device_guid_ = device_info.cache_guid;
+  device_type_ = device_info.device_type;
+  set_tag(button_tag);
+  SetEnabled(true);
+}
+
+SendTabToSelfBubbleDeviceButton::~SendTabToSelfBubbleDeviceButton() = default;
+
+}  // namespace send_tab_to_self
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.h b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.h
new file mode 100644
index 0000000..42dc202
--- /dev/null
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.h
@@ -0,0 +1,42 @@
+// 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_UI_VIEWS_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_BUBBLE_DEVICE_BUTTON_H_
+#define CHROME_BROWSER_UI_VIEWS_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_BUBBLE_DEVICE_BUTTON_H_
+
+#include <string>
+
+#include "base/bind.h"
+#include "chrome/browser/ui/views/hover_button.h"
+#include "components/sync/protocol/sync.pb.h"
+
+namespace send_tab_to_self {
+
+struct TargetDeviceInfo;
+
+// A button representing a device in share bubble. It is highlighted when
+// hovered.
+class SendTabToSelfBubbleDeviceButton : public HoverButton {
+ public:
+  SendTabToSelfBubbleDeviceButton(views::ButtonListener* button_listener,
+                                  const std::string& device_name,
+                                  const TargetDeviceInfo& device_info,
+                                  int button_tag);
+  ~SendTabToSelfBubbleDeviceButton() override;
+
+  const std::string device_name() const { return device_name_; }
+  const std::string device_guid() const { return device_guid_; }
+  sync_pb::SyncEnums::DeviceType device_type() const { return device_type_; }
+
+ private:
+  std::string device_name_;
+  std::string device_guid_;
+  sync_pb::SyncEnums::DeviceType device_type_;
+
+  DISALLOW_COPY_AND_ASSIGN(SendTabToSelfBubbleDeviceButton);
+};
+
+}  // namespace send_tab_to_self
+
+#endif  // CHROME_BROWSER_UI_VIEWS_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_BUBBLE_DEVICE_BUTTON_H_
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc
index d51b9801..e07e753 100644
--- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc
@@ -5,11 +5,19 @@
 #include "chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.h"
 
 #include "base/strings/utf_string_conversions.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_device_button.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/send_tab_to_self/target_device_info.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_base_types.h"
+#include "ui/views/controls/scroll_view.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/fill_layout.h"
 
 namespace send_tab_to_self {
@@ -20,7 +28,8 @@
     content::WebContents* web_contents,
     SendTabToSelfBubbleController* controller)
     : LocationBarBubbleDelegateView(anchor_view, anchor_point, web_contents),
-      controller_(controller) {
+      controller_(controller),
+      weak_factory_(this) {
   DCHECK(controller);
 }
 
@@ -59,8 +68,10 @@
 
 void SendTabToSelfBubbleViewImpl::ButtonPressed(views::Button* sender,
                                                 const ui::Event& event) {
-  // TODO(crbug/959698): handle the action when a button has been clicked.
-  NOTIMPLEMENTED();
+  base::PostTaskWithTraits(
+      FROM_HERE, {content::BrowserThread::UI},
+      base::BindOnce(&SendTabToSelfBubbleViewImpl::DevicePressed,
+                     weak_factory_.GetWeakPtr(), sender->tag()));
 }
 
 gfx::Size SendTabToSelfBubbleViewImpl::CalculatePreferredSize() const {
@@ -87,17 +98,45 @@
                       views::DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL),
                   0));
   SetLayoutManager(std::make_unique<views::FillLayout>());
+
+  CreateScrollView();
+
+  PopulateScrollView(controller_->GetValidDevices());
 }
 
-void SendTabToSelfBubbleViewImpl::ShowScrollView() {
-  // TODO(crbug/960595): show the scroll view.
-  NOTIMPLEMENTED();
+void SendTabToSelfBubbleViewImpl::CreateScrollView() {
+  scroll_view_ = new views::ScrollView();
+  AddChildView(scroll_view_);
+  scroll_view_->ClipHeightTo(0, kDeviceButtonHeight * kMaximumButtons);
 }
 
-void SendTabToSelfBubbleViewImpl::PopulateScrollView() {
-  // TODO(crbug/960595): get the valid devices data and populate the bubble
-  // scroll view.
-  NOTIMPLEMENTED();
+void SendTabToSelfBubbleViewImpl::PopulateScrollView(
+    const std::map<std::string, TargetDeviceInfo> devices) {
+  device_buttons_.clear();
+  auto device_list_view = std::make_unique<views::View>();
+  device_list_view->SetLayoutManager(
+      std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
+  int tag = 0;
+  for (const auto& device : devices) {
+    auto device_button = std::make_unique<SendTabToSelfBubbleDeviceButton>(
+        this, device.first, device.second,
+        /** button_tag */ tag++);
+    device_buttons_.push_back(std::move(device_button));
+    device_list_view->AddChildView(device_buttons_.back().get());
+  }
+  scroll_view_->SetContents(std::move(device_list_view));
+
+  MaybeSizeToContents();
+  Layout();
+}
+
+void SendTabToSelfBubbleViewImpl::DevicePressed(size_t index) {
+  if (!controller_) {
+    return;
+  }
+  SendTabToSelfBubbleDeviceButton* device_button =
+      device_buttons_.at(index).get();
+  controller_->OnDeviceSelected(device_button->device_guid());
 }
 
 void SendTabToSelfBubbleViewImpl::MaybeSizeToContents() {
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.h b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.h
index 385b030..c083fbe 100644
--- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.h
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.h
@@ -26,6 +26,8 @@
 namespace send_tab_to_self {
 
 class SendTabToSelfBubbleController;
+class SendTabToSelfBubbleDeviceButton;
+struct TargetDeviceInfo;
 
 // View component of the send tab to self bubble that allows users to choose
 // target device to send tab to.
@@ -33,6 +35,13 @@
                                     public views::ButtonListener,
                                     public LocationBarBubbleDelegateView {
  public:
+  // The valid device button height.
+  static constexpr int kDeviceButtonHeight = 56;
+  // Maximum number of buttons that are shown without scroll. If the device
+  // number is larger than kMaximumButtons, the bubble content will be
+  // scrollable.
+  static constexpr int kMaximumButtons = 5;
+
   // Bubble will be anchored to |anchor_view|.
   SendTabToSelfBubbleViewImpl(views::View* anchor_view,
                               const gfx::Point& anchor_point,
@@ -60,17 +69,22 @@
   gfx::Size CalculatePreferredSize() const override;
   void OnPaint(gfx::Canvas* canvas) override;
 
+  // Shows the bubble view.
   void Show(DisplayReason reason);
 
  private:
   // views::BubbleDialogDelegateView:
   void Init() override;
 
-  // Shows the scroll view.
-  void ShowScrollView();
+  // Creates the scroll view.
+  void CreateScrollView();
 
   // Populates the scroll view containing valid devices.
-  void PopulateScrollView();
+  void PopulateScrollView(
+      const std::map<std::string, TargetDeviceInfo> devices);
+
+  // Handles the action when a target device has been pressed.
+  void DevicePressed(size_t index);
 
   // Resizes and potentially moves the bubble to fit the content's preferred
   // size.
@@ -79,11 +93,19 @@
   // Title shown at the top of the bubble.
   base::string16 bubble_title_;
 
+  // Contains references to device buttons in the order they appear.
+  std::vector<std::unique_ptr<SendTabToSelfBubbleDeviceButton>> device_buttons_;
+
   SendTabToSelfBubbleController* controller_;  // Weak reference.
 
+  // ScrollView containing the list of device buttons.
+  views::ScrollView* scroll_view_ = nullptr;
+
   // The device that the user has selected to share tab to.
   base::Optional<size_t> selected_device_index_;
 
+  base::WeakPtrFactory<SendTabToSelfBubbleViewImpl> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(SendTabToSelfBubbleViewImpl);
 };
 
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc
index 0231f8ab..d69fb5b 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -107,9 +107,7 @@
   if (browser->SupportsWindowFeature(Browser::FEATURE_TABSTRIP))
     return ToolbarView::DisplayMode::NORMAL;
 
-  if (browser->app_controller() &&
-      web_app::AppBrowserController::IsForExperimentalWebAppBrowser(browser) &&
-      base::FeatureList::IsEnabled(features::kDesktopPWAsCustomTabUI))
+  if (web_app::AppBrowserController::IsForExperimentalWebAppBrowser(browser))
     return ToolbarView::DisplayMode::CUSTOM_TAB;
 
   return ToolbarView::DisplayMode::LOCATION;
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc
index 5ce3232c..fc56f0a 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -12,6 +12,7 @@
 
 #include "base/i18n/string_compare.h"
 #include "base/memory/singleton.h"
+#include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
@@ -68,7 +69,6 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(AdvancedViewContainer);
 };
-
 }  // namespace
 
 // static
@@ -184,11 +184,30 @@
       std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
 
   should_always_translate_ = model_->ShouldAlwaysTranslate();
-  before_translate_view_ = CreateViewBeforeTranslate();
-  translating_view_ = CreateViewTranslating();
-  after_translate_view_ = CreateViewAfterTranslate();
-  error_view_ = CreateViewError();
-  advanced_view_ = CreateViewAdvanced();
+
+  // Create different view based on user selection in chrome://flags.
+  language::TranslateUIBubbleModel bubble_model_ =
+      language::GetTranslateUIBubbleModel();
+  if (bubble_model_ == language::TranslateUIBubbleModel::BUTTON ||
+      bubble_model_ == language::TranslateUIBubbleModel::DEFAULT) {
+    before_translate_view_ = CreateViewBeforeTranslate();
+    translating_view_ = CreateViewTranslating();
+    after_translate_view_ = CreateViewAfterTranslate();
+    error_view_ = CreateViewError();
+    advanced_view_ = CreateViewAdvanced();
+  } else if (bubble_model_ == language::TranslateUIBubbleModel::TAB) {
+    before_translate_view_ = TabCreateViewBeforeTranslate();
+    translating_view_ = CreateViewTranslating();
+    after_translate_view_ = CreateViewAfterTranslate();
+    error_view_ = CreateViewError();
+    advanced_view_ = CreateViewAdvanced();
+  } else {  // Button
+    before_translate_view_ = CreateViewBeforeTranslate();
+    translating_view_ = CreateViewTranslating();
+    after_translate_view_ = CreateViewAfterTranslate();
+    error_view_ = CreateViewError();
+    advanced_view_ = CreateViewAdvanced();
+  }
 
   AddChildView(before_translate_view_);
   AddChildView(translating_view_);
@@ -624,6 +643,37 @@
   return view;
 }
 
+// This view is invoked before translate if "Tab" is selected under
+// flag translate-ui-bubble-options in chrome://flags.
+views::View* TranslateBubbleView::TabCreateViewBeforeTranslate() {
+  views::View* view = new views::View();
+  views::GridLayout* layout =
+      view->SetLayoutManager(std::make_unique<views::GridLayout>(view));
+
+  ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
+
+  constexpr int kColumnSetId = 0;
+  views::ColumnSet* cs = layout->AddColumnSet(kColumnSetId);
+  cs->AddPaddingColumn(1.0, 0);
+  cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
+                views::GridLayout::kFixedSize, views::GridLayout::USE_PREF,
+                views::GridLayout::kFixedSize, 0);
+
+  cs->AddPaddingColumn(
+      views::GridLayout::kFixedSize,
+      provider->GetDistanceMetric(views::DISTANCE_RELATED_BUTTON_HORIZONTAL));
+  cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
+                views::GridLayout::kFixedSize, views::GridLayout::USE_PREF, 0,
+                0);
+
+  layout->AddPaddingRow(
+      views::GridLayout::kFixedSize,
+      provider->GetDistanceMetric(views::DISTANCE_UNRELATED_CONTROL_VERTICAL));
+
+  layout->StartRow(views::GridLayout::kFixedSize, kColumnSetId);
+  return view;
+}
+
 views::View* TranslateBubbleView::CreateViewTranslating() {
   base::string16 target_language_name =
       model_->GetLanguageNameAt(model_->GetTargetLanguageIndex());
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.h b/chrome/browser/ui/views/translate/translate_bubble_view.h
index b62e8a9..0a6bea2 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.h
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.h
@@ -19,6 +19,7 @@
 #include "chrome/browser/ui/translate/translate_bubble_test_utils.h"
 #include "chrome/browser/ui/translate/translate_bubble_view_state_transition.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h"
+#include "components/language/core/common/language_experiments.h"
 #include "components/translate/core/common/translate_errors.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "ui/base/models/simple_menu_model.h"
@@ -194,21 +195,27 @@
   void UpdateChildVisibilities();
 
   // Creates the 'before translate' view. Caller takes ownership of the returned
-  // view.
+  // view. Three options depending on UI selection in
+  // kUseButtonTranslateBubbleUI.
   views::View* CreateViewBeforeTranslate();
+  views::View* TabCreateViewBeforeTranslate();
 
   // Creates the 'translating' view. Caller takes ownership of the returned
-  // view.
+  // view. Three options depending on UI selection in
+  // kUseButtonTranslateBubbleUI.
   views::View* CreateViewTranslating();
 
   // Creates the 'after translate' view. Caller takes ownership of the returned
-  // view.
+  // view. Three options depending on UI selection in
+  // kUseButtonTranslateBubbleUI.
   views::View* CreateViewAfterTranslate();
 
   // Creates the 'error' view. Caller takes ownership of the returned view.
+  // Three options depending on UI selection in kUseButtonTranslateBubbleUI.
   views::View* CreateViewError();
 
   // Creates the 'advanced' view. Caller takes ownership of the returned view.
+  // Three options depending on UI selection in kUseButtonTranslateBubbleUI.
   views::View* CreateViewAdvanced();
 
   // Get the current always translate checkbox
diff --git a/chrome/browser/ui/views/webauthn/hover_list_view.cc b/chrome/browser/ui/views/webauthn/hover_list_view.cc
index 84e693a3..5b16e70 100644
--- a/chrome/browser/ui/views/webauthn/hover_list_view.cc
+++ b/chrome/browser/ui/views/webauthn/hover_list_view.cc
@@ -27,42 +27,87 @@
 
 constexpr int kPlaceHolderItemTag = -1;
 
+class WebauthnHoverButton : public HoverButton {
+ public:
+  WebauthnHoverButton(views::ButtonListener* button_listener,
+                      std::unique_ptr<views::View> icon_view,
+                      const base::string16& title,
+                      const base::string16& subtitle,
+                      std::unique_ptr<views::View> secondary_view)
+      : HoverButton(button_listener,
+                    std::move(icon_view),
+                    title,
+                    subtitle,
+                    std::move(secondary_view),
+                    false) {}
+
+  gfx::Insets GetInsets() const override {
+    gfx::Insets ret = HoverButton::GetInsets();
+    if (left_inset_.has_value()) {
+      ret.set_left(*left_inset_);
+    }
+    ret.set_right(8);
+    return ret;
+  }
+
+  void SetInsetForNoIcon() {
+    // When there's no icon, insets within the underlying HoverButton take care
+    // of the padding on the left and we don't want to add any more.
+    left_inset_ = 0;
+  }
+
+ private:
+  base::Optional<int> left_inset_;
+};
+
 std::unique_ptr<HoverButton> CreateHoverButtonForListItem(
     int item_tag,
-    const gfx::VectorIcon& vector_icon,
+    const gfx::VectorIcon* vector_icon,
     base::string16 item_title,
     base::string16 item_description,
     views::ButtonListener* listener,
+    bool is_two_line_item,
     bool is_placeholder_item = false) {
-  // TODO(hongjunchoi): Make HoverListView subclass of HoverButton and listen
-  // for potential native theme color change.
-  //
   // Derive the icon color from the text color of an enabled label.
   auto color_reference_label = std::make_unique<views::Label>(
       base::string16(), CONTEXT_BODY_TEXT_SMALL, views::style::STYLE_PRIMARY);
   const SkColor icon_color = color_utils::DeriveDefaultIconColor(
       color_reference_label->enabled_color());
 
-  constexpr int kIconSize = 20;
   auto item_image = std::make_unique<views::ImageView>();
-  item_image->SetImage(
-      gfx::CreateVectorIcon(vector_icon, kIconSize, icon_color));
+  if (vector_icon) {
+    constexpr int kIconSize = 20;
+    item_image->SetImage(
+        gfx::CreateVectorIcon(*vector_icon, kIconSize, icon_color));
+  }
 
-  constexpr int kChevronSize = 8;
-  constexpr int kChevronPadding = (kIconSize - kChevronSize) / 2;
   std::unique_ptr<views::ImageView> chevron_image = nullptr;
   if (!is_placeholder_item) {
+    constexpr int kChevronSize = 8;
     chevron_image = std::make_unique<views::ImageView>();
     chevron_image->SetImage(gfx::CreateVectorIcon(views::kSubmenuArrowIcon,
                                                   kChevronSize, icon_color));
-    chevron_image->SetBorder(
-        views::CreateEmptyBorder(gfx::Insets(kChevronPadding)));
+
+    int chevron_vert_inset = 0;
+    if (is_two_line_item) {
+      // Items that are sized for two lines use the top and bottom insets of the
+      // chevron image to pad single-line items out to a uniform height of
+      // |kHeight|.
+      constexpr int kHeight = 56;
+      chevron_vert_inset = (kHeight - kChevronSize) / 2;
+    }
+    chevron_image->SetBorder(views::CreateEmptyBorder(
+        gfx::Insets(/*top=*/chevron_vert_inset, /*left=*/12,
+                    /*bottom=*/chevron_vert_inset, /*right=*/0)));
   }
 
-  auto hover_button = std::make_unique<HoverButton>(
+  auto hover_button = std::make_unique<WebauthnHoverButton>(
       listener, std::move(item_image), std::move(item_title),
       std::move(item_description), std::move(chevron_image));
   hover_button->set_tag(item_tag);
+  if (!vector_icon) {
+    hover_button->SetInsetForNoIcon();
+  }
 
   // Because there is an icon on both sides, set a custom border that has only
   // half of the normal padding horizontally.
@@ -98,7 +143,7 @@
 // HoverListView ---------------------------------------------------------
 
 HoverListView::HoverListView(std::unique_ptr<HoverListModel> model)
-    : model_(std::move(model)) {
+    : model_(std::move(model)), is_two_line_list_(model_->StyleForTwoLines()) {
   DCHECK(model_);
   SetLayoutManager(std::make_unique<views::FillLayout>());
 
@@ -134,12 +179,12 @@
   model_->RemoveObserver();
 }
 
-void HoverListView::AppendListItemView(const gfx::VectorIcon& icon,
+void HoverListView::AppendListItemView(const gfx::VectorIcon* icon,
                                        base::string16 item_text,
                                        base::string16 description_text,
                                        int item_tag) {
-  auto hover_button = CreateHoverButtonForListItem(item_tag, icon, item_text,
-                                                   description_text, this);
+  auto hover_button = CreateHoverButtonForListItem(
+      item_tag, icon, item_text, description_text, this, is_two_line_list_);
 
   auto* list_item_view_ptr = hover_button.release();
   item_container_->AddChildView(list_item_view_ptr);
@@ -261,8 +306,8 @@
       model_->GetPreferredItemCount() - tags_to_list_item_views_.size();
   if (reserved_items > 0) {
     auto dummy_hover_button = CreateHoverButtonForListItem(
-        -1 /* tag */, gfx::kNoneIcon, base::string16(), base::string16(),
-        nullptr /* listener */);
+        -1 /* tag */, &gfx::kNoneIcon, base::string16(), base::string16(),
+        nullptr /* listener */, is_two_line_list_);
     const auto list_item_height =
         separator_height + dummy_hover_button->GetPreferredSize().height();
     size += list_item_height * reserved_items;
diff --git a/chrome/browser/ui/views/webauthn/hover_list_view.h b/chrome/browser/ui/views/webauthn/hover_list_view.h
index 653f3c4f..0d279dd 100644
--- a/chrome/browser/ui/views/webauthn/hover_list_view.h
+++ b/chrome/browser/ui/views/webauthn/hover_list_view.h
@@ -53,7 +53,7 @@
     views::Separator* separator_view;
   };
 
-  void AppendListItemView(const gfx::VectorIcon& icon,
+  void AppendListItemView(const gfx::VectorIcon* icon,
                           base::string16 item_text,
                           base::string16 item_description,
                           int item_tag);
@@ -81,6 +81,10 @@
   base::Optional<ListItemViews> placeholder_list_item_view_;
   views::ScrollView* scroll_view_;
   views::View* item_container_;
+  // is_two_line_list_, if true, indicates that list items should be sized so
+  // that entries with only a single line of text are as tall as entries with
+  // two lines.
+  const bool is_two_line_list_;
 
   DISALLOW_COPY_AND_ASSIGN(HoverListView);
 };
diff --git a/chrome/browser/ui/webauthn/account_hover_list_model.cc b/chrome/browser/ui/webauthn/account_hover_list_model.cc
index 632b4eb..f386616e 100644
--- a/chrome/browser/ui/webauthn/account_hover_list_model.cc
+++ b/chrome/browser/ui/webauthn/account_hover_list_model.cc
@@ -27,8 +27,8 @@
   return base::string16();
 }
 
-const gfx::VectorIcon& AccountHoverListModel::GetPlaceholderIcon() const {
-  return kUserAccountAvatarIcon;
+const gfx::VectorIcon* AccountHoverListModel::GetPlaceholderIcon() const {
+  return &kUserAccountAvatarIcon;
 }
 
 std::vector<int> AccountHoverListModel::GetItemTags() const {
@@ -50,9 +50,8 @@
   return base::UTF8ToUTF16(user->name.value_or(""));
 }
 
-const gfx::VectorIcon& AccountHoverListModel::GetItemIcon(int item_tag) const {
-  // TODO(nsatragno): fetch an icon from |user->icon_url|.
-  return GetPlaceholderIcon();
+const gfx::VectorIcon* AccountHoverListModel::GetItemIcon(int item_tag) const {
+  return nullptr;
 }
 
 void AccountHoverListModel::OnListItemSelected(int item_tag) {
@@ -62,3 +61,7 @@
 size_t AccountHoverListModel::GetPreferredItemCount() const {
   return response_list_->size();
 }
+
+bool AccountHoverListModel::StyleForTwoLines() const {
+  return true;
+}
diff --git a/chrome/browser/ui/webauthn/account_hover_list_model.h b/chrome/browser/ui/webauthn/account_hover_list_model.h
index a808fcf..fe84bf57 100644
--- a/chrome/browser/ui/webauthn/account_hover_list_model.h
+++ b/chrome/browser/ui/webauthn/account_hover_list_model.h
@@ -33,13 +33,14 @@
   // HoverListModel:
   bool ShouldShowPlaceholderForEmptyList() const override;
   base::string16 GetPlaceholderText() const override;
-  const gfx::VectorIcon& GetPlaceholderIcon() const override;
+  const gfx::VectorIcon* GetPlaceholderIcon() const override;
   std::vector<int> GetItemTags() const override;
   base::string16 GetItemText(int item_tag) const override;
   base::string16 GetDescriptionText(int item_tag) const override;
-  const gfx::VectorIcon& GetItemIcon(int item_tag) const override;
+  const gfx::VectorIcon* GetItemIcon(int item_tag) const override;
   void OnListItemSelected(int item_tag) override;
   size_t GetPreferredItemCount() const override;
+  bool StyleForTwoLines() const override;
 
  private:
   const std::vector<device::AuthenticatorGetAssertionResponse>* response_list_;
diff --git a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
index c75a6c14..2b69dff 100644
--- a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
+++ b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
@@ -124,6 +124,9 @@
           {"", "Test User 2"},
           {"", ""},
           {"bat@example.com", "Test User 4"},
+          {"verylong@reallylongreallylongreallylongreallylongreallylong.com",
+           "Very Long String Very Long String Very Long String Very Long "
+           "String Very Long String Very Long String "},
       };
       std::vector<device::AuthenticatorGetAssertionResponse> responses;
 
diff --git a/chrome/browser/ui/webauthn/ble_device_hover_list_model.cc b/chrome/browser/ui/webauthn/ble_device_hover_list_model.cc
index b1bcbdeb..ecd90162 100644
--- a/chrome/browser/ui/webauthn/ble_device_hover_list_model.cc
+++ b/chrome/browser/ui/webauthn/ble_device_hover_list_model.cc
@@ -69,7 +69,7 @@
       IDS_WEBAUTHN_BLE_DEVICE_SELECTION_SEARCHING_LABEL);
 }
 
-const gfx::VectorIcon& BleDeviceHoverListModel::GetPlaceholderIcon() const {
+const gfx::VectorIcon* BleDeviceHoverListModel::GetPlaceholderIcon() const {
   return GetTransportVectorIcon(AuthenticatorTransport::kBluetoothLowEnergy);
 }
 
@@ -81,7 +81,7 @@
   return base::string16();
 }
 
-const gfx::VectorIcon& BleDeviceHoverListModel::GetItemIcon(
+const gfx::VectorIcon* BleDeviceHoverListModel::GetItemIcon(
     int item_tag) const {
   return GetTransportVectorIcon(AuthenticatorTransport::kBluetoothLowEnergy);
 }
@@ -112,6 +112,10 @@
   return kDefaultItemViewCount;
 }
 
+bool BleDeviceHoverListModel::StyleForTwoLines() const {
+  return false;
+}
+
 void BleDeviceHoverListModel::OnAuthenticatorAdded(
     const AuthenticatorReference& authenticator) {
   auto item_tag = authenticator_tags_.empty()
diff --git a/chrome/browser/ui/webauthn/ble_device_hover_list_model.h b/chrome/browser/ui/webauthn/ble_device_hover_list_model.h
index 08232012..fb4c1d026 100644
--- a/chrome/browser/ui/webauthn/ble_device_hover_list_model.h
+++ b/chrome/browser/ui/webauthn/ble_device_hover_list_model.h
@@ -39,13 +39,14 @@
   // HoverListModel:
   bool ShouldShowPlaceholderForEmptyList() const override;
   base::string16 GetPlaceholderText() const override;
-  const gfx::VectorIcon& GetPlaceholderIcon() const override;
+  const gfx::VectorIcon* GetPlaceholderIcon() const override;
   base::string16 GetItemText(int item_tag) const override;
   base::string16 GetDescriptionText(int item_tag) const override;
-  const gfx::VectorIcon& GetItemIcon(int item_tag) const override;
+  const gfx::VectorIcon* GetItemIcon(int item_tag) const override;
   std::vector<int> GetItemTags() const override;
   void OnListItemSelected(int item_tag) override;
   size_t GetPreferredItemCount() const override;
+  bool StyleForTwoLines() const override;
 
   // AuthenticatorListObserver:
   void OnAuthenticatorAdded(
diff --git a/chrome/browser/ui/webauthn/hover_list_model.h b/chrome/browser/ui/webauthn/hover_list_model.h
index a3584f76..7244e80 100644
--- a/chrome/browser/ui/webauthn/hover_list_model.h
+++ b/chrome/browser/ui/webauthn/hover_list_model.h
@@ -11,6 +11,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "base/strings/string16.h"
 #include "ui/gfx/vector_icon_types.h"
 
@@ -37,13 +38,25 @@
 
   virtual bool ShouldShowPlaceholderForEmptyList() const = 0;
   virtual base::string16 GetPlaceholderText() const = 0;
-  virtual const gfx::VectorIcon& GetPlaceholderIcon() const = 0;
+  // GetPlaceholderIcon may return nullptr to indicate that no icon should be
+  // added. This is distinct from using an empty icon as the latter will still
+  // take up as much space as any other icon.
+  virtual const gfx::VectorIcon* GetPlaceholderIcon() const = 0;
   virtual std::vector<int> GetItemTags() const = 0;
   virtual base::string16 GetItemText(int item_tag) const = 0;
   virtual base::string16 GetDescriptionText(int item_tag) const = 0;
-  virtual const gfx::VectorIcon& GetItemIcon(int item_tag) const = 0;
+  // GetItemIcon may return nullptr to indicate that no icon should be added.
+  // This is distinct from using an empty icon as the latter will still take up
+  // as much space as any other icon.
+  virtual const gfx::VectorIcon* GetItemIcon(int item_tag) const = 0;
   virtual void OnListItemSelected(int item_tag) = 0;
   virtual size_t GetPreferredItemCount() const = 0;
+  // StyleForTwoLines returns true if the items in the list should lay out
+  // with the assumption that there will be both item and description text.
+  // This causes items with no description text to be larger than strictly
+  // necessary so that all items, including those with descriptions, are the
+  // same height.
+  virtual bool StyleForTwoLines() const = 0;
 
   void SetObserver(Observer* observer) {
     DCHECK(!observer_);
diff --git a/chrome/browser/ui/webauthn/other_transports_menu_model.cc b/chrome/browser/ui/webauthn/other_transports_menu_model.cc
index db16d02..85110b44 100644
--- a/chrome/browser/ui/webauthn/other_transports_menu_model.cc
+++ b/chrome/browser/ui/webauthn/other_transports_menu_model.cc
@@ -15,7 +15,7 @@
 
 gfx::ImageSkia GetTransportIcon(AuthenticatorTransport transport) {
   constexpr int kTransportIconSize = 16;
-  return gfx::CreateVectorIcon(GetTransportVectorIcon(transport),
+  return gfx::CreateVectorIcon(*GetTransportVectorIcon(transport),
                                kTransportIconSize, gfx::kGoogleGrey700);
 }
 
diff --git a/chrome/browser/ui/webauthn/transport_hover_list_model.cc b/chrome/browser/ui/webauthn/transport_hover_list_model.cc
index 3105967..6007530b 100644
--- a/chrome/browser/ui/webauthn/transport_hover_list_model.cc
+++ b/chrome/browser/ui/webauthn/transport_hover_list_model.cc
@@ -24,8 +24,8 @@
   return base::string16();
 }
 
-const gfx::VectorIcon& TransportHoverListModel::GetPlaceholderIcon() const {
-  return gfx::kNoneIcon;
+const gfx::VectorIcon* TransportHoverListModel::GetPlaceholderIcon() const {
+  return &gfx::kNoneIcon;
 }
 
 std::vector<int> TransportHoverListModel::GetItemTags() const {
@@ -46,7 +46,7 @@
   return base::string16();
 }
 
-const gfx::VectorIcon& TransportHoverListModel::GetItemIcon(
+const gfx::VectorIcon* TransportHoverListModel::GetItemIcon(
     int item_tag) const {
   return GetTransportVectorIcon(static_cast<AuthenticatorTransport>(item_tag));
 }
@@ -59,3 +59,7 @@
 size_t TransportHoverListModel::GetPreferredItemCount() const {
   return transport_list_.size();
 }
+
+bool TransportHoverListModel::StyleForTwoLines() const {
+  return false;
+}
diff --git a/chrome/browser/ui/webauthn/transport_hover_list_model.h b/chrome/browser/ui/webauthn/transport_hover_list_model.h
index 15b86f5..0ad10e9 100644
--- a/chrome/browser/ui/webauthn/transport_hover_list_model.h
+++ b/chrome/browser/ui/webauthn/transport_hover_list_model.h
@@ -29,13 +29,14 @@
   // HoverListModel:
   bool ShouldShowPlaceholderForEmptyList() const override;
   base::string16 GetPlaceholderText() const override;
-  const gfx::VectorIcon& GetPlaceholderIcon() const override;
+  const gfx::VectorIcon* GetPlaceholderIcon() const override;
   std::vector<int> GetItemTags() const override;
   base::string16 GetItemText(int item_tag) const override;
   base::string16 GetDescriptionText(int item_tag) const override;
-  const gfx::VectorIcon& GetItemIcon(int item_tag) const override;
+  const gfx::VectorIcon* GetItemIcon(int item_tag) const override;
   void OnListItemSelected(int item_tag) override;
   size_t GetPreferredItemCount() const override;
+  bool StyleForTwoLines() const override;
 
  private:
   std::vector<AuthenticatorTransport> transport_list_;
diff --git a/chrome/browser/ui/webauthn/transport_utils.cc b/chrome/browser/ui/webauthn/transport_utils.cc
index 952f951..3deb6cc 100644
--- a/chrome/browser/ui/webauthn/transport_utils.cc
+++ b/chrome/browser/ui/webauthn/transport_utils.cc
@@ -61,20 +61,20 @@
   return l10n_util::GetStringUTF16(message_id);
 }
 
-const gfx::VectorIcon& GetTransportVectorIcon(
+const gfx::VectorIcon* GetTransportVectorIcon(
     AuthenticatorTransport transport) {
   switch (transport) {
     case AuthenticatorTransport::kBluetoothLowEnergy:
-      return kBluetoothIcon;
+      return &kBluetoothIcon;
     case AuthenticatorTransport::kNearFieldCommunication:
-      return kNfcIcon;
+      return &kNfcIcon;
     case AuthenticatorTransport::kUsbHumanInterfaceDevice:
-      return vector_icons::kUsbIcon;
+      return &vector_icons::kUsbIcon;
     case AuthenticatorTransport::kInternal:
-      return kFingerprintIcon;
+      return &kFingerprintIcon;
     case AuthenticatorTransport::kCloudAssistedBluetoothLowEnergy:
-      return kSmartphoneIcon;
+      return &kSmartphoneIcon;
   }
   NOTREACHED();
-  return kFingerprintIcon;
+  return &kFingerprintIcon;
 }
diff --git a/chrome/browser/ui/webauthn/transport_utils.h b/chrome/browser/ui/webauthn/transport_utils.h
index b5450a8c..8207d9b8 100644
--- a/chrome/browser/ui/webauthn/transport_utils.h
+++ b/chrome/browser/ui/webauthn/transport_utils.h
@@ -23,6 +23,6 @@
 
 // Returns the vector icon to show next to the |transport| in the manual
 // transport selection list.
-const gfx::VectorIcon& GetTransportVectorIcon(AuthenticatorTransport transport);
+const gfx::VectorIcon* GetTransportVectorIcon(AuthenticatorTransport transport);
 
 #endif  // CHROME_BROWSER_UI_WEBAUTHN_TRANSPORT_UTILS_H_
diff --git a/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.cc
index d3533ba..01fcd680 100644
--- a/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/chromeos/login/auth/chrome_cryptohome_authenticator.h"
 #include "chrome/browser/chromeos/login/saml/saml_password_expiry_notification.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
@@ -34,8 +33,7 @@
   }
 
   const policy::UserCloudPolicyManagerChromeOS* user_cloud_policy_manager =
-      policy::UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   if (user_cloud_policy_manager) {
     const enterprise_management::PolicyData* policy =
         user_cloud_policy_manager->core()->store()->policy();
diff --git a/chrome/browser/ui/webui/chromeos/insession_password_change_ui.cc b/chrome/browser/ui/webui/chromeos/insession_password_change_ui.cc
index eb4c9d46..648280c 100644
--- a/chrome/browser/ui/webui/chromeos/insession_password_change_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/insession_password_change_ui.cc
@@ -14,17 +14,68 @@
 #include "chrome/grit/browser_resources.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/prefs/pref_service.h"
+#include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_ui_data_source.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
 #include "ui/strings/grit/ui_strings.h"
 
 namespace chromeos {
 
+namespace {
+
+PasswordChangeDialog* g_dialog = nullptr;
+
+constexpr int kMaxDialogWidth = 768;
+constexpr int kMaxDialogHeight = 640;
+
+gfx::Size GetPasswordChangeDialogSize() {
+  const display::Display display =
+      display::Screen::GetScreen()->GetPrimaryDisplay();
+
+  gfx::Size display_size = display.size();
+
+  if (display.rotation() == display::Display::ROTATE_90 ||
+      display.rotation() == display::Display::ROTATE_270) {
+    display_size = gfx::Size(display_size.height(), display_size.width());
+  }
+
+  display_size = gfx::Size(std::min(display_size.width(), kMaxDialogWidth),
+                           std::min(display_size.height(), kMaxDialogHeight));
+
+  return display_size;
+}
+
+}  // namespace
+
+PasswordChangeDialog::PasswordChangeDialog()
+    : SystemWebDialogDelegate(GURL(chrome::kChromeUIPasswordChangeUrl),
+                              base::string16()) {}
+
+PasswordChangeDialog::~PasswordChangeDialog() {
+  DCHECK_EQ(this, g_dialog);
+  g_dialog = nullptr;
+}
+
+void PasswordChangeDialog::GetDialogSize(gfx::Size* size) const {
+  *size = GetPasswordChangeDialogSize();
+}
+
+void PasswordChangeDialog::Show() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  if (g_dialog) {
+    g_dialog->Focus();
+    return;
+  }
+  g_dialog = new PasswordChangeDialog();
+  g_dialog->ShowSystemDialog();
+}
+
 InSessionPasswordChangeUI::InSessionPasswordChangeUI(content::WebUI* web_ui)
     : ui::WebDialogUI(web_ui) {
   Profile* profile = Profile::FromWebUI(web_ui);
   CHECK(profile->GetPrefs()->GetBoolean(
       prefs::kSamlInSessionPasswordChangeEnabled));
-
   content::WebUIDataSource* source =
       content::WebUIDataSource::Create(chrome::kChromeUIPasswordChangeHost);
 
diff --git a/chrome/browser/ui/webui/chromeos/insession_password_change_ui.h b/chrome/browser/ui/webui/chromeos/insession_password_change_ui.h
index b012a52..704b3de 100644
--- a/chrome/browser/ui/webui/chromeos/insession_password_change_ui.h
+++ b/chrome/browser/ui/webui/chromeos/insession_password_change_ui.h
@@ -6,10 +6,26 @@
 #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_INSESSION_PASSWORD_CHANGE_UI_H_
 
 #include "base/macros.h"
+#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
 #include "ui/web_dialogs/web_dialog_ui.h"
 
 namespace chromeos {
 
+class PasswordChangeDialog : public SystemWebDialogDelegate {
+ public:
+  static void Show();
+
+ protected:
+  PasswordChangeDialog();
+  ~PasswordChangeDialog() override;
+
+  // ui::WebDialogDelegate:
+  void GetDialogSize(gfx::Size* size) const override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PasswordChangeDialog);
+};
+
 // For chrome:://password-change
 class InSessionPasswordChangeUI : public ui::WebDialogUI {
  public:
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index c0f2e46..160fb366 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -166,9 +166,7 @@
 }
 
 void AddSupervisionOnboardingScreenResources(content::WebUIDataSource* source) {
-  source->AddResourcePath("supervision_onboarding_controller.mojom.html",
-                          IDR_SUPERVISION_ONBOARDING_CONTROLLER_MOJOM_HTML);
-  source->AddResourcePath("onboarding_controller.mojom-lite.js",
+  source->AddResourcePath("supervision/onboarding_controller.mojom-lite.js",
                           IDR_SUPERVISION_ONBOARDING_CONTROLLER_MOJOM_LITE_JS);
 }
 
diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui/favicon_source.cc
index 77ab61a..b63d5b82 100644
--- a/chrome/browser/ui/webui/favicon_source.cc
+++ b/chrome/browser/ui/webui/favicon_source.cc
@@ -38,6 +38,21 @@
     return favicon::FaviconRequestOrigin::HISTORY;
   return favicon::FaviconRequestOrigin::UNKNOWN;
 }
+
+bool GetSyncedFaviconForPageURL(
+    Profile* profile,
+    const GURL& page_url,
+    scoped_refptr<base::RefCountedMemory>* sync_bitmap) {
+  sync_sessions::SessionSyncService* session_sync_service =
+      SessionSyncServiceFactory::GetInstance()->GetForProfile(profile);
+  if (!session_sync_service)
+    return false;
+  sync_sessions::OpenTabsUIDelegate* open_tabs =
+      session_sync_service->GetOpenTabsUIDelegate();
+  return open_tabs &&
+         open_tabs->GetSyncedFaviconForPageURL(page_url.spec(), sync_bitmap);
+}
+
 }  // namespace
 
 FaviconSource::IconRequest::IconRequest()
@@ -112,7 +127,7 @@
     // IconType.
     favicon_service->GetRawFavicon(
         url, favicon_base::IconType::kFavicon, desired_size_in_pixel,
-        base::Bind(
+        base::BindRepeating(
             &FaviconSource::OnFaviconDataAvailable, base::Unretained(this),
             IconRequest(callback, url, parsed.size_in_dip,
                         parsed.device_scale_factor, unsafe_request_origin)),
@@ -135,21 +150,14 @@
       }
     }
 
-    // |url| is an origin, and it may not have had a favicon associated with it.
-    // A trickier case is when |url| only has domain-scoped cookies, but
-    // visitors are redirected to HTTPS on visiting. Then |url| defaults to a
-    // HTTP scheme, but the favicon will be associated with the HTTPS URL and
-    // hence won't be found if we include the scheme in the lookup. Set
-    // |fallback_to_host|=true so the favicon database will fall back to
-    // matching only the hostname to have the best chance of finding a favicon.
-    const bool fallback_to_host = true;
-    favicon_service->GetRawFaviconForPageURL(
-        url, {favicon_base::IconType::kFavicon}, desired_size_in_pixel,
-        fallback_to_host,
-        base::Bind(
+    favicon_request_handler_.GetRawFaviconForPageURL(
+        url, desired_size_in_pixel,
+        base::BindRepeating(
             &FaviconSource::OnFaviconDataAvailable, base::Unretained(this),
             IconRequest(callback, url, parsed.size_in_dip,
                         parsed.device_scale_factor, unsafe_request_origin)),
+        unsafe_request_origin, favicon_service,
+        base::BindOnce(&GetSyncedFaviconForPageURL, base::Unretained(profile_)),
         &cancelable_task_tracker_);
   }
 }
@@ -182,23 +190,6 @@
                                              render_process_id);
 }
 
-bool FaviconSource::HandleMissingResource(const IconRequest& request) {
-  // If the favicon is not available, try to use the synced favicon.
-  sync_sessions::SessionSyncService* service =
-      SessionSyncServiceFactory::GetInstance()->GetForProfile(profile_);
-  sync_sessions::OpenTabsUIDelegate* open_tabs =
-      service ? service->GetOpenTabsUIDelegate() : nullptr;
-
-  scoped_refptr<base::RefCountedMemory> response;
-  if (open_tabs &&
-      open_tabs->GetSyncedFaviconForPageURL(request.request_path.spec(),
-                                            &response)) {
-    request.callback.Run(response.get());
-    return true;
-  }
-  return false;
-}
-
 ui::NativeTheme* FaviconSource::GetNativeTheme() {
   return ui::NativeTheme::GetInstanceForNativeUi();
 }
@@ -207,18 +198,9 @@
     const IconRequest& request,
     const favicon_base::FaviconRawBitmapResult& bitmap_result) {
   if (bitmap_result.is_valid()) {
-    favicon::RecordFaviconRequestMetric(request.icon_request_origin,
-                                        favicon::FaviconAvailability::kLocal);
     // Forward the data along to the networking system.
     request.callback.Run(bitmap_result.bitmap_data.get());
-  } else if (HandleMissingResource(request)) {
-    favicon::RecordFaviconRequestMetric(request.icon_request_origin,
-                                        favicon::FaviconAvailability::kSync);
-    // The response was already treated by HandleMissingResource.
   } else {
-    favicon::RecordFaviconRequestMetric(
-        request.icon_request_origin,
-        favicon::FaviconAvailability::kNotAvailable);
     SendDefaultResponse(request);
   }
 }
diff --git a/chrome/browser/ui/webui/favicon_source.h b/chrome/browser/ui/webui/favicon_source.h
index 4b72ee5..70ecb55 100644
--- a/chrome/browser/ui/webui/favicon_source.h
+++ b/chrome/browser/ui/webui/favicon_source.h
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/task/cancelable_task_tracker.h"
+#include "components/favicon/core/favicon_request_handler.h"
 #include "components/favicon/core/favicon_service.h"
 #include "components/favicon_base/favicon_request_metrics.h"
 #include "content/public/browser/url_data_source.h"
@@ -91,12 +92,6 @@
     favicon::FaviconRequestOrigin icon_request_origin;
   };
 
-  // Called when the favicon data is missing to perform additional checks to
-  // locate the resource.
-  // |request| contains information for the failed request.
-  // Returns true if the missing resource is found.
-  virtual bool HandleMissingResource(const IconRequest& request);
-
   // Exposed for testing.
   virtual ui::NativeTheme* GetNativeTheme();
   virtual base::RefCountedMemory* LoadIconBytes(const IconRequest& request,
@@ -126,6 +121,7 @@
   void SendDefaultResponse(const IconRequest& request);
 
   base::CancelableTaskTracker cancelable_task_tracker_;
+  favicon::FaviconRequestHandler favicon_request_handler_;
 
   DISALLOW_COPY_AND_ASSIGN(FaviconSource);
 };
diff --git a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc
index 106d5116..ad7d7c6 100644
--- a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc
+++ b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler.cc
@@ -190,8 +190,7 @@
 void InterventionsInternalsPageHandler::OnLastObserverRemove() {
   // Reset the status of ignoring PreviewsBlackList decisions to default value.
   previews_ui_service_->SetIgnorePreviewsBlacklistDecision(
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          previews::switches::kIgnorePreviewsBlacklist));
+      previews::switches::ShouldIgnorePreviewsBlacklist());
 }
 
 void InterventionsInternalsPageHandler::OnIgnoreBlacklistDecisionStatusChanged(
diff --git a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
index e308815f..53e7db1 100644
--- a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
@@ -915,8 +915,7 @@
 
 TEST_F(InterventionsInternalsPageHandlerTest,
        IgnoreBlacklistReversedOnLastObserverRemovedCalled) {
-  ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch(
-      previews::switches::kIgnorePreviewsBlacklist));
+  ASSERT_FALSE(previews::switches::ShouldIgnorePreviewsBlacklist());
   page_handler_->OnLastObserverRemove();
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(page_->blacklist_ignored());
@@ -927,8 +926,7 @@
   base::test::ScopedCommandLine scoped_command_line;
   base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
   command_line->AppendSwitch(previews::switches::kIgnorePreviewsBlacklist);
-  ASSERT_TRUE(base::CommandLine::ForCurrentProcess()->HasSwitch(
-      previews::switches::kIgnorePreviewsBlacklist));
+  ASSERT_TRUE(previews::switches::ShouldIgnorePreviewsBlacklist());
   page_handler_->OnLastObserverRemove();
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(page_->blacklist_ignored());
diff --git a/chrome/browser/ui/webui/policy_ui_handler.cc b/chrome/browser/ui/webui/policy_ui_handler.cc
index 21ef975b..9d9f45a 100644
--- a/chrome/browser/ui/webui/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy_ui_handler.cc
@@ -67,7 +67,6 @@
 #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h"
 #include "components/user_manager/user_manager.h"
 #else
 #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
@@ -679,11 +678,9 @@
           ? connector->GetDeviceLocalAccountPolicyService()
           : nullptr;
   policy::UserCloudPolicyManagerChromeOS* user_cloud_policy =
-      policy::UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
   policy::ActiveDirectoryPolicyManager* active_directory_policy =
-      policy::UserPolicyManagerFactoryChromeOS::
-          GetActiveDirectoryPolicyManagerForProfile(profile);
+      profile->GetActiveDirectoryPolicyManager();
   if (local_account_service) {
     user_status_provider_ =
         std::make_unique<DeviceLocalAccountPolicyStatusProvider>(
@@ -919,8 +916,7 @@
           ->GetDeviceCloudPolicyManager();
   Profile* const profile = Profile::FromWebUI(web_ui());
   policy::CloudPolicyManager* const user_manager =
-      policy::UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile(
-          profile);
+      profile->GetUserCloudPolicyManagerChromeOS();
 
   // Fetch both device and user remote commands.
   for (policy::CloudPolicyManager* manager : {device_manager, user_manager}) {
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
index ccc6c46..73119198 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -20,7 +20,6 @@
 #include "chrome/browser/ui/webui/print_preview/print_preview_utils.h"
 #include "components/cloud_devices/common/cloud_device_description.h"
 #include "components/cloud_devices/common/printer_description.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "extensions/browser/api/device_permissions_manager.h"
 #include "extensions/browser/api/printer_provider/printer_provider_api.h"
 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h"
@@ -34,6 +33,7 @@
 #include "extensions/common/value_builder.h"
 #include "printing/print_job_constants.h"
 #include "printing/pwg_raster_settings.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 using extensions::DevicePermissionsManager;
 using extensions::DictionaryBuilder;
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
index ae0c900..c70df91 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
@@ -28,8 +28,6 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/version_info/version_info.h"
 #include "content/public/test/test_utils.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "extensions/browser/api/device_permissions_manager.h"
 #include "extensions/browser/api/printer_provider/printer_provider_api.h"
 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h"
@@ -41,6 +39,8 @@
 #include "printing/print_job_constants.h"
 #include "printing/pwg_raster_settings.h"
 #include "printing/units.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/size.h"
 
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 4c3a8dd..7d42eca7 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -281,6 +281,8 @@
 const char kIsHeaderFooterManaged[] = "isHeaderFooterManaged";
 // Name of a dictionary field holding the cloud print URL.
 const char kCloudPrintURL[] = "cloudPrintURL";
+// Name of a dictionary field holding the signed in user accounts.
+const char kUserAccounts[] = "userAccounts";
 
 // Get the print job settings dictionary from |json_str|.
 // Returns |base::Value()| on failure.
@@ -958,6 +960,18 @@
                                      weak_factory_.GetWeakPtr(), callback_id));
 }
 
+void PrintPreviewHandler::GetUserAccountList(base::Value* settings) {
+  base::Value account_list(base::Value::Type::LIST);
+  if (identity_manager_) {
+    const std::vector<gaia::ListedAccount>& accounts =
+        identity_manager_->GetAccountsInCookieJar().signed_in_accounts;
+    for (const gaia::ListedAccount& account : accounts) {
+      account_list.GetList().emplace_back(account.email);
+    }
+  }
+  settings->SetKey(kUserAccounts, std::move(account_list));
+}
+
 void PrintPreviewHandler::SendInitialSettings(
     const std::string& callback_id,
     const std::string& default_printer) {
@@ -1010,6 +1024,10 @@
   }
 
   GetNumberFormatAndMeasurementSystem(&initial_settings);
+  if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled)) {
+    GetUserAccountList(&initial_settings);
+  }
+
   ResolveJavascriptCallback(base::Value(callback_id), initial_settings);
 }
 
@@ -1313,17 +1331,21 @@
 void PrintPreviewHandler::RegisterForGaiaCookieChanges() {
   DCHECK(!identity_manager_);
   Profile* profile = Profile::FromWebUI(web_ui());
+  identity_manager_ = IdentityManagerFactory::GetForProfile(profile);
   if (AccountConsistencyModeManager::IsMirrorEnabledForProfile(profile)) {
-    identity_manager_ = IdentityManagerFactory::GetForProfile(profile);
     identity_manager_->AddObserver(this);
   }
 }
 
 void PrintPreviewHandler::UnregisterForGaiaCookieChanges() {
-  if (identity_manager_) {
+  if (!identity_manager_)
+    return;
+
+  Profile* profile = Profile::FromWebUI(web_ui());
+  if (AccountConsistencyModeManager::IsMirrorEnabledForProfile(profile)) {
     identity_manager_->RemoveObserver(this);
-    identity_manager_ = nullptr;
   }
+  identity_manager_ = nullptr;
 }
 
 void PrintPreviewHandler::BadMessageReceived() {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
index 8467e7ba..bd85f40 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -279,6 +279,9 @@
   // Populates |settings| according to the current locale.
   void GetNumberFormatAndMeasurementSystem(base::Value* settings);
 
+  // Populates |settings| with the list of logged in accounts.
+  void GetUserAccountList(base::Value* settings);
+
   PdfPrinterHandler* GetPdfPrinterHandler();
 
   // Called when printers are detected.
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index 36248a3..e065c38 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -372,6 +372,8 @@
 
     ASSERT_TRUE(
         settings->FindKeyOfType("cloudPrintURL", base::Value::Type::STRING));
+    ASSERT_TRUE(
+        settings->FindKeyOfType("userAccounts", base::Value::Type::LIST));
   }
 
   IPC::TestSink& initiator_sink() {
diff --git a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
index de13b59..16074ee8 100644
--- a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
@@ -44,11 +44,6 @@
       base::BindRepeating(&KerberosAccountsHandler::HandleAddKerberosAccount,
                           weak_factory_.GetWeakPtr()));
   web_ui()->RegisterMessageCallback(
-      "reauthenticateKerberosAccount",
-      base::BindRepeating(
-          &KerberosAccountsHandler::HandleReauthenticateKerberosAccount,
-          weak_factory_.GetWeakPtr()));
-  web_ui()->RegisterMessageCallback(
       "removeKerberosAccount",
       base::BindRepeating(&KerberosAccountsHandler::HandleRemoveKerberosAccount,
                           weak_factory_.GetWeakPtr()));
@@ -100,23 +95,28 @@
   //   - Prevent account changes when Kerberos is disabled.
   //   - Remove all accounts when Kerberos is disabled.
 
-  // TODO(ljusten): Call KerberosAddAccountDialog::Show() instead when that's
-  // implemented.
+  CHECK_EQ(3U, args->GetSize());
 
-  static int count = 0;
+  std::string callback_id;
+  CHECK(args->GetString(0, &callback_id));
+
+  std::string principal_name;
+  CHECK(args->GetString(1, &principal_name));
+
+  std::string password;
+  CHECK(args->GetString(2, &password));
+
   KerberosCredentialsManager::Get().AddAccountAndAuthenticate(
-      base::StringPrintf("user%i@realm", ++count), "password",
-      EmptyResultCallback());
+      std::move(principal_name), password,
+      base::BindOnce(&KerberosAccountsHandler::OnAddAccountAndAuthenticate,
+                     weak_factory_.GetWeakPtr(), callback_id));
 }
 
-void KerberosAccountsHandler::HandleReauthenticateKerberosAccount(
-    const base::ListValue* args) {
-  AllowJavascript();
-
-  CHECK(!args->GetList().empty());
-
-  // TODO(ljusten): Add KerberosAddAccountDialog::Show(principal_name) when
-  // that's implemented.
+void KerberosAccountsHandler::OnAddAccountAndAuthenticate(
+    const std::string& callback_id,
+    kerberos::ErrorType error) {
+  ResolveJavascriptCallback(base::Value(callback_id),
+                            base::Value(static_cast<int>(error)));
 }
 
 void KerberosAccountsHandler::HandleRemoveKerberosAccount(
diff --git a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h
index 16316ac..c15457f 100644
--- a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h
@@ -44,13 +44,14 @@
   // WebUI "addKerberosAccount" message callback.
   void HandleAddKerberosAccount(const base::ListValue* args);
 
-  // WebUI "reauthenticateKerberosAccount" message callback.
-  void HandleReauthenticateKerberosAccount(const base::ListValue* args);
+  // Callback for the credential manager's AddAccountAndAuthenticate method.
+  void OnAddAccountAndAuthenticate(const std::string& callback_id,
+                                   kerberos::ErrorType error);
 
   // WebUI "removeKerberosAccount" message callback.
   void HandleRemoveKerberosAccount(const base::ListValue* args);
 
-  // Callback for the Kerberos daemon's ListAccounts D-Bus method.
+  // Callback for the credential manager's ListAccounts method.
   void OnListAccounts(base::Value callback_id,
                       const kerberos::ListAccountsResponse& response);
 
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index dd8d0a6f..51c3984 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1699,6 +1699,11 @@
     {"kerberosAccountsSignedOut", IDS_SETTINGS_KERBEROS_ACCOUNTS_SIGNED_OUT},
     {"kerberosAccountsReauthenticationLabel",
      IDS_SETTINGS_KERBEROS_ACCOUNTS_REAUTHENTICATION_LABEL},
+    {"addKerberosAccount", IDS_SETTINGS_ADD_KERBEROS_ACCOUNT},
+    {"kerberosUsername", IDS_SETTINGS_KERBEROS_USERNAME},
+    {"kerberosPassword", IDS_SETTINGS_KERBEROS_PASSWORD},
+    {"kerberosGeneralErrorMessage",
+     IDS_SETTINGS_KERBEROS_GENERAL_ERROR_MESSAGE},
     {"lockScreenAddFingerprint",
      IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ADD_FINGERPRINT_BUTTON},
     {"lockScreenChangePinButton",
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index 169e56c..d6ac776 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -46,10 +46,10 @@
 #include "content/public/browser/web_ui_data_source.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_web_ui.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension_builder.h"
 #include "ppapi/buildflags/buildflags.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/text/bytes_formatting.h"
 
diff --git a/chrome/browser/ui/webui/site_settings_helper_unittest.cc b/chrome/browser/ui/webui/site_settings_helper_unittest.cc
index 3eba406e..0a9cddf2 100644
--- a/chrome/browser/ui/webui/site_settings_helper_unittest.cc
+++ b/chrome/browser/ui/webui/site_settings_helper_unittest.cc
@@ -21,8 +21,8 @@
 #include "components/content_settings/core/test/content_settings_test_utils.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
 #include "extensions/browser/extension_registry.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
diff --git a/chrome/browser/ui/webui/usb_internals/BUILD.gn b/chrome/browser/ui/webui/usb_internals/BUILD.gn
index ed33e76..d193360f 100644
--- a/chrome/browser/ui/webui/usb_internals/BUILD.gn
+++ b/chrome/browser/ui/webui/usb_internals/BUILD.gn
@@ -10,7 +10,7 @@
   ]
 
   deps = [
-    "//device/usb/public/mojom",
-    "//device/usb/public/mojom:test",
+    "//services/device/public/mojom:usb",
+    "//services/device/public/mojom:usb_test",
   ]
 }
diff --git a/chrome/browser/ui/webui/usb_internals/usb_internals.mojom b/chrome/browser/ui/webui/usb_internals/usb_internals.mojom
index 4066228..88b50f7 100644
--- a/chrome/browser/ui/webui/usb_internals/usb_internals.mojom
+++ b/chrome/browser/ui/webui/usb_internals/usb_internals.mojom
@@ -4,8 +4,8 @@
 
 module mojom;
 
-import "device/usb/public/mojom/device_manager.mojom";
-import "device/usb/public/mojom/device_manager_test.mojom";
+import "services/device/public/mojom/usb_manager.mojom";
+import "services/device/public/mojom/usb_manager_test.mojom";
 
 interface UsbInternalsPageHandler {
   // Bind the UsbDeviceManager interface to get all devices that connected.
diff --git a/chrome/browser/ui/webui/usb_internals/usb_internals_page_handler.h b/chrome/browser/ui/webui/usb_internals/usb_internals_page_handler.h
index b340c46c..5530f76 100644
--- a/chrome/browser/ui/webui/usb_internals/usb_internals_page_handler.h
+++ b/chrome/browser/ui/webui/usb_internals/usb_internals_page_handler.h
@@ -7,9 +7,9 @@
 
 #include "base/macros.h"
 #include "chrome/browser/ui/webui/usb_internals/usb_internals.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/public/mojom/device_manager_test.mojom.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager_test.mojom.h"
 
 class UsbInternalsPageHandler : public mojom::UsbInternalsPageHandler {
  public:
diff --git a/chrome/browser/ui/webui/usb_internals/usb_internals_ui.cc b/chrome/browser/ui/webui/usb_internals/usb_internals_ui.cc
index b3587eb..abd87cd 100644
--- a/chrome/browser/ui/webui/usb_internals/usb_internals_ui.cc
+++ b/chrome/browser/ui/webui/usb_internals/usb_internals_ui.cc
@@ -24,14 +24,15 @@
   source->AddResourcePath("descriptor_panel.js",
                           IDR_USB_INTERNALS_DESCRIPTOR_PANEL_JS);
   source->AddResourcePath("devices_page.js", IDR_USB_INTERNALS_DEVICES_PAGE_JS);
-  source->AddResourcePath("device.mojom-lite.js", IDR_USB_DEVICE_MOJOM_LITE_JS);
-  source->AddResourcePath("device_enumeration_options.mojom-lite.js",
-                          IDR_USB_DEVICE_ENUMERATION_OPTIONS_MOJOM_LITE_JS);
-  source->AddResourcePath("device_manager.mojom-lite.js",
+  source->AddResourcePath("usb_device.mojom-lite.js",
+                          IDR_USB_DEVICE_MOJOM_LITE_JS);
+  source->AddResourcePath("usb_enumeration_options.mojom-lite.js",
+                          IDR_USB_ENUMERATION_OPTIONS_MOJOM_LITE_JS);
+  source->AddResourcePath("usb_manager.mojom-lite.js",
                           IDR_USB_DEVICE_MANAGER_MOJOM_LITE_JS);
-  source->AddResourcePath("device_manager_client.mojom-lite.js",
+  source->AddResourcePath("usb_manager_client.mojom-lite.js",
                           IDR_USB_DEVICE_MANAGER_CLIENT_MOJOM_LITE_JS);
-  source->AddResourcePath("device_manager_test.mojom-lite.js",
+  source->AddResourcePath("usb_manager_test.mojom-lite.js",
                           IDR_USB_DEVICE_MANAGER_TEST_MOJOM_LITE_JS);
 
   source->SetDefaultResource(IDR_USB_INTERNALS_HTML);
diff --git a/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.cc b/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.cc
index f6fa732c..ac0f6b8 100644
--- a/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.cc
+++ b/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/metrics/histogram_macros.h"
 #include "chrome/browser/ui/tab_modal_confirm_dialog.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -40,14 +41,47 @@
 
 void XrSessionRequestConsentDialogDelegate::OnAccepted() {
   std::move(response_callback_).Run(true);
+  LogUserAction(ConsentDialogAction::kUserAllowed);
+  LogConsentFlowDurationWhenConsentGranted();
 }
 
 void XrSessionRequestConsentDialogDelegate::OnCanceled() {
   std::move(response_callback_).Run(false);
+  LogUserAction(ConsentDialogAction::kUserDenied);
+  LogConsentFlowDurationWhenConsentNotGranted();
 }
 
 void XrSessionRequestConsentDialogDelegate::OnClosed() {
   std::move(response_callback_).Run(false);
+  LogUserAction(ConsentDialogAction::kUserAbortedConsentFlow);
+  LogConsentFlowDurationWhenUserAborted();
+}
+
+void XrSessionRequestConsentDialogDelegate::OnShowDialog() {
+  dialog_presented_at_ = base::TimeTicks::Now();
+}
+
+void XrSessionRequestConsentDialogDelegate::LogUserAction(
+    ConsentDialogAction action) {
+  UMA_HISTOGRAM_ENUMERATION("XR.WebXR.ConsentFlow", action);
+}
+
+void XrSessionRequestConsentDialogDelegate::
+    LogConsentFlowDurationWhenConsentGranted() {
+  UMA_HISTOGRAM_MEDIUM_TIMES("XR.WebXR.ConsentFlowDuration.ConsentGranted",
+                             base::TimeTicks::Now() - dialog_presented_at_);
+}
+
+void XrSessionRequestConsentDialogDelegate::
+    LogConsentFlowDurationWhenConsentNotGranted() {
+  UMA_HISTOGRAM_MEDIUM_TIMES("XR.WebXR.ConsentFlowDuration.ConsentNotGranted",
+                             base::TimeTicks::Now() - dialog_presented_at_);
+}
+
+void XrSessionRequestConsentDialogDelegate::
+    LogConsentFlowDurationWhenUserAborted() {
+  UMA_HISTOGRAM_MEDIUM_TIMES("XR.WebXR.ConsentFlowDuration.ConsentFlowAborted",
+                             base::TimeTicks::Now() - dialog_presented_at_);
 }
 
 }  // namespace vr
diff --git a/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.h b/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.h
index 5a2000b..fc9f981 100644
--- a/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.h
+++ b/chrome/browser/ui/xr/xr_session_request_consent_dialog_delegate.h
@@ -30,14 +30,41 @@
   base::string16 GetAcceptButtonTitle() override;
   base::string16 GetCancelButtonTitle() override;
 
+  // Metrics helpers
+  void OnShowDialog();
+
  private:
+  // These values are persisted to logs. Entries should not be renumbered and
+  // numeric values should never be reused. Adding a value at the end is okay.
+  enum class ConsentDialogAction : int {
+    // The user gave permission to enter an immersive presentation.
+    kUserAllowed = 0,
+    // The user denied permission to enter an immersive presentation.
+    kUserDenied = 1,
+    // The user aborted the consent flow by clicking on the permission
+    // dialog's 'X' system button.
+    kUserAbortedConsentFlow = 2,
+    // To insert a new enum, assign the next numeric value to it, and replace
+    // the value of of this enum with the value of the added enum.
+    kMaxValue = kUserAbortedConsentFlow,
+  };
+
   // TabModalConfirmDialogDelegate:
   void OnAccepted() override;
   void OnCanceled() override;
   void OnClosed() override;
 
+  // Metrics helpers
+  void LogUserAction(ConsentDialogAction action);
+  void LogConsentFlowDurationWhenConsentGranted();
+  void LogConsentFlowDurationWhenConsentNotGranted();
+  void LogConsentFlowDurationWhenUserAborted();
+
   base::OnceCallback<void(bool)> response_callback_;
 
+  // Metrics related
+  base::TimeTicks dialog_presented_at_;
+
   DISALLOW_COPY_AND_ASSIGN(XrSessionRequestConsentDialogDelegate);
 };
 
diff --git a/chrome/browser/usb/usb_blocklist.cc b/chrome/browser/usb/usb_blocklist.cc
index 50094b4..fec7f81 100644
--- a/chrome/browser/usb/usb_blocklist.cc
+++ b/chrome/browser/usb/usb_blocklist.cc
@@ -11,7 +11,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "components/variations/variations_associated_data.h"
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace {
 
diff --git a/chrome/browser/usb/usb_browsertest.cc b/chrome/browser/usb/usb_browsertest.cc
index 3559ca0..74974e50 100644
--- a/chrome/browser/usb/usb_browsertest.cc
+++ b/chrome/browser/usb/usb_browsertest.cc
@@ -23,9 +23,9 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 
 namespace blink {
diff --git a/chrome/browser/usb/usb_chooser_context.cc b/chrome/browser/usb/usb_chooser_context.cc
index 44f2e29d..16d41f2 100644
--- a/chrome/browser/usb/usb_chooser_context.cc
+++ b/chrome/browser/usb/usb_chooser_context.cc
@@ -20,9 +20,9 @@
 #include "chrome/grit/generated_resources.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "content/public/common/service_manager_connection.h"
-#include "device/usb/public/cpp/usb_ids.h"
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/cpp/usb/usb_ids.h"
 #include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/chrome/browser/usb/usb_chooser_context.h b/chrome/browser/usb/usb_chooser_context.h
index 91b2663..17aae09a 100644
--- a/chrome/browser/usb/usb_chooser_context.h
+++ b/chrome/browser/usb/usb_chooser_context.h
@@ -19,9 +19,9 @@
 #include "build/build_config.h"
 #include "chrome/browser/permissions/chooser_context_base.h"
 #include "chrome/browser/usb/usb_policy_allowed_devices.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
 #include "url/origin.h"
 
 class UsbChooserContext : public ChooserContextBase,
diff --git a/chrome/browser/usb/usb_chooser_context_mock_device_observer.cc b/chrome/browser/usb/usb_chooser_context_mock_device_observer.cc
index 5c63ab3..2acf4a7 100644
--- a/chrome/browser/usb/usb_chooser_context_mock_device_observer.cc
+++ b/chrome/browser/usb/usb_chooser_context_mock_device_observer.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/usb/usb_chooser_context_mock_device_observer.h"
 
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 MockDeviceObserver::MockDeviceObserver() {}
 
diff --git a/chrome/browser/usb/usb_chooser_context_mock_device_observer.h b/chrome/browser/usb/usb_chooser_context_mock_device_observer.h
index 7aaf9a7..b7c10b4 100644
--- a/chrome/browser/usb/usb_chooser_context_mock_device_observer.h
+++ b/chrome/browser/usb/usb_chooser_context_mock_device_observer.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_USB_USB_CHOOSER_CONTEXT_MOCK_DEVICE_OBSERVER_H_
 
 #include "chrome/browser/usb/usb_chooser_context.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 class MockDeviceObserver : public UsbChooserContext::DeviceObserver {
diff --git a/chrome/browser/usb/usb_chooser_context_unittest.cc b/chrome/browser/usb/usb_chooser_context_unittest.cc
index bbe5465..95c8e89 100644
--- a/chrome/browser/usb/usb_chooser_context_unittest.cc
+++ b/chrome/browser/usb/usb_chooser_context_unittest.cc
@@ -19,9 +19,9 @@
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/chrome/browser/usb/usb_chooser_controller.cc b/chrome/browser/usb/usb_chooser_controller.cc
index 486ccdd8..d15ef93 100644
--- a/chrome/browser/usb/usb_chooser_controller.cc
+++ b/chrome/browser/usb/usb_chooser_controller.cc
@@ -20,13 +20,13 @@
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
 #if !defined(OS_ANDROID)
-#include "device/usb/public/cpp/usb_ids.h"
+#include "services/device/public/cpp/usb/usb_ids.h"
 #endif  // !defined(OS_ANDROID)
 
 using content::RenderFrameHost;
diff --git a/chrome/browser/usb/usb_chooser_controller.h b/chrome/browser/usb/usb_chooser_controller.h
index 29dd36b..16c51fd 100644
--- a/chrome/browser/usb/usb_chooser_controller.h
+++ b/chrome/browser/usb/usb_chooser_controller.h
@@ -16,7 +16,7 @@
 #include "base/scoped_observer.h"
 #include "chrome/browser/chooser_controller/chooser_controller.h"
 #include "chrome/browser/usb/usb_chooser_context.h"
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 #include "url/origin.h"
 
diff --git a/chrome/browser/usb/usb_chooser_controller_unittest.cc b/chrome/browser/usb/usb_chooser_controller_unittest.cc
index dfa6dc12..8249e6f0 100644
--- a/chrome/browser/usb/usb_chooser_controller_unittest.cc
+++ b/chrome/browser/usb/usb_chooser_controller_unittest.cc
@@ -16,9 +16,9 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/web_contents_tester.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/usb/usb_policy_allowed_devices.cc b/chrome/browser/usb/usb_policy_allowed_devices.cc
index 4734493..bcc26f0 100644
--- a/chrome/browser/usb/usb_policy_allowed_devices.cc
+++ b/chrome/browser/usb/usb_policy_allowed_devices.cc
@@ -12,8 +12,8 @@
 #include "base/values.h"
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/prefs/pref_service.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "url/gurl.h"
 
 namespace {
diff --git a/chrome/browser/usb/usb_policy_allowed_devices_unittest.cc b/chrome/browser/usb/usb_policy_allowed_devices_unittest.cc
index 68ac288..83d890d 100644
--- a/chrome/browser/usb/usb_policy_allowed_devices_unittest.cc
+++ b/chrome/browser/usb/usb_policy_allowed_devices_unittest.cc
@@ -12,8 +12,8 @@
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 #include "url/origin.h"
diff --git a/chrome/browser/usb/web_usb_chooser.cc b/chrome/browser/usb/web_usb_chooser.cc
index 9366a17..f5fe48e4 100644
--- a/chrome/browser/usb/web_usb_chooser.cc
+++ b/chrome/browser/usb/web_usb_chooser.cc
@@ -13,7 +13,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 
 WebUsbChooser::WebUsbChooser(content::RenderFrameHost* render_frame_host)
     : render_frame_host_(render_frame_host) {
diff --git a/chrome/browser/usb/web_usb_detector.cc b/chrome/browser/usb/web_usb_detector.cc
index f7aa705..b4b2f0e 100644
--- a/chrome/browser/usb/web_usb_detector.cc
+++ b/chrome/browser/usb/web_usb_detector.cc
@@ -29,8 +29,8 @@
 #include "content/public/common/origin_util.h"
 #include "content/public/common/service_manager_connection.h"
 #include "device/base/features.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/page_transition_types.h"
diff --git a/chrome/browser/usb/web_usb_detector.h b/chrome/browser/usb/web_usb_detector.h
index b53a780..2396ff7 100644
--- a/chrome/browser/usb/web_usb_detector.h
+++ b/chrome/browser/usb/web_usb_detector.h
@@ -8,9 +8,9 @@
 #include <map>
 
 #include "base/macros.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
 #include "url/gurl.h"
 
 class WebUsbDetector : public device::mojom::UsbDeviceManagerClient {
diff --git a/chrome/browser/usb/web_usb_detector_unittest.cc b/chrome/browser/usb/web_usb_detector_unittest.cc
index 7c16af6..909b655 100644
--- a/chrome/browser/usb/web_usb_detector_unittest.cc
+++ b/chrome/browser/usb/web_usb_detector_unittest.cc
@@ -21,11 +21,11 @@
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
 #include "net/base/network_change_notifier.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/message_center/public/cpp/notification.h"
 #include "ui/message_center/public/cpp/notification_delegate.h"
diff --git a/chrome/browser/usb/web_usb_service_impl.cc b/chrome/browser/usb/web_usb_service_impl.cc
index 758f00205..bceb5ea 100644
--- a/chrome/browser/usb/web_usb_service_impl.cc
+++ b/chrome/browser/usb/web_usb_service_impl.cc
@@ -14,8 +14,8 @@
 #include "chrome/browser/usb/usb_chooser_context_factory.h"
 #include "chrome/browser/usb/usb_tab_helper.h"
 #include "content/public/browser/browser_thread.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
 #include "media/mojo/interfaces/remoting_common.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 
 WebUsbServiceImpl::WebUsbServiceImpl(
     content::RenderFrameHost* render_frame_host,
diff --git a/chrome/browser/usb/web_usb_service_impl.h b/chrome/browser/usb/web_usb_service_impl.h
index 9865128..e3761fc 100644
--- a/chrome/browser/usb/web_usb_service_impl.h
+++ b/chrome/browser/usb/web_usb_service_impl.h
@@ -16,9 +16,9 @@
 #include "base/scoped_observer.h"
 #include "chrome/browser/usb/usb_chooser_context.h"
 #include "chrome/browser/usb/web_usb_chooser.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 #include "url/origin.h"
 
diff --git a/chrome/browser/usb/web_usb_service_impl_unittest.cc b/chrome/browser/usb/web_usb_service_impl_unittest.cc
index d3480e1..7edbc7d 100644
--- a/chrome/browser/usb/web_usb_service_impl_unittest.cc
+++ b/chrome/browser/usb/web_usb_service_impl_unittest.cc
@@ -19,10 +19,10 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/web_contents_tester.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/vr/service/xr_session_request_consent_manager_impl.cc b/chrome/browser/vr/service/xr_session_request_consent_manager_impl.cc
index 71680f6..c194d9e5 100644
--- a/chrome/browser/vr/service/xr_session_request_consent_manager_impl.cc
+++ b/chrome/browser/vr/service/xr_session_request_consent_manager_impl.cc
@@ -22,10 +22,10 @@
 XRSessionRequestConsentManagerImpl::ShowDialogAndGetConsent(
     content::WebContents* web_contents,
     base::OnceCallback<void(bool)> response_callback) {
-  return TabModalConfirmDialog::Create(
-      new XrSessionRequestConsentDialogDelegate(web_contents,
-                                                std::move(response_callback)),
-      web_contents);
+  auto* delegate = new XrSessionRequestConsentDialogDelegate(
+      web_contents, std::move(response_callback));
+  delegate->OnShowDialog();
+  return TabModalConfirmDialog::Create(delegate, web_contents);
 }
 
 }  // namespace vr
diff --git a/chrome/browser/web_applications/components/install_finalizer.h b/chrome/browser/web_applications/components/install_finalizer.h
index 8235135..376ff207 100644
--- a/chrome/browser/web_applications/components/install_finalizer.h
+++ b/chrome/browser/web_applications/components/install_finalizer.h
@@ -33,13 +33,20 @@
   using CreateOsShortcutsCallback =
       base::OnceCallback<void(bool shortcuts_created)>;
 
+  enum class Source {
+    kUser,
+    kDefaultInstalled,
+    kPolicyInstalled,
+    kSystemInstalled,
+  };
+
   struct FinalizeOptions {
     // If |force_launch_container| defined as non-kDefault then the installed
     // app will launch in |force_launch_container|.
     LaunchContainer force_launch_container = LaunchContainer::kDefault;
+    Source source = Source::kUser;
     bool error_on_unsupported_requirements = false;
     bool locally_installed = true;
-    bool policy_installed = false;
     bool no_network_install = false;
   };
 
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
index 5c1875f8..47ff5910 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer.cc
@@ -112,8 +112,28 @@
       OnExtensionInstalled, web_app_info.app_url, launch_type,
       options.locally_installed, std::move(callback), crx_installer));
 
-  if (options.policy_installed)
-    crx_installer->set_install_source(Manifest::EXTERNAL_POLICY_DOWNLOAD);
+  switch (options.source) {
+    case web_app::InstallFinalizer::Source::kDefaultInstalled:
+      crx_installer->set_install_source(Manifest::EXTERNAL_PREF_DOWNLOAD);
+      // CrxInstaller::InstallWebApp will OR the creation flags with
+      // FROM_BOOKMARK.
+      crx_installer->set_creation_flags(Extension::WAS_INSTALLED_BY_DEFAULT);
+      break;
+    case web_app::InstallFinalizer::Source::kPolicyInstalled:
+      crx_installer->set_install_source(Manifest::EXTERNAL_POLICY_DOWNLOAD);
+      break;
+    case web_app::InstallFinalizer::Source::kSystemInstalled:
+      // System Apps are considered EXTERNAL_COMPONENT as they are downloaded
+      // from the WebUI they point to. COMPONENT seems like the more correct
+      // value, but usages (icon loading, filesystem cleanup), are tightly
+      // coupled to this value, making it unsuitable.
+      crx_installer->set_install_source(Manifest::EXTERNAL_COMPONENT);
+      // InstallWebApp will OR the creation flags with FROM_BOOKMARK.
+      crx_installer->set_creation_flags(Extension::WAS_INSTALLED_BY_DEFAULT);
+      break;
+    case web_app::InstallFinalizer::Source::kUser:
+      break;
+  }
 
   if (options.no_network_install) {
     // Ensure that this app is not synced. A no-network install means we have
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc
index f2644fe..e81c4f4 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_install_finalizer_unittest.cc
@@ -100,7 +100,7 @@
     info->title = base::ASCIIToUTF16(kWebAppTitle);
 
     web_app::InstallFinalizer::FinalizeOptions options;
-    options.policy_installed = true;
+    options.source = web_app::InstallFinalizer::Source::kPolicyInstalled;
 
     web_app::AppId app_id;
     base::RunLoop run_loop;
@@ -252,7 +252,7 @@
   EXPECT_TRUE(callback2_called);
 }
 
-TEST_F(BookmarkAppInstallFinalizerTest, PolicyInstallSucceeds) {
+TEST_F(BookmarkAppInstallFinalizerTest, DefaultInstalledSucceeds) {
   BookmarkAppInstallFinalizer installer(profile());
 
   auto info = std::make_unique<WebApplicationInfo>();
@@ -260,7 +260,36 @@
   info->title = base::ASCIIToUTF16(kWebAppTitle);
 
   web_app::InstallFinalizer::FinalizeOptions options;
-  options.policy_installed = true;
+  options.source = web_app::InstallFinalizer::Source::kDefaultInstalled;
+
+  base::RunLoop run_loop;
+  installer.FinalizeInstall(
+      *info, options,
+      base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id,
+                                     web_app::InstallResultCode code) {
+        EXPECT_EQ(web_app::InstallResultCode::kSuccess, code);
+
+        auto* extension =
+            ExtensionRegistry::Get(profile())->GetInstalledExtension(
+                installed_app_id);
+        EXPECT_TRUE(Manifest::IsExternalLocation(extension->location()));
+        EXPECT_EQ(Manifest::EXTERNAL_PREF_DOWNLOAD, extension->location());
+        EXPECT_TRUE(extension->was_installed_by_default());
+
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+}
+
+TEST_F(BookmarkAppInstallFinalizerTest, PolicyInstalledSucceeds) {
+  BookmarkAppInstallFinalizer installer(profile());
+
+  auto info = std::make_unique<WebApplicationInfo>();
+  info->app_url = kWebAppUrl;
+  info->title = base::ASCIIToUTF16(kWebAppTitle);
+
+  web_app::InstallFinalizer::FinalizeOptions options;
+  options.source = web_app::InstallFinalizer::Source::kPolicyInstalled;
 
   base::RunLoop run_loop;
   installer.FinalizeInstall(
@@ -280,6 +309,35 @@
   run_loop.Run();
 }
 
+TEST_F(BookmarkAppInstallFinalizerTest, SystemInstalledSucceeds) {
+  BookmarkAppInstallFinalizer installer(profile());
+
+  auto info = std::make_unique<WebApplicationInfo>();
+  info->app_url = kWebAppUrl;
+  info->title = base::ASCIIToUTF16(kWebAppTitle);
+
+  web_app::InstallFinalizer::FinalizeOptions options;
+  options.source = web_app::InstallFinalizer::Source::kSystemInstalled;
+
+  base::RunLoop run_loop;
+  installer.FinalizeInstall(
+      *info, options,
+      base::BindLambdaForTesting([&](const web_app::AppId& installed_app_id,
+                                     web_app::InstallResultCode code) {
+        EXPECT_EQ(web_app::InstallResultCode::kSuccess, code);
+
+        auto* extension =
+            ExtensionRegistry::Get(profile())->GetInstalledExtension(
+                installed_app_id);
+        EXPECT_TRUE(Manifest::IsExternalLocation(extension->location()));
+        EXPECT_EQ(Manifest::EXTERNAL_COMPONENT, extension->location());
+        EXPECT_TRUE(extension->was_installed_by_default());
+
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+}
+
 TEST_F(BookmarkAppInstallFinalizerTest, NoNetworkInstallSucceeds) {
   BookmarkAppInstallFinalizer installer(profile());
 
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
index 519bd2e..3ed3b3a 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.cc
@@ -56,22 +56,38 @@
 
 BookmarkAppInstallationTask::~BookmarkAppInstallationTask() = default;
 
-void BookmarkAppInstallationTask::Install(content::WebContents* web_contents,
-                                          ResultCallback result_callback) {
+void BookmarkAppInstallationTask::Install(
+    content::WebContents* web_contents,
+    web_app::WebAppUrlLoader::Result load_url_result,
+    ResultCallback result_callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK_EQ(web_contents->GetBrowserContext(), profile_);
 
-  // If we are not re-installing a placeholder, then no need to uninstall
-  // anything.
-  if (!install_options_.reinstall_placeholder) {
-    ContinueWebAppInstall(web_contents, std::move(result_callback));
+  if (load_url_result == web_app::WebAppUrlLoader::Result::kUrlLoaded) {
+    // If we are not re-installing a placeholder, then no need to uninstall
+    // anything.
+    if (!install_options_.reinstall_placeholder) {
+      ContinueWebAppInstall(web_contents, std::move(result_callback));
+      return;
+    }
+    // Calling InstallWebAppWithOptions with the same URL used to install a
+    // placeholder won't necessarily replace the placeholder app, because the
+    // new app might be installed with a new AppId. To avoid this, always
+    // uninstall the placeholder app.
+    UninstallPlaceholderApp(web_contents, std::move(result_callback));
     return;
   }
-  // Calling InstallWebAppWithOptions with the same URL used to install a
-  // placeholder won't necessarily replace the placeholder app, because the new
-  // app might be installed with a new AppId. To avoid this, always uninstall
-  // the placeholder app.
-  UninstallPlaceholderApp(web_contents, std::move(result_callback));
+
+  if (install_options_.install_placeholder) {
+    InstallPlaceholder(std::move(result_callback));
+    return;
+  }
+
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(std::move(result_callback),
+                     Result(web_app::InstallResultCode::kFailedUnknownReason,
+                            base::nullopt)));
 }
 
 void BookmarkAppInstallationTask::UninstallPlaceholderApp(
@@ -154,7 +170,7 @@
   }
 
   web_app::InstallFinalizer::FinalizeOptions options;
-  options.policy_installed = true;
+  options.source = web_app::InstallFinalizer::Source::kPolicyInstalled;
 
   install_finalizer_->FinalizeInstall(
       web_app_info, options,
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.h b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.h
index d8848e44..b0553b4 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task.h
+++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task.h
@@ -15,6 +15,7 @@
 #include "chrome/browser/web_applications/components/externally_installed_web_app_prefs.h"
 #include "chrome/browser/web_applications/components/install_options.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_url_loader.h"
 
 class Profile;
 
@@ -64,14 +65,18 @@
 
   virtual ~BookmarkAppInstallationTask();
 
+  // Temporarily takes a |load_url_result| to decide if a placeholder app should
+  // be installed.
+  // TODO(ortuno): Remove once loading is done inside the task.
   virtual void Install(content::WebContents* web_contents,
+                       web_app::WebAppUrlLoader::Result load_url_result,
                        ResultCallback result_callback);
 
-  virtual void InstallPlaceholder(ResultCallback result_callback);
-
   const web_app::InstallOptions& install_options() { return install_options_; }
 
  private:
+  void InstallPlaceholder(ResultCallback result_callback);
+
   void UninstallPlaceholderApp(content::WebContents* web_contents,
                                ResultCallback result_callback);
   void OnPlaceholderUninstalled(content::WebContents* web_contents,
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
index 444150b9..cad492f0 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_installation_task_unittest.cc
@@ -370,7 +370,7 @@
 
   bool callback_called = false;
   task->Install(
-      web_contents(),
+      web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
       base::BindLambdaForTesting(
           [&](BookmarkAppInstallationTask::Result result) {
             base::Optional<web_app::AppId> id =
@@ -413,7 +413,7 @@
 
   bool callback_called = false;
   task->Install(
-      web_contents(),
+      web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
       base::BindLambdaForTesting(
           [&](BookmarkAppInstallationTask::Result result) {
             base::Optional<web_app::AppId> id =
@@ -448,7 +448,7 @@
       profile(), registrar(), install_finalizer(), std::move(install_options));
 
   bool callback_called = false;
-  task->Install(web_contents(),
+  task->Install(web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
                 base::BindLambdaForTesting(
                     [&](BookmarkAppInstallationTask::Result result) {
                       EXPECT_EQ(web_app::InstallResultCode::kSuccess,
@@ -477,7 +477,7 @@
       profile(), registrar(), install_finalizer(), std::move(install_options));
 
   bool callback_called = false;
-  task->Install(web_contents(),
+  task->Install(web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
                 base::BindLambdaForTesting(
                     [&](BookmarkAppInstallationTask::Result result) {
                       EXPECT_EQ(web_app::InstallResultCode::kSuccess,
@@ -509,7 +509,7 @@
       profile(), registrar(), install_finalizer(), std::move(install_options));
 
   bool callback_called = false;
-  task->Install(web_contents(),
+  task->Install(web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
                 base::BindLambdaForTesting(
                     [&](BookmarkAppInstallationTask::Result result) {
                       EXPECT_EQ(web_app::InstallResultCode::kSuccess,
@@ -538,7 +538,7 @@
       profile(), registrar(), install_finalizer(), std::move(install_options));
 
   bool callback_called = false;
-  task->Install(web_contents(),
+  task->Install(web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
                 base::BindLambdaForTesting(
                     [&](BookmarkAppInstallationTask::Result result) {
                       EXPECT_EQ(web_app::InstallResultCode::kSuccess,
@@ -565,7 +565,7 @@
       profile(), registrar(), install_finalizer(), std::move(install_options));
 
   bool callback_called = false;
-  task->Install(web_contents(),
+  task->Install(web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
                 base::BindLambdaForTesting(
                     [&](BookmarkAppInstallationTask::Result result) {
                       EXPECT_EQ(web_app::InstallResultCode::kSuccess,
@@ -592,7 +592,7 @@
       profile(), registrar(), install_finalizer(), std::move(install_options));
 
   bool callback_called = false;
-  task->Install(web_contents(),
+  task->Install(web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
                 base::BindLambdaForTesting(
                     [&](BookmarkAppInstallationTask::Result result) {
                       EXPECT_EQ(web_app::InstallResultCode::kSuccess,
@@ -618,7 +618,7 @@
       profile(), registrar(), install_finalizer(), std::move(install_options));
 
   bool callback_called = false;
-  task->Install(web_contents(),
+  task->Install(web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
                 base::BindLambdaForTesting(
                     [&](BookmarkAppInstallationTask::Result result) {
                       EXPECT_EQ(web_app::InstallResultCode::kSuccess,
@@ -638,6 +638,7 @@
 TEST_F(BookmarkAppInstallationTaskTest, InstallPlaceholder) {
   web_app::InstallOptions options(kWebAppUrl, web_app::LaunchContainer::kWindow,
                                   web_app::InstallSource::kExternalPolicy);
+  options.install_placeholder = true;
   auto task = std::make_unique<BookmarkAppInstallationTask>(
       profile(), registrar(), install_finalizer(), std::move(options));
   install_finalizer()->SetNextFinalizeInstallResult(
@@ -646,8 +647,10 @@
       install_finalizer()->GetAppIdForUrl(kWebAppUrl), true);
 
   base::RunLoop run_loop;
-  task->InstallPlaceholder(base::BindLambdaForTesting(
-      [&](BookmarkAppInstallationTask::Result result) {
+  task->Install(
+      web_contents(), web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded,
+      base::BindLambdaForTesting([&](BookmarkAppInstallationTask::Result
+                                         result) {
         EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
         EXPECT_TRUE(result.app_id.has_value());
 
@@ -655,8 +658,8 @@
 
         EXPECT_EQ(1u, install_finalizer()->num_create_os_shortcuts_calls());
         EXPECT_EQ(1u, install_finalizer()->finalize_options_list().size());
-        EXPECT_TRUE(
-            install_finalizer()->finalize_options_list()[0].policy_installed);
+        EXPECT_EQ(web_app::InstallFinalizer::Source::kPolicyInstalled,
+                  install_finalizer()->finalize_options_list()[0].source);
         const WebApplicationInfo& web_app_info =
             install_finalizer()->web_app_info_list().at(0);
 
@@ -673,6 +676,7 @@
 TEST_F(BookmarkAppInstallationTaskTest, InstallPlaceholderTwice) {
   web_app::InstallOptions options(kWebAppUrl, web_app::LaunchContainer::kWindow,
                                   web_app::InstallSource::kExternalPolicy);
+  options.install_placeholder = true;
   web_app::AppId placeholder_app_id;
 
   // Install a placeholder app.
@@ -685,14 +689,17 @@
         install_finalizer()->GetAppIdForUrl(kWebAppUrl), true);
 
     base::RunLoop run_loop;
-    task->InstallPlaceholder(base::BindLambdaForTesting(
-        [&](BookmarkAppInstallationTask::Result result) {
-          EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
-          placeholder_app_id = result.app_id.value();
+    task->Install(
+        web_contents(), web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded,
+        base::BindLambdaForTesting(
+            [&](BookmarkAppInstallationTask::Result result) {
+              EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
+              placeholder_app_id = result.app_id.value();
 
-          EXPECT_EQ(1u, install_finalizer()->finalize_options_list().size());
-          run_loop.Quit();
-        }));
+              EXPECT_EQ(1u,
+                        install_finalizer()->finalize_options_list().size());
+              run_loop.Quit();
+            }));
     run_loop.Run();
   }
 
@@ -700,22 +707,25 @@
   auto task = std::make_unique<BookmarkAppInstallationTask>(
       profile(), registrar(), install_finalizer(), options);
   base::RunLoop run_loop;
-  task->InstallPlaceholder(base::BindLambdaForTesting(
-      [&](BookmarkAppInstallationTask::Result result) {
-        EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
-        EXPECT_EQ(placeholder_app_id, result.app_id.value());
+  task->Install(
+      web_contents(), web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded,
+      base::BindLambdaForTesting(
+          [&](BookmarkAppInstallationTask::Result result) {
+            EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
+            EXPECT_EQ(placeholder_app_id, result.app_id.value());
 
-        // There shouldn't be a second call to the finalizer.
-        EXPECT_EQ(1u, install_finalizer()->finalize_options_list().size());
+            // There shouldn't be a second call to the finalizer.
+            EXPECT_EQ(1u, install_finalizer()->finalize_options_list().size());
 
-        run_loop.Quit();
-      }));
+            run_loop.Quit();
+          }));
   run_loop.Run();
 }
 
 TEST_F(BookmarkAppInstallationTaskTest, ReinstallPlaceholderSucceeds) {
   web_app::InstallOptions options(kWebAppUrl, web_app::LaunchContainer::kWindow,
                                   web_app::InstallSource::kExternalPolicy);
+  options.install_placeholder = true;
   web_app::AppId placeholder_app_id;
 
   // Install a placeholder app.
@@ -728,14 +738,17 @@
         install_finalizer()->GetAppIdForUrl(kWebAppUrl), true);
 
     base::RunLoop run_loop;
-    task->InstallPlaceholder(base::BindLambdaForTesting(
-        [&](BookmarkAppInstallationTask::Result result) {
-          EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
-          placeholder_app_id = result.app_id.value();
+    task->Install(
+        web_contents(), web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded,
+        base::BindLambdaForTesting(
+            [&](BookmarkAppInstallationTask::Result result) {
+              EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
+              placeholder_app_id = result.app_id.value();
 
-          EXPECT_EQ(1u, install_finalizer()->finalize_options_list().size());
-          run_loop.Quit();
-        }));
+              EXPECT_EQ(1u,
+                        install_finalizer()->finalize_options_list().size());
+              run_loop.Quit();
+            }));
     run_loop.Run();
   }
 
@@ -746,7 +759,7 @@
   install_finalizer()->SetNextUninstallExternalWebAppResult(kWebAppUrl, true);
   base::RunLoop run_loop;
   task->Install(
-      web_contents(),
+      web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
       base::BindLambdaForTesting(
           [&](BookmarkAppInstallationTask::Result result) {
             EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
@@ -770,6 +783,7 @@
 TEST_F(BookmarkAppInstallationTaskTest, ReinstallPlaceholderFails) {
   web_app::InstallOptions options(kWebAppUrl, web_app::LaunchContainer::kWindow,
                                   web_app::InstallSource::kExternalPolicy);
+  options.install_placeholder = true;
   web_app::AppId placeholder_app_id;
 
   // Install a placeholder app.
@@ -782,15 +796,18 @@
         install_finalizer()->GetAppIdForUrl(kWebAppUrl), true);
 
     base::RunLoop run_loop;
-    task->InstallPlaceholder(base::BindLambdaForTesting(
-        [&](BookmarkAppInstallationTask::Result result) {
-          EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
-          placeholder_app_id = result.app_id.value();
+    task->Install(
+        web_contents(), web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded,
+        base::BindLambdaForTesting(
+            [&](BookmarkAppInstallationTask::Result result) {
+              EXPECT_EQ(web_app::InstallResultCode::kSuccess, result.code);
+              placeholder_app_id = result.app_id.value();
 
-          EXPECT_EQ(1u, install_finalizer()->finalize_options_list().size());
+              EXPECT_EQ(1u,
+                        install_finalizer()->finalize_options_list().size());
 
-          run_loop.Quit();
-        }));
+              run_loop.Quit();
+            }));
     run_loop.Run();
   }
 
@@ -801,7 +818,7 @@
   install_finalizer()->SetNextUninstallExternalWebAppResult(kWebAppUrl, false);
   base::RunLoop run_loop;
   task->Install(
-      web_contents(),
+      web_contents(), web_app::WebAppUrlLoader::Result::kUrlLoaded,
       base::BindLambdaForTesting(
           [&](BookmarkAppInstallationTask::Result result) {
             EXPECT_EQ(web_app::InstallResultCode::kFailedUnknownReason,
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
index ddb3f1a..e6080ff 100644
--- a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
+++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
@@ -239,27 +239,10 @@
 
 void PendingBookmarkAppManager::OnUrlLoaded(
     web_app::WebAppUrlLoader::Result result) {
-  const auto& install_options =
-      current_task_and_callback_->task->install_options();
-
-  if (result == web_app::WebAppUrlLoader::Result::kUrlLoaded) {
-    current_task_and_callback_->task->Install(
-        web_contents_.get(),
-        base::BindOnce(&PendingBookmarkAppManager::OnInstalled,
-                       weak_ptr_factory_.GetWeakPtr()));
-    return;
-  }
-
-  // TODO(ortuno): Move this into BookmarkAppInstallationTask::Install() once
-  // loading the URL is part of Install().
-  if (install_options.install_placeholder) {
-    current_task_and_callback_->task->InstallPlaceholder(
-        base::BindOnce(&PendingBookmarkAppManager::OnInstalled,
-                       weak_ptr_factory_.GetWeakPtr()));
-    return;
-  }
-
-  CurrentInstallationFinished(base::nullopt);
+  current_task_and_callback_->task->Install(
+      web_contents_.get(), result,
+      base::BindOnce(&PendingBookmarkAppManager::OnInstalled,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void PendingBookmarkAppManager::OnInstalled(
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc
index 09749201..14b2f65 100644
--- a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc
+++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc
@@ -75,88 +75,110 @@
   return std::string("fake_app_id_for:") + url.spec();
 }
 
-class TestBookmarkAppInstallationTask : public BookmarkAppInstallationTask {
+class TestBookmarkAppInstallationTaskFactory {
  public:
-  TestBookmarkAppInstallationTask(Profile* profile,
-                                  web_app::TestAppRegistrar* registrar,
-                                  web_app::InstallFinalizer* install_finalizer,
-                                  web_app::InstallOptions install_options,
-                                  bool succeeds)
-      : BookmarkAppInstallationTask(profile,
-                                    registrar,
-                                    install_finalizer,
-                                    std::move(install_options)),
-        profile_(profile),
-        registrar_(registrar),
-        succeeds_(succeeds),
-        externally_installed_app_prefs_(profile_->GetPrefs()) {}
-  ~TestBookmarkAppInstallationTask() override = default;
-
-  void Install(content::WebContents* web_contents,
-               BookmarkAppInstallationTask::ResultCallback callback) override {
-    std::move(on_install_called_).Run();
-    if (succeeds_) {
-      std::move(callback).Run(SimulateInstallingApp());
-    } else {
-      std::move(callback).Run(BookmarkAppInstallationTask::Result(
-          web_app::InstallResultCode::kFailedUnknownReason, std::string()));
-    }
+  TestBookmarkAppInstallationTaskFactory() = default;
+  ~TestBookmarkAppInstallationTaskFactory() {
+    DCHECK(next_installation_task_results_.empty());
   }
 
-  void InstallPlaceholder(
-      BookmarkAppInstallationTask::ResultCallback callback) override {
-    std::move(on_install_placeholder_called_).Run();
-    if (succeeds_) {
-      std::move(callback).Run(SimulateInstallingApp(true /* is_placeholder */));
-    } else {
-      std::move(callback).Run(BookmarkAppInstallationTask::Result(
-          web_app::InstallResultCode::kFailedUnknownReason, std::string()));
-    }
+  size_t install_run_count() { return install_run_count_; }
+
+  const std::vector<web_app::InstallOptions>& install_options_list() {
+    return install_options_list_;
   }
 
-  void SetOnInstallCalled(base::OnceClosure on_install_called) {
-    on_install_called_ = std::move(on_install_called);
+  void SetNextInstallationTaskResult(const GURL& app_url,
+                                     web_app::InstallResultCode result_code) {
+    DCHECK(!base::ContainsKey(next_installation_task_results_, app_url));
+    next_installation_task_results_[app_url] = result_code;
   }
 
-  void SetOnInstallPlaceholderCalled(
-      base::OnceClosure on_install_placeholder_called) {
-    on_install_placeholder_called_ = std::move(on_install_placeholder_called);
+  std::unique_ptr<BookmarkAppInstallationTask> CreateInstallationTask(
+      Profile* profile,
+      web_app::AppRegistrar* registrar,
+      web_app::InstallFinalizer* install_finalizer,
+      web_app::InstallOptions install_options) {
+    return std::make_unique<TestBookmarkAppInstallationTask>(
+        this, profile, static_cast<web_app::TestAppRegistrar*>(registrar),
+        install_finalizer, std::move(install_options));
+  }
+
+  void OnInstallCalled(const web_app::InstallOptions& install_options) {
+    ++install_run_count_;
+    install_options_list_.push_back(install_options);
+  }
+
+  web_app::InstallResultCode GetNextInstallationTaskResult(const GURL& url) {
+    DCHECK(base::ContainsKey(next_installation_task_results_, url));
+    auto result = next_installation_task_results_.at(url);
+    next_installation_task_results_.erase(url);
+    return result;
   }
 
  private:
-  BookmarkAppInstallationTask::Result SimulateInstallingApp(
-      bool is_placeholder = false) {
-    std::string app_id = GenerateFakeAppId(install_options().url);
-    externally_installed_app_prefs_.Insert(install_options().url, app_id,
-                                           install_options().install_source);
-    externally_installed_app_prefs_.SetIsPlaceholder(install_options().url,
-                                                     is_placeholder);
-    registrar_->AddAsInstalled(app_id);
-    return {web_app::InstallResultCode::kSuccess, app_id};
-  }
+  class TestBookmarkAppInstallationTask : public BookmarkAppInstallationTask {
+   public:
+    TestBookmarkAppInstallationTask(
+        TestBookmarkAppInstallationTaskFactory* factory,
+        Profile* profile,
+        web_app::TestAppRegistrar* registrar,
+        web_app::InstallFinalizer* install_finalizer,
+        web_app::InstallOptions install_options)
+        : BookmarkAppInstallationTask(profile,
+                                      registrar,
+                                      install_finalizer,
+                                      install_options),
+          factory_(factory),
+          profile_(profile),
+          registrar_(registrar),
+          install_options_(install_options),
+          externally_installed_app_prefs_(profile_->GetPrefs()) {}
+    ~TestBookmarkAppInstallationTask() override = default;
 
-  Profile* profile_;
-  web_app::TestAppRegistrar* registrar_;
-  bool succeeds_;
-  web_app::ExternallyInstalledWebAppPrefs externally_installed_app_prefs_;
+    void Install(content::WebContents* web_contents,
+                 web_app::WebAppUrlLoader::Result url_loaded_result,
+                 ResultCallback callback) override {
+      factory_->OnInstallCalled(install_options_);
 
-  base::OnceClosure on_install_called_;
-  base::OnceClosure on_install_placeholder_called_;
+      base::Optional<web_app::AppId> app_id;
+      auto result_code =
+          factory_->GetNextInstallationTaskResult(install_options_.url);
+      if (result_code == web_app::InstallResultCode::kSuccess) {
+        app_id = GenerateFakeAppId(install_options_.url);
+        externally_installed_app_prefs_.Insert(install_options_.url,
+                                               app_id.value(),
+                                               install_options_.install_source);
+        const bool is_placeholder =
+            (url_loaded_result != web_app::WebAppUrlLoader::Result::kUrlLoaded);
+        externally_installed_app_prefs_.SetIsPlaceholder(install_options_.url,
+                                                         is_placeholder);
+        registrar_->AddAsInstalled(app_id.value());
+      }
+      std::move(callback).Run({result_code, app_id});
+    }
 
-  DISALLOW_COPY_AND_ASSIGN(TestBookmarkAppInstallationTask);
+   private:
+    TestBookmarkAppInstallationTaskFactory* factory_;
+    Profile* profile_;
+    web_app::TestAppRegistrar* registrar_;
+    web_app::InstallOptions install_options_;
+    web_app::ExternallyInstalledWebAppPrefs externally_installed_app_prefs_;
+
+    DISALLOW_COPY_AND_ASSIGN(TestBookmarkAppInstallationTask);
+  };
+
+  std::vector<web_app::InstallOptions> install_options_list_;
+  size_t install_run_count_ = 0;
+
+  std::map<GURL, web_app::InstallResultCode> next_installation_task_results_;
 };
 
 }  // namespace
 
 class PendingBookmarkAppManagerTest : public ChromeRenderViewHostTestHarness {
  public:
-  PendingBookmarkAppManagerTest()
-      : successful_installation_task_creator_(base::BindRepeating(
-            &PendingBookmarkAppManagerTest::CreateSuccessfulInstallationTask,
-            base::Unretained(this))),
-        failing_installation_task_creator_(base::BindRepeating(
-            &PendingBookmarkAppManagerTest::CreateFailingInstallationTask,
-            base::Unretained(this))) {}
+  PendingBookmarkAppManagerTest() = default;
 
   ~PendingBookmarkAppManagerTest() override = default;
 
@@ -165,6 +187,7 @@
     registrar_ = std::make_unique<web_app::TestAppRegistrar>(profile());
     ui_delegate_ = std::make_unique<web_app::TestWebAppUiDelegate>();
     install_finalizer_ = std::make_unique<web_app::TestInstallFinalizer>();
+    task_factory_ = std::make_unique<TestBookmarkAppInstallationTaskFactory>();
 
     web_app::WebAppProvider::Get(profile())->set_ui_delegate(
         ui_delegate_.get());
@@ -174,50 +197,6 @@
     ChromeRenderViewHostTestHarness::TearDown();
   }
 
-  std::unique_ptr<BookmarkAppInstallationTask> CreateInstallationTask(
-      Profile* profile,
-      web_app::InstallFinalizer* install_finalizer,
-      web_app::InstallOptions install_options,
-      bool succeeds) {
-    auto task = std::make_unique<TestBookmarkAppInstallationTask>(
-        profile, registrar_.get(), install_finalizer,
-        std::move(install_options), succeeds);
-    auto* task_ptr = task.get();
-    task->SetOnInstallCalled(base::BindLambdaForTesting([this, task_ptr]() {
-      ++install_run_count_;
-      last_app_info_ = task_ptr->install_options();
-    }));
-
-    task->SetOnInstallPlaceholderCalled(
-        base::BindLambdaForTesting([this, task_ptr]() {
-          ++install_placeholder_run_count_;
-          last_app_info_ = task_ptr->install_options();
-        }));
-    return task;
-  }
-
-  std::unique_ptr<BookmarkAppInstallationTask> CreateSuccessfulInstallationTask(
-      Profile* profile,
-      web_app::AppRegistrar* registrar,
-      web_app::InstallFinalizer* install_finalizer,
-      web_app::InstallOptions install_options) {
-    DCHECK_EQ(registrar, registrar_.get());
-    return CreateInstallationTask(profile, install_finalizer,
-                                  std::move(install_options),
-                                  true /* succeeds */);
-  }
-
-  std::unique_ptr<BookmarkAppInstallationTask> CreateFailingInstallationTask(
-      Profile* profile,
-      web_app::AppRegistrar* registrar,
-      web_app::InstallFinalizer* install_finalizer,
-      web_app::InstallOptions install_options) {
-    DCHECK_EQ(registrar, registrar_.get());
-    return CreateInstallationTask(profile, install_finalizer,
-                                  std::move(install_options),
-                                  false /* succeeds */);
-  }
-
  protected:
   std::pair<GURL, web_app::InstallResultCode> InstallAndWait(
       web_app::PendingAppManager* pending_app_manager,
@@ -280,21 +259,13 @@
     return results;
   }
 
-  const PendingBookmarkAppManager::TaskFactory&
-  successful_installation_task_creator() {
-    return successful_installation_task_creator_;
-  }
-
-  const PendingBookmarkAppManager::TaskFactory&
-  failing_installation_task_creator() {
-    return failing_installation_task_creator_;
-  }
-
   std::unique_ptr<PendingBookmarkAppManager>
-  GetPendingBookmarkAppManagerWithTestFactories() {
+  GetPendingBookmarkAppManagerWithTestMocks() {
     auto manager = std::make_unique<PendingBookmarkAppManager>(
         profile(), registrar_.get(), install_finalizer_.get());
-    manager->SetTaskFactoryForTesting(successful_installation_task_creator());
+    manager->SetTaskFactoryForTesting(base::BindRepeating(
+        &TestBookmarkAppInstallationTaskFactory::CreateInstallationTask,
+        base::Unretained(task_factory_.get())));
 
     // The test suite doesn't support multiple loaders.
     DCHECK_EQ(nullptr, url_loader_);
@@ -307,19 +278,14 @@
   }
 
   // InstallOptions that was used to run the last installation task.
-  const web_app::InstallOptions& last_app_info() {
-    CHECK(last_app_info_.has_value());
-    return *last_app_info_;
+  const web_app::InstallOptions& last_install_options() {
+    DCHECK(!task_factory_->install_options_list().empty());
+    return task_factory_->install_options_list().back();
   }
 
   // Number of times BookmarkAppInstallationTask::Install was called. Reflects
   // how many times we've tried to create an Extension.
-  size_t install_run_count() { return install_run_count_; }
-
-  // Number of times BookmarkAppInstallatioNTask::InstallPlaceholder was called.
-  size_t install_placeholder_run_count() {
-    return install_placeholder_run_count_;
-  }
+  size_t install_run_count() { return task_factory_->install_run_count(); }
 
   size_t uninstall_call_count() {
     return install_finalizer_->uninstall_external_web_app_urls().size();
@@ -333,6 +299,10 @@
     return install_finalizer_->uninstall_external_web_app_urls().back();
   }
 
+  TestBookmarkAppInstallationTaskFactory* task_factory() {
+    return task_factory_.get();
+  }
+
   web_app::TestAppRegistrar* registrar() { return registrar_.get(); }
 
   web_app::TestWebAppUiDelegate* ui_delegate() { return ui_delegate_.get(); }
@@ -344,13 +314,7 @@
   }
 
  private:
-  base::Optional<web_app::InstallOptions> last_app_info_;
-  size_t install_run_count_ = 0;
-  size_t install_placeholder_run_count_ = 0;
-
-  PendingBookmarkAppManager::TaskFactory successful_installation_task_creator_;
-  PendingBookmarkAppManager::TaskFactory failing_installation_task_creator_;
-
+  std::unique_ptr<TestBookmarkAppInstallationTaskFactory> task_factory_;
   std::unique_ptr<web_app::TestAppRegistrar> registrar_;
   std::unique_ptr<web_app::TestWebAppUiDelegate> ui_delegate_;
   std::unique_ptr<web_app::TestInstallFinalizer> install_finalizer_;
@@ -361,7 +325,9 @@
 };
 
 TEST_F(PendingBookmarkAppManagerTest, Install_Succeeds) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
   base::Optional<GURL> url;
@@ -373,11 +339,13 @@
   EXPECT_EQ(kFooWebAppUrl, url.value());
 
   EXPECT_EQ(1u, install_run_count());
-  EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+  EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_SerialCallsDifferentApps) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
   {
@@ -390,9 +358,11 @@
     EXPECT_EQ(kFooWebAppUrl, url.value());
 
     EXPECT_EQ(1u, install_run_count());
-    EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+    EXPECT_EQ(GetFooInstallOptions(), last_install_options());
   }
 
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
   {
@@ -406,15 +376,19 @@
     EXPECT_EQ(kBarWebAppUrl, url.value());
 
     EXPECT_EQ(2u, install_run_count());
-    EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+    EXPECT_EQ(GetBarInstallOptions(), last_install_options());
   }
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_ConcurrentCallsDifferentApps) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
 
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -430,7 +404,7 @@
             // one from the last call to install (which gets higher priority),
             // and another one for this call to install.
             EXPECT_EQ(2u, install_run_count());
-            EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+            EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 
             run_loop.Quit();
           }));
@@ -444,15 +418,19 @@
             // The last call gets higher priority so only one
             // installation task should have run at this point.
             EXPECT_EQ(1u, install_run_count());
-            EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+            EXPECT_EQ(GetBarInstallOptions(), last_install_options());
           }));
   run_loop.Run();
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_PendingSuccessfulTask) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
   url_loader()->SaveLoadUrlRequests();
@@ -468,7 +446,7 @@
             EXPECT_EQ(kFooWebAppUrl, url);
 
             EXPECT_EQ(1u, install_run_count());
-            EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+            EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 
             foo_run_loop.Quit();
           }));
@@ -483,7 +461,7 @@
             EXPECT_EQ(kBarWebAppUrl, url);
 
             EXPECT_EQ(2u, install_run_count());
-            EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+            EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 
             bar_run_loop.Quit();
           }));
@@ -499,9 +477,13 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_PendingFailingTask) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kFailedUnknownReason);
   url_loader()->SetNextLoadUrlResult(
-      kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
+      kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
   url_loader()->SaveLoadUrlRequests();
@@ -516,8 +498,8 @@
             EXPECT_EQ(web_app::InstallResultCode::kFailedUnknownReason, code);
             EXPECT_EQ(kFooWebAppUrl, url);
 
-            // The installation didn't run because we loaded the wrong url.
-            EXPECT_EQ(0u, install_run_count());
+            EXPECT_EQ(1u, install_run_count());
+
             foo_run_loop.Quit();
           }));
   // Make sure the installation has started.
@@ -530,8 +512,8 @@
             EXPECT_EQ(web_app::InstallResultCode::kSuccess, code);
             EXPECT_EQ(kBarWebAppUrl, url);
 
-            EXPECT_EQ(1u, install_run_count());
-            EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+            EXPECT_EQ(2u, install_run_count());
+            EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 
             bar_run_loop.Quit();
           }));
@@ -547,9 +529,13 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_ReentrantCallback) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -560,7 +546,7 @@
         EXPECT_EQ(kBarWebAppUrl, url);
 
         EXPECT_EQ(2u, install_run_count());
-        EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+        EXPECT_EQ(GetBarInstallOptions(), last_install_options());
         run_loop.Quit();
       });
   auto reentrant_callback = base::BindLambdaForTesting(
@@ -569,7 +555,7 @@
         EXPECT_EQ(kFooWebAppUrl, url);
 
         EXPECT_EQ(1u, install_run_count());
-        EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+        EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 
         pending_app_manager->Install(GetBarInstallOptions(), final_callback);
       });
@@ -580,7 +566,9 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_SerialCallsSameApp) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -594,7 +582,7 @@
     EXPECT_EQ(kFooWebAppUrl, url);
 
     EXPECT_EQ(1u, install_run_count());
-    EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+    EXPECT_EQ(GetFooInstallOptions(), last_install_options());
   }
 
   {
@@ -612,7 +600,9 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_ConcurrentCallsSameApp) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -645,17 +635,19 @@
             EXPECT_EQ(kFooWebAppUrl, url);
 
             EXPECT_EQ(1u, install_run_count());
-            EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+            EXPECT_EQ(GetFooInstallOptions(), last_install_options());
             first_callback_ran = true;
           }));
   run_loop.Run();
 
   EXPECT_EQ(1u, install_run_count());
-  EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+  EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_AlwaysUpdate) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -677,9 +669,11 @@
     EXPECT_EQ(kFooWebAppUrl, url);
 
     EXPECT_EQ(1u, install_run_count());
-    EXPECT_EQ(get_always_update_info(), last_app_info());
+    EXPECT_EQ(get_always_update_info(), last_install_options());
   }
 
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
   {
@@ -693,14 +687,16 @@
 
     // The app should be installed again because of the |always_update| flag.
     EXPECT_EQ(2u, install_run_count());
-    EXPECT_EQ(get_always_update_info(), last_app_info());
+    EXPECT_EQ(get_always_update_info(), last_install_options());
   }
 }
 
-TEST_F(PendingBookmarkAppManagerTest, Install_FailsLoadIncorrectURL) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+TEST_F(PendingBookmarkAppManagerTest, Install_InstallationFails) {
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kFailedUnknownReason);
   url_loader()->SetNextLoadUrlResult(
-      kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
+      kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
   base::Optional<GURL> url;
   base::Optional<web_app::InstallResultCode> code;
@@ -710,12 +706,13 @@
   EXPECT_EQ(web_app::InstallResultCode::kFailedUnknownReason, code);
   EXPECT_EQ(kFooWebAppUrl, url);
 
-  EXPECT_EQ(0u, install_run_count());
-  EXPECT_EQ(0u, install_placeholder_run_count());
+  EXPECT_EQ(1u, install_run_count());
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_PlaceholderApp) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
 
@@ -730,12 +727,14 @@
   EXPECT_EQ(web_app::InstallResultCode::kSuccess, code);
   EXPECT_EQ(kFooWebAppUrl, url);
 
-  EXPECT_EQ(0u, install_run_count());
-  EXPECT_EQ(1u, install_placeholder_run_count());
+  EXPECT_EQ(1u, install_run_count());
+  EXPECT_EQ(install_options, last_install_options());
 }
 
 TEST_F(PendingBookmarkAppManagerTest, InstallApps_Succeeds) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -750,13 +749,15 @@
                 {{kFooWebAppUrl, web_app::InstallResultCode::kSuccess}}));
 
   EXPECT_EQ(1u, install_run_count());
-  EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+  EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 }
 
-TEST_F(PendingBookmarkAppManagerTest, InstallApps_Fails) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+TEST_F(PendingBookmarkAppManagerTest, InstallApps_FailsInstallationFails) {
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kFailedUnknownReason);
   url_loader()->SetNextLoadUrlResult(
-      kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
+      kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
   std::vector<web_app::InstallOptions> apps_to_install;
   apps_to_install.push_back(GetFooInstallOptions());
@@ -769,18 +770,20 @@
       InstallAppsResults(
           {{kFooWebAppUrl, web_app::InstallResultCode::kFailedUnknownReason}}));
 
-  EXPECT_EQ(0u, install_run_count());
-  EXPECT_EQ(0u, install_placeholder_run_count());
+  EXPECT_EQ(1u, install_run_count());
 }
 
 TEST_F(PendingBookmarkAppManagerTest, InstallApps_PlaceholderApp) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
 
+  auto install_options = GetFooInstallOptions();
+  install_options.install_placeholder = true;
   std::vector<web_app::InstallOptions> apps_to_install;
-  apps_to_install.push_back(GetFooInstallOptions());
-  apps_to_install.front().install_placeholder = true;
+  apps_to_install.push_back(install_options);
 
   InstallAppsResults results =
       InstallAppsAndWait(pending_app_manager.get(), std::move(apps_to_install));
@@ -789,14 +792,18 @@
             InstallAppsResults(
                 {{kFooWebAppUrl, web_app::InstallResultCode::kSuccess}}));
 
-  EXPECT_EQ(0u, install_run_count());
-  EXPECT_EQ(1u, install_placeholder_run_count());
+  EXPECT_EQ(1u, install_run_count());
+  EXPECT_EQ(install_options, last_install_options());
 }
 
 TEST_F(PendingBookmarkAppManagerTest, InstallApps_Multiple) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -813,13 +820,17 @@
                  {kBarWebAppUrl, web_app::InstallResultCode::kSuccess}}));
 
   EXPECT_EQ(2u, install_run_count());
-  EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+  EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 }
 
 TEST_F(PendingBookmarkAppManagerTest, InstallApps_PendingInstallApps) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -836,7 +847,7 @@
               EXPECT_EQ(kFooWebAppUrl, url);
 
               EXPECT_EQ(1u, install_run_count());
-              EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+              EXPECT_EQ(GetFooInstallOptions(), last_install_options());
             }));
   }
 
@@ -852,7 +863,7 @@
               EXPECT_EQ(kBarWebAppUrl, url);
 
               EXPECT_EQ(2u, install_run_count());
-              EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+              EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 
               run_loop.Quit();
             }));
@@ -861,11 +872,17 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, Install_PendingMulitpleInstallApps) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kQuxWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kQuxWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -887,13 +904,13 @@
               EXPECT_EQ(kFooWebAppUrl, url);
 
               EXPECT_EQ(2u, install_run_count());
-              EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+              EXPECT_EQ(GetFooInstallOptions(), last_install_options());
             } else if (callback_calls == 2) {
               EXPECT_EQ(web_app::InstallResultCode::kSuccess, code);
               EXPECT_EQ(kBarWebAppUrl, url);
 
               EXPECT_EQ(3u, install_run_count());
-              EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+              EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 
               run_loop.Quit();
             } else {
@@ -911,18 +928,24 @@
 
             // The install request from Install should be processed first.
             EXPECT_EQ(1u, install_run_count());
-            EXPECT_EQ(GetQuxInstallOptions(), last_app_info());
+            EXPECT_EQ(GetQuxInstallOptions(), last_install_options());
           }));
 
   run_loop.Run();
 }
 
 TEST_F(PendingBookmarkAppManagerTest, InstallApps_PendingInstall) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kBarWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kBarWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
+  task_factory()->SetNextInstallationTaskResult(
+      kQuxWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kQuxWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -938,7 +961,7 @@
 
             // The install request from Install should be processed first.
             EXPECT_EQ(1u, install_run_count());
-            EXPECT_EQ(GetQuxInstallOptions(), last_app_info());
+            EXPECT_EQ(GetQuxInstallOptions(), last_install_options());
           }));
 
   // Queue through InstallApps.
@@ -958,7 +981,7 @@
 
               // The install requests from InstallApps should be processed next.
               EXPECT_EQ(2u, install_run_count());
-              EXPECT_EQ(GetFooInstallOptions(), last_app_info());
+              EXPECT_EQ(GetFooInstallOptions(), last_install_options());
 
               return;
             }
@@ -967,7 +990,7 @@
               EXPECT_EQ(kBarWebAppUrl, url);
 
               EXPECT_EQ(3u, install_run_count());
-              EXPECT_EQ(GetBarInstallOptions(), last_app_info());
+              EXPECT_EQ(GetBarInstallOptions(), last_install_options());
 
               run_loop.Quit();
               return;
@@ -978,7 +1001,9 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, ExtensionUninstalled) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -998,6 +1023,8 @@
 
   // Try to install the app again.
   {
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -1013,7 +1040,9 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, ExternalExtensionUninstalled) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -1049,6 +1078,8 @@
   }
 
   {
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -1064,7 +1095,7 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, UninstallApps_Succeeds) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
   registrar()->AddAsInstalled(GenerateFakeAppId(kFooWebAppUrl));
 
   install_finalizer()->SetNextUninstallExternalWebAppResult(kFooWebAppUrl,
@@ -1079,7 +1110,7 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, UninstallApps_Fails) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
 
   install_finalizer()->SetNextUninstallExternalWebAppResult(kFooWebAppUrl,
                                                             false);
@@ -1092,7 +1123,7 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, UninstallApps_Multiple) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
   registrar()->AddAsInstalled(GenerateFakeAppId(kFooWebAppUrl));
   registrar()->AddAsInstalled(GenerateFakeAppId(kBarWebAppUrl));
 
@@ -1112,7 +1143,9 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, UninstallApps_PendingInstall) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
+  task_factory()->SetNextInstallationTaskResult(
+      kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
   url_loader()->SetNextLoadUrlResult(
       kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
 
@@ -1137,12 +1170,14 @@
 }
 
 TEST_F(PendingBookmarkAppManagerTest, ReinstallPlaceholderApp_Success) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
   // Install a placeholder app
   auto install_options = GetFooInstallOptions();
   install_options.install_placeholder = true;
 
   {
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
     base::Optional<GURL> url;
@@ -1150,13 +1185,14 @@
     std::tie(url, code) =
         InstallAndWait(pending_app_manager.get(), install_options);
     ASSERT_EQ(web_app::InstallResultCode::kSuccess, code.value());
-    EXPECT_EQ(0u, install_run_count());
-    EXPECT_EQ(1u, install_placeholder_run_count());
+    EXPECT_EQ(1u, install_run_count());
   }
 
   // Reinstall placeholder
   {
     install_options.reinstall_placeholder = true;
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
     install_finalizer()->SetNextUninstallExternalWebAppResult(kFooWebAppUrl,
@@ -1170,20 +1206,21 @@
     EXPECT_EQ(web_app::InstallResultCode::kSuccess, code.value());
     EXPECT_EQ(kFooWebAppUrl, url.value());
 
-    EXPECT_EQ(1u, install_run_count());
-    EXPECT_EQ(1u, install_placeholder_run_count());
+    EXPECT_EQ(2u, install_run_count());
   }
 }
 
 TEST_F(PendingBookmarkAppManagerTest,
        ReinstallPlaceholderApp_ReinstallNotPossible) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
 
   // Install a placeholder app
   auto install_options = GetFooInstallOptions();
   install_options.install_placeholder = true;
 
   {
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
     base::Optional<GURL> url;
@@ -1191,13 +1228,14 @@
     std::tie(url, code) =
         InstallAndWait(pending_app_manager.get(), install_options);
     ASSERT_EQ(web_app::InstallResultCode::kSuccess, code.value());
-    EXPECT_EQ(0u, install_run_count());
-    EXPECT_EQ(1u, install_placeholder_run_count());
+    EXPECT_EQ(1u, install_run_count());
   }
 
   // Try to reinstall placeholder
   {
     install_options.reinstall_placeholder = true;
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
 
@@ -1209,22 +1247,23 @@
     EXPECT_EQ(web_app::InstallResultCode::kSuccess, code.value());
     EXPECT_EQ(kFooWebAppUrl, url.value());
 
-    EXPECT_EQ(0u, install_run_count());
     // Even though the placeholder app is already install, we make a call to
     // InstallFinalizer. InstallFinalizer ensures we don't unnecessarily
     // install the placeholder app again.
-    EXPECT_EQ(2u, install_placeholder_run_count());
+    EXPECT_EQ(2u, install_run_count());
   }
 }
 
 TEST_F(PendingBookmarkAppManagerTest,
        ReinstallPlaceholderAppWhenUnused_NoOpenedWindows) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
   // Install a placeholder app
   auto install_options = GetFooInstallOptions();
   install_options.install_placeholder = true;
 
   {
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
     base::Optional<GURL> url;
@@ -1232,14 +1271,15 @@
     std::tie(url, code) =
         InstallAndWait(pending_app_manager.get(), install_options);
     ASSERT_EQ(web_app::InstallResultCode::kSuccess, code.value());
-    EXPECT_EQ(0u, install_run_count());
-    EXPECT_EQ(1u, install_placeholder_run_count());
+    EXPECT_EQ(1u, install_run_count());
   }
 
   // Reinstall placeholder
   {
     install_options.reinstall_placeholder = true;
     install_options.wait_for_windows_closed = true;
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     ui_delegate()->SetNumWindowsForApp(GenerateFakeAppId(kFooWebAppUrl), 0);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
@@ -1252,20 +1292,21 @@
     EXPECT_EQ(web_app::InstallResultCode::kSuccess, code.value());
     EXPECT_EQ(kFooWebAppUrl, url.value());
 
-    EXPECT_EQ(1u, install_run_count());
-    EXPECT_EQ(1u, install_placeholder_run_count());
+    EXPECT_EQ(2u, install_run_count());
   }
 }
 
 TEST_F(PendingBookmarkAppManagerTest,
        ReinstallPlaceholderAppWhenUnused_OneWindowOpened) {
-  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestFactories();
+  auto pending_app_manager = GetPendingBookmarkAppManagerWithTestMocks();
 
   // Install a placeholder app
   auto install_options = GetFooInstallOptions();
   install_options.install_placeholder = true;
 
   {
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kRedirectedUrlLoaded);
     base::Optional<GURL> url;
@@ -1273,14 +1314,15 @@
     std::tie(url, code) =
         InstallAndWait(pending_app_manager.get(), install_options);
     ASSERT_EQ(web_app::InstallResultCode::kSuccess, code.value());
-    EXPECT_EQ(0u, install_run_count());
-    EXPECT_EQ(1u, install_placeholder_run_count());
+    EXPECT_EQ(1u, install_run_count());
   }
 
   // Reinstall placeholder
   {
     install_options.reinstall_placeholder = true;
     install_options.wait_for_windows_closed = true;
+    task_factory()->SetNextInstallationTaskResult(
+        kFooWebAppUrl, web_app::InstallResultCode::kSuccess);
     ui_delegate()->SetNumWindowsForApp(GenerateFakeAppId(kFooWebAppUrl), 1);
     url_loader()->SetNextLoadUrlResult(
         kFooWebAppUrl, web_app::WebAppUrlLoader::Result::kUrlLoaded);
@@ -1295,8 +1337,7 @@
     EXPECT_EQ(web_app::InstallResultCode::kSuccess, code.value());
     EXPECT_EQ(kFooWebAppUrl, url.value());
 
-    EXPECT_EQ(1u, install_run_count());
-    EXPECT_EQ(1u, install_placeholder_run_count());
+    EXPECT_EQ(2u, install_run_count());
   }
 }
 
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
index 11a99c1..1ff518c 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -337,8 +337,7 @@
 bool ChromeAuthenticatorRequestDelegate::ShouldDisablePlatformAuthenticators() {
 #if defined(OS_MACOSX)
   // Touch ID is available in Incognito, but not in Guest mode.
-  return Profile::FromBrowserContext(browser_context())->GetProfileType() ==
-         Profile::ProfileType::GUEST_PROFILE;
+  return Profile::FromBrowserContext(browser_context())->IsGuestProfile();
 #else  // Windows, Android
   return browser_context()->IsOffTheRecord();
 #endif
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 8ac490fd..77628c52 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -378,13 +378,13 @@
     public_deps += [
       "//chrome/common/extensions/api",
       "//chrome/common/extensions/api:extensions_features",
-      "//device/usb/public/cpp",
       "//extensions:extensions_resources",
       "//extensions/common",
       "//extensions/common:core_api_provider",
       "//extensions/common/api",
       "//extensions/strings",
       "//media/cast:net",
+      "//services/device/public/cpp/usb",
     ]
     if (is_chromeos) {
       sources += [
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index e5fe779b..b03ae02 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -214,11 +214,6 @@
 const base::Feature kDesktopPWAsLinkCapturing{
     "DesktopPWAsLinkCapturing", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Determines whether out of scope pages in the hosted app will use the
-// custom tab UI.
-const base::Feature kDesktopPWAsCustomTabUI{"DesktopPWAsCustomTabUI",
-                                            base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Determines whether in scope requests are always opened in the same window.
 const base::Feature kDesktopPWAsStayInWindow{"DesktopPWAsStayInWindow",
                                              base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 8aebd01..1c230e2d 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -123,9 +123,6 @@
 extern const base::Feature kDesktopPWAsLinkCapturing;
 
 COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::Feature kDesktopPWAsCustomTabUI;
-
-COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kDesktopPWAsStayInWindow;
 
 COMPONENT_EXPORT(CHROME_FEATURES)
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 72166dd0..7d3f81c 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -400,16 +400,6 @@
 // messages. Useful when running against a non-prod management server.
 const char kMonitoringDestinationID[]       = "monitoring-destination-id";
 
-// Sets the granularity of events to capture in the network log. The mode can be
-// set to one of the following values:
-//   "Default"
-//   "IncludeCookiesAndCredentials"
-//   "IncludeSocketBytes"
-//
-// See the functions of the corresponding name in net_log_capture_mode.h for a
-// description of their meaning.
-const char kNetLogCaptureMode[]             = "net-log-capture-mode";
-
 // Disables the default browser check. Useful for UI/browser tests where we
 // want to avoid having the default browser info-bar displayed.
 const char kNoDefaultBrowserCheck[]         = "no-default-browser-check";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 29d118e..894108cf 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -125,7 +125,6 @@
 extern const char kMakeDefaultBrowser[];
 extern const char kMediaCacheSize[];
 extern const char kMonitoringDestinationID[];
-extern const char kNetLogCaptureMode[];
 extern const char kNewNetErrorPageUI[];
 extern const char kNoDefaultBrowserCheck[];
 extern const char kNoExperiments[];
diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl
index 3e3d884..562ecff 100644
--- a/chrome/common/extensions/api/file_manager_private.idl
+++ b/chrome/common/extensions/api/file_manager_private.idl
@@ -1034,6 +1034,11 @@
   // |changeInfo|
   static void setPreferences(PreferencesChange changeInfo);
 
+  // Sets the flag for remembering if the toast UI for ARC storage
+  // has already been shown.
+  // |callback| Completion callback with the original value of the flag.
+  static void setArcStorageToastShownFlag(BooleanCallback callback);
+
   // Performs drive content search.
   // |searchParams|
   // |callback|
diff --git a/chrome/common/features.gni b/chrome/common/features.gni
index 5101ed31c..d09fac2ea 100644
--- a/chrome/common/features.gni
+++ b/chrome/common/features.gni
@@ -71,7 +71,7 @@
     # Restructures the macOS bundle layout so that the Framework goes in
     # Chromium.app/Contents/Frameworks rather than
     # Chromium.app/Contents/Versions. https://crbug.com/958976
-    new_mac_bundle_structure = false
+    new_mac_bundle_structure = true
   }
 }
 
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index 3d08a48..6b10aa14 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -364,6 +364,7 @@
 // 'multidevice/features' is a child of the 'multidevice' route
 const char kConnectedDevicesSubPage[] = "multidevice/features";
 const char kLockScreenSubPage[] = "lockScreen";
+const char kNativePrintingSettingsSubPage[] = "cupsPrinters";
 const char kNetworkDetailSubPage[] = "networkDetail";
 const char kPluginVmDetailsSubPage[] = "pluginVm/details";
 const char kPluginVmSharedPathSubPage[] = "pluginVm/sharedPath";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 73546d5..212f95e 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -326,6 +326,7 @@
 extern const char kInternetSubPage[];
 extern const char kConnectedDevicesSubPage[];
 extern const char kLockScreenSubPage[];
+extern const char kNativePrintingSettingsSubPage[];
 extern const char kNetworkDetailSubPage[];
 extern const char kPluginVmDetailsSubPage[];
 extern const char kPluginVmSharedPathSubPage[];
diff --git a/chrome/installer/mac/dmgdiffer.sh b/chrome/installer/mac/dmgdiffer.sh
index f03f208a..6c147b5 100755
--- a/chrome/installer/mac/dmgdiffer.sh
+++ b/chrome/installer/mac/dmgdiffer.sh
@@ -146,15 +146,20 @@
   readonly KS_VERSION_KEY="KSVersion"
   readonly KS_PRODUCT_KEY="KSProductID"
   readonly KS_CHANNEL_KEY="KSChannelID"
-  readonly VERSIONS_DIR_NEW=\
-"Contents/Frameworks/${product_name} Framework.framework/Versions"
   readonly VERSIONS_DIR_OLD="Contents/Versions"
   readonly BUILD_RE="^[0-9]+\\.[0-9]+\\.([0-9]+)\\.[0-9]+\$"
   readonly MIN_BUILD=434
 
-  local product_url="https://www.google.com/chrome/"
+  local versions_dir_new
+  local product_url
   if [[ "${product_name}" = "Google Chrome Canary" ]]; then
+    versions_dir_new=\
+"Contents/Frameworks/Google Chrome Framework.framework/Versions"
     product_url="https://www.google.com/chrome/canary/"
+  else
+    versions_dir_new=\
+"Contents/Frameworks/${product_name} Framework.framework/Versions"
+    product_url="https://www.google.com/chrome/"
   fi
 
   local old_app_path="${old_fs}/${APP_NAME}"
@@ -237,16 +242,16 @@
   fi
 
   local old_versioned_dir
-  if [[ -e "${old_app_path}/${VERSIONS_DIR_NEW}" ]]; then
-    old_versioned_dir="${old_app_path}/${VERSIONS_DIR_NEW}/${old_app_version}"
+  if [[ -e "${old_app_path}/${versions_dir_new}" ]]; then
+    old_versioned_dir="${old_app_path}/${versions_dir_new}/${old_app_version}"
   else
     old_versioned_dir="${old_app_path}/${VERSIONS_DIR_OLD}/${old_app_version}"
   fi
 
   local new_versioned_dir
   local layout_new
-  if [[ -e "${new_app_path}/${VERSIONS_DIR_NEW}" ]]; then
-    new_versioned_dir="${new_app_path}/${VERSIONS_DIR_NEW}/${new_app_version}"
+  if [[ -e "${new_app_path}/${versions_dir_new}" ]]; then
+    new_versioned_dir="${new_app_path}/${versions_dir_new}/${new_app_version}"
     layout_new="y"
   else
     new_versioned_dir="${new_app_path}/${VERSIONS_DIR_OLD}/${new_app_version}"
@@ -297,13 +302,12 @@
   # The only visible contents of the disk image will be a README file that
   # explains the image's purpose.
   local new_app_version_extra="${new_app_version}${name_extra}"
-  cat > "${patch_fs}/README.txt" << __EOF__ ||
+  cat > "${patch_fs}/README.txt" << __EOF__ || \
       (err "could not write README.txt" && exit 13)
 This disk image contains a differential updater that can update
 ${product_name} from version ${old_app_version} to ${new_app_version_extra}.
 
-This image is part of the auto-update system and is not independently
-useful.
+This image is part of the auto-update system and is not independently useful.
 
 To install ${product_name}, please visit ${product_url}.
 __EOF__
@@ -333,13 +337,11 @@
   # but to include an empty Versions directory. The versioned directory was
   # already addressed in the preceding dirpatch.
   if [[ -n "${layout_new}" ]]; then
-    # Transform VERSIONS_DIR_NEW into a regular expression pattern by
-    # backslashing the dot.
-    #
-    # This exclude pattern omits the Current symbolic link, which will be fixed
-    # up after dirdiffer creates this dirpatch.
+    # Transform versions_dir_new and the version into a regular expression
+    # pattern by backslashing the dots.
     export DIRDIFFER_EXCLUDE=\
-"/${APP_NAME_RE}/$(echo "${VERSIONS_DIR_NEW}" | sed -e 's/\./\\./g')/"
+"/${APP_NAME_RE}/$(echo "${versions_dir_new}/${new_app_version}" |
+                       sed -e 's/\./\\./g')"
   else
     # VERSIONS_DIR_OLD doesn't contain anything that a regular expression parser
     # would misinterpret.
@@ -364,14 +366,6 @@
 
   unset DIRDIFFER_EXCLUDE DIRDIFFER_NO_DIFF
 
-  if [[ -n "${layout_new}" ]]; then
-    # The Current symbolic link in the framework's Versions directory was
-    # excluded by DIRDIFFER_EXCLUDE, but its presence is critical.
-    rsync --links --perms --times \
-           "${new_app_path}/${VERSIONS_DIR_NEW}/Current" \
-           "${patch_app_dir}/${VERSIONS_DIR_NEW}/Current"
-  fi
-
   echo "${product_name} ${old_app_version}-${new_app_version_extra} Update"
 }
 
diff --git a/chrome/installer/mac/signing/config.py.in b/chrome/installer/mac/signing/config.py.in
index 890990e..560b1d20 100644
--- a/chrome/installer/mac/signing/config.py.in
+++ b/chrome/installer/mac/signing/config.py.in
@@ -97,25 +97,6 @@
         return set(('libwidevinecdm.dylib',))
 
     @property
-    def codesign_options_outer_app(self):
-        """Returns the codesign -o flags for the outer app bundle."""
-        return 'restrict'
-
-    @property
-    def codesign_options_helpers(self):
-        """Returns the codesign -o flags for helper executables within the
-        bundle.
-        """
-        return self.codesign_options_outer_app + ',library'
-
-    @property
-    def codesign_options_installer_tools(self):
-        """Returns the codesign -o flags for the installer tools, which
-        are not shipped to end-users.
-        """
-        return self.codesign_options_helpers + ',kill'
-
-    @property
     def codesign_requirements_basic(self):
         """Returns the codesign --requirements string that is combined with
         a designated identifier requirement string of a
diff --git a/chrome/installer/mac/signing/model.py b/chrome/installer/mac/signing/model.py
index ac851a14..ab78625 100644
--- a/chrome/installer/mac/signing/model.py
+++ b/chrome/installer/mac/signing/model.py
@@ -30,8 +30,8 @@
             identifier: The unique identifier set when code signing. This is
                 only explicitly passed with the `--identifier` flag if
                 |sign_with_identifier| is True.
-            options: Comma-separated string of option names passed to the
-                `codesign -o` flag.
+            options: Options flags to pass to `codesign --options`, from
+                |CodeSignOptions|.
             requirements: String for additional `--requirements` to pass to the
                 `codesign` command. These are joined with a space to the
                 |config.CodeSignConfig.codesign_requirements_basic| string. See
@@ -53,6 +53,8 @@
         """
         self.path = path
         self.identifier = identifier
+        if not CodeSignOptions.valid(options):
+            raise ValueError('Invalid CodeSignOptions: {}'.format(options))
         self.options = options
         self.requirements = requirements
         self.identifier_requirement = identifier_requirement
@@ -88,23 +90,23 @@
                 'options={0.options}, path={0.path})'.format(self)
 
 
-class VerifyOptions(object):
-    """Enum for the options that can be specified when validating the results of
-    code signing.
+def make_enum(class_name, options):
+    """Makes a new class type for an enum.
 
-    These options are passed to `codesign --verify` after the
-    |CodeSignedProduct| has been signed.
+    Args:
+        class_name: Name of the new type to make.
+        options: A dictionary of enum options to use. The keys will become
+            attributes on the class, and the values will be wrapped in a tuple
+            so that the options can be joined together.
+
+    Returns:
+        A new class for the enum.
     """
-    DEEP = ('--deep',)
-    NO_STRICT = ('--no-strict',)
-    IGNORE_RESOURCES = ('--ignore-resources',)
-
-    def __init__(self):
-        raise TypeError('VerifyOptions cannot be constructed')
+    attrs = {}
 
     @classmethod
-    def valid(cls, options):
-        """Tests if the specified |options| are valid.
+    def valid(cls, opts_to_check):
+        """Tests if the specified |opts_to_check| are valid.
 
         Args:
             options: Iterable of option strings.
@@ -112,10 +114,41 @@
         Returns:
             True if all the options are valid, False if otherwise.
         """
-        if options is None:
+        if opts_to_check is None:
             return True
-        all_options = cls.DEEP + cls.NO_STRICT + cls.IGNORE_RESOURCES
-        return all([option in all_options for option in options])
+        valid_values = options.values()
+        return all([option in valid_values for option in opts_to_check])
+
+    attrs['valid'] = valid
+
+    for name, value in options.items():
+        assert type(name) is str
+        assert type(value) is str
+        attrs[name] = (value,)
+
+    return type(class_name, (object,), attrs)
+
+
+"""Enum for the options that can be specified when validating the results of
+code signing.
+
+These options are passed to `codesign --verify` after the
+|CodeSignedProduct| has been signed.
+"""
+VerifyOptions = make_enum(
+    'signing.model.VerifyOptions', {
+        'DEEP': '--deep',
+        'NO_STRICT': '--no-strict',
+        'IGNORE_RESOURCES': '--ignore-resources',
+    })
+
+CodeSignOptions = make_enum(
+    'signing.model.CodeSignOptions', {
+        'RESTRICT': 'restrict',
+        'LIBRARY_VALIDATION': 'library',
+        'HARDENED_RUNTIME': 'runtime',
+        'KILL': 'kill',
+    })
 
 
 class Distribution(object):
diff --git a/chrome/installer/mac/signing/signing.py b/chrome/installer/mac/signing/signing.py
index 6277930..e8b8cf01 100644
--- a/chrome/installer/mac/signing/signing.py
+++ b/chrome/installer/mac/signing/signing.py
@@ -10,7 +10,7 @@
 import os.path
 
 from . import commands
-from .model import CodeSignedProduct, VerifyOptions
+from .model import CodeSignOptions, CodeSignedProduct, VerifyOptions
 
 _PROVISIONPROFILE_EXT = '.provisionprofile'
 _PROVISIONPROFILE_DEST = 'embedded.provisionprofile'
@@ -39,7 +39,7 @@
             CodeSignedProduct(
                 '{.app_product}.app'.format(config),
                 config.base_bundle_id,
-                options=config.codesign_options_outer_app,
+                options=CodeSignOptions.RESTRICT,
                 requirements=config.codesign_requirements_outer_app,
                 identifier_requirement=False,
                 resource_rules=None if config.use_new_mac_bundle_structure else
@@ -58,14 +58,16 @@
                 .format(config),
                 '{}.framework.AlertNotificationService'.format(
                     config.base_bundle_id),
-                options=config.codesign_options_helpers,
+                options=CodeSignOptions.RESTRICT +
+                CodeSignOptions.LIBRARY_VALIDATION,
                 verify_options=VerifyOptions.DEEP),
         'crashpad':
             CodeSignedProduct(
                 '{.framework_dir}/Helpers/chrome_crashpad_handler'.format(
                     config),
                 'chrome_crashpad_handler',
-                options=config.codesign_options_helpers,
+                options=CodeSignOptions.RESTRICT +
+                CodeSignOptions.LIBRARY_VALIDATION,
                 verify_options=VerifyOptions.DEEP),
         'helper-app':
             CodeSignedProduct(
@@ -74,13 +76,14 @@
                  '{0.app_product}.app/Contents/Versions/{0.version}/{0.product} Helper.app'
                 ).format(config),
                 '{}.helper'.format(uncustomized_bundle_id),
-                options=config.codesign_options_helpers,
+                options=CodeSignOptions.RESTRICT,
                 verify_options=VerifyOptions.DEEP),
         'app-mode-app':
             CodeSignedProduct(
                 '{.framework_dir}/Helpers/app_mode_loader'.format(config),
                 'app_mode_loader',
-                options=config.codesign_options_helpers,
+                options=CodeSignOptions.RESTRICT +
+                CodeSignOptions.LIBRARY_VALIDATION,
                 verify_options=VerifyOptions.IGNORE_RESOURCES),
     }
 
@@ -122,12 +125,11 @@
         'xzdec',
     )
     for binary in binaries:
-        options = config.codesign_options_installer_tools if not binary.endswith(
-            '.dylib') else None
+        options = CodeSignOptions.RESTRICT + CodeSignOptions.LIBRARY_VALIDATION + CodeSignOptions.KILL
         tools[binary] = CodeSignedProduct(
             '{.packaging_dir}/{binary}'.format(config, binary=binary),
             binary.replace('.dylib', ''),
-            options=options,
+            options=options if not binary.endswith('dylib') else None,
             verify_options=VerifyOptions.DEEP)
 
     return tools
@@ -151,7 +153,7 @@
     if config.keychain:
         command.extend(['--keychain', config.keychain])
     if part.options:
-        command.extend(['--options', part.options])
+        command.extend(['--options', ','.join(part.options)])
     if part.resource_rules:
         command.extend([
             '--resource-rules',
diff --git a/chrome/installer/mac/signing/signing_test.py b/chrome/installer/mac/signing/signing_test.py
index 69494c39..b71f37d 100644
--- a/chrome/installer/mac/signing/signing_test.py
+++ b/chrome/installer/mac/signing/signing_test.py
@@ -58,6 +58,27 @@
                          all_parts['helper-app'].identifier)
 
 
+    def test_part_options(self):
+        parts = signing.get_parts(test_config.TestConfig())
+        self.assertEqual(
+            set(model.CodeSignOptions.RESTRICT), set(parts['app'].options))
+        self.assertEqual(
+            set(model.CodeSignOptions.RESTRICT),
+            set(parts['helper-app'].options))
+        self.assertEqual(
+            set(model.CodeSignOptions.RESTRICT +
+                model.CodeSignOptions.LIBRARY_VALIDATION),
+            set(parts['crashpad'].options))
+        self.assertEqual(
+            set(model.CodeSignOptions.RESTRICT +
+                model.CodeSignOptions.LIBRARY_VALIDATION),
+            set(parts['notification-xpc'].options))
+        self.assertEqual(
+            set(model.CodeSignOptions.RESTRICT +
+                model.CodeSignOptions.LIBRARY_VALIDATION),
+            set(parts['app-mode-app'].options))
+
+
 @mock.patch('signing.commands.run_command')
 class TestSignPart(unittest.TestCase):
 
@@ -117,7 +138,10 @@
 
     def test_sign_part_with_options(self, run_command):
         part = model.CodeSignedProduct(
-            'Test.app', 'test.signing.app', options='restrict,library')
+            'Test.app',
+            'test.signing.app',
+            options=model.CodeSignOptions.RESTRICT +
+            model.CodeSignOptions.LIBRARY_VALIDATION)
         signing.sign_part(self.paths, self.config, part)
         run_command.assert_called_once_with([
             'codesign', '--sign', '[IDENTITY]', '--requirements',
diff --git a/chrome/renderer/net/DEPS b/chrome/renderer/net/DEPS
index 0092cec..c63dbc11 100644
--- a/chrome/renderer/net/DEPS
+++ b/chrome/renderer/net/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
   "+components/error_page/renderer",
+  "+components/offline_pages/core",
   "+components/security_interstitials/core",
   "+components/security_interstitials/core/common/interfaces",
   "+third_party/zlib/google",
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index 8fe751d..a16be7c 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -31,6 +31,7 @@
 #include "components/error_page/common/localized_error.h"
 #include "components/error_page/common/net_error_info.h"
 #include "components/grit/components_resources.h"
+#include "components/offline_pages/core/offline_page_feature.h"
 #include "components/security_interstitials/core/common/interfaces/interstitial_commands.mojom.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
@@ -99,7 +100,8 @@
 
 #if defined(OS_ANDROID)
 bool IsOfflineContentOnNetErrorFeatureEnabled() {
-  return base::FeatureList::IsEnabled(features::kNewNetErrorPageUI);
+  return offline_pages::IsOfflinePagesEnabled() &&
+         base::FeatureList::IsEnabled(features::kNewNetErrorPageUI);
 }
 #else   // OS_ANDROID
 bool IsOfflineContentOnNetErrorFeatureEnabled() {
@@ -110,9 +112,10 @@
 #if defined(OS_ANDROID)
 bool IsAutoFetchFeatureEnabled() {
   // This feature is incompatible with OfflineContentOnNetError, so don't allow
-  // both.
+  // both. Disabled for touchless builds.
   return !IsOfflineContentOnNetErrorFeatureEnabled() &&
-         base::FeatureList::IsEnabled(features::kAutoFetchOnNetErrorPage);
+         base::FeatureList::IsEnabled(features::kAutoFetchOnNetErrorPage) &&
+         offline_pages::IsOfflinePagesEnabled();
 }
 #else   // OS_ANDROID
 bool IsAutoFetchFeatureEnabled() {
diff --git a/chrome/services/app_service/public/mojom/types.mojom b/chrome/services/app_service/public/mojom/types.mojom
index 281117f8..be48fb46 100644
--- a/chrome/services/app_service/public/mojom/types.mojom
+++ b/chrome/services/app_service/public/mojom/types.mojom
@@ -153,6 +153,7 @@
   kFromAppListQueryContextMenu,  // Query-dependent results; context menu.
   kFromAppListRecommendation,    // Query-less recommendations (smaller icons).
   kFromKioskNextHome,            // Kiosk Next Home app.
+  kFromParentalControls,         // Parental Controls Settings Section.
 };
 
 enum TriState {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 2f8baaed..2fd5b33 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1179,7 +1179,6 @@
       "//crypto:platform",
       "//crypto:test_support",
       "//device/bluetooth:mocks",
-      "//device/usb/public/cpp:test_support",
       "//google_apis:test_support",
       "//media:test_support",
       "//media/cast:test_support",
@@ -1936,6 +1935,8 @@
         "../browser/chromeos/login/test/enrollment_ui_mixin.h",
         "../browser/chromeos/login/test/fake_gaia_mixin.cc",
         "../browser/chromeos/login/test/fake_gaia_mixin.h",
+        "../browser/chromeos/login/test/guest_session_mixin.cc",
+        "../browser/chromeos/login/test/guest_session_mixin.h",
         "../browser/chromeos/login/test/hid_controller_mixin.cc",
         "../browser/chromeos/login/test/hid_controller_mixin.h",
         "../browser/chromeos/login/test/https_forwarder.cc",
@@ -3091,9 +3092,7 @@
 
   # Pixeltests only support win.
   if (is_win) {
-    sources += [
-      "../test/pixel/skia_gold_pixel_diff_unittest.cc",
-    ]
+    sources += [ "../test/pixel/skia_gold_pixel_diff_unittest.cc" ]
   }
 
   if (!is_android) {
@@ -3211,7 +3210,6 @@
     "//crypto:platform",
     "//crypto:test_support",
     "//device/bluetooth:mocks",
-    "//device/usb/public/cpp:test_support",
     "//extensions/buildflags",
     "//google_apis",
     "//gpu:test_support",
@@ -3221,6 +3219,7 @@
     "//net:test_support",
     "//ppapi/buildflags",
     "//services/data_decoder/public/cpp:test_support",
+    "//services/device/public/cpp/test:test_support",
     "//services/network:test_support",
     "//services/network/public/cpp",
     "//skia",
@@ -3275,12 +3274,10 @@
       "../browser/offline_pages/background_loader_offliner_unittest.cc",
       "../browser/offline_pages/download_archive_manager_unittest.cc",
       "../browser/offline_pages/offline_page_mhtml_archiver_unittest.cc",
-      "../browser/offline_pages/offline_page_request_handler_unittest.cc",
       "../browser/offline_pages/offline_page_tab_helper_unittest.cc",
       "../browser/offline_pages/offline_page_utils_unittest.cc",
       "../browser/offline_pages/prefetch/offline_metrics_collector_impl_unittest.cc",
       "../browser/offline_pages/prefetch/prefetch_background_task_handler_impl_unittest.cc",
-      "../browser/offline_pages/prefetch/prefetch_instance_id_proxy_unittest.cc",
       "../browser/offline_pages/prefetch/prefetched_pages_notifier_unittest.cc",
       "../browser/offline_pages/prefetch/thumbnail_fetcher_impl_unittest.cc",
       "../browser/offline_pages/recent_tab_helper_unittest.cc",
@@ -3297,6 +3294,14 @@
       "//components/offline_pages/core/background:test_support",
       "//components/offline_pages/core/prefetch:test_support",
     ]
+    if (defined(notouch_build) && notouch_build) {
+      defines += [ "DISABLE_OFFLINE_PAGES_TOUCHLESS" ]
+    } else {
+      sources += [
+        "../browser/offline_pages/offline_page_request_handler_unittest.cc",
+        "../browser/offline_pages/prefetch/prefetch_instance_id_proxy_unittest.cc",
+      ]
+    }
   }
 
   if (enable_feed_in_chrome) {
@@ -6073,17 +6078,19 @@
       "pixel/demo/skia_gold_demo_pixeltest.cc",
     ]
     configs += [ "//build/config:precompiled_headers" ]
-    defines = [
-      "HAS_OUT_OF_PROC_TEST_RUNNER",
-    ]
+    defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
     deps = [
-      ":test_support",
       ":browser_tests_runner",
+      ":test_support",
     ]
     if (is_win) {
-      data = [ "//tools/skia_goldctl/goldctl.exe" ]
+      data = [
+        "//tools/skia_goldctl/goldctl.exe",
+      ]
     } else {
-      data = [ "//tools/skia_goldctl/goldctl" ]
+      data = [
+        "//tools/skia_goldctl/goldctl",
+      ]
     }
   }
 }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java
index 12564c9..513b95b 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java
@@ -22,6 +22,7 @@
 import org.chromium.base.test.util.RestrictionSkipCheck;
 import org.chromium.base.test.util.SkipCheck;
 import org.chromium.chrome.browser.ChromeVersionInfo;
+import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.test.util.ChromeRestriction;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.content_public.browser.test.ContentJUnit4ClassRunner;
@@ -207,6 +208,9 @@
                         restriction, ChromeRestriction.RESTRICTION_TYPE_VR_SETTINGS_SERVICE)) {
                 return !isVrSettingsServiceEnabled();
             }
+            if (TextUtils.equals(restriction, ChromeRestriction.RESTRICTION_TYPE_REQUIRES_TOUCH)) {
+                return FeatureUtilities.isNoTouchModeEnabled();
+            }
             return false;
         }
     }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeRestriction.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeRestriction.java
index 62d8321..c2031a7 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeRestriction.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeRestriction.java
@@ -32,4 +32,6 @@
     public static final String RESTRICTION_TYPE_SVR = "Smartphone_VR";
     /** Specifies the test is only valid if the VR settings service is enabled */
     public static final String RESTRICTION_TYPE_VR_SETTINGS_SERVICE = "VR_Settings_Service";
+    /** Specifies the test is not valid on touchless devices. */
+    public static final String RESTRICTION_TYPE_REQUIRES_TOUCH = "Not_Touchless";
 }
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc
index c0b9de9..fd0cd5f1 100644
--- a/chrome/test/base/testing_profile.cc
+++ b/chrome/test/base/testing_profile.cc
@@ -938,11 +938,21 @@
   return schema_registry_service_.get();
 }
 
-#if !defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS)
+policy::UserCloudPolicyManagerChromeOS*
+TestingProfile::GetUserCloudPolicyManagerChromeOS() {
+  return nullptr;
+}
+
+policy::ActiveDirectoryPolicyManager*
+TestingProfile::GetActiveDirectoryPolicyManager() {
+  return nullptr;
+}
+#else
 policy::UserCloudPolicyManager* TestingProfile::GetUserCloudPolicyManager() {
   return user_cloud_policy_manager_.get();
 }
-#endif
+#endif  // defined(OS_CHROMEOS)
 
 policy::ProfilePolicyConnector* TestingProfile::GetProfilePolicyConnector() {
   return profile_policy_connector_.get();
diff --git a/chrome/test/base/testing_profile.h b/chrome/test/base/testing_profile.h
index 2bd579b..f9933fa 100644
--- a/chrome/test/base/testing_profile.h
+++ b/chrome/test/base/testing_profile.h
@@ -341,9 +341,14 @@
   base::Time GetStartTime() const override;
   ProfileKey* GetProfileKey() const override;
   policy::SchemaRegistryService* GetPolicySchemaRegistryService() override;
-#if !defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS)
+  policy::UserCloudPolicyManagerChromeOS* GetUserCloudPolicyManagerChromeOS()
+      override;
+  policy::ActiveDirectoryPolicyManager* GetActiveDirectoryPolicyManager()
+      override;
+#else
   policy::UserCloudPolicyManager* GetUserCloudPolicyManager() override;
-#endif
+#endif  // defined(OS_CHROMEOS)
   policy::ProfilePolicyConnector* GetProfilePolicyConnector() override;
   const policy::ProfilePolicyConnector* GetProfilePolicyConnector()
       const override;
diff --git a/chrome/test/data/local_ntp/local_ntp_browsertest.html b/chrome/test/data/local_ntp/local_ntp_browsertest.html
index 36c9856c..bc59ce7d 100644
--- a/chrome/test/data/local_ntp/local_ntp_browsertest.html
+++ b/chrome/test/data/local_ntp/local_ntp_browsertest.html
@@ -95,7 +95,7 @@
         <span id="edit-bg-text"></span>
       </div>
 
-      <div id="custom-bg-attr"></div>
+      <a id="custom-bg-attr"></a>
     </div>
 
     <dialog div id="edit-bg-dialog" class="customize-dialog">
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index a83eb60..74b8c44a 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -340,6 +340,36 @@
   mocha.run();
 });
 
+GEN('#if defined(OS_CHROMEOS)');
+/**
+ * Test fixture for CrOS specific behavior in
+ * chrome/browser/resources/settings/autofill_page/passwords_section.html.
+ * See http://crbug.com/917178 for details.
+ * @constructor
+ * @extends {CrSettingsBrowserTest}
+ */
+function CrSettingsPasswordsSectionTest_Cros() {}
+
+CrSettingsPasswordsSectionTest_Cros.prototype = {
+  __proto__: CrSettingsBrowserTest.prototype,
+
+  /** @override */
+  browsePreload: 'chrome://settings/autofill_page/passwords_section.html',
+
+  /** @override */
+  extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
+    '../test_browser_proxy.js',
+    'passwords_and_autofill_fake_data.js',
+    'passwords_section_test_cros.js',
+    'test_password_manager_proxy.js',
+  ]),
+};
+
+TEST_F('CrSettingsPasswordsSectionTest_Cros', 'All', function() {
+  mocha.run();
+});
+GEN('#endif  // defined(OS_CHROMEOS)');
+
 /**
  * Test fixture for
  * chrome/browser/resources/settings/autofill_page/payments_section.html.
@@ -560,8 +590,7 @@
   ]),
 };
 
-// Test is consistently failing. http://crbug.com/960837
-TEST_F('CrSettingsPeoplePageKerberosAccountsTest', 'DISABLED_All', function() {
+TEST_F('CrSettingsPeoplePageKerberosAccountsTest', 'All', function() {
   mocha.run();
 });
 
diff --git a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js
index a29a6d5..8a8061e31 100644
--- a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js
+++ b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js
@@ -6,7 +6,6 @@
  * Used to create fake data for both passwords and autofill.
  * These sections are related, so it made sense to share this.
  */
-
 function FakeDataMaker() {}
 
 /**
@@ -141,6 +140,96 @@
   });
 };
 
+
+/**
+ * Helper class for creating password-section sub-element from fake data and
+ * appending them to the document.
+ */
+class PasswordSectionElementFactory {
+  /**
+   * @param {HTMLDocument} document The test's |document| object.
+   */
+  constructor(document) {
+    this.document = document;
+  }
+
+  /**
+   * Helper method used to create a password section for the given lists.
+   * @param {!PasswordManagerProxy} passwordManager
+   * @param {!Array<!chrome.passwordsPrivate.PasswordUiEntry>} passwordList
+   * @param {!Array<!chrome.passwordsPrivate.ExceptionEntry>} exceptionList
+   * @return {!Object}
+   */
+  createPasswordsSection(passwordManager, passwordList, exceptionList) {
+    // Override the PasswordManagerProxy data for testing.
+    passwordManager.data.passwords = passwordList;
+    passwordManager.data.exceptions = exceptionList;
+
+    // Create a passwords-section to use for testing.
+    const passwordsSection = this.document.createElement('passwords-section');
+    this.document.body.appendChild(passwordsSection);
+    Polymer.dom.flush();
+    return passwordsSection;
+  }
+
+  /**
+   * Helper method used to create a password list item.
+   * @param {!chrome.passwordsPrivate.PasswordUiEntry} passwordEntry
+   * @return {!Object}
+   */
+  createPasswordListItem(passwordEntry) {
+    const passwordListItem = this.document.createElement('password-list-item');
+    passwordListItem.item = {entry: passwordEntry, password: ''};
+    this.document.body.appendChild(passwordListItem);
+    Polymer.dom.flush();
+    return passwordListItem;
+  }
+
+  /**
+   * Helper method used to create a password editing dialog.
+   * @param {!chrome.passwordsPrivate.PasswordUiEntry} passwordEntry
+   * @return {!Object}
+   */
+  createPasswordEditDialog(passwordEntry) {
+    const passwordDialog = this.document.createElement('password-edit-dialog');
+    passwordDialog.item = {entry: passwordEntry, password: ''};
+    this.document.body.appendChild(passwordDialog);
+    Polymer.dom.flush();
+    return passwordDialog;
+  }
+
+  /**
+   * Helper method used to create an export passwords dialog.
+   * @return {!Object}
+   */
+  createExportPasswordsDialog(passwordManager) {
+    passwordManager.requestExportProgressStatus = callback => {
+      callback(chrome.passwordsPrivate.ExportProgressStatus.NOT_STARTED);
+    };
+    passwordManager.addPasswordsFileExportProgressListener = callback => {
+      passwordManager.progressCallback = callback;
+    };
+    passwordManager.removePasswordsFileExportProgressListener = () => {};
+    passwordManager.exportPasswords = (callback) => {
+      callback();
+    };
+
+    const dialog = this.document.createElement('passwords-export-dialog');
+    this.document.body.appendChild(dialog);
+
+    Polymer.dom.flush();
+
+    if (cr.isChromeOS) {
+      dialog.tokenRequestManager =
+          new settings.BlockingRequestManager(function() {
+            // |this| is expected to be the BlockingRequestManager instance.
+            this.resolve();
+          });
+    }
+    return dialog;
+  }
+}
+
 /** @constructor */
 function PasswordManagerExpectations() {
   this.requested = {
diff --git a/chrome/test/data/webui/settings/passwords_section_test.js b/chrome/test/data/webui/settings/passwords_section_test.js
index add578e..72eef1a 100644
--- a/chrome/test/data/webui/settings/passwords_section_test.js
+++ b/chrome/test/data/webui/settings/passwords_section_test.js
@@ -66,75 +66,12 @@
   }
 
   /**
-   * Helper method used to create a password section for the given lists.
-   * @param {!PasswordManagerProxy} passwordManager
-   * @param {!Array<!chrome.passwordsPrivate.PasswordUiEntry>} passwordList
-   * @param {!Array<!chrome.passwordsPrivate.ExceptionEntry>} exceptionList
-   * @return {!Object}
-   * @private
+   * Extracts the first password-list-item in the a password-section element.
+   * @param {!Element} passwordsSection
    */
-  function createPasswordsSection(
-      passwordManager, passwordList, exceptionList) {
-    // Override the PasswordManagerProxy data for testing.
-    passwordManager.data.passwords = passwordList;
-    passwordManager.data.exceptions = exceptionList;
-
-    // Create a passwords-section to use for testing.
-    const passwordsSection = document.createElement('passwords-section');
-    document.body.appendChild(passwordsSection);
-    Polymer.dom.flush();
-    return passwordsSection;
-  }
-
-  /**
-   * Helper method used to create a password list item.
-   * @param {!chrome.passwordsPrivate.PasswordUiEntry} passwordItem
-   * @return {!Object}
-   * @private
-   */
-  function createPasswordListItem(passwordItem) {
-    const passwordListItem = document.createElement('password-list-item');
-    passwordListItem.item = {entry: passwordItem, password: ''};
-    document.body.appendChild(passwordListItem);
-    Polymer.dom.flush();
-    return passwordListItem;
-  }
-
-  /**
-   * Helper method used to create a password editing dialog.
-   * @param {!chrome.passwordsPrivate.PasswordUiEntry} passwordItem
-   * @return {!Object}
-   * @private
-   */
-  function createPasswordDialog(passwordItem) {
-    const passwordDialog = document.createElement('password-edit-dialog');
-    passwordDialog.item = {entry: passwordItem, password: ''};
-    document.body.appendChild(passwordDialog);
-    Polymer.dom.flush();
-    return passwordDialog;
-  }
-
-  /**
-   * Helper method used to create an export passwords dialog.
-   * @return {!Object}
-   * @private
-   */
-  function createExportPasswordsDialog(passwordManager) {
-    passwordManager.requestExportProgressStatus = callback => {
-      callback(chrome.passwordsPrivate.ExportProgressStatus.NOT_STARTED);
-    };
-    passwordManager.addPasswordsFileExportProgressListener = callback => {
-      passwordManager.progressCallback = callback;
-    };
-    passwordManager.removePasswordsFileExportProgressListener = () => {};
-    passwordManager.exportPasswords = (callback) => {
-      callback();
-    };
-
-    const dialog = document.createElement('passwords-export-dialog');
-    document.body.appendChild(dialog);
-    Polymer.dom.flush();
-    return dialog;
+  function getFirstPasswordListItem(passwordsSection) {
+    // The first child is a template, skip and get the real 'first child'.
+    return Polymer.dom(passwordsSection.$.passwordList).children[1];
   }
 
   /**
@@ -169,11 +106,15 @@
     /** @type {TestPasswordManagerProxy} */
     let passwordManager = null;
 
+    /** @type {PasswordSectionElementFactory} */
+    let elementFactory = null;
+
     setup(function() {
       PolymerTest.clearBody();
       // Override the PasswordManagerImpl for testing.
       passwordManager = new TestPasswordManagerProxy();
       PasswordManagerImpl.instance_ = passwordManager;
+      elementFactory = new PasswordSectionElementFactory(document);
     });
 
     test('testPasswordsExtensionIndicator', function() {
@@ -190,7 +131,8 @@
     });
 
     test('verifyNoSavedPasswords', function() {
-      const passwordsSection = createPasswordsSection(passwordManager, [], []);
+      const passwordsSection =
+          elementFactory.createPasswordsSection(passwordManager, [], []);
 
       validatePasswordList(passwordsSection.$.passwordList, []);
 
@@ -208,8 +150,8 @@
         FakeDataMaker.passwordEntry('site2.com', 'luigi', 8),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
 
       // Assert that the data is passed into the iron list. If this fails,
       // then other expectations will also fail.
@@ -231,8 +173,8 @@
         FakeDataMaker.passwordEntry('website.com', 'mario', 70, 2)
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
 
       validatePasswordList(passwordsSection.$.passwordList, passwordList);
       // Simulate 'longwebsite.com' being removed from the list.
@@ -256,8 +198,8 @@
         FakeDataMaker.passwordEntry('longwebsite.com', 'peach', 7, 1),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
 
       validatePasswordList(passwordsSection.$.passwordList, passwordList);
       // Simulate 'website.com' being added to the list.
@@ -273,7 +215,8 @@
     // Test verifies that removing one out of two passwords for the same website
     // will update the elements.
     test('verifyPasswordListRemoveSameWebsite', function() {
-      const passwordsSection = createPasswordsSection(passwordManager, [], []);
+      const passwordsSection =
+          elementFactory.createPasswordsSection(passwordManager, [], []);
 
       // Set-up initial list.
       let passwordList = [
@@ -313,12 +256,10 @@
         FakeDataMaker.passwordEntry('six', 'one', 6),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
 
-      // The first child is a template, skip and get the real 'first child'.
-      const firstNode =
-          Polymer.dom(passwordsSection.$.passwordList).children[1];
+      const firstNode = getFirstPasswordListItem(passwordsSection);
       assert(firstNode);
       const firstPassword = passwordList[0];
 
@@ -347,8 +288,8 @@
         FakeDataMaker.passwordEntry('six-show.com', 'one', 6),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
       passwordsSection.filter = 'SHow';
       Polymer.dom.flush();
 
@@ -372,8 +313,8 @@
         FakeDataMaker.passwordEntry('six-show.com', 'one', 6, 5),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
       passwordsSection.filter = 'SHow';
       Polymer.dom.flush();
 
@@ -411,8 +352,8 @@
         FakeDataMaker.exceptionEntry('plus.google.comshow'),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, [], exceptionList);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, [], exceptionList);
       passwordsSection.filter = 'shOW';
       Polymer.dom.flush();
 
@@ -429,7 +370,8 @@
     });
 
     test('verifyNoPasswordExceptions', function() {
-      const passwordsSection = createPasswordsSection(passwordManager, [], []);
+      const passwordsSection =
+          elementFactory.createPasswordsSection(passwordManager, [], []);
 
       validateExceptionList(
           getDomRepeatChildren(passwordsSection.$.passwordExceptionsList), []);
@@ -447,8 +389,8 @@
         FakeDataMaker.exceptionEntry('plus.google.com'),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, [], exceptionList);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, [], exceptionList);
 
       validateExceptionList(
           getDomRepeatChildren(passwordsSection.$.passwordExceptionsList),
@@ -468,8 +410,8 @@
         FakeDataMaker.exceptionEntry('plus.google.com'),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, [], exceptionList);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, [], exceptionList);
 
       validateExceptionList(
           getDomRepeatChildren(passwordsSection.$.passwordExceptionsList),
@@ -499,8 +441,8 @@
         FakeDataMaker.exceptionEntry('plus.google.com'),
       ];
 
-      const passwordsSection =
-          createPasswordsSection(passwordManager, [], exceptionList);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, [], exceptionList);
 
       const exceptions =
           getDomRepeatChildren(passwordsSection.$.passwordExceptionsList);
@@ -534,7 +476,7 @@
     test('verifyFederatedPassword', function() {
       const item = FakeDataMaker.passwordEntry('goo.gl', 'bart', 0);
       item.federationText = 'with chromium.org';
-      const passwordDialog = createPasswordDialog(item);
+      const passwordDialog = elementFactory.createPasswordEditDialog(item);
 
       Polymer.dom.flush();
 
@@ -548,7 +490,7 @@
       const PASSWORD = 'bAn@n@5';
       const item =
           FakeDataMaker.passwordEntry('goo.gl', 'bart', PASSWORD.length);
-      const passwordDialog = createPasswordDialog(item);
+      const passwordDialog = elementFactory.createPasswordEditDialog(item);
 
       assertFalse(passwordDialog.$.showPasswordButton.hidden);
 
@@ -565,7 +507,7 @@
       const PASSWORD = 'bAn@n@5';
       const item =
           FakeDataMaker.passwordEntry('goo.gl', 'bart', PASSWORD.length);
-      const passwordListItem = createPasswordListItem(item);
+      const passwordListItem = elementFactory.createPasswordListItem(item);
       // Hidden passwords should be disabled.
       assertTrue(passwordListItem.$$('#password').disabled);
 
@@ -587,7 +529,8 @@
     // password.
     test('onShowSavedPasswordEditDialog', function() {
       const expectedItem = FakeDataMaker.passwordEntry('goo.gl', 'bart', 8, 1);
-      const passwordDialog = createPasswordDialog(expectedItem);
+      const passwordDialog =
+          elementFactory.createPasswordEditDialog(expectedItem);
       assertEquals('', passwordDialog.item.password);
 
       passwordManager.setPlaintextPassword('password');
@@ -600,7 +543,8 @@
 
     test('onShowSavedPasswordListItem', function() {
       const expectedItem = FakeDataMaker.passwordEntry('goo.gl', 'bart', 8, 1);
-      const passwordListItem = createPasswordListItem(expectedItem);
+      const passwordListItem =
+          elementFactory.createPasswordListItem(expectedItem);
       assertEquals('', passwordListItem.item.password);
 
       passwordManager.setPlaintextPassword('password');
@@ -613,14 +557,12 @@
 
     test('closingPasswordsSectionHidesUndoToast', function(done) {
       const passwordEntry = FakeDataMaker.passwordEntry('goo.gl', 'bart', 1);
-      const passwordsSection =
-          createPasswordsSection(passwordManager, [passwordEntry], []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, [passwordEntry], []);
 
       // Click the remove button on the first password and assert that an undo
       // toast is shown.
-      const firstNode =
-          Polymer.dom(passwordsSection.$.passwordList).children[1];
-      firstNode.$$('#passwordMenu').click();
+      getFirstPasswordListItem(passwordsSection).$$('#passwordMenu').click();
       passwordsSection.$.menuRemovePassword.click();
       assertTrue(passwordsSection.$.undoToast.open);
 
@@ -637,8 +579,8 @@
       const passwordList = [
         FakeDataMaker.passwordEntry('googoo.com', 'Larry', 1),
       ];
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
 
       validatePasswordList(passwordsSection.$.passwordList, passwordList);
       assertFalse(passwordsSection.$.menuExportPassword.hidden);
@@ -649,8 +591,8 @@
     // passwords.
     test('noExportIfNoPasswords', function(done) {
       const passwordList = [];
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
 
       validatePasswordList(passwordsSection.$.passwordList, passwordList);
       assertTrue(passwordsSection.$.menuExportPassword.hidden);
@@ -663,8 +605,8 @@
       const passwordList = [
         FakeDataMaker.passwordEntry('googoo.com', 'Larry', 1),
       ];
-      const passwordsSection =
-          createPasswordsSection(passwordManager, passwordList, []);
+      const passwordsSection = elementFactory.createPasswordsSection(
+          passwordManager, passwordList, []);
 
       // The export dialog calls requestExportProgressStatus() when opening.
       passwordManager.requestExportProgressStatus = (callback) => {
@@ -675,9 +617,10 @@
       passwordsSection.$.menuExportPassword.click();
     });
 
-    // Test that tapping "Export passwords..." notifies the browser accordingly
+    // Test that tapping "Export passwords..." notifies the browser.
     test('startExport', function(done) {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
 
       passwordManager.exportPasswords = (callback) => {
         callback();
@@ -690,7 +633,8 @@
     // Test the export flow. If exporting is fast, we should skip the
     // in-progress view altogether.
     test('exportFlowFast', function(done) {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
       const progressCallback = passwordManager.progressCallback;
 
       // Use this to freeze the delayed progress bar and avoid flakiness.
@@ -717,7 +661,8 @@
 
     // The error view is shown when an error occurs.
     test('exportFlowError', function(done) {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
       const progressCallback = passwordManager.progressCallback;
 
       // Use this to freeze the delayed progress bar and avoid flakiness.
@@ -749,39 +694,47 @@
 
     // The error view allows to retry.
     test('exportFlowErrorRetry', function(done) {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
       const progressCallback = passwordManager.progressCallback;
-
       // Use this to freeze the delayed progress bar and avoid flakiness.
       let mockTimer = new MockTimer();
-      mockTimer.install();
 
-      exportDialog.$$('#exportPasswordsButton').click();
-      progressCallback(
-          {status: chrome.passwordsPrivate.ExportProgressStatus.IN_PROGRESS});
-      progressCallback({
-        status:
-            chrome.passwordsPrivate.ExportProgressStatus.FAILED_WRITE_FAILED,
-        folderName: 'tmp',
+      new Promise(resolve => {
+        mockTimer.install();
+
+        passwordManager.exportPasswords = resolve;
+        exportDialog.$$('#exportPasswordsButton').click();
+      }).then(() => {
+        // This wait allows the BlockingRequestManager to process the click if
+        // the test is running in ChromeOS.
+        progressCallback(
+            {status: chrome.passwordsPrivate.ExportProgressStatus.IN_PROGRESS});
+        progressCallback({
+          status:
+              chrome.passwordsPrivate.ExportProgressStatus.FAILED_WRITE_FAILED,
+          folderName: 'tmp',
+        });
+
+        Polymer.dom.flush();
+        // Test that the error dialog is shown.
+        assertTrue(exportDialog.$$('#dialog_error').open);
+        // Test that clicking retry will start a new export.
+        passwordManager.exportPasswords = (callback) => {
+          callback();
+          done();
+        };
+        exportDialog.$$('#tryAgainButton').click();
+
+        mockTimer.uninstall();
       });
-
-      Polymer.dom.flush();
-      // Test that the error dialog is shown.
-      assertTrue(exportDialog.$$('#dialog_error').open);
-      // Test that clicking retry will start a new export.
-      passwordManager.exportPasswords = (callback) => {
-        callback();
-        done();
-      };
-      exportDialog.$$('#tryAgainButton').click();
-
-      mockTimer.uninstall();
     });
 
     // Test the export flow. If exporting is slow, Chrome should show the
     // in-progress dialog for at least 1000ms.
     test('exportFlowSlow', function(done) {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
       const progressCallback = passwordManager.progressCallback;
 
       let mockTimer = new MockTimer();
@@ -825,7 +778,8 @@
     // Test that canceling the dialog while exporting will also cancel the
     // export on the browser.
     test('cancelExport', function(done) {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
       const progressCallback = passwordManager.progressCallback;
 
       passwordManager.cancelExportPasswords = () => {
@@ -857,7 +811,8 @@
 
     // The export dialog is dismissable.
     test('exportDismissable', function(done) {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
 
       assertTrue(exportDialog.$$('#dialog_start').open);
       exportDialog.$$('#cancelButton').click();
@@ -868,7 +823,8 @@
     });
 
     test('fires close event when canceled', () => {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
       const wait = test_util.eventToPromise(
           'passwords-export-dialog-close', exportDialog);
       exportDialog.$$('#cancelButton').click();
@@ -876,7 +832,8 @@
     });
 
     test('fires close event after export complete', () => {
-      const exportDialog = createExportPasswordsDialog(passwordManager);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
       const wait = test_util.eventToPromise(
           'passwords-export-dialog-close', exportDialog);
       exportDialog.$$('#exportPasswordsButton').click();
diff --git a/chrome/test/data/webui/settings/passwords_section_test_cros.js b/chrome/test/data/webui/settings/passwords_section_test_cros.js
new file mode 100644
index 0000000..0ff1f05
--- /dev/null
+++ b/chrome/test/data/webui/settings/passwords_section_test_cros.js
@@ -0,0 +1,217 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Tests of CrOS specific saved password settings. Note that
+ * although these tests for only for CrOS, they are testing a CrOS specific
+ * aspects of the implementation of a browser feature rather than an entirely
+ * native CrOS feature. See http://crbug.com/917178 for more detail.
+ */
+
+cr.define('settings_passwords_section_cros', function() {
+  suite('PasswordsSection_Cros', function() {
+    /**
+     * Promise resolved when a saved password is retrieved.
+     * @type {Promise}
+     */
+    let requestPromise = null;
+
+    /**
+     * Promise resolved when an auth token request is made.
+     * @type {Promise}
+     */
+    let passwordPromise = null;
+
+    /**
+     * Implementation of PasswordSectionElementFactory with parameters that help
+     * tests to track auth token and saved password requests.
+     */
+    class CrosPasswordSectionElementFactory extends
+        PasswordSectionElementFactory {
+      /**
+       * @param {HTMLDocument} document The test's |document| object.
+       * @param {request: Function} tokenRequestManager Fake for
+       *     BlockingRequestManager provided to subelements of password-section
+       *     that normally have their tokenRequestManager property bound to the
+       *     password section's tokenRequestManager_ property. Note:
+       *     Tests of the password-section element need to use the full
+       *     implementation, which is created by default when the element is
+       *     attached.
+       * @param {ShowPasswordBehavior.UiEntryWithPassword} passwordItem Wrapper
+       *     for a PasswordUiEntry and the corresponding password.
+       */
+      constructor(document, tokenRequestManager, passwordItem) {
+        super(document);
+        this.tokenRequestManager = tokenRequestManager;
+        this.passwordItem = passwordItem;
+      }
+
+      /** @override */
+      createPasswordsSection(passwordManager) {
+        return super.createPasswordsSection(passwordManager, [], []);
+      }
+
+      /** @override */
+      createPasswordEditDialog() {
+        return this.decorateShowPasswordElement_('password-edit-dialog');
+      }
+
+      /** @override */
+      createPasswordListItem() {
+        return this.decorateShowPasswordElement_('password-list-item');
+      }
+
+      /** @override */
+      createExportPasswordsDialog(passwordManager) {
+        return Object.assign(
+            super.createExportPasswordsDialog(passwordManager),
+            {tokenRequestManager: this.tokenRequestManager});
+      }
+
+      /**
+       * Creates an element with ShowPasswordBehavior, decorates it with
+       * with the testing data provided in the constructor, and attaches it to
+       * |this.document|.
+       * @param {string} showPasswordElementName Tag name of a Polymer element
+       *     with ShowPasswordBehavior.
+       * @return {!HTMLElement} Element decorated with test data.
+       */
+      decorateShowPasswordElement_(showPasswordElementName) {
+        const element = this.document.createElement(showPasswordElementName);
+        element.item = this.passwordItem;
+        element.tokenRequestManager = this.tokenRequestManager;
+        this.document.body.appendChild(element);
+        Polymer.dom.flush();
+        return element;
+      }
+    }
+
+    function fail() {
+      throw new Error();
+    }
+
+    /** @type {TestPasswordManagerProxy} */
+    let passwordManager = null;
+
+    /** @type {CrosPasswordSectionElementFactory} */
+    let elementFactory = null;
+
+    setup(function() {
+      PolymerTest.clearBody();
+      // Override the PasswordManagerImpl for testing.
+      passwordManager = new TestPasswordManagerProxy();
+      PasswordManagerImpl.instance_ = passwordManager;
+
+      // Define a fake BlockingRequestManager to track when a token request
+      // comes in by resolving requestPromise.
+      let requestManager;
+      requestPromise = new Promise(resolve => {
+        requestManager = {request: resolve};
+      });
+
+      /**
+       * @type {ShowPasswordBehavior.UiEntryWithPassword} Password item (i.e.
+       *      entry with password text) that overrides the password property
+       *      with get/set to track receipt of a saved password and make that
+       *      information available by resolving |passwordPromise|.
+       */
+      let passwordItem;
+      passwordPromise = new Promise(resolve => {
+        passwordItem = {
+          entry: FakeDataMaker.passwordEntry(),
+          set password(newPassword) {
+            if (newPassword && newPassword != this.password_) {
+              resolve(newPassword);
+            }
+            this.password_ = newPassword;
+          },
+          get password() {
+            return this.password_;
+          }
+        };
+      });
+
+      elementFactory = new CrosPasswordSectionElementFactory(
+          document, requestManager, passwordItem);
+    });
+
+    test('export passwords button requests auth token', function() {
+      passwordPromise.then(fail);
+      const exportDialog =
+          elementFactory.createExportPasswordsDialog(passwordManager);
+      exportDialog.$$('#exportPasswordsButton').click();
+      return requestPromise;
+    });
+
+    test(
+        'list-item does not request token if it gets password to show',
+        function() {
+          requestPromise.then(fail);
+          const passwordListItem = elementFactory.createPasswordListItem();
+          passwordManager.setPlaintextPassword('password');
+          passwordListItem.$$('#showPasswordButton').click();
+          return passwordPromise;
+        });
+
+    test(
+        'list-item requests token if it does not get password to show',
+        function() {
+          passwordPromise.then(fail);
+          const passwordListItem = elementFactory.createPasswordListItem();
+          passwordManager.setPlaintextPassword('');
+          passwordListItem.$$('#showPasswordButton').click();
+          return requestPromise;
+        });
+
+    test(
+        'edit-dialog does not request token if it gets password to show',
+        function() {
+          requestPromise.then(fail);
+          const passwordEditDialog = elementFactory.createPasswordEditDialog();
+          passwordManager.setPlaintextPassword('password');
+          passwordEditDialog.$$('#showPasswordButton').click();
+          return passwordPromise;
+        });
+
+    test(
+        'edit-dialog requests token if it does not get password to show',
+        function() {
+          passwordPromise.then(fail);
+          const passwordEditDialog = elementFactory.createPasswordEditDialog();
+          passwordManager.setPlaintextPassword('');
+          passwordEditDialog.$$('#showPasswordButton').click();
+          return requestPromise;
+        });
+
+    test('password-prompt-dialog appears on auth token request', function() {
+      const passwordsSection =
+          elementFactory.createPasswordsSection(passwordManager);
+      assertTrue(!passwordsSection.$$('settings-password-prompt-dialog'));
+      passwordsSection.tokenRequestManager_.request();
+      Polymer.dom.flush();
+      assertTrue(!!passwordsSection.$$('settings-password-prompt-dialog'));
+    });
+
+    test(
+        'password-section resolves request on auth token receipt',
+        function(done) {
+          const passwordsSection =
+              elementFactory.createPasswordsSection(passwordManager);
+          passwordsSection.tokenRequestManager_.request(done);
+          passwordsSection.authToken_ = 'auth token';
+        });
+
+    test(
+        'password-section only triggers callback on most recent request',
+        function(done) {
+          const passwordsSection =
+              elementFactory.createPasswordsSection(passwordManager);
+          // Make request that SHOULD NOT be resolved.
+          passwordsSection.tokenRequestManager_.request(fail);
+          // Make request that should be resolved.
+          passwordsSection.tokenRequestManager_.request(done);
+          passwordsSection.authToken_ = 'auth token';
+        });
+  });
+});
diff --git a/chrome/test/data/webui/settings/people_page_kerberos_accounts_test.js b/chrome/test/data/webui/settings/people_page_kerberos_accounts_test.js
index 855e0a44..3b06cf9 100644
--- a/chrome/test/data/webui/settings/people_page_kerberos_accounts_test.js
+++ b/chrome/test/data/webui/settings/people_page_kerberos_accounts_test.js
@@ -9,9 +9,11 @@
       super([
         'getAccounts',
         'addAccount',
-        'reauthenticateAccount',
         'removeAccount',
       ]);
+
+      // Simulated error from a addKerberosAccount call.
+      this.addAccountError = ErrorType.kNone;
     }
 
     /** @override */
@@ -33,13 +35,9 @@
     }
 
     /** @override */
-    addAccount() {
-      this.methodCalled('addAccount');
-    }
-
-    /** @override */
-    reauthenticateAccount(principalName) {
-      this.methodCalled('reauthenticateAccount', principalName);
+    addAccount(principalName, password) {
+      this.methodCalled('addAccount', [principalName, password]);
+      return Promise.resolve(this.addAccountError);
     }
 
     /** @override */
@@ -48,6 +46,7 @@
     }
   }
 
+  // Tests for the Kerberos Accounts settings page.
   suite('KerberosAccountsTests', function() {
     let browserProxy = null;
     let kerberosAccounts = null;
@@ -79,22 +78,34 @@
     });
 
     test('AddAccount', function() {
+      assertTrue(!kerberosAccounts.$$('kerberos-add-account-dialog'));
       assertFalse(kerberosAccounts.$$('#add-account-button').disabled);
       kerberosAccounts.$$('#add-account-button').click();
-      assertEquals(1, browserProxy.getCallCount('addAccount'));
+      Polymer.dom.flush();
+      addDialog = kerberosAccounts.$$('kerberos-add-account-dialog');
+      assertTrue(!!addDialog);
+      assertEquals('', addDialog.username);
     });
 
     test('ReauthenticateAccount', function() {
+      // Wait until accounts are loaded.
       return browserProxy.whenCalled('getAccounts').then(() => {
         Polymer.dom.flush();
+
+        // The kerberos-add-account-dialog shouldn't be open yet.
+        assertTrue(!kerberosAccounts.$$('kerberos-add-account-dialog'));
+
+        // Click "Sign-In" on an existing account.
         // Note that both accounts have a reauth button, but [0] is hidden, so
         // click [1] (clicking a hidden button works, but it feels weird).
         kerberosAccounts.root.querySelectorAll('.reauth-button')[1].click();
-        assertEquals(1, browserProxy.getCallCount('reauthenticateAccount'));
-        return browserProxy.whenCalled('reauthenticateAccount')
-            .then((principalName) => {
-              assertEquals('user2@REALM2', principalName);
-            });
+        Polymer.dom.flush();
+
+        // Now the kerberos-add-account-dialog should be open with preset
+        // username.
+        addDialog = kerberosAccounts.$$('kerberos-add-account-dialog');
+        assertTrue(!!addDialog);
+        assertEquals('user2@REALM2', addDialog.username);
       });
     });
 
@@ -118,4 +129,141 @@
       assertEquals(2, browserProxy.getCallCount('getAccounts'));
     });
   });
-});
+
+  // Tests for the kerberos-add-account-dialog element.
+  suite('KerberosAddAccountTests', function() {
+    let browserProxy = null;
+    let dialog = null;
+    let username = null;
+    let password = null;
+    let addButton = null;
+    let generalError = null;
+
+    setup(function() {
+      browserProxy = new TestKerberosAccountsBrowserProxy();
+      settings.KerberosAccountsBrowserProxyImpl.instance_ = browserProxy;
+      PolymerTest.clearBody();
+
+      dialog = document.createElement('kerberos-add-account-dialog');
+      document.body.appendChild(dialog);
+
+      username = dialog.$.username;
+      assertTrue(!!username);
+
+      password = dialog.$.password;
+      assertTrue(!!password);
+
+      addButton = dialog.$$('.action-button');
+      assertTrue(!!addButton);
+
+      generalError = dialog.$['general-error-message'];
+      assertTrue(!!generalError);
+    });
+
+    teardown(function() {
+      dialog.remove();
+    });
+
+    // Sets |error| as error result for addAccount(), simulates a click on the
+    // addAccount button and checks that |errorElement| has an non-empty
+    // innerText value afterwards.
+    function checkAddAccountError(error, errorElement) {
+      Polymer.dom.flush();
+      assertEquals(0, errorElement.innerText.length);
+      browserProxy.addAccountError = error;
+      addButton.click();
+      return browserProxy.whenCalled('addAccount').then(function() {
+        Polymer.dom.flush();
+        assertNotEquals(0, errorElement.innerText.length);
+      });
+    }
+
+    // The username input field is not disabled by default.
+    test('UsernameFieldNotDisabledByDefault', function() {
+      assertFalse(username.disabled);
+    });
+
+    // The username input field is disabled if a username is preset before the
+    // dialog is appended to the document.
+    test('UsernameFieldDisabledIfPreset', function() {
+      const newDialog = document.createElement('kerberos-add-account-dialog');
+      newDialog.username = 'user';
+      document.body.appendChild(newDialog);
+      assertTrue(newDialog.$.username.disabled);
+    });
+
+    // By clicking the "Add account", the username and password values are
+    // passed to the 'addAccount' browser proxy method.
+    test('AddButtonPassesCredentials', function() {
+      const EXPECTED_USER = 'testuser';
+      const EXPECTED_PASS = 'testpass';
+      username.value = EXPECTED_USER;
+      password.value = EXPECTED_PASS;
+      assertFalse(addButton.disabled);
+      addButton.click();
+      return browserProxy.whenCalled('addAccount').then(function(args) {
+        assertEquals(EXPECTED_USER, args[0]);
+        assertEquals(EXPECTED_PASS, args[1]);
+      });
+    });
+
+    // While an account is being added, the "Add account" is disabled.
+    test('AddButtonDisableWhileInProgress', function() {
+      assertFalse(addButton.disabled);
+      addButton.click();
+      assertTrue(addButton.disabled);
+      return browserProxy.whenCalled('addAccount').then(function(args) {
+        assertFalse(addButton.disabled);
+      });
+    });
+
+    // addAccount: ErrorType.kNetworkProblem spawns a general error.
+    test('AddAccountError_NetworkProblem', function() {
+      checkAddAccountError(
+          settings.KerberosErrorType.kNetworkProblem, generalError);
+    });
+
+    // addAccount: ErrorType.kParsePrincipalFailed spawns a username error.
+    test('AddAccountError_ParsePrincipalFailed', function() {
+      checkAddAccountError(
+          settings.KerberosErrorType.kParsePrincipalFailed, username.$.error);
+    });
+
+    // addAccount: ErrorType.kBadPrincipal spawns a username error.
+    test('AddAccountError_BadPrincipal', function() {
+      checkAddAccountError(
+          settings.KerberosErrorType.kBadPrincipal, username.$.error);
+    });
+
+    // addAccount: ErrorType.kContactingKdcFailed spawns a username error.
+    test('AddAccountError_ContactingKdcFailed', function() {
+      checkAddAccountError(
+          settings.KerberosErrorType.kContactingKdcFailed, username.$.error);
+    });
+
+    // addAccount: ErrorType.kBadPassword spawns a password error.
+    test('AddAccountError_BadPassword', function() {
+      checkAddAccountError(
+          settings.KerberosErrorType.kBadPassword, password.$.error);
+    });
+
+    // addAccount: ErrorType.kPasswordExpired spawns a password error.
+    test('AddAccountError_PasswordExpired', function() {
+      checkAddAccountError(
+          settings.KerberosErrorType.kPasswordExpired, password.$.error);
+    });
+
+    // addAccount: ErrorType.kKdcDoesNotSupportEncryptionType spawns a general
+    // error.
+    test('AddAccountError_KdcDoesNotSupportEncryptionType', function() {
+      checkAddAccountError(
+          settings.KerberosErrorType.kKdcDoesNotSupportEncryptionType,
+          generalError);
+    });
+
+    // addAccount: ErrorType.kUnknown spawns a general error.
+    test('AddAccountError_Unknown', function() {
+      checkAddAccountError(settings.KerberosErrorType.kUnknown, generalError);
+    });
+  });
+});
\ No newline at end of file
diff --git a/chrome/test/data/webui/settings/split_settings_flag_test.js b/chrome/test/data/webui/settings/split_settings_flag_test.js
index 3a57bac8..f5abb68 100644
--- a/chrome/test/data/webui/settings/split_settings_flag_test.js
+++ b/chrome/test/data/webui/settings/split_settings_flag_test.js
@@ -4,7 +4,7 @@
 
 cr.define('split_settings_flag', function() {
   suite('splitSettingsFlag', function() {
-    const attachedSections = new Set();
+    let browserSettings = null;
 
     /**
      * Names of settings sections that affect Chrome browser (and possibly CrOS)
@@ -16,42 +16,19 @@
       'a11y',
       'appearance',
       'autofill',
+      'downloads',
       'languages',
       'onStartup',
+      'people',
       'printing',
       'privacy',
-      'search',
-    ];
-
-    /**
-     * Names of settings sections that affect only CrOS (i.e. not the Chrome
-     * broswer) and therefore should not appear in browser settings when
-     * SettingsSplit feature is enabled.
-     * @type {!Array<string>}
-     */
-    const OS_SETTINGS_ONLY_SECTIONS = [
-      'androidApps',
-      'bluetooth',
-      'changePassword',
-      'crostini',
-      'date-time',
-      'device',
-      'internet',
-      'kiosk-next-shell',
-      'multidevice',
-      'people',
-    ];
-
-    const UNMIGRATED_SECTIONS = [
-      'changePassword',
-      'date-time',
-      'people',
       'reset',
+      'search',
     ];
 
     setup(async function() {
       PolymerTest.clearBody();
-      const browserSettings = document.createElement('settings-basic-page');
+      browserSettings = document.createElement('settings-basic-page');
       // In prod, page visibility is passed via Polymer binding layers but it
       // is always set to settings.pageVisibility.
       browserSettings.pageVisibility = settings.pageVisibility;
@@ -60,27 +37,17 @@
 
       // Expand <settings-idle-load> containing advanced section
       await browserSettings.$$('#advancedPageTemplate').get();
-
-      browserSettings.shadowRoot.querySelectorAll('settings-section')
-          .forEach(element => attachedSections.add(element.section));
     });
 
-    test(
-        'Browser settings page contains all browser-relevant settings',
-        function() {
-          for (let section of BROWSER_SETTINGS_SECTIONS) {
-            assertTrue(attachedSections.has(section));
-          }
-        });
-
-    test(
-        'Browser settings page contains no migrated CrOS-only settings',
-        function() {
-          const attachedOsSections =
-              OS_SETTINGS_ONLY_SECTIONS.filter(e => attachedSections.has(e));
-          for (let section of attachedOsSections) {
-            assertTrue(UNMIGRATED_SECTIONS.includes(section));
-          }
-        });
+    test('Attached sections are exactly browser settings sections', function() {
+      const unattachedBrowserSettingsSections =
+          new Set(BROWSER_SETTINGS_SECTIONS);
+      const allAttachedSettingsSectionElements =
+          browserSettings.shadowRoot.querySelectorAll('settings-section');
+      for (let element of allAttachedSettingsSectionElements) {
+        assertTrue(unattachedBrowserSettingsSections.delete(element.section));
+      }
+      assertEquals(unattachedBrowserSettingsSections.size, 0);
+    });
   });
 });
diff --git a/chrome/tools/build/mac/copy_keystone_framework.py b/chrome/tools/build/mac/copy_keystone_framework.py
deleted file mode 100644
index 7d34575a..0000000
--- a/chrome/tools/build/mac/copy_keystone_framework.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import os.path
-import shutil
-import subprocess
-import sys
-
-# Usage: python copy_keystone_framework.py /path/to/input /path/to/output
-#        [DEVELOPER_DIR]
-#
-# This script copies the KeystoneRegistration.framework, removing its
-# versioned directory structure, thinning it to just x86_64, and deleting
-# the Headers directory.
-
-def Main(args):
-  if len(args) != 3 and len(args) != 4:
-    print >> sys.stderr, '%s: /path/to/input /path/to/output' % (args[0],)
-    return 1
-  if len(args) == 4:
-    os.environ['DEVELOPER_DIR'] = args[3]
-
-  # Delete any old copies of the framework.
-  output_path = os.path.join(args[2], 'KeystoneRegistration.framework')
-  if os.path.exists(output_path):
-    shutil.rmtree(output_path)
-
-  # Copy the framework out of its versioned directory. Use rsync to exclude
-  # dotfiles and the Headers directories.
-  subprocess.check_call(
-      ['rsync', '-acC', '--delete',
-       '--exclude', 'Headers', '--exclude', 'PrivateHeaders',
-       '--include', '*.so',
-       os.path.join(args[1], 'Versions/Current/'),
-       output_path])
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
diff --git a/chromecast/bindings/BUILD.gn b/chromecast/bindings/BUILD.gn
new file mode 100644
index 0000000..c7e2b79
--- /dev/null
+++ b/chromecast/bindings/BUILD.gn
@@ -0,0 +1,42 @@
+# 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.
+
+import("//build/config/fuchsia/rules.gni")
+
+source_set("named_message_port_connector_resources") {
+  data = [
+    "named_message_port_connector.js",
+  ]
+}
+
+source_set("bindings_manager") {
+  sources = [
+    "bindings_manager.cc",
+    "bindings_manager.h",
+  ]
+  deps = [
+    "//base",
+  ]
+  public_deps = [
+    "//mojo/public/cpp/bindings",
+  ]
+}
+
+source_set("bindings_manager_fuchsia") {
+  sources = [
+    "bindings_manager_fuchsia.cc",
+    "bindings_manager_fuchsia.h",
+  ]
+
+  deps = [
+    "//base",
+    "//fuchsia:cast_fidl",
+    "//fuchsia/base",
+    "//fuchsia/base:message_port",
+  ]
+
+  public_deps = [
+    ":bindings_manager",
+  ]
+}
diff --git a/chromecast/bindings/DEPS b/chromecast/bindings/DEPS
new file mode 100644
index 0000000..8078e6a
--- /dev/null
+++ b/chromecast/bindings/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+fuchsia",
+  "+mojo/public",
+]
diff --git a/chromecast/bindings/bindings_manager.cc b/chromecast/bindings/bindings_manager.cc
new file mode 100644
index 0000000..35131b7d
--- /dev/null
+++ b/chromecast/bindings/bindings_manager.cc
@@ -0,0 +1,41 @@
+// 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 "chromecast/bindings/bindings_manager.h"
+
+#include <utility>
+
+namespace chromecast {
+namespace bindings {
+
+BindingsManager::BindingsManager() = default;
+
+BindingsManager::~BindingsManager() {
+  DCHECK(port_handlers_.empty());
+}
+
+void BindingsManager::RegisterPortHandler(base::StringPiece port_name,
+                                          PortConnectedHandler handler) {
+  auto result = port_handlers_.try_emplace(port_name, std::move(handler));
+  DCHECK(result.second);
+}
+
+void BindingsManager::UnregisterPortHandler(base::StringPiece port_name) {
+  size_t deleted = port_handlers_.erase(port_name);
+  DCHECK_EQ(deleted, 1u);
+}
+
+void BindingsManager::OnPortConnected(base::StringPiece port_name,
+                                      mojo::ScopedMessagePipeHandle port) {
+  auto handler = port_handlers_.find(port_name);
+  if (handler == port_handlers_.end()) {
+    LOG(ERROR) << "No handler found for port " << port_name << ".";
+    return;
+  }
+
+  handler->second.Run(std::move(port));
+}
+
+}  // namespace bindings
+}  // namespace chromecast
diff --git a/chromecast/bindings/bindings_manager.h b/chromecast/bindings/bindings_manager.h
new file mode 100644
index 0000000..8009cc2
--- /dev/null
+++ b/chromecast/bindings/bindings_manager.h
@@ -0,0 +1,63 @@
+// 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 CHROMECAST_BINDINGS_BINDINGS_MANAGER_H_
+#define CHROMECAST_BINDINGS_BINDINGS_MANAGER_H_
+
+#include <map>
+#include <string>
+
+#include "base/callback.h"
+#include "base/containers/flat_map.h"
+#include "base/strings/string_piece.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace chromecast {
+namespace bindings {
+
+// Injects Cast Platform API scripts into pages' scripting context and
+// establishes bidirectional communication with them across the JS/native
+// boundary.
+class BindingsManager {
+ public:
+  using PortConnectedHandler =
+      base::RepeatingCallback<void(mojo::ScopedMessagePipeHandle)>;
+
+  BindingsManager();
+
+  // All handlers must be Unregistered() before |this| is destroyed.
+  virtual ~BindingsManager();
+
+  // Registers a |handler| which will receive MessagePorts originating from
+  // the frame's web content. |port_name| is an alphanumeric string that is
+  // consistent across JS and native code.
+  void RegisterPortHandler(base::StringPiece port_name,
+                           PortConnectedHandler handler);
+
+  // Unregisters a previously registered handler.
+  // The owner of BindingsManager is responsible for ensuring that all handlers
+  // are unregistered before |this| is deleted.
+  void UnregisterPortHandler(base::StringPiece port_name);
+
+  // Registers a |binding_script| for injection in the frame.
+  // Replaces registered bindings with the same |binding_name|.
+  virtual void AddBinding(base::StringPiece binding_name,
+                          base::StringPiece binding_script) = 0;
+
+ protected:
+  // Called by platform-specific subclasses when the underlying transport has
+  // delivered a port.
+  void OnPortConnected(base::StringPiece port_name,
+                       mojo::ScopedMessagePipeHandle port);
+
+ private:
+  base::flat_map<std::string, PortConnectedHandler> port_handlers_;
+
+  DISALLOW_COPY_AND_ASSIGN(BindingsManager);
+};
+
+}  // namespace bindings
+}  // namespace chromecast
+
+#endif  // CHROMECAST_BINDINGS_BINDINGS_MANAGER_H_
diff --git a/chromecast/bindings/bindings_manager_fuchsia.cc b/chromecast/bindings/bindings_manager_fuchsia.cc
new file mode 100644
index 0000000..fe88955
--- /dev/null
+++ b/chromecast/bindings/bindings_manager_fuchsia.cc
@@ -0,0 +1,50 @@
+// 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 "chromecast/bindings/bindings_manager_fuchsia.h"
+
+#include <utility>
+#include <vector>
+
+#include "base/fuchsia/fuchsia_logging.h"
+#include "base/logging.h"
+#include "fuchsia/base/mem_buffer_util.h"
+#include "fuchsia/base/message_port.h"
+
+namespace chromecast {
+namespace bindings {
+
+BindingsManagerFuchsia::BindingsManagerFuchsia() = default;
+
+BindingsManagerFuchsia::~BindingsManagerFuchsia() = default;
+
+void BindingsManagerFuchsia::AddBinding(base::StringPiece binding_name,
+                                        base::StringPiece binding_script) {
+  bindings_[binding_name.as_string()] =
+      cr_fuchsia::MemBufferFromString(binding_script);
+}
+
+void BindingsManagerFuchsia::GetAll(GetAllCallback callback) {
+  // Build a list of binding scripts and send it to the client.
+  std::vector<chromium::cast::ApiBinding> bindings_vector;
+  for (auto& bindings_name_and_buffer : bindings_) {
+    chromium::cast::ApiBinding binding_cloned;
+    zx_status_t status;
+    status = bindings_name_and_buffer.second.Clone(
+        binding_cloned.mutable_before_load_script());
+    ZX_CHECK(status == ZX_OK, status) << "vmo::clone";
+    bindings_vector.emplace_back(std::move(binding_cloned));
+  }
+  callback(std::move(bindings_vector));
+}
+
+void BindingsManagerFuchsia::Connect(
+    std::string port_name,
+    fidl::InterfaceHandle<::fuchsia::web::MessagePort> message_port) {
+  OnPortConnected(port_name,
+                  cr_fuchsia::MessagePortFromFidl(std::move(message_port)));
+}
+
+}  // namespace bindings
+}  // namespace chromecast
diff --git a/chromecast/bindings/bindings_manager_fuchsia.h b/chromecast/bindings/bindings_manager_fuchsia.h
new file mode 100644
index 0000000..0f90e3d6
--- /dev/null
+++ b/chromecast/bindings/bindings_manager_fuchsia.h
@@ -0,0 +1,47 @@
+// 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 CHROMECAST_BINDINGS_BINDINGS_MANAGER_FUCHSIA_H_
+#define CHROMECAST_BINDINGS_BINDINGS_MANAGER_FUCHSIA_H_
+
+#include <map>
+#include <string>
+
+#include "base/callback.h"
+#include "chromecast/bindings/bindings_manager.h"
+#include "fuchsia/fidl/chromium/cast/cpp/fidl.h"
+
+namespace chromecast {
+namespace bindings {
+
+// Implements the BindingsManager as a ApiBindings FIDL service.
+class BindingsManagerFuchsia : public chromium::cast::ApiBindings,
+                               public BindingsManager {
+ public:
+  BindingsManagerFuchsia();
+  ~BindingsManagerFuchsia() override;
+
+  // BindingsManager implementation:
+  void AddBinding(base::StringPiece binding_name,
+                  base::StringPiece binding_script) override;
+
+ protected:
+  // chromium::cast::ApiBindings implementation:
+  void GetAll(GetAllCallback callback) override;
+  void Connect(
+      std::string port_name,
+      fidl::InterfaceHandle<::fuchsia::web::MessagePort> message_port) override;
+
+ private:
+  // Stores all bindings, keyed on the string-based IDs provided by the
+  // ApiBindings interface.
+  std::map<std::string, fuchsia::mem::Buffer> bindings_;
+
+  DISALLOW_COPY_AND_ASSIGN(BindingsManagerFuchsia);
+};
+
+}  // namespace bindings
+}  // namespace chromecast
+
+#endif  // CHROMECAST_BINDINGS_BINDINGS_MANAGER_FUCHSIA_H_
diff --git a/fuchsia/runners/cast/named_message_port_connector.js b/chromecast/bindings/named_message_port_connector.js
similarity index 96%
rename from fuchsia/runners/cast/named_message_port_connector.js
rename to chromecast/bindings/named_message_port_connector.js
index 5d21147..f6d56a4f0 100644
--- a/fuchsia/runners/cast/named_message_port_connector.js
+++ b/chromecast/bindings/named_message_port_connector.js
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// 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.
 
diff --git a/chromecast/build/tests/cast_test.gni b/chromecast/build/tests/cast_test.gni
index 79a0aab..d62b5f81 100644
--- a/chromecast/build/tests/cast_test.gni
+++ b/chromecast/build/tests/cast_test.gni
@@ -456,3 +456,88 @@
     }
   }
 }
+
+# This template creates a tar.gz file with test dependencies.
+#
+# Parameters
+#   output (required)
+#       The absolute path to the tar.gz file to be created.
+#
+#   deps_list_path (required)
+#       Absolute path to runtime dependencies file. This has to point to the
+#       same file runtime_deps_path of cast_test_group_list is pointing to.
+#
+#   exclude_deps (optional)
+#       gn list of paths to filter out from the dependencies list.
+#       This is used to remove folders with huge files that are not needed.
+#
+#   additional_deps (optional)
+#       gn list of paths to be added to the list of dependencies
+#       before creating the tar.gz file.
+#
+# This template has to be used in combination with cast_test_group_list
+# that generates the runtime dependencies file.
+#
+# Example usage:
+#
+# cast_test_group_list("chromecast_test_lists") {
+#  build_list_path = "$root_out_dir/tests/build_test_list.txt"
+#  runtime_deps_path = "$root_out_dir/tests/runtime_deps.json"
+#  run_list_path = "$root_out_dir/tests/run_test_list.txt"
+#  test_groups = [ ":chromecast_test_group" ]
+# }
+#
+# cast_test_deps_archive("chromecast_test_deps_archive") {
+#  output = "$root_out_dir/test_deps.tar.gz"
+#  deps_list_path = "$root_out_dir/tests/runtime_deps.json"
+#  exclude_deps = [
+#    "exe.unstripped",
+#    "lib.unstripped"
+#  ]
+#  additional_deps = [
+#    "tests",
+#  ]
+#  deps = [
+#    ":chromecast_test_lists"
+#  ]
+# }
+#
+template("cast_test_deps_archive") {
+  assert(defined(invoker.output), "$target_name needs 'output'")
+  assert(defined(invoker.deps_list_path),
+         "$target_name needs 'deps_list_path'")
+
+  deps = invoker.deps
+
+  action(target_name) {
+    testonly = true
+
+    script = "//chromecast/tools/build/package_test_deps.py"
+    outputs = [
+      invoker.output
+    ]
+
+    # Generate a comma separated list of filters.
+    _exclude_deps = ""
+    foreach(_exclude_dep, invoker.exclude_deps) {
+      _exclude_deps += "," + _exclude_dep
+    }
+
+    # Generate a comma separated list of includes.
+    _additional_deps = ""
+    foreach(_additional_dep, invoker.additional_deps) {
+      _additional_deps += "," + _additional_dep
+    }
+
+    args = [
+      "--output",
+      rebase_path(invoker.output, root_build_dir),
+      "--deps_list_path",
+      rebase_path(invoker.deps_list_path, root_build_dir),
+      "--exclude_deps",
+      _exclude_deps,
+      "--additional_deps",
+      _additional_deps,
+    ]
+  }
+}
diff --git a/chromecast/tools/build/package_test_deps.py b/chromecast/tools/build/package_test_deps.py
new file mode 100755
index 0000000..68ee1d3
--- /dev/null
+++ b/chromecast/tools/build/package_test_deps.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python
+#
+# 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.
+
+"""Packages test dependencies as tar.gz file."""
+
+import argparse
+import json
+import logging
+import os
+import sys
+import tarfile
+
+
+parser = argparse.ArgumentParser(
+    description='Package test dependencies as tar.gz files.')
+parser.add_argument('--output', required=True,
+                    help='Full path to the output file.')
+parser.add_argument('--deps_list_path', required=True,
+                    help='Full path to the json dependencies file.')
+parser.add_argument('--exclude_deps', required=False,
+                    default='',
+                    help=('Comma separated list of dependencies to exclude'
+                          ' from tar.gz file.'))
+parser.add_argument('--additional_deps', required=False,
+                    default='',
+                    help=('Comma separated list of additional deps'
+                          ' to include in tar.gz.'))
+
+
+def read_dependencies(file_path):
+  """Reads a json file and creates an iterable of unique dependencies.
+
+  Args:
+    file_path: The path to the runtime dependencies file.
+
+  Returns:
+    An iterable with unique dependencies.
+  """
+  deps = None
+  with open(file_path) as deps_file:
+    deps = json.load(deps_file)
+  deps_set = set()
+  for _, dep_list in deps.items():
+    deps_set.update(dep_list)
+  return deps_set
+
+
+def filter_dependencies(dependencies, filters):
+  """Filters out dependencies from a dependencies iterable.
+
+  Args:
+    dependencies: An iterable with the full list of dependencies.
+    filters: A list of dependencies to remove.
+
+  Returns:
+    An iterable with the filtered dependencies.
+  """
+  filters_list = filters.strip(',').split(',')
+  logging.info('Filtering: %s', filters_list)
+  filtered_deps = set()
+  for dep in dependencies:
+    norm_dep = os.path.normpath(dep)
+    if not any(norm_dep.startswith(f) for f in filters_list):
+      filtered_deps.add(norm_dep)
+  return filtered_deps
+
+
+def create_tarfile(output_path, dependencies):
+  """Creates a tar.gz file and saves it to output_path.
+
+  Args:
+    output_path: A string with the path to where tar.gz file will be saved to.
+    dependencies: An iterable with file/folders test dependencies.
+  """
+  total_deps = len(dependencies)
+  if total_deps < 1:
+    logging.error('There are no dependencies to archive')
+    sys.exit(1)
+  step = (total_deps / 10) or 1
+  logging.info('Adding %s files', total_deps)
+  with tarfile.open(output_path, 'w:gz') as tar_file:
+    for idx, dep in enumerate(dependencies):
+      dep = os.path.normpath(dep)
+      archive_name = os.path.join('fuchsia/release', dep)
+      archive_name = os.path.normpath(archive_name)
+      tar_file.add(dep, arcname=archive_name)
+      if idx % step == 0 or idx == (total_deps - 1):
+        logging.info('Progress: %s percent', int(round(100.0/total_deps * idx)))
+
+
+def main():
+  logging.basicConfig(level=logging.INFO)
+  args = parser.parse_args()
+  dependencies = read_dependencies(args.deps_list_path)
+  if args.additional_deps:
+    to_include = args.additional_deps.strip(',').split(',')
+    logging.info('Including: %s', to_include)
+    dependencies.update(to_include)
+  if args.exclude_deps:
+    dependencies = filter_dependencies(dependencies, args.exclude_deps)
+  create_tarfile(args.output, dependencies)
+
+
+if __name__ == '__main__':
+  main()
diff --git a/chromeos/components/proximity_auth/proximity_auth_profile_pref_manager.cc b/chromeos/components/proximity_auth/proximity_auth_profile_pref_manager.cc
index 83162f1..13cfc336 100644
--- a/chromeos/components/proximity_auth/proximity_auth_profile_pref_manager.cc
+++ b/chromeos/components/proximity_auth/proximity_auth_profile_pref_manager.cc
@@ -115,7 +115,8 @@
 }
 
 bool ProximityAuthProfilePrefManager::IsEasyUnlockEnabled() const {
-  return feature_state_ ==
+  return multidevice_setup_client_->GetFeatureState(
+             chromeos::multidevice_setup::mojom::Feature::kSmartLock) ==
          chromeos::multidevice_setup::mojom::FeatureState::kEnabledByUser;
 }
 
@@ -165,15 +166,6 @@
 void ProximityAuthProfilePrefManager::OnFeatureStatesChanged(
     const chromeos::multidevice_setup::MultiDeviceSetupClient::FeatureStatesMap&
         feature_states_map) {
-  const auto it = feature_states_map.find(
-      chromeos::multidevice_setup::mojom::Feature::kSmartLock);
-  if (it == feature_states_map.end()) {
-    feature_state_ = chromeos::multidevice_setup::mojom::FeatureState::
-        kUnavailableNoVerifiedHost;
-    return;
-  }
-  feature_state_ = it->second;
-
   if (local_state_ && account_id_.is_valid())
     SyncPrefsToLocalState();
 }
diff --git a/chromeos/components/proximity_auth/proximity_auth_profile_pref_manager.h b/chromeos/components/proximity_auth/proximity_auth_profile_pref_manager.h
index 86a41661..c5ad2e8 100644
--- a/chromeos/components/proximity_auth/proximity_auth_profile_pref_manager.h
+++ b/chromeos/components/proximity_auth/proximity_auth_profile_pref_manager.h
@@ -89,15 +89,10 @@
   // The account id of the current profile.
   AccountId account_id_;
 
-  // Used to determine the FeatureState of Smart Lock. See |feature_state_|.
+  // Used to determine the FeatureState of Smart Lock.
   chromeos::multidevice_setup::MultiDeviceSetupClient*
       multidevice_setup_client_ = nullptr;
 
-  // Caches feature state of Smart Lock. Populated by using
-  // |multidevice_setup_client_|.
-  chromeos::multidevice_setup::mojom::FeatureState feature_state_ = chromeos::
-      multidevice_setup::mojom::FeatureState::kUnavailableNoVerifiedHost;
-
   base::WeakPtrFactory<ProximityAuthProfilePrefManager> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ProximityAuthProfilePrefManager);
diff --git a/chromeos/components/proximity_auth/proximity_auth_system.cc b/chromeos/components/proximity_auth/proximity_auth_system.cc
index fde0efe..a62e6b5 100644
--- a/chromeos/components/proximity_auth/proximity_auth_system.cc
+++ b/chromeos/components/proximity_auth/proximity_auth_system.cc
@@ -59,6 +59,11 @@
     const AccountId& account_id,
     const chromeos::multidevice::RemoteDeviceRefList& remote_devices,
     base::Optional<chromeos::multidevice::RemoteDeviceRef> local_device) {
+  PA_LOG(VERBOSE) << "Setting devices for user " << account_id.Serialize()
+                  << ". Remote device count: " << remote_devices.size()
+                  << ", Local device: ["
+                  << (local_device.has_value() ? "present" : "absent") << "].";
+
   remote_devices_map_[account_id] = remote_devices;
   local_device_map_.emplace(account_id, *local_device);
 
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index b8aa208..ae129e4 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -124,11 +124,6 @@
 const base::Feature kUserActivityPrediction{"UserActivityPrediction",
                                             base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Enables or disables ML service inferencing (instead of TFNative inferencing)
-// for the Smart Dim feature on Chrome OS.
-const base::Feature kUserActivityPredictionMlService{
-    "UserActivityPredictionMlService", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enable or disable native controls in video player on Chrome OS.
 const base::Feature kVideoPlayerNativeControls{
     "VideoPlayerNativeControls", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h
index 670eb75..d1987c2f6e 100644
--- a/chromeos/constants/chromeos_features.h
+++ b/chromeos/constants/chromeos_features.h
@@ -62,8 +62,6 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kUserActivityPrediction;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
-extern const base::Feature kUserActivityPredictionMlService;
-COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kVideoPlayerNativeControls;
 
 // Keep alphabetized.
diff --git a/chromeos/constants/chromeos_switches.cc b/chromeos/constants/chromeos_switches.cc
index ce8fbe4..728f166 100644
--- a/chromeos/constants/chromeos_switches.cc
+++ b/chromeos/constants/chromeos_switches.cc
@@ -483,6 +483,23 @@
 const char kSupervisionOnboardingStartPageUrl[] =
     "supervision-onboarding-start-page-url";
 
+// Matcher pattern for authenticated requests made by the Supervision
+// onboarding.
+// TODO(958995): Hardcode this value when the server implementation is ready.
+const char kSupervisionOnboardingPageUrlPattern[] =
+    "supervision-onboarding-page-url-pattern";
+
+// Custom HTTP header expected in responses coming from the supervision server.
+// TODO(958995): Hardcode this value when the server implementation is ready.
+const char kSupervisionOnboardingHttpResponseHeader[] =
+    "supervision-onboarding-http-response-header";
+
+// Value expected to be found in custom HTTP header coming from the supervision
+// server.
+// TODO(958995): Hardcode this value when the server implementation is ready.
+const char kSupervisionOnboardingHttpResponseHeaderValue[] =
+    "supervision-onboarding-http-response-header-value";
+
 // Enables testing for encryption migration UI.
 const char kTestEncryptionMigrationUI[] = "test-encryption-migration-ui";
 
diff --git a/chromeos/constants/chromeos_switches.h b/chromeos/constants/chromeos_switches.h
index e27dc2e..a2cb678 100644
--- a/chromeos/constants/chromeos_switches.h
+++ b/chromeos/constants/chromeos_switches.h
@@ -180,6 +180,12 @@
 extern const char kShowAndroidFilesInFilesApp[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const char kSupervisionOnboardingStartPageUrl[];
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const char kSupervisionOnboardingPageUrlPattern[];
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const char kSupervisionOnboardingHttpResponseHeader[];
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const char kSupervisionOnboardingHttpResponseHeaderValue[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kShowLoginDevOverlay[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const char kTestEncryptionMigrationUI[];
diff --git a/chromeos/dbus/fake_smb_provider_client.cc b/chromeos/dbus/fake_smb_provider_client.cc
index 8b2f2b2..2ef8593 100644
--- a/chromeos/dbus/fake_smb_provider_client.cc
+++ b/chromeos/dbus/fake_smb_provider_client.cc
@@ -52,22 +52,12 @@
                                   const std::string& workgroup,
                                   const std::string& username,
                                   base::ScopedFD password_fd,
+                                  bool skip_connect,
                                   MountCallback callback) {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), smbprovider::ERROR_OK, 1));
 }
 
-void FakeSmbProviderClient::Remount(const base::FilePath& share_path,
-                                    int32_t mount_id,
-                                    bool ntlm_enabled,
-                                    const std::string& workgroup,
-                                    const std::string& username,
-                                    base::ScopedFD password_fd,
-                                    StatusCallback callback) {
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(std::move(callback), smbprovider::ERROR_OK));
-}
-
 void FakeSmbProviderClient::Unmount(int32_t mount_id, StatusCallback callback) {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), smbprovider::ERROR_OK));
diff --git a/chromeos/dbus/fake_smb_provider_client.h b/chromeos/dbus/fake_smb_provider_client.h
index 94350e0..a27fd1c 100644
--- a/chromeos/dbus/fake_smb_provider_client.h
+++ b/chromeos/dbus/fake_smb_provider_client.h
@@ -35,15 +35,9 @@
              const std::string& workgroup,
              const std::string& username,
              base::ScopedFD password_fd,
+             bool skip_connect,
              MountCallback callback) override;
 
-  void Remount(const base::FilePath& share_path,
-               int32_t mount_id,
-               bool ntlm_enabled,
-               const std::string& workgroup,
-               const std::string& username,
-               base::ScopedFD password_fd,
-               StatusCallback callback) override;
   void Unmount(int32_t mount_id, StatusCallback callback) override;
   void ReadDirectory(int32_t mount_id,
                      const base::FilePath& directory_path,
diff --git a/chromeos/dbus/smb_provider_client.cc b/chromeos/dbus/smb_provider_client.cc
index b431fa97..508e654 100644
--- a/chromeos/dbus/smb_provider_client.cc
+++ b/chromeos/dbus/smb_provider_client.cc
@@ -77,11 +77,13 @@
              const std::string& workgroup,
              const std::string& username,
              base::ScopedFD password_fd,
+             bool skip_connect,
              MountCallback callback) override {
     smbprovider::MountOptionsProto options;
     options.set_path(share_path.value());
     options.set_workgroup(workgroup);
     options.set_username(username);
+    options.set_skip_connect(skip_connect);
 
     std::unique_ptr<smbprovider::MountConfigProto> config =
         CreateMountConfigProto(ntlm_enabled);
@@ -96,32 +98,6 @@
                &callback);
   }
 
-  void Remount(const base::FilePath& share_path,
-               int32_t mount_id,
-               bool ntlm_enabled,
-               const std::string& workgroup,
-               const std::string& username,
-               base::ScopedFD password_fd,
-               StatusCallback callback) override {
-    smbprovider::RemountOptionsProto options;
-    options.set_path(share_path.value());
-    options.set_mount_id(mount_id);
-    options.set_workgroup(workgroup);
-    options.set_username(username);
-
-    std::unique_ptr<smbprovider::MountConfigProto> config =
-        CreateMountConfigProto(ntlm_enabled);
-    options.set_allocated_mount_config(config.release());
-
-    dbus::MethodCall method_call(smbprovider::kSmbProviderInterface,
-                                 smbprovider::kRemountMethod);
-    dbus::MessageWriter writer(&method_call);
-    writer.AppendProtoAsArrayOfBytes(options);
-    writer.AppendFileDescriptor(password_fd.get());
-
-    CallDefaultMethod(&method_call, &callback);
-  }
-
   void Premount(const base::FilePath& share_path,
                 bool ntlm_enabled,
                 MountCallback callback) override {
diff --git a/chromeos/dbus/smb_provider_client.h b/chromeos/dbus/smb_provider_client.h
index 52342cec..3476216a 100644
--- a/chromeos/dbus/smb_provider_client.h
+++ b/chromeos/dbus/smb_provider_client.h
@@ -69,18 +69,9 @@
                      const std::string& workgroup,
                      const std::string& username,
                      base::ScopedFD password_fd,
+                     bool skip_connect,
                      MountCallback callback) = 0;
 
-  // Calls Remount. This attempts to remount the share at |share_path| with its
-  // original |mount_id|.
-  virtual void Remount(const base::FilePath& share_path,
-                       int32_t mount_id,
-                       bool ntlm_enabled,
-                       const std::string& workgroup,
-                       const std::string& username,
-                       base::ScopedFD password_fd,
-                       StatusCallback callback) = 0;
-
   // Calls Unmount. This removes the corresponding mount of |mount_id| from
   // the list of valid mounts. Subsequent operations on |mount_id| will fail.
   virtual void Unmount(int32_t mount_id, StatusCallback callback) = 0;
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index c78a79d..ac21d8d 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -1401,12 +1401,7 @@
 
   // Our callback should be run only after both view hierarchy and screenshot
   // data have been cached from their respective providers.
-  auto on_done =
-      base::BarrierClosure(2, base::BindOnce(
-                                  [](CacheScreenContextCallback callback) {
-                                    std::move(callback).Run();
-                                  },
-                                  base::Passed(std::move(callback))));
+  auto on_done = base::BarrierClosure(2, std::move(callback));
 
   service_->client()->RequestAssistantStructure(
       base::BindOnce(&AssistantManagerServiceImpl::CacheAssistantStructure,
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc
index bdc11c5d..2176a24 100644
--- a/chromeos/services/assistant/service.cc
+++ b/chromeos/services/assistant/service.cc
@@ -187,12 +187,6 @@
 
 void Service::OnLockStateChanged(bool locked) {
   locked_ = locked;
-
-  if (assistant_manager_service_->GetState() !=
-      AssistantManagerService::State::RUNNING) {
-    return;
-  }
-
   UpdateListeningState();
 }
 
@@ -212,6 +206,10 @@
   UpdateAssistantManagerState();
 }
 
+void Service::OnLockedFullScreenStateChanged(bool enabled) {
+  UpdateListeningState();
+}
+
 void Service::OnVoiceInteractionHotwordAlwaysOn(bool always_on) {
   // No need to update hotword status if power source is connected.
   if (power_source_connected_)
@@ -418,7 +416,15 @@
 }
 
 void Service::UpdateListeningState() {
-  bool should_listen = !locked_ && session_active_;
+  if (assistant_manager_service_->GetState() !=
+      AssistantManagerService::State::RUNNING) {
+    return;
+  }
+
+  bool should_listen =
+      !locked_ &&
+      !assistant_state_.locked_full_screen_enabled().value_or(false) &&
+      session_active_;
   DVLOG(1) << "Update assistant listening state: " << should_listen;
   assistant_manager_service_->EnableListening(should_listen);
 }
diff --git a/chromeos/services/assistant/service.h b/chromeos/services/assistant/service.h
index a77f67ed..38177ed 100644
--- a/chromeos/services/assistant/service.h
+++ b/chromeos/services/assistant/service.h
@@ -136,6 +136,7 @@
   void OnVoiceInteractionHotwordAlwaysOn(bool always_on) override;
   void OnLocaleChanged(const std::string& locale) override;
   void OnArcPlayStoreEnabledChanged(bool enabled) override;
+  void OnLockedFullScreenStateChanged(bool enabled) override;
 
   void UpdateAssistantManagerState();
   void BindAssistantSettingsManager(
diff --git a/chromeos/services/device_sync/BUILD.gn b/chromeos/services/device_sync/BUILD.gn
index 432a26f..a0e4e67 100644
--- a/chromeos/services/device_sync/BUILD.gn
+++ b/chromeos/services/device_sync/BUILD.gn
@@ -28,8 +28,6 @@
     "cryptauth_enrollment_manager_impl.h",
     "cryptauth_enrollment_result.cc",
     "cryptauth_enrollment_result.h",
-    "cryptauth_enrollment_scheduler.cc",
-    "cryptauth_enrollment_scheduler.h",
     "cryptauth_feature_type.cc",
     "cryptauth_feature_type.h",
     "cryptauth_gcm_manager.cc",
@@ -51,6 +49,10 @@
     "cryptauth_key_registry.h",
     "cryptauth_key_registry_impl.cc",
     "cryptauth_key_registry_impl.h",
+    "cryptauth_scheduler.cc",
+    "cryptauth_scheduler.h",
+    "cryptauth_scheduler_impl.cc",
+    "cryptauth_scheduler_impl.h",
     "cryptauth_v2_enroller.cc",
     "cryptauth_v2_enroller.h",
     "cryptauth_v2_enroller_impl.cc",
@@ -65,12 +67,8 @@
     "device_sync_service.h",
     "device_sync_type_converters.cc",
     "device_sync_type_converters.h",
-    "network_aware_enrollment_scheduler.cc",
-    "network_aware_enrollment_scheduler.h",
     "network_request_error.cc",
     "network_request_error.h",
-    "persistent_enrollment_scheduler.cc",
-    "persistent_enrollment_scheduler.h",
     "pref_names.cc",
     "pref_names.h",
     "remote_device_loader.cc",
@@ -130,14 +128,14 @@
     "fake_cryptauth_device_manager.h",
     "fake_cryptauth_enrollment_manager.cc",
     "fake_cryptauth_enrollment_manager.h",
-    "fake_cryptauth_enrollment_scheduler.cc",
-    "fake_cryptauth_enrollment_scheduler.h",
     "fake_cryptauth_gcm_manager.cc",
     "fake_cryptauth_gcm_manager.h",
     "fake_cryptauth_key_creator.cc",
     "fake_cryptauth_key_creator.h",
     "fake_cryptauth_key_proof_computer.cc",
     "fake_cryptauth_key_proof_computer.h",
+    "fake_cryptauth_scheduler.cc",
+    "fake_cryptauth_scheduler.h",
     "fake_cryptauth_v2_enroller.cc",
     "fake_cryptauth_v2_enroller.h",
     "fake_device_sync.cc",
@@ -183,11 +181,10 @@
     "cryptauth_key_proof_computer_impl_unittest.cc",
     "cryptauth_key_registry_impl_unittest.cc",
     "cryptauth_key_unittest.cc",
+    "cryptauth_scheduler_impl_unittest.cc",
     "cryptauth_v2_enroller_impl_unittest.cc",
     "cryptauth_v2_enrollment_manager_impl_unittest.cc",
     "device_sync_service_unittest.cc",
-    "network_aware_enrollment_scheduler_unittest.cc",
-    "persistent_enrollment_scheduler_unittest.cc",
     "remote_device_loader_unittest.cc",
     "remote_device_provider_impl_unittest.cc",
     "software_feature_manager_impl_unittest.cc",
diff --git a/chromeos/services/device_sync/cryptauth_enrollment_scheduler.cc b/chromeos/services/device_sync/cryptauth_enrollment_scheduler.cc
deleted file mode 100644
index 35c6b776..0000000
--- a/chromeos/services/device_sync/cryptauth_enrollment_scheduler.cc
+++ /dev/null
@@ -1,26 +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 "chromeos/services/device_sync/cryptauth_enrollment_scheduler.h"
-
-namespace chromeos {
-
-namespace device_sync {
-
-CryptAuthEnrollmentScheduler::CryptAuthEnrollmentScheduler(Delegate* delegate)
-    : delegate_(delegate) {
-  DCHECK(delegate);
-}
-
-CryptAuthEnrollmentScheduler::~CryptAuthEnrollmentScheduler() = default;
-
-void CryptAuthEnrollmentScheduler::NotifyEnrollmentRequested(
-    const base::Optional<cryptauthv2::PolicyReference>&
-        client_directive_policy_reference) const {
-  delegate_->OnEnrollmentRequested(client_directive_policy_reference);
-}
-
-}  // namespace device_sync
-
-}  // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_enrollment_scheduler.h b/chromeos/services/device_sync/cryptauth_enrollment_scheduler.h
deleted file mode 100644
index 1bb2c99..0000000
--- a/chromeos/services/device_sync/cryptauth_enrollment_scheduler.h
+++ /dev/null
@@ -1,93 +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 CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_ENROLLMENT_SCHEDULER_H_
-#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_ENROLLMENT_SCHEDULER_H_
-
-#include "base/macros.h"
-#include "base/optional.h"
-#include "base/time/time.h"
-#include "chromeos/services/device_sync/cryptauth_enrollment_result.h"
-#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
-
-namespace chromeos {
-
-namespace device_sync {
-
-// Schedules periodic enrollments, alerting the delegate when an enrollment
-// attempt is due via Delegate::OnEnrollmentRequested(). The periodic scheduling
-// begins on construction. The client can bypass the periodic schedule and
-// immediately trigger an enrollment request via RequestEnrollmentNow(). When an
-// enrollment attempt has completed, successfully or not, the client should
-// invoke HandleEnrollmentResult() so the scheduler can process the enrollment
-// attempt outcome.
-class CryptAuthEnrollmentScheduler {
- public:
-  class Delegate {
-   public:
-    Delegate() = default;
-    virtual ~Delegate() = default;
-
-    // Called to alert the delegate that an enrollment attempt has been
-    // requested by the scheduler.
-    // |client_directive_policy_reference|: Identifies the CryptAuth policy
-    // associated with the ClientDirective parameters used to schedule this
-    // enrollment attempt. If no ClientDirective was used by the scheduler,
-    // base::nullopt is passed.
-    virtual void OnEnrollmentRequested(
-        const base::Optional<cryptauthv2::PolicyReference>&
-            client_directive_policy_reference) = 0;
-  };
-
-  virtual ~CryptAuthEnrollmentScheduler();
-
-  // Cancels the currently scheduled enrollment, and requests an enrollment
-  // immediately.
-  virtual void RequestEnrollmentNow() = 0;
-
-  // Processes the result of the previous enrollment attempt.
-  virtual void HandleEnrollmentResult(
-      const CryptAuthEnrollmentResult& enrollment_result) = 0;
-
-  // Returns the time of the last known successful enrollment. If no successful
-  // enrollment has occurred, base::nullopt is returned.
-  virtual base::Optional<base::Time> GetLastSuccessfulEnrollmentTime()
-      const = 0;
-
-  // Returns the scheduler's time period between a successful enrollment and
-  // its next enrollment request. Note that this period may not be strictly
-  // adhered to due to RequestEnrollmentNow() calls or the system being offline,
-  // for instance.
-  virtual base::TimeDelta GetRefreshPeriod() const = 0;
-
-  // Returns the time until the next scheduled enrollment request.
-  virtual base::TimeDelta GetTimeToNextEnrollmentRequest() const = 0;
-
-  // Return true if an enrollment has been requested but the enrollment result
-  // has not been processed yet.
-  virtual bool IsWaitingForEnrollmentResult() const = 0;
-
-  // The number of consecutive failed enrollment attempts. Once an enrollment
-  // attempt succeeds, this counter is reset.
-  virtual size_t GetNumConsecutiveFailures() const = 0;
-
- protected:
-  CryptAuthEnrollmentScheduler(Delegate* delegate);
-
-  // Alerts the delegate that an enrollment has been requested.
-  void NotifyEnrollmentRequested(
-      const base::Optional<cryptauthv2::PolicyReference>&
-          client_directive_policy_reference) const;
-
- private:
-  Delegate* delegate_;
-
-  DISALLOW_COPY_AND_ASSIGN(CryptAuthEnrollmentScheduler);
-};
-
-}  // namespace device_sync
-
-}  // namespace chromeos
-
-#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_ENROLLMENT_SCHEDULER_H_
diff --git a/chromeos/services/device_sync/cryptauth_scheduler.cc b/chromeos/services/device_sync/cryptauth_scheduler.cc
new file mode 100644
index 0000000..aae09f6
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_scheduler.cc
@@ -0,0 +1,46 @@
+// 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 "chromeos/services/device_sync/cryptauth_scheduler.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+CryptAuthScheduler::CryptAuthScheduler() = default;
+
+CryptAuthScheduler::~CryptAuthScheduler() = default;
+
+void CryptAuthScheduler::StartEnrollmentScheduling(
+    const base::WeakPtr<EnrollmentDelegate>& enrollment_delegate) {
+  // Ensure this is only called once.
+  DCHECK(!enrollment_delegate_);
+
+  DCHECK(enrollment_delegate);
+  enrollment_delegate_ = enrollment_delegate;
+
+  OnEnrollmentSchedulingStarted();
+}
+
+bool CryptAuthScheduler::HasEnrollmentSchedulingStarted() {
+  return enrollment_delegate_.get();
+}
+
+void CryptAuthScheduler::NotifyEnrollmentRequested(
+    const cryptauthv2::ClientMetadata& client_metadata,
+    const base::Optional<cryptauthv2::PolicyReference>&
+        client_directive_policy_reference) const {
+  // Do nothing if weak pointer was invalidated.
+  if (!enrollment_delegate_)
+    return;
+
+  enrollment_delegate_->OnEnrollmentRequested(
+      client_metadata, client_directive_policy_reference);
+}
+
+void CryptAuthScheduler::OnEnrollmentSchedulingStarted() {}
+
+}  // namespace device_sync
+
+}  // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_scheduler.h b/chromeos/services/device_sync/cryptauth_scheduler.h
new file mode 100644
index 0000000..45b956a
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_scheduler.h
@@ -0,0 +1,111 @@
+// 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 CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_SCHEDULER_H_
+#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_SCHEDULER_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/time/time.h"
+#include "chromeos/services/device_sync/cryptauth_enrollment_result.h"
+#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+// Schedules periodic enrollments, alerting the delegate when an enrollment
+// attempt is due via Delegate::OnEnrollmentRequested(). The periodic scheduling
+// begins on StartEnrollmentScheduling(). The client can bypass the periodic
+// schedule and trigger an enrollment request via RequestEnrollment(). When an
+// enrollment attempt has completed, successfully or not, the client should
+// invoke HandleEnrollmentResult() so the scheduler can process the enrollment
+// attempt outcome.
+class CryptAuthScheduler {
+ public:
+  class EnrollmentDelegate {
+   public:
+    EnrollmentDelegate() = default;
+    virtual ~EnrollmentDelegate() = default;
+
+    // Called to alert the delegate that an enrollment attempt has been
+    // requested by the scheduler.
+    //   |client_metadata|: Contains the retry count, invocation reason, and
+    //       possible session ID of the enrollment request.
+    //   |client_directive_policy_reference|: Identifies the CryptAuth policy
+    //       associated with the ClientDirective parameters used to schedule
+    //       this enrollment attempt. If no ClientDirective was used by the
+    //       scheduler, base::nullopt is passed.
+    virtual void OnEnrollmentRequested(
+        const cryptauthv2::ClientMetadata& client_metadata,
+        const base::Optional<cryptauthv2::PolicyReference>&
+            client_directive_policy_reference) = 0;
+  };
+
+  virtual ~CryptAuthScheduler();
+
+  // Note: This should only be called once.
+  void StartEnrollmentScheduling(
+      const base::WeakPtr<EnrollmentDelegate>& enrollment_delegate);
+
+  bool HasEnrollmentSchedulingStarted();
+
+  // Requests an enrollment with the desired |invocation_reason| and, if
+  // relevant, the |session_id| of the GCM message that requested enrollment.
+  virtual void RequestEnrollment(
+      const cryptauthv2::ClientMetadata::InvocationReason& invocation_reason,
+      const base::Optional<std::string>& session_id) = 0;
+
+  // Processes the result of the previous enrollment attempt.
+  virtual void HandleEnrollmentResult(
+      const CryptAuthEnrollmentResult& enrollment_result) = 0;
+
+  // Returns the time of the last known successful enrollment. If no successful
+  // enrollment has occurred, base::nullopt is returned.
+  virtual base::Optional<base::Time> GetLastSuccessfulEnrollmentTime()
+      const = 0;
+
+  // Returns the scheduler's time period between a successful enrollment and its
+  // next enrollment request. Note that this period may not be strictly adhered
+  // to due to RequestEnrollment() calls or the system being offline, for
+  // instance.
+  virtual base::TimeDelta GetRefreshPeriod() const = 0;
+
+  // Returns the time until the next scheduled enrollment request.
+  virtual base::TimeDelta GetTimeToNextEnrollmentRequest() const = 0;
+
+  // Return true if an enrollment has been requested but the enrollment result
+  // has not been processed yet.
+  virtual bool IsWaitingForEnrollmentResult() const = 0;
+
+  // The number of times the current enrollment request has failed. Once the
+  // enrollment request succeeds or a fresh request is made--for example, via a
+  // forced enrollment--this counter is reset.
+  virtual size_t GetNumConsecutiveEnrollmentFailures() const = 0;
+
+ protected:
+  CryptAuthScheduler();
+
+  virtual void OnEnrollmentSchedulingStarted();
+
+  // Alerts the delegate that an enrollment has been requested.
+  void NotifyEnrollmentRequested(
+      const cryptauthv2::ClientMetadata& client_metadata,
+      const base::Optional<cryptauthv2::PolicyReference>&
+          client_directive_policy_reference) const;
+
+ private:
+  base::WeakPtr<EnrollmentDelegate> enrollment_delegate_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(CryptAuthScheduler);
+};
+
+}  // namespace device_sync
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_SCHEDULER_H_
diff --git a/chromeos/services/device_sync/cryptauth_scheduler_impl.cc b/chromeos/services/device_sync/cryptauth_scheduler_impl.cc
new file mode 100644
index 0000000..acc6474
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_scheduler_impl.cc
@@ -0,0 +1,448 @@
+// 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 "chromeos/services/device_sync/cryptauth_scheduler_impl.h"
+
+#include <algorithm>
+#include <utility>
+
+#include "base/base64.h"
+#include "base/memory/ptr_util.h"
+#include "base/no_destructor.h"
+#include "chromeos/components/multidevice/logging/logging.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/network_state_handler.h"
+#include "chromeos/services/device_sync/pref_names.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/pref_service.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+namespace {
+
+constexpr base::TimeDelta kZeroTimeDelta = base::TimeDelta::FromSeconds(0);
+
+// The default period between successful enrollments in days. Superseded by the
+// ClientDirective's checkin_delay_millis sent by CryptAuth in SyncKeysResponse.
+constexpr base::TimeDelta kDefaultRefreshPeriod = base::TimeDelta::FromDays(30);
+
+// The default period, in hours, between enrollment attempts if the previous
+// enrollment attempt failed. Superseded by the ClientDirective's
+// retry_period_millis sent by CryptAuth in SyncKeysResponse.
+constexpr base::TimeDelta kDefaultRetryPeriod = base::TimeDelta::FromHours(12);
+
+// The time to wait before an "immediate" retry attempt after a failed
+// enrollment attempt. Note: SyncKeys requests are throttled by CryptAuth if
+// more than one is sent within a five-minute window.
+constexpr base::TimeDelta kImmediateRetryDelay =
+    base::TimeDelta::FromMinutes(5);
+
+// The default number of "immediate" retries after a failed enrollment attempt.
+// Superseded by the ClientDirective's retry_attempts sent by CryptAuth in the
+// SyncKeysResponse.
+const int kDefaultMaxImmediateRetries = 3;
+
+const char kNoClientDirective[] = "[No ClientDirective]";
+
+const char kNoClientMetadata[] = "[No ClientMetadata]";
+
+bool IsClientDirectiveValid(
+    const cryptauthv2::ClientDirective& client_directive) {
+  return client_directive.checkin_delay_millis() > 0 &&
+         client_directive.retry_period_millis() > 0 &&
+         client_directive.retry_attempts() >= 0;
+}
+
+// Fills a ClientDirective with our chosen default parameters. This
+// ClientDirective is used until a ClientDirective is received from CryptAuth in
+// the SyncKeysResponse.
+cryptauthv2::ClientDirective CreateDefaultClientDirective() {
+  cryptauthv2::ClientDirective client_directive;
+  client_directive.set_checkin_delay_millis(
+      kDefaultRefreshPeriod.InMilliseconds());
+  client_directive.set_retry_period_millis(
+      kDefaultRetryPeriod.InMilliseconds());
+  client_directive.set_retry_attempts(kDefaultMaxImmediateRetries);
+
+  return client_directive;
+}
+
+// Decodes and parses the base64-encoded serialized ClientDirective string.
+// TODO(https://crbug.com/964563): Replace when utility functions are added.
+base::Optional<cryptauthv2::ClientDirective> ClientDirectiveFromPrefString(
+    const std::string& encoded_serialized_client_directive) {
+  if (encoded_serialized_client_directive == kNoClientDirective)
+    return base::nullopt;
+
+  std::string decoded_serialized_client_directive;
+  if (!base::Base64Decode(encoded_serialized_client_directive,
+                          &decoded_serialized_client_directive)) {
+    PA_LOG(ERROR) << "Error decoding ClientDirective pref string";
+    return base::nullopt;
+  }
+
+  cryptauthv2::ClientDirective client_directive;
+  if (!client_directive.ParseFromString(decoded_serialized_client_directive)) {
+    PA_LOG(ERROR) << "Error parsing ClientDirective from pref string";
+    return base::nullopt;
+  }
+
+  return client_directive;
+}
+
+// Serializes and base64 encodes the input ClientDirective.
+// TODO(https://crbug.com/964563): Replace when utility functions are added.
+std::string ClientDirectiveToPrefString(
+    const cryptauthv2::ClientDirective& client_directive) {
+  std::string encoded_serialized_client_directive;
+  base::Base64Encode(client_directive.SerializeAsString(),
+                     &encoded_serialized_client_directive);
+
+  return encoded_serialized_client_directive;
+}
+
+cryptauthv2::ClientDirective BuildClientDirective(PrefService* pref_service) {
+  DCHECK(pref_service);
+
+  base::Optional<cryptauthv2::ClientDirective> client_directive_from_pref =
+      ClientDirectiveFromPrefString(
+          pref_service->GetString(prefs::kCryptAuthSchedulerClientDirective));
+  if (client_directive_from_pref)
+    return *client_directive_from_pref;
+
+  return CreateDefaultClientDirective();
+}
+
+cryptauthv2::ClientMetadata BuildClientMetadata(
+    size_t retry_count,
+    const cryptauthv2::ClientMetadata::InvocationReason& invocation_reason,
+    const base::Optional<std::string>& session_id) {
+  cryptauthv2::ClientMetadata client_metadata;
+  client_metadata.set_retry_count(retry_count);
+  client_metadata.set_invocation_reason(invocation_reason);
+  if (session_id)
+    client_metadata.set_session_id(*session_id);
+
+  return client_metadata;
+}
+
+// TODO(https://crbug.com/964563): Replace when utility functions are added.
+base::Optional<cryptauthv2::ClientMetadata> ClientMetadataFromPrefString(
+    const std::string& encoded_serialized_client_metadata) {
+  if (encoded_serialized_client_metadata == kNoClientMetadata)
+    return base::nullopt;
+
+  std::string decoded_serialized_client_metadata;
+  if (!base::Base64Decode(encoded_serialized_client_metadata,
+                          &decoded_serialized_client_metadata)) {
+    PA_LOG(ERROR) << "Error decoding ClientMetadata pref string";
+    return base::nullopt;
+  }
+
+  cryptauthv2::ClientMetadata client_metadata;
+  if (!client_metadata.ParseFromString(decoded_serialized_client_metadata)) {
+    PA_LOG(ERROR) << "Error parsing ClientMetadata from pref string";
+    return base::nullopt;
+  }
+
+  return client_metadata;
+}
+
+// TODO(https://crbug.com/964563): Replace when utility functions are added.
+std::string ClientMetadataToPrefString(
+    const cryptauthv2::ClientMetadata& client_metadata) {
+  std::string encoded_serialized_client_metadata;
+  base::Base64Encode(client_metadata.SerializeAsString(),
+                     &encoded_serialized_client_metadata);
+
+  return encoded_serialized_client_metadata;
+}
+
+}  // namespace
+
+// static
+CryptAuthSchedulerImpl::Factory*
+    CryptAuthSchedulerImpl::Factory::test_factory_ = nullptr;
+
+// static
+CryptAuthSchedulerImpl::Factory* CryptAuthSchedulerImpl::Factory::Get() {
+  if (test_factory_)
+    return test_factory_;
+
+  static base::NoDestructor<CryptAuthSchedulerImpl::Factory> factory;
+  return factory.get();
+}
+
+// static
+void CryptAuthSchedulerImpl::Factory::SetFactoryForTesting(
+    Factory* test_factory) {
+  test_factory_ = test_factory;
+}
+
+CryptAuthSchedulerImpl::Factory::~Factory() = default;
+
+std::unique_ptr<CryptAuthScheduler>
+CryptAuthSchedulerImpl::Factory::BuildInstance(
+    PrefService* pref_service,
+    NetworkStateHandler* network_state_handler,
+    base::Clock* clock,
+    std::unique_ptr<base::OneShotTimer> enrollment_timer) {
+  return base::WrapUnique(new CryptAuthSchedulerImpl(
+      pref_service, network_state_handler, clock, std::move(enrollment_timer)));
+}
+
+// static
+void CryptAuthSchedulerImpl::RegisterPrefs(PrefRegistrySimple* registry) {
+  registry->RegisterStringPref(prefs::kCryptAuthSchedulerClientDirective,
+                               kNoClientDirective);
+  registry->RegisterStringPref(
+      prefs::kCryptAuthSchedulerNextEnrollmentRequestClientMetadata,
+      kNoClientMetadata);
+  registry->RegisterTimePref(
+      prefs::kCryptAuthSchedulerLastEnrollmentAttemptTime, base::Time());
+  registry->RegisterTimePref(
+      prefs::kCryptAuthSchedulerLastSuccessfulEnrollmentTime, base::Time());
+}
+
+CryptAuthSchedulerImpl::CryptAuthSchedulerImpl(
+    PrefService* pref_service,
+    NetworkStateHandler* network_state_handler,
+    base::Clock* clock,
+    std::unique_ptr<base::OneShotTimer> enrollment_timer)
+    : pref_service_(pref_service),
+      network_state_handler_(network_state_handler),
+      clock_(clock),
+      enrollment_timer_(std::move(enrollment_timer)),
+      client_directive_(BuildClientDirective(pref_service)) {
+  DCHECK(pref_service_);
+  DCHECK(network_state_handler_);
+  DCHECK(clock_);
+  DCHECK(IsClientDirectiveValid(client_directive_));
+
+  // Queue up the most recently scheduled enrollment request if applicable.
+  pending_enrollment_request_ =
+      ClientMetadataFromPrefString(pref_service_->GetString(
+          prefs::kCryptAuthSchedulerNextEnrollmentRequestClientMetadata));
+
+  // If we are recovering from a failure, reset the failure count to 1 in the
+  // hopes that the restart solved the issue. This will allow for immediate
+  // retries again if allowed by the ClientDirective.
+  if (pending_enrollment_request_ &&
+      pending_enrollment_request_->retry_count() > 0) {
+    pending_enrollment_request_->set_retry_count(1);
+  }
+}
+
+CryptAuthSchedulerImpl::~CryptAuthSchedulerImpl() {
+  if (network_state_handler_)
+    network_state_handler_->RemoveObserver(this, FROM_HERE);
+}
+
+void CryptAuthSchedulerImpl::OnEnrollmentSchedulingStarted() {
+  network_state_handler_->AddObserver(this, FROM_HERE);
+
+  ScheduleNextEnrollment();
+}
+
+void CryptAuthSchedulerImpl::RequestEnrollment(
+    const cryptauthv2::ClientMetadata::InvocationReason& invocation_reason,
+    const base::Optional<std::string>& session_id) {
+  enrollment_timer_->Stop();
+
+  pending_enrollment_request_ =
+      BuildClientMetadata(0 /* retry_count */, invocation_reason, session_id);
+
+  ScheduleNextEnrollment();
+}
+
+void CryptAuthSchedulerImpl::HandleEnrollmentResult(
+    const CryptAuthEnrollmentResult& enrollment_result) {
+  DCHECK(current_enrollment_request_);
+  DCHECK(!enrollment_timer_->IsRunning());
+
+  base::Time now = clock_->Now();
+
+  pref_service_->SetTime(prefs::kCryptAuthSchedulerLastEnrollmentAttemptTime,
+                         now);
+
+  // If unsuccessful and a more immediate request isn't pending, queue up the
+  // failure recovery attempt.
+  if (enrollment_result.IsSuccess()) {
+    pref_service_->SetTime(
+        prefs::kCryptAuthSchedulerLastSuccessfulEnrollmentTime, now);
+  } else if (!pending_enrollment_request_) {
+    current_enrollment_request_->set_retry_count(
+        current_enrollment_request_->retry_count() + 1);
+    pending_enrollment_request_ = current_enrollment_request_;
+  }
+
+  if (enrollment_result.client_directive() &&
+      IsClientDirectiveValid(*enrollment_result.client_directive())) {
+    client_directive_ = *enrollment_result.client_directive();
+
+    pref_service_->SetString(prefs::kCryptAuthSchedulerClientDirective,
+                             ClientDirectiveToPrefString(client_directive_));
+  }
+
+  current_enrollment_request_.reset();
+
+  ScheduleNextEnrollment();
+}
+
+base::Optional<base::Time>
+CryptAuthSchedulerImpl::GetLastSuccessfulEnrollmentTime() const {
+  base::Time time = pref_service_->GetTime(
+      prefs::kCryptAuthSchedulerLastSuccessfulEnrollmentTime);
+  if (time.is_null())
+    return base::nullopt;
+
+  return time;
+}
+
+base::TimeDelta CryptAuthSchedulerImpl::GetRefreshPeriod() const {
+  return base::TimeDelta::FromMilliseconds(
+      client_directive_.checkin_delay_millis());
+}
+
+base::TimeDelta CryptAuthSchedulerImpl::GetTimeToNextEnrollmentRequest() const {
+  // Enrollment already requested.
+  if (IsWaitingForEnrollmentResult())
+    return kZeroTimeDelta;
+
+  if (!pending_enrollment_request_)
+    return base::TimeDelta::Max();
+
+  // Attempt the pending enrollment request immediately unless it is periodic.
+  if (pending_enrollment_request_->retry_count() == 0) {
+    if (pending_enrollment_request_->invocation_reason() !=
+        cryptauthv2::ClientMetadata::PERIODIC) {
+      return kZeroTimeDelta;
+    }
+
+    base::Optional<base::Time> last_successful_enrollment_time =
+        GetLastSuccessfulEnrollmentTime();
+    if (!last_successful_enrollment_time)
+      return kZeroTimeDelta;
+
+    base::TimeDelta time_since_last_success =
+        clock_->Now() - *last_successful_enrollment_time;
+    return std::max(kZeroTimeDelta,
+                    GetRefreshPeriod() - time_since_last_success);
+  }
+
+  base::TimeDelta time_since_last_attempt =
+      clock_->Now() - pref_service_->GetTime(
+                          prefs::kCryptAuthSchedulerLastEnrollmentAttemptTime);
+
+  // Recover from failure using immediate retry.
+  if (pending_enrollment_request_->retry_count() <=
+      client_directive_.retry_attempts()) {
+    return std::max(kZeroTimeDelta,
+                    kImmediateRetryDelay - time_since_last_attempt);
+  }
+
+  // Recover from failure after expending allotted immediate retries.
+  return std::max(kZeroTimeDelta, base::TimeDelta::FromMilliseconds(
+                                      client_directive_.retry_period_millis()) -
+                                      time_since_last_attempt);
+}
+
+bool CryptAuthSchedulerImpl::IsWaitingForEnrollmentResult() const {
+  return current_enrollment_request_.has_value();
+}
+
+size_t CryptAuthSchedulerImpl::GetNumConsecutiveEnrollmentFailures() const {
+  if (current_enrollment_request_)
+    return current_enrollment_request_->retry_count();
+
+  if (pending_enrollment_request_)
+    return pending_enrollment_request_->retry_count();
+
+  return 0;
+}
+
+void CryptAuthSchedulerImpl::DefaultNetworkChanged(
+    const NetworkState* network) {
+  // The updated default network may not be online.
+  if (!DoesMachineHaveNetworkConnectivity())
+    return;
+
+  // Now that the device has connectivity, reschedule enrollment.
+  ScheduleNextEnrollment();
+}
+
+void CryptAuthSchedulerImpl::OnShuttingDown() {
+  DCHECK(network_state_handler_);
+  network_state_handler_->RemoveObserver(this, FROM_HERE);
+  network_state_handler_ = nullptr;
+}
+
+bool CryptAuthSchedulerImpl::DoesMachineHaveNetworkConnectivity() {
+  if (!network_state_handler_)
+    return false;
+
+  // TODO(khorimoto): IsConnectedState() can still return true if connected to
+  // a captive portal; use the "online" boolean once we fetch data via the
+  // networking Mojo API. See https://crbug.com/862420.
+  const NetworkState* default_network =
+      network_state_handler_->DefaultNetwork();
+  return default_network && default_network->IsConnectedState();
+}
+
+void CryptAuthSchedulerImpl::ScheduleNextEnrollment() {
+  // Wait for the current enrollment attempt to finish before determining the
+  // next enrollment request in case we need to recover from a failure.
+  if (IsWaitingForEnrollmentResult())
+    return;
+
+  // If no enrollment request has been explicitly made, schedule the standard
+  // periodic enrollment attempt.
+  if (!pending_enrollment_request_) {
+    pending_enrollment_request_ =
+        BuildClientMetadata(0 /* retry_count */,
+                            GetLastSuccessfulEnrollmentTime()
+                                ? cryptauthv2::ClientMetadata::PERIODIC
+                                : cryptauthv2::ClientMetadata::INITIALIZATION,
+                            base::nullopt /* session_id */);
+  }
+
+  DCHECK(pending_enrollment_request_);
+  pref_service_->SetString(
+      prefs::kCryptAuthSchedulerNextEnrollmentRequestClientMetadata,
+      ClientMetadataToPrefString(*pending_enrollment_request_));
+
+  if (!HasEnrollmentSchedulingStarted())
+    return;
+
+  enrollment_timer_->Start(
+      FROM_HERE, GetTimeToNextEnrollmentRequest(),
+      base::BindOnce(&CryptAuthSchedulerImpl::OnEnrollmentTimerFired,
+                     base::Unretained(this)));
+}
+
+void CryptAuthSchedulerImpl::OnEnrollmentTimerFired() {
+  DCHECK(!current_enrollment_request_);
+  DCHECK(pending_enrollment_request_);
+
+  if (!DoesMachineHaveNetworkConnectivity()) {
+    PA_LOG(INFO) << "Enrollment triggered while the device is offline. Waiting "
+                 << "for online connectivity before making request.";
+    return;
+  }
+
+  current_enrollment_request_ = pending_enrollment_request_;
+  pending_enrollment_request_.reset();
+
+  base::Optional<cryptauthv2::PolicyReference> policy_reference = base::nullopt;
+  if (client_directive_.has_policy_reference())
+    policy_reference = client_directive_.policy_reference();
+
+  NotifyEnrollmentRequested(*current_enrollment_request_, policy_reference);
+}
+
+}  // namespace device_sync
+
+}  // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_scheduler_impl.h b/chromeos/services/device_sync/cryptauth_scheduler_impl.h
new file mode 100644
index 0000000..f6aa22f
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_scheduler_impl.h
@@ -0,0 +1,123 @@
+// 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 CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_SCHEDULER_IMPL_H_
+#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_SCHEDULER_IMPL_H_
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/optional.h"
+#include "base/time/default_clock.h"
+#include "base/timer/timer.h"
+#include "chromeos/network/network_handler.h"
+#include "chromeos/network/network_state_handler_observer.h"
+#include "chromeos/services/device_sync/cryptauth_scheduler.h"
+#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
+#include "chromeos/services/device_sync/proto/cryptauth_directive.pb.h"
+
+class PrefRegistrySimple;
+class PrefService;
+
+namespace chromeos {
+
+class NetworkStateHandler;
+
+namespace device_sync {
+
+// CryptAuthScheduler implementation which stores scheduling metadata
+// persistently so that the enrollment schedule is saved across device reboots.
+//
+// Enrollment scheduling will not start until StartEnrollmentScheduling() is
+// called. Enrollment requests made before scheduling has started, while another
+// enrollment request is in process, or while offline will be cached and
+// rescheduled as soon as possible.
+//
+// Enrollment requests can come from four sources:
+//   1) If an enrollment has never successfully completed, an initialization
+//      request will be made immediately.
+//   2) Periodic enrollment requests are made at time intervals provided by the
+//      server in the ClientDirective proto.
+//   3) Enrollment requests can be made using the scheduler's public function
+//      RequestEnrollment().
+//   4) Failed enrollment attempts will be retried at time intervals provided by
+//      the server in the ClientDirective proto.
+class CryptAuthSchedulerImpl : public CryptAuthScheduler,
+                               public NetworkStateHandlerObserver {
+ public:
+  class Factory {
+   public:
+    static Factory* Get();
+    static void SetFactoryForTesting(Factory* test_factory);
+    virtual ~Factory();
+    virtual std::unique_ptr<CryptAuthScheduler> BuildInstance(
+        PrefService* pref_service,
+        NetworkStateHandler* network_state_handler =
+            NetworkHandler::Get()->network_state_handler(),
+        base::Clock* clock = base::DefaultClock::GetInstance(),
+        std::unique_ptr<base::OneShotTimer> enrollment_timer =
+            std::make_unique<base::OneShotTimer>());
+
+   private:
+    static Factory* test_factory_;
+  };
+
+  // Registers the prefs used by this class to the given |registry|.
+  static void RegisterPrefs(PrefRegistrySimple* registry);
+
+  ~CryptAuthSchedulerImpl() override;
+
+ private:
+  CryptAuthSchedulerImpl(PrefService* pref_service,
+                         NetworkStateHandler* network_state_handler,
+                         base::Clock* clock,
+                         std::unique_ptr<base::OneShotTimer> enrollment_timer);
+
+  // CryptAuthScheduler:
+  void OnEnrollmentSchedulingStarted() override;
+  void RequestEnrollment(
+      const cryptauthv2::ClientMetadata::InvocationReason& invocation_reason,
+      const base::Optional<std::string>& session_id) override;
+  void HandleEnrollmentResult(
+      const CryptAuthEnrollmentResult& enrollment_result) override;
+  base::Optional<base::Time> GetLastSuccessfulEnrollmentTime() const override;
+  base::TimeDelta GetRefreshPeriod() const override;
+  base::TimeDelta GetTimeToNextEnrollmentRequest() const override;
+  bool IsWaitingForEnrollmentResult() const override;
+  size_t GetNumConsecutiveEnrollmentFailures() const override;
+
+  // NetworkStateHandlerObserver:
+  void DefaultNetworkChanged(const NetworkState* network) override;
+  void OnShuttingDown() override;
+
+  bool DoesMachineHaveNetworkConnectivity();
+
+  // Starts a new timer that will fire when an enrollment is ready to be
+  // attempted.
+  void ScheduleNextEnrollment();
+
+  void OnEnrollmentTimerFired();
+
+  base::Optional<cryptauthv2::ClientMetadata> pending_enrollment_request_;
+
+  // Only non-null while an enrollment attempt is in progress, in other words,
+  // between NotifyEnrollmentRequested() and HandleEnrollmentResult().
+  base::Optional<cryptauthv2::ClientMetadata> current_enrollment_request_;
+
+  PrefService* pref_service_ = nullptr;
+  NetworkStateHandler* network_state_handler_ = nullptr;
+  base::Clock* clock_ = nullptr;
+  std::unique_ptr<base::OneShotTimer> enrollment_timer_ = nullptr;
+  cryptauthv2::ClientDirective client_directive_;
+
+  DISALLOW_COPY_AND_ASSIGN(CryptAuthSchedulerImpl);
+};
+
+}  // namespace device_sync
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_SCHEDULER_IMPL_H_
diff --git a/chromeos/services/device_sync/cryptauth_scheduler_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_scheduler_impl_unittest.cc
new file mode 100644
index 0000000..aa6e112
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_scheduler_impl_unittest.cc
@@ -0,0 +1,639 @@
+// 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 "chromeos/services/device_sync/cryptauth_scheduler_impl.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/base64.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/test/scoped_task_environment.h"
+#include "base/test/simple_test_clock.h"
+#include "base/timer/mock_timer.h"
+#include "chromeos/network/network_state_test_helper.h"
+#include "chromeos/services/device_sync/fake_cryptauth_scheduler.h"
+#include "chromeos/services/device_sync/pref_names.h"
+#include "chromeos/services/device_sync/proto/cryptauth_v2_test_util.h"
+#include "components/prefs/testing_pref_service.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+namespace {
+
+enum class NetworkConnectionStatus { kDisconnected, kConnecting, kConnected };
+
+constexpr base::TimeDelta kZeroTimeDelta = base::TimeDelta::FromSeconds(0);
+constexpr base::TimeDelta kImmediateRetryDelay =
+    base::TimeDelta::FromMinutes(5);
+const char kWifiServiceGuid[] = "wifiGuid";
+const char kSessionId[] = "sessionId";
+
+// Serializes and base64 encodes the input ClientDirective.
+// Copied from cryptauth_enrollment_scheduler_impl.cc.
+// TODO(https://crbug.com/964563): Replace when utility functions are added.
+std::string ClientDirectiveToPrefString(
+    const cryptauthv2::ClientDirective& client_directive) {
+  std::string encoded_serialized_client_directive;
+  base::Base64Encode(client_directive.SerializeAsString(),
+                     &encoded_serialized_client_directive);
+
+  return encoded_serialized_client_directive;
+}
+
+// TODO(https://crbug.com/964563): Replace when utility functions are added.
+std::string ClientMetadataToPrefString(
+    const cryptauthv2::ClientMetadata& client_metadata) {
+  std::string encoded_serialized_client_metadata;
+  base::Base64Encode(client_metadata.SerializeAsString(),
+                     &encoded_serialized_client_metadata);
+
+  return encoded_serialized_client_metadata;
+}
+
+}  // namespace
+
+class DeviceSyncCryptAuthSchedulerImplTest : public testing::Test {
+ protected:
+  DeviceSyncCryptAuthSchedulerImplTest() = default;
+
+  ~DeviceSyncCryptAuthSchedulerImplTest() override = default;
+
+  void SetUp() override {
+    CryptAuthSchedulerImpl::RegisterPrefs(pref_service_.registry());
+  }
+
+  void CreateScheduler(
+      const base::Optional<cryptauthv2::ClientDirective>&
+          persisted_client_directive,
+      const base::Optional<cryptauthv2::ClientMetadata>&
+          persisted_client_metadata,
+      const base::Optional<base::Time>& persisted_last_enrollment_attempt_time,
+      const base::Optional<base::Time>&
+          persisted_last_successful_enrollment_time) {
+    if (persisted_client_directive) {
+      pref_service_.SetString(
+          prefs::kCryptAuthSchedulerClientDirective,
+          ClientDirectiveToPrefString(*persisted_client_directive));
+    }
+
+    if (persisted_client_metadata) {
+      pref_service_.SetString(
+          prefs::kCryptAuthSchedulerNextEnrollmentRequestClientMetadata,
+          ClientMetadataToPrefString(*persisted_client_metadata));
+    }
+
+    if (persisted_last_enrollment_attempt_time) {
+      pref_service_.SetTime(prefs::kCryptAuthSchedulerLastEnrollmentAttemptTime,
+                            *persisted_last_enrollment_attempt_time);
+    }
+
+    if (persisted_last_successful_enrollment_time) {
+      pref_service_.SetTime(
+          prefs::kCryptAuthSchedulerLastSuccessfulEnrollmentTime,
+          *persisted_last_successful_enrollment_time);
+    }
+
+    EXPECT_TRUE(!scheduler_);
+
+    auto mock_enrollment_timer = std::make_unique<base::MockOneShotTimer>();
+    mock_enrollment_timer_ = mock_enrollment_timer.get();
+
+    scheduler_ = CryptAuthSchedulerImpl::Factory::Get()->BuildInstance(
+        &pref_service_, network_helper_.network_state_handler(), &test_clock_,
+        std::move(mock_enrollment_timer));
+
+    VerifyLastEnrollmentAttemptTime(persisted_last_enrollment_attempt_time);
+    VerifyLastSuccessfulEnrollmentTime(
+        persisted_last_successful_enrollment_time);
+  }
+
+  void AddDisconnectedWifiNetwork() {
+    EXPECT_TRUE(wifi_network_service_path_.empty());
+
+    std::stringstream ss;
+    ss << "{"
+       << "  \"GUID\": \"" << kWifiServiceGuid << "\","
+       << "  \"Type\": \"" << shill::kTypeWifi << "\","
+       << "  \"State\": \"" << shill::kStateIdle << "\""
+       << "}";
+
+    wifi_network_service_path_ = network_helper_.ConfigureService(ss.str());
+  }
+
+  void SetWifiNetworkStatus(NetworkConnectionStatus connection_status) {
+    std::string shill_connection_status;
+    switch (connection_status) {
+      case NetworkConnectionStatus::kDisconnected:
+        shill_connection_status = shill::kStateIdle;
+        break;
+      case NetworkConnectionStatus::kConnecting:
+        shill_connection_status = shill::kStateAssociation;
+        break;
+      case NetworkConnectionStatus::kConnected:
+        shill_connection_status = shill::kStateReady;
+        break;
+    }
+
+    network_helper_.SetServiceProperty(wifi_network_service_path_,
+                                       shill::kStateProperty,
+                                       base::Value(shill_connection_status));
+    base::RunLoop().RunUntilIdle();
+  }
+
+  void RemoveWifiNetwork() {
+    EXPECT_TRUE(!wifi_network_service_path_.empty());
+
+    network_helper_.service_test()->RemoveService(wifi_network_service_path_);
+    base::RunLoop().RunUntilIdle();
+
+    wifi_network_service_path_.clear();
+  }
+
+  void VerifyLastClientMetadataReceivedByEnrollmentDelegate(
+      size_t total_received,
+      const base::Optional<cryptauthv2::ClientMetadata>& last_received =
+          base::nullopt) {
+    EXPECT_EQ(total_received, fake_enrollment_delegate_
+                                  .client_metadata_from_enrollment_requests()
+                                  .size());
+
+    if (fake_enrollment_delegate_.client_metadata_from_enrollment_requests()
+            .empty())
+      return;
+
+    EXPECT_TRUE(last_received);
+    EXPECT_EQ(
+        last_received->SerializeAsString(),
+        fake_enrollment_delegate_.client_metadata_from_enrollment_requests()
+            .back()
+            .SerializeAsString());
+  }
+
+  void VerifyLastPolicyReferenceReceivedByEnrollmentDelegate(
+      size_t total_received,
+      const base::Optional<cryptauthv2::PolicyReference>& last_received =
+          base::nullopt) {
+    EXPECT_EQ(total_received, fake_enrollment_delegate_
+                                  .policy_references_from_enrollment_requests()
+                                  .size());
+
+    if (fake_enrollment_delegate_.policy_references_from_enrollment_requests()
+            .empty())
+      return;
+
+    EXPECT_EQ(
+        last_received.has_value(),
+        fake_enrollment_delegate_.policy_references_from_enrollment_requests()
+            .back()
+            .has_value());
+
+    if (fake_enrollment_delegate_.policy_references_from_enrollment_requests()
+            .back()
+            .has_value() &&
+        last_received.has_value()) {
+      EXPECT_EQ(
+          last_received->SerializeAsString(),
+          fake_enrollment_delegate_.policy_references_from_enrollment_requests()
+              .back()
+              ->SerializeAsString());
+    }
+  }
+
+  void VerifyLastSuccessfulEnrollmentTime(
+      const base::Optional<base::Time>& expected_time) {
+    EXPECT_EQ(expected_time, scheduler_->GetLastSuccessfulEnrollmentTime());
+
+    EXPECT_EQ(pref_service_.GetTime(
+                  prefs::kCryptAuthSchedulerLastSuccessfulEnrollmentTime),
+              expected_time.value_or(base::Time()));
+  }
+
+  void VerifyLastEnrollmentAttemptTime(
+      const base::Optional<base::Time>& expected_time) {
+    EXPECT_EQ(pref_service_.GetTime(
+                  prefs::kCryptAuthSchedulerLastEnrollmentAttemptTime),
+              expected_time.value_or(base::Time()));
+  }
+
+  void VerifyClientDirective(
+      const cryptauthv2::ClientDirective& expected_client_directive) {
+    EXPECT_EQ(
+        ClientDirectiveToPrefString(expected_client_directive),
+        pref_service_.GetString(prefs::kCryptAuthSchedulerClientDirective));
+    EXPECT_EQ(base::TimeDelta::FromMilliseconds(
+                  expected_client_directive.checkin_delay_millis()),
+              scheduler()->GetRefreshPeriod());
+  }
+
+  void VerifyScheduledEnrollment(
+      const cryptauthv2::ClientMetadata& expected_scheduled_enrollment_request,
+      const base::TimeDelta& expected_delay) {
+    VerifyNextEnrollmentRequest(expected_scheduled_enrollment_request);
+    EXPECT_TRUE(mock_enrollment_timer_->IsRunning());
+    EXPECT_EQ(expected_delay, mock_enrollment_timer_->GetCurrentDelay());
+    EXPECT_EQ(expected_delay, scheduler_->GetTimeToNextEnrollmentRequest());
+    EXPECT_FALSE(scheduler()->IsWaitingForEnrollmentResult());
+  }
+
+  void VerifyNoEnrollmentsTriggeredButRequestQueued(
+      const cryptauthv2::ClientMetadata& expected_enrollment_request) {
+    VerifyNextEnrollmentRequest(expected_enrollment_request);
+    EXPECT_FALSE(enrollment_timer()->IsRunning());
+    EXPECT_FALSE(scheduler()->IsWaitingForEnrollmentResult());
+    VerifyLastPolicyReferenceReceivedByEnrollmentDelegate(
+        0 /* total_received */);
+    VerifyLastClientMetadataReceivedByEnrollmentDelegate(
+        0 /* total_received */);
+  }
+
+  base::WeakPtr<FakeCryptAuthSchedulerEnrollmentDelegate>
+  fake_enrollment_delegate() {
+    return fake_enrollment_delegate_.GetWeakPtr();
+  }
+
+  base::SimpleTestClock* clock() { return &test_clock_; }
+
+  base::MockOneShotTimer* enrollment_timer() { return mock_enrollment_timer_; }
+
+  CryptAuthScheduler* scheduler() { return scheduler_.get(); }
+
+ private:
+  void VerifyNextEnrollmentRequest(
+      const cryptauthv2::ClientMetadata& expected_enrollment_request) {
+    EXPECT_EQ(
+        ClientMetadataToPrefString(expected_enrollment_request),
+        pref_service_.GetString(
+            prefs::kCryptAuthSchedulerNextEnrollmentRequestClientMetadata));
+  }
+
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  FakeCryptAuthSchedulerEnrollmentDelegate fake_enrollment_delegate_;
+  TestingPrefServiceSimple pref_service_;
+  base::SimpleTestClock test_clock_;
+  base::MockOneShotTimer* mock_enrollment_timer_;
+  NetworkStateTestHelper network_helper_{
+      false /* use_default_devices_and_services */};
+  std::string wifi_network_service_path_;
+  std::unique_ptr<CryptAuthScheduler> scheduler_;
+
+  DISALLOW_COPY_AND_ASSIGN(DeviceSyncCryptAuthSchedulerImplTest);
+};
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest,
+       SuccessfulInitializationAndPeriodicEnrollments) {
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+
+  const base::Time kStartTime = base::Time::FromDoubleT(1600600000);
+  const base::Time kInitializationFinishTime =
+      kStartTime + base::TimeDelta::FromSeconds(5);
+
+  clock()->SetNow(kStartTime);
+
+  CreateScheduler(base::nullopt /* persisted_client_directive */,
+                  base::nullopt /* persisted_client_metadata */,
+                  base::nullopt /* persisted_last_enrollment_attempt_time */,
+                  base::nullopt /* persisted_last_successful_enrollment_time */
+  );
+
+  // No enrollment has been scheduled yet.
+  EXPECT_FALSE(enrollment_timer()->IsRunning());
+  EXPECT_EQ(base::TimeDelta::Max(),
+            scheduler()->GetTimeToNextEnrollmentRequest());
+
+  EXPECT_FALSE(scheduler()->HasEnrollmentSchedulingStarted());
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+  EXPECT_TRUE(scheduler()->HasEnrollmentSchedulingStarted());
+
+  // No successful enrollment has ever occurred; attempt immediately.
+  cryptauthv2::ClientMetadata expected_scheduled_enrollment_request =
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, cryptauthv2::ClientMetadata::INITIALIZATION,
+          base::nullopt /* session_id */);
+  VerifyScheduledEnrollment(expected_scheduled_enrollment_request,
+                            kZeroTimeDelta /* expected_delay */);
+
+  enrollment_timer()->Fire();
+  EXPECT_TRUE(scheduler()->IsWaitingForEnrollmentResult());
+
+  // There is no policy reference until CryptAuth sends one with a
+  // ClientDirective.
+  VerifyLastPolicyReferenceReceivedByEnrollmentDelegate(
+      1 /* total_received */, base::nullopt /* last_received*/);
+  VerifyLastClientMetadataReceivedByEnrollmentDelegate(
+      1 /* total_received */, expected_scheduled_enrollment_request);
+
+  clock()->SetNow(kInitializationFinishTime);
+  scheduler()->HandleEnrollmentResult(CryptAuthEnrollmentResult(
+      CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
+      cryptauthv2::GetClientDirectiveForTest()));
+  VerifyLastEnrollmentAttemptTime(kInitializationFinishTime);
+  VerifyLastSuccessfulEnrollmentTime(kInitializationFinishTime);
+  VerifyClientDirective(cryptauthv2::GetClientDirectiveForTest());
+
+  // A periodic enrollment attempt is now scheduled.
+  expected_scheduled_enrollment_request = cryptauthv2::BuildClientMetadata(
+      0 /* retry_count */, cryptauthv2::ClientMetadata::PERIODIC,
+      base::nullopt /* session_id */);
+  VerifyScheduledEnrollment(
+      expected_scheduled_enrollment_request,
+      scheduler()->GetRefreshPeriod() /* expected_delay */);
+
+  base::Time periodic_fired_time =
+      kInitializationFinishTime + scheduler()->GetRefreshPeriod();
+  clock()->SetNow(periodic_fired_time);
+  enrollment_timer()->Fire();
+
+  VerifyLastPolicyReferenceReceivedByEnrollmentDelegate(
+      2 /* total_received */,
+      cryptauthv2::GetClientDirectiveForTest().policy_reference());
+  VerifyLastClientMetadataReceivedByEnrollmentDelegate(
+      2 /* total_received */, expected_scheduled_enrollment_request);
+
+  // Assume no new ClientDirective was received from CryptAuth this time;
+  // scheduler continues to use last-known ClientDirective.
+  scheduler()->HandleEnrollmentResult(CryptAuthEnrollmentResult(
+      CryptAuthEnrollmentResult::ResultCode::kSuccessNoNewKeysNeeded,
+      base::nullopt /* client_directive */));
+  VerifyLastEnrollmentAttemptTime(periodic_fired_time);
+  VerifyLastSuccessfulEnrollmentTime(periodic_fired_time);
+  VerifyClientDirective(cryptauthv2::GetClientDirectiveForTest());
+}
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest, FailedEnrollments) {
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+
+  CreateScheduler(
+      cryptauthv2::GetClientDirectiveForTest() /* persisted_client_directive */,
+      base::nullopt /* persisted_client_metadata */,
+      base::nullopt /* persisted_last_enrollment_attempt_time */,
+      base::nullopt /* persisted_last_successful_enrollment_time */
+  );
+
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+
+  cryptauthv2::ClientMetadata expected_enrollment_request =
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, cryptauthv2::ClientMetadata::INITIALIZATION,
+          base::nullopt /* session_id */);
+  VerifyScheduledEnrollment(expected_enrollment_request,
+                            kZeroTimeDelta /* expected_delay */);
+
+  // After using all immediate failure retry attempts allotted by the client
+  // directive, schedule retries using client directive's retry_period_millis.
+  for (int attempt = 1;
+       attempt <= cryptauthv2::GetClientDirectiveForTest().retry_attempts() + 3;
+       ++attempt) {
+    enrollment_timer()->Fire();
+    VerifyLastPolicyReferenceReceivedByEnrollmentDelegate(
+        attempt /* total_received */,
+        cryptauthv2::GetClientDirectiveForTest().policy_reference());
+    VerifyLastClientMetadataReceivedByEnrollmentDelegate(
+        attempt /* total_received */, expected_enrollment_request);
+
+    scheduler()->HandleEnrollmentResult(CryptAuthEnrollmentResult(
+        CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
+        base::nullopt /* client_directive */));
+
+    expected_enrollment_request.set_retry_count(attempt);
+    base::TimeDelta expected_delay =
+        attempt <= cryptauthv2::GetClientDirectiveForTest().retry_attempts()
+            ? kImmediateRetryDelay
+            : base::TimeDelta::FromMilliseconds(
+                  cryptauthv2::GetClientDirectiveForTest()
+                      .retry_period_millis());
+    VerifyScheduledEnrollment(expected_enrollment_request, expected_delay);
+  }
+}
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest,
+       EnrollmentRequestNotScheduledUntilSchedulerStarted) {
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+
+  CreateScheduler(base::nullopt /* persisted_client_directive */,
+                  base::nullopt /* persisted_client_metadata */,
+                  base::nullopt /* persisted_last_enrollment_attempt_time */,
+                  base::nullopt /* persisted_last_successful_enrollment_time */
+  );
+
+  scheduler()->RequestEnrollment(cryptauthv2::ClientMetadata::MANUAL,
+                                 kSessionId);
+  cryptauthv2::ClientMetadata expected_enrollment_request =
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, cryptauthv2::ClientMetadata::MANUAL, kSessionId);
+  VerifyNoEnrollmentsTriggeredButRequestQueued(expected_enrollment_request);
+
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+  VerifyScheduledEnrollment(expected_enrollment_request,
+                            kZeroTimeDelta /* expected_delay */);
+}
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest,
+       EnrollmentRequestScheduledAfterCurrentEnrollmentFinishes) {
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+
+  CreateScheduler(base::nullopt /* persisted_client_directive */,
+                  base::nullopt /* persisted_client_metadata */,
+                  base::nullopt /* persisted_last_enrollment_attempt_time */,
+                  base::nullopt /* persisted_last_successful_enrollment_time */
+  );
+
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+
+  // Start a server-initiated enrollment attempt.
+  scheduler()->RequestEnrollment(cryptauthv2::ClientMetadata::SERVER_INITIATED,
+                                 kSessionId);
+  enrollment_timer()->Fire();
+
+  // Request an enrollment while an enrollment attempt is in progress.
+  scheduler()->RequestEnrollment(cryptauthv2::ClientMetadata::MANUAL,
+                                 base::nullopt /* session_id */);
+  EXPECT_FALSE(enrollment_timer()->IsRunning());
+
+  scheduler()->HandleEnrollmentResult(CryptAuthEnrollmentResult(
+      CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
+      cryptauthv2::GetClientDirectiveForTest()));
+
+  // Pending request scheduled after current enrollment attempt finishes, even
+  // if it fails.
+  VerifyScheduledEnrollment(
+      cryptauthv2::BuildClientMetadata(0 /* retry_count */,
+                                       cryptauthv2::ClientMetadata::MANUAL,
+                                       base::nullopt /* session_id */),
+      kZeroTimeDelta /* expected_delay */);
+}
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest,
+       ScheduledEnrollmentRequestOverwritten) {
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+
+  CreateScheduler(base::nullopt /* persisted_client_directive */,
+                  base::nullopt /* persisted_client_metadata */,
+                  base::nullopt /* persisted_last_enrollment_attempt_time */,
+                  base::nullopt /* persisted_last_successful_enrollment_time */
+  );
+
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+  scheduler()->RequestEnrollment(cryptauthv2::ClientMetadata::SERVER_INITIATED,
+                                 kSessionId);
+  VerifyScheduledEnrollment(
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, cryptauthv2::ClientMetadata::SERVER_INITIATED,
+          kSessionId),
+      kZeroTimeDelta /* expected_delay */);
+
+  scheduler()->RequestEnrollment(cryptauthv2::ClientMetadata::MANUAL,
+                                 base::nullopt /* session_id */);
+  VerifyScheduledEnrollment(
+      cryptauthv2::BuildClientMetadata(0 /* retry_count */,
+                                       cryptauthv2::ClientMetadata::MANUAL,
+                                       base::nullopt /* session_id */),
+      kZeroTimeDelta /* expected_delay */);
+}
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest,
+       ScheduleFailureRecoveryEnrollmentRequestOnStartUp) {
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+
+  const base::Time kLastEnrollmentTime = base::Time::FromDoubleT(1600600000);
+  const base::Time kLastEnrollmentAttemptTime =
+      kLastEnrollmentTime + base::TimeDelta::FromDays(30);
+  const base::Time kStartTime =
+      kLastEnrollmentAttemptTime + (kImmediateRetryDelay / 2);
+
+  clock()->SetNow(kStartTime);
+
+  cryptauthv2::ClientMetadata persisted_enrollment_request =
+      cryptauthv2::BuildClientMetadata(5 /* retry_count */,
+                                       cryptauthv2::ClientMetadata::PERIODIC,
+                                       base::nullopt /* session_id */);
+
+  CreateScheduler(
+      cryptauthv2::GetClientDirectiveForTest() /* persisted_client_directive */,
+      persisted_enrollment_request /* persisted_client_metadata */,
+      kLastEnrollmentAttemptTime /* persisted_last_enrollment_attempt_time */,
+      kLastEnrollmentTime /* persisted_last_successful_enrollment_time */
+  );
+
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+
+  // Retry count is reset to 1 on start-up so quick retry is triggered.
+  EXPECT_GT(cryptauthv2::GetClientDirectiveForTest().retry_attempts(), 0);
+  persisted_enrollment_request.set_retry_count(1);
+  VerifyScheduledEnrollment(persisted_enrollment_request,
+                            kImmediateRetryDelay / 2 /* expected_delay */);
+}
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest, EnrollmentRequestedWhileOffline) {
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kDisconnected);
+
+  CreateScheduler(base::nullopt /* persisted_client_directive */,
+                  base::nullopt /* persisted_client_metadata */,
+                  base::nullopt /* persisted_last_enrollment_attempt_time */,
+                  base::nullopt /* persisted_last_successful_enrollment_time */
+  );
+
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+
+  cryptauthv2::ClientMetadata expected_enrollment_request =
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, cryptauthv2::ClientMetadata::INITIALIZATION,
+          base::nullopt /* session_id */);
+  VerifyScheduledEnrollment(expected_enrollment_request,
+                            kZeroTimeDelta /* expected_delay */);
+
+  enrollment_timer()->Fire();
+  VerifyNoEnrollmentsTriggeredButRequestQueued(expected_enrollment_request);
+
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnecting);
+  VerifyNoEnrollmentsTriggeredButRequestQueued(expected_enrollment_request);
+
+  // Once Wifi network connected, reschedule enrollment.
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+  VerifyScheduledEnrollment(expected_enrollment_request,
+                            kZeroTimeDelta /* expected_delay */);
+
+  enrollment_timer()->Fire();
+
+  EXPECT_TRUE(scheduler()->IsWaitingForEnrollmentResult());
+  VerifyLastPolicyReferenceReceivedByEnrollmentDelegate(
+      1 /* total_received */, base::nullopt /* last_received*/);
+  VerifyLastClientMetadataReceivedByEnrollmentDelegate(
+      1 /* total_received */, expected_enrollment_request);
+}
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest,
+       EnrollmentRequestedWithNoWifiNetwork) {
+  const base::Time kNow = base::Time::FromDoubleT(1600600000);
+  clock()->SetNow(kNow);
+  cryptauthv2::ClientMetadata expected_enrollment_request =
+      cryptauthv2::BuildClientMetadata(0 /* retry_count */,
+                                       cryptauthv2::ClientMetadata::PERIODIC,
+                                       base::nullopt /* session_id */);
+  CreateScheduler(
+      cryptauthv2::GetClientDirectiveForTest() /* persisted_client_directive */,
+      expected_enrollment_request /* persisted_client_metadata */,
+      kNow /* persisted_last_enrollment_attempt_time */,
+      kNow /* persisted_last_successful_enrollment_time */
+  );
+
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+  VerifyScheduledEnrollment(expected_enrollment_request,
+                            scheduler()->GetRefreshPeriod());
+
+  enrollment_timer()->Fire();
+  VerifyNoEnrollmentsTriggeredButRequestQueued(expected_enrollment_request);
+
+  // Once Wifi network connected, reschedule enrollment.
+  const base::TimeDelta kTimeElapsed = base::TimeDelta::FromHours(10);
+  clock()->SetNow(kNow + kTimeElapsed);
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+  VerifyScheduledEnrollment(expected_enrollment_request,
+                            scheduler()->GetRefreshPeriod() - kTimeElapsed);
+}
+
+TEST_F(DeviceSyncCryptAuthSchedulerImplTest,
+       EnrollmentScheduledAndWifiNetworkRemoved) {
+  AddDisconnectedWifiNetwork();
+  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
+
+  CreateScheduler(base::nullopt /* persisted_client_directive */,
+                  base::nullopt /* persisted_client_metadata */,
+                  base::nullopt /* persisted_last_enrollment_attempt_time */,
+                  base::nullopt /* persisted_last_successful_enrollment_time */
+  );
+
+  scheduler()->StartEnrollmentScheduling(fake_enrollment_delegate());
+
+  cryptauthv2::ClientMetadata expected_enrollment_request =
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, cryptauthv2::ClientMetadata::INITIALIZATION,
+          base::nullopt /* session_id */);
+  VerifyScheduledEnrollment(expected_enrollment_request,
+                            kZeroTimeDelta /* expected_delay */);
+
+  RemoveWifiNetwork();
+
+  enrollment_timer()->Fire();
+  VerifyNoEnrollmentsTriggeredButRequestQueued(expected_enrollment_request);
+}
+
+}  // namespace device_sync
+
+}  // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.cc b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.cc
index b492c63..7471a04 100644
--- a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.cc
@@ -17,7 +17,6 @@
 #include "chromeos/services/device_sync/cryptauth_constants.h"
 #include "chromeos/services/device_sync/cryptauth_key_registry.h"
 #include "chromeos/services/device_sync/cryptauth_v2_enroller_impl.h"
-#include "chromeos/services/device_sync/network_aware_enrollment_scheduler.h"
 #include "chromeos/services/device_sync/pref_names.h"
 #include "chromeos/services/device_sync/public/cpp/client_app_metadata_provider.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -148,12 +147,6 @@
 // static
 void CryptAuthV2EnrollmentManagerImpl::RegisterPrefs(
     PrefRegistrySimple* registry) {
-  registry->RegisterIntegerPref(
-      prefs::kCryptAuthEnrollmentFailureRecoveryInvocationReason,
-      cryptauthv2::ClientMetadata::INVOCATION_REASON_UNSPECIFIED);
-  registry->RegisterStringPref(
-      prefs::kCryptAuthEnrollmentFailureRecoverySessionId, std::string());
-
   // TODO(nohle): Remove when v1 Enrollment is deprecated.
   registry->RegisterStringPref(prefs::kCryptAuthEnrollmentUserPublicKey,
                                std::string());
@@ -199,12 +192,13 @@
     CryptAuthKeyRegistry* key_registry,
     CryptAuthClientFactory* client_factory,
     CryptAuthGCMManager* gcm_manager,
+    CryptAuthScheduler* scheduler,
     PrefService* pref_service,
     base::Clock* clock,
     std::unique_ptr<base::OneShotTimer> timer) {
   return base::WrapUnique(new CryptAuthV2EnrollmentManagerImpl(
       client_app_metadata_provider, key_registry, client_factory, gcm_manager,
-      pref_service, clock, std::move(timer)));
+      scheduler, pref_service, clock, std::move(timer)));
 }
 
 CryptAuthV2EnrollmentManagerImpl::CryptAuthV2EnrollmentManagerImpl(
@@ -212,6 +206,7 @@
     CryptAuthKeyRegistry* key_registry,
     CryptAuthClientFactory* client_factory,
     CryptAuthGCMManager* gcm_manager,
+    CryptAuthScheduler* scheduler,
     PrefService* pref_service,
     base::Clock* clock,
     std::unique_ptr<base::OneShotTimer> timer)
@@ -219,12 +214,16 @@
       key_registry_(key_registry),
       client_factory_(client_factory),
       gcm_manager_(gcm_manager),
+      scheduler_(scheduler),
       pref_service_(pref_service),
       clock_(clock),
       timer_(std::move(timer)),
-      weak_ptr_factory_(this) {
+      callback_weak_ptr_factory_(this),
+      scheduler_weak_ptr_factory_(this) {
   // TODO(nohle): Remove when v1 Enrollment is deprecated.
   AddV1UserKeyPairToRegistryIfNecessary();
+
+  gcm_manager_->AddObserver(this);
 }
 
 CryptAuthV2EnrollmentManagerImpl::~CryptAuthV2EnrollmentManagerImpl() {
@@ -232,31 +231,15 @@
 }
 
 void CryptAuthV2EnrollmentManagerImpl::Start() {
-  // Ensure that Start() is only called once.
-  DCHECK(!scheduler_);
-
-  scheduler_ = NetworkAwareEnrollmentScheduler::Factory::Get()->BuildInstance(
-      this, pref_service_);
-
-  gcm_manager_->AddObserver(this);
+  scheduler_->StartEnrollmentScheduling(
+      scheduler_weak_ptr_factory_.GetWeakPtr());
 }
 
 void CryptAuthV2EnrollmentManagerImpl::ForceEnrollmentNow(
     cryptauth::InvocationReason invocation_reason,
     const base::Optional<std::string>& session_id) {
-  if (state_ != State::kIdle) {
-    PA_LOG(WARNING) << "Forced enrollment requested while an enrollment is in "
-                    << "progress. No action taken.";
-    return;
-  }
-
-  current_client_metadata_ = cryptauthv2::ClientMetadata();
-  current_client_metadata_->set_invocation_reason(
-      ConvertInvocationReasonV1ToV2(invocation_reason));
-  if (session_id)
-    current_client_metadata_->set_session_id(*session_id);
-
-  scheduler_->RequestEnrollmentNow();
+  scheduler_->RequestEnrollment(
+      ConvertInvocationReasonV1ToV2(invocation_reason), session_id);
 }
 
 bool CryptAuthV2EnrollmentManagerImpl::IsEnrollmentValid() const {
@@ -289,7 +272,7 @@
 }
 
 bool CryptAuthV2EnrollmentManagerImpl::IsRecoveringFromFailure() const {
-  return scheduler_->GetNumConsecutiveFailures() > 0;
+  return scheduler_->GetNumConsecutiveEnrollmentFailures() > 0;
 }
 
 std::string CryptAuthV2EnrollmentManagerImpl::GetUserPublicKey() const {
@@ -326,44 +309,16 @@
 }
 
 void CryptAuthV2EnrollmentManagerImpl::OnEnrollmentRequested(
+    const cryptauthv2::ClientMetadata& client_metadata,
     const base::Optional<cryptauthv2::PolicyReference>&
         client_directive_policy_reference) {
   DCHECK(state_ == State::kIdle);
 
   NotifyEnrollmentStarted();
 
+  current_client_metadata_ = client_metadata;
   client_directive_policy_reference_ = client_directive_policy_reference;
 
-  // Build the ClientMetadata if it hasn't already been built by
-  // ForceEnrollmentNow().
-  if (!current_client_metadata_) {
-    current_client_metadata_ = cryptauthv2::ClientMetadata();
-    base::Optional<cryptauthv2::ClientMetadata::InvocationReason>
-        failure_recovery_invocation_reason =
-            GetFailureRecoveryInvocationReasonFromPref();
-    if (failure_recovery_invocation_reason) {
-      DCHECK(IsRecoveringFromFailure());
-      current_client_metadata_->set_invocation_reason(
-          *failure_recovery_invocation_reason);
-    } else if (GetLastEnrollmentTime().is_null()) {
-      current_client_metadata_->set_invocation_reason(
-          cryptauthv2::ClientMetadata::INITIALIZATION);
-    } else if (!IsEnrollmentValid()) {
-      current_client_metadata_->set_invocation_reason(
-          cryptauthv2::ClientMetadata::PERIODIC);
-    } else {
-      current_client_metadata_->set_invocation_reason(
-          cryptauthv2::ClientMetadata::INVOCATION_REASON_UNSPECIFIED);
-    }
-
-    base::Optional<std::string> failure_recovery_session_id =
-        GetFailureRecoverySessionIdFromPref();
-    if (failure_recovery_session_id) {
-      DCHECK(IsRecoveringFromFailure());
-      current_client_metadata_->set_session_id(*failure_recovery_session_id);
-    }
-  }
-
   base::UmaHistogramExactLinear(
       "CryptAuth.EnrollmentV2.InvocationReason",
       current_client_metadata_->invocation_reason(),
@@ -422,7 +377,7 @@
         gcm_manager_->GetRegistrationId(),
         base::BindOnce(
             &CryptAuthV2EnrollmentManagerImpl::OnClientAppMetadataFetched,
-            weak_ptr_factory_.GetWeakPtr()));
+            callback_weak_ptr_factory_.GetWeakPtr()));
     return;
   }
 
@@ -430,12 +385,8 @@
 }
 
 void CryptAuthV2EnrollmentManagerImpl::Enroll() {
-  // The invocation reason and session ID were set in ForceEnrollmentNow() for a
-  // forced enrollment and OnEnrollmentRequested() otherwise. Populate the other
-  // ClientMetadata fields here.
   DCHECK(current_client_metadata_);
-  current_client_metadata_->set_retry_count(
-      scheduler_->GetNumConsecutiveFailures());
+  DCHECK(client_app_metadata_);
 
   enroller_ = CryptAuthV2EnrollerImpl::Factory::Get()->BuildInstance(
       key_registry_, client_factory_);
@@ -446,14 +397,14 @@
       *current_client_metadata_, *client_app_metadata_,
       client_directive_policy_reference_,
       base::BindOnce(&CryptAuthV2EnrollmentManagerImpl::OnEnrollmentFinished,
-                     base::Unretained(this)));
+                     callback_weak_ptr_factory_.GetWeakPtr()));
 }
 
 void CryptAuthV2EnrollmentManagerImpl::OnEnrollmentFinished(
     const CryptAuthEnrollmentResult& enrollment_result) {
   // Once an enrollment attempt finishes, no other callbacks should be
   // invoked. This is particularly relevant for timeout failures.
-  weak_ptr_factory_.InvalidateWeakPtrs();
+  callback_weak_ptr_factory_.InvalidateWeakPtrs();
   enroller_.reset();
 
   if (enrollment_result.IsSuccess()) {
@@ -461,24 +412,11 @@
                  << current_client_metadata_->invocation_reason()
                  << " succeeded with result code "
                  << enrollment_result.result_code();
-
-    pref_service_->SetInteger(
-        prefs::kCryptAuthEnrollmentFailureRecoveryInvocationReason,
-        cryptauthv2::ClientMetadata::INVOCATION_REASON_UNSPECIFIED);
-    pref_service_->SetString(
-        prefs::kCryptAuthEnrollmentFailureRecoverySessionId, std::string());
   } else {
     PA_LOG(WARNING) << "Enrollment attempt with invocation reason "
                     << current_client_metadata_->invocation_reason()
                     << " failed with result code "
                     << enrollment_result.result_code();
-
-    pref_service_->SetInteger(
-        prefs::kCryptAuthEnrollmentFailureRecoveryInvocationReason,
-        current_client_metadata_->invocation_reason());
-    pref_service_->SetString(
-        prefs::kCryptAuthEnrollmentFailureRecoverySessionId,
-        current_client_metadata_->session_id());
   }
 
   current_client_metadata_.reset();
@@ -492,7 +430,7 @@
 
   if (!enrollment_result.IsSuccess()) {
     PA_LOG(INFO) << "Number of consecutive failures: "
-                 << scheduler_->GetNumConsecutiveFailures();
+                 << scheduler_->GetNumConsecutiveEnrollmentFailures();
   }
 
   SetState(State::kIdle);
@@ -522,45 +460,11 @@
   timer_->Start(
       FROM_HERE, *timeout_for_state,
       base::BindOnce(&CryptAuthV2EnrollmentManagerImpl::OnEnrollmentFinished,
-                     base::Unretained(this),
+                     callback_weak_ptr_factory_.GetWeakPtr(),
                      CryptAuthEnrollmentResult(
                          *error_code, base::nullopt /*client_directive */)));
 }
 
-base::Optional<cryptauthv2::ClientMetadata::InvocationReason>
-CryptAuthV2EnrollmentManagerImpl::GetFailureRecoveryInvocationReasonFromPref()
-    const {
-  int reason_stored_in_prefs = pref_service_->GetInteger(
-      prefs::kCryptAuthEnrollmentFailureRecoveryInvocationReason);
-
-  if (!cryptauthv2::ClientMetadata::InvocationReason_IsValid(
-          reason_stored_in_prefs)) {
-    PA_LOG(WARNING) << "Unknown invocation reason, " << reason_stored_in_prefs
-                    << ", stored in pref.";
-
-    return base::nullopt;
-  }
-
-  if (reason_stored_in_prefs ==
-      cryptauthv2::ClientMetadata::INVOCATION_REASON_UNSPECIFIED) {
-    return base::nullopt;
-  }
-
-  return static_cast<cryptauthv2::ClientMetadata::InvocationReason>(
-      reason_stored_in_prefs);
-}
-
-base::Optional<std::string>
-CryptAuthV2EnrollmentManagerImpl::GetFailureRecoverySessionIdFromPref() const {
-  std::string session_id_stored_in_prefs = pref_service_->GetString(
-      prefs::kCryptAuthEnrollmentFailureRecoverySessionId);
-
-  if (session_id_stored_in_prefs.empty())
-    return base::nullopt;
-
-  return session_id_stored_in_prefs;
-}
-
 std::string CryptAuthV2EnrollmentManagerImpl::GetV1UserPublicKey() const {
   std::string public_key;
   if (!base::Base64UrlDecode(
diff --git a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h
index cde22c2..357d5389 100644
--- a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h
+++ b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h
@@ -15,9 +15,9 @@
 #include "base/time/default_clock.h"
 #include "chromeos/services/device_sync/cryptauth_enrollment_manager.h"
 #include "chromeos/services/device_sync/cryptauth_enrollment_result.h"
-#include "chromeos/services/device_sync/cryptauth_enrollment_scheduler.h"
 #include "chromeos/services/device_sync/cryptauth_feature_type.h"
 #include "chromeos/services/device_sync/cryptauth_gcm_manager.h"
+#include "chromeos/services/device_sync/cryptauth_scheduler.h"
 #include "chromeos/services/device_sync/proto/cryptauth_client_app_metadata.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
 
@@ -40,14 +40,14 @@
 // Implementation of CryptAuthEnrollmentManager for CryptAuth v2 Enrollment.
 //
 // This implementation considers three sources of enrollment requests:
-//  1) A network-aware enrollment scheduler requests periodic enrollments and
-//     handles any failed attempts.
+//  1) The scheduler requests periodic enrollments and handles any failed
+//     attempts.
 //  2) The enrollment manager listens to the GCM manager for re-enrollment
 //     requests.
 //  3) The ForceEnrollmentNow() method allows for immediate requests.
 //
 // All flavors of enrollment attempts are guarded by timeouts. For example, an
-// enrollment attempt triggeredd by ForceEnrollmentNow() will always
+// enrollment attempt triggered by ForceEnrollmentNow() will always
 // conclude--successfully or not--in an allotted period of time.
 //
 // The v2 Enrollment infrastructure stores keys in a CryptAuthKeyRegistry. In
@@ -57,19 +57,9 @@
 // the v2 key registry to ensure consistency across the v1 to v2 Enrollment
 // migration. The converse is not true. The v1 prefs will never be modified by
 // v2 Enrollment.
-//
-// The enrollment invocation reason sent to CryptAuth in ClientMetadata is
-// determined using the following order of priority:
-//  1) If ForceEnrollmentNow() was called, use its invocation reason argument.
-//  2) If we are recovering from a failed enrollment attempt, reuse the initial
-//     invocation reason, which is stored as a pref.
-//  3) If the user has never enrolled, use INITIALIZATION.
-//  4) If the enrollment is no longer valid--due for a refresh, for
-//     example--use PERIODIC.
-//  5) As a last resort, use INVOCATION_REASON_UNSPECIFIED.
 class CryptAuthV2EnrollmentManagerImpl
     : public CryptAuthEnrollmentManager,
-      public CryptAuthEnrollmentScheduler::Delegate,
+      public CryptAuthScheduler::EnrollmentDelegate,
       public CryptAuthGCMManager::Observer {
  public:
   class Factory {
@@ -82,6 +72,7 @@
         CryptAuthKeyRegistry* key_registry,
         CryptAuthClientFactory* client_factory,
         CryptAuthGCMManager* gcm_manager,
+        CryptAuthScheduler* scheduler,
         PrefService* pref_service,
         base::Clock* clock = base::DefaultClock::GetInstance(),
         std::unique_ptr<base::OneShotTimer> timer =
@@ -103,6 +94,7 @@
       CryptAuthKeyRegistry* key_registry,
       CryptAuthClientFactory* client_factory,
       CryptAuthGCMManager* gcm_manager,
+      CryptAuthScheduler* scheduler,
       PrefService* pref_service,
       base::Clock* clock,
       std::unique_ptr<base::OneShotTimer> timer);
@@ -134,8 +126,9 @@
   std::string GetUserPublicKey() const override;
   std::string GetUserPrivateKey() const override;
 
-  // CryptAuthEnrollmentScheduler::Delegate:
-  void OnEnrollmentRequested(const base::Optional<cryptauthv2::PolicyReference>&
+  // CryptAuthScheduler::EnrollmentDelegate:
+  void OnEnrollmentRequested(const cryptauthv2::ClientMetadata& client_metadata,
+                             const base::Optional<cryptauthv2::PolicyReference>&
                                  client_directive_policy_reference) override;
 
   // CryptAuthGCMManager::Observer:
@@ -158,12 +151,6 @@
 
   void SetState(State state);
 
-  // Returns the invocation reason to be used when recovering from a failed
-  // enrollment attempt. If no valid reason is stored, returns null.
-  base::Optional<cryptauthv2::ClientMetadata::InvocationReason>
-  GetFailureRecoveryInvocationReasonFromPref() const;
-  base::Optional<std::string> GetFailureRecoverySessionIdFromPref() const;
-
   std::string GetV1UserPublicKey() const;
   std::string GetV1UserPrivateKey() const;
 
@@ -175,24 +162,28 @@
   CryptAuthKeyRegistry* key_registry_;
   CryptAuthClientFactory* client_factory_;
   CryptAuthGCMManager* gcm_manager_;
+  CryptAuthScheduler* scheduler_;
   PrefService* pref_service_;
   base::Clock* clock_;
   std::unique_ptr<base::OneShotTimer> timer_;
 
   State state_ = State::kIdle;
-  std::unique_ptr<CryptAuthEnrollmentScheduler> scheduler_;
-  std::unique_ptr<CryptAuthV2Enroller> enroller_;
-
-  // Only non-null while an enrollment attempt is active. The invocation reason
-  // and session ID are set in ForceEnrollmentNow() for forced enrollments and
-  // OnEnrollmentRequested() otherwise. The other ClientMetadata fields are
-  // populated in Enroll().
   base::Optional<cryptauthv2::ClientMetadata> current_client_metadata_;
-
-  base::Optional<cryptauthv2::ClientAppMetadata> client_app_metadata_;
   base::Optional<cryptauthv2::PolicyReference>
       client_directive_policy_reference_;
-  base::WeakPtrFactory<CryptAuthV2EnrollmentManagerImpl> weak_ptr_factory_;
+  base::Optional<cryptauthv2::ClientAppMetadata> client_app_metadata_;
+  std::unique_ptr<CryptAuthV2Enroller> enroller_;
+
+  // For weak pointers used in callbacks. These weak pointers are invalidated
+  // when the current enrollment attempt finishes in order to cancel outstanding
+  // callbacks.
+  base::WeakPtrFactory<CryptAuthV2EnrollmentManagerImpl>
+      callback_weak_ptr_factory_;
+
+  // For sending a weak pointer to the scheduler, whose lifetime exceeds that of
+  // CryptAuthV2EnrollmentManagerImpl.
+  base::WeakPtrFactory<CryptAuthV2EnrollmentManagerImpl>
+      scheduler_weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(CryptAuthV2EnrollmentManagerImpl);
 };
diff --git a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl_unittest.cc
index e07068e..3bb8de8d 100644
--- a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl_unittest.cc
@@ -11,26 +11,21 @@
 #include "base/base64url.h"
 #include "base/no_destructor.h"
 #include "base/optional.h"
-#include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/scoped_task_environment.h"
 #include "base/test/simple_test_clock.h"
 #include "base/timer/mock_timer.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
-#include "chromeos/network/network_handler.h"
 #include "chromeos/services/device_sync/cryptauth_constants.h"
 #include "chromeos/services/device_sync/cryptauth_enrollment_result.h"
-#include "chromeos/services/device_sync/cryptauth_enrollment_scheduler.h"
 #include "chromeos/services/device_sync/cryptauth_key_bundle.h"
 #include "chromeos/services/device_sync/cryptauth_key_registry.h"
 #include "chromeos/services/device_sync/cryptauth_key_registry_impl.h"
+#include "chromeos/services/device_sync/cryptauth_scheduler.h"
 #include "chromeos/services/device_sync/cryptauth_v2_enroller.h"
 #include "chromeos/services/device_sync/cryptauth_v2_enroller_impl.h"
-#include "chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.h"
 #include "chromeos/services/device_sync/fake_cryptauth_gcm_manager.h"
+#include "chromeos/services/device_sync/fake_cryptauth_scheduler.h"
 #include "chromeos/services/device_sync/fake_cryptauth_v2_enroller.h"
 #include "chromeos/services/device_sync/mock_cryptauth_client.h"
-#include "chromeos/services/device_sync/network_aware_enrollment_scheduler.h"
 #include "chromeos/services/device_sync/pref_names.h"
 #include "chromeos/services/device_sync/proto/cryptauth_api.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_better_together_feature_metadata.pb.h"
@@ -71,90 +66,6 @@
   return *policy_reference;
 }
 
-// A child of FakeCryptAuthEnrollmentScheduler that sets scheduler parameters
-// based on the latest enrollment result.
-class FakeCryptAuthEnrollmentSchedulerWithResultHandling
-    : public FakeCryptAuthEnrollmentScheduler {
- public:
-  FakeCryptAuthEnrollmentSchedulerWithResultHandling(
-      CryptAuthEnrollmentScheduler::Delegate* delegate,
-      base::Clock* clock)
-      : FakeCryptAuthEnrollmentScheduler(delegate), clock_(clock) {}
-
-  ~FakeCryptAuthEnrollmentSchedulerWithResultHandling() override = default;
-
-  void HandleEnrollmentResult(
-      const CryptAuthEnrollmentResult& enrollment_result) override {
-    FakeCryptAuthEnrollmentScheduler::HandleEnrollmentResult(enrollment_result);
-
-    if (handled_enrollment_results().back().IsSuccess()) {
-      set_num_consecutive_failures(0);
-      set_time_to_next_enrollment_request(kFakeRefreshPeriod);
-      set_last_successful_enrollment_time(clock_->Now());
-    } else {
-      set_num_consecutive_failures(GetNumConsecutiveFailures() + 1);
-      set_time_to_next_enrollment_request(kFakeRetryPeriod);
-    }
-  }
-
- private:
-  base::Clock* clock_;
-};
-
-class FakeNetworkAwareEnrollmentSchedulerFactory
-    : public NetworkAwareEnrollmentScheduler::Factory {
- public:
-  FakeNetworkAwareEnrollmentSchedulerFactory(
-      const PrefService* expected_pref_service,
-      base::Clock* clock)
-      : expected_pref_service_(expected_pref_service), clock_(clock) {}
-
-  ~FakeNetworkAwareEnrollmentSchedulerFactory() override = default;
-
-  FakeCryptAuthEnrollmentSchedulerWithResultHandling* instance() {
-    return instance_;
-  }
-
-  void SetInitialNumConsecutiveFailures(size_t num_consecutive_failures) {
-    initial_num_consecutive_failures_ = num_consecutive_failures;
-  }
-
- private:
-  // NetworkAwareEnrollmentScheduler::Factory
-  std::unique_ptr<CryptAuthEnrollmentScheduler> BuildInstance(
-      CryptAuthEnrollmentScheduler::Delegate* delegate,
-      PrefService* pref_service,
-      NetworkStateHandler* network_state_handler) override {
-    EXPECT_EQ(expected_pref_service_, pref_service);
-
-    auto instance =
-        std::make_unique<FakeCryptAuthEnrollmentSchedulerWithResultHandling>(
-            delegate, clock_);
-    instance_ = instance.get();
-
-    // Fix the scheduler's ClientDirective PolicyReference to test that it is
-    // passed to the enroller properly.
-    instance->set_client_directive_policy_reference(
-        GetClientDirectivePolicyReferenceForTest());
-
-    if (initial_num_consecutive_failures_) {
-      instance->set_num_consecutive_failures(
-          *initial_num_consecutive_failures_);
-    }
-
-    return instance;
-  }
-
-  const PrefService* expected_pref_service_;
-  base::Clock* clock_;
-
-  base::Optional<size_t> initial_num_consecutive_failures_;
-
-  FakeCryptAuthEnrollmentSchedulerWithResultHandling* instance_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeNetworkAwareEnrollmentSchedulerFactory);
-};
-
 class FakeCryptAuthV2EnrollerFactory : public CryptAuthV2EnrollerImpl::Factory {
  public:
   FakeCryptAuthV2EnrollerFactory(
@@ -206,10 +117,6 @@
 
   // testing::Test:
   void SetUp() override {
-    DBusThreadManager::Initialize();
-    NetworkHandler::Initialize();
-    base::RunLoop().RunUntilIdle();
-
     test_clock_.SetNow(base::Time::UnixEpoch());
 
     CryptAuthV2EnrollmentManagerImpl::RegisterPrefs(
@@ -219,16 +126,15 @@
     key_registry_ = CryptAuthKeyRegistryImpl::Factory::Get()->BuildInstance(
         &test_pref_service_);
 
-    fake_enrollment_scheduler_factory_ =
-        std::make_unique<FakeNetworkAwareEnrollmentSchedulerFactory>(
-            &test_pref_service_, &test_clock_);
-    NetworkAwareEnrollmentScheduler::Factory::SetFactoryForTesting(
-        fake_enrollment_scheduler_factory_.get());
-
     fake_enroller_factory_ = std::make_unique<FakeCryptAuthV2EnrollerFactory>(
         key_registry_.get(), &mock_client_factory_);
     CryptAuthV2EnrollerImpl::Factory::SetFactoryForTesting(
         fake_enroller_factory_.get());
+
+    // Fix the scheduler's ClientDirective PolicyReference to test that it is
+    // passed to the enroller properly.
+    fake_enrollment_scheduler_.set_client_directive_policy_reference(
+        GetClientDirectivePolicyReferenceForTest());
   }
 
   // testing::Test:
@@ -236,11 +142,7 @@
     if (enrollment_manager_)
       enrollment_manager_->RemoveObserver(this);
 
-    NetworkAwareEnrollmentScheduler::Factory::SetFactoryForTesting(nullptr);
     CryptAuthV2EnrollerImpl::Factory::SetFactoryForTesting(nullptr);
-
-    NetworkHandler::Shutdown();
-    DBusThreadManager::Shutdown();
   }
 
   // CryptAuthEnrollmentManager::Observer:
@@ -267,12 +169,6 @@
                                  private_key_b64);
   }
 
-  void SetInitialNumConsecutiveFailures(size_t num_consecutive_failures) {
-    num_consecutive_failures_ = num_consecutive_failures;
-    fake_enrollment_scheduler_factory_->SetInitialNumConsecutiveFailures(
-        num_consecutive_failures);
-  }
-
   void CreateEnrollmentManager() {
     auto mock_timer = std::make_unique<base::MockOneShotTimer>();
     mock_timer_ = mock_timer.get();
@@ -282,8 +178,9 @@
     enrollment_manager_ =
         CryptAuthV2EnrollmentManagerImpl::Factory::Get()->BuildInstance(
             &fake_client_app_metadata_provider_, key_registry_.get(),
-            &mock_client_factory_, &fake_gcm_manager_, &test_pref_service_,
-            &test_clock_, std::move(mock_timer));
+            &mock_client_factory_, &fake_gcm_manager_,
+            &fake_enrollment_scheduler_, &test_pref_service_, &test_clock_,
+            std::move(mock_timer));
 
     VerifyUserKeyPairStateHistogram(1u /* total_count */);
 
@@ -338,9 +235,7 @@
 
   void FinishEnrollmentAttempt(
       size_t expected_enroller_instance_index,
-      const cryptauthv2::ClientMetadata::InvocationReason&
-          expected_invocation_reason,
-      const base::Optional<std::string>& expected_session_id,
+      const cryptauthv2::ClientMetadata& expected_client_metadata,
       const CryptAuthEnrollmentResult& enrollment_result) {
     EXPECT_TRUE(enrollment_manager_->IsEnrollmentInProgress());
 
@@ -358,30 +253,17 @@
         fake_enroller_factory_
             ->created_instances()[expected_enroller_instance_index];
 
-    VerifyEnrollerData(enroller, expected_invocation_reason,
-                       expected_session_id);
+    VerifyEnrollerData(enroller, expected_client_metadata);
 
     enroller->FinishAttempt(enrollment_result);
 
     EXPECT_FALSE(enrollment_manager_->IsEnrollmentInProgress());
-
-    cryptauthv2::ClientMetadata::InvocationReason expected_persisted_reason =
-        enrollment_manager_->IsRecoveringFromFailure()
-            ? expected_invocation_reason
-            : cryptauthv2::ClientMetadata::INVOCATION_REASON_UNSPECIFIED;
-    VerifyPersistedFailureRecoveryInvocationReason(expected_persisted_reason);
-
-    std::string expected_persisted_session_id =
-        enrollment_manager_->IsRecoveringFromFailure()
-            ? expected_session_id.value_or(std::string())
-            : std::string();
-    VerifyPersistedFailureRecoverySessionId(expected_persisted_session_id);
   }
 
   void VerifyEnrollmentResults(
       const std::vector<CryptAuthEnrollmentResult>& expected_results) {
     VerifyResultsSentToEnrollmentManagerObservers(expected_results);
-    VerifyResultsSentToEnrollmentScheduler(expected_results);
+    VerifyResultsSentToScheduler(expected_results);
     VerifyEnrollmentResultHistograms(expected_results);
   }
 
@@ -412,9 +294,8 @@
 
   CryptAuthKeyRegistry* key_registry() { return key_registry_.get(); }
 
-  FakeCryptAuthEnrollmentSchedulerWithResultHandling*
-  fake_enrollment_scheduler() {
-    return fake_enrollment_scheduler_factory_->instance();
+  FakeCryptAuthScheduler* fake_enrollment_scheduler() {
+    return &fake_enrollment_scheduler_;
   }
 
   base::SimpleTestClock* test_clock() { return &test_clock_; }
@@ -428,21 +309,12 @@
  private:
   void VerifyEnrollerData(
       FakeCryptAuthV2Enroller* enroller,
-      const cryptauthv2::ClientMetadata::InvocationReason&
-          expected_invocation_reason,
-      const base::Optional<std::string>& expected_session_id) {
+      const cryptauthv2::ClientMetadata& expected_client_metadata) {
     EXPECT_TRUE(enroller->was_enroll_called());
-
-    EXPECT_EQ(cryptauthv2::BuildClientMetadata(
-                  fake_enrollment_scheduler()
-                      ->GetNumConsecutiveFailures() /* retry_count */,
-                  expected_invocation_reason, expected_session_id)
-                  .SerializeAsString(),
+    EXPECT_EQ(expected_client_metadata.SerializeAsString(),
               enroller->client_metadata()->SerializeAsString());
-
     EXPECT_EQ(cryptauthv2::GetClientAppMetadataForTest().SerializeAsString(),
               enroller->client_app_metadata()->SerializeAsString());
-
     EXPECT_EQ(
         GetClientDirectivePolicyReferenceForTest().SerializeAsString(),
         (*enroller->client_directive_policy_reference())->SerializeAsString());
@@ -460,30 +332,12 @@
     }
   }
 
-  void VerifyResultsSentToEnrollmentScheduler(
-      const std::vector<CryptAuthEnrollmentResult>
-          expected_enrollment_results) {
+  void VerifyResultsSentToScheduler(const std::vector<CryptAuthEnrollmentResult>
+                                        expected_enrollment_results) {
     EXPECT_EQ(expected_enrollment_results,
               fake_enrollment_scheduler()->handled_enrollment_results());
   }
 
-  void VerifyPersistedFailureRecoveryInvocationReason(
-      const cryptauthv2::ClientMetadata::InvocationReason&
-          expected_failure_recovery_invocation_reason) {
-    EXPECT_EQ(
-        expected_failure_recovery_invocation_reason,
-        static_cast<cryptauthv2::ClientMetadata::InvocationReason>(
-            test_pref_service_.GetInteger(
-                prefs::kCryptAuthEnrollmentFailureRecoveryInvocationReason)));
-  }
-
-  void VerifyPersistedFailureRecoverySessionId(
-      const std::string& expected_persisted_session_id) {
-    EXPECT_EQ(expected_persisted_session_id,
-              test_pref_service_.GetString(
-                  prefs::kCryptAuthEnrollmentFailureRecoverySessionId));
-  }
-
   void VerifyEnrollmentResultHistograms(
       const std::vector<CryptAuthEnrollmentResult>
           expected_enrollment_results) {
@@ -516,22 +370,18 @@
                                         false, failure_count);
   }
 
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-
   size_t num_enrollment_started_notifications_ = 0;
-  size_t num_consecutive_failures_ = 0;
   std::vector<bool> observer_enrollment_finished_success_list_;
 
   TestingPrefServiceSimple test_pref_service_;
   FakeClientAppMetadataProvider fake_client_app_metadata_provider_;
   FakeCryptAuthGCMManager fake_gcm_manager_;
+  FakeCryptAuthScheduler fake_enrollment_scheduler_;
   base::SimpleTestClock test_clock_;
   base::MockOneShotTimer* mock_timer_;
   MockCryptAuthClientFactory mock_client_factory_;
   base::HistogramTester histogram_tester_;
   std::unique_ptr<CryptAuthKeyRegistry> key_registry_;
-  std::unique_ptr<FakeNetworkAwareEnrollmentSchedulerFactory>
-      fake_enrollment_scheduler_factory_;
   std::unique_ptr<FakeCryptAuthV2EnrollerFactory> fake_enroller_factory_;
 
   std::unique_ptr<CryptAuthEnrollmentManager> enrollment_manager_;
@@ -540,17 +390,24 @@
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
        EnrollmentRequestedFromScheduler_NeverPreviouslyEnrolled) {
   CreateEnrollmentManager();
-  EXPECT_FALSE(fake_enrollment_scheduler());
+  EXPECT_FALSE(fake_enrollment_scheduler()->HasEnrollmentSchedulingStarted());
 
   enrollment_manager()->Start();
-  EXPECT_TRUE(fake_enrollment_scheduler());
+  EXPECT_TRUE(fake_enrollment_scheduler()->HasEnrollmentSchedulingStarted());
 
   // The user has never enrolled with v1 or v2 and has not registered with GCM.
+  fake_enrollment_scheduler()->set_last_successful_enrollment_time(
+      base::Time());
   EXPECT_TRUE(key_registry()->key_bundles().empty());
   EXPECT_TRUE(enrollment_manager()->GetLastEnrollmentTime().is_null());
   EXPECT_FALSE(enrollment_manager()->IsEnrollmentValid());
 
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+  // Scheduler triggers an initialization enrollment request.
+  fake_enrollment_scheduler()->set_num_consecutive_enrollment_failures(0);
+  fake_enrollment_scheduler()->RequestEnrollment(
+      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
+      base::nullopt /* session_id */);
+
   EXPECT_TRUE(enrollment_manager()->IsEnrollmentInProgress());
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
@@ -562,11 +419,13 @@
       CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
       cryptauthv2::GetClientDirectiveForTest());
 
-  FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
-                          cryptauthv2::ClientMetadata::
-                              INITIALIZATION /* expected_invocation_reason */,
-                          base::nullopt /* expected_session_id */,
-                          expected_enrollment_result);
+  FinishEnrollmentAttempt(
+      0u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */,
+          cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
+          base::nullopt /* session_id */) /* expected_client_metadata */,
+      expected_enrollment_result);
 
   VerifyEnrollmentResults({expected_enrollment_result});
 }
@@ -574,7 +433,10 @@
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest, GcmRegistrationFailed) {
   CreateEnrollmentManager();
   enrollment_manager()->Start();
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+
+  fake_enrollment_scheduler()->RequestEnrollment(
+      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
+      base::nullopt /* session_id */);
 
   CompleteGcmRegistration(false /* success */);
 
@@ -586,7 +448,10 @@
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest, GcmRegistrationTimeout) {
   CreateEnrollmentManager();
   enrollment_manager()->Start();
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+
+  fake_enrollment_scheduler()->RequestEnrollment(
+      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
+      base::nullopt /* session_id */);
 
   // Timeout waiting for GcmRegistration.
   EXPECT_TRUE(mock_timer()->IsRunning());
@@ -602,7 +467,11 @@
        ClientAppMetadataFetchFailed) {
   CreateEnrollmentManager();
   enrollment_manager()->Start();
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+
+  fake_enrollment_scheduler()->RequestEnrollment(
+      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
+      base::nullopt /* session_id */);
+
   CompleteGcmRegistration(true /* success */);
   HandleGetClientAppMetadataRequest(false /* success */);
 
@@ -615,7 +484,11 @@
        ClientAppMetadataTimeout) {
   CreateEnrollmentManager();
   enrollment_manager()->Start();
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+
+  fake_enrollment_scheduler()->RequestEnrollment(
+      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
+      base::nullopt /* session_id */);
+
   CompleteGcmRegistration(true /* success */);
 
   // Timeout waiting for ClientAppMetadata.
@@ -634,7 +507,7 @@
 
   enrollment_manager()->ForceEnrollmentNow(
       cryptauth::InvocationReason::INVOCATION_REASON_FEATURE_TOGGLED,
-      base::nullopt /* session_id */);
+      kFakeSessionId);
   EXPECT_TRUE(enrollment_manager()->IsEnrollmentInProgress());
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
@@ -642,14 +515,18 @@
   // Simulate a failed enrollment attempt due to CryptAuth server overload.
   CompleteGcmRegistration(true /* success */);
   HandleGetClientAppMetadataRequest(true /* success */);
+
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
       base::nullopt /* client_directive */);
-  FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
-                          cryptauthv2::ClientMetadata::
-                              FEATURE_TOGGLED /* expected_invocation_reason */,
-                          base::nullopt /* expected_session_id */,
-                          expected_enrollment_result);
+
+  FinishEnrollmentAttempt(
+      0u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */,
+          cryptauthv2::ClientMetadata::FEATURE_TOGGLED /* invocation_reason */,
+          kFakeSessionId) /* expected_client_metadata */,
+      expected_enrollment_result);
 
   VerifyEnrollmentResults({expected_enrollment_result});
 }
@@ -659,34 +536,38 @@
   CreateEnrollmentManager();
   enrollment_manager()->Start();
 
-  // The user has already enrolled and is due for a refresh.
+  // The user has already enrolled.
   base::Time expected_last_enrollment_time = test_clock()->Now();
   fake_enrollment_scheduler()->set_last_successful_enrollment_time(
       expected_last_enrollment_time);
+  EXPECT_EQ(expected_last_enrollment_time,
+            enrollment_manager()->GetLastEnrollmentTime());
   fake_enrollment_scheduler()->set_refresh_period(kFakeRefreshPeriod);
+  fake_enrollment_scheduler()->set_time_to_next_enrollment_request(
+      kFakeRefreshPeriod);
+  EXPECT_TRUE(enrollment_manager()->IsEnrollmentValid());
+  EXPECT_EQ(kFakeRefreshPeriod, enrollment_manager()->GetTimeToNextAttempt());
 
-  // Set clock after refresh period.
+  // Now, user is due for a refresh.
   test_clock()->SetNow(test_clock()->Now() + kFakeRefreshPeriod +
                        base::TimeDelta::FromSeconds(1));
-
+  EXPECT_FALSE(enrollment_manager()->IsEnrollmentValid());
   base::TimeDelta expected_time_to_next_attempt =
       base::TimeDelta::FromSeconds(0);
   fake_enrollment_scheduler()->set_time_to_next_enrollment_request(
       expected_time_to_next_attempt);
-
-  EXPECT_EQ(expected_last_enrollment_time,
-            enrollment_manager()->GetLastEnrollmentTime());
-  EXPECT_FALSE(enrollment_manager()->IsEnrollmentValid());
   EXPECT_EQ(expected_time_to_next_attempt,
             enrollment_manager()->GetTimeToNextAttempt());
-  EXPECT_FALSE(enrollment_manager()->IsRecoveringFromFailure());
 
-  cryptauthv2::ClientMetadata::InvocationReason expected_invocation_reason =
-      cryptauthv2::ClientMetadata::PERIODIC;
+  cryptauthv2::ClientMetadata expected_client_metadata =
+      cryptauthv2::BuildClientMetadata(0 /* retry_count */,
+                                       cryptauthv2::ClientMetadata::PERIODIC,
+                                       base::nullopt /* session_id */);
 
   // First enrollment attempt fails.
   // Note: User does not yet have a GCM registration ID or ClientAppMetadata.
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+  fake_enrollment_scheduler()->RequestEnrollment(
+      cryptauthv2::ClientMetadata::PERIODIC, base::nullopt /* session_id */);
   EXPECT_TRUE(enrollment_manager()->IsEnrollmentInProgress());
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
@@ -699,33 +580,44 @@
       base::nullopt /* client_directive */);
 
   FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
-                          expected_invocation_reason,
-                          base::nullopt /* expected_session_id */,
+                          expected_client_metadata,
                           first_expected_enrollment_result);
 
+  EXPECT_FALSE(enrollment_manager()->IsRecoveringFromFailure());
+  fake_enrollment_scheduler()->set_num_consecutive_enrollment_failures(1);
+  EXPECT_TRUE(enrollment_manager()->IsRecoveringFromFailure());
+
+  fake_enrollment_scheduler()->set_time_to_next_enrollment_request(
+      kFakeRetryPeriod);
   EXPECT_EQ(kFakeRetryPeriod, enrollment_manager()->GetTimeToNextAttempt());
 
   // Second (successful) enrollment attempt bypasses GCM registration and
   // ClientAppMetadata fetch because they were performed during the failed
   // attempt.
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+  test_clock()->SetNow(test_clock()->Now() + kFakeRetryPeriod);
+  fake_enrollment_scheduler()->RequestEnrollment(
+      cryptauthv2::ClientMetadata::PERIODIC, base::nullopt /* session_id */);
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       2 /* expected_num_enrollment_started_notifications */);
-  EXPECT_TRUE(enrollment_manager()->IsRecoveringFromFailure());
 
   CryptAuthEnrollmentResult second_expected_enrollment_result =
       CryptAuthEnrollmentResult(
           CryptAuthEnrollmentResult::ResultCode::kSuccessNoNewKeysNeeded,
           cryptauthv2::GetClientDirectiveForTest());
 
+  expected_client_metadata.set_retry_count(1);
   FinishEnrollmentAttempt(1u /* expected_enroller_instance_index */,
-                          expected_invocation_reason,
-                          base::nullopt /* expected_session_id */,
+                          expected_client_metadata,
                           second_expected_enrollment_result);
 
   VerifyEnrollmentResults(
       {first_expected_enrollment_result, second_expected_enrollment_result});
 
+  fake_enrollment_scheduler()->set_last_successful_enrollment_time(
+      test_clock()->Now());
+  fake_enrollment_scheduler()->set_time_to_next_enrollment_request(
+      kFakeRefreshPeriod);
+  fake_enrollment_scheduler()->set_num_consecutive_enrollment_failures(0);
   EXPECT_EQ(test_clock()->Now(), enrollment_manager()->GetLastEnrollmentTime());
   EXPECT_TRUE(enrollment_manager()->IsEnrollmentValid());
   EXPECT_EQ(kFakeRefreshPeriod, enrollment_manager()->GetTimeToNextAttempt());
@@ -747,11 +639,12 @@
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kSuccessNoNewKeysNeeded,
       cryptauthv2::GetClientDirectiveForTest());
-  FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
-                          cryptauthv2::ClientMetadata::
-                              SERVER_INITIATED /* expected_invocation_reason */,
-                          kFakeSessionId /* expected_session_id */,
-                          expected_enrollment_result);
+  FinishEnrollmentAttempt(
+      0u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, cryptauthv2::ClientMetadata::SERVER_INITIATED,
+          kFakeSessionId) /* expected_client_metadata */,
+      expected_enrollment_result);
   VerifyEnrollmentResults({expected_enrollment_result});
 }
 
@@ -770,11 +663,12 @@
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
       base::nullopt /* client_directive */);
-  FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
-                          cryptauthv2::ClientMetadata::
-                              SERVER_INITIATED /* expected_invocation_reason */,
-                          kFakeSessionId /* expected_session_id */,
-                          expected_enrollment_result);
+  FinishEnrollmentAttempt(
+      0u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, cryptauthv2::ClientMetadata::SERVER_INITIATED,
+          kFakeSessionId) /* expected_client_metadata */,
+      expected_enrollment_result);
   VerifyEnrollmentResults({expected_enrollment_result});
 }
 
@@ -857,42 +751,55 @@
   expected_enrollment_results.emplace_back(
       CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
       cryptauthv2::GetClientDirectiveForTest());
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+  fake_enrollment_scheduler()->RequestEnrollment(
+      expected_invocation_reasons.back(), kFakeSessionId);
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
   CompleteGcmRegistration(true /* success */);
   HandleGetClientAppMetadataRequest(true /* success */);
-  FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
-                          expected_invocation_reasons.back(),
-                          base::nullopt /* expected_session_id */,
-                          expected_enrollment_results.back());
+  FinishEnrollmentAttempt(
+      0u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, expected_invocation_reasons.back(),
+          kFakeSessionId) /* expected_client_metadata */,
+      expected_enrollment_results.back());
 
   // Fail periodic refresh twice due to overloaded CryptAuth server.
-  test_clock()->SetNow(test_clock()->Now() + kFakeRefreshPeriod +
-                       base::TimeDelta::FromSeconds(1));
   expected_invocation_reasons.push_back(cryptauthv2::ClientMetadata::PERIODIC);
   expected_enrollment_results.emplace_back(
       CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
       cryptauthv2::GetClientDirectiveForTest());
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+  fake_enrollment_scheduler()->RequestEnrollment(
+      expected_invocation_reasons.back(), kFakeSessionId);
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       2 /* expected_num_enrollment_started_notifications */);
-  FinishEnrollmentAttempt(1u /* expected_enroller_instance_index */,
-                          expected_invocation_reasons.back(),
-                          base::nullopt /* expected_session_id */,
-                          expected_enrollment_results.back());
+  FinishEnrollmentAttempt(
+      1u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */, expected_invocation_reasons.back(),
+          kFakeSessionId) /* expected_client_metadata */,
+      expected_enrollment_results.back());
+  fake_enrollment_scheduler()->set_num_consecutive_enrollment_failures(1);
+  fake_enrollment_scheduler()->set_time_to_next_enrollment_request(
+      kFakeRetryPeriod);
 
   expected_invocation_reasons.push_back(cryptauthv2::ClientMetadata::PERIODIC);
   expected_enrollment_results.emplace_back(
       CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
       base::nullopt /* client_directive */);
-  fake_enrollment_scheduler()->RequestEnrollmentNow();
+  fake_enrollment_scheduler()->RequestEnrollment(
+      expected_invocation_reasons.back(), kFakeSessionId);
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       3 /* expected_num_enrollment_started_notifications */);
-  FinishEnrollmentAttempt(2u /* expected_enroller_instance_index */,
-                          expected_invocation_reasons.back(),
-                          base::nullopt /* expected_session_id */,
-                          expected_enrollment_results.back());
+  FinishEnrollmentAttempt(
+      2u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          1 /* retry_count */, expected_invocation_reasons.back(),
+          kFakeSessionId) /* expected_client_metadata */,
+      expected_enrollment_results.back());
+  fake_enrollment_scheduler()->set_num_consecutive_enrollment_failures(2);
+  fake_enrollment_scheduler()->set_time_to_next_enrollment_request(
+      kFakeRetryPeriod);
 
   // While waiting for retry, force a manual enrollment that succeeds.
   expected_invocation_reasons.push_back(cryptauthv2::ClientMetadata::MANUAL);
@@ -903,10 +810,12 @@
                                            base::nullopt /* session_id */);
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       4 /* expected_num_enrollment_started_notifications */);
-  FinishEnrollmentAttempt(3u /* expected_enroller_instance_index */,
-                          expected_invocation_reasons.back(),
-                          base::nullopt /* expected_session_id */,
-                          expected_enrollment_results.back());
+  FinishEnrollmentAttempt(
+      3u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          2 /* retry_count */, expected_invocation_reasons.back(),
+          base::nullopt /* session_id */) /* expected_client_metadata */,
+      expected_enrollment_results.back());
 
   VerifyInvocationReasonHistogram(expected_invocation_reasons);
   VerifyEnrollmentResults(expected_enrollment_results);
diff --git a/chromeos/services/device_sync/device_sync_impl.cc b/chromeos/services/device_sync/device_sync_impl.cc
index 611810c3..783cd05 100644
--- a/chromeos/services/device_sync/device_sync_impl.cc
+++ b/chromeos/services/device_sync/device_sync_impl.cc
@@ -20,9 +20,9 @@
 #include "chromeos/services/device_sync/cryptauth_enrollment_manager_impl.h"
 #include "chromeos/services/device_sync/cryptauth_gcm_manager_impl.h"
 #include "chromeos/services/device_sync/cryptauth_key_registry_impl.h"
+#include "chromeos/services/device_sync/cryptauth_scheduler_impl.h"
 #include "chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h"
 #include "chromeos/services/device_sync/device_sync_type_converters.h"
-#include "chromeos/services/device_sync/persistent_enrollment_scheduler.h"
 #include "chromeos/services/device_sync/proto/cryptauth_api.pb.h"
 #include "chromeos/services/device_sync/proto/device_classifier_util.h"
 #include "chromeos/services/device_sync/public/cpp/gcm_device_info_provider.h"
@@ -47,7 +47,7 @@
           chromeos::features::kCryptAuthV2Enrollment)) {
     CryptAuthV2EnrollmentManagerImpl::RegisterPrefs(registry);
     CryptAuthKeyRegistryImpl::RegisterPrefs(registry);
-    PersistentEnrollmentScheduler::RegisterPrefs(registry);
+    CryptAuthSchedulerImpl::RegisterPrefs(registry);
   } else {
     CryptAuthEnrollmentManagerImpl::RegisterPrefs(registry);
   }
@@ -507,6 +507,7 @@
   remote_device_provider_.reset();
   cryptauth_device_manager_.reset();
   cryptauth_enrollment_manager_.reset();
+  cryptauth_scheduler_.reset();
   cryptauth_key_registry_.reset();
   cryptauth_client_factory_.reset();
   cryptauth_gcm_manager_.reset();
@@ -598,11 +599,15 @@
         CryptAuthKeyRegistryImpl::Factory::Get()->BuildInstance(
             pref_service_.get());
 
+    cryptauth_scheduler_ =
+        CryptAuthSchedulerImpl::Factory::Get()->BuildInstance(
+            pref_service_.get());
+
     cryptauth_enrollment_manager_ =
         CryptAuthV2EnrollmentManagerImpl::Factory::Get()->BuildInstance(
             client_app_metadata_provider_, cryptauth_key_registry_.get(),
             cryptauth_client_factory_.get(), cryptauth_gcm_manager_.get(),
-            pref_service_.get(), clock_);
+            cryptauth_scheduler_.get(), pref_service_.get(), clock_);
   } else {
     cryptauth_enrollment_manager_ =
         CryptAuthEnrollmentManagerImpl::Factory::NewInstance(
diff --git a/chromeos/services/device_sync/device_sync_impl.h b/chromeos/services/device_sync/device_sync_impl.h
index a7ed351..5f6b545aa 100644
--- a/chromeos/services/device_sync/device_sync_impl.h
+++ b/chromeos/services/device_sync/device_sync_impl.h
@@ -50,6 +50,7 @@
 class ClientAppMetadataProvider;
 class CryptAuthClientFactory;
 class CryptAuthDeviceManager;
+class CryptAuthScheduler;
 class CryptAuthKeyRegistry;
 class GcmDeviceInfoProvider;
 class SoftwareFeatureManager;
@@ -233,6 +234,7 @@
 
   // Only created and used if v2 Enrollment is enabled; null otherwise.
   std::unique_ptr<CryptAuthKeyRegistry> cryptauth_key_registry_;
+  std::unique_ptr<CryptAuthScheduler> cryptauth_scheduler_;
 
   std::unique_ptr<CryptAuthEnrollmentManager> cryptauth_enrollment_manager_;
   std::unique_ptr<CryptAuthDeviceManager> cryptauth_device_manager_;
diff --git a/chromeos/services/device_sync/device_sync_service_unittest.cc b/chromeos/services/device_sync/device_sync_service_unittest.cc
index 30a2003..b3bc1c6 100644
--- a/chromeos/services/device_sync/device_sync_service_unittest.cc
+++ b/chromeos/services/device_sync/device_sync_service_unittest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chromeos/services/device_sync/device_sync_service.h"
+
 #include <memory>
 
 #include "base/bind.h"
@@ -23,12 +25,13 @@
 #include "chromeos/services/device_sync/cryptauth_enrollment_manager_impl.h"
 #include "chromeos/services/device_sync/cryptauth_gcm_manager_impl.h"
 #include "chromeos/services/device_sync/cryptauth_key_registry_impl.h"
+#include "chromeos/services/device_sync/cryptauth_scheduler_impl.h"
 #include "chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h"
 #include "chromeos/services/device_sync/device_sync_impl.h"
-#include "chromeos/services/device_sync/device_sync_service.h"
 #include "chromeos/services/device_sync/fake_cryptauth_device_manager.h"
 #include "chromeos/services/device_sync/fake_cryptauth_enrollment_manager.h"
 #include "chromeos/services/device_sync/fake_cryptauth_gcm_manager.h"
+#include "chromeos/services/device_sync/fake_cryptauth_scheduler.h"
 #include "chromeos/services/device_sync/fake_device_sync_observer.h"
 #include "chromeos/services/device_sync/fake_remote_device_provider.h"
 #include "chromeos/services/device_sync/fake_software_feature_manager.h"
@@ -207,6 +210,38 @@
   FakeCryptAuthDeviceManager* instance_ = nullptr;
 };
 
+class FakeCryptAuthSchedulerFactory : public CryptAuthSchedulerImpl::Factory {
+ public:
+  FakeCryptAuthSchedulerFactory(TestingPrefServiceSimple* test_pref_service)
+      : test_pref_service_(test_pref_service) {}
+
+  ~FakeCryptAuthSchedulerFactory() override = default;
+
+  FakeCryptAuthScheduler* instance() { return instance_; }
+
+  // CryptAuthSchedulerImpl::Factory:
+  std::unique_ptr<CryptAuthScheduler> BuildInstance(
+      PrefService* pref_service,
+      NetworkStateHandler* network_state_handler,
+      base::Clock* clock,
+      std::unique_ptr<base::OneShotTimer> enrollment_timer) override {
+    EXPECT_EQ(test_pref_service_, pref_service);
+
+    // Only one instance is expected to be created per test.
+    EXPECT_FALSE(instance_);
+
+    auto instance = std::make_unique<FakeCryptAuthScheduler>();
+    instance_ = instance.get();
+
+    return std::move(instance);
+  }
+
+ private:
+  TestingPrefServiceSimple* test_pref_service_;
+
+  FakeCryptAuthScheduler* instance_ = nullptr;
+};
+
 class FakeCryptAuthEnrollmentManagerFactory
     : public CryptAuthEnrollmentManagerImpl::Factory {
  public:
@@ -307,12 +342,14 @@
       FakeClientAppMetadataProvider* fake_client_app_metadata_provider,
       FakeCryptAuthKeyRegistryFactory* fake_cryptauth_key_registry_factory,
       FakeCryptAuthGCMManagerFactory* fake_cryptauth_gcm_manager_factory,
+      FakeCryptAuthSchedulerFactory* fake_cryptauth_scheduler_factory,
       TestingPrefServiceSimple* test_pref_service,
       base::SimpleTestClock* simple_test_clock)
       : fake_client_app_metadata_provider_(fake_client_app_metadata_provider),
         fake_cryptauth_key_registry_factory_(
             fake_cryptauth_key_registry_factory),
         fake_cryptauth_gcm_manager_factory_(fake_cryptauth_gcm_manager_factory),
+        fake_cryptauth_scheduler_factory_(fake_cryptauth_scheduler_factory),
         test_pref_service_(test_pref_service),
         simple_test_clock_(simple_test_clock) {}
 
@@ -332,12 +369,14 @@
       CryptAuthKeyRegistry* key_registry,
       CryptAuthClientFactory* client_factory,
       CryptAuthGCMManager* gcm_manager,
+      CryptAuthScheduler* scheduler,
       PrefService* pref_service,
       base::Clock* clock,
       std::unique_ptr<base::OneShotTimer> timer) override {
     EXPECT_EQ(fake_client_app_metadata_provider_, client_app_metadata_provider);
     EXPECT_EQ(fake_cryptauth_key_registry_factory_->instance(), key_registry);
     EXPECT_EQ(fake_cryptauth_gcm_manager_factory_->instance(), gcm_manager);
+    EXPECT_EQ(fake_cryptauth_scheduler_factory_->instance(), scheduler);
     EXPECT_EQ(test_pref_service_, pref_service);
     EXPECT_EQ(simple_test_clock_, clock);
 
@@ -356,6 +395,7 @@
   FakeClientAppMetadataProvider* fake_client_app_metadata_provider_;
   FakeCryptAuthKeyRegistryFactory* fake_cryptauth_key_registry_factory_;
   FakeCryptAuthGCMManagerFactory* fake_cryptauth_gcm_manager_factory_;
+  FakeCryptAuthSchedulerFactory* fake_cryptauth_scheduler_factory_;
   TestingPrefServiceSimple* test_pref_service_;
   base::SimpleTestClock* simple_test_clock_;
 
@@ -556,6 +596,8 @@
         chromeos::features::kCryptAuthV2Enrollment, use_v2_enrollment_);
 
     DBusThreadManager::Initialize();
+    NetworkHandler::Initialize();
+    base::RunLoop().RunUntilIdle();
 
     fake_gcm_driver_ = std::make_unique<gcm::FakeGCMDriver>();
 
@@ -593,11 +635,17 @@
       CryptAuthKeyRegistryImpl::Factory::SetFactoryForTesting(
           fake_cryptauth_key_registry_factory_.get());
 
+      fake_cryptauth_scheduler_factory_ =
+          std::make_unique<FakeCryptAuthSchedulerFactory>(test_pref_service_);
+      CryptAuthSchedulerImpl::Factory::SetFactoryForTesting(
+          fake_cryptauth_scheduler_factory_.get());
+
       fake_cryptauth_v2_enrollment_manager_factory_ =
           std::make_unique<FakeCryptAuthV2EnrollmentManagerFactory>(
               fake_client_app_metadata_provider_.get(),
               fake_cryptauth_key_registry_factory_.get(),
-              fake_cryptauth_gcm_manager_factory_.get(), test_pref_service_,
+              fake_cryptauth_gcm_manager_factory_.get(),
+              fake_cryptauth_scheduler_factory_.get(), test_pref_service_,
               simple_test_clock_.get());
       CryptAuthV2EnrollmentManagerImpl::Factory::SetFactoryForTesting(
           fake_cryptauth_v2_enrollment_manager_factory_.get());
@@ -667,6 +715,7 @@
     SoftwareFeatureManagerImpl::Factory::SetInstanceForTesting(nullptr);
     DeviceSyncImpl::Factory::SetInstanceForTesting(nullptr);
 
+    NetworkHandler::Shutdown();
     DBusThreadManager::Shutdown();
   }
 
@@ -1101,6 +1150,8 @@
       fake_client_app_metadata_provider_;
   std::unique_ptr<FakeCryptAuthKeyRegistryFactory>
       fake_cryptauth_key_registry_factory_;
+  std::unique_ptr<FakeCryptAuthSchedulerFactory>
+      fake_cryptauth_scheduler_factory_;
   std::unique_ptr<FakeCryptAuthV2EnrollmentManagerFactory>
       fake_cryptauth_v2_enrollment_manager_factory_;
   std::unique_ptr<FakeRemoteDeviceProviderFactory>
diff --git a/chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.cc b/chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.cc
deleted file mode 100644
index 42d266c..0000000
--- a/chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.cc
+++ /dev/null
@@ -1,73 +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 "chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.h"
-
-#include "base/logging.h"
-
-namespace chromeos {
-
-namespace device_sync {
-
-constexpr base::TimeDelta
-    FakeCryptAuthEnrollmentScheduler::kDefaultRefreshPeriod;
-constexpr base::TimeDelta
-    FakeCryptAuthEnrollmentScheduler::kDefaultTimeToNextEnrollmentRequest;
-
-FakeCryptAuthEnrollmentScheduler::FakeCryptAuthEnrollmentScheduler(
-    Delegate* delegate)
-    : CryptAuthEnrollmentScheduler(delegate) {}
-
-FakeCryptAuthEnrollmentScheduler::~FakeCryptAuthEnrollmentScheduler() = default;
-
-void FakeCryptAuthEnrollmentScheduler::RequestEnrollmentNow() {
-  is_waiting_for_enrollment_result_ = true;
-  NotifyEnrollmentRequested(client_directive_policy_reference_);
-}
-
-void FakeCryptAuthEnrollmentScheduler::HandleEnrollmentResult(
-    const CryptAuthEnrollmentResult& enrollment_result) {
-  DCHECK(is_waiting_for_enrollment_result_);
-  handled_enrollment_results_.push_back(enrollment_result);
-  is_waiting_for_enrollment_result_ = false;
-}
-
-base::Optional<base::Time>
-FakeCryptAuthEnrollmentScheduler::GetLastSuccessfulEnrollmentTime() const {
-  return last_successful_enrollment_time_;
-}
-
-base::TimeDelta FakeCryptAuthEnrollmentScheduler::GetRefreshPeriod() const {
-  return refresh_period_;
-}
-
-base::TimeDelta
-FakeCryptAuthEnrollmentScheduler::GetTimeToNextEnrollmentRequest() const {
-  return time_to_next_enrollment_request_;
-}
-
-bool FakeCryptAuthEnrollmentScheduler::IsWaitingForEnrollmentResult() const {
-  return is_waiting_for_enrollment_result_;
-}
-
-size_t FakeCryptAuthEnrollmentScheduler::GetNumConsecutiveFailures() const {
-  return num_consecutive_failures_;
-}
-
-FakeCryptAuthEnrollmentSchedulerDelegate::
-    FakeCryptAuthEnrollmentSchedulerDelegate() = default;
-
-FakeCryptAuthEnrollmentSchedulerDelegate::
-    ~FakeCryptAuthEnrollmentSchedulerDelegate() = default;
-
-void FakeCryptAuthEnrollmentSchedulerDelegate::OnEnrollmentRequested(
-    const base::Optional<cryptauthv2::PolicyReference>&
-        client_directive_policy_reference) {
-  policy_references_from_enrollment_requests_.push_back(
-      client_directive_policy_reference);
-}
-
-}  // namespace device_sync
-
-}  // namespace chromeos
diff --git a/chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.h b/chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.h
deleted file mode 100644
index 4aaf746c..0000000
--- a/chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.h
+++ /dev/null
@@ -1,112 +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 CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_CRYPTAUTH_ENROLLMENT_SCHEDULER_H_
-#define CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_CRYPTAUTH_ENROLLMENT_SCHEDULER_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "base/optional.h"
-#include "base/time/time.h"
-#include "chromeos/services/device_sync/cryptauth_enrollment_result.h"
-#include "chromeos/services/device_sync/cryptauth_enrollment_scheduler.h"
-#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
-
-namespace chromeos {
-
-namespace device_sync {
-
-// Fake CryptAuthEnrollmentScheduler implementation.
-class FakeCryptAuthEnrollmentScheduler : public CryptAuthEnrollmentScheduler {
- public:
-  static constexpr base::TimeDelta kDefaultRefreshPeriod =
-      base::TimeDelta::FromDays(30);
-  static constexpr base::TimeDelta kDefaultTimeToNextEnrollmentRequest =
-      base::TimeDelta::FromHours(12);
-
-  FakeCryptAuthEnrollmentScheduler(Delegate* delegate);
-  ~FakeCryptAuthEnrollmentScheduler() override;
-
-  const std::vector<CryptAuthEnrollmentResult>& handled_enrollment_results()
-      const {
-    return handled_enrollment_results_;
-  }
-
-  void set_client_directive_policy_reference(
-      const base::Optional<cryptauthv2::PolicyReference>&
-          client_directive_policy_reference) {
-    client_directive_policy_reference_ = client_directive_policy_reference;
-  }
-
-  void set_last_successful_enrollment_time(
-      base::Time last_successful_enrollment_time) {
-    last_successful_enrollment_time_ = last_successful_enrollment_time;
-  }
-
-  void set_refresh_period(base::TimeDelta refresh_period) {
-    refresh_period_ = refresh_period;
-  }
-
-  void set_time_to_next_enrollment_request(
-      base::TimeDelta time_to_next_enrollment_request) {
-    time_to_next_enrollment_request_ = time_to_next_enrollment_request;
-  }
-
-  void set_num_consecutive_failures(size_t num_consecutive_failures) {
-    num_consecutive_failures_ = num_consecutive_failures;
-  }
-
-  // CryptAuthEnrollmentScheduler:
-  void RequestEnrollmentNow() override;
-  void HandleEnrollmentResult(
-      const CryptAuthEnrollmentResult& enrollment_result) override;
-  base::Optional<base::Time> GetLastSuccessfulEnrollmentTime() const override;
-  base::TimeDelta GetRefreshPeriod() const override;
-  base::TimeDelta GetTimeToNextEnrollmentRequest() const override;
-  bool IsWaitingForEnrollmentResult() const override;
-  size_t GetNumConsecutiveFailures() const override;
-
- private:
-  std::vector<CryptAuthEnrollmentResult> handled_enrollment_results_;
-  base::Optional<cryptauthv2::PolicyReference>
-      client_directive_policy_reference_;
-  base::Optional<base::Time> last_successful_enrollment_time_;
-  base::TimeDelta refresh_period_ = kDefaultRefreshPeriod;
-  base::TimeDelta time_to_next_enrollment_request_ =
-      kDefaultTimeToNextEnrollmentRequest;
-  size_t num_consecutive_failures_ = 0u;
-  bool is_waiting_for_enrollment_result_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeCryptAuthEnrollmentScheduler);
-};
-
-// Fake CryptAuthEnrollmentScheduler::Delegate implementation.
-class FakeCryptAuthEnrollmentSchedulerDelegate
-    : public CryptAuthEnrollmentScheduler::Delegate {
- public:
-  FakeCryptAuthEnrollmentSchedulerDelegate();
-  ~FakeCryptAuthEnrollmentSchedulerDelegate() override;
-
-  const std::vector<base::Optional<cryptauthv2::PolicyReference>>&
-  policy_references_from_enrollment_requests() const {
-    return policy_references_from_enrollment_requests_;
-  }
-
- private:
-  // CryptAuthEnrollmentScheduler::Delegate:
-  void OnEnrollmentRequested(const base::Optional<cryptauthv2::PolicyReference>&
-                                 client_directive_policy_reference) override;
-
-  std::vector<base::Optional<cryptauthv2::PolicyReference>>
-      policy_references_from_enrollment_requests_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeCryptAuthEnrollmentSchedulerDelegate);
-};
-
-}  // namespace device_sync
-
-}  // namespace chromeos
-
-#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_CRYPTAUTH_ENROLLMENT_SCHEDULER_H_
diff --git a/chromeos/services/device_sync/fake_cryptauth_scheduler.cc b/chromeos/services/device_sync/fake_cryptauth_scheduler.cc
new file mode 100644
index 0000000..92fc00c0
--- /dev/null
+++ b/chromeos/services/device_sync/fake_cryptauth_scheduler.cc
@@ -0,0 +1,88 @@
+// 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 "chromeos/services/device_sync/fake_cryptauth_scheduler.h"
+
+#include "base/logging.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+constexpr base::TimeDelta FakeCryptAuthScheduler::kDefaultRefreshPeriod;
+constexpr base::TimeDelta
+    FakeCryptAuthScheduler::kDefaultTimeToNextEnrollmentRequest;
+
+FakeCryptAuthScheduler::FakeCryptAuthScheduler() = default;
+
+FakeCryptAuthScheduler::~FakeCryptAuthScheduler() = default;
+
+void FakeCryptAuthScheduler::RequestEnrollment(
+    const cryptauthv2::ClientMetadata::InvocationReason& invocation_reason,
+    const base::Optional<std::string>& session_id) {
+  DCHECK(HasEnrollmentSchedulingStarted());
+  is_waiting_for_enrollment_result_ = true;
+
+  cryptauthv2::ClientMetadata client_metadata;
+  client_metadata.set_retry_count(num_consecutive_enrollment_failures_);
+  client_metadata.set_invocation_reason(invocation_reason);
+  if (session_id)
+    client_metadata.set_session_id(*session_id);
+
+  NotifyEnrollmentRequested(client_metadata,
+                            client_directive_policy_reference_);
+}
+
+void FakeCryptAuthScheduler::HandleEnrollmentResult(
+    const CryptAuthEnrollmentResult& enrollment_result) {
+  DCHECK(is_waiting_for_enrollment_result_);
+  handled_enrollment_results_.push_back(enrollment_result);
+  is_waiting_for_enrollment_result_ = false;
+}
+
+base::Optional<base::Time>
+FakeCryptAuthScheduler::GetLastSuccessfulEnrollmentTime() const {
+  return last_successful_enrollment_time_;
+}
+
+base::TimeDelta FakeCryptAuthScheduler::GetRefreshPeriod() const {
+  return refresh_period_;
+}
+
+base::TimeDelta FakeCryptAuthScheduler::GetTimeToNextEnrollmentRequest() const {
+  return time_to_next_enrollment_request_;
+}
+
+bool FakeCryptAuthScheduler::IsWaitingForEnrollmentResult() const {
+  return is_waiting_for_enrollment_result_;
+}
+
+size_t FakeCryptAuthScheduler::GetNumConsecutiveEnrollmentFailures() const {
+  return num_consecutive_enrollment_failures_;
+}
+
+FakeCryptAuthSchedulerEnrollmentDelegate::
+    FakeCryptAuthSchedulerEnrollmentDelegate()
+    : weak_ptr_factory_(this) {}
+
+FakeCryptAuthSchedulerEnrollmentDelegate::
+    ~FakeCryptAuthSchedulerEnrollmentDelegate() = default;
+
+base::WeakPtr<FakeCryptAuthSchedulerEnrollmentDelegate>
+FakeCryptAuthSchedulerEnrollmentDelegate::GetWeakPtr() {
+  return weak_ptr_factory_.GetWeakPtr();
+}
+
+void FakeCryptAuthSchedulerEnrollmentDelegate::OnEnrollmentRequested(
+    const cryptauthv2::ClientMetadata& client_metadata,
+    const base::Optional<cryptauthv2::PolicyReference>&
+        client_directive_policy_reference) {
+  client_metadata_from_enrollment_requests_.push_back(client_metadata);
+  policy_references_from_enrollment_requests_.push_back(
+      client_directive_policy_reference);
+}
+
+}  // namespace device_sync
+
+}  // namespace chromeos
diff --git a/chromeos/services/device_sync/fake_cryptauth_scheduler.h b/chromeos/services/device_sync/fake_cryptauth_scheduler.h
new file mode 100644
index 0000000..745c643d
--- /dev/null
+++ b/chromeos/services/device_sync/fake_cryptauth_scheduler.h
@@ -0,0 +1,129 @@
+// 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 CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_CRYPTAUTH_SCHEDULER_H_
+#define CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_CRYPTAUTH_SCHEDULER_H_
+
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/time/time.h"
+#include "chromeos/services/device_sync/cryptauth_enrollment_result.h"
+#include "chromeos/services/device_sync/cryptauth_scheduler.h"
+#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+// Fake CryptAuthScheduler implementation.
+class FakeCryptAuthScheduler : public CryptAuthScheduler {
+ public:
+  static constexpr base::TimeDelta kDefaultRefreshPeriod =
+      base::TimeDelta::FromDays(30);
+  static constexpr base::TimeDelta kDefaultTimeToNextEnrollmentRequest =
+      base::TimeDelta::FromHours(12);
+
+  FakeCryptAuthScheduler();
+  ~FakeCryptAuthScheduler() override;
+
+  const std::vector<CryptAuthEnrollmentResult>& handled_enrollment_results()
+      const {
+    return handled_enrollment_results_;
+  }
+
+  void set_client_directive_policy_reference(
+      const base::Optional<cryptauthv2::PolicyReference>&
+          client_directive_policy_reference) {
+    client_directive_policy_reference_ = client_directive_policy_reference;
+  }
+
+  void set_last_successful_enrollment_time(
+      base::Time last_successful_enrollment_time) {
+    last_successful_enrollment_time_ = last_successful_enrollment_time;
+  }
+
+  void set_refresh_period(base::TimeDelta refresh_period) {
+    refresh_period_ = refresh_period;
+  }
+
+  void set_time_to_next_enrollment_request(
+      base::TimeDelta time_to_next_enrollment_request) {
+    time_to_next_enrollment_request_ = time_to_next_enrollment_request;
+  }
+
+  void set_num_consecutive_enrollment_failures(
+      size_t num_consecutive_enrollment_failures) {
+    num_consecutive_enrollment_failures_ = num_consecutive_enrollment_failures;
+  }
+
+  // CryptAuthScheduler:
+  void RequestEnrollment(
+      const cryptauthv2::ClientMetadata::InvocationReason& invocation_reason,
+      const base::Optional<std::string>& session_id) override;
+  void HandleEnrollmentResult(
+      const CryptAuthEnrollmentResult& enrollment_result) override;
+  base::Optional<base::Time> GetLastSuccessfulEnrollmentTime() const override;
+  base::TimeDelta GetRefreshPeriod() const override;
+  base::TimeDelta GetTimeToNextEnrollmentRequest() const override;
+  bool IsWaitingForEnrollmentResult() const override;
+  size_t GetNumConsecutiveEnrollmentFailures() const override;
+
+ private:
+  std::vector<CryptAuthEnrollmentResult> handled_enrollment_results_;
+  base::Optional<cryptauthv2::PolicyReference>
+      client_directive_policy_reference_;
+  base::Optional<base::Time> last_successful_enrollment_time_;
+  base::TimeDelta refresh_period_ = kDefaultRefreshPeriod;
+  base::TimeDelta time_to_next_enrollment_request_ =
+      kDefaultTimeToNextEnrollmentRequest;
+  size_t num_consecutive_enrollment_failures_ = 0u;
+  bool is_waiting_for_enrollment_result_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeCryptAuthScheduler);
+};
+
+// Fake CryptAuthScheduler::EnrollmentDelegate implementation.
+class FakeCryptAuthSchedulerEnrollmentDelegate
+    : public CryptAuthScheduler::EnrollmentDelegate {
+ public:
+  FakeCryptAuthSchedulerEnrollmentDelegate();
+  ~FakeCryptAuthSchedulerEnrollmentDelegate() override;
+
+  base::WeakPtr<FakeCryptAuthSchedulerEnrollmentDelegate> GetWeakPtr();
+
+  const std::vector<cryptauthv2::ClientMetadata>&
+  client_metadata_from_enrollment_requests() const {
+    return client_metadata_from_enrollment_requests_;
+  }
+
+  const std::vector<base::Optional<cryptauthv2::PolicyReference>>&
+  policy_references_from_enrollment_requests() const {
+    return policy_references_from_enrollment_requests_;
+  }
+
+ private:
+  // CryptAuthScheduler::EnrollmentDelegate:
+  void OnEnrollmentRequested(const cryptauthv2::ClientMetadata& client_metadata,
+                             const base::Optional<cryptauthv2::PolicyReference>&
+                                 client_directive_policy_reference) override;
+
+  std::vector<cryptauthv2::ClientMetadata>
+      client_metadata_from_enrollment_requests_;
+  std::vector<base::Optional<cryptauthv2::PolicyReference>>
+      policy_references_from_enrollment_requests_;
+  base::WeakPtrFactory<FakeCryptAuthSchedulerEnrollmentDelegate>
+      weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeCryptAuthSchedulerEnrollmentDelegate);
+};
+
+}  // namespace device_sync
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_FAKE_CRYPTAUTH_SCHEDULER_H_
diff --git a/chromeos/services/device_sync/network_aware_enrollment_scheduler.cc b/chromeos/services/device_sync/network_aware_enrollment_scheduler.cc
deleted file mode 100644
index 9b6d2bc..0000000
--- a/chromeos/services/device_sync/network_aware_enrollment_scheduler.cc
+++ /dev/null
@@ -1,161 +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 "chromeos/services/device_sync/network_aware_enrollment_scheduler.h"
-
-#include <utility>
-
-#include "base/memory/ptr_util.h"
-#include "base/no_destructor.h"
-#include "chromeos/components/multidevice/logging/logging.h"
-#include "chromeos/network/network_state.h"
-#include "chromeos/network/network_state_handler.h"
-#include "chromeos/services/device_sync/persistent_enrollment_scheduler.h"
-
-namespace chromeos {
-
-namespace device_sync {
-
-// static
-NetworkAwareEnrollmentScheduler::Factory*
-    NetworkAwareEnrollmentScheduler::Factory::test_factory_ = nullptr;
-
-// static
-NetworkAwareEnrollmentScheduler::Factory*
-NetworkAwareEnrollmentScheduler::Factory::Get() {
-  if (test_factory_)
-    return test_factory_;
-
-  static base::NoDestructor<Factory> factory;
-  return factory.get();
-}
-
-// static
-void NetworkAwareEnrollmentScheduler::Factory::SetFactoryForTesting(
-    Factory* test_factory) {
-  test_factory_ = test_factory;
-}
-
-NetworkAwareEnrollmentScheduler::Factory::~Factory() = default;
-
-std::unique_ptr<CryptAuthEnrollmentScheduler>
-NetworkAwareEnrollmentScheduler::Factory::BuildInstance(
-    CryptAuthEnrollmentScheduler::Delegate* delegate,
-    PrefService* pref_service,
-    NetworkStateHandler* network_state_handler) {
-  std::unique_ptr<NetworkAwareEnrollmentScheduler> network_aware_scheduler =
-      base::WrapUnique(
-          new NetworkAwareEnrollmentScheduler(delegate, network_state_handler));
-
-  std::unique_ptr<CryptAuthEnrollmentScheduler> network_unaware_scheduler =
-      PersistentEnrollmentScheduler::Factory::Get()->BuildInstance(
-          network_aware_scheduler.get(), pref_service);
-
-  network_aware_scheduler->network_unaware_scheduler_ =
-      std::move(network_unaware_scheduler);
-
-  return network_aware_scheduler;
-}
-
-NetworkAwareEnrollmentScheduler::NetworkAwareEnrollmentScheduler(
-    CryptAuthEnrollmentScheduler::Delegate* delegate,
-    NetworkStateHandler* network_state_handler)
-    : CryptAuthEnrollmentScheduler(delegate),
-      network_state_handler_(network_state_handler) {
-  DCHECK(network_state_handler_);
-  network_state_handler_->AddObserver(this, FROM_HERE);
-}
-
-NetworkAwareEnrollmentScheduler::~NetworkAwareEnrollmentScheduler() {
-  if (network_state_handler_)
-    network_state_handler_->RemoveObserver(this, FROM_HERE);
-}
-
-void NetworkAwareEnrollmentScheduler::RequestEnrollmentNow() {
-  network_unaware_scheduler_->RequestEnrollmentNow();
-}
-
-void NetworkAwareEnrollmentScheduler::HandleEnrollmentResult(
-    const CryptAuthEnrollmentResult& enrollment_result) {
-  network_unaware_scheduler_->HandleEnrollmentResult(enrollment_result);
-}
-
-base::Optional<base::Time>
-NetworkAwareEnrollmentScheduler::GetLastSuccessfulEnrollmentTime() const {
-  return network_unaware_scheduler_->GetLastSuccessfulEnrollmentTime();
-}
-
-base::TimeDelta NetworkAwareEnrollmentScheduler::GetRefreshPeriod() const {
-  return network_unaware_scheduler_->GetRefreshPeriod();
-}
-
-base::TimeDelta
-NetworkAwareEnrollmentScheduler::GetTimeToNextEnrollmentRequest() const {
-  return network_unaware_scheduler_->GetTimeToNextEnrollmentRequest();
-}
-
-bool NetworkAwareEnrollmentScheduler::IsWaitingForEnrollmentResult() const {
-  return network_unaware_scheduler_->IsWaitingForEnrollmentResult() &&
-         !pending_client_directive_policy_reference_.has_value();
-}
-
-size_t NetworkAwareEnrollmentScheduler::GetNumConsecutiveFailures() const {
-  return network_unaware_scheduler_->GetNumConsecutiveFailures();
-}
-
-void NetworkAwareEnrollmentScheduler::OnEnrollmentRequested(
-    const base::Optional<cryptauthv2::PolicyReference>&
-        client_directive_policy_reference) {
-  if (DoesMachineHaveNetworkConnectivity()) {
-    NotifyEnrollmentRequested(client_directive_policy_reference);
-    return;
-  }
-
-  PA_LOG(INFO) << "NetworkAwareEnrollmentScheduler::OnEnrollmentRequested(): "
-               << "Enrollment scheduled while the device is offline. Waiting "
-               << "for online connectivity before making request.";
-  pending_client_directive_policy_reference_ =
-      client_directive_policy_reference;
-}
-
-void NetworkAwareEnrollmentScheduler::DefaultNetworkChanged(
-    const NetworkState* network) {
-  // If enrollment has not been requested, there is nothing to do.
-  if (!pending_client_directive_policy_reference_)
-    return;
-
-  // The updated default network may not be online.
-  if (!DoesMachineHaveNetworkConnectivity())
-    return;
-
-  // Now that the device has connectivity, request enrollment. Note that the
-  // |pending_client_directive_policy_reference_| field is cleared before the
-  // delegate is notified to ensure internal consistency.
-  base::Optional<cryptauthv2::PolicyReference> policy_reference_for_enrollment =
-      *pending_client_directive_policy_reference_;
-  pending_client_directive_policy_reference_.reset();
-  NotifyEnrollmentRequested(policy_reference_for_enrollment);
-}
-
-void NetworkAwareEnrollmentScheduler::OnShuttingDown() {
-  DCHECK(network_state_handler_);
-  network_state_handler_->RemoveObserver(this, FROM_HERE);
-  network_state_handler_ = nullptr;
-}
-
-bool NetworkAwareEnrollmentScheduler::DoesMachineHaveNetworkConnectivity() {
-  if (!network_state_handler_)
-    return false;
-
-  // TODO(khorimoto): IsConnectedState() can still return true if connected to a
-  // captive portal; use the "online" boolean once we fetch data via the
-  // networking Mojo API. See https://crbug.com/862420.
-  const NetworkState* default_network =
-      network_state_handler_->DefaultNetwork();
-  return default_network && default_network->IsConnectedState();
-}
-
-}  // namespace device_sync
-
-}  // namespace chromeos
diff --git a/chromeos/services/device_sync/network_aware_enrollment_scheduler.h b/chromeos/services/device_sync/network_aware_enrollment_scheduler.h
deleted file mode 100644
index e6f4e5b..0000000
--- a/chromeos/services/device_sync/network_aware_enrollment_scheduler.h
+++ /dev/null
@@ -1,97 +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 CHROMEOS_SERVICES_DEVICE_SYNC_NETWORK_AWARE_ENROLLMENT_SCHEDULER_H_
-#define CHROMEOS_SERVICES_DEVICE_SYNC_NETWORK_AWARE_ENROLLMENT_SCHEDULER_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "chromeos/network/network_handler.h"
-#include "chromeos/network/network_state_handler_observer.h"
-#include "chromeos/services/device_sync/cryptauth_enrollment_scheduler.h"
-
-class PrefService;
-
-namespace chromeos {
-
-class NetworkStateHandler;
-
-namespace device_sync {
-
-// CryptAuthEnrollmentScheduler implementation which ensures that enrollment is
-// only requested while online. This class owns and serves as a delegate to a
-// network-unaware scheduler which requests enrollment without checking for
-// network connectivity. When this class receives a request from the network-
-// unaware scheduler, it:
-//   *Requests enrollment immediately if there is network connectivity, or
-//   *Caches the request until network connectivity has been attained, then
-//    requests enrollment.
-class NetworkAwareEnrollmentScheduler
-    : public CryptAuthEnrollmentScheduler,
-      public CryptAuthEnrollmentScheduler::Delegate,
-      public NetworkStateHandlerObserver {
- public:
-  class Factory {
-   public:
-    static Factory* Get();
-    static void SetFactoryForTesting(Factory* test_factory);
-    virtual ~Factory();
-    virtual std::unique_ptr<CryptAuthEnrollmentScheduler> BuildInstance(
-        CryptAuthEnrollmentScheduler::Delegate* delegate,
-        PrefService* pref_service,
-        NetworkStateHandler* network_state_handler =
-            NetworkHandler::Get()->network_state_handler());
-
-   private:
-    static Factory* test_factory_;
-  };
-
-  ~NetworkAwareEnrollmentScheduler() override;
-
- private:
-  NetworkAwareEnrollmentScheduler(
-      CryptAuthEnrollmentScheduler::Delegate* delegate,
-      NetworkStateHandler* network_state_handler);
-
-  // CryptAuthEnrollmentScheduler:
-  void RequestEnrollmentNow() override;
-  void HandleEnrollmentResult(
-      const CryptAuthEnrollmentResult& enrollment_result) override;
-  base::Optional<base::Time> GetLastSuccessfulEnrollmentTime() const override;
-  base::TimeDelta GetRefreshPeriod() const override;
-  base::TimeDelta GetTimeToNextEnrollmentRequest() const override;
-  bool IsWaitingForEnrollmentResult() const override;
-  size_t GetNumConsecutiveFailures() const override;
-
-  // CryptAuthEnrollmentScheduler::Delegate:
-  void OnEnrollmentRequested(const base::Optional<cryptauthv2::PolicyReference>&
-                                 client_directive_policy_reference) override;
-
-  // NetworkStateHandlerObserver:
-  void DefaultNetworkChanged(const NetworkState* network) override;
-  void OnShuttingDown() override;
-
-  bool DoesMachineHaveNetworkConnectivity();
-
-  NetworkStateHandler* network_state_handler_;
-  std::unique_ptr<CryptAuthEnrollmentScheduler> network_unaware_scheduler_;
-
-  // The pending enrollment request, if it exists. If OnEnrollmentRequested() is
-  // invoked while offline, this class stores the optional PolicyReference
-  // parameter for that function to this instance field; then, when online
-  // connectivity has been restored, this class notifies *its* observer,
-  // forwarding this instance field. If this class does not have a pending
-  // enrollment, this field is null.
-  base::Optional<base::Optional<cryptauthv2::PolicyReference>>
-      pending_client_directive_policy_reference_;
-
-  DISALLOW_COPY_AND_ASSIGN(NetworkAwareEnrollmentScheduler);
-};
-
-}  // namespace device_sync
-
-}  // namespace chromeos
-
-#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_NETWORK_AWARE_ENROLLMENT_SCHEDULER_H_
diff --git a/chromeos/services/device_sync/network_aware_enrollment_scheduler_unittest.cc b/chromeos/services/device_sync/network_aware_enrollment_scheduler_unittest.cc
deleted file mode 100644
index c7566c8..0000000
--- a/chromeos/services/device_sync/network_aware_enrollment_scheduler_unittest.cc
+++ /dev/null
@@ -1,234 +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 "chromeos/services/device_sync/network_aware_enrollment_scheduler.h"
-
-#include <memory>
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/test/scoped_task_environment.h"
-#include "chromeos/network/network_state_handler.h"
-#include "chromeos/network/network_state_test_helper.h"
-#include "chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.h"
-#include "chromeos/services/device_sync/persistent_enrollment_scheduler.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
-
-namespace chromeos {
-
-namespace device_sync {
-
-namespace {
-
-const char kWifiServiceGuid[] = "wifiGuid";
-
-enum class NetworkConnectionStatus { kDisconnected, kConnecting, kConnected };
-
-class FakePersistentEnrollmentSchedulerFactory
-    : public PersistentEnrollmentScheduler::Factory {
- public:
-  FakePersistentEnrollmentSchedulerFactory() = default;
-  ~FakePersistentEnrollmentSchedulerFactory() override = default;
-
-  FakeCryptAuthEnrollmentScheduler* instance() { return instance_; }
-
- private:
-  // PersistentEnrollmentScheduler::Factory:
-  std::unique_ptr<CryptAuthEnrollmentScheduler> BuildInstance(
-      CryptAuthEnrollmentScheduler::Delegate* delegate,
-      PrefService* pref_service,
-      base::Clock* clock,
-      std::unique_ptr<base::OneShotTimer> timer,
-      scoped_refptr<base::TaskRunner> task_runner) override {
-    EXPECT_FALSE(instance_);
-    auto fake_network_unaware_scheduler =
-        std::make_unique<FakeCryptAuthEnrollmentScheduler>(delegate);
-    instance_ = fake_network_unaware_scheduler.get();
-    return std::move(fake_network_unaware_scheduler);
-  }
-
-  FakeCryptAuthEnrollmentScheduler* instance_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(FakePersistentEnrollmentSchedulerFactory);
-};
-
-}  // namespace
-
-class DeviceSyncNetworkAwareEnrollmentSchedulerTest : public testing::Test {
- protected:
-  DeviceSyncNetworkAwareEnrollmentSchedulerTest() = default;
-  ~DeviceSyncNetworkAwareEnrollmentSchedulerTest() override = default;
-
-  void SetUp() override {
-    fake_persistent_enrollment_scheduler_factory_ =
-        std::make_unique<FakePersistentEnrollmentSchedulerFactory>();
-    PersistentEnrollmentScheduler::Factory::SetFactoryForTesting(
-        fake_persistent_enrollment_scheduler_factory_.get());
-
-    fake_delegate_ =
-        std::make_unique<FakeCryptAuthEnrollmentSchedulerDelegate>();
-    scheduler_ = NetworkAwareEnrollmentScheduler::Factory::Get()->BuildInstance(
-        fake_delegate_.get(), nullptr /* pref_service */,
-        helper_.network_state_handler());
-  }
-
-  void TearDown() override {
-    PersistentEnrollmentScheduler::Factory::SetFactoryForTesting(nullptr);
-  }
-
-  void AddDisconnectedWifiNetwork() {
-    EXPECT_TRUE(wifi_network_service_path_.empty());
-
-    std::stringstream ss;
-    ss << "{"
-       << "  \"GUID\": \"" << kWifiServiceGuid << "\","
-       << "  \"Type\": \"" << shill::kTypeWifi << "\","
-       << "  \"State\": \"" << shill::kStateIdle << "\""
-       << "}";
-
-    wifi_network_service_path_ = helper_.ConfigureService(ss.str());
-  }
-
-  void SetWifiNetworkStatus(NetworkConnectionStatus connection_status) {
-    std::string shill_connection_status;
-    switch (connection_status) {
-      case NetworkConnectionStatus::kDisconnected:
-        shill_connection_status = shill::kStateIdle;
-        break;
-      case NetworkConnectionStatus::kConnecting:
-        shill_connection_status = shill::kStateAssociation;
-        break;
-      case NetworkConnectionStatus::kConnected:
-        shill_connection_status = shill::kStateReady;
-        break;
-    }
-
-    helper_.SetServiceProperty(wifi_network_service_path_,
-                               shill::kStateProperty,
-                               base::Value(shill_connection_status));
-    base::RunLoop().RunUntilIdle();
-  }
-
-  void RemoveWifiNetwork() {
-    EXPECT_TRUE(!wifi_network_service_path_.empty());
-
-    helper_.service_test()->RemoveService(wifi_network_service_path_);
-    base::RunLoop().RunUntilIdle();
-
-    wifi_network_service_path_.clear();
-  }
-
-  const std::vector<base::Optional<cryptauthv2::PolicyReference>>&
-  delegate_policy_references() const {
-    return fake_delegate_->policy_references_from_enrollment_requests();
-  }
-
-  CryptAuthEnrollmentScheduler* scheduler() { return scheduler_.get(); }
-
-  FakeCryptAuthEnrollmentScheduler* fake_network_unaware_scheduler() {
-    return fake_persistent_enrollment_scheduler_factory_->instance();
-  }
-
- private:
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-  NetworkStateTestHelper helper_{false /* use_default_devices_and_services */};
-
-  std::unique_ptr<FakePersistentEnrollmentSchedulerFactory>
-      fake_persistent_enrollment_scheduler_factory_;
-
-  std::unique_ptr<FakeCryptAuthEnrollmentSchedulerDelegate> fake_delegate_;
-  std::unique_ptr<CryptAuthEnrollmentScheduler> scheduler_;
-
-  std::string wifi_network_service_path_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeviceSyncNetworkAwareEnrollmentSchedulerTest);
-};
-
-TEST_F(DeviceSyncNetworkAwareEnrollmentSchedulerTest,
-       RequestReceivedWhileOnline) {
-  AddDisconnectedWifiNetwork();
-  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
-
-  fake_network_unaware_scheduler()->RequestEnrollmentNow();
-  EXPECT_EQ(1u, delegate_policy_references().size());
-
-  fake_network_unaware_scheduler()->RequestEnrollmentNow();
-  EXPECT_EQ(2u, delegate_policy_references().size());
-}
-
-TEST_F(DeviceSyncNetworkAwareEnrollmentSchedulerTest,
-       RequestReceivedWhileOffline) {
-  AddDisconnectedWifiNetwork();
-  SetWifiNetworkStatus(NetworkConnectionStatus::kDisconnected);
-
-  // Request enrollment while disconnected using a null PolicyReference; since
-  // the network is disconnected, nothing should occur.
-  fake_network_unaware_scheduler()->set_client_directive_policy_reference(
-      base::nullopt);
-  fake_network_unaware_scheduler()->RequestEnrollmentNow();
-  EXPECT_TRUE(delegate_policy_references().empty());
-  EXPECT_TRUE(fake_network_unaware_scheduler()->IsWaitingForEnrollmentResult());
-  EXPECT_FALSE(scheduler()->IsWaitingForEnrollmentResult());
-
-  // Start connecting; no enrollment should have been requested yet.
-  SetWifiNetworkStatus(NetworkConnectionStatus::kConnecting);
-  EXPECT_TRUE(delegate_policy_references().empty());
-
-  // Try requesting while connecting, this time passing a PolicyReference; since
-  // the network is only connecting, nothing should occur.
-  static const std::string kPolicyReferenceName = "policyReferenceName";
-  cryptauthv2::PolicyReference policy_reference;
-  policy_reference.set_name(kPolicyReferenceName);
-  fake_network_unaware_scheduler()->set_client_directive_policy_reference(
-      policy_reference);
-  fake_network_unaware_scheduler()->RequestEnrollmentNow();
-  EXPECT_TRUE(delegate_policy_references().empty());
-  EXPECT_TRUE(fake_network_unaware_scheduler()->IsWaitingForEnrollmentResult());
-  EXPECT_FALSE(scheduler()->IsWaitingForEnrollmentResult());
-
-  // Connect; this should cause the enrollment request to be sent. Because the
-  // enrollment request with |policy_reference| was sent after the one with a
-  // null PolicyReference, the received request should have a PolicyReference.
-  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
-  EXPECT_EQ(1u, delegate_policy_references().size());
-  EXPECT_EQ(kPolicyReferenceName, delegate_policy_references()[0]->name());
-  EXPECT_TRUE(fake_network_unaware_scheduler()->IsWaitingForEnrollmentResult());
-  EXPECT_TRUE(scheduler()->IsWaitingForEnrollmentResult());
-
-  scheduler()->HandleEnrollmentResult(CryptAuthEnrollmentResult(
-      CryptAuthEnrollmentResult::ResultCode::kSuccessNoNewKeysNeeded,
-      base::nullopt /* client_directive */));
-  EXPECT_FALSE(
-      fake_network_unaware_scheduler()->IsWaitingForEnrollmentResult());
-  EXPECT_FALSE(scheduler()->IsWaitingForEnrollmentResult());
-
-  // Now, remove the network entirely.
-  RemoveWifiNetwork();
-
-  // Requesting enrollment when there is no default network at all should not
-  // trigger an enrollment request to be sent.
-  fake_network_unaware_scheduler()->RequestEnrollmentNow();
-  EXPECT_EQ(1u, delegate_policy_references().size());
-}
-
-TEST_F(DeviceSyncNetworkAwareEnrollmentSchedulerTest,
-       RequestReceivedWhenNoNetworksExist) {
-  fake_network_unaware_scheduler()->RequestEnrollmentNow();
-  EXPECT_TRUE(delegate_policy_references().empty());
-
-  // Add a network and connect it; this should cause the pending request to be
-  // forwarded.
-  AddDisconnectedWifiNetwork();
-  SetWifiNetworkStatus(NetworkConnectionStatus::kConnected);
-  EXPECT_EQ(1u, delegate_policy_references().size());
-}
-
-}  // namespace device_sync
-
-}  // namespace chromeos
diff --git a/chromeos/services/device_sync/persistent_enrollment_scheduler.cc b/chromeos/services/device_sync/persistent_enrollment_scheduler.cc
deleted file mode 100644
index 2a3692f..0000000
--- a/chromeos/services/device_sync/persistent_enrollment_scheduler.cc
+++ /dev/null
@@ -1,310 +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 "chromeos/services/device_sync/persistent_enrollment_scheduler.h"
-
-#include <algorithm>
-#include <string>
-#include <utility>
-
-#include "base/base64.h"
-#include "base/memory/ptr_util.h"
-#include "base/no_destructor.h"
-#include "base/optional.h"
-#include "chromeos/components/multidevice/logging/logging.h"
-#include "chromeos/services/device_sync/pref_names.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/pref_service.h"
-
-namespace chromeos {
-
-namespace device_sync {
-
-namespace {
-
-// The default period between successful enrollments in days. Superseded by the
-// ClientDirective's checkin_delay_millis sent by CryptAuth in SyncKeysResponse.
-constexpr base::TimeDelta kDefaultRefreshPeriod = base::TimeDelta::FromDays(30);
-
-// The default period, in hours, between enrollment attempts if the previous
-// enrollment attempt failed. Superseded by the ClientDirective's
-// retry_period_millis sent by CryptAuth in SyncKeysResponse.
-constexpr base::TimeDelta kDefaultRetryPeriod = base::TimeDelta::FromHours(12);
-
-// The time to wait before an "immediate" retry attempt after a failed
-// enrollment attempt. Note: SyncKeys requests are throttled by CryptAuth if
-// more than one is sent within a five-minute window.
-constexpr base::TimeDelta kImmediateRetryDelay =
-    base::TimeDelta::FromMinutes(5);
-
-// The default number of "immediate" retries after a failed enrollment attempt.
-// Superseded by the ClientDirective's retry_attempts sent by CryptAuth in the
-// SyncKeysResponse.
-const int kDefaultMaxImmediateRetries = 3;
-
-bool IsClientDirectiveValid(
-    const cryptauthv2::ClientDirective& client_directive) {
-  return client_directive.checkin_delay_millis() > 0 &&
-         client_directive.retry_period_millis() > 0 &&
-         client_directive.retry_attempts() >= 0;
-}
-
-// Fills a ClientDirective with our chosen default parameters. This
-// ClientDirective is used until a ClientDirective is received from CryptAuth in
-// the SyncKeysResponse.
-cryptauthv2::ClientDirective CreateDefaultClientDirective() {
-  cryptauthv2::ClientDirective client_directive;
-  client_directive.set_checkin_delay_millis(
-      kDefaultRefreshPeriod.InMilliseconds());
-  client_directive.set_retry_period_millis(
-      kDefaultRetryPeriod.InMilliseconds());
-  client_directive.set_retry_attempts(kDefaultMaxImmediateRetries);
-
-  return client_directive;
-}
-
-// Decodes and parses the base64-encoded serialized ClientDirective string.
-base::Optional<cryptauthv2::ClientDirective> ClientDirectiveFromPrefString(
-    const std::string& encoded_serialized_client_directive) {
-  if (encoded_serialized_client_directive.empty())
-    return base::nullopt;
-
-  std::string decoded_serialized_client_directive;
-  if (!base::Base64Decode(encoded_serialized_client_directive,
-                          &decoded_serialized_client_directive)) {
-    PA_LOG(ERROR) << "Error decoding ClientDirective pref string";
-    return base::nullopt;
-  }
-
-  cryptauthv2::ClientDirective client_directive;
-  if (!client_directive.ParseFromString(decoded_serialized_client_directive)) {
-    PA_LOG(ERROR) << "Error parsing ClientDirective from pref string";
-    return base::nullopt;
-  }
-
-  return client_directive;
-}
-
-// Serializes and base64 encodes the input ClientDirective.
-std::string ClientDirectiveToPrefString(
-    const cryptauthv2::ClientDirective& client_directive) {
-  std::string encoded_serialized_client_directive;
-  base::Base64Encode(client_directive.SerializeAsString(),
-                     &encoded_serialized_client_directive);
-
-  return encoded_serialized_client_directive;
-}
-
-cryptauthv2::ClientDirective BuildClientDirective(PrefService* pref_service) {
-  DCHECK(pref_service);
-
-  base::Optional<cryptauthv2::ClientDirective> client_directive_from_pref =
-      ClientDirectiveFromPrefString(pref_service->GetString(
-          prefs::kCryptAuthEnrollmentSchedulerClientDirective));
-  if (client_directive_from_pref)
-    return *client_directive_from_pref;
-
-  return CreateDefaultClientDirective();
-}
-
-}  // namespace
-
-// static
-PersistentEnrollmentScheduler::Factory*
-    PersistentEnrollmentScheduler::Factory::test_factory_ = nullptr;
-
-// static
-PersistentEnrollmentScheduler::Factory*
-PersistentEnrollmentScheduler::Factory::Get() {
-  if (test_factory_)
-    return test_factory_;
-
-  static base::NoDestructor<PersistentEnrollmentScheduler::Factory> factory;
-  return factory.get();
-}
-
-// static
-void PersistentEnrollmentScheduler::Factory::SetFactoryForTesting(
-    Factory* test_factory) {
-  test_factory_ = test_factory;
-}
-
-PersistentEnrollmentScheduler::Factory::~Factory() = default;
-
-std::unique_ptr<CryptAuthEnrollmentScheduler>
-PersistentEnrollmentScheduler::Factory::BuildInstance(
-    Delegate* delegate,
-    PrefService* pref_service,
-    base::Clock* clock,
-    std::unique_ptr<base::OneShotTimer> timer,
-    scoped_refptr<base::TaskRunner> task_runner) {
-  return base::WrapUnique(new PersistentEnrollmentScheduler(
-      delegate, pref_service, clock, std::move(timer), task_runner));
-}
-
-// static
-void PersistentEnrollmentScheduler::RegisterPrefs(
-    PrefRegistrySimple* registry) {
-  registry->RegisterStringPref(
-      prefs::kCryptAuthEnrollmentSchedulerClientDirective, std::string());
-  registry->RegisterTimePref(
-      prefs::kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime,
-      base::Time());
-  registry->RegisterTimePref(
-      prefs::kCryptAuthEnrollmentSchedulerLastSuccessfulEnrollmentTime,
-      base::Time());
-  registry->RegisterUint64Pref(
-      prefs::kCryptAuthEnrollmentSchedulerNumConsecutiveFailures, 0);
-}
-
-PersistentEnrollmentScheduler::PersistentEnrollmentScheduler(
-    Delegate* delegate,
-    PrefService* pref_service,
-    base::Clock* clock,
-    std::unique_ptr<base::OneShotTimer> timer,
-    scoped_refptr<base::TaskRunner> task_runner)
-    : CryptAuthEnrollmentScheduler(delegate),
-      pref_service_(pref_service),
-      clock_(clock),
-      timer_(std::move(timer)),
-      client_directive_(BuildClientDirective(pref_service)),
-      weak_ptr_factory_(this) {
-  DCHECK(pref_service);
-  DCHECK(clock);
-  DCHECK(IsClientDirectiveValid(client_directive_));
-
-  // If we are recovering from a failure, set the failure count back to 1 in the
-  // hopes that the restart solved the issue. This will allow for immediate
-  // retries again if allowed by the ClientDirective.
-  if (GetNumConsecutiveFailures() > 1) {
-    pref_service_->SetUint64(
-        prefs::kCryptAuthEnrollmentSchedulerNumConsecutiveFailures, 1);
-  }
-
-  // Schedule the next enrollment as part of a new task. This ensures that the
-  // delegate can complete its initialization before handling an enrollment
-  // request.
-  task_runner->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PersistentEnrollmentScheduler::ScheduleNextEnrollment,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
-PersistentEnrollmentScheduler::~PersistentEnrollmentScheduler() = default;
-
-void PersistentEnrollmentScheduler::RequestEnrollmentNow() {
-  timer_->Stop();
-  NotifyEnrollmentRequested(GetPolicyReference());
-}
-
-void PersistentEnrollmentScheduler::HandleEnrollmentResult(
-    const CryptAuthEnrollmentResult& enrollment_result) {
-  DCHECK(!timer_->IsRunning());
-
-  base::Time now = clock_->Now();
-
-  if (enrollment_result.IsSuccess()) {
-    pref_service_->SetUint64(
-        prefs::kCryptAuthEnrollmentSchedulerNumConsecutiveFailures, 0);
-
-    pref_service_->SetTime(
-        prefs::kCryptAuthEnrollmentSchedulerLastSuccessfulEnrollmentTime, now);
-  } else {
-    pref_service_->SetUint64(
-        prefs::kCryptAuthEnrollmentSchedulerNumConsecutiveFailures,
-        GetNumConsecutiveFailures() + 1);
-  }
-
-  pref_service_->SetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime, now);
-
-  if (enrollment_result.client_directive() &&
-      IsClientDirectiveValid(*enrollment_result.client_directive())) {
-    client_directive_ = *enrollment_result.client_directive();
-
-    pref_service_->SetString(
-        prefs::kCryptAuthEnrollmentSchedulerClientDirective,
-        ClientDirectiveToPrefString(client_directive_));
-  }
-
-  ScheduleNextEnrollment();
-}
-
-base::Optional<base::Time>
-PersistentEnrollmentScheduler::GetLastSuccessfulEnrollmentTime() const {
-  base::Time time = pref_service_->GetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastSuccessfulEnrollmentTime);
-  if (time.is_null())
-    return base::nullopt;
-
-  return time;
-}
-
-base::TimeDelta PersistentEnrollmentScheduler::GetRefreshPeriod() const {
-  return base::TimeDelta::FromMilliseconds(
-      client_directive_.checkin_delay_millis());
-}
-
-base::TimeDelta PersistentEnrollmentScheduler::GetTimeToNextEnrollmentRequest()
-    const {
-  if (IsWaitingForEnrollmentResult())
-    return base::TimeDelta::FromMilliseconds(0);
-
-  return timer_->GetCurrentDelay();
-}
-
-bool PersistentEnrollmentScheduler::IsWaitingForEnrollmentResult() const {
-  return !timer_->IsRunning();
-}
-
-size_t PersistentEnrollmentScheduler::GetNumConsecutiveFailures() const {
-  return pref_service_->GetUint64(
-      prefs::kCryptAuthEnrollmentSchedulerNumConsecutiveFailures);
-}
-
-base::TimeDelta
-PersistentEnrollmentScheduler::CalculateTimeBetweenEnrollmentRequests() const {
-  size_t num_consecutive_failures = GetNumConsecutiveFailures();
-  if (num_consecutive_failures == 0)
-    return GetRefreshPeriod();
-
-  if (num_consecutive_failures <= (size_t)client_directive_.retry_attempts())
-    return kImmediateRetryDelay;
-
-  return base::TimeDelta::FromMilliseconds(
-      client_directive_.retry_period_millis());
-}
-
-void PersistentEnrollmentScheduler::ScheduleNextEnrollment() {
-  DCHECK(!timer_->IsRunning());
-
-  base::Time last_attempt_time = pref_service_->GetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime);
-
-  base::TimeDelta time_until_next_request =
-      base::TimeDelta::FromMilliseconds(0);
-  if (!last_attempt_time.is_null()) {
-    time_until_next_request =
-        std::max(base::TimeDelta::FromMilliseconds(0),
-                 CalculateTimeBetweenEnrollmentRequests() -
-                     (clock_->Now() - last_attempt_time));
-  }
-
-  timer_->Start(
-      FROM_HERE, time_until_next_request,
-      base::BindOnce(&PersistentEnrollmentScheduler::NotifyEnrollmentRequested,
-                     base::Unretained(this), GetPolicyReference()));
-}
-
-base::Optional<cryptauthv2::PolicyReference>
-PersistentEnrollmentScheduler::GetPolicyReference() const {
-  if (client_directive_.has_policy_reference())
-    return client_directive_.policy_reference();
-
-  return base::nullopt;
-}
-
-}  // namespace device_sync
-
-}  // namespace chromeos
diff --git a/chromeos/services/device_sync/persistent_enrollment_scheduler.h b/chromeos/services/device_sync/persistent_enrollment_scheduler.h
deleted file mode 100644
index 61e15f02..0000000
--- a/chromeos/services/device_sync/persistent_enrollment_scheduler.h
+++ /dev/null
@@ -1,99 +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 CHROMEOS_SERVICES_DEVICE_SYNC_PERSISTENT_ENROLLMENT_SCHEDULER_H_
-#define CHROMEOS_SERVICES_DEVICE_SYNC_PERSISTENT_ENROLLMENT_SCHEDULER_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/default_clock.h"
-#include "base/timer/timer.h"
-#include "chromeos/services/device_sync/cryptauth_enrollment_scheduler.h"
-#include "chromeos/services/device_sync/proto/cryptauth_directive.pb.h"
-
-class PrefRegistrySimple;
-class PrefService;
-
-namespace chromeos {
-
-namespace device_sync {
-
-// CryptAuthEnrollmentScheduler implementation which stores scheduling metadata
-// persistently so that the enrollment schedule is saved across device reboots.
-// If this class is instantiated before at least one enrollment has been
-// completed successfully, it requests enrollment immediately. Once enrollment
-// has been completed successfully, this class schedules the next enrollment
-// attempt at a time provided by the server via a ClientDirective proto.
-class PersistentEnrollmentScheduler : public CryptAuthEnrollmentScheduler {
- public:
-  class Factory {
-   public:
-    static Factory* Get();
-    static void SetFactoryForTesting(Factory* test_factory);
-    virtual ~Factory();
-    virtual std::unique_ptr<CryptAuthEnrollmentScheduler> BuildInstance(
-        Delegate* delegate,
-        PrefService* pref_service,
-        base::Clock* clock = base::DefaultClock::GetInstance(),
-        std::unique_ptr<base::OneShotTimer> timer =
-            std::make_unique<base::OneShotTimer>(),
-        scoped_refptr<base::TaskRunner> task_runner =
-            base::ThreadTaskRunnerHandle::Get());
-
-   private:
-    static Factory* test_factory_;
-  };
-
-  // Registers the prefs used by this class to the given |registry|.
-  static void RegisterPrefs(PrefRegistrySimple* registry);
-
-  ~PersistentEnrollmentScheduler() override;
-
- private:
-  PersistentEnrollmentScheduler(Delegate* delegate,
-                                PrefService* pref_service,
-                                base::Clock* clock,
-                                std::unique_ptr<base::OneShotTimer> timer,
-                                scoped_refptr<base::TaskRunner> task_runner);
-
-  // CryptAuthEnrollmentScheduler:
-  void RequestEnrollmentNow() override;
-  void HandleEnrollmentResult(
-      const CryptAuthEnrollmentResult& enrollment_result) override;
-  base::Optional<base::Time> GetLastSuccessfulEnrollmentTime() const override;
-  base::TimeDelta GetRefreshPeriod() const override;
-  base::TimeDelta GetTimeToNextEnrollmentRequest() const override;
-  bool IsWaitingForEnrollmentResult() const override;
-  size_t GetNumConsecutiveFailures() const override;
-
-  // Calculates the time period between the previous enrollment attempt and the
-  // next enrollment attempt, taking failures into consideration.
-  base::TimeDelta CalculateTimeBetweenEnrollmentRequests() const;
-
-  // Starts a new timer that will fire when an enrollment is ready to be
-  // attempted.
-  void ScheduleNextEnrollment();
-
-  // Get the ClientDirective's PolicyReference. If one has not been set, returns
-  // base::nullopt.
-  base::Optional<cryptauthv2::PolicyReference> GetPolicyReference() const;
-
-  PrefService* pref_service_;
-  base::Clock* clock_;
-  std::unique_ptr<base::OneShotTimer> timer_;
-  cryptauthv2::ClientDirective client_directive_;
-  base::WeakPtrFactory<PersistentEnrollmentScheduler> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PersistentEnrollmentScheduler);
-};
-
-}  // namespace device_sync
-
-}  // namespace chromeos
-
-#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_PERSISTENT_ENROLLMENT_SCHEDULER_H_
diff --git a/chromeos/services/device_sync/persistent_enrollment_scheduler_unittest.cc b/chromeos/services/device_sync/persistent_enrollment_scheduler_unittest.cc
deleted file mode 100644
index fb989d8..0000000
--- a/chromeos/services/device_sync/persistent_enrollment_scheduler_unittest.cc
+++ /dev/null
@@ -1,356 +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 "chromeos/services/device_sync/persistent_enrollment_scheduler.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/base64.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/test/simple_test_clock.h"
-#include "base/test/test_simple_task_runner.h"
-#include "base/timer/mock_timer.h"
-#include "chromeos/services/device_sync/fake_cryptauth_enrollment_scheduler.h"
-#include "chromeos/services/device_sync/pref_names.h"
-#include "components/prefs/testing_pref_service.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace chromeos {
-
-namespace device_sync {
-
-namespace {
-
-const char kFakePolicyName[] = "fake-policy-name";
-int kFakePolicyVersion = 100;
-constexpr base::TimeDelta kFakeRefreshPeriod = base::TimeDelta::FromDays(100);
-constexpr base::TimeDelta kFakeRetryPeriod = base::TimeDelta::FromHours(100);
-constexpr base::TimeDelta kFakeImmediateRetryDelay =
-    base::TimeDelta::FromMinutes(5);
-const int kFakeMaxImmediateRetries = 2;
-
-// The time set on the scheduler's clock during set-up.
-const base::Time kFakeTimeNow = base::Time::FromDoubleT(1600600000);
-const base::Time kFakeTimeLaterBeforeRetryPeriod =
-    kFakeTimeNow + kFakeRetryPeriod - base::TimeDelta::FromHours(1);
-const base::Time kFakeTimeLaterAfterRetryPeriod =
-    kFakeTimeNow + kFakeRefreshPeriod + base::TimeDelta::FromHours(1);
-const base::Time kFakeTimeLaterAfterRefreshPeriod =
-    kFakeTimeNow + kFakeRefreshPeriod + base::TimeDelta::FromDays(1);
-
-// Serializes and base64 encodes the input ClientDirective.
-// Copied from cryptauth_enrollment_scheduler_impl.cc.
-std::string ClientDirectiveToPrefString(
-    const cryptauthv2::ClientDirective& client_directive) {
-  std::string encoded_serialized_client_directive;
-  base::Base64Encode(client_directive.SerializeAsString(),
-                     &encoded_serialized_client_directive);
-
-  return encoded_serialized_client_directive;
-}
-
-}  // namespace
-
-class DeviceSyncPersistentEnrollmentSchedulerTest : public testing::Test {
- protected:
-  DeviceSyncPersistentEnrollmentSchedulerTest() {
-    fake_client_directive_.mutable_policy_reference()->set_name(
-        kFakePolicyName);
-    fake_client_directive_.mutable_policy_reference()->set_version(
-        kFakePolicyVersion);
-    fake_client_directive_.set_checkin_delay_millis(
-        kFakeRefreshPeriod.InMilliseconds());
-    fake_client_directive_.set_retry_period_millis(
-        kFakeRetryPeriod.InMilliseconds());
-    fake_client_directive_.set_retry_attempts(kFakeMaxImmediateRetries);
-  }
-
-  ~DeviceSyncPersistentEnrollmentSchedulerTest() override = default;
-
-  void SetUp() override {
-    PersistentEnrollmentScheduler::RegisterPrefs(pref_service_.registry());
-  }
-
-  void CreateScheduler() {
-    if (scheduler_)
-      return;
-
-    auto mock_timer = std::make_unique<base::MockOneShotTimer>();
-    mock_timer_ = mock_timer.get();
-
-    auto test_task_runner = base::MakeRefCounted<base::TestSimpleTaskRunner>();
-
-    scheduler_ = PersistentEnrollmentScheduler::Factory::Get()->BuildInstance(
-        &fake_delegate_, &pref_service_, &test_clock_, std::move(mock_timer),
-        test_task_runner);
-
-    test_task_runner->RunUntilIdle();
-  }
-
-  void VerifyReceivedPolicyReference(
-      size_t num_expected_received_policy_references,
-      const base::Optional<cryptauthv2::PolicyReference>&
-          last_expected_received_policy_reference) {
-    EXPECT_EQ(
-        num_expected_received_policy_references,
-        fake_delegate_.policy_references_from_enrollment_requests().size());
-
-    if (fake_delegate_.policy_references_from_enrollment_requests().empty())
-      return;
-
-    EXPECT_EQ(last_expected_received_policy_reference.has_value(),
-              fake_delegate_.policy_references_from_enrollment_requests()
-                  .back()
-                  .has_value());
-
-    if (fake_delegate_.policy_references_from_enrollment_requests()
-            .back()
-            .has_value() &&
-        last_expected_received_policy_reference.has_value()) {
-      EXPECT_EQ(last_expected_received_policy_reference->SerializeAsString(),
-                fake_delegate_.policy_references_from_enrollment_requests()
-                    .back()
-                    ->SerializeAsString());
-    }
-  }
-
-  void VerifyLastEnrollmentAttemptTimePref(const base::Time& expected_time) {
-    EXPECT_EQ(
-        pref_service_.GetTime(
-            prefs::kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime),
-        expected_time);
-  }
-
-  FakeCryptAuthEnrollmentSchedulerDelegate* delegate() {
-    return &fake_delegate_;
-  }
-
-  PrefService* pref_service() { return &pref_service_; }
-
-  base::SimpleTestClock* clock() { return &test_clock_; }
-
-  base::MockOneShotTimer* timer() { return mock_timer_; }
-
-  CryptAuthEnrollmentScheduler* scheduler() { return scheduler_.get(); }
-
-  const cryptauthv2::ClientDirective& fake_client_directive() {
-    return fake_client_directive_;
-  }
-
- private:
-  FakeCryptAuthEnrollmentSchedulerDelegate fake_delegate_;
-  TestingPrefServiceSimple pref_service_;
-  base::SimpleTestClock test_clock_;
-  base::MockOneShotTimer* mock_timer_;
-
-  cryptauthv2::ClientDirective fake_client_directive_;
-
-  std::unique_ptr<CryptAuthEnrollmentScheduler> scheduler_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeviceSyncPersistentEnrollmentSchedulerTest);
-};
-
-TEST_F(DeviceSyncPersistentEnrollmentSchedulerTest,
-       HandleSuccessfulEnrollmentResult) {
-  clock()->SetNow(kFakeTimeNow);
-  CreateScheduler();
-
-  EXPECT_TRUE(timer()->IsRunning());
-  EXPECT_FALSE(scheduler()->GetLastSuccessfulEnrollmentTime());
-  EXPECT_TRUE(scheduler()->GetRefreshPeriod() >
-              base::TimeDelta::FromMilliseconds(0));
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(0),
-            scheduler()->GetTimeToNextEnrollmentRequest());
-  EXPECT_FALSE(scheduler()->IsWaitingForEnrollmentResult());
-  EXPECT_EQ(0u, scheduler()->GetNumConsecutiveFailures());
-
-  timer()->Fire();
-
-  EXPECT_TRUE(scheduler()->IsWaitingForEnrollmentResult());
-  VerifyReceivedPolicyReference(1, base::nullopt);
-
-  CryptAuthEnrollmentResult result(
-      CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
-      fake_client_directive());
-  scheduler()->HandleEnrollmentResult(result);
-
-  EXPECT_TRUE(timer()->IsRunning());
-  ASSERT_TRUE(scheduler()->GetLastSuccessfulEnrollmentTime());
-  EXPECT_EQ(kFakeTimeNow, scheduler()->GetLastSuccessfulEnrollmentTime());
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(
-                fake_client_directive().checkin_delay_millis()),
-            scheduler()->GetRefreshPeriod());
-  EXPECT_EQ(scheduler()->GetRefreshPeriod(),
-            scheduler()->GetTimeToNextEnrollmentRequest());
-  EXPECT_FALSE(scheduler()->IsWaitingForEnrollmentResult());
-  EXPECT_EQ(0u, scheduler()->GetNumConsecutiveFailures());
-  VerifyLastEnrollmentAttemptTimePref(kFakeTimeNow);
-
-  timer()->Fire();
-
-  VerifyReceivedPolicyReference(2, fake_client_directive().policy_reference());
-}
-
-TEST_F(DeviceSyncPersistentEnrollmentSchedulerTest,
-       NotDueForRefresh_RequestImmediateEnrollment) {
-  pref_service()->SetString(
-      prefs::kCryptAuthEnrollmentSchedulerClientDirective,
-      ClientDirectiveToPrefString(fake_client_directive()));
-  pref_service()->SetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime,
-      kFakeTimeNow);
-  pref_service()->SetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastSuccessfulEnrollmentTime,
-      kFakeTimeNow);
-  pref_service()->SetUint64(
-      prefs::kCryptAuthEnrollmentSchedulerNumConsecutiveFailures, 0);
-
-  clock()->SetNow(kFakeTimeLaterBeforeRetryPeriod);
-  base::TimeDelta fake_elapsed_time =
-      kFakeTimeLaterBeforeRetryPeriod - kFakeTimeNow;
-
-  CreateScheduler();
-
-  ASSERT_TRUE(scheduler()->GetLastSuccessfulEnrollmentTime());
-  EXPECT_EQ(kFakeTimeNow, scheduler()->GetLastSuccessfulEnrollmentTime());
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(
-                fake_client_directive().checkin_delay_millis()),
-            scheduler()->GetRefreshPeriod());
-  EXPECT_EQ(scheduler()->GetRefreshPeriod() - fake_elapsed_time,
-            scheduler()->GetTimeToNextEnrollmentRequest());
-  EXPECT_FALSE(scheduler()->IsWaitingForEnrollmentResult());
-
-  scheduler()->RequestEnrollmentNow();
-  EXPECT_TRUE(scheduler()->IsWaitingForEnrollmentResult());
-  EXPECT_EQ(1u,
-            delegate()->policy_references_from_enrollment_requests().size());
-}
-
-TEST_F(DeviceSyncPersistentEnrollmentSchedulerTest,
-       DueForRefreshBeforeConstructed) {
-  pref_service()->SetString(
-      prefs::kCryptAuthEnrollmentSchedulerClientDirective,
-      ClientDirectiveToPrefString(fake_client_directive()));
-  pref_service()->SetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime,
-      kFakeTimeNow);
-  pref_service()->SetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastSuccessfulEnrollmentTime,
-      kFakeTimeNow);
-  pref_service()->SetUint64(
-      prefs::kCryptAuthEnrollmentSchedulerNumConsecutiveFailures, 0);
-
-  clock()->SetNow(kFakeTimeLaterAfterRefreshPeriod);
-
-  CreateScheduler();
-
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(0),
-            scheduler()->GetTimeToNextEnrollmentRequest());
-}
-
-TEST_F(DeviceSyncPersistentEnrollmentSchedulerTest, HandleFailures) {
-  clock()->SetNow(kFakeTimeNow);
-  CreateScheduler();
-
-  // Expect all failed attempts to be retried immediately until the retry
-  // attempt limit from the ClientDirective is exceeded.
-  size_t expected_failure_count = 0;
-  while (expected_failure_count <
-         static_cast<size_t>(fake_client_directive().retry_attempts())) {
-    timer()->Fire();
-    CryptAuthEnrollmentResult result(
-        CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
-        fake_client_directive());
-    scheduler()->HandleEnrollmentResult(result);
-    ++expected_failure_count;
-
-    EXPECT_EQ(expected_failure_count, scheduler()->GetNumConsecutiveFailures());
-    ASSERT_FALSE(scheduler()->GetLastSuccessfulEnrollmentTime());
-    EXPECT_EQ(base::TimeDelta::FromMilliseconds(
-                  fake_client_directive().checkin_delay_millis()),
-              scheduler()->GetRefreshPeriod());
-    EXPECT_EQ(kFakeImmediateRetryDelay,
-              scheduler()->GetTimeToNextEnrollmentRequest());
-    VerifyLastEnrollmentAttemptTimePref(kFakeTimeNow);
-  }
-
-  // Since all immediate retry attempts were expended above, expect a failed
-  // attempt to be retried after the ClientDirective's retry period.
-  timer()->Fire();
-  CryptAuthEnrollmentResult result(
-      CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
-      fake_client_directive());
-  scheduler()->HandleEnrollmentResult(result);
-
-  EXPECT_EQ(static_cast<size_t>(fake_client_directive().retry_attempts() + 1),
-            scheduler()->GetNumConsecutiveFailures());
-  EXPECT_TRUE(timer()->IsRunning());
-  ASSERT_FALSE(scheduler()->GetLastSuccessfulEnrollmentTime());
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(
-                fake_client_directive().checkin_delay_millis()),
-            scheduler()->GetRefreshPeriod());
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(
-                fake_client_directive().retry_period_millis()),
-            scheduler()->GetTimeToNextEnrollmentRequest());
-  VerifyLastEnrollmentAttemptTimePref(kFakeTimeNow);
-
-  clock()->SetNow(kFakeTimeLaterAfterRetryPeriod);
-
-  // Expect a successful attempt to reset the failure count and adjust the
-  // enrollment schedule to use the refresh period specified in the
-  // ClientDirective.
-  timer()->Fire();
-  CryptAuthEnrollmentResult success_result(
-      CryptAuthEnrollmentResult::ResultCode::kSuccessNoNewKeysNeeded,
-      fake_client_directive());
-  scheduler()->HandleEnrollmentResult(success_result);
-
-  EXPECT_EQ(0u, scheduler()->GetNumConsecutiveFailures());
-  EXPECT_TRUE(timer()->IsRunning());
-  ASSERT_TRUE(scheduler()->GetLastSuccessfulEnrollmentTime());
-  EXPECT_EQ(kFakeTimeLaterAfterRetryPeriod,
-            scheduler()->GetLastSuccessfulEnrollmentTime());
-  EXPECT_EQ(base::TimeDelta::FromMilliseconds(
-                fake_client_directive().checkin_delay_millis()),
-            scheduler()->GetRefreshPeriod());
-  EXPECT_EQ(scheduler()->GetRefreshPeriod(),
-            scheduler()->GetTimeToNextEnrollmentRequest());
-  VerifyLastEnrollmentAttemptTimePref(kFakeTimeLaterAfterRetryPeriod);
-}
-
-TEST_F(DeviceSyncPersistentEnrollmentSchedulerTest, HandlePersistedFailures) {
-  // Seed the preferences to simulate the previous scheduler using all of its
-  // immediate retry attempts and making 10 periodic retry attempts.
-  pref_service()->SetString(
-      prefs::kCryptAuthEnrollmentSchedulerClientDirective,
-      ClientDirectiveToPrefString(fake_client_directive()));
-  pref_service()->SetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastSuccessfulEnrollmentTime,
-      kFakeTimeNow);
-  pref_service()->SetTime(
-      prefs::kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime,
-      kFakeTimeLaterBeforeRetryPeriod);
-  pref_service()->SetUint64(
-      prefs::kCryptAuthEnrollmentSchedulerNumConsecutiveFailures,
-      fake_client_directive().retry_attempts() + 10);
-
-  clock()->SetNow(kFakeTimeLaterBeforeRetryPeriod);
-
-  // On construction, if the persisted failure count is greater than 0, expect
-  // that the scheduler resets the failure count to 1.
-  CreateScheduler();
-
-  EXPECT_EQ(1u, scheduler()->GetNumConsecutiveFailures());
-  EXPECT_EQ(kFakeImmediateRetryDelay,
-            scheduler()->GetTimeToNextEnrollmentRequest());
-  VerifyLastEnrollmentAttemptTimePref(kFakeTimeLaterBeforeRetryPeriod);
-}
-
-}  // namespace device_sync
-
-}  // namespace chromeos
diff --git a/chromeos/services/device_sync/pref_names.cc b/chromeos/services/device_sync/pref_names.cc
index d149af01..f2a5a57 100644
--- a/chromeos/services/device_sync/pref_names.cc
+++ b/chromeos/services/device_sync/pref_names.cc
@@ -10,84 +10,77 @@
 
 namespace prefs {
 
-// Whether the system is scheduling device_syncs more aggressively to recover
-// from the previous device_sync failure.
+// (CryptAuth v1) Whether the system is scheduling device_syncs more
+// aggressively to recover from the previous device_sync failure.
 const char kCryptAuthDeviceSyncIsRecoveringFromFailure[] =
     "cryptauth.device_sync.is_recovering_from_failure";
 
-// The timestamp of the last successful CryptAuth device_sync in seconds.
+// (CryptAuth v1) The timestamp of the last successful CryptAuth device_sync in
+// seconds.
 const char kCryptAuthDeviceSyncLastSyncTimeSeconds[] =
     "cryptauth.device_sync.last_device_sync_time_seconds";
 
-// The reason that the next device_sync is performed. This should be one of the
-// enum values of cryptauth::InvocationReason in
+// (CryptAuth v1) The reason that the next device_sync is performed. This should
+// be one of the enum values of cryptauth::InvocationReason in
 // chromeos/services/device_sync/proto/cryptauth_api.proto.
 const char kCryptAuthDeviceSyncReason[] = "cryptauth.device_sync.reason";
 
-// A list of unlock keys (stored as dictionaries) synced from CryptAuth. Unlock
-// Keys are phones belonging to the user that can unlock other devices, such as
-// desktop PCs.
+// (CryptAuth v1) A list of unlock keys (stored as dictionaries) synced from
+// CryptAuth. Unlock Keys are phones belonging to the user that can unlock other
+// devices, such as desktop PCs.
 const char kCryptAuthDeviceSyncUnlockKeys[] =
     "cryptauth.device_sync.unlock_keys";
 
-// The CryptAuth v2 Enrollment invocation reason to use when retrying a failed
-// enrollment attempt. This should be one of the enum values of
-// cryptauth2::ClientMetadata::InvocationReason in
-// chromeos/services/device_sync/proto/cryptauth_common.proto.
-const char kCryptAuthEnrollmentFailureRecoveryInvocationReason[] =
-    "cryptauth.enrollment.failure_recovery_invocation_reason";
-
-// The session ID, sent via a GCM message, to use when retrying a failed
-// enrollment attempt.
-const char kCryptAuthEnrollmentFailureRecoverySessionId[] =
-    "cryptauth.enrollment.failure_recovery_session_id";
-
-// Whether the system is scheduling enrollments more aggressively to recover
-// from the previous enrollment failure.
+// (CryptAuth v1) Whether the system is scheduling enrollments more aggressively
+// to recover from the previous enrollment failure.
 const char kCryptAuthEnrollmentIsRecoveringFromFailure[] =
     "cryptauth.enrollment.is_recovering_from_failure";
 
-// The timestamp of the last successful CryptAuth enrollment in seconds.
+// (CryptAuth v1) The timestamp of the last successful CryptAuth enrollment in
+// seconds.
 const char kCryptAuthEnrollmentLastEnrollmentTimeSeconds[] =
     "cryptauth.enrollment.last_enrollment_time_seconds";
 
-// The reason that the next enrollment is performed. This should be one of the
-// enum values of cryptauth::InvocationReason in
+// (CryptAuth v1) The reason that the next enrollment is performed. This should
+// be one of the enum values of cryptauth::InvocationReason in
 // chromeos/services/device_sync/proto/cryptauth_api.proto.
 const char kCryptAuthEnrollmentReason[] = "cryptauth.enrollment.reason";
 
-// The most recent ClientDirective--serialized to a string and base64
-// encoded--sent to the CryptAuthEnrollmentScheduler.
-const char kCryptAuthEnrollmentSchedulerClientDirective[] =
-    "cryptauth.enrollment.scheduler_client_directive";
-
-// The time of the last enrollment attempt.
-const char kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime[] =
-    "cryptauth.enrollment.scheduler_last_enrollment_attempt_time";
-
-// The time of the last successful enrollment.
-const char kCryptAuthEnrollmentSchedulerLastSuccessfulEnrollmentTime[] =
-    "cryptauth.enrollment.scheduler_last_successful_enrollment_time";
-
-// The number of failed enrollments since the last successful enrollment.
-const char kCryptAuthEnrollmentSchedulerNumConsecutiveFailures[] =
-    "cryptauth.enrollment.scheduler_num_consecutive_failures";
-
-// The public key of the user and device enrolled with CryptAuth.
+// (CryptAuth v1 and during migration to v2) The public key of the user and
+// device enrolled with CryptAuth.
 const char kCryptAuthEnrollmentUserPublicKey[] =
     "cryptauth.enrollment.user_public_key";
 
-// The private key of the user and device enrolled with CryptAuth.
+// (CryptAuth v1 and during migration to v2) The private key of the user and
+// device enrolled with CryptAuth.
 const char kCryptAuthEnrollmentUserPrivateKey[] =
     "cryptauth.enrollment.user_private_key";
 
-// The GCM registration id used for receiving push messages from CryptAuth.
+// (CryptAuth v1 and v2) The GCM registration id used for receiving push
+// messages from CryptAuth.
 const char kCryptAuthGCMRegistrationId[] = "cryptauth.gcm_registration_id";
 
-// The dictionary of key bundles enrolled with CryptAuth, used to populate and
-// persist the CryptAuthKeyRegistry.
+// (CryptAuth v2) The dictionary of key bundles enrolled with CryptAuth, used to
+// populate and persist the CryptAuthKeyRegistry.
 const char kCryptAuthKeyRegistry[] = "cryptauth.key_registry";
 
+// (CryptAuth v2) The most recent ClientDirective--serialized to a string and
+// base64 encoded--sent to the CryptAuthScheduler.
+const char kCryptAuthSchedulerClientDirective[] =
+    "cryptauth.scheduler.client_directive";
+
+// (CryptAuth v2) The ClientMetadata of the last scheduled enrollment request.
+const char kCryptAuthSchedulerNextEnrollmentRequestClientMetadata[] =
+    "cryptauth.scheduler.next_enrollment_request_client_metadata";
+
+// (CryptAuth v2) The time of the last enrollment attempt.
+const char kCryptAuthSchedulerLastEnrollmentAttemptTime[] =
+    "cryptauth.scheduler.last_enrollment_attempt_time";
+
+// (CryptAuth v2) The time of the last successful enrollment.
+const char kCryptAuthSchedulerLastSuccessfulEnrollmentTime[] =
+    "cryptauth.scheduler.last_successful_enrollment_time";
+
 }  // namespace prefs
 
 }  // namespace device_sync
diff --git a/chromeos/services/device_sync/pref_names.h b/chromeos/services/device_sync/pref_names.h
index 2043848..40d12d5 100644
--- a/chromeos/services/device_sync/pref_names.h
+++ b/chromeos/services/device_sync/pref_names.h
@@ -11,23 +11,28 @@
 
 namespace prefs {
 
+// Prefs for CryptAuth v1:
 extern const char kCryptAuthDeviceSyncLastSyncTimeSeconds[];
 extern const char kCryptAuthDeviceSyncIsRecoveringFromFailure[];
 extern const char kCryptAuthDeviceSyncReason[];
 extern const char kCryptAuthDeviceSyncUnlockKeys[];
-extern const char kCryptAuthEnrollmentFailureRecoveryInvocationReason[];
-extern const char kCryptAuthEnrollmentFailureRecoverySessionId[];
 extern const char kCryptAuthEnrollmentIsRecoveringFromFailure[];
 extern const char kCryptAuthEnrollmentLastEnrollmentTimeSeconds[];
 extern const char kCryptAuthEnrollmentReason[];
-extern const char kCryptAuthEnrollmentSchedulerClientDirective[];
-extern const char kCryptAuthEnrollmentSchedulerLastEnrollmentAttemptTime[];
-extern const char kCryptAuthEnrollmentSchedulerLastSuccessfulEnrollmentTime[];
-extern const char kCryptAuthEnrollmentSchedulerNumConsecutiveFailures[];
+
+// Prefs for CryptAuth v1 (and during migration to v2):
 extern const char kCryptAuthEnrollmentUserPublicKey[];
 extern const char kCryptAuthEnrollmentUserPrivateKey[];
+
+// Prefs for CryptAuth v1 and v2:
 extern const char kCryptAuthGCMRegistrationId[];
+
+// Prefs for CryptAuth v2:
 extern const char kCryptAuthKeyRegistry[];
+extern const char kCryptAuthSchedulerClientDirective[];
+extern const char kCryptAuthSchedulerNextEnrollmentRequestClientMetadata[];
+extern const char kCryptAuthSchedulerLastEnrollmentAttemptTime[];
+extern const char kCryptAuthSchedulerLastSuccessfulEnrollmentTime[];
 
 }  // namespace prefs
 
diff --git a/chromeos/test/data/oobe_configuration/TestSkipUpdate.json b/chromeos/test/data/oobe_configuration/TestSkipUpdate.json
index 6f0164a..ff0035e 100644
--- a/chromeos/test/data/oobe_configuration/TestSkipUpdate.json
+++ b/chromeos/test/data/oobe_configuration/TestSkipUpdate.json
@@ -5,4 +5,4 @@
   "eulaSendStatistics": true,
   "updateSkipNonCritical": true,
   "wizardAutoEnroll": true
-}
\ No newline at end of file
+}
diff --git a/components/about_ui/OWNERS b/components/about_ui/OWNERS
index 918baa1..2880d959 100644
--- a/components/about_ui/OWNERS
+++ b/components/about_ui/OWNERS
@@ -1,3 +1,5 @@
 file://ui/webui/PLATFORM_OWNERS
 
+agrieve@chromium.org
+
 # COMPONENT: UI>Browser>WebUI
diff --git a/components/about_ui/android/java/src/org/chromium/components/aboutui/CreditUtils.java b/components/about_ui/android/java/src/org/chromium/components/aboutui/CreditUtils.java
index b2be4ad..0183dd2 100644
--- a/components/about_ui/android/java/src/org/chromium/components/aboutui/CreditUtils.java
+++ b/components/about_ui/android/java/src/org/chromium/components/aboutui/CreditUtils.java
@@ -11,6 +11,6 @@
 public class CreditUtils {
     private CreditUtils() {}
 
-    /** Returns a string containing the content of about_credits.html. */
-    public static native byte[] nativeGetJavaWrapperCredits();
+    /** Writes the chrome://credits HTML to the given descriptor. */
+    public static native void nativeWriteCreditsHtml(int fd);
 }
diff --git a/components/about_ui/credit_utils.cc b/components/about_ui/credit_utils.cc
index 254fdbd..b560f30f 100644
--- a/components/about_ui/credit_utils.cc
+++ b/components/about_ui/credit_utils.cc
@@ -12,7 +12,7 @@
 #include "ui/base/resource/resource_bundle.h"
 
 #if defined(OS_ANDROID)
-#include "base/android/jni_array.h"
+#include "base/files/file.h"
 #include "jni/CreditUtils_jni.h"
 #endif
 
@@ -52,13 +52,10 @@
 }
 
 #if defined(OS_ANDROID)
-static base::android::ScopedJavaLocalRef<jbyteArray>
-JNI_CreditUtils_GetJavaWrapperCredits(JNIEnv* env) {
+static void JNI_CreditUtils_WriteCreditsHtml(JNIEnv* env, jint fd) {
   std::string html_content = GetCredits(false);
-  const char* html_content_arr = html_content.c_str();
-  return base::android::ToJavaByteArray(
-      env, reinterpret_cast<const uint8_t*>(html_content_arr),
-      html_content.size());
+  base::File out_file(fd);
+  out_file.WriteAtCurrentPos(html_content.c_str(), html_content.size());
 }
 #endif
 
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn
index 5b70e1d..44f802f7 100644
--- a/components/arc/BUILD.gn
+++ b/components/arc/BUILD.gn
@@ -110,7 +110,6 @@
     "//content/public/browser:browser",
     "//content/public/common",
     "//device/bluetooth",
-    "//device/usb/public/mojom",
     "//google_apis",
     "//services/device/public/mojom",
     "//skia",
diff --git a/components/arc/common/BUILD.gn b/components/arc/common/BUILD.gn
index 22f38d20..9ae776a 100644
--- a/components/arc/common/BUILD.gn
+++ b/components/arc/common/BUILD.gn
@@ -67,8 +67,8 @@
     public_deps = [
       ":media",
       ":notifications",
-      "//device/usb/public/mojom",
       "//mojo/public/mojom/base",
+      "//services/device/public/mojom:usb",
       "//services/media_session/public/mojom",
       "//services/resource_coordinator/public/mojom",
       "//ui/accessibility/mojom",
diff --git a/components/arc/common/usb_host.mojom b/components/arc/common/usb_host.mojom
index 466864e3..ff41f57 100644
--- a/components/arc/common/usb_host.mojom
+++ b/components/arc/common/usb_host.mojom
@@ -6,7 +6,7 @@
 module arc.mojom;
 
 // re-use device.mojom.UsbDeviceInfo
-import "device/usb/public/mojom/device.mojom";
+import "services/device/public/mojom/usb_device.mojom";
 
 // Next method ID: 4
 interface UsbHostHost {
diff --git a/components/arc/usb/DEPS b/components/arc/usb/DEPS
index 272c37f0..1c98b81 100644
--- a/components/arc/usb/DEPS
+++ b/components/arc/usb/DEPS
@@ -1,6 +1,5 @@
 include_rules = [
   "+content/public/common/service_manager_connection.h",
-  "+device/usb/public",
   "+services/device/public",
   "+services/service_manager/public",
 ]
diff --git a/components/arc/usb/usb_host_bridge.h b/components/arc/usb/usb_host_bridge.h
index 5d770e6e..8c3ca2ab 100644
--- a/components/arc/usb/usb_host_bridge.h
+++ b/components/arc/usb/usb_host_bridge.h
@@ -15,10 +15,10 @@
 #include "components/arc/common/usb_host.mojom.h"
 #include "components/arc/session/connection_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
 
 namespace content {
 class BrowserContext;
diff --git a/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
index 86c20f3..b012033 100644
--- a/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
+++ b/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
@@ -411,12 +411,11 @@
   // All the callbacks thus should be called or deleted before |this| is
   // invalidated.
   ExecuteRequest(
-      {base::BindOnce(&GpuArcVideoDecodeAccelerator::DecodeRequest,
-                      base::Unretained(this),
-                      media::BitstreamBuffer(bitstream_buffer->bitstream_id,
-                                             shm_handle, false /* read_only */,
-                                             bitstream_buffer->bytes_used,
-                                             bitstream_buffer->offset)),
+      {base::BindOnce(
+           &GpuArcVideoDecodeAccelerator::DecodeRequest, base::Unretained(this),
+           media::BitstreamBuffer(
+               bitstream_buffer->bitstream_id, shm_handle, true /* read_only */,
+               bitstream_buffer->bytes_used, bitstream_buffer->offset)),
        PendingCallback()});
 }
 
diff --git a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
index ba068d3b..58f89c50 100644
--- a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
+++ b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
@@ -221,8 +221,9 @@
   base::SharedMemoryHandle shm_handle(base::FileDescriptor(fd.release(), true),
                                       0u, guid);
   use_bitstream_cbs_.emplace(bitstream_buffer_serial_, std::move(callback));
-  accelerator_->UseOutputBitstreamBuffer(media::BitstreamBuffer(
-      bitstream_buffer_serial_, shm_handle, size, offset));
+  accelerator_->UseOutputBitstreamBuffer(
+      media::BitstreamBuffer(bitstream_buffer_serial_, shm_handle,
+                             true /* read_only */, size, offset));
 
   // Mask against 30 bits to avoid (undefined) wraparound on signed integer.
   bitstream_buffer_serial_ = (bitstream_buffer_serial_ + 1) & 0x3FFFFFFF;
diff --git a/components/arc/volume_mounter/arc_volume_mounter_bridge.cc b/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
index f8a2befdf..297286cd 100644
--- a/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
+++ b/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
@@ -61,6 +61,12 @@
   return ArcVolumeMounterBridgeFactory::GetForBrowserContext(context);
 }
 
+// static
+ArcVolumeMounterBridge* ArcVolumeMounterBridge::GetForBrowserContextForTesting(
+    content::BrowserContext* context) {
+  return ArcVolumeMounterBridgeFactory::GetForBrowserContextForTesting(context);
+}
+
 ArcVolumeMounterBridge::ArcVolumeMounterBridge(content::BrowserContext* context,
                                                ArcBridgeService* bridge_service)
     : arc_bridge_service_(bridge_service),
diff --git a/components/arc/volume_mounter/arc_volume_mounter_bridge.h b/components/arc/volume_mounter/arc_volume_mounter_bridge.h
index 75d91a3c..abc8daf 100644
--- a/components/arc/volume_mounter/arc_volume_mounter_bridge.h
+++ b/components/arc/volume_mounter/arc_volume_mounter_bridge.h
@@ -36,6 +36,8 @@
   // or nullptr if the browser |context| is not allowed to use ARC.
   static ArcVolumeMounterBridge* GetForBrowserContext(
       content::BrowserContext* context);
+  static ArcVolumeMounterBridge* GetForBrowserContextForTesting(
+      content::BrowserContext* context);
 
   ArcVolumeMounterBridge(content::BrowserContext* context,
                          ArcBridgeService* bridge_service);
@@ -53,6 +55,11 @@
   // mojom::VolumeMounterHost overrides:
   void RequestAllMountPoints() override;
 
+  bool files_app_toast_shown() const { return files_app_toast_shown_; }
+  void set_files_app_toast_shown(bool files_app_toast_shown) {
+    files_app_toast_shown_ = files_app_toast_shown;
+  }
+
  private:
   void SendAllMountEvents();
 
@@ -66,6 +73,10 @@
   PrefService* const pref_service_;
   PrefChangeRegistrar change_registerar_;
 
+  // A flag to remember if the ARC toast UI in Files.app has been shown in the
+  // current user session.
+  bool files_app_toast_shown_ = false;
+
   base::WeakPtrFactory<ArcVolumeMounterBridge> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ArcVolumeMounterBridge);
diff --git a/components/autofill/core/browser/autofill_address_util.cc b/components/autofill/core/browser/autofill_address_util.cc
index 569b9cf..9908b21 100644
--- a/components/autofill/core/browser/autofill_address_util.cc
+++ b/components/autofill/core/browser/autofill_address_util.cc
@@ -26,23 +26,23 @@
 
 // Dictionary keys for address components info.
 const char kFieldTypeKey[] = "field";
-const char kFieldLengthKey[] = "length";
-const char kFieldNameKey[] = "name";
+const char kFieldLengthKey[] = "isLongField";
+const char kFieldNameKey[] = "fieldName";
 
 // Field names for the address components.
-const char kFullNameField[] = "fullName";
-const char kCompanyNameField[] = "companyName";
-const char kAddressLineField[] = "addrLines";
-const char kDependentLocalityField[] = "dependentLocality";
-const char kCityField[] = "city";
-const char kStateField[] = "state";
-const char kPostalCodeField[] = "postalCode";
-const char kSortingCodeField[] = "sortingCode";
-const char kCountryField[] = "country";
+const char kFullNameField[] = "FULL_NAME";
+const char kCompanyNameField[] = "COMPANY_NAME";
+const char kAddressLineField[] = "ADDRESS_LINES";
+const char kDependentLocalityField[] = "ADDRESS_LEVEL_3";
+const char kCityField[] = "ADDRESS_LEVEL_2";
+const char kStateField[] = "ADDRESS_LEVEL_1";
+const char kPostalCodeField[] = "POSTAL_CODE";
+const char kSortingCodeField[] = "SORTING_CODE";
+const char kCountryField[] = "COUNTY_CODE";
 
 // Address field length values.
-const char kShortField[] = "short";
-const char kLongField[] = "long";
+const bool kShortField = false;
+const bool kLongField = true;
 
 ServerFieldType GetFieldTypeFromString(const std::string& type) {
   if (type == kFullNameField)
@@ -143,10 +143,10 @@
 
     switch (components[i].length_hint) {
       case AddressUiComponent::HINT_LONG:
-        component->SetString(kFieldLengthKey, kLongField);
+        component->SetBoolean(kFieldLengthKey, kLongField);
         break;
       case AddressUiComponent::HINT_SHORT:
-        component->SetString(kFieldLengthKey, kShortField);
+        component->SetBoolean(kFieldLengthKey, kShortField);
         break;
     }
 
diff --git a/components/autofill/core/browser/autofill_address_util.h b/components/autofill/core/browser/autofill_address_util.h
index 83f3960..c962f8d 100644
--- a/components/autofill/core/browser/autofill_address_util.h
+++ b/components/autofill/core/browser/autofill_address_util.h
@@ -55,10 +55,10 @@
 extern const char kCountryField[];
 
 // AddressUiComponent::HINT_SHORT.
-extern const char kShortField[];
+extern const bool kShortField;
 
 // AddressUiComponent::HINT_LONG.
-extern const char kLongField[];
+extern const bool kLongField;
 
 // Converts a field type in string format as returned by
 // autofill::GetAddressComponents into the appropriate autofill::ServerFieldType
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 4c79f2a..2e36977 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -411,6 +411,8 @@
       break;
     case PasswordAttribute::kHasSpecialSymbol:
       upload->set_password_has_special_symbol(password_attributes_vote.second);
+      if (password_attributes_vote.second)
+        upload->set_password_special_symbol(password_symbol_vote);
       break;
     case PasswordAttribute::kPasswordAttributesCount:
       NOTREACHED();
diff --git a/components/autofill/core/browser/payments/local_card_migration_manager.cc b/components/autofill/core/browser/payments/local_card_migration_manager.cc
index 8797fcad8..d11e814 100644
--- a/components/autofill/core/browser/payments/local_card_migration_manager.cc
+++ b/components/autofill/core/browser/payments/local_card_migration_manager.cc
@@ -226,7 +226,6 @@
     migration_request_.context_token = context_token;
     legal_message_ = base::DictionaryValue::From(std::move(legal_message));
     migration_request_.risk_data.clear();
-    supported_card_bin_ranges_ = supported_card_bin_ranges;
     // If we successfully received the legal docs, trigger the offer-to-migrate
     // dialog. If triggered from settings page, we pop-up the main prompt
     // directly. If not, we pop up the intermediate bubble.
@@ -237,8 +236,8 @@
       // Pops up a larger, modal dialog showing the local cards to be uploaded.
       ShowMainMigrationDialog();
     } else {
-      // Filter the migratable credit cards with |supported_card_bin_ranges_|.
-      FilterOutUnsupportedLocalCards();
+      // Filter the migratable credit cards with |supported_card_bin_ranges|.
+      FilterOutUnsupportedLocalCards(supported_card_bin_ranges);
       // Abandon the migration if no supported card left.
       if (migratable_credit_cards_.empty()) {
         AutofillMetrics::LogLocalCardMigrationDecisionMetric(
@@ -416,23 +415,19 @@
       migratable_credit_cards_.push_back(MigratableCreditCard(*credit_card));
     }
   }
-
-  // Filter out Unsupported local cards when |supported_card_bin_ranges_| is not
-  // empty.
-  FilterOutUnsupportedLocalCards();
 }
 
-void LocalCardMigrationManager::FilterOutUnsupportedLocalCards() {
+void LocalCardMigrationManager::FilterOutUnsupportedLocalCards(
+    const std::vector<std::pair<int, int>>& supported_card_bin_ranges) {
   if (base::FeatureList::IsEnabled(
           features::kAutofillDoNotMigrateUnsupportedLocalCards) &&
-      !supported_card_bin_ranges_.empty()) {
+      !supported_card_bin_ranges.empty()) {
     // Update the |migratable_credit_cards_| with the
     // |supported_card_bin_ranges|. This will remove any card from
     // |migratable_credit_cards_| of which the card number is not in
     // |supported_card_bin_ranges|.
     auto card_is_unsupported =
-        [& supported_card_bin_ranges =
-             supported_card_bin_ranges_](MigratableCreditCard& card) {
+        [&supported_card_bin_ranges](MigratableCreditCard& card) {
           return !payments::IsCreditCardSupported(card.credit_card(),
                                                   supported_card_bin_ranges);
         };
diff --git a/components/autofill/core/browser/payments/local_card_migration_manager.h b/components/autofill/core/browser/payments/local_card_migration_manager.h
index 1ef71bf..d8e61c9 100644
--- a/components/autofill/core/browser/payments/local_card_migration_manager.h
+++ b/components/autofill/core/browser/payments/local_card_migration_manager.h
@@ -124,6 +124,13 @@
   int GetDetectedValues() const;
 
   // Fetch all migratable credit cards and store in |migratable_credit_cards_|.
+  // Migratable cards are cards whose card number passed luhn check and
+  // expiration date are valid. We do NOT filter unsupported cards here.
+  // Any other usage of this function other than ShouldOfferLocalCardMigration()
+  // and from settings page after OnDidGetUploadDetails, you should call
+  // FilterOutUnsupportedLocalCards right after this function to filter out
+  // unsupported cards. If so, the first OnDidGetUploadDetails() will need to
+  // store the supported ranges locally.
   void GetMigratableCreditCards();
 
   // For testing.
@@ -177,9 +184,12 @@
   // Returns the LocalCardMigrationStrikeDatabase for |client_|.
   LocalCardMigrationStrikeDatabase* GetLocalCardMigrationStrikeDatabase();
 
-  // Filter the |migratable_credit_cards_| with |supported_card_bin_ranges_| and
+  // Filter the |migratable_credit_cards_| with |supported_card_bin_ranges| and
   // keep supported local cards in |migratable_credit_cards_|.
-  void FilterOutUnsupportedLocalCards();
+  // Effective after one successful GetUploadDetails call where we fetch the
+  // |supported_card_bin_ranges|.
+  void FilterOutUnsupportedLocalCards(
+      const std::vector<std::pair<int, int>>& supported_card_bin_ranges);
 
   // Pops up a larger, modal dialog showing the local cards to be uploaded.
   void ShowMainMigrationDialog();
@@ -229,10 +239,6 @@
   std::unique_ptr<LocalCardMigrationStrikeDatabase>
       local_card_migration_strike_database_;
 
-  // List of BIN prefix ranges which are supoorted, with the first and second
-  // number in the pair being the start and end of the range.
-  std::vector<std::pair<int, int>> supported_card_bin_ranges_;
-
   base::WeakPtrFactory<LocalCardMigrationManager> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(LocalCardMigrationManager);
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index 525a1f4..db9f39b 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -1192,6 +1192,9 @@
     // substring will be replaced by the current counter value.
     optional string label = 1;
 
+    // Text shown below the label. Optional.
+    optional string subtext = 5;
+
     // The minimum value this counter can have.
     optional int32 min_value = 2 [default = -0x80000000];  // kint32min
 
@@ -1218,8 +1221,19 @@
   // If specified, the input will initially display maximum |minimized_count|
   // counters. If |counters|.size > |minimized_count|, the remaining counters
   // will be displayed in an expandable section below the first
-  // |minimized_count| counters.
+  // |minimized_count| counters. Setting this value will have no effect if
+  // |expand_text| and |minimize_text| are not set.
   optional int32 minimized_count = 3 [default = 0x7FFFFFFF];  // kint32max
+
+  // Text shown when counters are inside the expandable section and the section
+  // is minimized. Clicking this text will expand the section and show the
+  // remaining counters.
+  optional string expand_text = 4;
+
+  // Text shown when counters are inside the expandable section and the section
+  // is expanded. Clicking this text will minimize the section and hide the
+  // counters inside it.
+  optional string minimize_text = 5;
 }
 
 // An input that allows the user to choose one or multiple options. This input
diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerExternalUma.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerExternalUma.java
index 43e350f..1b27c2b 100644
--- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerExternalUma.java
+++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerExternalUma.java
@@ -14,9 +14,12 @@
     /**
      * Reports metrics for when a NativeBackgroundTask loads the native library.
      * @param taskId An id from {@link TaskIds}.
+     * @param serviceManagerOnlyMode Whether the task will start native in Service Manager Only Mode
+     *                              (Reduced Mode) instead of Full Browser Mode.
      */
-    public static void reportTaskStartedNative(int taskId) {
-        BackgroundTaskSchedulerUma.getInstance().reportTaskStartedNative(taskId);
+    public static void reportTaskStartedNative(int taskId, boolean serviceManagerOnlyMode) {
+        BackgroundTaskSchedulerUma.getInstance().reportTaskStartedNative(
+                taskId, serviceManagerOnlyMode);
     }
 
     /**
diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUma.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUma.java
index ddc9160c..9c738e3 100644
--- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUma.java
+++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUma.java
@@ -155,9 +155,16 @@
     }
 
     /** Reports metrics for when a NativeBackgroundTask loads the native library. */
-    public void reportTaskStartedNative(int taskId) {
-        cacheEvent("Android.BackgroundTaskScheduler.TaskLoadedNative",
-                toUmaEnumValueFromTaskId(taskId));
+    public void reportTaskStartedNative(int taskId, boolean serviceManagerOnlyMode) {
+        int umaEnumValue = toUmaEnumValueFromTaskId(taskId);
+        cacheEvent("Android.BackgroundTaskScheduler.TaskLoadedNative", umaEnumValue);
+        if (serviceManagerOnlyMode) {
+            cacheEvent(
+                    "Android.BackgroundTaskScheduler.TaskLoadedNative.ReducedMode", umaEnumValue);
+        } else {
+            cacheEvent(
+                    "Android.BackgroundTaskScheduler.TaskLoadedNative.FullBrowser", umaEnumValue);
+        }
     }
 
     /**
diff --git a/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUmaTest.java b/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUmaTest.java
index e22aba4..10dc187 100644
--- a/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUmaTest.java
+++ b/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerUmaTest.java
@@ -10,6 +10,7 @@
 import static org.mockito.Mockito.anyString;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
@@ -222,11 +223,35 @@
 
     @Test
     @Feature({"BackgroundTaskScheduler"})
-    public void testReportTaskStartedNative() {
+    public void testReportTaskStartedNativeFullBrowser() {
         doNothing().when(mUmaSpy).cacheEvent(anyString(), anyInt());
-        BackgroundTaskSchedulerExternalUma.reportTaskStartedNative(TaskIds.DOWNLOAD_SERVICE_JOB_ID);
+        BackgroundTaskSchedulerExternalUma.reportTaskStartedNative(
+                TaskIds.DOWNLOAD_SERVICE_JOB_ID, false);
         verify(mUmaSpy, times(1))
                 .cacheEvent(eq("Android.BackgroundTaskScheduler.TaskLoadedNative"),
                         eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
+        verify(mUmaSpy, never())
+                .cacheEvent(eq("Android.BackgroundTaskScheduler.TaskLoadedNative.ReducedMode"),
+                        eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
+        verify(mUmaSpy, times(1))
+                .cacheEvent(eq("Android.BackgroundTaskScheduler.TaskLoadedNative.FullBrowser"),
+                        eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
+    }
+
+    @Test
+    @Feature({"BackgroundTaskScheduler"})
+    public void testReportTaskStartedNativeReducedMode() {
+        doNothing().when(mUmaSpy).cacheEvent(anyString(), anyInt());
+        BackgroundTaskSchedulerExternalUma.reportTaskStartedNative(
+                TaskIds.DOWNLOAD_SERVICE_JOB_ID, true);
+        verify(mUmaSpy, times(1))
+                .cacheEvent(eq("Android.BackgroundTaskScheduler.TaskLoadedNative"),
+                        eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
+        verify(mUmaSpy, times(1))
+                .cacheEvent(eq("Android.BackgroundTaskScheduler.TaskLoadedNative.ReducedMode"),
+                        eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
+        verify(mUmaSpy, never())
+                .cacheEvent(eq("Android.BackgroundTaskScheduler.TaskLoadedNative.FullBrowser"),
+                        eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
     }
 }
diff --git a/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc b/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
index a4e1c40b..0b3c4772 100644
--- a/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
+++ b/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
@@ -202,11 +202,11 @@
   base::UnguessableToken exif_guid = base::UnguessableToken::Create();
   base::UnguessableToken output_guid = base::UnguessableToken::Create();
   base::SharedMemoryHandle input_shm_handle(
-      base::FileDescriptor(input_fd, true), 0u, input_guid);
+      base::FileDescriptor(input_fd, true), input_buffer_size, input_guid);
   base::SharedMemoryHandle exif_shm_handle(base::FileDescriptor(exif_fd, true),
-                                           0u, exif_guid);
+                                           exif_buffer_size, exif_guid);
   base::SharedMemoryHandle output_shm_handle(
-      base::FileDescriptor(output_fd, true), 0u, output_guid);
+      base::FileDescriptor(output_fd, true), output_buffer_size, output_guid);
 
   media::BitstreamBuffer output_buffer(
       buffer_id, output_shm_handle, false /* read_only */, output_buffer_size);
@@ -316,7 +316,7 @@
   }
   base::UnguessableToken exif_guid = base::UnguessableToken::Create();
   base::SharedMemoryHandle exif_shm_handle(base::FileDescriptor(exif_fd, true),
-                                           0u, exif_guid);
+                                           exif_buffer_size, exif_guid);
   std::unique_ptr<media::BitstreamBuffer> exif_buffer;
   if (exif_buffer_size > 0) {
     exif_buffer = std::make_unique<media::BitstreamBuffer>(
diff --git a/components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.cc b/components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.cc
index 74c7240..93ed4ba 100644
--- a/components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.cc
+++ b/components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.cc
@@ -210,9 +210,9 @@
 
   base::UnguessableToken guid = base::UnguessableToken::Create();
   base::SharedMemoryHandle input_shm_handle(
-      base::FileDescriptor(input_fd, true), 0u, guid);
+      base::FileDescriptor(input_fd, true), input_buffer_size, guid);
   base::SharedMemoryHandle output_shm_handle(
-      base::FileDescriptor(output_fd, true), 0u, guid);
+      base::FileDescriptor(output_fd, true), output_buffer_size, guid);
 
   media::BitstreamBuffer in_buffer(buffer_id, input_shm_handle,
                                    false /* read_only */, input_buffer_size);
diff --git a/components/cronet/native/cronet.idl b/components/cronet/native/cronet.idl
index 95d5883..b28c782c 100644
--- a/components/cronet/native/cronet.idl
+++ b/components/cronet/native/cronet.idl
@@ -1440,17 +1440,6 @@
    * Returns the reason why the request finished.
    */
   FINISHED_REASON finished_reason = SUCCEEDED;
-
-  /**
-   * {@link UrlResponseInfo} for the request, if its response had started.
-   */
-  UrlResponseInfo? response_info;
-
-  /**
-   * If the request failed, will be equal to the same {@link Error} provided to
-   * {@link UrlRequestCallback.OnFailed}.
-   */
-  Error? error;
 };
 
 /**
@@ -1479,6 +1468,19 @@
    *
    *     This is accomplished by ownership being shared between the {@code
    *     UrlRequest} and the code that calls this listener.
+   *
+   * @param response_info A pointer to the same UrlResponseInfo passed to
+   *     {@link UrlRequestCallback.OnCanceled()}, {@link
+   *     UrlRequestCallback.OnFailed()} or {@link
+   *     UrlRequestCallback.OnSucceeded()}. The lifetime and ownership of
+   *     {@code response_info} works the same as for {@code request_info}.
+   *
+   * @param error A pointer to the same Error passed to
+   *     {@code UrlRequestCallback.OnFailed()}, or null if there was no error.
+   *     The lifetime and ownership of {@code error} works the same as for
+   *     {@code request_info}.
    */
-  OnRequestFinished(RequestFinishedInfo request_info);
+  OnRequestFinished(RequestFinishedInfo request_info,
+                    UrlResponseInfo response_info,
+                    Error error);
 };
diff --git a/components/cronet/native/engine.cc b/components/cronet/native/engine.cc
index 59698194..dcda7e059 100644
--- a/components/cronet/native/engine.cc
+++ b/components/cronet/native/engine.cc
@@ -312,7 +312,10 @@
             [](scoped_refptr<RequestInfo> request_info,
                Cronet_RequestFinishedInfoListenerPtr
                    request_finished_listener) {
-              request_finished_listener->OnRequestFinished(&request_info->data);
+              // TODO(crbug.com/879208): Pass-though UrlResponseInfo and Error
+              // too.
+              request_finished_listener->OnRequestFinished(&request_info->data,
+                                                           nullptr, nullptr);
             },
             request_info, request_finished_listener)));
   }
diff --git a/components/cronet/native/engine_unittest.cc b/components/cronet/native/engine_unittest.cc
index 86532934..b3ad17bc 100644
--- a/components/cronet/native/engine_unittest.cc
+++ b/components/cronet/native/engine_unittest.cc
@@ -32,7 +32,9 @@
 // increment this value.
 void TestRequestInfoListener_OnRequestFinished(
     Cronet_RequestFinishedInfoListenerPtr self,
-    Cronet_RequestFinishedInfoPtr request_info) {
+    Cronet_RequestFinishedInfoPtr request_info,
+    Cronet_UrlResponseInfoPtr,
+    Cronet_ErrorPtr) {
   CHECK(self);
   Cronet_ClientContext context =
       Cronet_RequestFinishedInfoListener_GetClientContext(self);
diff --git a/components/cronet/native/generated/cronet.idl_c.h b/components/cronet/native/generated/cronet.idl_c.h
index d59ed25..cf74264 100644
--- a/components/cronet/native/generated/cronet.idl_c.h
+++ b/components/cronet/native/generated/cronet.idl_c.h
@@ -669,12 +669,16 @@
 CRONET_EXPORT
 void Cronet_RequestFinishedInfoListener_OnRequestFinished(
     Cronet_RequestFinishedInfoListenerPtr self,
-    Cronet_RequestFinishedInfoPtr request_info);
+    Cronet_RequestFinishedInfoPtr request_info,
+    Cronet_UrlResponseInfoPtr response_info,
+    Cronet_ErrorPtr error);
 // The app implements abstract interface Cronet_RequestFinishedInfoListener by
 // defining custom functions for each method.
 typedef void (*Cronet_RequestFinishedInfoListener_OnRequestFinishedFunc)(
     Cronet_RequestFinishedInfoListenerPtr self,
-    Cronet_RequestFinishedInfoPtr request_info);
+    Cronet_RequestFinishedInfoPtr request_info,
+    Cronet_UrlResponseInfoPtr response_info,
+    Cronet_ErrorPtr error);
 // The app creates an instance of Cronet_RequestFinishedInfoListener by
 // providing custom functions for each method.
 CRONET_EXPORT Cronet_RequestFinishedInfoListenerPtr
@@ -1240,22 +1244,6 @@
 void Cronet_RequestFinishedInfo_finished_reason_set(
     Cronet_RequestFinishedInfoPtr self,
     const Cronet_RequestFinishedInfo_FINISHED_REASON finished_reason);
-CRONET_EXPORT
-void Cronet_RequestFinishedInfo_response_info_set(
-    Cronet_RequestFinishedInfoPtr self,
-    const Cronet_UrlResponseInfoPtr response_info);
-// Move data from |response_info|. The caller retains ownership of
-// |response_info| and must destroy it.
-void Cronet_RequestFinishedInfo_response_info_move(
-    Cronet_RequestFinishedInfoPtr self,
-    Cronet_UrlResponseInfoPtr response_info);
-CRONET_EXPORT
-void Cronet_RequestFinishedInfo_error_set(Cronet_RequestFinishedInfoPtr self,
-                                          const Cronet_ErrorPtr error);
-// Move data from |error|. The caller retains ownership of |error| and must
-// destroy it.
-void Cronet_RequestFinishedInfo_error_move(Cronet_RequestFinishedInfoPtr self,
-                                           Cronet_ErrorPtr error);
 // Cronet_RequestFinishedInfo getters.
 CRONET_EXPORT
 Cronet_MetricsPtr Cronet_RequestFinishedInfo_metrics_get(
@@ -1274,12 +1262,6 @@
 Cronet_RequestFinishedInfo_FINISHED_REASON
 Cronet_RequestFinishedInfo_finished_reason_get(
     const Cronet_RequestFinishedInfoPtr self);
-CRONET_EXPORT
-Cronet_UrlResponseInfoPtr Cronet_RequestFinishedInfo_response_info_get(
-    const Cronet_RequestFinishedInfoPtr self);
-CRONET_EXPORT
-Cronet_ErrorPtr Cronet_RequestFinishedInfo_error_get(
-    const Cronet_RequestFinishedInfoPtr self);
 
 #ifdef __cplusplus
 }
diff --git a/components/cronet/native/generated/cronet.idl_impl_interface.cc b/components/cronet/native/generated/cronet.idl_impl_interface.cc
index d6dcc5b..e7229f0b 100644
--- a/components/cronet/native/generated/cronet.idl_impl_interface.cc
+++ b/components/cronet/native/generated/cronet.idl_impl_interface.cc
@@ -937,9 +937,11 @@
 
 void Cronet_RequestFinishedInfoListener_OnRequestFinished(
     Cronet_RequestFinishedInfoListenerPtr self,
-    Cronet_RequestFinishedInfoPtr request_info) {
+    Cronet_RequestFinishedInfoPtr request_info,
+    Cronet_UrlResponseInfoPtr response_info,
+    Cronet_ErrorPtr error) {
   DCHECK(self);
-  self->OnRequestFinished(request_info);
+  self->OnRequestFinished(request_info, response_info, error);
 }
 
 // Implementation of Cronet_RequestFinishedInfoListener that forwards calls to C
@@ -955,8 +957,10 @@
   ~Cronet_RequestFinishedInfoListenerStub() override {}
 
  protected:
-  void OnRequestFinished(Cronet_RequestFinishedInfoPtr request_info) override {
-    OnRequestFinishedFunc_(this, request_info);
+  void OnRequestFinished(Cronet_RequestFinishedInfoPtr request_info,
+                         Cronet_UrlResponseInfoPtr response_info,
+                         Cronet_ErrorPtr error) override {
+    OnRequestFinishedFunc_(this, request_info, response_info, error);
   }
 
  private:
diff --git a/components/cronet/native/generated/cronet.idl_impl_interface.h b/components/cronet/native/generated/cronet.idl_impl_interface.h
index 6a0c562..90218094 100644
--- a/components/cronet/native/generated/cronet.idl_impl_interface.h
+++ b/components/cronet/native/generated/cronet.idl_impl_interface.h
@@ -239,8 +239,9 @@
   }
   Cronet_ClientContext client_context() const { return client_context_; }
 
-  virtual void OnRequestFinished(
-      Cronet_RequestFinishedInfoPtr request_info) = 0;
+  virtual void OnRequestFinished(Cronet_RequestFinishedInfoPtr request_info,
+                                 Cronet_UrlResponseInfoPtr response_info,
+                                 Cronet_ErrorPtr error) = 0;
 
  private:
   Cronet_ClientContext client_context_ = nullptr;
diff --git a/components/cronet/native/generated/cronet.idl_impl_interface_unittest.cc b/components/cronet/native/generated/cronet.idl_impl_interface_unittest.cc
index 4950a45..9f92f38c 100644
--- a/components/cronet/native/generated/cronet.idl_impl_interface_unittest.cc
+++ b/components/cronet/native/generated/cronet.idl_impl_interface_unittest.cc
@@ -804,7 +804,9 @@
 // Implementation of Cronet_RequestFinishedInfoListener methods for testing.
 void TestCronet_RequestFinishedInfoListener_OnRequestFinished(
     Cronet_RequestFinishedInfoListenerPtr self,
-    Cronet_RequestFinishedInfoPtr request_info) {
+    Cronet_RequestFinishedInfoPtr request_info,
+    Cronet_UrlResponseInfoPtr response_info,
+    Cronet_ErrorPtr error) {
   CHECK(self);
   Cronet_ClientContext client_context =
       Cronet_RequestFinishedInfoListener_GetClientContext(self);
diff --git a/components/cronet/native/generated/cronet.idl_impl_struct.cc b/components/cronet/native/generated/cronet.idl_impl_struct.cc
index 253d1dc..735b65a60 100644
--- a/components/cronet/native/generated/cronet.idl_impl_struct.cc
+++ b/components/cronet/native/generated/cronet.idl_impl_struct.cc
@@ -1225,38 +1225,6 @@
   self->finished_reason = finished_reason;
 }
 
-void Cronet_RequestFinishedInfo_response_info_set(
-    Cronet_RequestFinishedInfoPtr self,
-    const Cronet_UrlResponseInfoPtr response_info) {
-  DCHECK(self);
-  self->response_info.reset();
-  if (response_info != nullptr)
-    self->response_info.emplace(*response_info);
-}
-void Cronet_RequestFinishedInfo_response_info_move(
-    Cronet_RequestFinishedInfoPtr self,
-    Cronet_UrlResponseInfoPtr response_info) {
-  DCHECK(self);
-  self->response_info.reset();
-  if (response_info != nullptr)
-    self->response_info.emplace(std::move(*response_info));
-}
-
-void Cronet_RequestFinishedInfo_error_set(Cronet_RequestFinishedInfoPtr self,
-                                          const Cronet_ErrorPtr error) {
-  DCHECK(self);
-  self->error.reset();
-  if (error != nullptr)
-    self->error.emplace(*error);
-}
-void Cronet_RequestFinishedInfo_error_move(Cronet_RequestFinishedInfoPtr self,
-                                           Cronet_ErrorPtr error) {
-  DCHECK(self);
-  self->error.reset();
-  if (error != nullptr)
-    self->error.emplace(std::move(*error));
-}
-
 // Struct Cronet_RequestFinishedInfo getters.
 Cronet_MetricsPtr Cronet_RequestFinishedInfo_metrics_get(
     const Cronet_RequestFinishedInfoPtr self) {
@@ -1290,19 +1258,3 @@
   DCHECK(self);
   return self->finished_reason;
 }
-
-Cronet_UrlResponseInfoPtr Cronet_RequestFinishedInfo_response_info_get(
-    const Cronet_RequestFinishedInfoPtr self) {
-  DCHECK(self);
-  if (self->response_info == base::nullopt)
-    return nullptr;
-  return &self->response_info.value();
-}
-
-Cronet_ErrorPtr Cronet_RequestFinishedInfo_error_get(
-    const Cronet_RequestFinishedInfoPtr self) {
-  DCHECK(self);
-  if (self->error == base::nullopt)
-    return nullptr;
-  return &self->error.value();
-}
diff --git a/components/cronet/native/generated/cronet.idl_impl_struct.h b/components/cronet/native/generated/cronet.idl_impl_struct.h
index 09264b0..3034fdd 100644
--- a/components/cronet/native/generated/cronet.idl_impl_struct.h
+++ b/components/cronet/native/generated/cronet.idl_impl_struct.h
@@ -211,8 +211,6 @@
   std::vector<Cronet_RawDataPtr> annotations;
   Cronet_RequestFinishedInfo_FINISHED_REASON finished_reason =
       Cronet_RequestFinishedInfo_FINISHED_REASON_SUCCEEDED;
-  base::Optional<Cronet_UrlResponseInfo> response_info;
-  base::Optional<Cronet_Error> error;
 
  private:
   DISALLOW_ASSIGN(Cronet_RequestFinishedInfo);
diff --git a/components/cronet/native/generated/cronet.idl_impl_struct_unittest.cc b/components/cronet/native/generated/cronet.idl_impl_struct_unittest.cc
index e2d6f1a..7b73c91 100644
--- a/components/cronet/native/generated/cronet.idl_impl_struct_unittest.cc
+++ b/components/cronet/native/generated/cronet.idl_impl_struct_unittest.cc
@@ -503,35 +503,6 @@
       second, Cronet_RequestFinishedInfo_finished_reason_get(first));
   EXPECT_EQ(Cronet_RequestFinishedInfo_finished_reason_get(first),
             Cronet_RequestFinishedInfo_finished_reason_get(second));
-  Cronet_UrlResponseInfoPtr test_response_info =
-      Cronet_UrlResponseInfo_Create();
-  EXPECT_EQ(Cronet_RequestFinishedInfo_response_info_get(first), nullptr);
-
-  Cronet_RequestFinishedInfo_response_info_set(first, test_response_info);
-  EXPECT_NE(Cronet_RequestFinishedInfo_response_info_get(first), nullptr);
-  Cronet_RequestFinishedInfo_response_info_set(first, nullptr);
-  EXPECT_EQ(Cronet_RequestFinishedInfo_response_info_get(first), nullptr);
-
-  Cronet_RequestFinishedInfo_response_info_move(first, test_response_info);
-  EXPECT_NE(Cronet_RequestFinishedInfo_response_info_get(first), nullptr);
-  Cronet_RequestFinishedInfo_response_info_move(first, nullptr);
-  EXPECT_EQ(Cronet_RequestFinishedInfo_response_info_get(first), nullptr);
-
-  Cronet_UrlResponseInfo_Destroy(test_response_info);
-  Cronet_ErrorPtr test_error = Cronet_Error_Create();
-  EXPECT_EQ(Cronet_RequestFinishedInfo_error_get(first), nullptr);
-
-  Cronet_RequestFinishedInfo_error_set(first, test_error);
-  EXPECT_NE(Cronet_RequestFinishedInfo_error_get(first), nullptr);
-  Cronet_RequestFinishedInfo_error_set(first, nullptr);
-  EXPECT_EQ(Cronet_RequestFinishedInfo_error_get(first), nullptr);
-
-  Cronet_RequestFinishedInfo_error_move(first, test_error);
-  EXPECT_NE(Cronet_RequestFinishedInfo_error_get(first), nullptr);
-  Cronet_RequestFinishedInfo_error_move(first, nullptr);
-  EXPECT_EQ(Cronet_RequestFinishedInfo_error_get(first), nullptr);
-
-  Cronet_Error_Destroy(test_error);
   Cronet_RequestFinishedInfo_Destroy(first);
   Cronet_RequestFinishedInfo_Destroy(second);
 }
diff --git a/components/cronet/native/test/url_request_test.cc b/components/cronet/native/test/url_request_test.cc
index ee4ecccd..b0175cd 100644
--- a/components/cronet/native/test/url_request_test.cc
+++ b/components/cronet/native/test/url_request_test.cc
@@ -108,7 +108,9 @@
 // App implementation of Cronet_RequestFinishedInfoListener methods.
 static void TestRequestInfoListener_OnRequestFinished(
     Cronet_RequestFinishedInfoListenerPtr self,
-    Cronet_RequestFinishedInfoPtr request_info) {
+    Cronet_RequestFinishedInfoPtr request_info,
+    Cronet_UrlResponseInfoPtr,
+    Cronet_ErrorPtr) {
   CHECK(self);
 }
 
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index 0f92022..8dcc915 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -392,7 +392,7 @@
   EXPECT_EQ(params->quic_supported_versions.size(), 1u);
   EXPECT_EQ(params->quic_supported_versions[0],
             quic::ParsedQuicVersion(quic::PROTOCOL_QUIC_CRYPTO,
-                                    quic::QUIC_VERSION_43));
+                                    quic::QUIC_VERSION_46));
 }
 
 TEST(URLRequestContextConfigTest, SetQuicServerMigrationOptions) {
diff --git a/components/download/content/factory/download_service_factory_helper.cc b/components/download/content/factory/download_service_factory_helper.cc
index 927b7ef..3bd089b 100644
--- a/components/download/content/factory/download_service_factory_helper.cc
+++ b/components/download/content/factory/download_service_factory_helper.cc
@@ -4,6 +4,8 @@
 
 #include "components/download/content/factory/download_service_factory_helper.h"
 
+#include <utility>
+
 #include "base/files/file_path.h"
 #include "build/build_config.h"
 #include "components/download/content/factory/navigation_monitor_factory.h"
@@ -97,7 +99,6 @@
 // Create download service for normal profile.
 std::unique_ptr<DownloadService> BuildDownloadService(
     SimpleFactoryKey* simple_factory_key,
-    PrefService* prefs,
     std::unique_ptr<DownloadClientMap> clients,
     network::NetworkConnectionTracker* network_connection_tracker,
     const base::FilePath& storage_dir,
diff --git a/components/download/content/factory/download_service_factory_helper.h b/components/download/content/factory/download_service_factory_helper.h
index 46864288..4d4d4e2 100644
--- a/components/download/content/factory/download_service_factory_helper.h
+++ b/components/download/content/factory/download_service_factory_helper.h
@@ -15,7 +15,6 @@
 #include "components/download/public/background_service/clients.h"
 
 class SimpleFactoryKey;
-class PrefService;
 
 namespace network {
 class NetworkConnectionTracker;
@@ -40,7 +39,6 @@
 // |background_task_runner| will be used for all disk reads and writes.
 std::unique_ptr<DownloadService> BuildDownloadService(
     SimpleFactoryKey* simple_factory_key,
-    PrefService* prefs,
     std::unique_ptr<DownloadClientMap> clients,
     network::NetworkConnectionTracker* network_connection_tracker,
     const base::FilePath& storage_dir,
diff --git a/components/drive/drive_notification_manager.cc b/components/drive/drive_notification_manager.cc
index 1de15b0..19f7dbe 100644
--- a/components/drive/drive_notification_manager.cc
+++ b/components/drive/drive_notification_manager.cc
@@ -131,6 +131,9 @@
 }
 
 std::string DriveNotificationManager::GetOwnerName() const { return "Drive"; }
+bool DriveNotificationManager::IsPublicTopic(const syncer::Topic& topic) const {
+  return base::StringPiece(topic).starts_with(kFcmTeamDriveChangePrefix);
+}
 
 void DriveNotificationManager::AddObserver(
     DriveNotificationObserver* observer) {
diff --git a/components/drive/drive_notification_manager.h b/components/drive/drive_notification_manager.h
index 2354759..a6e204ab 100644
--- a/components/drive/drive_notification_manager.h
+++ b/components/drive/drive_notification_manager.h
@@ -50,6 +50,7 @@
   void OnIncomingInvalidation(
       const syncer::ObjectIdInvalidationMap& invalidation_map) override;
   std::string GetOwnerName() const override;
+  bool IsPublicTopic(const syncer::Topic& topic) const override;
 
   void AddObserver(DriveNotificationObserver* observer);
   void RemoveObserver(DriveNotificationObserver* observer);
diff --git a/components/error_page/common/localized_error.cc b/components/error_page/common/localized_error.cc
index 1c19737..ea9bf73 100644
--- a/components/error_page/common/localized_error.cc
+++ b/components/error_page/common/localized_error.cc
@@ -25,6 +25,7 @@
 #include "components/error_page/common/error_page_params.h"
 #include "components/error_page/common/error_page_switches.h"
 #include "components/error_page/common/net_error_info.h"
+#include "components/offline_pages/core/offline_page_feature.h"
 #include "components/strings/grit/components_chromium_strings.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/url_formatter/url_formatter.h"
@@ -1041,7 +1042,7 @@
   if (!is_post && !result.reload_button_shown && !is_incognito &&
       failed_url.is_valid() && failed_url.SchemeIsHTTPOrHTTPS() &&
       IsOfflineError(error_domain, error_code)) {
-    if (!auto_fetch_feature_enabled) {
+    if (!auto_fetch_feature_enabled && offline_pages::IsOfflinePagesEnabled()) {
       result.download_button_shown = true;
       result.strings.SetPath({"downloadButton", "msg"},
                              base::Value(l10n_util::GetStringUTF16(
diff --git a/components/exo/buffer_unittest.cc b/components/exo/buffer_unittest.cc
index 95b1c56d..3a249d1 100644
--- a/components/exo/buffer_unittest.cc
+++ b/components/exo/buffer_unittest.cc
@@ -27,10 +27,6 @@
 
 using BufferTest = test::ExoTestBase;
 
-aura::Env* GetAuraEnv() {
-  return ash::Shell::Get()->aura_env();
-}
-
 void Release(int* release_call_count) {
   (*release_call_count)++;
 }
@@ -40,7 +36,7 @@
   for (auto& resource : frame->resource_list)
     sync_tokens.push_back(resource.mailbox_holder.sync_token.GetData());
   gpu::raster::RasterInterface* ri =
-      GetAuraEnv()
+      aura::Env::GetInstance()
           ->context_factory()
           ->SharedMainThreadRasterContextProvider()
           ->RasterInterface();
@@ -104,7 +100,9 @@
   ASSERT_TRUE(rv);
 
   scoped_refptr<viz::RasterContextProvider> context_provider =
-      GetAuraEnv()->context_factory()->SharedMainThreadRasterContextProvider();
+      aura::Env::GetInstance()
+          ->context_factory()
+          ->SharedMainThreadRasterContextProvider();
   if (context_provider) {
     gpu::raster::RasterInterface* ri = context_provider->RasterInterface();
     ri->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
@@ -157,7 +155,7 @@
   ASSERT_TRUE(rv);
 
   viz::RasterContextProvider* context_provider =
-      GetAuraEnv()
+      aura::Env::GetInstance()
           ->context_factory()
           ->SharedMainThreadRasterContextProvider()
           .get();
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc
index afc0be21..f01adfb 100644
--- a/components/exo/client_controlled_shell_surface_unittest.cc
+++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -609,7 +609,7 @@
 
   // AutoHide
   base::RunLoop().RunUntilIdle();
-  aura::Env* env = ash::Shell::Get()->aura_env();
+  aura::Env* env = aura::Env::GetInstance();
   gfx::Rect cropped_fullscreen_bounds(0, 0, 800, 400);
   env->SetLastMouseLocation(gfx::Point(100, 30));
   TestEventHandler handler;
diff --git a/components/exo/gamepad_delegate.h b/components/exo/gamepad_delegate.h
index a917582..fc8c5b07 100644
--- a/components/exo/gamepad_delegate.h
+++ b/components/exo/gamepad_delegate.h
@@ -15,11 +15,14 @@
 
   // Called when the user moved an axis of the gamepad. Valid axes are defined
   // by the W3C 'standard gamepad' specification.
-  virtual void OnAxis(int axis, double value) = 0;
+  virtual void OnAxis(int axis, int raw_axis, double value) = 0;
 
   // Called when the user pressed or moved a button of the gamepad.
   // Valid buttons are defined by the W3C 'standard gamepad' specification.
-  virtual void OnButton(int button, bool pressed, double value) = 0;
+  virtual void OnButton(int button,
+                        int raw_button,
+                        bool pressed,
+                        double value) = 0;
 
   // Called after all gamepad information of this frame has been set and the
   // client should evaluate the updated state.
diff --git a/components/exo/gaming_seat.cc b/components/exo/gaming_seat.cc
index 585a73e..7b34453 100644
--- a/components/exo/gaming_seat.cc
+++ b/components/exo/gaming_seat.cc
@@ -97,10 +97,11 @@
 
   switch (event.type()) {
     case ui::GamepadEventType::BUTTON:
-      it->second->OnButton(event.code(), event.value(), event.value());
+      it->second->OnButton(event.code(), event.raw_code(), event.value(),
+                           event.value());
       break;
     case ui::GamepadEventType::AXIS:
-      it->second->OnAxis(event.code(), event.value());
+      it->second->OnAxis(event.code(), event.raw_code(), event.value());
       break;
     case ui::GamepadEventType::FRAME:
       it->second->OnFrame();
diff --git a/components/exo/gaming_seat_unittest.cc b/components/exo/gaming_seat_unittest.cc
index c7d1c4d..df35551d 100644
--- a/components/exo/gaming_seat_unittest.cc
+++ b/components/exo/gaming_seat_unittest.cc
@@ -37,8 +37,8 @@
 
   // Overridden from GamepadDelegate:
   MOCK_METHOD0(OnRemoved, void());
-  MOCK_METHOD2(OnAxis, void(int, double));
-  MOCK_METHOD3(OnButton, void(int, bool, double));
+  MOCK_METHOD3(OnAxis, void(int, int, double));
+  MOCK_METHOD4(OnButton, void(int, int, bool, double));
   MOCK_METHOD0(OnFrame, void());
 };
 
diff --git a/components/exo/pointer_unittest.cc b/components/exo/pointer_unittest.cc
index 15d63a3e..46aab77 100644
--- a/components/exo/pointer_unittest.cc
+++ b/components/exo/pointer_unittest.cc
@@ -31,8 +31,7 @@
 namespace {
 
 viz::SurfaceManager* GetSurfaceManager() {
-  return ash::Shell::Get()
-      ->aura_env()
+  return aura::Env::GetInstance()
       ->context_factory_private()
       ->GetFrameSinkManager()
       ->surface_manager();
diff --git a/components/exo/wayland/zcr_gaming_input.cc b/components/exo/wayland/zcr_gaming_input.cc
index ecdecc0..e7af947 100644
--- a/components/exo/wayland/zcr_gaming_input.cc
+++ b/components/exo/wayland/zcr_gaming_input.cc
@@ -69,21 +69,28 @@
     wl_resource_set_user_data(gamepad_resource_, nullptr);
     delete this;
   }
-  void OnAxis(int axis, double value) override {
+  void OnAxis(int axis, int raw_axis, double value) override {
     if (!gamepad_resource_) {
       return;
     }
+    // TODO(tetsui): Send raw axis index when kRawGamepadInfoFeature is enabled.
     zcr_gamepad_v2_send_axis(gamepad_resource_, NowInMilliseconds(), axis,
                              wl_fixed_from_double(value));
   }
-  void OnButton(int button, bool pressed, double value) override {
+  void OnButton(int button,
+                int raw_button,
+                bool pressed,
+                double value) override {
     if (!gamepad_resource_) {
       return;
     }
     uint32_t state = pressed ? ZCR_GAMEPAD_V2_BUTTON_STATE_PRESSED
                              : ZCR_GAMEPAD_V2_BUTTON_STATE_RELEASED;
-    zcr_gamepad_v2_send_button(gamepad_resource_, NowInMilliseconds(), button,
-                               state, wl_fixed_from_double(value));
+    zcr_gamepad_v2_send_button(
+        gamepad_resource_, NowInMilliseconds(),
+        base::FeatureList::IsEnabled(kRawGamepadInfoFeature) ? raw_button
+                                                             : button,
+        state, wl_fixed_from_double(value));
   }
   void OnFrame() override {
     if (!gamepad_resource_) {
diff --git a/components/favicon/core/BUILD.gn b/components/favicon/core/BUILD.gn
index 4318e7e..247aa7f 100644
--- a/components/favicon/core/BUILD.gn
+++ b/components/favicon/core/BUILD.gn
@@ -14,6 +14,8 @@
     "favicon_driver_observer.h",
     "favicon_handler.cc",
     "favicon_handler.h",
+    "favicon_request_handler.cc",
+    "favicon_request_handler.h",
     "favicon_server_fetcher_params.cc",
     "favicon_server_fetcher_params.h",
     "favicon_service.cc",
@@ -51,6 +53,7 @@
   sources = [
     "fallback_url_util_unittest.cc",
     "favicon_handler_unittest.cc",
+    "favicon_request_handler_unittest.cc",
     "favicon_service_impl_unittest.cc",
     "large_icon_service_impl_unittest.cc",
   ]
diff --git a/components/favicon/core/favicon_request_handler.cc b/components/favicon/core/favicon_request_handler.cc
new file mode 100644
index 0000000..a8e6dbdb
--- /dev/null
+++ b/components/favicon/core/favicon_request_handler.cc
@@ -0,0 +1,142 @@
+// 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 "components/favicon/core/favicon_request_handler.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "components/favicon/core/favicon_service.h"
+#include "components/favicon_base/favicon_types.h"
+
+namespace favicon {
+
+namespace {
+
+// Parameter used for local bitmap queries by page url. The url is an origin,
+// and it may not have had a favicon associated with it. A trickier case is when
+// it only has domain-scoped cookies, but visitors are redirected to HTTPS on
+// visiting. It defaults to a HTTP scheme, but the favicon will be associated
+// with the HTTPS URL and hence won't be found if we include the scheme in the
+// lookup. Set |fallback_to_host|=true so the favicon database will fall back to
+// matching only the hostname to have the best chance of finding a favicon.
+// TODO(victorvianna): Consider passing this as a parameter in the API.
+const bool kFallbackToHost = true;
+
+// Parameter used for local bitmap queries by page url.
+favicon_base::IconTypeSet GetIconTypesForLocalQuery() {
+  return favicon_base::IconTypeSet{favicon_base::IconType::kFavicon};
+}
+
+}  // namespace
+
+FaviconRequestHandler::FaviconRequestHandler() {}
+
+FaviconRequestHandler::~FaviconRequestHandler() {}
+
+void FaviconRequestHandler::GetRawFaviconForPageURL(
+    const GURL& page_url,
+    int desired_size_in_pixel,
+    const favicon_base::FaviconRawBitmapCallback& callback,
+    FaviconRequestOrigin request_origin,
+    FaviconService* favicon_service,
+    FaviconRequestHandler::SyncedFaviconGetter synced_favicon_getter,
+    base::CancelableTaskTracker* tracker) {
+  if (!favicon_service) {
+    RecordFaviconRequestMetric(request_origin,
+                               FaviconAvailability::kNotAvailable);
+    callback.Run(favicon_base::FaviconRawBitmapResult());
+    return;
+  }
+
+  // First attempt to find the icon locally.
+  favicon_service->GetRawFaviconForPageURL(
+      page_url, GetIconTypesForLocalQuery(), desired_size_in_pixel,
+      kFallbackToHost,
+      base::BindRepeating(&FaviconRequestHandler::OnBitmapLocalDataAvailable,
+                          weak_ptr_factory_.GetWeakPtr(), page_url,
+                          /*response_callback=*/callback, request_origin,
+                          base::Passed(&synced_favicon_getter)),
+      tracker);
+}
+
+void FaviconRequestHandler::GetFaviconImageForPageURL(
+    const GURL& page_url,
+    const favicon_base::FaviconImageCallback& callback,
+    FaviconRequestOrigin request_origin,
+    FaviconService* favicon_service,
+    FaviconRequestHandler::SyncedFaviconGetter synced_favicon_getter,
+    base::CancelableTaskTracker* tracker) {
+  if (!favicon_service) {
+    RecordFaviconRequestMetric(request_origin,
+                               FaviconAvailability::kNotAvailable);
+    callback.Run(favicon_base::FaviconImageResult());
+    return;
+  }
+
+  // First attempt to find the icon locally.
+  favicon_service->GetFaviconImageForPageURL(
+      page_url,
+      base::BindRepeating(&FaviconRequestHandler::OnImageLocalDataAvailable,
+                          weak_ptr_factory_.GetWeakPtr(), page_url,
+                          /*response_callback=*/callback, request_origin,
+                          base::Passed(&synced_favicon_getter)),
+      tracker);
+}
+
+void FaviconRequestHandler::OnBitmapLocalDataAvailable(
+    const GURL& page_url,
+    const favicon_base::FaviconRawBitmapCallback& response_callback,
+    FaviconRequestOrigin origin,
+    FaviconRequestHandler::SyncedFaviconGetter synced_favicon_getter,
+    const favicon_base::FaviconRawBitmapResult& bitmap_result) const {
+  if (bitmap_result.is_valid()) {
+    RecordFaviconRequestMetric(origin, FaviconAvailability::kLocal);
+    response_callback.Run(bitmap_result);
+    return;
+  }
+
+  scoped_refptr<base::RefCountedMemory> sync_bitmap;
+  if (std::move(synced_favicon_getter).Run(page_url, &sync_bitmap)) {
+    RecordFaviconRequestMetric(origin, FaviconAvailability::kSync);
+    favicon_base::FaviconRawBitmapResult sync_bitmap_result;
+    sync_bitmap_result.bitmap_data = sync_bitmap;
+    response_callback.Run(sync_bitmap_result);
+    return;
+  }
+
+  // If sync does not have the favicon, send empty response.
+  RecordFaviconRequestMetric(origin, FaviconAvailability::kNotAvailable);
+  response_callback.Run(favicon_base::FaviconRawBitmapResult());
+}
+
+void FaviconRequestHandler::OnImageLocalDataAvailable(
+    const GURL& page_url,
+    const favicon_base::FaviconImageCallback& response_callback,
+    FaviconRequestOrigin origin,
+    FaviconRequestHandler::SyncedFaviconGetter synced_favicon_getter,
+    const favicon_base::FaviconImageResult& image_result) const {
+  if (!image_result.image.IsEmpty()) {
+    RecordFaviconRequestMetric(origin, FaviconAvailability::kLocal);
+    response_callback.Run(image_result);
+    return;
+  }
+
+  scoped_refptr<base::RefCountedMemory> sync_bitmap;
+  if (std::move(synced_favicon_getter).Run(page_url, &sync_bitmap)) {
+    RecordFaviconRequestMetric(origin, FaviconAvailability::kSync);
+    favicon_base::FaviconImageResult sync_image_result;
+    // Convert bitmap to image.
+    sync_image_result.image =
+        gfx::Image::CreateFrom1xPNGBytes(sync_bitmap.get());
+    response_callback.Run(sync_image_result);
+    return;
+  }
+
+  // If sync does not have the favicon, send empty response.
+  RecordFaviconRequestMetric(origin, FaviconAvailability::kNotAvailable);
+  response_callback.Run(favicon_base::FaviconImageResult());
+}
+
+}  // namespace favicon
diff --git a/components/favicon/core/favicon_request_handler.h b/components/favicon/core/favicon_request_handler.h
new file mode 100644
index 0000000..05a14ca
--- /dev/null
+++ b/components/favicon/core/favicon_request_handler.h
@@ -0,0 +1,86 @@
+// 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 COMPONENTS_FAVICON_CORE_FAVICON_REQUEST_HANDLER_H_
+#define COMPONENTS_FAVICON_CORE_FAVICON_REQUEST_HANDLER_H_
+
+#include "base/memory/ref_counted_memory.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/task/cancelable_task_tracker.h"
+#include "components/favicon_base/favicon_callback.h"
+#include "components/favicon_base/favicon_request_metrics.h"
+#include "url/gurl.h"
+
+namespace favicon {
+
+class FaviconService;
+
+// Class for handling favicon requests by page url, forwarding them to local
+// storage or sync accordingly.
+class FaviconRequestHandler {
+ public:
+  // Callback that requests the synced bitmap for the page url given in the
+  // the first argument, storing the result in the second argument. Returns
+  // whether the request succeeded.
+  // TODO(victorvianna): Make this return a pointer instead of a bool.
+  using SyncedFaviconGetter =
+      base::OnceCallback<bool(const GURL&,
+                              scoped_refptr<base::RefCountedMemory>*)>;
+
+  FaviconRequestHandler();
+
+  ~FaviconRequestHandler();
+
+  // Requests favicon bitmap at |page_url| of size |desired_size_in_pixel|.
+  // Tries to fetch the icon from local storage and falls back to sync if it's
+  // not found.
+  void GetRawFaviconForPageURL(
+      const GURL& page_url,
+      int desired_size_in_pixel,
+      const favicon_base::FaviconRawBitmapCallback& callback,
+      FaviconRequestOrigin request_origin,
+      FaviconService* favicon_service,
+      SyncedFaviconGetter synced_favicon_getter,
+      base::CancelableTaskTracker* tracker);
+
+  // Requests favicon image at |page_url|. Tries to fetch the icon from local
+  // storage and falls back to sync if it's not found.
+  void GetFaviconImageForPageURL(
+      const GURL& page_url,
+      const favicon_base::FaviconImageCallback& callback,
+      FaviconRequestOrigin request_origin,
+      FaviconService* favicon_service,
+      SyncedFaviconGetter synced_favicon_getter,
+      base::CancelableTaskTracker* tracker);
+
+ private:
+  // Called after the first attempt to retrieve the icon bitmap from local
+  // storage. If request succeeded, sends the result. Otherwise attempts to
+  // retrieve from sync.
+  void OnBitmapLocalDataAvailable(
+      const GURL& page_url,
+      const favicon_base::FaviconRawBitmapCallback& response_callback,
+      FaviconRequestOrigin origin,
+      SyncedFaviconGetter synced_favicon_getter,
+      const favicon_base::FaviconRawBitmapResult& bitmap_result) const;
+
+  // Called after the first attempt to retrieve the icon image from local
+  // storage. If request succeeded, sends the result. Otherwise attempts to
+  // retrieve from sync.
+  void OnImageLocalDataAvailable(
+      const GURL& page_url,
+      const favicon_base::FaviconImageCallback& response_callback,
+      FaviconRequestOrigin origin,
+      SyncedFaviconGetter synced_favicon_getter,
+      const favicon_base::FaviconImageResult& image_result) const;
+
+  base::WeakPtrFactory<FaviconRequestHandler> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(FaviconRequestHandler);
+};
+
+}  // namespace favicon
+
+#endif  // COMPONENTS_FAVICON_CORE_FAVICON_REQUEST_HANDLER_H_
diff --git a/components/favicon/core/favicon_request_handler_unittest.cc b/components/favicon/core/favicon_request_handler_unittest.cc
new file mode 100644
index 0000000..21ae3b8
--- /dev/null
+++ b/components/favicon/core/favicon_request_handler_unittest.cc
@@ -0,0 +1,174 @@
+// 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 "components/favicon/core/favicon_request_handler.h"
+
+#include "base/bind.h"
+#include "base/task/cancelable_task_tracker.h"
+#include "base/test/mock_callback.h"
+#include "components/favicon/core/test/mock_favicon_service.h"
+#include "components/favicon_base/favicon_request_metrics.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/gfx/codec/png_codec.h"
+#include "ui/gfx/image/image.h"
+
+namespace favicon {
+namespace {
+
+using testing::_;
+using testing::Invoke;
+
+const char kDummyPageUrl[] = "https://www.example.com";
+const int kDesiredSizeInPixel = 16;
+const SkColor kTestColor = SK_ColorRED;
+base::CancelableTaskTracker::TaskId kDummyTaskId;
+const FaviconRequestOrigin kOrigin = FaviconRequestOrigin::UNKNOWN;
+
+scoped_refptr<base::RefCountedBytes> CreateTestBitmapBytes() {
+  scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
+  SkBitmap bitmap;
+  bitmap.allocN32Pixels(16, 16);
+  bitmap.eraseColor(kTestColor);
+  gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data->data());
+  return data;
+}
+
+favicon_base::FaviconRawBitmapResult CreateTestBitmapResult() {
+  favicon_base::FaviconRawBitmapResult result;
+  result.bitmap_data = CreateTestBitmapBytes();
+  return result;
+}
+
+favicon_base::FaviconImageResult CreateTestImageResult() {
+  favicon_base::FaviconImageResult result;
+  result.image = gfx::Image::CreateFrom1xPNGBytes(CreateTestBitmapBytes());
+  return result;
+}
+
+ACTION_P(ReturnBitmapFromLocal, bitmap) {
+  arg4.Run(bitmap);
+  return kDummyTaskId;
+}
+
+ACTION_P(ReturnImageFromLocal, image) {
+  arg1.Run(image);
+  return kDummyTaskId;
+}
+
+ACTION_P(ReturnFaviconFromSync, should_return_valid) {
+  if (should_return_valid) {
+    *arg1 = CreateTestBitmapBytes();
+  }
+  return should_return_valid;
+}
+
+void StoreBitmap(favicon_base::FaviconRawBitmapResult* destination,
+                 const favicon_base::FaviconRawBitmapResult& result) {
+  *destination = result;
+}
+
+void StoreImage(favicon_base::FaviconImageResult* destination,
+                const favicon_base::FaviconImageResult& result) {
+  *destination = result;
+}
+
+class FaviconRequestHandlerTest : public ::testing::Test {
+ public:
+  FaviconRequestHandlerTest() = default;
+
+ protected:
+  testing::NiceMock<MockFaviconService> mock_favicon_service_;
+  FaviconRequestHandler favicon_request_handler_;
+  base::MockCallback<FaviconRequestHandler::SyncedFaviconGetter>
+      synced_favicon_getter_;
+  base::CancelableTaskTracker tracker_;
+};
+
+TEST_F(FaviconRequestHandlerTest, ShouldGetEmptyBitmap) {
+  EXPECT_CALL(mock_favicon_service_,
+              GetRawFaviconForPageURL(GURL(kDummyPageUrl), _,
+                                      kDesiredSizeInPixel, _, _, &tracker_))
+      .WillOnce(ReturnBitmapFromLocal(favicon_base::FaviconRawBitmapResult()));
+  EXPECT_CALL(synced_favicon_getter_, Run(GURL(kDummyPageUrl), _))
+      .WillOnce(ReturnFaviconFromSync(/*should_return_valid=*/false));
+  favicon_base::FaviconRawBitmapResult result;
+  favicon_request_handler_.GetRawFaviconForPageURL(
+      GURL(kDummyPageUrl), kDesiredSizeInPixel,
+      base::BindRepeating(&StoreBitmap, &result), kOrigin,
+      &mock_favicon_service_, synced_favicon_getter_.Get(), &tracker_);
+  EXPECT_FALSE(result.is_valid());
+}
+
+TEST_F(FaviconRequestHandlerTest, ShouldGetSyncBitmap) {
+  EXPECT_CALL(mock_favicon_service_,
+              GetRawFaviconForPageURL(GURL(kDummyPageUrl), _,
+                                      kDesiredSizeInPixel, _, _, &tracker_))
+      .WillOnce(ReturnBitmapFromLocal(favicon_base::FaviconRawBitmapResult()));
+  EXPECT_CALL(synced_favicon_getter_, Run(GURL(kDummyPageUrl), _))
+      .WillOnce(ReturnFaviconFromSync(/*should_return_valid=*/true));
+  favicon_base::FaviconRawBitmapResult result;
+  favicon_request_handler_.GetRawFaviconForPageURL(
+      GURL(kDummyPageUrl), kDesiredSizeInPixel,
+      base::BindRepeating(&StoreBitmap, &result), kOrigin,
+      &mock_favicon_service_, synced_favicon_getter_.Get(), &tracker_);
+  EXPECT_TRUE(result.is_valid());
+}
+
+TEST_F(FaviconRequestHandlerTest, ShouldGetLocalBitmap) {
+  EXPECT_CALL(mock_favicon_service_,
+              GetRawFaviconForPageURL(GURL(kDummyPageUrl), _,
+                                      kDesiredSizeInPixel, _, _, &tracker_))
+      .WillOnce(ReturnBitmapFromLocal(CreateTestBitmapResult()));
+  EXPECT_CALL(synced_favicon_getter_, Run(GURL(kDummyPageUrl), _)).Times(0);
+  favicon_base::FaviconRawBitmapResult result;
+  favicon_request_handler_.GetRawFaviconForPageURL(
+      GURL(kDummyPageUrl), kDesiredSizeInPixel,
+      base::BindRepeating(&StoreBitmap, &result), kOrigin,
+      &mock_favicon_service_, synced_favicon_getter_.Get(), &tracker_);
+  EXPECT_TRUE(result.is_valid());
+}
+
+TEST_F(FaviconRequestHandlerTest, ShouldGetEmptyImage) {
+  EXPECT_CALL(mock_favicon_service_,
+              GetFaviconImageForPageURL(GURL(kDummyPageUrl), _, &tracker_))
+      .WillOnce(ReturnImageFromLocal(favicon_base::FaviconImageResult()));
+  EXPECT_CALL(synced_favicon_getter_, Run(GURL(kDummyPageUrl), _))
+      .WillOnce(ReturnFaviconFromSync(/*should_return_valid=*/false));
+  favicon_base::FaviconImageResult result;
+  favicon_request_handler_.GetFaviconImageForPageURL(
+      GURL(kDummyPageUrl), base::BindRepeating(&StoreImage, &result), kOrigin,
+      &mock_favicon_service_, synced_favicon_getter_.Get(), &tracker_);
+  EXPECT_TRUE(result.image.IsEmpty());
+}
+
+TEST_F(FaviconRequestHandlerTest, ShouldGetSyncImage) {
+  EXPECT_CALL(mock_favicon_service_,
+              GetFaviconImageForPageURL(GURL(kDummyPageUrl), _, &tracker_))
+      .WillOnce(ReturnImageFromLocal(favicon_base::FaviconImageResult()));
+  EXPECT_CALL(synced_favicon_getter_, Run(GURL(kDummyPageUrl), _))
+      .WillOnce(ReturnFaviconFromSync(/*should_return_valid=*/true));
+  favicon_base::FaviconImageResult result;
+  favicon_request_handler_.GetFaviconImageForPageURL(
+      GURL(kDummyPageUrl), base::BindRepeating(&StoreImage, &result), kOrigin,
+      &mock_favicon_service_, synced_favicon_getter_.Get(), &tracker_);
+  EXPECT_FALSE(result.image.IsEmpty());
+}
+
+TEST_F(FaviconRequestHandlerTest, ShouldGetLocalImage) {
+  EXPECT_CALL(mock_favicon_service_,
+              GetFaviconImageForPageURL(GURL(kDummyPageUrl), _, &tracker_))
+      .WillOnce(ReturnImageFromLocal(CreateTestImageResult()));
+  EXPECT_CALL(synced_favicon_getter_, Run(GURL(kDummyPageUrl), _)).Times(0);
+  favicon_base::FaviconImageResult result;
+  favicon_request_handler_.GetFaviconImageForPageURL(
+      GURL(kDummyPageUrl), base::BindRepeating(&StoreImage, &result), kOrigin,
+      &mock_favicon_service_, synced_favicon_getter_.Get(), &tracker_);
+  EXPECT_FALSE(result.image.IsEmpty());
+}
+
+}  // namespace
+}  // namespace favicon
diff --git a/components/gcm_driver/account_tracker.cc b/components/gcm_driver/account_tracker.cc
index f0c0f8da..38788dd 100644
--- a/components/gcm_driver/account_tracker.cc
+++ b/components/gcm_driver/account_tracker.cc
@@ -80,9 +80,9 @@
 }
 
 void AccountTracker::OnRefreshTokenRemovedForAccount(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   TRACE_EVENT1("identity", "AccountTracker::OnRefreshTokenRemovedForAccount",
-               "account_id", account_id);
+               "account_id", account_id.id);
 
   DVLOG(1) << "REVOKED " << account_id;
   UpdateSignInState(account_id, /*is_signed_in=*/false);
diff --git a/components/gcm_driver/account_tracker.h b/components/gcm_driver/account_tracker.h
index d72926aec..bcfca70 100644
--- a/components/gcm_driver/account_tracker.h
+++ b/components/gcm_driver/account_tracker.h
@@ -83,7 +83,8 @@
       const CoreAccountInfo& previous_primary_account_info) override;
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override;
 
   void OnUserInfoFetchSuccess(AccountIdFetcher* fetcher,
                               const std::string& gaia_id);
diff --git a/components/image_fetcher/core/cached_image_fetcher.cc b/components/image_fetcher/core/cached_image_fetcher.cc
index bb916df..b07e41f 100644
--- a/components/image_fetcher/core/cached_image_fetcher.cc
+++ b/components/image_fetcher/core/cached_image_fetcher.cc
@@ -146,11 +146,10 @@
     if (!image_callback.is_null()) {
       GetImageDecoder()->DecodeImage(
           image_data, gfx::Size(),
-          base::BindRepeating(&CachedImageFetcher::OnImageDecodedFromCache,
-                              weak_ptr_factory_.GetWeakPtr(),
-                              std::move(request),
-                              base::Passed(std::move(image_data_callback)),
-                              base::Passed(std::move(image_callback))));
+          base::BindOnce(&CachedImageFetcher::OnImageDecodedFromCache,
+                         weak_ptr_factory_.GetWeakPtr(), std::move(request),
+                         std::move(image_data_callback),
+                         std::move(image_callback)));
     }
   }
 }
diff --git a/components/invalidation/impl/deprecated_invalidator_registrar_unittest.cc b/components/invalidation/impl/deprecated_invalidator_registrar_unittest.cc
index a195045..e7a0f3a 100644
--- a/components/invalidation/impl/deprecated_invalidator_registrar_unittest.cc
+++ b/components/invalidation/impl/deprecated_invalidator_registrar_unittest.cc
@@ -42,7 +42,7 @@
     registrar_.UnregisterHandler(handler);
   }
 
-  bool UpdateRegisteredIds(InvalidationHandler*, const TopicSet&) override {
+  bool UpdateRegisteredIds(InvalidationHandler*, const Topics&) override {
     NOTREACHED();
     return false;
   }
diff --git a/components/invalidation/impl/fake_invalidation_handler.cc b/components/invalidation/impl/fake_invalidation_handler.cc
index 4eaf56f..b600f2ae 100644
--- a/components/invalidation/impl/fake_invalidation_handler.cc
+++ b/components/invalidation/impl/fake_invalidation_handler.cc
@@ -37,4 +37,8 @@
 
 std::string FakeInvalidationHandler::GetOwnerName() const { return "Fake"; }
 
+bool FakeInvalidationHandler::IsPublicTopic(const syncer::Topic& topic) const {
+  return topic == "PREFERENCE";
+}
+
 }  // namespace syncer
diff --git a/components/invalidation/impl/fake_invalidation_handler.h b/components/invalidation/impl/fake_invalidation_handler.h
index 0ae82f56..86258a2e 100644
--- a/components/invalidation/impl/fake_invalidation_handler.h
+++ b/components/invalidation/impl/fake_invalidation_handler.h
@@ -28,6 +28,7 @@
   void OnIncomingInvalidation(
       const ObjectIdInvalidationMap& invalidation_map) override;
   std::string GetOwnerName() const override;
+  bool IsPublicTopic(const syncer::Topic& topic) const override;
 
  private:
   InvalidatorState state_;
diff --git a/components/invalidation/impl/fake_invalidator.cc b/components/invalidation/impl/fake_invalidator.cc
index 579b550..a46de12 100644
--- a/components/invalidation/impl/fake_invalidator.cc
+++ b/components/invalidation/impl/fake_invalidator.cc
@@ -47,8 +47,7 @@
   return registrar_.UpdateRegisteredIds(handler, ids);
 }
 
-bool FakeInvalidator::UpdateRegisteredIds(InvalidationHandler*,
-                                          const TopicSet&) {
+bool FakeInvalidator::UpdateRegisteredIds(InvalidationHandler*, const Topics&) {
   NOTREACHED();
   return false;
 }
diff --git a/components/invalidation/impl/fake_invalidator.h b/components/invalidation/impl/fake_invalidator.h
index c533568..2a868d9 100644
--- a/components/invalidation/impl/fake_invalidator.h
+++ b/components/invalidation/impl/fake_invalidator.h
@@ -34,7 +34,7 @@
   bool UpdateRegisteredIds(InvalidationHandler* handler,
                            const ObjectIdSet& ids) override;
   bool UpdateRegisteredIds(InvalidationHandler* handler,
-                           const TopicSet& topics) override;
+                           const Topics& topics) override;
   void UnregisterHandler(InvalidationHandler* handler) override;
   InvalidatorState GetInvalidatorState() const override;
   void UpdateCredentials(const std::string& email,
diff --git a/components/invalidation/impl/fcm_fake_invalidator.cc b/components/invalidation/impl/fcm_fake_invalidator.cc
index 63d6fc7..2ae4faa7 100644
--- a/components/invalidation/impl/fcm_fake_invalidator.cc
+++ b/components/invalidation/impl/fcm_fake_invalidator.cc
@@ -53,7 +53,7 @@
 }
 
 bool FCMFakeInvalidator::UpdateRegisteredIds(InvalidationHandler* handler,
-                                             const TopicSet& topics) {
+                                             const Topics& topics) {
   return registrar_.UpdateRegisteredTopics(handler, topics);
 }
 
diff --git a/components/invalidation/impl/fcm_fake_invalidator.h b/components/invalidation/impl/fcm_fake_invalidator.h
index c71adfb..3409d2b 100644
--- a/components/invalidation/impl/fcm_fake_invalidator.h
+++ b/components/invalidation/impl/fcm_fake_invalidator.h
@@ -34,7 +34,7 @@
   bool UpdateRegisteredIds(InvalidationHandler* handler,
                            const ObjectIdSet& ids) override;
   bool UpdateRegisteredIds(InvalidationHandler* handler,
-                           const TopicSet& topics) override;
+                           const Topics& topics) override;
   void UnregisterHandler(InvalidationHandler* handler) override;
   InvalidatorState GetInvalidatorState() const override;
   void UpdateCredentials(const std::string& email,
diff --git a/components/invalidation/impl/fcm_invalidation_listener.cc b/components/invalidation/impl/fcm_invalidation_listener.cc
index f01896f..28f7eade 100644
--- a/components/invalidation/impl/fcm_invalidation_listener.cc
+++ b/components/invalidation/impl/fcm_invalidation_listener.cc
@@ -56,7 +56,7 @@
   DoRegistrationUpdate();
 }
 
-void FCMInvalidationListener::UpdateRegisteredTopics(const TopicSet& topics) {
+void FCMInvalidationListener::UpdateRegisteredTopics(const Topics& topics) {
   ids_update_requested_ = true;
   registered_topics_ = topics;
   DoRegistrationUpdate();
@@ -191,7 +191,7 @@
   Stop();
 }
 
-TopicSet FCMInvalidationListener::GetRegisteredIdsForTest() const {
+Topics FCMInvalidationListener::GetRegisteredIdsForTest() const {
   return registered_topics_;
 }
 
@@ -251,9 +251,9 @@
   status.SetString(
       "InvalidationListener.Subscription-channel-state",
       SubscriptionChannelStateToString(subscription_channel_state_));
-  for (const Topic& topic : registered_topics_) {
-    if (!status.HasKey(topic)) {
-      status.SetString(topic, "Unregistered");
+  for (const auto& topic : registered_topics_) {
+    if (!status.HasKey(topic.first)) {
+      status.SetString(topic.first, "Unregistered");
     }
   }
   return status;
diff --git a/components/invalidation/impl/fcm_invalidation_listener.h b/components/invalidation/impl/fcm_invalidation_listener.h
index 8b63ea8..c550736 100644
--- a/components/invalidation/impl/fcm_invalidation_listener.h
+++ b/components/invalidation/impl/fcm_invalidation_listener.h
@@ -54,7 +54,7 @@
 
   // Update the set of object IDs that we're interested in getting
   // notifications for. May be called at any time.
-  void UpdateRegisteredTopics(const TopicSet& topics);
+  void UpdateRegisteredTopics(const Topics& topics);
 
   // InvalidationListener implementation.
   void Invalidate(const std::string& payload,
@@ -84,7 +84,7 @@
 
   void StopForTest();
 
-  TopicSet GetRegisteredIdsForTest() const;
+  Topics GetRegisteredIdsForTest() const;
 
   base::WeakPtr<FCMInvalidationListener> AsWeakPtr();
 
@@ -122,7 +122,7 @@
   Logger logger_;
 
   // Stored to pass to |per_user_topic_registration_manager_| on start.
-  TopicSet registered_topics_;
+  Topics registered_topics_;
 
   // The states of the HTTP and FCM channel.
   SubscriptionChannelState subscription_channel_state_ =
diff --git a/components/invalidation/impl/fcm_invalidation_listener_unittest.cc b/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
index 798645f0..5defef6 100644
--- a/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
+++ b/components/invalidation/impl/fcm_invalidation_listener_unittest.cc
@@ -172,7 +172,7 @@
   }
   ~MockRegistrationManager() override {}
   MOCK_METHOD2(UpdateRegisteredTopics,
-               void(const TopicSet& topics, const std::string& token));
+               void(const Topics& topics, const std::string& token));
   MOCK_METHOD0(Init, void());
   MOCK_CONST_METHOD1(LookupRegisteredPublicTopicByPrivateTopic,
                      base::Optional<Topic>(const std::string& private_topic));
@@ -192,8 +192,8 @@
   void SetUp() override {
     StartListener();
 
-    registred_topics_.insert(kBookmarksTopic_);
-    registred_topics_.insert(kPreferencesTopic_);
+    registred_topics_.emplace(kBookmarksTopic_, TopicMetadata{false});
+    registred_topics_.emplace(kPreferencesTopic_, TopicMetadata{true});
     listener_.UpdateRegisteredTopics(registred_topics_);
   }
 
@@ -250,7 +250,7 @@
     fake_delegate_.AcknowledgeAll(topic);
   }
 
-  TopicSet GetRegisteredTopics() const {
+  Topics GetRegisteredTopics() const {
     return listener_.GetRegisteredIdsForTest();
   }
 
@@ -281,7 +281,7 @@
   const Topic kExtensionsTopic_;
   const Topic kAppsTopic_;
 
-  TopicSet registred_topics_;
+  Topics registred_topics_;
 
  private:
   base::test::ScopedTaskEnvironment task_environment_;
@@ -363,8 +363,8 @@
 TEST_F(FCMInvalidationListenerTest, InvalidateBeforeRegistration_Simple) {
   const Topic kUnregisteredId = "unregistered";
   const Topic& topic = kUnregisteredId;
-  TopicSet topics;
-  topics.insert(topic);
+  Topics topics;
+  topics.emplace(topic, TopicMetadata{false});
 
   EXPECT_EQ(0U, GetInvalidationCount(topic));
 
@@ -388,8 +388,8 @@
       UnackedInvalidationSet::kMaxBufferedInvalidations + 1;
   const Topic kUnregisteredId("unregistered");
   const Topic& topic = kUnregisteredId;
-  TopicSet topics;
-  topics.insert(topic);
+  Topics topics;
+  topics.emplace(topic, TopicMetadata{false});
 
   EXPECT_EQ(0U, GetInvalidationCount(topic));
 
diff --git a/components/invalidation/impl/fcm_invalidation_service.cc b/components/invalidation/impl/fcm_invalidation_service.cc
index b390c52f..236ffd49 100644
--- a/components/invalidation/impl/fcm_invalidation_service.cc
+++ b/components/invalidation/impl/fcm_invalidation_service.cc
@@ -120,7 +120,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   update_was_requested_ = true;
   DVLOG(2) << "Registering ids: " << ids.size();
-  syncer::TopicSet topics = ConvertIdsToTopics(ids);
+  syncer::Topics topics = ConvertIdsToTopics(ids, handler);
   if (!invalidator_registrar_.UpdateRegisteredTopics(handler, topics))
     return false;
   DoUpdateRegisteredIdsIfNeeded();
diff --git a/components/invalidation/impl/fcm_invalidator.cc b/components/invalidation/impl/fcm_invalidator.cc
index be90afb..245522d 100644
--- a/components/invalidation/impl/fcm_invalidator.cc
+++ b/components/invalidation/impl/fcm_invalidator.cc
@@ -37,11 +37,11 @@
 
 bool FCMInvalidator::UpdateRegisteredIds(InvalidationHandler* handler,
                                          const ObjectIdSet& ids) {
-  return UpdateRegisteredIds(handler, ConvertIdsToTopics(ids));
+  return UpdateRegisteredIds(handler, ConvertIdsToTopics(ids, handler));
 }
 
 bool FCMInvalidator::UpdateRegisteredIds(InvalidationHandler* handler,
-                                         const TopicSet& topics) {
+                                         const Topics& topics) {
   if (!registrar_.UpdateRegisteredTopics(handler, topics))
     return false;
 
diff --git a/components/invalidation/impl/fcm_invalidator.h b/components/invalidation/impl/fcm_invalidator.h
index 58af988..095ef31 100644
--- a/components/invalidation/impl/fcm_invalidator.h
+++ b/components/invalidation/impl/fcm_invalidator.h
@@ -43,7 +43,7 @@
   bool UpdateRegisteredIds(InvalidationHandler* handler,
                            const ObjectIdSet& ids) override;
   bool UpdateRegisteredIds(InvalidationHandler* handler,
-                           const TopicSet& topics) override;
+                           const Topics& topics) override;
 
   void UnregisterHandler(InvalidationHandler* handler) override;
   InvalidatorState GetInvalidatorState() const override;
diff --git a/components/invalidation/impl/invalidation_logger.cc b/components/invalidation/impl/invalidation_logger.cc
index 384b641..067da54 100644
--- a/components/invalidation/impl/invalidation_logger.cc
+++ b/components/invalidation/impl/invalidation_logger.cc
@@ -54,7 +54,7 @@
 }
 
 void InvalidationLogger::OnUpdateTopics(
-    std::map<std::string, syncer::TopicSet> updated_topics) {
+    std::map<std::string, syncer::Topics> updated_topics) {
   for (const auto& updated_topic : updated_topics) {
     latest_ids_[updated_topic.first] =
         syncer::ConvertTopicsToIds(updated_topic.second);
diff --git a/components/invalidation/impl/invalidation_logger.h b/components/invalidation/impl/invalidation_logger.h
index c07cd90..de9da1b 100644
--- a/components/invalidation/impl/invalidation_logger.h
+++ b/components/invalidation/impl/invalidation_logger.h
@@ -49,7 +49,7 @@
   void OnUnregistration(const std::string& details);
   void OnStateChange(const syncer::InvalidatorState& new_state);
   void OnUpdateIds(std::map<std::string, syncer::ObjectIdSet> updated_ids);
-  void OnUpdateTopics(std::map<std::string, syncer::TopicSet> updated_topics);
+  void OnUpdateTopics(std::map<std::string, syncer::Topics> updated_topics);
   void OnDebugMessage(const base::DictionaryValue& details);
   void OnInvalidation(const syncer::ObjectIdInvalidationMap& details);
 
diff --git a/components/invalidation/impl/invalidation_notifier.cc b/components/invalidation/impl/invalidation_notifier.cc
index 74e20f0..cde5616 100644
--- a/components/invalidation/impl/invalidation_notifier.cc
+++ b/components/invalidation/impl/invalidation_notifier.cc
@@ -53,12 +53,6 @@
   return true;
 }
 
-bool InvalidationNotifier::UpdateRegisteredIds(InvalidationHandler* handler,
-                                               const TopicSet& ids) {
-  NOTREACHED();
-  return false;
-}
-
 void InvalidationNotifier::UnregisterHandler(InvalidationHandler* handler) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   registrar_.UnregisterHandler(handler);
diff --git a/components/invalidation/impl/invalidation_notifier.h b/components/invalidation/impl/invalidation_notifier.h
index 62920d5..88ebb9f6 100644
--- a/components/invalidation/impl/invalidation_notifier.h
+++ b/components/invalidation/impl/invalidation_notifier.h
@@ -52,8 +52,6 @@
   void RegisterHandler(InvalidationHandler* handler) override;
   bool UpdateRegisteredIds(InvalidationHandler* handler,
                            const ObjectIdSet& ids) override;
-  bool UpdateRegisteredIds(InvalidationHandler* handler,
-                           const TopicSet& ids) override;
   void UnregisterHandler(InvalidationHandler* handler) override;
   InvalidatorState GetInvalidatorState() const override;
   void UpdateCredentials(const std::string& email,
diff --git a/components/invalidation/impl/invalidator.cc b/components/invalidation/impl/invalidator.cc
index 5b3035c..a94d893 100644
--- a/components/invalidation/impl/invalidator.cc
+++ b/components/invalidation/impl/invalidator.cc
@@ -12,4 +12,9 @@
 Invalidator::~Invalidator() {
 }
 
+bool Invalidator::UpdateRegisteredIds(InvalidationHandler* handler,
+                                      const Topics& ids) {
+  NOTREACHED();
+  return false;
+}
 }  // namespace syncer
diff --git a/components/invalidation/impl/invalidator.h b/components/invalidation/impl/invalidator.h
index dda9b58..04af8055 100644
--- a/components/invalidation/impl/invalidator.h
+++ b/components/invalidation/impl/invalidator.h
@@ -68,7 +68,7 @@
   // not be NULL, and must already be registered.  An ID must be registered for
   // at most one handler. If ID is already registered function returns false.
   virtual bool UpdateRegisteredIds(InvalidationHandler* handler,
-                                   const TopicSet& ids) WARN_UNUSED_RESULT = 0;
+                                   const Topics& ids) WARN_UNUSED_RESULT;
 
   // Stops sending notifications to |handler|.  |handler| must not be NULL, and
   // it must already be registered.  Note that this doesn't unregister the IDs
diff --git a/components/invalidation/impl/invalidator_registrar.cc b/components/invalidation/impl/invalidator_registrar.cc
index d0238b2..0a47deb 100644
--- a/components/invalidation/impl/invalidator_registrar.cc
+++ b/components/invalidation/impl/invalidator_registrar.cc
@@ -30,7 +30,7 @@
 }
 
 bool InvalidatorRegistrar::UpdateRegisteredTopics(InvalidationHandler* handler,
-                                                  const TopicSet& topics) {
+                                                  const Topics& topics) {
   DCHECK(thread_checker_.CalledOnValidThread());
   CHECK(handler);
   CHECK(handlers_.HasObserver(handler));
@@ -40,15 +40,10 @@
       continue;
     }
 
-    std::vector<Topic> intersection;
-    std::set_intersection(handler_and_topics.second.begin(),
-                          handler_and_topics.second.end(), topics.begin(),
-                          topics.end(),
-                          std::inserter(intersection, intersection.end()));
-    if (!intersection.empty()) {
-      DVLOG(1) << "Duplicate registration: trying to register "
-               << *intersection.begin() << " for " << handler
-               << " when it's already registered for "
+    if (auto* duplicate =
+            FindMatchingTopic(topics, handler_and_topics.second)) {
+      DVLOG(1) << "Duplicate registration: trying to register " << *duplicate
+               << " for " << handler << " when it's already registered for "
                << handler_and_topics.first;
       return false;
     }
@@ -70,16 +65,16 @@
   handler_to_topics_map_.erase(handler);
 }
 
-TopicSet InvalidatorRegistrar::GetRegisteredTopics(
+Topics InvalidatorRegistrar::GetRegisteredTopics(
     InvalidationHandler* handler) const {
   DCHECK(thread_checker_.CalledOnValidThread());
   auto lookup = handler_to_topics_map_.find(handler);
-  return lookup != handler_to_topics_map_.end() ? lookup->second : TopicSet();
+  return lookup != handler_to_topics_map_.end() ? lookup->second : Topics();
 }
 
-TopicSet InvalidatorRegistrar::GetAllRegisteredIds() const {
+Topics InvalidatorRegistrar::GetAllRegisteredIds() const {
   DCHECK(thread_checker_.CalledOnValidThread());
-  TopicSet registered_ids;
+  Topics registered_ids;
   for (auto it = handler_to_topics_map_.begin();
        it != handler_to_topics_map_.end(); ++it) {
     registered_ids.insert(it->second.begin(), it->second.end());
@@ -129,13 +124,13 @@
   return state_;
 }
 
-std::map<std::string, TopicSet>
+std::map<std::string, Topics>
 InvalidatorRegistrar::GetSanitizedHandlersIdsMap() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  std::map<std::string, TopicSet> clean_handlers_to_topics;
+  std::map<std::string, Topics> clean_handlers_to_topics;
   for (const auto& handler_and_topics : handler_to_topics_map_)
     clean_handlers_to_topics[handler_and_topics.first->GetOwnerName()] =
-        TopicSet(handler_and_topics.second);
+        Topics(handler_and_topics.second);
   return clean_handlers_to_topics;
 }
 
diff --git a/components/invalidation/impl/invalidator_registrar.h b/components/invalidation/impl/invalidator_registrar.h
index 180e9b2..dbe63cb 100644
--- a/components/invalidation/impl/invalidator_registrar.h
+++ b/components/invalidation/impl/invalidator_registrar.h
@@ -43,14 +43,13 @@
   // for at most one handler. If topic is already registered function returns
   // false.
   virtual bool UpdateRegisteredTopics(InvalidationHandler* handler,
-                                      const TopicSet& topics)
-      WARN_UNUSED_RESULT;
+                                      const Topics& topics) WARN_UNUSED_RESULT;
 
-  virtual TopicSet GetRegisteredTopics(InvalidationHandler* handler) const;
+  virtual Topics GetRegisteredTopics(InvalidationHandler* handler) const;
 
   // Returns the set of all IDs that are registered to some handler (even
   // handlers that have been unregistered).
-  virtual TopicSet GetAllRegisteredIds() const;
+  virtual Topics GetAllRegisteredIds() const;
 
   // Sorts incoming invalidations into a bucket for each handler and then
   // dispatches the batched invalidations to the corresponding handler.
@@ -76,7 +75,7 @@
   // Gets a new map for the name of invalidator handlers and their
   // objects id. This is used by the InvalidatorLogger to be able
   // to display every registered handlers and its objectsIds.
-  std::map<std::string, TopicSet> GetSanitizedHandlersIdsMap();
+  std::map<std::string, Topics> GetSanitizedHandlersIdsMap();
 
   bool IsHandlerRegistered(const InvalidationHandler* handler) const;
   bool HasRegisteredHandlers() const;
@@ -85,7 +84,7 @@
   void DetachFromThreadForTest();
 
  private:
-  typedef std::map<InvalidationHandler*, TopicSet> HandlerTopicsMap;
+  typedef std::map<InvalidationHandler*, Topics> HandlerTopicsMap;
 
   base::ThreadChecker thread_checker_;
   base::ObserverList<InvalidationHandler, true>::Unchecked handlers_;
diff --git a/components/invalidation/impl/invalidator_registrar_unittest.cc b/components/invalidation/impl/invalidator_registrar_unittest.cc
index 36216bc..4a8541a 100644
--- a/components/invalidation/impl/invalidator_registrar_unittest.cc
+++ b/components/invalidation/impl/invalidator_registrar_unittest.cc
@@ -36,14 +36,12 @@
 
   bool UpdateRegisteredIds(InvalidationHandler* handler,
                            const ObjectIdSet& ids) override {
-    TopicSet topics;
-    for (const auto& id : ids)
-      topics.insert(id.name());
-    return registrar_.UpdateRegisteredTopics(handler, topics);
+    return registrar_.UpdateRegisteredTopics(handler,
+                                             ConvertIdsToTopics(ids, handler));
   }
 
   bool UpdateRegisteredIds(InvalidationHandler* handler,
-                           const TopicSet& ids) override {
+                           const Topics& ids) override {
     NOTREACHED();
     return false;
   }
diff --git a/components/invalidation/impl/invalidator_registrar_with_memory.cc b/components/invalidation/impl/invalidator_registrar_with_memory.cc
index bca34ed..3354264f 100644
--- a/components/invalidation/impl/invalidator_registrar_with_memory.cc
+++ b/components/invalidation/impl/invalidator_registrar_with_memory.cc
@@ -20,9 +20,12 @@
 
 namespace {
 
-const char kTopicsToHandlerDeprecated[] = "invalidation.topics_to_handler";
+constexpr char kTopicsToHandlerDeprecated[] = "invalidation.topics_to_handler";
 
-const char kTopicsToHandler[] = "invalidation.per_sender_topics_to_handler";
+constexpr char kTopicsToHandler[] = "invalidation.per_sender_topics_to_handler";
+
+constexpr char kHandler[] = "handler";
+constexpr char kIsPublic[] = "is_public";
 
 // Added in M76.
 void MigratePrefs(PrefService* prefs, const std::string& sender_id) {
@@ -63,9 +66,20 @@
   }
   for (const auto& it : pref_data->DictItems()) {
     Topic topic = it.first;
-    std::string handler_name;
-    it.second.GetAsString(&handler_name);
-    handler_name_to_topics_map_[handler_name].insert(topic);
+    if (it.second.is_dict()) {
+      const auto* handler = it.second.FindDictKey(kHandler);
+      const auto* is_public = it.second.FindDictKey(kIsPublic);
+      if (!handler || !is_public) {
+        continue;
+      }
+      handler_name_to_topics_map_[handler->GetString()].emplace(
+          topic, TopicMetadata{is_public->GetBool()});
+    } else if (it.second.is_string()) {
+      std::string handler_name;
+      it.second.GetAsString(&handler_name);
+      handler_name_to_topics_map_[handler_name].emplace(topic,
+                                                        TopicMetadata{false});
+    }
   }
 }
 
@@ -73,19 +87,16 @@
 
 bool InvalidatorRegistrarWithMemory::UpdateRegisteredTopics(
     InvalidationHandler* handler,
-    const TopicSet& topics) {
-  TopicSet old_topics = GetRegisteredTopics(handler);
+    const Topics& topics) {
+  Topics old_topics = GetRegisteredTopics(handler);
   bool success = InvalidatorRegistrar::UpdateRegisteredTopics(handler, topics);
   if (!InvalidatorRegistrar::IsHandlerRegistered(handler)) {
     return success;
   }
 
-  TopicSet to_unregister;
   DictionaryPrefUpdate update(local_state_, kTopicsToHandler);
   base::Value* pref_data = update->FindDictKey(sender_id_);
-  std::set_difference(old_topics.begin(), old_topics.end(), topics.begin(),
-                      topics.end(),
-                      std::inserter(to_unregister, to_unregister.begin()));
+  auto to_unregister = FindRemovedTopics(old_topics, topics);
   if (!to_unregister.empty()) {
     for (const auto& topic : to_unregister) {
       pref_data->RemoveKey(topic);
@@ -95,13 +106,16 @@
 
   for (const auto& topic : topics) {
     handler_name_to_topics_map_[handler->GetOwnerName()].insert(topic);
-    pref_data->SetKey(topic, base::Value(handler->GetOwnerName()));
+    base::DictionaryValue handler_pref;
+    handler_pref.SetStringKey(kHandler, handler->GetOwnerName());
+    handler_pref.SetBoolKey(kIsPublic, topic.second.is_public);
+    pref_data->SetKey(topic.first, std::move(handler_pref));
   }
   return success;
 }
 
-TopicSet InvalidatorRegistrarWithMemory::GetAllRegisteredIds() const {
-  TopicSet registered_topics;
+Topics InvalidatorRegistrarWithMemory::GetAllRegisteredIds() const {
+  Topics registered_topics;
   for (const auto& handler_to_topic : handler_name_to_topics_map_) {
     registered_topics.insert(handler_to_topic.second.begin(),
                              handler_to_topic.second.end());
@@ -122,7 +136,7 @@
   for (const auto& handler_to_topics : handler_name_to_topics_map_) {
     const std::string& handler = handler_to_topics.first;
     for (const auto& topic : handler_to_topics.second) {
-      return_value.SetString("InvalidatorRegistrarWithMemory." + topic,
+      return_value.SetString("InvalidatorRegistrarWithMemory." + topic.first,
                              handler);
     }
   }
diff --git a/components/invalidation/impl/invalidator_registrar_with_memory.h b/components/invalidation/impl/invalidator_registrar_with_memory.h
index 85aae59b..4c3c672 100644
--- a/components/invalidation/impl/invalidator_registrar_with_memory.h
+++ b/components/invalidation/impl/invalidator_registrar_with_memory.h
@@ -22,7 +22,6 @@
 
 namespace syncer {
 
-using HandlerNameTopicsMap = std::map<std::string, TopicSet>;
 
 // A helper class for implementations of the Invalidator interface.  It helps
 // keep track of registered handlers and which object ID registrations are
@@ -45,21 +44,22 @@
   // for at most one handler. If topic is already registered function returns
   // false.
   bool UpdateRegisteredTopics(InvalidationHandler* handler,
-                              const TopicSet& topics) override
-      WARN_UNUSED_RESULT;
+                              const Topics& topics) override WARN_UNUSED_RESULT;
 
   // void UnregisterHandler(InvalidationHandler* handler) override;
   // void RegisterHandler(InvalidationHandler* handler) override;
 
   // Returns the set of all IDs that are registered to some handler (even
   // handlers that have been unregistered).
-  TopicSet GetAllRegisteredIds() const override;
+  Topics GetAllRegisteredIds() const override;
 
   void RequestDetailedStatus(
       base::RepeatingCallback<void(const base::DictionaryValue&)> callback)
       const;
 
  private:
+  using HandlerNameTopicsMap = std::map<std::string, Topics>;
+
   // Generate a Dictionary with all the debugging information.
   base::DictionaryValue CollectDebugData() const;
 
diff --git a/components/invalidation/impl/non_blocking_invalidator.cc b/components/invalidation/impl/non_blocking_invalidator.cc
index dfb56a3..2ced69e 100644
--- a/components/invalidation/impl/non_blocking_invalidator.cc
+++ b/components/invalidation/impl/non_blocking_invalidator.cc
@@ -273,12 +273,6 @@
   return true;
 }
 
-bool NonBlockingInvalidator::UpdateRegisteredIds(InvalidationHandler* handler,
-                                                 const TopicSet& ids) {
-  NOTREACHED();
-  return false;
-}
-
 void NonBlockingInvalidator::UnregisterHandler(InvalidationHandler* handler) {
   DCHECK(parent_task_runner_->BelongsToCurrentThread());
   registrar_.UnregisterHandler(handler);
diff --git a/components/invalidation/impl/non_blocking_invalidator.h b/components/invalidation/impl/non_blocking_invalidator.h
index d5d30a9..02d8299 100644
--- a/components/invalidation/impl/non_blocking_invalidator.h
+++ b/components/invalidation/impl/non_blocking_invalidator.h
@@ -62,8 +62,6 @@
   void RegisterHandler(InvalidationHandler* handler) override;
   bool UpdateRegisteredIds(InvalidationHandler* handler,
                            const ObjectIdSet& ids) override;
-  bool UpdateRegisteredIds(InvalidationHandler* handler,
-                           const TopicSet& ids) override;
   void UnregisterHandler(InvalidationHandler* handler) override;
   InvalidatorState GetInvalidatorState() const override;
   void UpdateCredentials(const std::string& email,
diff --git a/components/invalidation/impl/per_user_topic_registration_manager.cc b/components/invalidation/impl/per_user_topic_registration_manager.cc
index 83f1edf..5fce914 100644
--- a/components/invalidation/impl/per_user_topic_registration_manager.cc
+++ b/components/invalidation/impl/per_user_topic_registration_manager.cc
@@ -142,7 +142,8 @@
 struct PerUserTopicRegistrationManager::RegistrationEntry {
   RegistrationEntry(const Topic& id,
                     SubscriptionFinishedCallback completion_callback,
-                    PerUserTopicRegistrationRequest::RequestType type);
+                    PerUserTopicRegistrationRequest::RequestType type,
+                    bool topic_is_public = false);
   ~RegistrationEntry();
 
   void RegistrationFinished(const Status& code,
@@ -151,6 +152,7 @@
 
   // The object for which this is the status.
   const Topic topic;
+  const bool topic_is_public;
   SubscriptionFinishedCallback completion_callback;
   PerUserTopicRegistrationRequest::RequestType type;
 
@@ -165,8 +167,10 @@
 PerUserTopicRegistrationManager::RegistrationEntry::RegistrationEntry(
     const Topic& topic,
     SubscriptionFinishedCallback completion_callback,
-    PerUserTopicRegistrationRequest::RequestType type)
+    PerUserTopicRegistrationRequest::RequestType type,
+    bool topic_is_public)
     : topic(topic),
+      topic_is_public(topic_is_public),
       completion_callback(std::move(completion_callback)),
       type(type),
       request_backoff_(&kBackoffPolicy) {}
@@ -234,23 +238,24 @@
 }
 
 void PerUserTopicRegistrationManager::UpdateRegisteredTopics(
-    const TopicSet& topics,
+    const Topics& topics,
     const std::string& instance_id_token) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   token_ = instance_id_token;
   DropAllSavedRegistrationsOnTokenChange(instance_id_token);
   for (const auto& topic : topics) {
     // If id isn't registered, schedule the registration.
-    if (topic_to_private_topic_.find(topic) == topic_to_private_topic_.end()) {
-      auto it = registration_statuses_.find(topic);
+    if (topic_to_private_topic_.find(topic.first) ==
+        topic_to_private_topic_.end()) {
+      auto it = registration_statuses_.find(topic.first);
       if (it != registration_statuses_.end())
         it->second->Cancel();
-      registration_statuses_[topic] = std::make_unique<RegistrationEntry>(
-          topic,
+      registration_statuses_[topic.first] = std::make_unique<RegistrationEntry>(
+          topic.first,
           base::BindOnce(
               &PerUserTopicRegistrationManager::RegistrationFinishedForTopic,
               base::Unretained(this)),
-          PerUserTopicRegistrationRequest::SUBSCRIBE);
+          PerUserTopicRegistrationRequest::SUBSCRIBE, topic.second.is_public);
     }
   }
 
@@ -303,6 +308,7 @@
                                 "Bearer %s", access_token_.c_str()))
                             .SetProjectId(project_id_)
                             .SetType(it->second->type)
+                            .SetTopicIsPublic(it->second->topic_is_public)
                             .Build();
   it->second->request->Start(
       base::BindOnce(&PerUserTopicRegistrationManager::RegistrationEntry::
diff --git a/components/invalidation/impl/per_user_topic_registration_manager.h b/components/invalidation/impl/per_user_topic_registration_manager.h
index 564e75ea..a47158e 100644
--- a/components/invalidation/impl/per_user_topic_registration_manager.h
+++ b/components/invalidation/impl/per_user_topic_registration_manager.h
@@ -62,7 +62,7 @@
 
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
-  virtual void UpdateRegisteredTopics(const TopicSet& ids,
+  virtual void UpdateRegisteredTopics(const Topics& ids,
                                       const std::string& token);
 
   virtual void Init();
diff --git a/components/invalidation/impl/per_user_topic_registration_manager_unittest.cc b/components/invalidation/impl/per_user_topic_registration_manager_unittest.cc
index 64dfd0cb..e1496ab3 100644
--- a/components/invalidation/impl/per_user_topic_registration_manager_unittest.cc
+++ b/components/invalidation/impl/per_user_topic_registration_manager_unittest.cc
@@ -50,17 +50,25 @@
   return name;
 }
 
-TopicSet GetSequenceOfTopicsStartingAt(size_t start, size_t count) {
-  TopicSet ids;
+Topics GetSequenceOfTopicsStartingAt(size_t start, size_t count) {
+  Topics ids;
   for (size_t i = start; i < start + count; ++i)
-    ids.insert(IndexToName(i));
+    ids.emplace(IndexToName(i), TopicMetadata{false});
   return ids;
 }
 
-TopicSet GetSequenceOfTopics(size_t count) {
+Topics GetSequenceOfTopics(size_t count) {
   return GetSequenceOfTopicsStartingAt(0, count);
 }
 
+TopicSet TopicSetFromTopics(const Topics& topics) {
+  TopicSet topic_set;
+  for (auto& topic : topics) {
+    topic_set.insert(topic.first);
+  }
+  return topic_set;
+}
+
 network::ResourceResponseHead CreateHeadersForTest(int responce_code) {
   network::ResourceResponseHead head;
   head.headers = new net::HttpResponseHeaders(base::StringPrintf(
@@ -188,7 +196,7 @@
 
 TEST_F(PerUserTopicRegistrationManagerTest,
        EmptyPrivateTopicShouldNotUpdateRegisteredTopics) {
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   auto per_user_topic_registration_manager = BuildRegistrationManager();
 
@@ -212,7 +220,7 @@
 }
 
 TEST_F(PerUserTopicRegistrationManagerTest, ShouldUpdateRegisteredTopics) {
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   auto per_user_topic_registration_manager = BuildRegistrationManager();
   ASSERT_TRUE(per_user_topic_registration_manager->GetRegisteredIds().empty());
@@ -223,20 +231,21 @@
       ids, kFakeInstanceIdToken);
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_EQ(ids, per_user_topic_registration_manager->GetRegisteredIds());
+  EXPECT_EQ(TopicSetFromTopics(ids),
+            per_user_topic_registration_manager->GetRegisteredIds());
   EXPECT_TRUE(
       per_user_topic_registration_manager->HaveAllRequestsFinishedForTest());
 
   for (const auto& id : ids) {
     const base::Value* topics = GetRegisteredTopics();
     const base::Value* private_topic_value =
-        topics->FindKeyOfType(id, base::Value::Type::STRING);
+        topics->FindKeyOfType(id.first, base::Value::Type::STRING);
     ASSERT_NE(private_topic_value, nullptr);
   }
 }
 
 TEST_F(PerUserTopicRegistrationManagerTest, ShouldRepeatRequestsOnFailure) {
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   auto per_user_topic_registration_manager = BuildRegistrationManager();
   ASSERT_TRUE(per_user_topic_registration_manager->GetRegisteredIds().empty());
@@ -255,7 +264,7 @@
 }
 
 TEST_F(PerUserTopicRegistrationManagerTest, ShouldRepeatRequestsOnForbidden) {
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   auto per_user_topic_registration_manager = BuildRegistrationManager();
   ASSERT_TRUE(per_user_topic_registration_manager->GetRegisteredIds().empty());
@@ -275,7 +284,7 @@
 
 TEST_F(PerUserTopicRegistrationManagerTest,
        ShouldDisableIdsAndDeleteFromPrefs) {
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   AddCorrectSubscriptionResponce();
 
@@ -285,14 +294,15 @@
   per_user_topic_registration_manager->UpdateRegisteredTopics(
       ids, kFakeInstanceIdToken);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(ids, per_user_topic_registration_manager->GetRegisteredIds());
+  EXPECT_EQ(TopicSetFromTopics(ids),
+            per_user_topic_registration_manager->GetRegisteredIds());
 
   // Disable some ids.
-  TopicSet disabled_ids = GetSequenceOfTopics(3);
-  TopicSet enabled_ids =
+  auto disabled_ids = GetSequenceOfTopics(3);
+  auto enabled_ids =
       GetSequenceOfTopicsStartingAt(3, kInvalidationObjectIdsCount - 3);
   for (const auto& id : disabled_ids)
-    AddCorrectUnSubscriptionResponceForTopic(id);
+    AddCorrectUnSubscriptionResponceForTopic(id.first);
 
   per_user_topic_registration_manager->UpdateRegisteredTopics(
       enabled_ids, kFakeInstanceIdToken);
@@ -301,7 +311,7 @@
   // ids were disabled, check that they're not in the prefs.
   for (const auto& id : disabled_ids) {
     const base::Value* topics = GetRegisteredTopics();
-    const base::Value* private_topic_value = topics->FindKey(id);
+    const base::Value* private_topic_value = topics->FindKey(id.first);
     ASSERT_EQ(private_topic_value, nullptr);
   }
 
@@ -309,14 +319,14 @@
   for (const auto& id : enabled_ids) {
     const base::Value* topics = GetRegisteredTopics();
     const base::Value* private_topic_value =
-        topics->FindKeyOfType(id, base::Value::Type::STRING);
+        topics->FindKeyOfType(id.first, base::Value::Type::STRING);
     ASSERT_NE(private_topic_value, nullptr);
   }
 }
 
 TEST_F(PerUserTopicRegistrationManagerTest,
        ShouldDropSavedTopicsOnTokenChange) {
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   auto per_user_topic_registration_manager = BuildRegistrationManager();
 
@@ -328,12 +338,13 @@
       ids, kFakeInstanceIdToken);
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_EQ(ids, per_user_topic_registration_manager->GetRegisteredIds());
+  EXPECT_EQ(TopicSetFromTopics(ids),
+            per_user_topic_registration_manager->GetRegisteredIds());
 
   for (const auto& id : ids) {
     const base::Value* topics = GetRegisteredTopics();
     const base::Value* private_topic_value =
-        topics->FindKeyOfType(id, base::Value::Type::STRING);
+        topics->FindKeyOfType(id.first, base::Value::Type::STRING);
     ASSERT_NE(private_topic_value, nullptr);
     std::string private_topic;
     private_topic_value->GetAsString(&private_topic);
@@ -354,12 +365,13 @@
   EXPECT_EQ(token, *pref_service()
                         ->GetDictionary(kActiveRegistrationTokens)
                         ->FindStringKey(kProjectId));
-  EXPECT_EQ(ids, per_user_topic_registration_manager->GetRegisteredIds());
+  EXPECT_EQ(TopicSetFromTopics(ids),
+            per_user_topic_registration_manager->GetRegisteredIds());
 
   for (const auto& id : ids) {
     const base::Value* topics = GetRegisteredTopics();
     const base::Value* private_topic_value =
-        topics->FindKeyOfType(id, base::Value::Type::STRING);
+        topics->FindKeyOfType(id.first, base::Value::Type::STRING);
     ASSERT_NE(private_topic_value, nullptr);
     std::string private_topic;
     private_topic_value->GetAsString(&private_topic);
@@ -369,7 +381,7 @@
 
 TEST_F(PerUserTopicRegistrationManagerTest,
        ShouldDeletTopicsFromPrefsWhenRequestFails) {
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   AddCorrectSubscriptionResponce();
 
@@ -379,11 +391,12 @@
   per_user_topic_registration_manager->UpdateRegisteredTopics(
       ids, kFakeInstanceIdToken);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(ids, per_user_topic_registration_manager->GetRegisteredIds());
+  EXPECT_EQ(TopicSetFromTopics(ids),
+            per_user_topic_registration_manager->GetRegisteredIds());
 
   // Disable some ids.
-  TopicSet disabled_ids = GetSequenceOfTopics(3);
-  TopicSet enabled_ids =
+  auto disabled_ids = GetSequenceOfTopics(3);
+  auto enabled_ids =
       GetSequenceOfTopicsStartingAt(3, kInvalidationObjectIdsCount - 3);
   // Without configuring the responce, the request will not happen.
   per_user_topic_registration_manager->UpdateRegisteredTopics(
@@ -393,7 +406,7 @@
   // Ids should still be removed from prefs.
   for (const auto& id : disabled_ids) {
     const base::Value* topics = GetRegisteredTopics();
-    const base::Value* private_topic_value = topics->FindKey(id);
+    const base::Value* private_topic_value = topics->FindKey(id.first);
     ASSERT_EQ(private_topic_value, nullptr);
   }
 
@@ -401,7 +414,7 @@
   for (const auto& id : enabled_ids) {
     const base::Value* topics = GetRegisteredTopics();
     const base::Value* private_topic_value =
-        topics->FindKeyOfType(id, base::Value::Type::STRING);
+        topics->FindKeyOfType(id.first, base::Value::Type::STRING);
     ASSERT_NE(private_topic_value, nullptr);
   }
 }
@@ -413,7 +426,7 @@
   feature_list.InitAndDisableFeature(
       invalidation::switches::kFCMInvalidationsConservativeEnabling);
 
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   AddCorrectSubscriptionResponce();
 
@@ -423,12 +436,13 @@
   per_user_topic_registration_manager->UpdateRegisteredTopics(
       ids, kFakeInstanceIdToken);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(ids, per_user_topic_registration_manager->GetRegisteredIds());
+  EXPECT_EQ(TopicSetFromTopics(ids),
+            per_user_topic_registration_manager->GetRegisteredIds());
   EXPECT_EQ(observed_state(), SubscriptionChannelState::ENABLED);
 
   // Disable some ids.
-  TopicSet disabled_ids = GetSequenceOfTopics(3);
-  TopicSet enabled_ids =
+  auto disabled_ids = GetSequenceOfTopics(3);
+  auto enabled_ids =
       GetSequenceOfTopicsStartingAt(3, kInvalidationObjectIdsCount - 3);
   per_user_topic_registration_manager->UpdateRegisteredTopics(
       enabled_ids, kFakeInstanceIdToken);
@@ -450,7 +464,7 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(
       invalidation::switches::kFCMInvalidationsConservativeEnabling);
-  TopicSet ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
+  auto ids = GetSequenceOfTopics(kInvalidationObjectIdsCount);
 
   AddCorrectSubscriptionResponce();
 
@@ -460,12 +474,13 @@
   per_user_topic_registration_manager->UpdateRegisteredTopics(
       ids, kFakeInstanceIdToken);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(ids, per_user_topic_registration_manager->GetRegisteredIds());
+  EXPECT_EQ(TopicSetFromTopics(ids),
+            per_user_topic_registration_manager->GetRegisteredIds());
   EXPECT_EQ(observed_state(), SubscriptionChannelState::ENABLED);
 
   // Disable some ids.
-  TopicSet disabled_ids = GetSequenceOfTopics(3);
-  TopicSet enabled_ids =
+  auto disabled_ids = GetSequenceOfTopics(3);
+  auto enabled_ids =
       GetSequenceOfTopicsStartingAt(3, kInvalidationObjectIdsCount - 3);
   per_user_topic_registration_manager->UpdateRegisteredTopics(
       enabled_ids, kFakeInstanceIdToken);
diff --git a/components/invalidation/impl/per_user_topic_registration_request.cc b/components/invalidation/impl/per_user_topic_registration_request.cc
index 336ab437..423690bd 100644
--- a/components/invalidation/impl/per_user_topic_registration_request.cc
+++ b/components/invalidation/impl/per_user_topic_registration_request.cc
@@ -81,13 +81,6 @@
   }
 }
 
-bool IsPublicTopic(const base::StringPiece topic) {
-  // Team Drive topics are public.
-  // TODO(crbug.com/912281): Replace with plumbing this through from the
-  // InvalidationHandler.
-  return topic.starts_with("team-drive-");
-}
-
 }  // namespace
 
 namespace syncer {
@@ -223,7 +216,7 @@
       break;
     case UNSUBSCRIBE:
       std::string public_param;
-      if (IsPublicTopic(topic_)) {
+      if (topic_is_public_) {
         public_param = "subscription.is_public=true&";
       }
       url = base::StringPrintf(
@@ -292,6 +285,13 @@
   return *this;
 }
 
+PerUserTopicRegistrationRequest::Builder&
+PerUserTopicRegistrationRequest::Builder::SetTopicIsPublic(
+    bool topic_is_public) {
+  topic_is_public_ = topic_is_public;
+  return *this;
+}
+
 HttpRequestHeaders PerUserTopicRegistrationRequest::Builder::BuildHeaders()
     const {
   HttpRequestHeaders headers;
@@ -305,7 +305,7 @@
   base::DictionaryValue request;
 
   request.SetString("public_topic_name", topic_);
-  if (IsPublicTopic(topic_)) {
+  if (topic_is_public_) {
     request.SetBoolean("is_public", true);
   }
 
diff --git a/components/invalidation/impl/per_user_topic_registration_request.h b/components/invalidation/impl/per_user_topic_registration_request.h
index a04678e1..6083b22 100644
--- a/components/invalidation/impl/per_user_topic_registration_request.h
+++ b/components/invalidation/impl/per_user_topic_registration_request.h
@@ -50,6 +50,8 @@
 
     Builder& SetType(RequestType type);
 
+    Builder& SetTopicIsPublic(bool topic_is_public);
+
     enum RegistrationState { REGISTERED, UNREGISTERED };
 
    private:
@@ -68,6 +70,7 @@
     std::string scope_;
     std::string auth_header_;
     RequestType type_;
+    bool topic_is_public_ = false;
 
     DISALLOW_COPY_AND_ASSIGN(Builder);
   };
diff --git a/components/invalidation/impl/profile_identity_provider.cc b/components/invalidation/impl/profile_identity_provider.cc
index 2bda764..ff26ade 100644
--- a/components/invalidation/impl/profile_identity_provider.cc
+++ b/components/invalidation/impl/profile_identity_provider.cc
@@ -116,7 +116,7 @@
 }
 
 void ProfileIdentityProvider::OnRefreshTokenRemovedForAccount(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   ProcessRefreshTokenRemovalForAccount(account_id);
 }
 
diff --git a/components/invalidation/impl/profile_identity_provider.h b/components/invalidation/impl/profile_identity_provider.h
index 097034b..3bbfdc73 100644
--- a/components/invalidation/impl/profile_identity_provider.h
+++ b/components/invalidation/impl/profile_identity_provider.h
@@ -34,7 +34,8 @@
   // identity::IdentityManager::Observer:
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override;
 
  private:
   identity::IdentityManager* const identity_manager_;
diff --git a/components/invalidation/public/invalidation_handler.cc b/components/invalidation/public/invalidation_handler.cc
index 0a75e53d..1b0cbb0 100644
--- a/components/invalidation/public/invalidation_handler.cc
+++ b/components/invalidation/public/invalidation_handler.cc
@@ -12,4 +12,8 @@
 InvalidationHandler::~InvalidationHandler() {
 }
 
+bool InvalidationHandler::IsPublicTopic(const Topic& topic) const {
+  return false;
+}
+
 }  // namespace syncer
diff --git a/components/invalidation/public/invalidation_handler.h b/components/invalidation/public/invalidation_handler.h
index 0e247cd..e0d5a997 100644
--- a/components/invalidation/public/invalidation_handler.h
+++ b/components/invalidation/public/invalidation_handler.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "components/invalidation/public/invalidation_export.h"
+#include "components/invalidation/public/invalidation_util.h"
 #include "components/invalidation/public/invalidator_state.h"
 
 namespace syncer {
@@ -34,6 +35,8 @@
   // where the reflection blocking logic is based on it.
   virtual void OnInvalidatorClientIdChange(const std::string& client_id) {}
 
+  virtual bool IsPublicTopic(const Topic& topic) const;
+
  protected:
   virtual ~InvalidationHandler();
 };
diff --git a/components/invalidation/public/invalidation_util.cc b/components/invalidation/public/invalidation_util.cc
index 46abe1f..4bcfbc83 100644
--- a/components/invalidation/public/invalidation_util.cc
+++ b/components/invalidation/public/invalidation_util.cc
@@ -12,6 +12,7 @@
 #include "base/json/json_writer.h"
 #include "base/values.h"
 #include "components/invalidation/public/invalidation.h"
+#include "components/invalidation/public/invalidation_handler.h"
 #include "components/invalidation/public/invalidation_object_id.h"
 #include "google/cacheinvalidation/include/types.h"
 #include "google/cacheinvalidation/types.pb.h"
@@ -51,6 +52,10 @@
   return a.version() < b.version();
 }
 
+bool operator==(const TopicMetadata& lhs, const TopicMetadata& rhs) {
+  return lhs.is_public == rhs.is_public;
+}
+
 std::unique_ptr<base::DictionaryValue> ObjectIdToValue(
     const invalidation::ObjectId& object_id) {
   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue());
@@ -138,10 +143,10 @@
   return str;
 }
 
-TopicSet ConvertIdsToTopics(ObjectIdSet ids) {
-  TopicSet topics;
+Topics ConvertIdsToTopics(ObjectIdSet ids, InvalidationHandler* handler) {
+  Topics topics;
   for (const auto& id : ids)
-    topics.insert(id.name());
+    topics.emplace(id.name(), TopicMetadata{handler->IsPublicTopic(id.name())});
   return topics;
 }
 
@@ -152,6 +157,13 @@
   return ids;
 }
 
+ObjectIdSet ConvertTopicsToIds(Topics topics) {
+  ObjectIdSet ids;
+  for (const auto& topic : topics)
+    ids.insert(invalidation::ObjectId(kDeprecatedSource, topic.first));
+  return ids;
+}
+
 invalidation::ObjectId ConvertTopicToId(const Topic& topic) {
   return invalidation::ObjectId(kDeprecatedSource, topic);
 }
@@ -180,4 +192,34 @@
   return HandlerOwnerType::kUnknown;
 }
 
+const Topic* FindMatchingTopic(const Topics& lhs, const Topics& rhs) {
+  for (auto lhs_it = lhs.begin(), rhs_it = rhs.begin();
+       lhs_it != lhs.end() && rhs_it != rhs.end();) {
+    if (lhs_it->first == rhs_it->first) {
+      return &lhs_it->first;
+    } else if (lhs_it->first < rhs_it->first) {
+      ++lhs_it;
+    } else {
+      ++rhs_it;
+    }
+  }
+  return nullptr;
+}
+
+std::vector<Topic> FindRemovedTopics(const Topics& lhs, const Topics& rhs) {
+  std::vector<Topic> result;
+  for (auto lhs_it = lhs.begin(), rhs_it = rhs.begin(); lhs_it != lhs.end();) {
+    if (rhs_it == rhs.end() || lhs_it->first < rhs_it->first) {
+      result.push_back(lhs_it->first);
+      ++lhs_it;
+    } else if (lhs_it->first == rhs_it->first) {
+      ++lhs_it;
+      ++rhs_it;
+    } else {
+      ++rhs_it;
+    }
+  }
+  return result;
+}
+
 }  // namespace syncer
diff --git a/components/invalidation/public/invalidation_util.h b/components/invalidation/public/invalidation_util.h
index e566b72..4e1dd79 100644
--- a/components/invalidation/public/invalidation_util.h
+++ b/components/invalidation/public/invalidation_util.h
@@ -45,6 +45,7 @@
 };
 
 class Invalidation;
+class InvalidationHandler;
 
 // TODO(https://crbug.com/842655): Convert Repeating to Once.
 using ParseJSONCallback = base::RepeatingCallback<void(
@@ -71,6 +72,15 @@
 // It should be std::set, since std::set_difference is used for it.
 using TopicSet = std::set<std::string>;
 
+INVALIDATION_EXPORT struct TopicMetadata {
+  // Whether the topic is public.
+  bool is_public;
+};
+
+INVALIDATION_EXPORT bool operator==(const TopicMetadata&, const TopicMetadata&);
+
+using Topics = std::map<std::string, TopicMetadata>;
+
 // Caller owns the returned DictionaryValue.
 std::unique_ptr<base::DictionaryValue> ObjectIdToValue(
     const invalidation::ObjectId& object_id);
@@ -108,12 +118,20 @@
 INVALIDATION_EXPORT std::string InvalidationObjectIdToString(
     const invalidation::InvalidationObjectId& object_id);
 
-TopicSet ConvertIdsToTopics(ObjectIdSet ids);
 ObjectIdSet ConvertTopicsToIds(TopicSet topics);
+ObjectIdSet ConvertTopicsToIds(Topics topics);
 invalidation::ObjectId ConvertTopicToId(const Topic& topic);
+Topics ConvertIdsToTopics(ObjectIdSet ids, InvalidationHandler* handler);
 
 HandlerOwnerType OwnerNameToHandlerType(const std::string& owner_name);
 
+// Returns a |Topic| contained within both |lhs| and |rhs| or null if |lhs| and
+// |rhs| are disjoint.
+const Topic* FindMatchingTopic(const Topics& lhs, const Topics& rhs);
+
+// Returns a vector of Topics in |lhs| but not |rhs|.
+std::vector<Topic> FindRemovedTopics(const Topics& lhs, const Topics& rhs);
+
 }  // namespace syncer
 
 #endif  // COMPONENTS_INVALIDATION_PUBLIC_INVALIDATION_UTIL_H_
diff --git a/components/invalidation/public/topic_invalidation_map.cc b/components/invalidation/public/topic_invalidation_map.cc
index 2200c01e..a62faaa 100644
--- a/components/invalidation/public/topic_invalidation_map.cc
+++ b/components/invalidation/public/topic_invalidation_map.cc
@@ -34,12 +34,12 @@
 }
 
 TopicInvalidationMap TopicInvalidationMap::GetSubsetWithTopics(
-    const TopicSet& topics) const {
+    const Topics& topics) const {
   TopicToListMap new_map;
   for (const auto& topic : topics) {
-    auto lookup = map_.find(topic);
+    auto lookup = map_.find(topic.first);
     if (lookup != map_.end()) {
-      new_map[topic] = lookup->second;
+      new_map[topic.first] = lookup->second;
     }
   }
   return TopicInvalidationMap(new_map);
diff --git a/components/invalidation/public/topic_invalidation_map.h b/components/invalidation/public/topic_invalidation_map.h
index fee3dd0..9406589 100644
--- a/components/invalidation/public/topic_invalidation_map.h
+++ b/components/invalidation/public/topic_invalidation_map.h
@@ -39,7 +39,7 @@
 
   // Returns a new map containing the subset of invaliations from this map
   // whose IDs were in the specified |ids| set.
-  TopicInvalidationMap GetSubsetWithTopics(const TopicSet& ids) const;
+  TopicInvalidationMap GetSubsetWithTopics(const Topics& ids) const;
 
   // Returns the subset of invalidations with IDs matching |id|.
   const SingleObjectInvalidationSet& ForTopic(Topic id) const;
diff --git a/components/language/core/common/language_experiments.cc b/components/language/core/common/language_experiments.cc
index 3d20c102..5e86dfe6 100644
--- a/components/language/core/common/language_experiments.cc
+++ b/components/language/core/common/language_experiments.cc
@@ -23,7 +23,9 @@
                                              base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kUseFluentLanguageModel{"UseFluentLanguageModel",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
-
+// Base feature for Translate desktop UI experiment
+const base::Feature kUseButtonTranslateBubbleUI{
+    "UseButtonTranslateBubbleUI", base::FEATURE_DISABLED_BY_DEFAULT};
 // Params:
 const char kBackoffThresholdKey[] = "backoff_threshold";
 const char kOverrideModelKey[] = "override_model";
@@ -32,6 +34,12 @@
 const char kOverrideModelGeoValue[] = "geo";
 const char kOverrideModelDefaultValue[] = "default";
 
+// Params for Translate Desktop UI experiment
+const char kTranslateUIBubbleKey[] = "translate_ui_bubble_style";
+const char kTranslateUIBubbleButtonValue[] = "button";
+const char kTranslateUIBubbleTabValue[] = "tab";
+const char kTranslateUIBubbleButtonGM2Value[] = "button_gm2";
+
 OverrideLanguageModel GetOverrideLanguageModel() {
   std::map<std::string, std::string> params;
   bool should_override_model = base::GetFieldTrialParamsByFeature(
@@ -93,4 +101,25 @@
   return force_trigger_count >= threshold;
 }
 
+TranslateUIBubbleModel GetTranslateUIBubbleModel() {
+  std::map<std::string, std::string> params;
+  if (base::GetFieldTrialParamsByFeature(language::kUseButtonTranslateBubbleUI,
+                                         &params)) {
+    if (params[language::kTranslateUIBubbleKey] ==
+        language::kTranslateUIBubbleButtonValue) {
+      return language::TranslateUIBubbleModel::BUTTON;
+    } else if (params[language::kTranslateUIBubbleKey] ==
+               language::kTranslateUIBubbleTabValue) {
+      return language::TranslateUIBubbleModel::TAB;
+    } else if (params[language::kTranslateUIBubbleKey] ==
+               language::kTranslateUIBubbleButtonGM2Value) {
+      return language::TranslateUIBubbleModel::BUTTON_GM2;
+    } else {
+      return language::TranslateUIBubbleModel::DEFAULT;
+    }
+  } else {
+    return language::TranslateUIBubbleModel::DEFAULT;
+  }
+}
+
 }  // namespace language
diff --git a/components/language/core/common/language_experiments.h b/components/language/core/common/language_experiments.h
index fe0354cf..529b28e 100644
--- a/components/language/core/common/language_experiments.h
+++ b/components/language/core/common/language_experiments.h
@@ -33,6 +33,15 @@
 extern const char kOverrideModelDefaultValue[];
 extern const char kBackoffThresholdKey[];
 
+// This feature uses the existing UI for translate bubble.
+extern const base::Feature kUseButtonTranslateBubbleUI;
+
+// These feature params controls what translate bubble UI to display.
+extern const char kTranslateUIBubbleKey[];
+extern const char kTranslateUIBubbleButtonValue[];
+extern const char kTranslateUIBubbleTabValue[];
+extern const char kTranslateUIBubbleButtonGM2Value[];
+
 enum class OverrideLanguageModel {
   DEFAULT,
   FLUENT,
@@ -40,6 +49,14 @@
   GEO,
 };
 
+// Options for the translate desktop UI experiment.
+enum class TranslateUIBubbleModel {
+  DEFAULT,
+  BUTTON,
+  TAB,
+  BUTTON_GM2,
+};
+
 // Returns which language model to use depending on the state of all Language
 // experiments.
 OverrideLanguageModel GetOverrideLanguageModel();
@@ -60,6 +77,9 @@
 // should stop being taken into account.
 bool IsForceTriggerBackoffThresholdReached(int force_trigger_count);
 
+// Returns which translate bubble UI to use depending on selection in
+// kTranslateUIBubbleKey.
+TranslateUIBubbleModel GetTranslateUIBubbleModel();
 }  // namespace language
 
 #endif  // COMPONENTS_LANGUAGE_CORE_COMMON_LANGUAGE_EXPERIMENTS_H_
diff --git a/components/offline_pages/core/BUILD.gn b/components/offline_pages/core/BUILD.gn
index ffcc393..a247f833 100644
--- a/components/offline_pages/core/BUILD.gn
+++ b/components/offline_pages/core/BUILD.gn
@@ -142,6 +142,11 @@
     "//base",
     "//components/version_info",
   ]
+
+  defines = []
+  if (defined(notouch_build) && notouch_build) {
+    defines += [ "DISABLE_OFFLINE_PAGES_TOUCHLESS" ]
+  }
 }
 
 source_set("unit_tests") {
diff --git a/components/offline_pages/core/client_policy_controller_unittest.cc b/components/offline_pages/core/client_policy_controller_unittest.cc
index bc8950d4..11df089 100644
--- a/components/offline_pages/core/client_policy_controller_unittest.cc
+++ b/components/offline_pages/core/client_policy_controller_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "base/stl_util.h"
 #include "components/offline_pages/core/client_namespace_constants.h"
+#include "components/offline_pages/core/offline_page_feature.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using LifetimeType = offline_pages::LifetimePolicy::LifetimeType;
@@ -213,7 +214,7 @@
   EXPECT_TRUE(isTemporary(policy));
   EXPECT_TRUE(controller()->IsRemovedOnCacheReset(kSuggestedArticlesNamespace));
   ExpectRemovedOnCacheReset(kSuggestedArticlesNamespace, true);
-  ExpectDownloadSupport(kSuggestedArticlesNamespace, true);
+  ExpectDownloadSupport(kSuggestedArticlesNamespace, IsOfflinePagesEnabled());
   ExpectUserRequestedDownloadSupport(kSuggestedArticlesNamespace, false);
   ExpectRecentTab(kSuggestedArticlesNamespace, false);
   ExpectRestrictedToTabFromClientId(kSuggestedArticlesNamespace, false);
diff --git a/components/offline_pages/core/offline_page_feature.cc b/components/offline_pages/core/offline_page_feature.cc
index a21206a..b6c93de 100644
--- a/components/offline_pages/core/offline_page_feature.cc
+++ b/components/offline_pages/core/offline_page_feature.cc
@@ -83,7 +83,8 @@
 }
 
 bool IsPrefetchingOfflinePagesEnabled() {
-  return base::FeatureList::IsEnabled(kPrefetchingOfflinePagesFeature);
+  return IsOfflinePagesEnabled() &&
+         base::FeatureList::IsEnabled(kPrefetchingOfflinePagesFeature);
 }
 
 bool IsOfflinePagesLoadSignalCollectingEnabled() {
@@ -140,7 +141,8 @@
 }
 
 bool IsOfflineIndicatorFeatureEnabled() {
-  return base::FeatureList::IsEnabled(kOfflineIndicatorFeature);
+  return IsOfflinePagesEnabled() &&
+         base::FeatureList::IsEnabled(kOfflineIndicatorFeature);
 }
 
 bool IsOfflineIndicatorAlwaysHttpProbeEnabled() {
@@ -151,4 +153,12 @@
   return base::FeatureList::IsEnabled(kOnTheFlyMhtmlHashComputationFeature);
 }
 
+bool IsOfflinePagesEnabled() {
+#if defined(DISABLE_OFFLINE_PAGES_TOUCHLESS)
+  return false;
+#else
+  return true;
+#endif  // defined(DISABLE_OFFLINE_PAGES_TOUCHLESS)
+}
+
 }  // namespace offline_pages
diff --git a/components/offline_pages/core/offline_page_feature.h b/components/offline_pages/core/offline_page_feature.h
index 4ca41a8..0897ce49 100644
--- a/components/offline_pages/core/offline_page_feature.h
+++ b/components/offline_pages/core/offline_page_feature.h
@@ -101,6 +101,9 @@
 // calculating their content digests in one step.
 bool IsOnTheFlyMhtmlHashComputationEnabled();
 
+// Returns true if offline pages as a whole is enabled.
+bool IsOfflinePagesEnabled();
+
 }  // namespace offline_pages
 
 #endif  // COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_FEATURE_H_
diff --git a/components/offline_pages/core/offline_page_feature_unittest.cc b/components/offline_pages/core/offline_page_feature_unittest.cc
index cdaf1f0c..bac928a 100644
--- a/components/offline_pages/core/offline_page_feature_unittest.cc
+++ b/components/offline_pages/core/offline_page_feature_unittest.cc
@@ -44,7 +44,8 @@
 
 TEST(OfflinePageFeatureTest, OfflinePagesPrefetching) {
   // Enabled by default.
-  EXPECT_TRUE(offline_pages::IsPrefetchingOfflinePagesEnabled());
+  EXPECT_EQ(offline_pages::IsOfflinePagesEnabled(),
+            offline_pages::IsPrefetchingOfflinePagesEnabled());
 
   // Check if helper method works correctly when the features is disabled.
   base::test::ScopedFeatureList scoped_feature_list;
diff --git a/components/offline_pages/core/prefetch/BUILD.gn b/components/offline_pages/core/prefetch/BUILD.gn
index 620dcc3d..385ed002 100644
--- a/components/offline_pages/core/prefetch/BUILD.gn
+++ b/components/offline_pages/core/prefetch/BUILD.gn
@@ -215,8 +215,6 @@
   sources = [
     "generate_page_bundle_request_unittest.cc",
     "get_operation_request_unittest.cc",
-    "prefetch_dispatcher_impl_unittest.cc",
-    "prefetch_download_flow_unittest.cc",
     "prefetch_downloader_impl_unittest.cc",
     "prefetch_gcm_app_handler_unittest.cc",
     "prefetch_importer_impl_unittest.cc",
@@ -259,6 +257,7 @@
     "//components/download/public/background_service/test:test_support",
     "//components/gcm_driver/instance_id",
     "//components/image_fetcher/core:test_support",
+    "//components/offline_pages/buildflags",
     "//components/offline_pages/core",
     "//components/offline_pages/core:switches",
     "//components/offline_pages/core:test_support",
@@ -275,4 +274,15 @@
     "//testing/gtest",
     "//url",
   ]
+
+  defines = []
+
+  if (defined(notouch_build) && notouch_build) {
+    defines += [ "DISABLE_OFFLINE_PAGES_TOUCHLESS" ]
+  } else {
+    sources += [
+      "prefetch_dispatcher_impl_unittest.cc",
+      "prefetch_download_flow_unittest.cc",
+    ]
+  }
 }
diff --git a/components/offline_pages/core/prefetch/prefetch_prefs_unittest.cc b/components/offline_pages/core/prefetch/prefetch_prefs_unittest.cc
index 9758c0e..732783f 100644
--- a/components/offline_pages/core/prefetch/prefetch_prefs_unittest.cc
+++ b/components/offline_pages/core/prefetch/prefetch_prefs_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/offline_pages/core/prefetch/prefetch_prefs.h"
 #include "base/test/scoped_feature_list.h"
+#include "components/offline_pages/buildflags/buildflags.h"
 #include "components/offline_pages/core/offline_clock.h"
 #include "components/offline_pages/core/offline_page_feature.h"
 #include "components/offline_pages/core/test_scoped_offline_clock.h"
@@ -27,7 +28,12 @@
   prefetch_prefs::RegisterPrefs(prefs()->registry());
 }
 
-TEST_F(PrefetchPrefsTest, PrefetchingEnabled) {
+#if defined(DISABLE_OFFLINE_PAGES_TOUCHLESS)
+#define MAYBE_PrefetchingEnabled DISABLED_PrefetchingEnabled
+#else
+#define MAYBE_PrefetchingEnabled PrefetchingEnabled
+#endif
+TEST_F(PrefetchPrefsTest, MAYBE_PrefetchingEnabled) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(kPrefetchingOfflinePagesFeature);
   EXPECT_FALSE(prefetch_prefs::IsEnabled(prefs()));
@@ -104,7 +110,12 @@
   EXPECT_FALSE(prefetch_prefs::IsEnabledByServer(prefs()));
 }
 
-TEST_F(PrefetchPrefsTest, ForbiddenCheck) {
+#if defined(DISABLE_OFFLINE_PAGES_TOUCHLESS)
+#define MAYBE_ForbiddenCheck DISABLED_ForbiddenCheck
+#else
+#define MAYBE_ForbiddenCheck ForbiddenCheck
+#endif
+TEST_F(PrefetchPrefsTest, MAYBE_ForbiddenCheck) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(kPrefetchingOfflinePagesFeature);
 
@@ -135,7 +146,12 @@
   EXPECT_FALSE(prefetch_prefs::IsForbiddenCheckDue(prefs()));
 }
 
-TEST_F(PrefetchPrefsTest, FirstForbiddenCheck) {
+#if defined(DISABLE_OFFLINE_PAGES_TOUCHLESS)
+#define MAYBE_FirstForbiddenCheck DISABLED_FirstForbiddenCheck
+#else
+#define MAYBE_FirstForbiddenCheck FirstForbiddenCheck
+#endif
+TEST_F(PrefetchPrefsTest, MAYBE_FirstForbiddenCheck) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(kPrefetchingOfflinePagesFeature);
 
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc
index be0276a4..76f1a5b1 100644
--- a/components/password_manager/core/browser/password_manager.cc
+++ b/components/password_manager/core/browser/password_manager.cc
@@ -647,7 +647,7 @@
     password_manager::PasswordManagerDriver* driver,
     const PasswordForm& password_form) {
   if (IsNewFormParsingForSavingEnabled())
-    ProvisionallySaveForm(password_form.form_data, driver);
+    ProvisionallySaveForm(password_form.form_data, driver, false);
 
   ProvisionallySavePassword(password_form, driver);
 }
@@ -683,7 +683,7 @@
   }
 
   if (IsNewFormParsingForSavingEnabled())
-    ProvisionallySaveForm(password_form.form_data, driver);
+    ProvisionallySaveForm(password_form.form_data, driver, false);
 
   ProvisionallySavePassword(password_form, driver);
 
@@ -701,10 +701,10 @@
       !client_->GetStoreResultFilter()->ShouldSave(password_form))
     return;
 
-  std::unique_ptr<PasswordFormManagerInterface> manager = nullptr;
+  std::unique_ptr<PasswordFormManagerInterface> manager;
   if (IsNewFormParsingForSavingEnabled()) {
     NewPasswordFormManager* matched_manager =
-        ProvisionallySaveForm(password_form.form_data, driver);
+        ProvisionallySaveForm(password_form.form_data, driver, true);
     manager = matched_manager ? matched_manager->Clone() : nullptr;
   } else {
     manager = FindAndCloneMatchedPasswordFormManager(
@@ -915,7 +915,8 @@
 
 NewPasswordFormManager* PasswordManager::ProvisionallySaveForm(
     const FormData& submitted_form,
-    PasswordManagerDriver* driver) {
+    PasswordManagerDriver* driver,
+    bool is_manual_fallback) {
   std::unique_ptr<BrowserSavePasswordProgressLogger> logger;
   if (password_manager_util::IsLoggingActive(client_)) {
     logger.reset(
@@ -965,6 +966,12 @@
     matched_manager = CreateFormManager(driver, submitted_form);
   }
 
+  if (is_manual_fallback && matched_manager->GetFormFetcher()->GetState() ==
+                                FormFetcher::State::WAITING) {
+    // In case of manual fallback, the form manager has to be ready for saving.
+    return nullptr;
+  }
+
   if (!matched_manager->ProvisionallySave(submitted_form, driver))
     return nullptr;
 
diff --git a/components/password_manager/core/browser/password_manager.h b/components/password_manager/core/browser/password_manager.h
index 5f224ba2..8a28fd38 100644
--- a/components/password_manager/core/browser/password_manager.h
+++ b/components/password_manager/core/browser/password_manager.h
@@ -278,10 +278,13 @@
   // the match. If the function is called multiple times, only the form from the
   // last call is provisionally saved. Multiple calls is possible because it is
   // called on any user keystroke. If there is no NewPasswordFormManager that
-  // manages |form|, the new one is created.
-  // Returns manager which manages |form|.
+  // manages |form|, the new one is created. If |is_manual_fallback| is true
+  // and the matched form manager has not recieved yet response from the
+  // password store, then nullptr is returned. Returns manager which manages
+  // |form|.
   NewPasswordFormManager* ProvisionallySaveForm(const autofill::FormData& form,
-                                                PasswordManagerDriver* driver);
+                                                PasswordManagerDriver* driver,
+                                                bool is_manual_fallback);
 
   // Passes |form| to NewPasswordFormManager that manages it for using it after
   // detecting submission success for saving.
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index ca062fa9..548567e 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -463,8 +463,7 @@
     manager_.reset(new PasswordManager(&client_));
   }
 
-  void TurnOnOnlyNewPassword(
-      base::test::ScopedFeatureList* scoped_feature_list) {
+  void TurnOnOnlyNewParser(base::test::ScopedFeatureList* scoped_feature_list) {
     scoped_feature_list->InitWithFeatures(
         {features::kNewPasswordFormParsing,
          features::kNewPasswordFormParsingForSaving, features::kOnlyNewParser},
@@ -1007,7 +1006,7 @@
 
 TEST_F(PasswordManagerTest, IsPasswordFieldDetectedOnPage) {
   base::test::ScopedFeatureList scoped_feature_list;
-  TurnOnOnlyNewPassword(&scoped_feature_list);
+  TurnOnOnlyNewParser(&scoped_feature_list);
   PasswordForm form(MakeSimpleForm());
   EXPECT_CALL(*store_, GetLogins(_, _))
       .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms()));
@@ -2656,31 +2655,38 @@
 // Tests that the manual fallback for saving isn't shown if there is no response
 // from the password storage. When crbug.com/741537 is fixed, change this test.
 TEST_F(PasswordManagerTest, ManualFallbackForSaving_SlowBackend) {
-  std::vector<PasswordForm> observed;
-  PasswordForm form(MakeSimpleForm());
-  observed.push_back(form);
-  PasswordStoreConsumer* store_consumer = nullptr;
-  EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.origin))
-      .WillRepeatedly(Return(true));
-  // TODO(https://crbug.com/949519): replace WillRepeatedly with WillOnce when
-  // the old parser is gone.
-  EXPECT_CALL(*store_, GetLogins(_, _))
-      .WillRepeatedly(SaveArg<1>(&store_consumer));
-  manager()->OnPasswordFormsParsed(&driver_, observed);
-  manager()->OnPasswordFormsRendered(&driver_, observed, true);
+  for (bool only_new_parser_enabled : {false, true}) {
+    base::test::ScopedFeatureList scoped_feature_list;
+    if (only_new_parser_enabled)
+      TurnOnOnlyNewParser(&scoped_feature_list);
+    std::vector<PasswordForm> observed;
+    PasswordForm form(MakeSimpleForm());
+    observed.push_back(form);
+    PasswordStoreConsumer* store_consumer = nullptr;
+    EXPECT_CALL(client_, IsSavingAndFillingEnabled(form.origin))
+        .WillRepeatedly(Return(true));
+    // TODO(https://crbug.com/949519): replace WillRepeatedly with WillOnce when
+    // the old parser is gone.
+    EXPECT_CALL(*store_, GetLogins(_, _))
+        .WillRepeatedly(SaveArg<1>(&store_consumer));
+    manager()->OnPasswordFormsParsed(&driver_, observed);
+    manager()->OnPasswordFormsRendered(&driver_, observed, true);
 
-  // There is no response from the store. Don't show the fallback.
-  EXPECT_CALL(client_, ShowManualFallbackForSavingPtr(_, _, _)).Times(0);
-  manager()->ShowManualFallbackForSaving(&driver_, form);
+    // There is no response from the store. Don't show the fallback.
+    EXPECT_CALL(client_, ShowManualFallbackForSavingPtr(_, _, _)).Times(0);
+    manager()->ShowManualFallbackForSaving(&driver_, form);
 
-  // The storage responded. The fallback can be shown.
-  ASSERT_TRUE(store_consumer);
-  store_consumer->OnGetPasswordStoreResults(
-      std::vector<std::unique_ptr<PasswordForm>>());
-  std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save;
-  EXPECT_CALL(client_, ShowManualFallbackForSavingPtr(_, false, false))
-      .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save)));
-  manager()->ShowManualFallbackForSaving(&driver_, form);
+    // The storage responded. The fallback can be shown.
+    ASSERT_TRUE(store_consumer);
+    store_consumer->OnGetPasswordStoreResults(
+        std::vector<std::unique_ptr<PasswordForm>>());
+    std::unique_ptr<PasswordFormManagerForUI> form_manager_to_save;
+    EXPECT_CALL(client_, ShowManualFallbackForSavingPtr(_, false, false))
+        .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save)));
+    manager()->ShowManualFallbackForSaving(&driver_, form);
+    Mock::VerifyAndClearExpectations(&client_);
+    Mock::VerifyAndClearExpectations(&store_);
+  }
 }
 
 TEST_F(PasswordManagerTest, ManualFallbackForSaving_GeneratedPassword) {
@@ -3006,7 +3012,7 @@
                    << "  successful_submission = " << successful_submission);
       base::test::ScopedFeatureList scoped_feature_list;
       if (only_new_parser)
-        TurnOnOnlyNewPassword(&scoped_feature_list);
+        TurnOnOnlyNewParser(&scoped_feature_list);
       else
         TurnOnNewParsingForSaving(&scoped_feature_list, true);
 
@@ -3060,7 +3066,7 @@
     SCOPED_TRACE(testing::Message("only_new_parser = ") << only_new_parser);
     base::test::ScopedFeatureList scoped_feature_list;
     if (only_new_parser)
-      TurnOnOnlyNewPassword(&scoped_feature_list);
+      TurnOnOnlyNewParser(&scoped_feature_list);
     else
       TurnOnNewParsingForSaving(&scoped_feature_list, true);
 
diff --git a/components/payments/content/BUILD.gn b/components/payments/content/BUILD.gn
index 0ec03c0..7fcc386 100644
--- a/components/payments/content/BUILD.gn
+++ b/components/payments/content/BUILD.gn
@@ -8,6 +8,8 @@
   sources = [
     "can_make_payment_query_factory.cc",
     "can_make_payment_query_factory.h",
+    "payment_details_converter.cc",
+    "payment_details_converter.h",
     "payment_handler_host.cc",
     "payment_handler_host.h",
     "payment_request_converter.cc",
diff --git a/components/payments/content/android/BUILD.gn b/components/payments/content/android/BUILD.gn
index 22408ed..21d1e86 100644
--- a/components/payments/content/android/BUILD.gn
+++ b/components/payments/content/android/BUILD.gn
@@ -8,11 +8,11 @@
 
 static_library("android") {
   sources = [
+    "byte_buffer_helper.cc",
+    "byte_buffer_helper.h",
     "currency_formatter_android.cc",
     "currency_formatter_android.h",
     "origin_security_checker_android.cc",
-    "payment_details_deserializer.cc",
-    "payment_details_deserializer.h",
     "payment_handler_host.cc",
     "payment_handler_host.h",
     "payment_manifest_downloader_android.cc",
@@ -51,6 +51,7 @@
   java_files = [
     "java/src/org/chromium/components/payments/CurrencyFormatter.java",
     "java/src/org/chromium/components/payments/OriginSecurityChecker.java",
+    "java/src/org/chromium/components/payments/PaymentDetailsConverter.java",
     "java/src/org/chromium/components/payments/PaymentHandlerHost.java",
     "java/src/org/chromium/components/payments/PaymentManifestDownloader.java",
     "java/src/org/chromium/components/payments/PaymentManifestParser.java",
diff --git a/components/payments/content/android/byte_buffer_helper.cc b/components/payments/content/android/byte_buffer_helper.cc
new file mode 100644
index 0000000..d9555571
--- /dev/null
+++ b/components/payments/content/android/byte_buffer_helper.cc
@@ -0,0 +1,25 @@
+// 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 "components/payments/content/android/byte_buffer_helper.h"
+
+#include <cstring>
+#include <utility>
+#include <vector>
+
+namespace payments {
+namespace android {
+
+std::vector<uint8_t> JavaByteBufferToNativeByteVector(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& buffer) {
+  jbyte* buf_in = static_cast<jbyte*>(env->GetDirectBufferAddress(buffer));
+  jlong buf_size = env->GetDirectBufferCapacity(buffer);
+  std::vector<uint8_t> result(buf_size);
+  memcpy(&result[0], buf_in, buf_size);
+  return result;
+}
+
+}  // namespace android
+}  // namespace payments
diff --git a/components/payments/content/android/byte_buffer_helper.h b/components/payments/content/android/byte_buffer_helper.h
new file mode 100644
index 0000000..b728805
--- /dev/null
+++ b/components/payments/content/android/byte_buffer_helper.h
@@ -0,0 +1,30 @@
+// 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 COMPONENTS_PAYMENTS_CONTENT_ANDROID_BYTE_BUFFER_HELPER_H_
+#define COMPONENTS_PAYMENTS_CONTENT_ANDROID_BYTE_BUFFER_HELPER_H_
+
+#include <jni.h>
+#include <stdint.h>
+#include <vector>
+
+#include "base/android/scoped_java_ref.h"
+
+namespace payments {
+namespace android {
+
+// Converts a java.nio.ByteBuffer into a vector of bytes. Sample usage:
+//
+//  mojom::PaymentDetailsPtr details;
+//  bool success = mojom::PaymentDetails::Deserialize(
+//      std::move(JavaByteBufferToNativeByteVector(env, byte_buffer)),
+//      &details);
+std::vector<uint8_t> JavaByteBufferToNativeByteVector(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& buffer);
+
+}  // namespace android
+}  // namespace payments
+
+#endif  // COMPONENTS_PAYMENTS_CONTENT_ANDROID_BYTE_BUFFER_HELPER_H_
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java
new file mode 100644
index 0000000..883ed6f
--- /dev/null
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java
@@ -0,0 +1,83 @@
+// 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.
+
+package org.chromium.components.payments;
+
+import org.chromium.payments.mojom.PaymentDetails;
+import org.chromium.payments.mojom.PaymentHandlerMethodData;
+import org.chromium.payments.mojom.PaymentHandlerModifier;
+import org.chromium.payments.mojom.PaymentMethodChangeResponse;
+
+import java.util.ArrayList;
+
+/**
+ * Redacts and converts the payment details update from the merchant into a data structure to be
+ * sent to the invoked payment handler.
+ */
+public class PaymentDetailsConverter {
+    /**
+     * To be implemented by the object that can check whether the invoked payment instrument is
+     * valid for the given payment method identifier.
+     */
+    public interface MethodChecker {
+        /**
+         * Checks whether the invoked payment instrument is valid for the given payment method
+         * identifier.
+         * @param methodName Payment method identifier.
+         * @return Whether the invoked instrument is valid for the given payment method identifier.
+         */
+        boolean isInvokedInstrumentValidForPaymentMethodIdentifier(String methodName);
+    }
+
+    /**
+     * This class has only static methods.
+     */
+    private PaymentDetailsConverter() {}
+
+    /**
+     * Redacts and converts the payment details update from the merchant into a data structure to be
+     * sent to the payment handler.
+     * @param details       The pre-validated payment details update from the merchant. Should not
+     *                      be null.
+     * @param methodChecker The object that can check whether the invoked payment instrument is
+     *                      valid for the given payment method identifier. Should not be null.
+     * @return The data structure that can be sent to the invoked payment handler.
+     */
+    static public PaymentMethodChangeResponse convertToPaymentMethodChangeResponse(
+            PaymentDetails details, MethodChecker methodChecker) {
+        // Keep in sync with components/payments/content/payment_details_converter.cc.
+        assert details != null;
+        assert methodChecker != null;
+
+        PaymentMethodChangeResponse response = new PaymentMethodChangeResponse();
+        response.error = details.error;
+        response.stringifiedPaymentMethodErrors = details.stringifiedPaymentMethodErrors;
+
+        if (details.total != null) response.total = details.total.amount;
+
+        ArrayList<PaymentHandlerModifier> modifiers = new ArrayList<>();
+
+        for (int i = 0; i < details.modifiers.length; i++) {
+            if (!methodChecker.isInvokedInstrumentValidForPaymentMethodIdentifier(
+                        details.modifiers[i].methodData.supportedMethod)) {
+                continue;
+            }
+
+            PaymentHandlerModifier modifier = new PaymentHandlerModifier();
+            modifier.methodData = new PaymentHandlerMethodData();
+            modifier.methodData.methodName = details.modifiers[i].methodData.supportedMethod;
+            modifier.methodData.stringifiedData = details.modifiers[i].methodData.stringifiedData;
+
+            if (details.modifiers[i].total != null) {
+                modifier.total = details.modifiers[i].total.amount;
+            }
+
+            modifiers.add(modifier);
+        }
+
+        response.modifiers = modifiers.toArray(new PaymentHandlerModifier[modifiers.size()]);
+
+        return response;
+    }
+}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerHost.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerHost.java
index 21fcb11ee..62b3e27 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerHost.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerHost.java
@@ -7,7 +7,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.payments.mojom.PaymentDetails;
+import org.chromium.payments.mojom.PaymentMethodChangeResponse;
 
 import java.nio.ByteBuffer;
 
@@ -30,16 +30,7 @@
          * @return "False" if not in a valid state.
          */
         @CalledByNative("PaymentHandlerHostDelegate")
-        boolean changePaymentMethod(String methodName, String stringifiedData);
-
-        /**
-         * Checks whether the invoked payment instrument is valid for the given payment method
-         * identifier.
-         * @param methodName Payment method identifier.
-         * @return Whether the invoked instrument is valid for the given payment method identifier.
-         */
-        @CalledByNative("PaymentHandlerHostDelegate")
-        boolean isInvokedInstrumentValidForPaymentMethodIdentifier(String methodName);
+        boolean changePaymentMethodFromPaymentHandler(String methodName, String stringifiedData);
     }
 
     /** Pointer to the native bridge. This Java object owns the native bridge. */
@@ -76,12 +67,11 @@
     /**
      * Notifies the payment handler that the merchant has updated the payment details in response to
      * the payment-method-change event.
-     * @param paymentDetails The updated payment details. Should not be null. Should have been
-     *                       pre-validated.
+     * @param response The payment method change response. Should not be null.
      */
-    public void updateWith(PaymentDetails paymentDetails) {
-        assert paymentDetails != null;
-        PaymentHandlerHostJni.get().updateWith(mNativePointer, paymentDetails.serialize());
+    public void updateWith(PaymentMethodChangeResponse response) {
+        assert response != null;
+        PaymentHandlerHostJni.get().updateWith(mNativePointer, response.serialize());
     }
 
     /**
@@ -128,10 +118,9 @@
         /**
          * Notifies the payment handler that the merchant has updated the payment details.
          * @param nativePaymentHandlerHost The pointer to the native payment handler host bridge.
-         * @param paymentDetailsBuffer The serialized updated payment details from the merchant.
-         *                             Should have been pre-validated.
+         * @param responseBuffer The serialized payment method change response from the merchant.
          */
-        void updateWith(long nativePaymentHandlerHost, ByteBuffer paymentDetailsBuffer);
+        void updateWith(long nativePaymentHandlerHost, ByteBuffer responseBuffer);
 
         /**
          * Notifies the payment handler that the merchant ignored the payment method change event.
diff --git a/components/payments/content/android/payment_details_deserializer.cc b/components/payments/content/android/payment_details_deserializer.cc
deleted file mode 100644
index 7d2db6a..0000000
--- a/components/payments/content/android/payment_details_deserializer.cc
+++ /dev/null
@@ -1,33 +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 "components/payments/content/android/payment_details_deserializer.h"
-
-#include <stdint.h>
-#include <cstring>
-#include <utility>
-#include <vector>
-
-#include "base/android/jni_android.h"
-
-namespace payments {
-namespace android {
-
-mojom::PaymentDetailsPtr DeserializePaymentDetails(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& buffer,
-    bool* success) {
-  DCHECK(success);
-  jbyte* buf_in = static_cast<jbyte*>(env->GetDirectBufferAddress(buffer));
-  jlong buf_size = env->GetDirectBufferCapacity(buffer);
-  std::vector<uint8_t> mojo_buffer(buf_size);
-  memcpy(&mojo_buffer[0], buf_in, buf_size);
-  mojom::PaymentDetailsPtr details;
-  *success =
-      mojom::PaymentDetails::Deserialize(std::move(mojo_buffer), &details);
-  return details;
-}
-
-}  // namespace android
-}  // namespace payments
diff --git a/components/payments/content/android/payment_details_deserializer.h b/components/payments/content/android/payment_details_deserializer.h
deleted file mode 100644
index 27516b1..0000000
--- a/components/payments/content/android/payment_details_deserializer.h
+++ /dev/null
@@ -1,26 +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 COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_DETAILS_DESERIALIZER_H_
-#define COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_DETAILS_DESERIALIZER_H_
-
-#include <jni.h>
-
-#include "base/android/scoped_java_ref.h"
-#include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
-
-namespace payments {
-namespace android {
-
-// Deserializes |buffer| into mojom::PatymentDetailsPtr and returns the result.
-// Sets |success| to "true" on success. The parameters should not be null.
-mojom::PaymentDetailsPtr DeserializePaymentDetails(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& buffer,
-    bool* success);
-
-}  // namespace android
-}  // namespace payments
-
-#endif  // COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_DETAILS_DESERIALIZER_H_
diff --git a/components/payments/content/android/payment_handler_host.cc b/components/payments/content/android/payment_handler_host.cc
index 9529903..60cec60 100644
--- a/components/payments/content/android/payment_handler_host.cc
+++ b/components/payments/content/android/payment_handler_host.cc
@@ -6,8 +6,9 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
-#include "components/payments/content/android/payment_details_deserializer.h"
+#include "components/payments/content/android/byte_buffer_helper.h"
 #include "jni/PaymentHandlerHost_jni.h"
+#include "third_party/blink/public/mojom/payments/payment_handler_host.mojom.h"
 
 namespace payments {
 namespace android {
@@ -46,17 +47,13 @@
 void PaymentHandlerHost::UpdateWith(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& caller,
-    const base::android::JavaParamRef<jobject>& payment_details_buffer) {
-  bool success = false;
-  mojom::PaymentDetailsPtr details =
-      DeserializePaymentDetails(env, payment_details_buffer, &success);
-
-  // Payment details have been pre-validated in PaymentRequestImpl.updateWith().
+    const base::android::JavaParamRef<jobject>& response_buffer) {
+  mojom::PaymentMethodChangeResponsePtr response;
+  bool success = mojom::PaymentMethodChangeResponse::Deserialize(
+      std::move(JavaByteBufferToNativeByteVector(env, response_buffer)),
+      &response);
   DCHECK(success);
-
-  payment_handler_host_.UpdateWith(
-      details, base::BindRepeating(&PaymentHandlerHost::CheckMethod,
-                                   base::Unretained(this), env));
+  payment_handler_host_.UpdateWith(std::move(response));
 }
 
 void PaymentHandlerHost::NoUpdatedPaymentDetails(
@@ -69,16 +66,10 @@
     const std::string& method_name,
     const std::string& stringified_data) {
   JNIEnv* env = base::android::AttachCurrentThread();
-  return Java_PaymentHandlerHostDelegate_changePaymentMethod(
+  return Java_PaymentHandlerHostDelegate_changePaymentMethodFromPaymentHandler(
       env, delegate_, base::android::ConvertUTF8ToJavaString(env, method_name),
       base::android::ConvertUTF8ToJavaString(env, stringified_data));
 }
 
-bool PaymentHandlerHost::CheckMethod(JNIEnv* env,
-                                     const std::string& method_name) {
-  return Java_PaymentHandlerHostDelegate_isInvokedInstrumentValidForPaymentMethodIdentifier(
-      env, delegate_, base::android::ConvertUTF8ToJavaString(env, method_name));
-}
-
 }  // namespace android
 }  // namespace payments
diff --git a/components/payments/content/android/payment_handler_host.h b/components/payments/content/android/payment_handler_host.h
index 95cbdfa0..a957622 100644
--- a/components/payments/content/android/payment_handler_host.h
+++ b/components/payments/content/android/payment_handler_host.h
@@ -56,12 +56,11 @@
   void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
 
   // Notifies the payment handler that the merchant has updated the payment
-  // details. The |payment_details_buffer| should be a serialization of a valid
-  // PaymentDetails.java object.
-  void UpdateWith(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller,
-      const base::android::JavaParamRef<jobject>& payment_details_buffer);
+  // details. The |response_buffer| should be a serialization of a valid
+  // PaymentMethodChangeResponse.java object.
+  void UpdateWith(JNIEnv* env,
+                  const base::android::JavaParamRef<jobject>& caller,
+                  const base::android::JavaParamRef<jobject>& response_buffer);
 
   // Notifies the payment handler that the merchant ignored the payment
   // method change event.
@@ -74,9 +73,6 @@
   bool ChangePaymentMethod(const std::string& method_name,
                            const std::string& stringified_data) override;
 
-  // Returns true if the invoked payment app supports the given |method_name|.
-  bool CheckMethod(JNIEnv* env, const std::string& method_name);
-
   base::android::ScopedJavaGlobalRef<jobject> delegate_;
   payments::PaymentHandlerHost payment_handler_host_;
 
diff --git a/components/payments/content/android/payment_validator_android.cc b/components/payments/content/android/payment_validator_android.cc
index 38b3d3ff..2000801 100644
--- a/components/payments/content/android/payment_validator_android.cc
+++ b/components/payments/content/android/payment_validator_android.cc
@@ -10,7 +10,7 @@
 #include <vector>
 
 #include "base/android/jni_android.h"
-#include "components/payments/content/android/payment_details_deserializer.h"
+#include "components/payments/content/android/byte_buffer_helper.h"
 #include "components/payments/content/payment_request_converter.h"
 #include "components/payments/core/payment_details.h"
 #include "components/payments/core/payment_details_validation.h"
@@ -23,11 +23,12 @@
 jboolean JNI_PaymentValidator_ValidatePaymentDetailsAndroid(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& buffer) {
-  bool success = false;
-  mojom::PaymentDetailsPtr details =
-      android::DeserializePaymentDetails(env, buffer, &success);
-  if (!success)
+  mojom::PaymentDetailsPtr details;
+  if (!mojom::PaymentDetails::Deserialize(
+          std::move(android::JavaByteBufferToNativeByteVector(env, buffer)),
+          &details)) {
     return false;
+  }
   std::string unused_error_message;
   return ValidatePaymentDetails(ConvertPaymentDetails(details),
                                 &unused_error_message);
@@ -36,14 +37,12 @@
 jboolean JNI_PaymentValidator_ValidatePaymentValidationErrorsAndroid(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& buffer) {
-  jbyte* buf_in = static_cast<jbyte*>(env->GetDirectBufferAddress(buffer));
-  jlong buf_size = env->GetDirectBufferCapacity(buffer);
-  std::vector<uint8_t> mojo_buffer(buf_size);
-  memcpy(&mojo_buffer[0], buf_in, buf_size);
   mojom::PaymentValidationErrorsPtr errors;
-  if (!mojom::PaymentValidationErrors::Deserialize(std::move(mojo_buffer),
-                                                   &errors))
+  if (!mojom::PaymentValidationErrors::Deserialize(
+          std::move(android::JavaByteBufferToNativeByteVector(env, buffer)),
+          &errors)) {
     return false;
+  }
   std::string unused_error_message;
   return PaymentsValidators::IsValidPaymentValidationErrorsFormat(
       std::move(errors), &unused_error_message);
diff --git a/components/payments/content/payment_details_converter.cc b/components/payments/content/payment_details_converter.cc
new file mode 100644
index 0000000..43ddb2f
--- /dev/null
+++ b/components/payments/content/payment_details_converter.cc
@@ -0,0 +1,55 @@
+// 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 "components/payments/content/payment_details_converter.h"
+
+#include <utility>
+
+#include "base/callback.h"
+#include "base/logging.h"
+
+namespace payments {
+
+// Keep in sync with PaymentDetailsConverter.java.
+
+mojom::PaymentMethodChangeResponsePtr
+PaymentDetailsConverter::ConvertToPaymentMethodChangeResponse(
+    const mojom::PaymentDetailsPtr& details,
+    const MethodChecker& method_checker) {
+  DCHECK(details);
+
+  auto response = mojom::PaymentMethodChangeResponse::New();
+  response->error = details->error;
+  response->stringified_payment_method_errors =
+      details->stringified_payment_method_errors;
+
+  if (details->total)
+    response->total = details->total->amount.Clone();
+
+  if (!details->modifiers)
+    return response;
+
+  response->modifiers = std::vector<mojom::PaymentHandlerModifierPtr>();
+
+  for (const auto& merchant : *details->modifiers) {
+    if (!method_checker.Run(merchant->method_data->supported_method)) {
+      continue;
+    }
+
+    mojom::PaymentHandlerModifierPtr mod = mojom::PaymentHandlerModifier::New();
+    mod->method_data = mojom::PaymentHandlerMethodData::New();
+    mod->method_data->method_name = merchant->method_data->supported_method;
+    mod->method_data->stringified_data =
+        merchant->method_data->stringified_data;
+
+    if (merchant->total)
+      mod->total = merchant->total->amount.Clone();
+
+    response->modifiers->emplace_back(std::move(mod));
+  }
+
+  return response;
+}
+
+}  // namespace payments
diff --git a/components/payments/content/payment_details_converter.h b/components/payments/content/payment_details_converter.h
new file mode 100644
index 0000000..72691bda
--- /dev/null
+++ b/components/payments/content/payment_details_converter.h
@@ -0,0 +1,38 @@
+// 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 COMPONENTS_PAYMENTS_CONTENT_PAYMENT_DETAILS_CONVERTER_H_
+#define COMPONENTS_PAYMENTS_CONTENT_PAYMENT_DETAILS_CONVERTER_H_
+
+#include <string>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "third_party/blink/public/mojom/payments/payment_handler_host.mojom.h"
+#include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
+
+namespace payments {
+
+class PaymentDetailsConverter {
+ public:
+  using MethodChecker = base::RepeatingCallback<bool(const std::string&)>;
+
+  // Converts and redacts the |details| from the merchant's updateWith(details)
+  // call into a data structure that can be sent to the payment handler.
+  //
+  // The |details| should not be null.
+  //
+  // The |method_checker| is not saved. It is used only for the duration of this
+  // call.
+  static mojom::PaymentMethodChangeResponsePtr
+  ConvertToPaymentMethodChangeResponse(const mojom::PaymentDetailsPtr& details,
+                                       const MethodChecker& method_checker);
+
+ private:
+  DISALLOW_IMPLICIT_CONSTRUCTORS(PaymentDetailsConverter);
+};
+
+}  // namespace payments
+
+#endif  // COMPONENTS_PAYMENTS_CONTENT_PAYMENT_DETAILS_CONVERTER_H_
diff --git a/components/payments/content/payment_handler_host.cc b/components/payments/content/payment_handler_host.cc
index 3c82c815..ca4deb7e 100644
--- a/components/payments/content/payment_handler_host.cc
+++ b/components/payments/content/payment_handler_host.cc
@@ -11,46 +11,6 @@
 #include "content/public/browser/browser_thread.h"
 
 namespace payments {
-namespace {
-
-mojom::PaymentMethodChangeResponsePtr ConvertToPaymentMethodChangeResponse(
-    const mojom::PaymentDetailsPtr& details,
-    const PaymentHandlerHost::MethodChecker& method_checker) {
-  mojom::PaymentMethodChangeResponsePtr response =
-      mojom::PaymentMethodChangeResponse::New();
-  response->error = details->error;
-  response->stringified_payment_method_errors =
-      details->stringified_payment_method_errors;
-
-  if (details->total)
-    response->total = details->total->amount.Clone();
-
-  if (!details->modifiers)
-    return response;
-
-  response->modifiers = std::vector<mojom::PaymentHandlerModifierPtr>();
-
-  for (const auto& merchant : *details->modifiers) {
-    if (!method_checker.Run(merchant->method_data->supported_method)) {
-      continue;
-    }
-
-    mojom::PaymentHandlerModifierPtr mod = mojom::PaymentHandlerModifier::New();
-    mod->method_data = mojom::PaymentHandlerMethodData::New();
-    mod->method_data->method_name = merchant->method_data->supported_method;
-    mod->method_data->stringified_data =
-        merchant->method_data->stringified_data;
-
-    if (merchant->total)
-      mod->total = merchant->total->amount.Clone();
-
-    response->modifiers->emplace_back(std::move(mod));
-  }
-
-  return response;
-}
-
-}  // namespace
 
 PaymentHandlerHost::PaymentHandlerHost(Delegate* delegate)
     : binding_(this), delegate_(delegate), weak_ptr_factory_(this) {
@@ -59,13 +19,24 @@
 
 PaymentHandlerHost::~PaymentHandlerHost() {}
 
-void PaymentHandlerHost::UpdateWith(const mojom::PaymentDetailsPtr& details,
-                                    const MethodChecker& method_checker) {
+mojom::PaymentHandlerHostPtrInfo PaymentHandlerHost::Bind() {
+  mojom::PaymentHandlerHostPtrInfo host_ptr_info;
+  binding_.Close();
+  binding_.Bind(mojo::MakeRequest(&host_ptr_info));
+
+  // Connection error handler can be set only after the Bind() call.
+  binding_.set_connection_error_handler(base::BindOnce(
+      &PaymentHandlerHost::Disconnect, weak_ptr_factory_.GetWeakPtr()));
+
+  return host_ptr_info;
+}
+
+void PaymentHandlerHost::UpdateWith(
+    mojom::PaymentMethodChangeResponsePtr response) {
   if (!change_payment_method_callback_)
     return;
 
-  std::move(change_payment_method_callback_)
-      .Run(ConvertToPaymentMethodChangeResponse(details, method_checker));
+  std::move(change_payment_method_callback_).Run(std::move(response));
 }
 
 void PaymentHandlerHost::NoUpdatedPaymentDetails() {
@@ -113,16 +84,4 @@
   change_payment_method_callback_ = std::move(callback);
 }
 
-mojom::PaymentHandlerHostPtrInfo PaymentHandlerHost::Bind() {
-  mojom::PaymentHandlerHostPtrInfo host_ptr_info;
-  binding_.Close();
-  binding_.Bind(mojo::MakeRequest(&host_ptr_info));
-
-  // Connection error handler can be set only after the Bind() call.
-  binding_.set_connection_error_handler(base::BindOnce(
-      &PaymentHandlerHost::Disconnect, weak_ptr_factory_.GetWeakPtr()));
-
-  return host_ptr_info;
-}
-
 }  // namespace payments
diff --git a/components/payments/content/payment_handler_host.h b/components/payments/content/payment_handler_host.h
index 21a14de16..22f5872 100644
--- a/components/payments/content/payment_handler_host.h
+++ b/components/payments/content/payment_handler_host.h
@@ -12,7 +12,6 @@
 #include "base/memory/weak_ptr.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "third_party/blink/public/mojom/payments/payment_handler_host.mojom.h"
-#include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
 
 namespace payments {
 
@@ -32,8 +31,6 @@
                                      const std::string& stringified_data) = 0;
   };
 
-  using MethodChecker = base::RepeatingCallback<bool(const std::string&)>;
-
   // The |delegate| cannot be null and must outlive this object. Typically this
   // is accomplished by the |delegate| owning this object.
   explicit PaymentHandlerHost(Delegate* delegate);
@@ -50,8 +47,7 @@
 
   // Notifies the payment handler of the updated details, such as updated total,
   // in response to the change of the payment method.
-  void UpdateWith(const mojom::PaymentDetailsPtr& details,
-                  const MethodChecker& method_checker);
+  void UpdateWith(mojom::PaymentMethodChangeResponsePtr response);
 
   // Notifies the payment handler that the merchant did not handle the payment
   // method change event, so the payment details are unchanged.
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index 53686063..550068d 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -13,6 +13,7 @@
 #include "components/payments/content/can_make_payment_query_factory.h"
 #include "components/payments/content/content_payment_request_delegate.h"
 #include "components/payments/content/origin_security_checker.h"
+#include "components/payments/content/payment_details_converter.h"
 #include "components/payments/content/payment_request_converter.h"
 #include "components/payments/content/payment_request_web_contents_manager.h"
 #include "components/payments/content/service_worker_payment_instrument.h"
@@ -279,11 +280,13 @@
     return;
   }
 
-  if (state()->selected_instrument() && state()->IsPaymentAppInvoked()) {
+  if (state()->selected_instrument() && state()->IsPaymentAppInvoked() &&
+      payment_handler_host_.is_changing_payment_method()) {
     payment_handler_host_.UpdateWith(
-        details, base::BindRepeating(
-                     &PaymentInstrument::IsValidForPaymentMethodIdentifier,
-                     base::Unretained(state()->selected_instrument())));
+        PaymentDetailsConverter::ConvertToPaymentMethodChangeResponse(
+            details, base::BindRepeating(
+                         &PaymentInstrument::IsValidForPaymentMethodIdentifier,
+                         base::Unretained(state()->selected_instrument()))));
   }
 
   bool is_resolving_promise_passed_into_show_method = !spec_->IsInitialized();
@@ -318,8 +321,10 @@
 
   spec_->RecomputeSpecForDetails();
 
-  if (state()->IsPaymentAppInvoked())
+  if (state()->IsPaymentAppInvoked() &&
+      payment_handler_host_.is_changing_payment_method()) {
     payment_handler_host_.NoUpdatedPaymentDetails();
+  }
 }
 
 void PaymentRequest::Abort() {
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index caaa7b3e..75344041 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -860,6 +860,8 @@
   repeated BatterySample samples = 7;
   // Designed minimum output voltage (mV)
   optional int32 design_min_voltage = 9;
+  // The date the battery was manufactured in yyyy-mm-dd format.
+  optional string manufacture_date = 10;
 }
 
 // Status of the power subsystem
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index 7e5af9b8..dde47f44 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -398,7 +398,6 @@
 
       ማስጠንቀቂያ፦ የ<ph name="PRODUCT_OS_NAME" /> ስሪት ቁጥጥር ለኪዮስክ መተግበሪያ መወከል መሣሪያው የሶፍትዌር ዝማኔዎችን እና ወሳኝነት ያላቸው የደህንነት ጥገናዎችን እንዳይቀበል ሊከለክለው ስለሚችል አይመከርም። የ<ph name="PRODUCT_OS_NAME" /> ስሪትን ቁጥጥር መወከል ተጠቃሚዎችን አደጋ ላይ ሊጥላቸው ይችላል።</translation>
 <translation id="1675002386741412210">የሚደገፈው በ፦</translation>
-<translation id="1689963000958717134">የአውታረ መረብ ውቅር መግፋት በሁሉም የ<ph name="PRODUCT_OS_NAME" /> መሣሪያ ተጠቃሚዎች ላይ እንዲተገበር ያስችላል። የአውታረ መረቡ ውቅር በ<ph name="ONC_SPEC_URL" /> ላይ እንደተብራራው በክፍት አውታረ መረብ ውቅር ቅርጸት የተገለጸ የJSON ቅርጸት ህብረቁምፊ ነው</translation>
 <translation id="1704516734140344991">የ <ph name="TPM_FIRMWARE_UPDATE_TPM" /> ን ፈርምዌር ዝማኔ ትግበራ ሁነታ ተገኝነትን እና ባህሪ ያዋቅራል።
 
       ነፍስ ወከፍ ቅንብሮች በ JSON ባህሪያት ውስጥ ሊጠቀሱ ይችላሉ።
@@ -957,14 +956,6 @@
       ይህ ቅንብር ከተሰናከለ ድረ-ገጾች ጃቫስክሪፕትን መጠቀም አይችሉም፣ እና ተጠቃሚው ያንን ቅንብር ሊቀይረው አይችልም።
 
       ይህ ቅንብር ከነቃ ወይም እንዳልተዋቀረ ከተተወ ድረ-ገጾች ጃቫስክሪፕትን መጠቀም ይችላሉ፣ ግን ተጠቃሚው ያንን ቅንብር ሊቀይረው ይችላል።</translation>
-<translation id="2747157663401642394">የ<ph name="PRODUCT_NAME" /> የቅጥያዎች አስተዳደር ቅንብሮችን ያዋቅራል። ይህ መመሪያ ከቅጥያዎ ጋር በሚገናኙ ማናቸውም ነባር ቅጥያዎች ቁጥጥር የሚደረግባቸው ቅንብሮችም ጨምሮ በርካታ ቅንብሮችን ይቆጣጠራል። ሁለቱም ከተዋቀሩ ይህ መመሪያ ማናቸውም የቆዩ መመሪያዎችን ይሽራል።
-
-          ይህ መመሪያ አንድ የቅጥያ መታወቂያን ወይም የዝማኔ ዩአርኤልን ከውቅረቱ ጋር ያዛምደዋል። በቅጥያ መታወቂያ አማካኝነት ውቅረት በተገለጸው ቅጥያ ላይ ብቻ ነው የሚተገበረው። አንድ ነባሪ ውቅረት ለልዩ መታወቂያው <ph name="DEFAULT_SCOPE" /> ሊዋቀር ይችላል፣ ይህም በዚህ መመሪያ ውስጥ ብጁ ውቅረት በሌላቸው ሁሉም ቅጥያዎች ላይ ይተገበራል። <ph name="LINK_TO_EXTENSION_DOC1" /> ላይ በተገለጸው መሠረት በዝማኔ ዩአርኤል አማካኝነት ውቅረት በዚህ ቅጥያ ዝርዝር ሰነድ ውስጥ የተገለጸው ትክክለኛ የዝማኔ ዩአርኤል ባላቸው ሁሉም ቅጥያዎች ላይ ይተገበራል።
-
-          ከአንድ የ<ph name="MS_AD_NAME" /> ጎራ ጋር ላልተቀላቀሉ የWindows አብነቶች በግዳጅ መጫን በChrome ድር መደብሩ ውስጥ ለተዘረዘሩ መተግበሪያዎች እእና ቅጥያዎች የተገደበ ነው።
-
-          ሊሆኑ የሚችሉ ሙሉ ቅንብሮችን እና የዚህ መመሪያ መዋቅር መግለጫ ለማግኘት እባክዎ https://www.chromium.org/administrators/policy-list-3/extension-settings-full ይጎብኙ
-          </translation>
 <translation id="2753637905605932878">WebRTC የሚጠቀማቸው የአካባቢያዊ ዩዲፒ ወደቦች ክልልን ገድብ</translation>
 <translation id="2757054304033424106">እንዲጫኑ የሚፈቀደላቸው የቅጥያዎች/መተግበሪያዎች አይነቶች</translation>
 <translation id="2758084448533744848">ለመሣሪያው በግዳጅ ስራ ላይ የሚውለውን የሰዓት ሰቅ ይገልጻል። ይህ መመሪያ ሲዋቀር በመሣሪያው ላይ ያሉ ተጠቃሚዎች የተገለጸውን የሰዓት ስሰቅ መሻር አይችሉም። ልክ ያልሆነ እሴት ከቀረበ መመሪያው በምትኩ «ጂኤምቲ» በመጠቀም ገቢር ይሆናል። ባዶ ሕብረቁምፊ ከቀረበ መመሪያው ችላ ይባላል።
@@ -1724,30 +1715,6 @@
       ይህ መመሪያ SAMLን በመጠቀም በሚያረጋግጡ ተጠቃሚዎች ላይ ብቻ ነው ተጽዕኖ የሚኖረው።</translation>
 <translation id="4105989332710272578">ለአንድ የዩአርኤሎች ዝርዝር የእውቅና ማረጋገጫ ግልጽነት ማስፈጸምን አሰናክል</translation>
 <translation id="4121350739760194865">የመተግበሪያ ማስተዋወቂያዎች በአዲስ የትር ገጽ ላይ እንዳይታዩ ያግዳል</translation>
-<translation id="4125606414556046117">ይህ መመሪያ ለተጠቃሚው በዴስክቶፑ እና በመግቢያ ገጽ ጀርባ ላይ የሚታየው የልጣፉ ምስል እንዲያዋቅሩ ያስስችልዎታል። መመሪያው <ph name="PRODUCT_OS_NAME" /> የልጣፍ ምስሉን እና የውርዱን ትክክለኝነት ለማረጋገጥ ስራ ላይ የሚውለው ስነመሰውራዊ ሃሽ ማውረድ የሚችልበትን ዩአርኤል በመግለጽ የሚዋቀር ነው። ምስሉ በJPEG ቅርጸት፣ እና የፋይል መጠኑ ከ16 ሜባ ያልበለጠ መሆን አለበት። ዩአርኤሉ ያለማረጋገጥ ተደራሽ መሆን አለበት።
-
-      የልጣፍ ምስሉ ይወርድና ይሸጎጣል። ዩአርኤሉ ወይም ሃሹ በተቀየረ ቁጥር ዳግም ይወርዳል።
-
-      መመሪያው የሚከተለውን እዕቅድ በጠበቀ መልኩ ዩአርኤሉን እና ሃሹን በJSON ቅርጸት እንደሚገልጽ ሕብረቁምፊ ነው መገለጽ ያለበት፦
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "የልጣፍ ምስሉ የሚወርድበት ዩአርኤል።",
-            "type": "string"
-          },
-          "hash": {
-            "description": "የልጣፍ ምስሉ የSHA-256 ሃሽ።",
-            "type": "string"
-          }
-        }
-      }
-
-      ይህ መመሪያ ከተዋቀረ <ph name="PRODUCT_OS_NAME" /> የልጣፍ ምስሉን ያወርድና ይጠቀምበታል።
-
-      ይህን መመሪያ ካዋቀሩት ተጠቃሚዎች ሊቀይሩት ወይም ሊሽሩት አይችሉም።
-
-      መመሪያው እንዳልተዋቀረ ከተተወ ተጠቃሚው በዴስክቶፕ እና በመግቢያ ማያው ጀርባ ላይ የሚታየውን ምስል መምረጥ ይችላል።</translation>
 <translation id="412697421478384751">ተጠቃሚዎች ለማያ ገጽ ቁልፍ ፒን ደካማ ፒኖችን እንዲያቀናብሩ ያስችላቸዋል</translation>
 <translation id="4138655880188755661">የጊዜ ገደብ</translation>
 <translation id="4144164749344898721">ይህ መመሪያ ተጠቃሚው ስራ በፈታበት ጊዜ የበርካታ የኃይል አስተዳደር ስትራቴጂ ቅንብሮችን ይቆጣጠራል።
@@ -2693,53 +2660,6 @@
 
       ይህ መመሪያ  ካልተዋቀረ ወይም ወደ ሐሰት ከተዋቀረ የህትመት ትዕዛዞች የህትመት ቅድመ-እይታ ማያ ገጹን ያስጀምሩታል።</translation>
 <translation id="6022948604095165524">በሚነሳበት ጊዜ የሚወሰደው እርምጃ</translation>
-<translation id="6023030044732320798">ለኤአርሲ ማስኬጃ ጊዜው የሚሰጡ የመመሪያዎች ስብስብ ይገልጻል። እሴቱ የሚሰራ JSON መሆን አለበት።
-
-      ይህ መመሪያ የትኛዎቹ የAndroid መተግበሪያዎች በራስ-ሰር በመሣሪያው ላይ እንደሚጫኑ ለማዋቀር ስራ ላይ መዋል ይችላል፦
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android app identifier, e.g. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "አንድ መተግበሪያ እንዴት እንደሚጫን ይገልጻል። ከተፈለገ፦ መተግበሪያው በራስ-ሰር አይጫንም፣ ነገር ግን ተጠቃሚው ሊጭነው ይችላል። ይህ መመሪያ ካልተገለጸ ነባሪው ይኸው ነው። ቅድመ_ጭነት፦ መተግበሪያው በራስ-ሰር ይጫናል፣ ነገር ግን ተጠቃሚው ሊያራግፈው ይችላል። የግዴታ_ጭነት፦ መተግበሪያው በራስ-ሰር ይጫናል፣ እና ተጠቃሚው ሊያራግፈው አይችልም፣ የታገደ፦ መተግበሪያው የታገደ እና ሊጫን የማይችል ነው። መተግበሪያው በአንድ ቀዳሚ መመሪያ የተጫነ ከሆነ ይራገፋል",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "የመተግበሪያዎች የፈቃድ ጥያቄዎችን የመመለስ መመሪያ። የፈቃድ_መመሪያ_አልተገለጸም፦ መመሪያው አልተገለጸም። በማንኛውም ደረጃ ላለ ፈቃድ ምንም መመሪያ ካልተገለጸ በነባሪነት የ`ጠይቅ` ባህሪው ስራ ላይ ይውላል። ጠይቅ፦ ተጠቃሚው ፈቃድ እንዲሰጥ ይጠይቁ። ስጥ፦ በራስ-ሰር ፈቃድ ስጥ። ከልክል፦ በራስ-ሰር ፈቃድ ከልክል።",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "መተግበሪያ-ተኮር የJSON ውቅረት ነገር ከቁልፍ-እሴት ጥምሮች ስብስብ ጋር፣ ለምሳሌ፣ '"managedConfiguration": { "key1": value1, "key2": value2 }'። ቁልፎቹ በመተግበሪያው ዝርዝር ሰነድ ውስጥ ይገለጻሉ።",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      መተግበሪያዎችን በማስጀመሪያው ላይ ለመሰካት PinnedLauncherAppsን ይመልከቱ።</translation>
 <translation id="602728333950205286">ነባሪ የፍለጋ አቅራቢ ቅጽበታዊ ዩአርኤል</translation>
 <translation id="603410445099326293">POST የሚጠቀም የሚጠቆም ዩአርኤል ግቤቶች</translation>
 <translation id="6034341625190551415">የይፋዊ ክፍለ-ጊዜ እና የኪዮስክ መለያ አይነቶችን ይቆጣጠራል።</translation>
@@ -3092,37 +3012,6 @@
       ይህ መመሪያ ወደ ሐሰት ከተዋቀረ አብሮገነቡ የዲኤንኤስ ደንበኛው በጭራሽ ስራ ላይ አይውልም።
 
       ይህ መመሪያ እንዳልተዋቀረ ከተተወ አብሮገነቡ የዲኤንኤስ ደንበኛው በMacOS፣ Android (ሁለቱም የግል ዲኤንኤስ ወይም ቪፒኤን ካልነቁ) እና ChromeOS ላይ በነባሪነት ይነቃል፣ እና ተጠቃሚዎቹ chrome://flagsን በማርትዕ ወይም አንድ የትዕዛዝ-መስመር ጥቆማን በመግለጽ አብሮገነቡ የዲኤንኤስ ደንበኛው ስራ ላይ ይውል እንደሆነ መቀየር ይችላሉ።</translation>
-<translation id="6838056959556423778">የ<ph name="PRODUCT_NAME" /> ነባሪ አታሚ ምርጫ ደንቦችን እንዲቆጣጠሩ ያስችላል።
-
-      ይህ መመሪያ በ<ph name="PRODUCT_NAME" /> ውስጥ ነባሪው አታሚ የሚመረጥባቸው ደንቦችን ይወስናል፣ ይህም የህትመት ተግባሩ ከመገለጫ ጋር ጥቅም ላይ በዋለበት የመጀመሪያ ጊዜ ውስጥ የሚከሰት ነው።
-
-      ይህ መመሪያ ሲዋቀር <ph name="PRODUCT_NAME" /> ከተገለጹት ሁሉም አይነታዎች ጋር የሚዛመድ አታሚን ለማግኘት እና እሱን እንደ ነባሪው አታሚ አድርጎ ለመምረጥ ይሞክራል። ከመመሪያው ጋር የሚዛመድ የመጀመሪያው የተገኘው አታሚ ይመረጣል፣ ልዩ ያልሆነ ተዛማጅ ከሆነ አታሚዎች በተገኙበት ቅደም-ተከተል የሚወሰን ሆኖ ማንኛውም ተዛማጅ አታሚ ይመረጣል።
-
-      ይህ መመሪያ ካልተዋቀረ ወይም በእረፍት ጊዜው ውስጥ ተዛማጅ አታሚ ካልተገኘ አታሚው በነባሪነት አብሮገነቡ የፒዲኤፍ አታሚው ይሆናል፣ ወይም ደግሞ የፒዲኤፍ አታሚ ከሌለ ምንም አታሚ አይመረጥም።
-
-      እሴቱ እንደ የJSON ነገር ሆኖ ይተነተናል፣ በዚህም የሚከተለውን ንድፍ ይከተላል፦
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "የተዛማጅ አታሚ ፍለጋ ለአንድ የተወሰነ የአታሚዎች ስብስብ ይገደብ እንደሆነ።",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "ከአታሚ መታወቂያ ጋር የሚዛመድ መደበኛ የሒሳብ አገላለጽ።",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "ከአታሚ ማሳያ ስም ጋር የሚዛመድ መደበኛ የሒሳብ አገላለጽ።",
-            "type": "string"
-          }
-        }
-      }
-
-      ከ<ph name="CLOUD_PRINT_NAME" /> ጋር የተገናኙ አታሚዎች <ph name="PRINTER_TYPE_CLOUD" /> እንደሆነ ይታሰባሉ፣ የተቀሩት አታሚዎች እንደ <ph name="PRINTER_TYPE_LOCAL" /> ይመደባሉ።
-      አንድ መስክን ባዶ መተው ማለት ሁሉም እሴቶች ይዛመዳሉ ማለት ነው፣ ለምሳሌ ተገናኝነትን አለመግለጽ የህትመት ቅድመ-እይታ አካባቢያዊም ሆኑ የደመና ሁሉንም የአታሚ አይነቶችን ማግኘትን ያስጀምራል።
-      መደበኛ የሒሳብ አገላለጽ ስርዓተ-ጥለቶች የJavaScript RegExp አገባብን መከተል ያለባቸው ሲሆን ተዛማጆች መልከፊደል ትብ ናቸው።</translation>
 <translation id="6843296367238757293">ይህ መመሪያ ተቋርጧል። እሱን መጠቀም አይበረታታም። https://support.google.com/chrome/a/answer/7643500 ላይ ተጨማሪ ያንብቡ</translation>
 <translation id="684856667300805181">ይህ መመሪያ በ<ph name="PRODUCT_NAME" /> 68 ውስጥ ተወግዶ በ<ph name="ARC_GLS_POLICY_NAME" /> እንዲተካ ተደርጓል።</translation>
 <translation id="6856743875250214792">ለውስጣዊ ሙከራ ብቻ ጥቅም ላይ ስለዋለ እና የደህንነት ተጠያቂነትን ስለሚያስከትል ይህ መመሪያ ተቋርጧል፣ እንዲሁም በM66 ውስጥ ተወግዷል።
@@ -4263,30 +4152,6 @@
       ይህ መመሪያ SAML በመጠቀም ባረጋገጡ ተጠቃሚዎች ላይ ብቻ ነው ተጽዕኖ የሚኖረው።
 
       መመሪያው በሰከንዶች ነው መገለጽ ያለበት።</translation>
-<translation id="9027787254195333560">ይህ መመሪያ በመግቢያ ገጹ ላይ ተጠቃሚውን የሚወክል የአምሳያ ምስሉን እንዲያዋቅሩ ያስችልዎታል። መመሪያው <ph name="PRODUCT_OS_NAME" /> የአምሳያ ምስሉን እና የውርዱን ትክክለኝነት ለማረጋገጥ ስራ ላይ የሚውለው ስነመሰውራዊ ሃሽ ማውረድ የሚችልበትን ዩአርኤል በመግለጽ የሚዋቀር ነው። ምስሉ በJPEG ቅርጸት መሆን አለበት፣ እና ከ512 ኪባ መብለጥ የለበትም። ዩአርኤሉ ያለማረጋገጥ ተደራሽ መሆን አለበት።
-
-      የአምሳያ ምስሉ ይወርድና ይሸጎጣል። ዩአርኤሉ ወይም ሃሹ በተቀየረ ቁጥር ዳግም ይወርዳል።
-
-      መመሪያው የሚከተለውን እዕቅድ በጠበቀ መልኩ ዩአርኤሉን እና ሃሹን በJSON ቅርጸት እንደሚገልጽ ሕብረቁምፊ ነው መገለጽ ያለበት፦
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "የአምሳያ ምስሉ የሚወርድበት ዩአርኤል።",
-            "type": "string"
-          },
-          "hash": {
-            "description": "የአምሳያ ምስሉ የSHA-256 ሃሽ።",
-            "type": "string"
-          }
-        }
-      }
-
-      ይህ መመሪያ ከተዋቀረ <ph name="PRODUCT_OS_NAME" /> የአምሳያ ምስሉን ያወርድና ይጠቀምበታል።
-
-      ይህን መመሪያ ካዋቀሩት ተጠቃሚዎች ሊቀይሩት ወይም ሊሽሩት አይችሉም።
-
-      መመሪያው እንዳልተዋቀረ ከተተወ ተጠቃሚው እነሱን በመግቢያ ገጹ ላይ የሚወክላቸውን የአምሳያ ምስል መምረጥ ይችላሉ።</translation>
 <translation id="9035964157729712237">ከተከለከሉት ዝርዝር ነፃ የሚደረጉ የቅጥያ መታወቂያዎች</translation>
 <translation id="9038058011835642205">ጸጥ ብለው ያለተጠቃሚ መስተጋብር የሚጫኑ እና ሊራገፍ የማይችሉ የድር ጣቢያዎች ዝርዝርን ይገልጻል።
 
@@ -4299,7 +4164,6 @@
       ይህን መመሪያ ካዋቀሩት ተጠቃሚዎች ሊቀይሩት ወይም ሊሽሩት አይችሉም።
 
       መመሪያው በሚሊሰከንዶች ነው መገለጽ ያለበት። እሴቶች ከ30 ሰከንዶች እስከ 24 ሰዓትት ድረስ ወዳለ ክልል ይሰበሰባሉ።</translation>
-<translation id="9042911395677044526">የአውታረ መረብ ውቅር መግፋት በእያንዳንዱ ተጠቃሚ በ<ph name="PRODUCT_OS_NAME" /> መሣሪያ ላይ እንዲተገበር ያስችላል። የአውታረ መረቡ ውቅር በ<ph name="ONC_SPEC_URL" /> ላይ እንደተብራራው በክፍት አውታረ መረብ ውቅር ቅርጸት የተገለጸ የJSON ቅርጸት ህብረቁምፊ ነው</translation>
 <translation id="9050853837490399534">ይህ መመሪያ መሣሪያው ወደ ፈጣን ጥገና ግንብ መዘመን ያለበት እንደሆነ ይቆጣጠራል።
 
       የመመሪያ እሴቱ ከፈጣን ጥገና ግንብ ጋር ወደሚዛመድ ማስመሰያ ከተዋቀረ ዝማኔው በሌላ መመሪያ ካልታገደ መሣሪያው ወደ ተጓዳኙ ፈጣን ጥገና ግንቡ ይዘመናል።
@@ -4379,17 +4243,6 @@
       መመሪያው ወደ ሐሰት ከተዋቀረ «ራስጌዎች እና ግርጌዎች» በህትመት ቅድመ-እይታ መገናኛው ውስጥ አይመረጥም፣ እና ተጠቃሚው ሊቀይረው አይችልም።
 
       መመሪያው ወደ እውነት ከተዋቀረ «ራስጌዎች እና ግርጌዎች» በህትመት ቅድመ-እይታ መገናኛው ውስጥ ይመረጣል፣ እና ተጠቃሚው ሊቀይረው አይችልም።</translation>
-<translation id="9213347477683611358">ማንም ተጠቃሚ ገና ወደ መሣሪያው ካልገባ በመግቢያ ገጹ ላይ የሚታየውን የመሣሪያ ደረጃ ልጣፍ ምስል ያዋቅሩ። መመሪያው የሚዋቀረው የChrome OS መሣሪያው የልጣፍ ምስሉን ሊያወርድበት የሚችልበት ዩአርኤል እና የውርዱን ሙሉነት የሚያረጋግጥ ስነ መሰውራዊ ሃሽ በመግለጽ ነው። ምስሉ በJPEG ቅርጸት፣ ከ16 ሜባ የማይበልጥ መሆን አለበት። ዩአርኤሉ ያለምንም ማረጋገጥ ተደራሽ መሆን አለበት። የልጣፍ ምስሉ ወርዶ ተሸጉጧል። ዩአርኤሉ ወይም ሃሹ በተቀየረ ጊዜ ዳግም ይወርዳል።
-
-      መመሪያው ዩአርኤሉን እና ሃሹን በJSON ቅርጸት በሚገለጽ ሕብረቁምፊ ነው መገለጽ ያለበት፣ ለምሳሌ፦
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      ምንም ተጠቃሚ ገና ወደ መሣሪያ በመለያ ካልገባ የመሣሪያ ልጣፍ መመሪያ ከተዋቀረ የChrome OS መሣሪያው የልጣፍ ምስሉን አውርዶ በመግቢያ ገጹ ላይ ይጠቀምበታል። አንዴ ተጠቃሚው ከገባ በኋላ የተጠቃሚው ልጣፍ መመሪያ ይተገበራል።
-
-      የመሣሪያ ልጣፍ መመሪያው እንዳልተዋቀረ ከተተወና የተጠቃሚው ልጣፍ መመሪያ ከተዋቀረ ምን እንደሚታይ የሚወስነው የተጠቃሚው የልጣፍ መመሪያ ነው።</translation>
 <translation id="9217154963008402249">የአውታረ መረብ መከታተያ ጥቅሎች ድግግሞሽ</translation>
 <translation id="922540222991413931">ቅጥያ፣ መተግበሪያ እና የተጠቃሚ ስክሪፕት ጭነት ምንጮችን ያዋቅሩ</translation>
 <translation id="924557436754151212">የመጀመሪያ አሂድ ላይ የተቀመጡ የይለፍ ቃላትን ከነባሪው አሳሽ ያስመጡ</translation>
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index a2a51fd..a0067a5 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -412,7 +412,6 @@
 
       تحذير: ليس من المستحسن منح تفويض التحكم في إصدار <ph name="PRODUCT_OS_NAME" /> لتطبيق Kiosk نظرًا لأن ذلك قد يمنع الجهاز من تلقي تحديثات البرامج والإصلاحات الأمنية الحساسة. قد يؤدي تفويض التحكم في إصدار <ph name="PRODUCT_OS_NAME" /> إلى تعرض المستخدمين للخطر.</translation>
 <translation id="1675002386741412210">متاح للاستخدام في:</translation>
-<translation id="1689963000958717134">‏للسماح لتهيئة الشبكة المدفوعة أن يتم تطبيقها على جميع مستخدمين جهاز <ph name="PRODUCT_OS_NAME" />. إن تهيئة الشبكة هي عبارة عن سلسلة بتنسيق JSON كما هو محدد في تنسيق تهيئة الشبكة المفتوحة الموضح في <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">‏تتيح هذه السياسة ضبط سلوك وظيفة تحديث البرامج الثابتة <ph name="TPM_FIRMWARE_UPDATE_TPM" /> ومدى توافرها.
 
       يمكن تحديد الإعدادات الفردية في خصائص JSON:
@@ -940,16 +939,6 @@
       في حالة إيقاف هذا الإعداد، لا يمكن لصفحات الويب استخدام JavaScript ولا يتمكن المستخدم من تغيير ذلك الإعداد.
 
       في حالة تفعيل هذا الإعداد أو عدم تعيينه، يمكن لصفحات الويب استخدام JavaScript ويكون بمقدور المستخدم تغيير ذلك الإعداد.</translation>
-<translation id="2747157663401642394">‏تعمل على ضبط إعدادات إدارة الإضافات لخدمة <ph name="PRODUCT_NAME" />.
-
-          هذه السياسة تتحكّم في العديد من الإعدادات، بما في ذلك الإعدادات التي يتم التحكّم فيها بواسطة أي سياسات حالية متعلقة بالإضافات. وسوف تلغي هذه السياسة أي سياسات قديمة في حال ضبط كل منهما.
-
-          تحدد هذه السياسة معرّف الإضافة أو عنوان URL للتحديث إلى عملية ضبطها. باستخدام معرّف الإضافة، سيتم تطبيق عملية الضبط على الإضافة المُحدَّدة فقط. يمكن إعداد ضبط تلقائي لرقم التعريف الخاص <ph name="DEFAULT_SCOPE" />، الذي سينطبق على جميع الإضافات التي ليس لها عملية ضبط مُخصَّصة منصوص عليها في هذه السياسة. باستخدام عنوان URL التحديث، سيتم تطبيق عملية الضبط على جميع الإضافات التي تحتوي على عنوان URL التحديث نفسه المذكور في بيان هذه الإضافة، كما هو مُوضَّح في <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          وبالنسبة إلى النسخ الافتراضية لنظام التشغيل Windows غير الملحقة بنطاق <ph name="MS_AD_NAME" />، يكون التثبيت من المؤسّسة مقصورًا على الإضافات والتطبيقات المُدرجة في "سوق Chrome الإلكتروني".
-
-          للاطلِّاع على الوصف الكامل للإعدادات المُحتملة وبنية هذه السياسة، يُرجى زيارة https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">‏تقييد نطاق منافذ UDP المحلية المستخدمة من خلال WebRTC</translation>
 <translation id="2757054304033424106">أنواع الإضافات/التطبيقات التي يُسمح بتثبيتها</translation>
 <translation id="2758084448533744848">‏تحدّد هذه السياسة المنطقة الزمنية التي تم فرضها ليتم استخدامها للجهاز. عند ضبط هذه السياسة، لا يتمكّن المستخدمون على الجهاز من إلغاء المنطقة الزمنية المُحدّدة. في حال تقديم قيمة غير صالحة، سيستمر تفعيل السياسة  باستخدام "توقيت جرينتش" بدلاً من ذلك. وفي حال تقديم سلسلة فارغة، سيتم تجاهل السياسة.
@@ -1703,30 +1692,6 @@
       لا تؤثر هذه السياسة إلا في المستخدمين الذين يجرون المصادقة باستخدام SAML.</translation>
 <translation id="4105989332710272578">‏إيقاف فرض شهادة الشفافية لقائمة بعناوين URL</translation>
 <translation id="4121350739760194865">منع العروض الترويجية للتطبيقات من الظهور في صفحة علامة التبويب الجديدة</translation>
-<translation id="4125606414556046117">‏تسمح لك هذه السياسة بضبط صورة الخلفية التي تظهر على سطح المكتب وعلى خلفية شاشة تسجيل الدخول للمستخدم. يتم ضبط هذه السياسة من خلال تحديد عنوان URL والذي يمكن لنظام التشغيل <ph name="PRODUCT_OS_NAME" /> تنزيل صورة الخلفية منه وتجزئة التشفير المُستخدمة للتحقُّق من سلامة عملية التنزيل. يجب أن تكون هذه الصورة بتنسيق JPEG، وألا يتجاوز حجمها 16 ميغابايت. يجب أن يكون الوصول إلى عنوان URL متاحًا بدون أي مصادقة.
-
-      يتم تنزيل صورة الخلفية وحفظها في ذاكرة التخزين المؤقت. وستتم إعادة تنزيلها كلما تغيّر عنوان URL أو تغيّرت التجزئة.
-
-      يجب تحديد السياسة باعتبارها سلسلة تعبِّر عن عنوان URL وعلامة التجزئة بالتنسيق JSON، بالتوافق مع النظام التالي:
-      {
-        "النوع": "كائن"،
-        "الخصائص": {
-          "عنوان URL": {
-            "الوصف": "عنوان URL الذي يمكن تنزيل صورة الخلفية منه."،
-            "النوع": "سلسلة"
-          }،
-          "التجزئة": {
-            "الوصف": "التجزئة SHA-256 لصورة الخلفية."،
-            "النوع": "سلسلة"
-          }
-        }
-      }
-
-      في حال تحديد هذه السياسة، سيعمل <ph name="PRODUCT_OS_NAME" /> على تنزيل صورة الخلفية واستخدامها.
-
-      في حال تحديد هذه السياسة، لن يتمكَّن المستخدمون من تغييرها أو إلغائها.
-
-      وفي حال ترك هذه السياسة بدون تحديد، يمكن للمستخدم اختيار صورة ليتم عرضها على خلفية سطح المكتب وشاشة تسجيل الدخول.</translation>
 <translation id="412697421478384751">إتاحة تعيين المستخدمين لأرقام تعريف شخصية ضعيفة كرقم التعريف الشخصي لشاشة القفل.</translation>
 <translation id="4138655880188755661">الحد الزمني</translation>
 <translation id="4144164749344898721">‏تتحكَّم هذه السياسة في إعدادات متعدّدة مرتبطة باستراتيجية إدارة الطاقة عندما يصبح المستخدم في وضع الخمول.
@@ -2636,53 +2601,6 @@
 
       إذا لم يتم تعيين هذه السياسة أو تم تعيينها على false، تعمل أوامر الطباعة على تشغيل شاشة "معاينة الطباعة".</translation>
 <translation id="6022948604095165524">إجراءات عند بدء التشغيل</translation>
-<translation id="6023030044732320798">‏لتحديد مجموعة من السياسات التي سيتم تحويلها إلى وقت تشغيل ARC. يجب أن تكون القيمة ملف JSON صالحًا.
-
-      يمكن استخدام هذه السياسة لتهيئة تطبيقات Android التي يتم تثبيتها بشكل تلقائي على الجهاز:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "مُعرّف تطبيق Android، مثل. "com.google.android.gm" لـ Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "تحدد كيفية تثبيت التطبيق. OPTIONAL: لا يتم تثبيت التطبيق بشكل تلقائي لكن يمكن للمستخدم تثبيته. يُعدّ ذلك هو الإعداد التلقائي في حال عدم تحديد هذه السياسة. PRELOAD: يتم تثبيت التطبيق بشكل تلقائي لكن يمكن للمستخدم إلغاء تثبيته. FORCE_INSTALLED: يتم تثبيت التطبيق بشكل تلقائي ولا يمكن للمستخدم إلغاء تثبيته. BLOCKED: يتم حظر التطبيق ولا يمكن تثبيته. وفي حال تثبيت التطبيق بموجب سياسة سابقة، سيتم إلغاء تثبيته.،
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "سياسة لمنح طلبات الأذونات إلى التطبيقات. PERMISSION_POLICY_UNSPECIFIED: لم يتم تحديد السياسة. في حال عدم تحديد أي سياسة لأحد الأذونات على أي مستوى، يتم عندئذٍ استخدام سلوك `PROMPT` كخيار تلقائي. PROMPT: مطالبة المستخدم بمنح الإذن. GRANT: منح الإذن تلقائيًا. DENY: رفض الإذن تلقائيًا.,
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "كائن تهيئة JSON محدد للتطبيق مع مجموعة من أزواج القيمة الأساسية. '"managedConfiguration": { "key1": value1, "key2": value2 }'. يتم تحديد المفاتيح في بيان التطبيق."،
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      لتثبيت التطبيقات في Launcher، اطلع على PinnedLauncherApps.</translation>
 <translation id="602728333950205286">‏عنوان URL للبحث باستخدام مزود البحث التلقائي</translation>
 <translation id="603410445099326293">‏معلمات عنوان URL المقترح الذي يستخدم المشاركة</translation>
 <translation id="6034341625190551415">‏تتحكّم هذه السياسة في الجلسة العامة وأنواع حسابات Kiosk.</translation>
@@ -3011,35 +2929,6 @@
       وفي حال ضبط هذه السياسة على False، لن يتم استخدام برنامج نظام أسماء النطاقات المُدمج مطلقًا.
 
       في حال ترك هذه السياسة بدون ضبط، سيتم تفعيل برنامج نظام أسماء النطاقات المُدمج تلقائيًا على أنظمة التشغيل Mac وAndroid (عندما لا يتم تفعيل شبكة ظاهرية خاصّة (VPN) أو نظام أسماء النطاقات الخاصّة) وChrome، وسيتمكَّن المستخدمون من تغيير ما إذا كان يمكن استخدام برنامج نظام أسماء النطاقات المدمج من خلال تعديل chrome://flags أو تحديد علامة سطر الأوامر.</translation>
-<translation id="6838056959556423778">‏لا تلتزم هذه السياسة بقواعد اختيار الطابعة التلقائية في <ph name="PRODUCT_NAME" />، بل تحدّد قواعد اختيار الطابعة التلقائية في <ph name="PRODUCT_NAME" /> وذلك في المرة الأولى التي تُستخدم فيها وظيفة الطابعة مع ملف شخصي.
-
-      عند ضبط هذه السياسة، سيحاول <ph name="PRODUCT_NAME" /> إيجاد طابعة تتوافق مع جميع السمات المُحدَّدة وسيختارها كطابعة تلقائية. يتم عادةً اختيار الطابعة الأولى المطابِقة للسياسة، وفي حال العثور على أكثر من طابعة واحدة مطابِقة، يتم اختيار أي منها وفقًا لترتيب اكتشافها.
-
-      وفي حال عدم ضبط هذه السياسة أو عدم العثور على طابعة مطابِقة خلال المهلة المحدَّدة، إمَا تكون الطابعة التلقائية هي طابعة PDF المدمجة أو لا يتم اختيار أي طابعة إذا كانت طابعة PDF غير متوفّرة.
- 
-      ويتم تحليل القيمة ككائن JSON بما يتوافق مع المُخطط التالي:
-      {
-        "type": "object"،
-        "properties": {
-          "kind": {
-            "description": "سواء لحصر البحث عن الطابعة المطابِقة ضمن مجموعة محدَّدة من الطابعات."،
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "تعبير عادي لمطابقة رقم تعريف الطابعة."،
-            type": "string"
-          },
-          "namePattern": {
-            "description": "تعبير عادي لمطابقة اسم عرض الطابعة."،
-            type": "string"
-          }
-        }
-      }
-
-      تُعدّ الطابعات المتصلة بـ <ph name="CLOUD_PRINT_NAME" /> طابعات <ph name="PRINTER_TYPE_CLOUD" />، بينما تصنَّف الطابعات الأخرى على أنها <ph name="PRINTER_TYPE_LOCAL" />.
-      يعني إغفال حقل محدّد أن جميع القيم مطابِقة، مثلاً، سيتسبَّب عدم تحديد إمكانية الاتصال في أن تبدأ "معاينة الطباعة" في اكتشاف جميع أنواع الطابعات، المحلّية منها والسحابية.
-     يجب أن تتبع أنماط التعبير العادي بنية جافا سكريبت RegExp، مع العِلم أن المطابقات تتأثّر بشكل الحرف.</translation>
 <translation id="6843296367238757293">‏تم إيقاف هذه السياسة. ولا ننصح باستخدامها. مزيد من المعلومات على https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">تمت إزالة هذه السياسة في <ph name="PRODUCT_NAME" /> 68 واستبدالها بـ <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">‏يتم إيقاف هذه السياسة وإزالتها في M66 بسبب استخدامها للاختبار الداخلي فقط وهي بمثابة مسؤولية أمنية.
@@ -4177,30 +4066,6 @@
       لا تؤثر هذه السياسة إلا في المستخدمين الذين تمت المصادقة عليهم باستخدام SAML.
 
       يجب تحديد هذه السياسة بالثواني.</translation>
-<translation id="9027787254195333560">‏تتيح لك هذه السياسة ضبط الصورة الشخصية التي تمثل المستخدم على شاشة تسجيل الدخول. يتم ضبط السياسة من خلال تحديد عنوان URL الذي يمكن لنظام التشغيل <ph name="PRODUCT_OS_NAME" /> من خلاله تنزيل الصورة الشخصية وتجزئة التشفير المستخدمة للتحقُّق من سلامة عملية التنزيل. يجب أن تكون الصورة بتنسيق JPEG، وألا يتجاوز حجمها 512 كيلوبايت. يجب أن يكون الوصول إلى عنوان URL متاحًا بدون أي مصادقة.
-
-      يتم تنزيل الصورة الشخصية وحفظها في ذاكرة التخزين المؤقت. وستتم إعادة تنزيلها كلما تغيّر عنوان URL أو تغيّرت التجزئة.
-
-      يجب تحديد السياسة باعتبارها سلسلة تعبِّر عن عنوان URL وعلامة التجزئة بالتنسيق JSON، بالتوافق مع النظام التالي:
-      {
-        "النوع": "كائن"،
-        "الخصائص": {
-          "عنوان URL": {
-            "الوصف": "عنوان URL الذي يمكن تنزيل الصورة الشخصية منه."،
-            "النوع": "سلسلة"
-          }،
-          "التجزئة": {
-            "الوصف": "التجزئة SHA-256 للصورة الشخصية."،
-            "النوع": "سلسلة"
-          }
-        }
-      }
-
-      في حال تحديد هذه السياسة، سيعمل <ph name="PRODUCT_OS_NAME" /> على تنزيل الصورة الشخصية واستخدامها.
-
-      في حال تحديد هذه السياسة، لن يتمكَّن المستخدمون من تغييرها أو إلغائها.
-
-      وفي حال ترك هذه السياسة بدون تحديد، يمكن للمستخدم اختيار الصورة الشخصية التي تمثله على شاشة تسجيل الدخول.</translation>
 <translation id="9035964157729712237">معرفات الإضافات المراد استثنائها من قائمة الحظر</translation>
 <translation id="9038058011835642205">‏تحدد هذه السياسة قائمة بمواقع الويب التي تم تثبيتها بصمت، بدون تفاعل المستخدم، والتي لا يمكن للمستخدم إلغاء تثبيتها أو إيقافها.
 
@@ -4213,7 +4078,6 @@
       في حال تحديد هذه السياسة، لن يتمكَّن المستخدمون من تغييرها أو إلغائها.
 
       يجب تحديد قيمة السياسة بالمللي ثانية. تتراوح الفترة الزمنية التي يمكن تحديدها لطول الجلسة بين 30 ثانية و24 ساعة.</translation>
-<translation id="9042911395677044526">‏للسماح لتهيئة الشبكة المدفوعة أن يتم تطبيقها على كل مستخدم لجهاز <ph name="PRODUCT_OS_NAME" />. إن تهيئة الشبكة هي عبارة عن سلسلة بتنسيق JSON كما هو محدد في تنسيق تهيئة الشبكة المفتوحة الموضح في <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">‏تتحكَّم هذه السياسة في ما إذا كان يجب تحديث الجهاز إلى سياسة Quick Fix Build أم لا.
 
       في حال تم تحديد رمز مميز مرتبط بسياسة Quick Fix Build كقيمة السياسة، سيتم تحديث الجهاز إلى سياسة Quick Fix Build المطابقة، ما لم يتم حظر التحديث من قبل سياسة أخرى.
@@ -4285,17 +4149,6 @@
       في حال تحديد السياسة على "false"، لا يتم اختيار "الرؤوس والتذييلات" في مربع حوار "معاينة الطباعة"، ولا يمكن للمستخدم تغييرها.
 
       في حال تحديد السياسة على "true"، يتم اختيار "الرؤوس والتذييلات" في مربع حوار "معاينة الطباعة"، ولا يمكن للمستخدم تغييرها.</translation>
-<translation id="9213347477683611358">‏تعمل على تهيئة صورة الخلفية على مستوى الجهاز، والتي تظهر على شاشة تسجيل الدخول إذا لم يسجل أي مستخدم الدخول إلى الجهاز بعدُ. يتم تعيين السياسة من خلال تحديد عنوان URL الذي يمكن لجهاز نظام التشغيل Chrome من خلاله تنزيل صورة الخلفية، وتجزئة التشفير المستخدمة للتحقق من تكامل التنزيل. ويجب أن تكون الصورة بتنسيق JPEG، وألا يتجاوز حجم ملفها 16 ميغابايت. ويجب أن يكون هناك إمكانية وصول إلى عنوان URL دون مصادقة. كما يتم تنزيل صورة الخلفية ووضعها في ذاكرة التخزين المؤقت. وسيتم إعادة تنزيل هذه الصورة في حالة تغير عنوان URL أو التجزئة.
-
-      ينبغي تحديد السياسة كسلسة تعبر عن عنوان URL وتجزئة بتنسيق JSON، على سبيل المثال،
-      {
-        "عنوان URL"‏: "https://example.com/device_wallpaper.jpg"، 
-        "التجزئة": "examplewallpaperhash"
-      }
-
-      في حالة تعيين سياسة خلفية الجهاز، سينزِّل جهاز نظام التشغيل Chrome صورة الخلفية وسيستخدمها في شاشة تسجيل الدخول، إذا لم يسجِّل أي مستخدم الدخول إلى الجهاز بعدُ. وبعد أن يسجل المستخدم الدخول، فسيتم تطبيق سياسة خلفية المستخدم.
-
-      في حالة ترك سياسة خلفية الجهاز دون تعيين، ستحدِّد سياسة خلفية المستخدم ما يتم عرضه إذا كانت سياسة خلفية المستخدم معيَّنة.</translation>
 <translation id="9217154963008402249">فترة تكرار مراقبة حزم الشبكة</translation>
 <translation id="922540222991413931">تهيئة مصادر الإضافات والتطبيقات وعمليات تثبيت النص البرمجي للمستخدم</translation>
 <translation id="924557436754151212">استيراد كلمات المرور المحفوظة من المتصفح التلقائي عند التشغيل أول مرة</translation>
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index 1d16f8e..9bf78d8 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -393,7 +393,6 @@
 
 Предупреждение: Не се препоръчва контролът върху версията на <ph name="PRODUCT_OS_NAME" /> да се предоставя на павилионно приложение, тъй като това може да попречи на устройството да получава актуализации на софтуера и критични поправки на сигурността. Предоставянето на контрола върху версията на <ph name="PRODUCT_OS_NAME" /> може да изложи потребителите на риск.</translation>
 <translation id="1675002386741412210">Поддържа се от:</translation>
-<translation id="1689963000958717134">Разрешава разпространението на конфигурацията на мрежата до всички потребители на устройство с <ph name="PRODUCT_OS_NAME" />. Тази конфигурация е JSON низ, форматиран съгласно формата за отворена мрежа, както е описано на адрес <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Конфигурира наличността и поведението на функцията за актуализиране на фърмуера на <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Отделните настройки могат да бъдат посочени в свойства във формат JSON:
@@ -935,16 +934,6 @@
 Ако тази настройка е деактивирана, уеб страниците не могат да използват JavaScript и потребителят не е в състояние да я променя.
 
 В случай че тя е активирана или не е зададена, уеб страниците могат да ползват JavaScript, но потребителят е в състояние да я променя.</translation>
-<translation id="2747157663401642394">Конфигурира настройките за управление на разширенията за <ph name="PRODUCT_NAME" />.
-
-С това правило се контролират няколко настройки, включително такива, които се управляват от съществуващи правила за разширенията. Ако бъде конфигурирано, то ще замени всички зададени предишни правила.
-
-          Правилото търси съответствие между конфигурацията си и идентификационен номер или URL адрес за актуализация на разширение. При намиране на съответстващ идентификационен номер конфигурацията се прилага само за посоченото разширение. За специалния идентификатор <ph name="DEFAULT_SCOPE" /> може да бъде зададена стандартна конфигурация, която ще е в сила за всички разширения, за които не са посочени персонализирани настройки в това правило. При намиране на съответстващ URL адрес за актуализация конфигурацията се прилага за всички разширения, в чийто манифест е посочен същият адрес, както е описано тук: <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-За екземпляри на Windows, които не са част от домейн на <ph name="MS_AD_NAME" />, принудително могат да се инсталират само приложения и разширения от уеб магазина на Chrome.
-
-          За пълно описание на възможните настройки и структурата на това правило, моля, посетете https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Ограничаване на диапазона на локалните UDP портове, използвани от WebRTC</translation>
 <translation id="2757054304033424106">Типове разширения/приложения, които е разрешено да се инсталират</translation>
 <translation id="2758084448533744848">Посочва коя часова зона принудително да се използва за устройството. Когато правилото е зададено, потребителите на устройството не могат да променят посочената часова зона. Ако бъде въведена невалидна стойност, правилото пак се активира, като се използва „GMT“. Ако е посочен празен низ, правилото се пренебрегва.
@@ -1702,30 +1691,6 @@
 Това правило засяга само потребителите, които удостоверяват самоличността си чрез SAML.</translation>
 <translation id="4105989332710272578">Изключване на налагането на Прозрачност на сертификатите за списък с URL адреси</translation>
 <translation id="4121350739760194865">Спиране на показването на популяризации за приложения в новия раздел в браузъра</translation>
-<translation id="4125606414556046117">Това правило ви дава възможност да изберете изображението, което потребителите да виждат като фон на работния плот и екрана за вход. Правилото се задава, като посочите URL адреса, от който <ph name="PRODUCT_OS_NAME" /> може да изтегли графичния файл, и криптографска хеш стойност за потвърждаване на целостта на изтеглянето. Изображението трябва да е във формат JPEG и с размер най-много 16 МБ. URL адресът трябва да е достъпен без удостоверяване.
-
-      Изображението на тапета се изтегля и кешира. То ще се изтегля отново при всяка промяна на URL адреса или хеш стойността.
-
-      Правилото трябва да се посочи като низ в JSON формат, който изразява URL адреса и хеш стойността и съответства на следната схема:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL адресът, от който може да се изтегли изображението на тапета.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Хеш стойността по SHA-256 на изображението на тапета.",
-            "type": "string"
-          }
-        }
-      }
-
-Ако това правило е зададено, <ph name="PRODUCT_OS_NAME" /> ще изтегли и използва изображението на тапета.
-
-      В случай че зададете правилото, потребителите няма да могат да го променят или отменят.
-
-      Ако правилото не е зададено, потребителите ще имат възможност да изберат изображение, което да се показва като фон на работния плот и екрана за вход.</translation>
 <translation id="412697421478384751">Разрешаване на потребителите да задават ненадеждни ПИН кодове за заключен екран</translation>
 <translation id="4138655880188755661">Времево ограничение</translation>
 <translation id="4144164749344898721">Това правило контролира няколко настройки за стратегията за управление на захранването при потребителска неактивност.
@@ -2647,53 +2612,6 @@
 
 Ако правилото не е зададено или е „False“, командите за печат ще задействат екрана за визуализация.</translation>
 <translation id="6022948604095165524">Действие при стартиране</translation>
-<translation id="6023030044732320798">Посочва набор от правила, които да се прилагат за средата ARC. Стойността трябва да е във валиден формат JSON.
-
-Правилото може да се използва за конфигуриране на това, кои приложения за Android да се инсталират автоматично на устройството:
-
-{
-"type": "object",
-"properties": {
-"applications": {
-"type": "array",
-"items": {
-"type": "object",
-"properties": {
-"packageName": {
-"description": "Идентификатор на приложението за Android, напр. "com.google.android.gm" за Gmail.",
-"type": "string"
-},
-"installType": {
-"description": "Посочва как се инсталира дадено приложение. OPTIONAL: Приложението не се инсталира автоматично, но потребителят може да го добави. Това е стандартната настройка, ако правилото не е посочено. PRELOAD: Приложението се инсталира автоматично, но потребителят може да го деинсталира. FORCE_INSTALLED: Приложението се инсталира автоматично и потребителят не може да го деинсталира. BLOCKED: Приложението е блокирано и не може да бъде инсталирано. То ще се деинсталира, ако е било добавено по силата на предишно правило.",
-"type": "string",
-"enum": [
-"OPTIONAL",
-"PRELOAD",
-"FORCE_INSTALLED",
-"BLOCKED"
-]
-},
-"defaultPermissionPolicy": {
-"description": "Правило за заявките за предоставяне на разрешения за приложенията. PERMISSION_POLICY_UNSPECIFIED: Правилото не е посочено. Ако не е зададено правило за разрешение на никое ниво, по подразбиране ще се използва поведението за стойността PROMPT. PROMPT: Подканва потребителя да предостави разрешение. GRANT: Автоматично предоставяне на разрешение. DENY: Автоматично отказване на разрешение.",
-"type": "string",
-"enum": [
-"PERMISSION_POLICY_UNSPECIFIED",
-"PROMPT",
-"GRANT",
-"DENY"
-]
-},
-"managedConfiguration": {
-"description": "Конфигурационен обект във формат JSON за конкретно приложение, съдържащ набор от двойки ключ – стойност, напр. "managedConfiguration": { "key1": value1, "key2": value2 }. Ключовете се дефинират в манифеста на приложението.",
-"type": "object"
-}
-}
-}
-}
-}
-}
-
-За да фиксирате приложения към стартовия панел, вижте PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL адрес за динамично търсене за търсещата машина по подразбиране</translation>
 <translation id="603410445099326293">Параметри за URL адрес за предложения, за който се използва POST</translation>
 <translation id="6034341625190551415">Контролира типовете профили за обществени сесии и павилионен режим.</translation>
@@ -3028,37 +2946,6 @@
       При false вградената клиентска програма за DNS няма да се използва никога.
 
       Ако правилото не е зададено, тази програма ще бъде активирана по подразбиране за Mac OS, Android (когато функциите за частен DNS и VPN не са активирани) и Chrome OS и потребителите ще могат да променят настройките за ползването й, като редактират chrome://flags или посочат флаг в командния ред.</translation>
-<translation id="6838056959556423778">Заменя правилата за избиране на стандартен принтер в <ph name="PRODUCT_NAME" />.
-
-      Тези правила определят как се избира стандартният принтер в <ph name="PRODUCT_NAME" />, което става, когато функцията за печат се използва за първи път в потребителски профил.
-
-      Когато правилото е зададено, <ph name="PRODUCT_NAME" /> ще опита да намери принтер, отговарящ на всички посочени атрибути, и да го зададе като стандартен. Ще бъде избран първият съответстващ принтер. Ако на атрибутите съответстват няколко принтера, може да бъде избран който и да е от тях в зависимост от реда на откриването им.
-
-      В случай че правилото не е зададено или не е намерен съответстващ принтер преди изтичане на времето за изчакване, като стандартен се избира вграденият PDF принтер, а ако той не е налице, не се задава нищо.
-
-      Стойността се анализира синтактично като JSON обект, отговарящ на следната схема:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Дали търсенето на съответстващ принтер да се ограничи до конкретен набор от принтери.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Регулярен израз за намиране на принтери със съответстващи идентификатори.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Регулярен израз за намиране на принтери със съответстващо екранно име.",
-            "type": "string"
-          }
-        }
-      }
-
-      Принтерите, свързани с <ph name="CLOUD_PRINT_NAME" />, се смятат за <ph name="PRINTER_TYPE_CLOUD" />, а останалите се класифицират като <ph name="PRINTER_TYPE_LOCAL" />.      
-      При пропускане на поле се счита, че съответстват всички стойности. Ако например не е посочен тип свързаност, при визуализацията за печат ще се задейства откриването на всякакви видове принтери, локални и в облака.
-      Шаблоните за регулярните изрази трябва да използват синтаксиса на RegExp в JavaScript. Регистърът на буквите е от значение за съвпаденията.</translation>
 <translation id="6843296367238757293">Това правило е оттеглено. Използването му не е препоръчително. Прочетете повече на адрес https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Това правило бе премахнато в <ph name="PRODUCT_NAME" /> 68 и заменено от <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Това правило е оттеглено и е премахнато в M66, тъй като бе предназначено само за вътрешно тестване и понижава сигурността.
@@ -4173,30 +4060,6 @@
       Правилото засяга само потребители, удостоверени със SAML.
 
       Стойността в правилото трябва да бъде посочена в секунди.</translation>
-<translation id="9027787254195333560">Това правило ви дава възможност да изберете изображението на аватара, представящо потребителя на екрана за вход. Правилото се задава, като посочите URL адреса, от който <ph name="PRODUCT_OS_NAME" /> може да изтегли изображението, и криптографска хеш стойност за потвърждаване на целостта на изтеглянето. Изображението трябва да е във формат JPEG и с размер най-много 512 КБ. URL адресът трябва да е достъпен без удостоверяване.
-
-      Изображението на аватара се изтегля и кешира. То ще се изтегля отново при всяка промяна на URL адреса или хеш стойността.
-
-      Правилото трябва да се посочи като низ в JSON формат, който изразява URL адреса и хеш стойността и съответства на следната схема:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL адресът, от който може да се изтегли изображението на аватара.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Хеш стойността по SHA-256 на изображението на аватара.",
-            "type": "string"
-          }
-        }
-      }
-
-Ако това правило е зададено, <ph name="PRODUCT_OS_NAME" /> ще изтегли и използва изображението на аватара.
-
-      В случай че зададете правилото, потребителите няма да могат да го променят или отменят.
-
-      Ако правилото не е зададено, потребителите ще имат възможност да изберат изображението на аватара, което да ги представя на екрана за вход.</translation>
 <translation id="9035964157729712237">Идентификационни номера на разширения за освобождаване от черния списък</translation>
 <translation id="9038058011835642205">Посочва списък с уебсайтове, които се инсталират негласно и без взаимодействие с потребителя и които не могат да бъдат деинсталирани или деактивирани от него.
 
@@ -4209,7 +4072,6 @@
       В случай че зададете правилото, потребителите няма да могат да го променят или отменят.
 
       Стойността на правилото трябва да бъде посочена в милисекунди. Тя ще бъде променена така, че да попада в рамките на диапазона от 30 секунди до 24 часа.</translation>
-<translation id="9042911395677044526">Разрешава разпространението на конфигурацията на мрежата до всеки потребител на устройство с <ph name="PRODUCT_OS_NAME" />. Тази конфигурация е JSON низ, форматиран съгласно формата за отворена мрежа, както е описано на адрес <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Това правило управлява дали устройството да бъде актуализирано до компилация за бърза поправка.
 
       Ако стойността на правилото е означение, съответстващо на компилация за бърза поправка, устройството ще бъде актуализирано до тази компилация, при условие че това не се блокира от друго правило.
@@ -4289,17 +4151,6 @@
 При false съответната опция не е избрана в диалоговия прозорец за визуализация за печат и потребителят не може да я променя.
 
 Ако е зададено true, опцията е избрана и потребителят не може да я променя.</translation>
-<translation id="9213347477683611358">Конфигуриране на тапета на ниво устройство, който да се показва на екрана за вход, когато все още няма влязъл потребител. Правилото се задава, като посочите URL адреса, от който устройството с Chrome OS може да изтегли съответното изображение, и криптографска хеш стойност за потвърждаване на цялостта на изтеглянето. Графичният файл трябва да е във формат JPEG и с размер най-много 16 МБ. URL адресът трябва да е достъпен без удостоверяване. Изображението за тапет се изтегля и кешира. То ще се изтегля отново при всяка промяна на URL адреса или хеш стойността.
-
-Правилото трябва да се посочи като низ в JSON формат, който изразява URL адреса и хеш стойността, например:
-{
-"url": "https://example.com/device_wallpaper.jpg",
-"hash": "examplewallpaperhash"
-}
-
-При задаване на това правило устройството с Chrome OS ще изтегли изображението за тапет и ще го използва на екрана за вход, ако все още няма влязъл потребител. След като потребителят влезе, ще се приложи неговото правило за тапет.
-
-Ако правилото за тапет на устройството не е зададено, показваният фон ще се определя от съответното правило на потребителя, в случай че е конфигурирано.</translation>
 <translation id="9217154963008402249">Честота на мрежовите пакети за наблюдение</translation>
 <translation id="922540222991413931">Конфигуриране на източниците за инсталиране на разширения, приложения и потребителски скриптове</translation>
 <translation id="924557436754151212">Импортиране на запазените пароли от браузъра по подразбиране при първото изпълнение</translation>
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index 076e5062..fcc28955 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -412,7 +412,6 @@
 
       সতর্কতা: <ph name="PRODUCT_OS_NAME" /> ভার্সনের নিয়ন্ত্রণ কোনো কিয়স্ক অ্যাপের কাছে দেওয়ার জন্য কোনো প্রস্তাব করা হয়নি কারণ এর ফলে ডিভাইসটি সফ্টওয়্যার আপডেট ও জটিল সুরক্ষা সমাধানগুলি পেতে বাধা পেতে পারে। <ph name="PRODUCT_OS_NAME" /> ভার্সনের নিয়ন্ত্রণ কারো হাতে ন্যস্ত করা হলে ব্যবহারকারীরা ঝুঁকিতে পড়তে পারে।</translation>
 <translation id="1675002386741412210">এতে সমর্থিত:</translation>
-<translation id="1689963000958717134">একটি <ph name="PRODUCT_OS_NAME" /> ডিভাইসের সমস্ত ব্যবহারকারীর প্রতি প্রযোজ্য নেটওয়ার্ক কনফিগারেশন প্রেরণের মঞ্জুরি দেয়৷ নেটওয়ার্ক কনফিগারেশন একটি JSON-বিন্যস্ত স্ট্রিং যা <ph name="ONC_SPEC_URL" /> এ বর্ণিত ওপেন নেটওয়ার্ক কনফিগারেশন বিন্যাস দ্বারা যেমন সংজ্ঞা দেওয়া হয়েছে সেইমত হয়</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> ফার্মওয়্যার আপডেট করার ফাংশনের উপলভ্যতা ও আচরণ কনফিগার করে।
 
       নির্দিষ্ট সেটিংস JSON বৈশিষ্ট্য থেকে সেট করা যায়:
@@ -959,16 +958,6 @@
       যদি এই সেটিংসটি বন্ধ করা থাকে, তাহলে ওয়েব পৃষ্ঠাগুলি JavaScript ব্যবহার করতে এবং ব্যবহারকারী সেটিং পরিবর্তন করতে পারে না৷
 
       যদি এই সেটিং চালু থাকে বা সেট করা নয়, তাহলে ওয়েব পৃষ্ঠাগুলি JavaScript ব্যবহার করতে পারে কিন্তু ব্যবহারকারী সেই সেটিং পরিবর্তন করতে পারে৷</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> অ্যাপের জন্য এক্সটেনশন ম্যানেজমেন্ট বিষয়ক সেটিংস কনফিগার করা হয়।
-
-          এই নীতি কোনও আগে থেকে থাকা এক্সটেনশন-সম্পর্কিত নীতি দ্বারা নিয়ন্ত্রিত সেটিংস সহ একাধিক সেটিংস নিয়ন্ত্রণ করে। যদি দুটোই সেট করা থাকে তাহলে এই নীতি যেকোনও লেগাসি নীতি ওভাররাইড করবে।
-
-          এই নীতি, এর কনফিগারেশনের সাথে একটি এক্সটেনশন আইডি বা তার আপডেট ইউআরএল ম্যাপ করে। একটি এক্সটেনশন আইডি দিয়ে, শুধুমাত্র নির্দিষ্ট এক্সটেনশনে কনফিগারেশন প্রয়োগ করা হবে। বিশেষ আইডি <ph name="DEFAULT_SCOPE" />-এর জন্য একটি ডিফল্ট কনফিগারেশন সেট করা যেতে পারে, যা এই নীতিতে কাস্টম কনফিগারেশন সেট করা নেই এমন সব এক্সটেনশনের জন্য প্রযোজ্য হবে। একটি আপডেট ইউআরএলের মাধ্যমে <ph name="LINK_TO_EXTENSION_DOC1" />-এ বর্ণনা করা এই এক্সটেনশনটির ম্যানিফেস্টে উল্লেখ করা সুনির্দিষ্ট আপডেট ইউআরএল দিয়ে সব এক্সটেনশনে কনফিগারেশন প্রয়োগ করা হবে।
-
-         <ph name="MS_AD_NAME" />-এর সাথে যুক্ত নয় এমন Windows ইন্সট্যান্সের ক্ষেত্রে, ফোর্সড ইনস্টল পদ্ধতি Chrome ওয়েব স্টোরে তালিকাভুক্ত অ্যাপ এবং এক্সটেনশনের মধ্যেই সীমিত থাকে।
-
-          এই নীতির সম্ভাব্য সেটিংস ও গঠনের সম্পূর্ণ বিবরণ পেতে https://www.chromium.org/administrators/policy-list-3/extension-settings-full দেখুন
-          </translation>
 <translation id="2753637905605932878">WebRTC দ্বারা ব্যবহৃত স্থানীয় UDP পোর্টগুলির ব্যাপ্তি সীমাবদ্ধ করে</translation>
 <translation id="2757054304033424106">যে ধরনের এক্সটেনশন/অ্যাপ্লিকেশগুলি ইনস্টল করার জন্য অনুমোদিত</translation>
 <translation id="2758084448533744848">ডিভাইসটির জন্য প্রযোজ্য টাইমজোন নির্দিষ্ট করে। এই নীতি সেট করা থাকলে, ব্যবহারকারী উল্লিখিত টাইমজোন পরিবর্তন করতে পারবেন না। ভুল মান দেওয়া থাকলে, তার পরিবর্তে "GMT" ব্যবহার করে নীতিটি চালু করা হয়। স্ট্রিংয়ের জন্য কোনও মান দেওয়া না থাকলে, এই নীতি অগ্রাহ্য করা হয়।
@@ -1734,30 +1723,6 @@
       এই নীতি শুধু SAML ব্যবহার করে নিজেদের যাচাই করেন এমন ব্যবহারকারীদের ক্ষেত্রে প্রযোজ্য হয়।</translation>
 <translation id="4105989332710272578">ইউআরএল-গুলির একটি তালিকার জন্য সার্টিফিকেটের স্বচ্ছতার প্রয়োগ বন্ধ করে</translation>
 <translation id="4121350739760194865">নতুন ট্যাব পৃষ্ঠাটিতে উপস্থিত হওয়া থেকে অ্যাপ প্রচারগুলিকে প্রতিহত করুন</translation>
-<translation id="4125606414556046117">এই নীতি আপনাকে ডেস্কটপে এবং ব্যবহারকারীর জন্য লগ-ইনের স্ক্রিনের ব্যাকগ্রাউন্ডে দেখানো ওয়ালপেপারের ফটোটিকে কনফিগার করতে দেয়। নীতি যে ইউআরএল থেকে <ph name="PRODUCT_OS_NAME" /> ওয়ালপেপারের ফটো ডাউনলোড করতে পারে তাতে নির্দিষ্ট করার মাধ্যমে সেট করা হয়ে থাকে এবং ডাউনলোডের অখণ্ডতা যাচাই করার জন্য একটি ক্রিপ্টোগ্র্যাফিক হ্যাশ ব্যবহৃত হয়। ফটোটিকে অবশ্যই JPEG ফর্ম্যাটে হতে হবে, এর সাইজ ১৬ এমবি এর বেশি হতে পারবে না। ইউআরএলটি কোনও প্রমাণীকরণ ছাড়াই অ্যাক্সেসযোগ্য হতে হবে।
-
-      ওয়ালপেপারের ফটোটিকে ডাউনলোড করে ক্যাশে নিয়ে যাওয়া হয়। ইউআরএলটি অথবা হ্যাশ পরিবর্তন করা হলেই এটি আবার ডাউনলোড হবে।
-
-      নীতিকে একটি স্ট্রিং হিসাবে উল্লেখ করতে হবে যা ইউআরএল এবং হ্যাশকে JSON ফর্ম্যাটে প্রকাশ করবে এবং নিম্নলিখিত রূপরেখা অনুযায়ী মানানসই হবে:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "যে ইউআরএলটি থেকে ওয়ালপেপারের ফটোটি ডাউনলোড করা যেতে পারে।",
-            "type": "string"
-          },
-          "hash": {
-            "description": "ওয়ালপেপারের ফটোর SHA-256 হ্যাশ।",
-            "type": "string"
-          }
-        }
-      }
-
-      যদি নীতি সেট করা থাকে, <ph name="PRODUCT_OS_NAME" /> ওয়ালপেপারের ফটো ডাউনলোড এবং ব্যবহার করবে।
-
-      আপনি যদি এই নীতি সেট করেন তাহলে ব্যবহারকারীরা এটি পরিবর্তন বা ওভাররাইড করতে পারেন না।
-
-      যদি নীতিকে সেট না করে ছেড়ে রাখা হয় তাহলে ব্যবহারকারী ডেস্কটপে এবং লগ-ইনের স্ক্রিনের ব্যাকগ্রাউন্ডে দেখানোর জন্য একটি ফটো বেছে নিতে পারবেন।</translation>
 <translation id="412697421478384751">লক স্ক্রিনের জন্য সহজ পিন সেট করতে ব্যবহারকারীদের অনুমতি দিন</translation>
 <translation id="4138655880188755661">সময়সীমা</translation>
 <translation id="4144164749344898721">ব্যবহারকারী নিষ্ক্রিয় থাকাকালীন, এই নীতি পাওয়ার ম্যানেজমেন্ট স্ট্র্যাটেজির একাধিক সেটিংস নিয়ন্ত্রণ করে।
@@ -2192,7 +2157,7 @@
 <translation id="5105313908130842249">ব্যাটারি পাওয়ার চলাকালীন স্ক্রিন লকে বিলম্ব</translation>
 <translation id="5108031557082757679">অক্ষম করা এন্টারপ্রাইজ ডিভাইস প্রিন্টার</translation>
 <translation id="5124368997194894978">AC-এর বুট প্রক্রিয়া চালু করা (অলটার্নেটিং কারেন্ট)</translation>
-<translation id="5131211790949066746"><ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> ও <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> এক্সটে`নশন ইনস্টল তালিকার নীতিগুলি মার্জ করা চালু করে।
+<translation id="5131211790949066746"><ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> ও <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> এক্সটেনশন ইনস্টল তালিকার নীতিগুলি মার্জ করা চালু করে।
 
       আপনি এই সেটিং চালু করলে, শুধু একটি উৎস থেকে সবচেয়ে বেশি অগ্রাধিকার সম্পন্ন মানগুলিকে ব্যবহার না করে মেশিন প্ল্যাটফর্ম নীতি, মেশিন ক্লাউড নীতি ও ব্যবহারকারীর প্ল্যাটফর্ম নীতির মানগুলিকে একটি তালিকায় মার্জ করে সামগ্রিকভাবে ব্যবহার করা হয়।
 
@@ -2719,53 +2684,6 @@
 
       এই নীতি সেট না করলে বা ফলসে সেট করলে প্রিন্ট কমান্ড প্রিন্ট প্রিভিউ স্ক্রিনে ট্রিগার করে।</translation>
 <translation id="6022948604095165524">স্টার্টআপের সময় অ্যাকশন</translation>
-<translation id="6023030044732320798">এক সেট নীতি নির্দিষ্ট করে যা ARC রানটাইমের কাছে দেওয়া হয়। মানটি অবশ্যই সঠিক JSON হতে হবে।
-
-      এই নীতিটি ডিভাইসে নিজে থেকে ইনস্টল করা Android অ্যাপ কনফিগার করার জন্য ব্যবহার করা যেতে পারে:
-
-      {
-        "টাইপ করুন": "অবজেক্ট",
-        " বৈশিষ্ট্য ": {
-          "অ্যাপ্লিকেশন": {
-            "টাইপ করুন": "তীরচিহ্ন",
-            "আইটেম": {
-              "টাইপ করুন": "অবজেক্ট",
-              "বৈশিষ্ট্য ": {
-                "প্যাকেজ নাম": {
-                  "বিবরণ": "Android অ্যাপ শনাক্তকারী, যেমন, Gmail-এর জন্য "com.google.android.gm",
-                  "টাইপ করুন": "স্ট্রিং"
-                },
-                ""ইনস্টল করার প্রকার": {
-                  "বর্ণনা": "একটি অ্যাপ কিভাবে ইনস্টল করা হয় তা নির্দিষ্ট করে।  ঐচ্ছিক: অ্যাপটি নিজে থেকে ইনস্টল হয় না তবে ব্যবহারকারী সেটি ইনস্টল করতে পারে। এই নীতিটি নির্দিষ্ট না হলে সেটি ডিফল্ট হয়। প্রিলোড: অ্যাপটি অটোমেটিক ইনস্টল করা হয় কিন্তু ব্যবহারকারী এটি আনইনস্টল করতে পারেন। নিজে থেকে ইনস্টল: অ্যাপটি নিজে থেকে ইনস্টল হয় এবং ব্যবহারকারী এটি আনইনস্টল করতে পারে না। ব্লক করা হয়েছে: অ্যাপটি ব্লক এবং ইনস্টল করা যাবে না। যদি আগের নীতির অধীনে অ্যাপটি ইনস্টল করা হয়ে থাকে তবে এটি আনইনস্টল করা হবে।",
-                  "টাইপ করুন": "স্ট্রিং",
-                  "enum": [
-                    "ঐচ্ছিক",
-                    "প্রিলোড",
-                    "নিজে থেকে ইনস্টল হয়েছে",
-                    "ব্লক করা হয়েছে"
-                  ]
-                },
-                "ডিফ্লট অনুমতি নীতি": {
-                  "বর্ণনা": " অ্যাপে অনুমতির অনুমোদনের জন্য নীতি। অনির্দিষ্ট অনুমতি নীতি: নীতিটি নির্দিষ্ট নয়। যদি কোনও নীতি কোনও স্তরের অনুমতির জন্য নির্দিষ্ট না করা হয়, তাহলে 'প্রম্পট' আচরণটি ডিফল্ট হিসেবে ব্যবহৃত হয়। প্রম্পট করুন: অনুমতি দেওয়ার জন্য ব্যবহারকারীকে অনুরোধ করুন। মঞ্জুরি দিন: অনুমতির জন্য অটোমেটিক মঞ্জুরি দিন। অস্বীকার করুন: অনুমতির জন্য অটোমেটিক অস্বীকার করুন",
-                  "টাইপ করুন": "স্ট্রিং",
-                  "enum": [
-                    "অনির্দিষ্ট অনুমতি নীতি",
-                    "প্রম্পট করুন",
-                    "মঞ্জুরি দিন",
-                    "অস্বীকার করুন"
-                  ]
-                },
-                "পরিচালিত কনফিগারেশন": {
-                  "বর্ণনা": "কী-ভ্যালু পেয়ার সহ অ্যাপ নির্দিষ্ট JSON কনফিগারেশন অবজেক্ট, ''পরিচালিত কনফিগারেশন": { "key1": value1, "key2": value2 }'. কীগুলি অ্যাপ ম্যানিফেস্টের মধ্যে সংজ্ঞায়িত করা হয়।",
-                  "টাইপ করুন": "অবজেক্ট"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      লঞ্চারে অ্যাপগুলি পিন করতে, PinnedLauncher অ্যাপ দেখুন।</translation>
 <translation id="602728333950205286">ডিফল্ট সার্চ সরবরাহকারী ইনস্ট্যান্ট URL</translation>
 <translation id="603410445099326293">POST ব্যবহার করে এমন প্রস্তাবনা URL এর প্যারামিটারগুলি</translation>
 <translation id="6034341625190551415">সর্বজনীন সেশন ও কিয়স্ক অ্যাকাউন্টের ধরন নিয়ন্ত্রণ করে।</translation>
@@ -3117,37 +3035,6 @@
       এই নীতি ফলস হিসেবে সেট করা থাকলে, বিল্ট-ইন DNS ক্লায়েন্ট কখনও ব্যবহার করা হবে না।
 
       এই নীতি সেট করা না থাকলে MacOS, Android (ব্যক্তিগত DNS বা VPN চালু না থাকলে) ও ChromeOS-এ বিল্ট-ইন DNS ক্লায়েন্ট ডিফল্টভাবে চালু থাকবে এবং chrome://flags এডিট করতে বা কমান্ড-লাইন ফ্ল্যাগ উল্লেখ করতে বিল্ট-ইন DNS ক্লায়েন্ট ব্যবহার করা হবে কিনা সেটি ব্যবহারকারী পরিবর্তন করতে পারবেন।</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> ডিফল্ট প্রিন্টার বেছে নেওয়ার নিয়মগুলি ওভাররাইড করে।
-
-      এই নীতি <ph name="PRODUCT_NAME" />-এ ডিফল্ট প্রিন্টার নির্বাচনের জন্য নিয়ম নির্ধারণ করে যা একটি প্রোফাইলের সাথে প্রথমবার প্রিন্ট ক্রিয়াকলাপ ব্যবহার করার সময় ঘটে থাকে।
-
-       এই নীতিটি সেট করা থাকলে, <ph name="PRODUCT_NAME" /> নির্দিষ্ট করা সকল অ্যাট্রিবিউটের সাথে মেলে এমন একটি প্রিন্টার খুঁজে বের করার প্রচেষ্টা চালায় এবং সেটিকে ডিফল্ট প্রিন্টার হিসেবে বেছে নেয়। নীতির সাথে মিল হওয়া প্রথম প্রিন্টারটি বেছে নেওয়া হয়, মিল হয় না সেইসব ক্ষেত্রে যেকোনও ম্যাচিং প্রিন্টার বেছে নেওয়া যাবে, এটি প্রিন্টারগুলির খোঁজ পাওয়ার ক্রমের উপর নির্ভর করে হবে।
-
-      এই নীতিটি সেট না করে রাখা হলে বা সময় সমাপ্ত হওয়ার আগে ম্যাচিং প্রিন্টার পাওয়া না গেলে, বিল্ট-ইন পিডিএফ প্রিন্টারকে ডিফল্ট হিসেবে ধরা হয় অথবা পিডিএফ প্রিন্টার না থাকলে কোনও প্রিন্টার বেছে নেওয়া হয়না।
-
-      মানটিকে JSON অবজেক্ট হিসেবে পার্স করা হয়, যা নিম্নল্লিখিত স্কিমা অনুসরণ করে:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "ম্যাচিং প্রিন্টারের অনুসন্ধানকে প্রিন্টারগুলির একটি নির্দিষ্ট সেটে সীমাবদ্ধ করা হবে কিনা।",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "প্রিন্টার আইডি মেলানোর জন্য রেগুলার এক্সপ্রেশন।",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "প্রিন্টারের ডিসপ্লে নাম মেলানোর জন্য রেগুলার এক্সপ্রেশন।",
-            "type": "string"
-          }
-        }
-      }
-
-<ph name="CLOUD_PRINT_NAME" />-এ কানেক্টেড প্রিন্টারগুলিকে <ph name="PRINTER_TYPE_CLOUD" /> হিসেবে ধরা হয়, বাকি প্রিন্টারগুলিকে <ph name="PRINTER_TYPE_LOCAL" /> হিসেবে শ্রেণীবদ্ধ করা হয়।
-      একটি ফিল্ড বাদ দেওয়ার অর্থ হলো সব মানগুলি ম্যাচ করছে, উদাহরণস্বরূপ, কানেকশন সুনির্দিষ্ট না করলে প্রিন্ট প্রিভিউটি স্থানীয় ও ক্লাউড সহ সকল প্রকারের প্রিন্টার খুঁজতে শুরু করে।
-      নিয়মিত এক্সপ্রেশন প্যাটার্নগুলিকে অবশ্যই JavaScript RegExp সিনট্যাক্স অনুসরণ করতে হয় এবং ম্যাচিং কেস সেনসিটিভ।</translation>
 <translation id="6843296367238757293">এই নীতি বন্ধ করে দেওয়া হয়েছে। এটি ব্যবহার না করাই ভাল। https://support.google.com/chrome/a/answer/7643500 থেকে আরও জানুন।</translation>
 <translation id="684856667300805181">এই নীতিটি <ph name="PRODUCT_NAME" /> ৬৮ থেকে সরিয়ে দেওয়া হয়েছে এবং <ph name="ARC_GLS_POLICY_NAME" /> দ্বারা প্রতিস্থাপিত হয়েছে।</translation>
 <translation id="6856743875250214792">এই নীতিটি বন্ধ করে দেওয়া হয়েছে এবং M66 থেকে সরিয়ে দেওয়া হয়েছে, কারণ এটি শুধুমাত্র অভ্যন্তরীণ পরীক্ষার জন্য ব্যবহার করা হত এবং বর্তমানে এটি একটি নিরাপত্তা ঝুঁকি ছাড়া কিছুই নয়।
@@ -4304,30 +4191,6 @@
       এই নীতি শুধুমাত্র সেইসব ব্যবহারকারীদের ক্ষতি করে যাদেরকে SAML ব্যবহার করে যাচাই করা হয়েছে।
 
       নীতির মান সেকেন্ডে উল্লেখ করতে হবে।</translation>
-<translation id="9027787254195333560">লগ-ইনের স্ক্রিনে যে অবতার ফটোটি ব্যবহারকারীকে উপস্থাপিত করে, এই নীতি আপনাকে সেটি কনফিগার করতে দেয়। ইউআরএলটি উল্লেখ করার মাধ্যমে নীতি সেট করা হয় যেখান থেকে <ph name="PRODUCT_OS_NAME" /> অবতার ফটো এবং ডাউনলোডের সম্পূর্ণতা যাচাই করার জন্য ব্যবহৃত একটি ক্রিপ্টোগ্রাফিক হ্যাশ ডাউনলোড করতে পারে। ফটোটিকে অবশ্যই JPEG ফর্ম্যাটে হতে হবে, এটির সাইজ অবশ্যই যেন ৫১২kB-র বেশি না হয়। ইউআরএলটিকে অবশ্যই কোনও যাচাইকরণ ছাড়াই অ্যাক্সেসযোগ্য হতে হবে।
-
-            অবতার ফটোটি ডাউনলোড করা এবং ক্যাশ করা হয়েছে। যখনই ইউআরএল বা হ্যাশ পরিবর্তিত হবে তখন এটি আবার ডাউনলোড করা হবে।
-
-      ইউআরএল এবং হ্যাশটিকে নিম্নলিখিত স্কিমায় অনুসারী JSON ফর্ম্যাটে প্রকাশ করে, এমন একটি স্ট্রিংয়ে নীতি নির্দিষ্ট করতে হবে:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "যে ইউআরএলটি থেকে অবতার ফটোটি ডাউনলোড হবে।",
-            "type": "string"
-          },
-          "hash": {
-            "description": "অবতার ফটোটির SHA-1 হ্যাশ",
-            "type": "string"
-          }
-        }
-      }
-
-      যদি এই নীতি সেট করা থাকে তাহলে <ph name="PRODUCT_OS_NAME" /> ডাউনলোড হবে এবং অবতার ফটোটি ব্যবহার করবে।
-
-      আপনি যদি এই নীতি সেট করেন তাহলে ব্যবহারকারীরা এটি পরিবর্তন বা ওভাররাইড করতে পারেন না।
-
-      যদি এই নীতি সেট না করেই ছেড়ে দেওয়া হয় তাহলে ব্যবহারকারী লগ-ইনের স্ক্রিনে তার অবতার ফটো বেছে নিতে পারবেন।</translation>
 <translation id="9035964157729712237">যে এক্সটেনশন আইডিগুলি কালোতালিকা থেকে বাদ দিতে হবে</translation>
 <translation id="9038058011835642205">ব্যবহারকারীর কোনও ভূমিকা ছাড়াই নীরবে ইনস্টল হয় এমন ওয়েবসাইটগুলির একটি তালিকাকে নির্দেশ করে। ব্যবহারকারী এই ওয়েবসাইটগুলি আনইনস্টল করতে বা বন্ধ করতে পারেন না।
 
@@ -4340,7 +4203,6 @@
       আপনি যদি এই নীতি সেট করেন তাহলে ব্যবহারকারীরা এটি পরিবর্তন বা ওভাররাইড করতে পারেন না।
 
       নীতির মানটি মিলিসেকেন্ডে নির্দিষ্ট করা উচিত। মানের ব্যাপ্তি হল ৩০ সেকেন্ড থেকে ২৪ ঘণ্টা।</translation>
-<translation id="9042911395677044526">একটি <ph name="PRODUCT_OS_NAME" /> ডিভাইসে প্রত্যেক ব্যবহারকারীতে প্রযোজ্য হবে এমন নেটওয়ার্ক কনফিগারেশন পাঠাতে দেয়৷ নেটওয়ার্ক কনফিগারেশনটি ওপেন নেটওয়ার্ক কনফিগারেশন ফরম্যাট দ্বারা সংজ্ঞায়িত একটি JSON-ফরম্যাট করা স্ট্রিং যা  <ph name="ONC_SPEC_URL" />-এ বর্ণিত</translation>
 <translation id="9050853837490399534">ডিভাইসটি Quick Fix Build-এ আপডেট করা হবে কিনা তা এই নীতি নিয়ন্ত্রণ করে।
 
       এই নীতির মান Quick Fix Build-এ ম্যাপ করা কোনও টোকেনে সেট করা থাকলে এবং অন্য কোনও নীতির দ্বারা আপডেট ব্লক করা না থাকলে, ডিভাইসটি সংশ্লিষ্ট Quick Fix Build-এ আপডেট করা হবে।
@@ -4413,17 +4275,6 @@
       এই নীতি ফলস হিসেবে সেট করা থাকলে, প্রিন্ট প্রিভিউ ডায়লগে 'হেডার এবং ফুটার' বেছে নেওয়া থাকে না এবং ব্যবহারকারীও তা পরিবর্তন করতে পারেন না।
 
       এই নীতি ট্রু হিসেবে সেট করা থাকলে, প্রিন্ট প্রিভিউ ডায়লগে 'হেডার এবং ফুটার' বেছে নেওয়া থাকে এবং ব্যবহারকারী তা পরিবর্তন করতে পারেন না।</translation>
-<translation id="9213347477683611358">ডিভাইসটিতে এখনও কোনো ব্যবহারকারী সাইন-ইন না করে থাকলে, লগ-ইন স্ক্রীনে যে ডিভাইস-লেভেল ওয়ালপেপার দেখানো হয় সেটিকে কনফিগার করে। Chrome OS ডিভাইস যে ইউআরএল-এর মাধ্যমে ওয়ালপেপার ইমেজ ডাউনলোড করতে পারে সেটি নির্দিষ্ট করার মাধ্যমে নীতিটিকে সেট করা হয় এবং ডাইনলোডটির সম্পূর্ণতা যাচাই করতে একটি ক্রিপ্টোগ্রাফিক হ্যাশ ব্যবহার করা হয়। চিত্রটিকে অবশ্যই JPEG ফর্ম্যাটের হতে হবে, এই ফাইলের আকার ১৬MB-র বেশি হতে পারবে না। কোনো প্রমাণীকরণ ছাড়াই ইউআরএলটি অ্যাক্সেসযোগ্য হতে হবে। ওয়ালপেপার চিত্রটি ডাইনলোড করে ক্যাশেতে সঞ্চিত হয়। URL বা হ্যাশ পরিবর্তিত হলেই এটি পুনরায় ডাইনলোড হয়।
-
-      নীতিটিকে একটি স্ট্রিং হিসেবে নির্দিষ্ট করতে হবে যেখানে JSON ফর্ম্যাটে ইউআরএল ও হ্যাশ থাকতে হবে, উদাঃ,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      যদি ডিভাইস ওয়ালপেপার নীতি সেট করা হয়, তাহলে ডিভাইসটিতে এখনও কোনো ব্যবহারকারী প্রবেশ না করে থাকলে Chrome OS ডিভাইস ওয়ালপেপার চিত্রটি ডাউনলোড করে সেটিকে লগ-ইন স্ক্রীনে ব্যবহার করবে। ব্যবহারকারী প্রবেশ করলে, ব্যবহারকারীর ওয়ালপেপার নীতি কার্যকরী হবে।
-
-      যদি ডিভাইস ওয়ালপেপার নীতি সেট না করে রাখা হয়, তাহলে ব্যবহারকারীর ওয়ালপেপার নীতি সেট করা থাকলে, কি দেখানো হবে সেটি সেই নীতি দ্বারা নির্ধারিত হয়।</translation>
 <translation id="9217154963008402249">নেটওয়ার্ক প্যাকেট পর্যবেক্ষণ সংঘটনের হার</translation>
 <translation id="922540222991413931">এক্সটেনশন, অ্যাপ এবং ব্যবহারকারী স্ক্রিপ্ট ইনস্টল উৎস কনফিগার করুন</translation>
 <translation id="924557436754151212">প্রথমবার চালানোর সাথে সাথে ডিফল্ট ব্রাউজার থেকে সেভ করা পাসওয়ার্ডগুলি ইমপোর্ট করুন</translation>
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index ea9f8a7..ed8229d7 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -352,7 +352,6 @@
 
       Advertiment: no et recomanem delegar el control de la versió de <ph name="PRODUCT_OS_NAME" /> a una aplicació de quiosc, ja que podria impedir que el dispositiu rebi actualitzacions de programari i correccions crítiques de seguretat. En definitiva, si es delega el control de la versió de <ph name="PRODUCT_OS_NAME" />, es pot posar els usuaris en perill.</translation>
 <translation id="1675002386741412210">Compatible amb:</translation>
-<translation id="1689963000958717134">Permet aplicar la configuració de la xarxa per a tots els usuaris d'un dispositiu <ph name="PRODUCT_OS_NAME" />. La configuració de la xarxa és una cadena en format JSON, segons la definició del format de la configuració de xarxa oberta que apareix a <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Configura la disponibilitat i el comportament de la funcionalitat d'actualització del microprogramari de <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Les opcions de configuració individuals es poden especificar a les propietats de JSON:
@@ -850,16 +849,6 @@
       Si aquesta opció es desactiva, les pàgines web no podran utilitzar JavaScript i l'usuari no podrà canviar aquesta configuració.
 
       Si s'activa aquesta opció o no es defineix, les pàgines web podran fer servir JavaScript però l'usuari podrà canviar aquesta opció.</translation>
-<translation id="2747157663401642394">Configura les opcions de gestió d'extensions per a <ph name="PRODUCT_NAME" />.
-
-          Aquesta política controla diverses opcions de configuració, com ara les opcions controlades per qualsevol política actual que estigui relacionada amb extensions. Aquesta política substituirà qualsevol política anterior, si totes dues s'han configurat.
-
-          Aquesta política assigna un identificador d'extensió o un URL d'actualització a la configuració corresponent. Amb un identificador d'extensió, la configuració s'aplicarà només a l'extensió especificada. Es pot establir una configuració predeterminada per a l'identificador especial <ph name="DEFAULT_SCOPE" />, que s'aplicarà a totes les extensions que no tinguin establerta una configuració personalitzada en aquesta política. Amb un URL d'actualització, la configuració s'aplicarà a totes les extensions que tinguin el mateix URL d'actualització indicat al fitxer de manifest de l'extensió, tal com es descriu a <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          En les instàncies de Windows que no formin part d'un domini que pertanyi a <ph name="MS_AD_NAME" />, la instal·lació forçada es limita a les aplicacions i les extensions incloses a Chrome Web Store.
-
-          Per obtenir una descripció detallada de les opcions de configuració possibles i de l'estructura d'aquesta política, ves a https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Restringeix l'interval de ports UDP locals utilitzats per WebRTC</translation>
 <translation id="2757054304033424106">Tipus d'extensions i d'aplicacions que es poden instal·lar</translation>
 <translation id="2758084448533744848">Especifica la zona horària aplicada que s'ha d'utilitzar al dispositiu. Quan s'estableix aquesta política, els usuaris del dispositiu no poden substituir la zona horària especificada. Si no es proporciona un valor vàlid, la política continuarà activa amb la zona horària GMT. Si es proporciona una cadena buida, la política s'ignorarà.
@@ -2374,54 +2363,7 @@
 Si s'activa aquest paràmetre, <ph name="PRODUCT_NAME" /> obrirà el diàleg d'impressió del sistema en comptes de la previsualització integrada quan un usuari sol·liciti la impressió d'una pàgina.
 
 Si aquesta política no es defineix o no s'activa, les ordres d'impressió faran que aparegui la pantalla de previsualització d'impressió.</translation>
-<translation id="6022948604095165524">Acció en iniciar</translation>
-<translation id="6023030044732320798">Especifica un conjunt de polítiques que es transferiran al temps d'execució d'ARC. El valor ha d'estar en format JSON vàlid.
-
-      Aquesta política es pot utilitzar per configurar quines aplicacions per a Android s'instal·len automàticament al dispositiu:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identificador d'aplicacions per a Android, per exemple "com.google.android.gm" per a Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Especifica com s'instal·la una aplicació. OPTIONAL: l'aplicació no s'instal·la automàticament, però l'usuari la pot instal·lar. És l'acció predeterminada si aquesta política no s'especifica. PRELOAD: l'aplicació s'instal·la automàticament, però l'usuari la pot desinstal·lar. FORCE_INSTALLED: l'aplicació s'instal·la automàticament i l'usuari no la pot desinstal·lar. BLOCKED: l'aplicació està bloquejada i no es pot instal·lar. Si es va instal·lar sota una política anterior, es desinstal·larà.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Política per concedir sol·licituds de permisos a les aplicacions. PERMISSION_POLICY_UNSPECIFIED: no s'ha especificat la política. Si no s'especifica cap política per concedir un permís a cap nivell, s'utilitzarà el comportament "PROMPT" de manera predeterminada. PROMPT: s'avisa l'usuari perquè concedeixi un permís. GRANT: es concedeix un permís automàticament. DENY: es rebutja un permís automàticament.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Objecte de configuració de JSON específic de l'aplicació amb un conjunt de parells de valor-clau, per exemple, '"managedConfiguration": { "key1": value1, "key2": value2 }'. Les claus es defineixen al fitxer de manifest de l'aplicació.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Per fixar aplicacions al menú d'aplicacions, consulta la política PinnedLauncherApps.</translation>
+<translation id="6022948604095165524">Acció a l'inici</translation>
 <translation id="602728333950205286">URL instantani del proveïdor de cerca predeterminat</translation>
 <translation id="603410445099326293">Paràmetres per a l'URL suggerit que utilitza POST</translation>
 <translation id="6034341625190551415">Controla els tipus de compte de sessió pública i de quiosc.</translation>
@@ -2528,7 +2470,7 @@
 <translation id="6221175752766085998">Permet els certificats emesos per ancoratges de confiança locals sense l'extensió subjectAlternativeName</translation>
 <translation id="6224304369267200483">Els URL i els dominis han permès automàticament la confirmació directa de la clau de seguretat</translation>
 <translation id="6233173491898450179">Estableix el directori de baixada</translation>
-<translation id="6244210204546589761">URL que s'han d'obrir en iniciar</translation>
+<translation id="6244210204546589761">URL que s'han d'obrir a l'inici</translation>
 <translation id="6255387031094435995">Permet que les polítiques seleccionades es combinin quan procedeixin de fonts diferents i tinguin el mateix abast i nivell.
 
         Si una política és a la llista i es produeix un conflicte entre dos fonts, com que tenen el mateix abast i nivell, els valors es combinaran en una llista de polítiques nova.
@@ -2745,37 +2687,6 @@
       Si aquesta política s'estableix en "false", no s'utilitzarà mai el client DNS integrat.
 
       Si aquesta política es deixa sense establir, el client DNS integrat s'activarà de manera predeterminada a MacOS, Android (quan no estiguin activats ni el DNS privat ni la VPN) i ChromeOS, i els usuaris podran canviar la configuració i establir si s'utilitzarà o no el client DNS integrat editant chrome://flags o especificant una marca de la línia d'ordres.</translation>
-<translation id="6838056959556423778">Substitueix les regles de selecció de la impressora predeterminada a <ph name="PRODUCT_NAME" />.
-
-      Aquesta política determina les regles per seleccionar la impressora predeterminada a <ph name="PRODUCT_NAME" /> la primera vegada que s'utilitza la funció d'imprimir amb un perfil.
-
-      Si aquesta política s'estableix, <ph name="PRODUCT_NAME" /> prova de trobar una impressora que compleixi tots els atributs especificats i la selecciona com a impressora predeterminada. Se selecciona la primera impressora detectada que compleixi la política, però, si n'hi ha més d'una, se'n pot seleccionar qualsevol en funció de l'ordre en què es detectin.
-
-      Si aquesta política no s'estableix o no es troba cap impressora adequada durant el temps d'espera, s'utilitza la impressora PDF integrada de manera predeterminada o, si no està disponible, no se'n selecciona cap.
-
-      El valor s'analitza com a objecte JSON, d'acord amb l'esquema següent:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Indica si la cerca de la impressora es limita a un grup específic d'impressores.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Expressió regular corresponent a l'identificador de la impressora.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Expressió regular corresponent al nom de visualització de la impressora.",
-            "type": "string"
-          }
-        }
-      }
-
-      Les impressores connectades a <ph name="CLOUD_PRINT_NAME" /> es consideren <ph name="PRINTER_TYPE_CLOUD" />; la resta es classifiquen com a <ph name="PRINTER_TYPE_LOCAL" />.
-      Si es deixa un camp en blanc, vol dir que tots els valors són vàlids. Si, per exemple, no s'especifica la connectivitat, la previsualització d'impressió iniciarà la detecció de tot tipus d'impressores, locals i en núvol.
-      Els patrons de les expressions regulars han de seguir la sintaxi de JavaScript RegExp i la concordança distingeix entre majúscules i minúscules.</translation>
 <translation id="6843296367238757293">Aquesta política es considera obsoleta. No es recomana fer-la servir. Més informació a https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Aquesta política s'ha suprimit a <ph name="PRODUCT_NAME" /> 68 i s'ha substituït per <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Aquesta política està obsoleta i s'ha tret d'M66, perquè només s'utilitzava per fer proves internes i és un requisit de seguretat.
@@ -3799,7 +3710,6 @@
 
       Cada element de la política inclòs a la llista és un objecte amb un membre obligatori ("url") i dos membres opcionals ("default_launch_container" i "create_desktop_shortcut"). "url" ha de ser l'URL de l'aplicació web que cal instal·lar, "launch_container" ha de ser "window" (finestra) o "tab" (pestanya) per indicar com s'obrirà l'aplicació web un cop instal·lada i "create_desktop_shortcut" ha de ser "true" si cal crear una drecera de l'escriptori a Linux i Windows. Si "default_launch_container" s'omet, l'aplicació s'obrirà en una pestanya de manera predeterminada. Independentment del valor de "default_launch_container", els usuaris poden canviar el contenidor en què s'obrirà l'aplicació. Si "create_desktop_shortcuts" s'omet, no es crearà cap drecera de l'escriptori.</translation>
 <translation id="9038839118379817310">Activa la Wi-Fi</translation>
-<translation id="9042911395677044526">Permet aplicar la configuració de la xarxa per usuari a un dispositiu <ph name="PRODUCT_OS_NAME" />. La configuració de la xarxa és una cadena en format JSON, segons la definició del format de la configuració de xarxa oberta que apareix a <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Aquesta política controla si el dispositiu s'ha d'actualitzar o no a una compilació de correcció ràpida.
 
       Si el valor de la política s'estableix en un testimoni que s'assigna a una compilació de correcció ràpida, el dispositiu s'actualitzarà a la compilació corresponent si l'actualització no està bloquejada per una altra política.
@@ -3862,17 +3772,6 @@
       Si la política s'estableix en "false", l'opció Capçaleres i peus de pàgina no se selecciona al quadre de diàleg de previsualització de la impressió i l'usuari no ho pot canviar.
 
       Si la política s'estableix en "true", l'opció Capçaleres i peus de pàgina se selecciona al quadre de diàleg de previsualització de la impressió i l'usuari no ho pot canviar.</translation>
-<translation id="9213347477683611358">Configura la imatge de fons de la pantalla d'inici de sessió d'un dispositiu si ningú no hi ha iniciat la sessió. Per establir la política, cal especificar l'URL que pot fer servir el dispositiu de Chrome OS per baixar la imatge i un resum criptogràfic per verificar la integritat de la baixada. La imatge ha de ser en format JPEG i no ha de superar els 16 MB. S'ha de poder accedir a l'URL sense cap tipus d'autenticació. La imatge de fons de pantalla es baixa i es desa a la memòria cau, i es tornarà a baixar si es modifica l'URL o el resum.
-
-      La política s'ha d'especificar en forma de cadena amb l'URL i el resum en format JSON. Per exemple:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Si la política de fons de pantalla del dispositiu s'estableix, el dispositiu de Chrome OS baixarà la imatge i la farà servir a la pantalla d'inici de sessió si ningú no ha iniciat la sessió. Un cop que un usuari l'hagi iniciada, la política de fons de pantalla de l'usuari s'executarà.
-
-      Si la política de fons de pantalla del dispositiu no s'estableix, la política de fons de pantalla de l'usuari determinarà el que es mostra si està establerta. </translation>
 <translation id="9217154963008402249">Freqüència dels paquets de xarxa de supervisió</translation>
 <translation id="922540222991413931">Configura fonts d'instal·lació d'extensions, d'aplicacions i de scripts d'usuari</translation>
 <translation id="924557436754151212">Importació de les contrasenyes desades des del navegador predeterminat en la primera execució</translation>
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index 59c7406..908459f 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -385,7 +385,6 @@
 
       Upozornění: Delegovat řízení verze systému <ph name="PRODUCT_OS_NAME" /> na terminálovou aplikaci se nedoporučuje, neboť to zařízení může zabránit v přijímání aktualizací softwaru a kritických oprav zabezpečení. Delegování řízení verze systému <ph name="PRODUCT_OS_NAME" /> by uživatele mohlo vystavit riziku.</translation>
 <translation id="1675002386741412210">Podpora:</translation>
-<translation id="1689963000958717134">Umožňuje přenést nastavení sítě, která se budou používat pro všechny uživatele zařízení se systémem <ph name="PRODUCT_OS_NAME" />. Konfigurace sítě je řetězec ve formátu JSON, který se řídí definicí formátu Open Network Configuration popsanou na stránce <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="1704516734140344991">Slouží ke konfiguraci dostupnosti a chování funkce aktualizace firmwaru <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Jednotlivá nastavení lze zadat ve vlastnostech objektu JSON:
@@ -936,16 +935,6 @@
       Pokud je toto nastavení deaktivováno, webové stránky nemohou spouštět kód JavaScript a uživatel nemůže toto nastavení změnit.
 
       Pokud je toto nastavení aktivováno nebo není nastaveno na konkrétní hodnotu, webové stránky mohou spouštět kód JavaScript, ale uživatel může toto nastavení změnit.</translation>
-<translation id="2747157663401642394">Konfiguruje nastavení správy rozšíření prohlížeče <ph name="PRODUCT_NAME" />.
-
-          Tato zásada řídí několik nastavení, včetně nastavení nakonfigurovaných pomocí existujících zásad pro rozšíření. Pokud je tato zásada nastavená, přepíše všechny starší nastavené zásady.
-
-          Tato zásada mapuje ID nebo adresu URL pro aktualizaci rozšíření na jeho konfiguraci. Pokud je definováno ID rozšíření, použije se konfigurace pouze pro konkrétní rozšíření. Pomocí zvláštního ID <ph name="DEFAULT_SCOPE" /> lze nastavit výchozí konfiguraci. Tato konfigurace se použije pro všechna rozšíření, která v této zásadě nemají nastavenou vlastní konfiguraci. Pokud je definována adresa URL pro aktualizaci, použije se konfigurace pro všechna rozšíření, která mají v manifestu uvedenou přesně tuto adresu URL pro aktualizaci (viz <ph name="LINK_TO_EXTENSION_DOC1" />).
-
-          U instancí systému Windows, které nejsou připojené k doméně <ph name="MS_AD_NAME" />, je vynucená instalace omezena pouze na aplikace a rozšíření z Internetového obchodu Chrome.
-
-          Úplný popis možných nastavení a struktury této zásady najdete na stránce https://www.chromium.org/administrators/policy-list-3/extension-settings-full.
-          </translation>
 <translation id="2753637905605932878">Omezit rozsah místních portů UDP používaných rozhraním WebRTC</translation>
 <translation id="2757054304033424106">Typy rozšíření nebo aplikací, které mohou být nainstalovány</translation>
 <translation id="2758084448533744848">Udává časové pásmo, jehož použití se má v zařízení vynutit. Když je tato zásada nastavená, uživatelé na zařízení zadané časové pásmo nemohou přepsat. Pokud zadáte neplatnou hodnotu, bude zásada aktivována s použitím hodnoty „GMT“. Pokud zadáte prázdný řetězec, bude tato zásada ignorována.
@@ -1176,9 +1165,9 @@
 
       <ph name="PRINTER_AUTOCONF" /> je logický příznak, který udává, zda se má k nastavení tiskárny použít technologie IPP Everywhere. Tento příznak je podporován ve verzi 76 a novějších verzích systému <ph name="PRODUCT_OS_NAME" />.
 
-      Je vyžadováno, aby buď pole <ph name="PRINTER_EFFECTIVE_MODEL" /> obsahovalo název tiskárny, nebo byl příznak <ph name="PRINTER_AUTOCONF" /> nastavený na hodnotu true. Tiskárny s oběma těmito nastaveními nebo bez žádného z nich budou ignorovány.
+      Pole <ph name="PRINTER_EFFECTIVE_MODEL" /> musí obsahovat název tiskárny, nebo je třeba nastavit příznak <ph name="PRINTER_AUTOCONF" /> na hodnotu true. Tiskárny s oběma těmito nastaveními nebo bez žádného z nich budou ignorovány.
 
-      Nastavení tiskárny se dokončí při jejím prvním použití.  Soubory PPD se stáhnou až při použití tiskárny.  Často používané soubory PPD budou následně uloženy do mezipaměti.
+      Nastavení tiskárny se dokončí při prvním použití.  Soubory PPD se stáhnou až při použití tiskárny.  Často používané soubory PPD budou následně uloženy do mezipaměti.
 
       Tato zásada nemá vliv na to, zda uživatelé mohou konfigurovat tiskárny na jednotlivých zařízeních.  Je zamýšlena jako doplněk ke konfiguraci tiskáren ze strany jednotlivých uživatelů.
 
@@ -1247,7 +1236,7 @@
 <translation id="3220624000494482595">Je-li terminálová aplikace aplikace Android, nebude mít nad verzí systému <ph name="PRODUCT_OS_NAME" /> kontrolu ani v případě, že je tato zásada nastavena na hodnotu <ph name="TRUE" />.</translation>
 <translation id="3236046242843493070">Vzory adres URL, ze kterých je možné instalovat rozšíření, aplikace a uživatelské skripty</translation>
 <translation id="3240609035816615922">Zásada přístupu ke konfiguraci tiskáren.</translation>
-<translation id="3240655340884151271">Adresa MAC rozhraní NIC vestavěného v doku</translation>
+<translation id="3240655340884151271">Adresa MAC síťové karty vestavěné v doku</translation>
 <translation id="3243309373265599239">Udává dobu nečinnosti uživatele, po které bude při napájení ze sítě snížen jas obrazovky.
 
           Pokud je tato zásada nastavena hodnotu větší než nula, jedná se o dobu, po kterou musí uživatel zůstat v nečinnosti, než systém <ph name="PRODUCT_OS_NAME" /> sníží jas obrazovku.
@@ -1634,19 +1623,19 @@
       Pokud je tato zásada nastavena na hodnotu true nebo ponechána bez nastavení, uživatelé budou moci při registraci systému Chrome OS uplatňovat zvláštní nabídky.
 
       Pokud je tato zásada nastavena na hodnotu false, uživatelé zvláštní nabídky nebudou moci uplatnit.</translation>
-<translation id="4008233182078913897">Určuje seznam aplikací a rozšíření, které se instalují na pozadí bez zásahu uživatele a které uživatel nemůže odinstalovat ani deaktivovat. Všechna oprávnění požadovaná aplikacemi nebo rozšířeními jsou udělována implicitně bez zásahu uživatele, a to včetně všech dodatečných oprávnění požadovaných budoucími verzemi aplikace nebo rozšíření. Kromě toho jsou udělována také oprávnění k používání těchto rozhraní API pro rozšíření: enterprise.deviceAttributes a enterprise.platformKeys. (Tato rozhraní API jsou k dispozici pouze u aplikací/rozšíření, jejichž instalace je vynucena.)
+<translation id="4008233182078913897">Určuje seznam aplikací a rozšíření, které se instalují na pozadí bez zásahu uživatele a které uživatel nemůže odinstalovat ani deaktivovat. Všechna oprávnění požadovaná aplikacemi nebo rozšířeními jsou udělována implicitně bez zásahu uživatele, a to včetně všech dodatečných oprávnění požadovaných budoucími verzemi aplikace nebo rozšíření. Kromě toho jsou udělena oprávnění těmto rozhraním API rozšíření: enterprise.deviceAttributes a enterprise.platformKeys. (Tato rozhraní API nejsou k dispozici aplikacím/rozšířením, jejichž instalace není vynucena.)
 
-Tato zásada má přednost před potenciálně konfliktní zásadou <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />. Bude-li aplikace nebo rozšíření, které bylo dříve vynuceně nainstalováno, z tohoto seznamu odebráno, <ph name="PRODUCT_NAME" /> je automaticky odinstaluje.
+          Tato zásada má přednost před potenciálně konfliktní zásadou <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />. Bude-li aplikace nebo rozšíření, které bylo dříve vynuceně nainstalováno, z tohoto seznamu odebráno, <ph name="PRODUCT_NAME" /> je automaticky odinstaluje.
 
-U instancí systému Windows, které nejsou propojeny s doménou <ph name="MS_AD_NAME" />, je vynucená instalace omezena pouze na aplikace a rozšíření z Internetového obchodu Chrome.
+U instancí systému Windows, které nejsou propojeny s doménou <ph name="MS_AD_NAME" />, je vynucená instalace omezena pouze na aplikace a rozšíření z Internetového obchodu Chrome.
 
-Zdrojový kód libovolného rozšíření mohou uživatelé pomocí Nástrojů pro vývojáře upravit (což může způsobit, že rozšíření nebude fungovat). Pokud je to problém, nastavte zásadu <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
+          Zdrojový kód libovolného rozšíření mohou uživatelé pomocí Nástrojů pro vývojáře upravit (což může způsobit, že rozšíření nebude fungovat). Pokud je to problém, nastavte zásadu <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
 
-Každá položka v seznamu zásady představuje řetězec, který obsahuje ID rozšíření a volitelně také adresu URL pro aktualizaci oddělené středníkem (<ph name="SEMICOLON" />). ID rozšíření je řetězec s 32 písmeny a naleznete jej například zde: <ph name="CHROME_EXTENSIONS_LINK" /> (v režimu pro vývojáře). Pokud je zadána adresa URL pro aktualizaci, měla by odkazovat na dokument XML manifestu aktualizace (viz <ph name="LINK_TO_EXTENSION_DOC1" />). Ve výchozím nastavení se použije adresa URL pro aktualizaci Internetového obchodu Chrome (v současné době https://clients2.google.com/service/update2/crx). Adresa URL pro aktualizaci nastavená v této zásadě slouží pouze k počáteční instalaci. Další aktualizace rozšíření budou používat adresu URL pro aktualizaci uvedenou v manifestu rozšíření. Upozorňujeme, že až do verze 67 prohlížeče <ph name="PRODUCT_NAME" /> bylo explicitní zadání adresy URL pro aktualizaci povinné.
+          Každá položka v seznamu zásady představuje řetězec, který obsahuje ID rozšíření a volitelně také adresu URL pro aktualizaci oddělené středníkem (<ph name="SEMICOLON" />). ID rozšíření je řetězec s 32 písmeny a naleznete jej například zde: <ph name="CHROME_EXTENSIONS_LINK" /> (v režimu pro vývojáře). Pokud je zadána adresa URL pro aktualizaci, měla by odkazovat na dokument XML manifestu aktualizace (viz <ph name="LINK_TO_EXTENSION_DOC1" />). Ve výchozím nastavení se použije adresa URL pro aktualizaci Internetového obchodu Chrome (v současné době https://clients2.google.com/service/update2/crx). Adresa URL pro aktualizaci nastavená v této zásadě slouží pouze k počáteční instalaci. Pro následné aktualizace rozšíření se použije adresa URL pro aktualizaci uvedená v manifestu rozšíření. Upozorňujeme, že až do verze 67 prohlížeče <ph name="PRODUCT_NAME" /> bylo explicitní zadání adresy URL pro aktualizaci povinné.
 
-Například <ph name="EXTENSION_POLICY_EXAMPLE" /> nainstaluje rozšíření s ID <ph name="EXTENSION_ID_SAMPLE" /> ze standardní adresy URL pro aktualizaci z Internetového obchodu Chrome. Další informace o hostování rozšíření viz <ph name="LINK_TO_EXTENSION_DOC2" />.
+          Například <ph name="EXTENSION_POLICY_EXAMPLE" /> nainstaluje rozšíření s ID <ph name="EXTENSION_ID_SAMPLE" /> ze standardní adresy URL pro aktualizaci z Internetového obchodu Chrome. Další informace o hostování rozšíření viz <ph name="LINK_TO_EXTENSION_DOC2" />.
 
-Je-li tato zásada ponechána nenastavená, žádné aplikace ani rozšíření se automaticky neinstalují a uživatel v prohlížeči <ph name="PRODUCT_NAME" /> může kteroukoliv aplikaci nebo rozšíření odinstalovat.
+Je-li tato zásada ponechána nenastavená, žádné aplikace ani rozšíření se automaticky neinstalují a uživatel v prohlížeči <ph name="PRODUCT_NAME" /> může kteroukoliv aplikaci nebo rozšíření odinstalovat.
 
 Tato zásada se nevztahuje na anonymní režim.</translation>
 <translation id="4008507541867797979">Pokud je tato zásada nastavena na hodnotu true nebo není nakonfigurována, bude <ph name="PRODUCT_OS_NAME" /> na přihlašovací obrazovce ukazovat existující uživatele a umožní vybrat si z nich.
@@ -1698,30 +1687,6 @@
       Tato zásada má vliv pouze na uživatele, kteří používají ověření pomocí technologie SAML.</translation>
 <translation id="4105989332710272578">Deaktivovat vynucování zásad Certificate Transparency pro seznam adres URL</translation>
 <translation id="4121350739760194865">Zabraňuje zobrazování propagace aplikací na stránce Nová karta</translation>
-<translation id="4125606414556046117">Tato zásada umožňuje nakonfigurovat obrázek tapety, který se zobrazuje na ploše a na pozadí přihlašovací obrazovky daného uživatele. Zásadu nastavíte zadáním adresy URL, ze které může <ph name="PRODUCT_OS_NAME" /> obrázek tapety stáhnout, a kryptografické hodnoty hash, která slouží k ověření integrity staženého obsahu. Obrázek musí být ve formátu JPEG a jeho velikost nesmí překročit 16 MB. Adresa URL musí být přístupná bez ověření.
-
-      Obrázek tapety se stáhne a uloží do mezipaměti. Při každé změně adresy URL nebo hodnoty hash se stáhne znovu.
-
-      Tuto zásadu je třeba zadat jako řetězec, který udává adresu URL a hodnotu hash ve formátu JSON, a to podle následujícího schématu:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Adresa URL, ze které lze obrázek tapety stáhnout.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hodnota hash SHA-256 obrázku tapety.",
-            "type": "string"
-          }
-        }
-      }
-
-      Pokud je tato zásada nastavená, systém <ph name="PRODUCT_OS_NAME" /> obrázek tapety stáhne a použije.
-
-      Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat.
-
-      Pokud je tato zásada ponechána nenastavená, uživatel si může zvolit, jaký obrázek bude mít zobrazený na ploše a na pozadí přihlašovací obrazovky.</translation>
 <translation id="412697421478384751">Povolit uživatelům nastavovat slabé kódy PIN pro odemknutí obrazovky</translation>
 <translation id="4138655880188755661">Časový limit</translation>
 <translation id="4144164749344898721">Tato zásada udává několik nastavení strategie řízení spotřeby pro případ, že uživatel přestane být aktivní.
@@ -2546,7 +2511,7 @@
 <translation id="5765780083710877561">Popis:</translation>
 <translation id="5770738360657678870">Verze pro vývojáře (mohou být nestabilní)</translation>
 <translation id="5774856474228476867">Adresa URL vyhledávání výchozího poskytovatele vyhledávání</translation>
-<translation id="5775235485119094648">Nabít baterii, když je v určitém rozmezí.</translation>
+<translation id="5775235485119094648">Nabíjet baterii, když je v určitém rozmezí.</translation>
 <translation id="5776485039795852974">Dotázat se vždy, když se webové stránky snaží zobrazit oznámení na ploše</translation>
 <translation id="5781412041848781654">Určuje knihovnu GSSAPI, která bude použita pro ověření v protokolu HTTP. Nastavit lze buď pouze název knihovny, nebo celou cestu.
 
@@ -2653,7 +2618,7 @@
 <translation id="5950205771952201658">Vzhledem k tomu, že online kontroly zamítnutých certifikátů nepřinášejí žádné efektivní bezpečnostní výhody a také snadno selhávají, jsou v prohlížeči <ph name="PRODUCT_NAME" /> verze 19 a vyšší ve výchozím nastavení deaktivovány. Nastavíte-li tuto zásadu na hodnotu True, obnoví se předchozí chování a budou prováděny online kontroly OCSP/CRL.
 
 Pokud tato zásada není nastavena nebo je nastavena na hodnotu False, <ph name="PRODUCT_NAME" /> nebude u verzí <ph name="PRODUCT_NAME" /> 19 a novějších provádět online kontroly zamítnutých certifikátů.</translation>
-<translation id="5961137303188584693">Adresa MAC rozhraní NIC vestavěného v zařízení</translation>
+<translation id="5961137303188584693">Adresa MAC síťové karty vestavěné v zařízení</translation>
 <translation id="5966615072639944554">Rozšíření, která mohou používat rozhraní API vzdáleného ověření identity</translation>
 <translation id="5983708779415553259">Výchozí chování pro stránky, které nejsou součástí žádného obsahového balíčku</translation>
 <translation id="5997543603646547632">Ve výchozím nastavení použít 24hodinový formát</translation>
@@ -2664,53 +2629,6 @@
 
       Pokud tato zásada není nastavena nebo je nastavena na hodnotu false, příkaz tisku zobrazí obrazovku s náhledem tisku.</translation>
 <translation id="6022948604095165524">Akce při spuštění</translation>
-<translation id="6023030044732320798">Určuje sadu zásad, které budou předány běhovému prostředí ARC. Hodnota musí být platný objekt JSON.
-
-      Pomocí této zásady lze nakonfigurovat, které aplikace Android budou v zařízení automaticky nainstalovány:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identifikátor aplikace Android, například „com.google.android.gm“ pro Gmail.",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Udává typ instalace aplikace. OPTIONAL: Aplikace není nainstalována automaticky, ale uživatel ji může nainstalovat. Toto je výchozí nastavení, pokud tato zásada není zadána. PRELOAD: Aplikace je automaticky nainstalována, ale uživatel ji může odinstalovat. FORCE_INSTALLED: Aplikace je automaticky nainstalována a uživatel ji nemůže odinstalovat. BLOCKED: Aplikace je blokována a nelze ji nainstalovat. Pokud byla na základě předchozí zásady nainstalována, odinstaluje se.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Zásada k udělování žádostí o oprávnění aplikacím. PERMISSION_POLICY_UNSPECIFIED: Zásada není zadána. Pokud pro oprávnění není zadána žádná zásada na žádné úrovni, použije se ve výchozím nastavení chování PROMPT. PROMPT: Vyzvat uživatele k udělení oprávnění. GRANT: Automaticky oprávnění udělit. DENY: Automaticky oprávnění zamítnout.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Konfigurační objekt JSON specifický pro aplikaci tvořený sadou párů klíč–hodnota, například "managedConfiguration": { "key1": value1, "key2": value2 }. Klíče jsou definovány v manifestu aplikace.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Chcete-li aplikace připnout ke spouštěči, vyhledejte zásadu PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Adresa URL dynamického vyhledávání výchozího poskytovatele vyhledávání</translation>
 <translation id="603410445099326293">Parametry pro adresu URL návrhu, která používá metodu POST</translation>
 <translation id="6034341625190551415">Ovládá typy účtů veřejných relací a veřejných terminálů</translation>
@@ -3050,37 +2968,6 @@
       Pokud je tato zásada nastavená na hodnotu false, integrovaný klient DNS se nikdy nepoužije.
 
       Pokud tato zásada není nastavená, integrovaný klient DNS bude v systémech MacOS, Android (když není zapnutá funkce Soukromé DNS ani VPN) a ChromeOS ve výchozím nastavení zapnutý a uživatelé jeho používání budou moci změnit úpravou příznaku chrome://flags nebo zadáním příznaku příkazového řádku.</translation>
-<translation id="6838056959556423778">Přepíše v prohlížeči <ph name="PRODUCT_NAME" /> pravidla výběru výchozí tiskárny.
-
-      Tato zásada určuje pravidla pro výběr výchozí tiskárny v prohlížeči <ph name="PRODUCT_NAME" />, který se provede při prvním použití funkce tisku v profilu.
-
-      Je-li tato zásada nastavena, <ph name="PRODUCT_NAME" /> se pokusí najít tiskárnu, která odpovídá všem zadaným atributům, a vybrat ji jako výchozí. Bude vybrána první tiskárna, která tuto zásadu splňuje. Pokud zásadě odpovídá více tiskáren, může být v závislosti na tom, v jakém pořadí jsou tiskárny objeveny, vybrána kterákoliv z nich.
-
-      Pokud tato zásada není nastavena nebo do vypršení časového limitu odpovídající tiskárna není nalezena, vybere se integrovaná virtuální tiskárna na vytváření souborů PDF. Pokud tiskárna na vytváření souborů PDF není k dispozici, nebude vybrána žádná tiskárna.
-
-      Hodnota se analyzuje jako objekt JSON odpovídající následujícímu schématu:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Informace o tom, zda má být vyhledávání odpovídající tiskárny omezeno na konkrétní množinu tiskáren.",
-            "type": "string"
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regulární výraz, kterému musí odpovídat ID tiskárny.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regulární výraz, kterému musí odpovídat zobrazovaný název tiskárny.",
-            "type": "string"
-          }
-        }
-      }
-
-      Tiskárny připojené ke službě <ph name="CLOUD_PRINT_NAME" /> jsou považovány za cloudové („<ph name="PRINTER_TYPE_CLOUD" />“), ostatní jsou klasifikovány jako místní („<ph name="PRINTER_TYPE_LOCAL" />“).
-      Vynechání pole znamená, že v něm budou vyhovovat všechny hodnoty. Pokud například nezadáte způsob připojení, při náhledu tisku se spustí vyhledávání všech typů tiskáren: místních i cloudových.
-      Regulární výrazy musejí odpovídat syntaxi objektů RegExp jazyka JavaScript a při vyhledávání shod se rozlišují velká a malá písmena.</translation>
 <translation id="6843296367238757293">Podpora této zásady byla ukončena. Doporučujeme nepoužívat ji. Další informace najdete na stránce https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Tato zásada byla ve verzi 68 prohlížeče <ph name="PRODUCT_NAME" /> odstraněna a nahrazena zásadou <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Tato zásada je zastaralá a ve verzi M66 byla odstraněna, protože byla používána pouze k internímu testování a představovala bezpečnostní ohrožení.
@@ -4204,30 +4091,6 @@
       Tato zásada má vliv pouze na uživatele, kteří provedli ověření pomocí technologie SAML.
 
       Hodnota zásady se zadává v sekundách.</translation>
-<translation id="9027787254195333560">Tato zásada umožňuje nakonfigurovat obrázek avatara, který na přihlašovací obrazovce představuje uživatele. Zásadu nastavíte zadáním adresy URL, ze které systém <ph name="PRODUCT_OS_NAME" /> může obrázek avatara stáhnout, a kryptografické hodnoty hash, která slouží k ověření integrity staženého obsahu. Obrázek musí být ve formátu JPEG a jeho velikost nesmí překročit 512 kB. Adresa URL musí být přístupná bez ověření.
-
-      Obrázek avatara se stáhne a uloží do mezipaměti. Při každé změně adresy URL nebo hodnoty hash se stáhne znovu.
-
-      Tuto zásadu je třeba zadat jako řetězec, který udává adresu URL a hodnotu hash ve formátu JSON, a to podle následujícího schématu:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Adresa URL, ze které lze obrázek avatara stáhnout",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hodnota hash SHA-256 obrázku avatara",
-            "type": "string"
-          }
-        }
-      }
-
-      Pokud tuto zásadu nastavíte, systém <ph name="PRODUCT_OS_NAME" /> obrázek avatara stáhne a použije.
-
-      Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat.
-
-      Pokud zásadu nenastavíte, uživatel bude moci sám zvolit, jaký obrázek avatara jej bude na přihlašovací obrazovce představovat.</translation>
 <translation id="9035964157729712237">ID rozšíření, která mají být vyňata ze seznamu zakázaných</translation>
 <translation id="9038058011835642205">Určuje seznam webových stránek, které se instalují na pozadí bez zásahu uživatele a které uživatel nemůže odinstalovat ani deaktivovat.
 
@@ -4240,7 +4103,6 @@
       Pokud tuto zásadu nastavíte, uživatelé ji nebudou moci změnit ani přepsat.
 
       Hodnota této zásady se zadává v milisekundách. Místo hodnot mimo rozsah od 30 sekund do 24 hodin se použijí příslušné krajní hodnoty tohoto rozsahu.</translation>
-<translation id="9042911395677044526">Umožňuje přenést nastavení sítě, která se uplatní pro jednotlivé uživatele v zařízení se systémem <ph name="PRODUCT_OS_NAME" />. Konfigurace sítě je řetězec ve formátu JSON, který se řídí definicí formátu Open Network Configuration popsanou na stránce <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="9050853837490399534">Tato zásada určuje, zda se má zařízení aktualizovat na sestavení Quick Fix Build.
 
       Pokud je hodnota zásady nastavená na token, který je namapován k sestavení Quick Fix Build, aktualizuje se zařízení na odpovídající sestavení Quick Fix Build (jestliže aktualizaci neblokuje jiná zásada).
@@ -4318,17 +4180,6 @@
 Pokud je nastavena na false, možnost Záhlaví a zápatí není v dialogovém okně náhledu tisku vybrána a uživatel to nemůže změnit.
 
 Pokud je nastavena na true, možnost Záhlaví a zápatí je v dialogovém okně náhledu tisku vybrána a uživatel to nemůže změnit.</translation>
-<translation id="9213347477683611358">Slouží ke konfiguraci obrázku tapety na úrovni zařízení, který se bude zobrazovat na přihlašovací obrazovce, pokud se do zařízení dosud nepřihlásil žádný uživatel. Zásadu nastavíte zadáním adresy URL, ze které může zařízení se systémem Chrome OS obrázek tapety stáhnout, a kryptografické hodnoty hash k ověření integrity staženého obsahu. Obrázek musí být ve formátu JPEG a jeho velikost nesmí překročit 16 MB. Adresa URL musí být přístupná bez ověření. Obrázek tapety se stáhne a uloží do mezipaměti. Při každé změně adresy URL nebo hodnoty hash se obrázek stáhne znovu.
-
-      Tuto zásadu je třeba zadat jako řetězec, který udává adresu URL a hodnotu hash ve formátu JSON. Příklad:
-      {
-        "url": "https://example.com/tapeta_zarizeni.jpg",
-        "hash": "hashukazkovetapety"
-      }
-
-      Pokud je zásada tapety zařízení nastavena, zařízení se systémem Chrome OS stáhne obrázek tapety a použije jej na přihlašovací obrazovce, pokud se do zařízení dosud nepřihlásil žádný uživatel. Po přihlášení se použije zásada pro tapetu příslušného uživatele.
-
-      Pokud zásada tapety zařízení není nastavena, zobrazený obrázek závisí na zásadě tapety uživatele (pokud je nastavena).</translation>
 <translation id="9217154963008402249">Frekvence odesílání sledovacích síťových paketů</translation>
 <translation id="922540222991413931">Konfigurovat zdroje instalací rozšíření, aplikací a uživatelských skriptů</translation>
 <translation id="924557436754151212">Importování uložených hesel z výchozího prohlížeče při prvním spuštění</translation>
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index c35ca5a..9cfaa411 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -399,7 +399,6 @@
 
       Advarsel! Det frarådes at delegere kontrol over <ph name="PRODUCT_OS_NAME" />-versionen til en terminalapp, da det kan forhindre enheden i at modtage softwareopdateringer og kritiske sikkerhedsrettelser. Delegering af kontrol over <ph name="PRODUCT_OS_NAME" />-versionen kan udgøre en sikkerhedsrisiko for brugerne.</translation>
 <translation id="1675002386741412210">Understøttes på:</translation>
-<translation id="1689963000958717134">Tillader, at netværkskonfigurationen gøres gældende for alle brugere af en <ph name="PRODUCT_OS_NAME" />-enhed. Netværkskonfigurationen er en JSON-formateret streng, som er defineret af formatet Open Network Configuration som beskrevet på <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Konfigurerer tilgængeligheden og adfærden for funktionen til opdatering af <ph name="TPM_FIRMWARE_UPDATE_TPM" />-firmware.
 
       Individuelle indstillinger kan angives i JSON-egenskaber:
@@ -449,7 +448,7 @@
       Hvis politikken er aktiveret, kan brugerne ikke fravælge standardadfærden, hvor hvert website kører i sin egen proces.
       Hvis politikken ikke er angivet eller er deaktiveret, kan brugeren ændre denne indstilling (f.eks. ved at bruge posten "Deaktiver isolering af website" i chrome://flags).
       </translation>
-<translation id="1767673020408652620">Aktivér appanbefaling ved nultilstand i søgefeltet.</translation>
+<translation id="1767673020408652620">Aktivér appanbefaling ved nultilstand i søgefeltet</translation>
 <translation id="1781356041596378058">Denne politik styrer også adgangen til Indstillinger for udviklere i Android. Hvis du angiver denne politik til Sand, kan brugerne ikke få adgang til Indstillinger for udviklere. Hvis du angiver denne politik til Falsk eller ikke angiver den, kan brugerne få adgang til Indstillinger for udviklere ved at trykke syv gange på build-nummeret i Android-appen Indstillinger.</translation>
 <translation id="1793346220873697538">Deaktiver udskrivning med pinkode som standard</translation>
 <translation id="1797233582739332495">Vis brugeren en fast meddelelse, som indikerer, at en genstart er påkrævet</translation>
@@ -937,16 +936,6 @@
       Hvis denne indstilling er deaktiveret, kan websider ikke anvende JavaScript, og brugeren kan ikke ændre denne indstilling.
 
       Hvis denne indstilling er deaktiveret eller ikke angivet, kan websider anvende JavaScript, men brugeren kan ændre denne indstilling.</translation>
-<translation id="2747157663401642394">Konfigurerer indstillinger for administration af udvidelser for <ph name="PRODUCT_NAME" />.
-
-          Denne politik styrer flere indstillinger, herunder indstillinger, der styres af eksisterende politikker vedrørende udvidelser. Denne politik tilsidesætter eventuelle ældre politikker, hvis begge er konfigureret.
-
-          Denne politik knytter et udvidelses-id eller en opdateringswebadresse til dens konfiguration. Med et udvidelses-id anvendes konfigurationen udelukkende på den angivne udvidelse. Der kan angives en standardkonfiguration for det særlige id <ph name="DEFAULT_SCOPE" />, som gælder for alle udvidelser, hvor der ikke er angivet en standardkonfiguration i denne politik. Med en opdateringswebadresse anvendes konfigurationen på alle udvidelser, hvor den nøjagtige opdateringswebadresse er angivet i denne udvidelses manifestfil som beskrevet i <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Fjerninstallation er begrænset til apps og udvidelser, der er angivet i Chrome Webshop, for Windows-forekomster, som ikke er knyttet til et <ph name="MS_AD_NAME" />-domæne.
-
-          Du kan få en komplet beskrivelse af mulige indstillinger og mulig struktur for denne politik på https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Begræns antallet af lokale UDP-porte, der bruges af WebRTC</translation>
 <translation id="2757054304033424106">Typer af udvidelser/apps, der må installeres</translation>
 <translation id="2758084448533744848">Angiver den tidszone, der skal gælde for enheden. Når politikken er konfigureret, kan brugerne på enheden ikke tilsidesætte den angivne tidszone. Hvis der angives en ugyldig værdi, aktiveres politikken med "GMT" i stedet. Hvis der angives en tom streng, ignoreres politikken.
@@ -1185,7 +1174,7 @@
 
       Politikken påvirker ikke, om brugerne kan konfigurere printere på individuelle enheder.  Den er beregnet til at fungere som supplement til den enkelte brugers konfiguration af printere.
 
-      Politikken understøtter udvidelse af <ph name="MACHINE_NAME_VARIABLE" /> til Active Directory-enhedsnavnet eller en af dets understrenge på enheder, der administreres med Active Directory. Hvis enhedsnavnet f.eks. er <ph name="MACHINE_NAME_EXAMPLE" />, erstattes<ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> af de fire tegn, der kommer efter den sjette position, dvs. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Bemærk, at positionen er nulbaseret.
+      Politikken understøtter udvidelse af <ph name="MACHINE_NAME_VARIABLE" /> til Active Directory-enhedsnavnet eller en af dets understrenge på enheder, der administreres med Active Directory. Hvis enhedsnavnet f.eks. er <ph name="MACHINE_NAME_EXAMPLE" />, erstattes <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> af de fire tegn, der kommer efter den sjette position, dvs. <ph name="MACHINE_NAME_PART_EXAMPLE" />. Bemærk, at positionen er nulbaseret.
       </translation>
 <translation id="3072045631333522102">Pauseskærm, som skal bruges på loginskærmen i detailtilstand</translation>
 <translation id="3072847235228302527">Konfigurer servicevilkårene for en enhedslokal konto</translation>
@@ -1706,30 +1695,6 @@
       Politikken berører kun brugere, der godkender via SAML.</translation>
 <translation id="4105989332710272578">Deaktiver håndhævelse af Certifikatsgennemsigtighed for en række webadresser</translation>
 <translation id="4121350739760194865">Undgå, at appkampagner vises på ny fane-siden</translation>
-<translation id="4125606414556046117">Denne politik giver dig mulighed for at konfigurere det baggrundsbillede, der er vist på brugerens skrivebord og loginskærm. Politikken konfigureres ved at angive den webadresse, hvorfra <ph name="PRODUCT_OS_NAME" /> kan downloade baggrundsbilledet og en kryptografisk hash-værdi, der bruges til at bekræfte downloadens integritet. Billedet skal være i .jpeg-format, og størrelsen må ikke overstige 16 MB. Webadressen skal være tilgængelig uden nogen form for godkendelse.
-
-      Baggrundsbilledet downloades og cachelagres. Det downloades igen, når webadressen eller hash-værdien ændres.
-
-      Politikken skal angives som en streng, der udtrykker webadressen og hash-værdien i JSON-format i overensstemmelse med følgende skema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Den webadresse, hvorfra baggrundsbilledet kan downloades.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "SHA-256-hash-værdien for baggrundsbilledet.",
-            "type": "string"
-          }
-        }
-      }
-
-      Hvis denne politik er konfigureret, downloader og anvender <ph name="PRODUCT_OS_NAME" /> baggrundsbilledet.
-
-      Hvis du konfigurerer denne politik, kan brugerne ikke ændre eller tilsidesætte den.
-
-      Hvis politikken ikke er konfigureret, kan brugeren vælge et baggrundsbillede, der skal vises på skrivebordet og på loginskærmen.</translation>
 <translation id="412697421478384751">Giv brugerne mulighed for at konfigurere svage pinkoder som pinkoder til låseskærmen</translation>
 <translation id="4138655880188755661">Tidsgrænse</translation>
 <translation id="4144164749344898721">Denne politik styrer flere indstillinger for strømstyringsstrategien, når brugeren bliver inaktiv.
@@ -2646,59 +2611,12 @@
 
       Hvis denne politik ikke er indstillet eller er indstillet til falsk, aktiverer udskriftskommandoer skærmen Vis udskrift.</translation>
 <translation id="6022948604095165524">Handling ved opstart</translation>
-<translation id="6023030044732320798">Angiver en række politikker, der overgives til ARC-kørselstiden. Værdien skal være en gyldig JSON.
-
-      Denne politik kan bruges til at konfigurere, hvilke Android-apps der automatisk installeres på enheden:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Id for Android-app, f.eks. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Specificerer, hvordan en app installeres. OPTIONAL: Appen installeres ikke automatisk, men brugeren kan installere den. Dette er standarden, hvis denne politik ikke er angivet. PRELOAD: Appen installeres automatisk, men brugeren kan afinstallere den. FORCE_INSTALLED: Appen installeres automatisk, og brugeren kan ikke afinstallere den. BLOCKED: Appen er blokeret og kan ikke installeres. Hvis appen er blevet installeret i overensstemmelse med en tidligere politik, afinstalleres den.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Politik for godkendelse af appanmodninger om tilladelse. PERMISSION_POLICY_UNSPECIFIED: Politikken er ikke angivet. Hvis der ikke er angivet en politik for en tilladelse på noget niveau, bruges funktionsmåden 'PROMPT' som standard. PROMPT: Brugeren anmodes om at give tilladelse. GRANT: Giv automatisk tilladelse. DENY: Afvis automatisk at give tilladelse.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "App-specifik JSON-konfigurationsobjekt med en række nøgleværdipar, f.eks. '"managedConfiguration": { "nøgle1": værdi1, "nøgle2": værdi2 }'. Nøglerne er defineret i appens manifest",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Se PinnedLauncherApps, hvis du vil fastgøre apps til Appliste.</translation>
 <translation id="602728333950205286">Direkte webadresse til standardsøgemaskinen</translation>
 <translation id="603410445099326293">Parametre for forslagswebadresser, som anvender POST</translation>
 <translation id="6034341625190551415">Styrer offentlige kontotyper og terminalkontotyper.</translation>
 <translation id="6034603289689965535">Tillader, at en side viser pop op-vinduer under indlæsning</translation>
 <translation id="6036523166753287175">Aktiver gennemgang af firewall fra vært for fjernadgang</translation>
-<translation id="605475635122964053">Begrænser tilstanden for udskrivning med pinkode. En politik uden konfiguration behandles som ingen begrænsning. Hvis tilstanden ikke er tilgængelig, ignoreres politikken. Bemærk! Funktionen til udskrivning med pinkode kun er aktiveret for printere, som anvender en af protokollerne IPPS, USB eller IPP-over-USB </translation>
+<translation id="605475635122964053">Begrænser tilstanden for udskrivning med pinkode. En politik uden konfiguration behandles som ingen begrænsning. Hvis tilstanden ikke er tilgængelig, ignoreres politikken. Bemærk! Funktionen til udskrivning med pinkode er kun aktiveret for printere, som anvender en af protokollerne IPPS, USB eller IPP-over-USB </translation>
 <translation id="6070667616071269965">Tastaturlayouts for loginskærme på enheder</translation>
 <translation id="6074963268421707432">Tillad ikke, at websites viser skrivebordsunderretninger</translation>
 <translation id="6074964551275531965">Angiv tidsrummet for notifikationer om opdateringer</translation>
@@ -3040,37 +2958,6 @@
       Hvis denne politik er angivet som falsk, bruges den indbyggede DNS-klient aldrig.
 
       Hvis denne politik ikke er angivet, aktiveres den indbyggede DNS-klient som standard i MacOS, Android (når hverken Privat DNS eller VPN er aktiveret) og ChromeOS, og brugerne kan ændre, om den indbyggede DNS-klient bruges, ved at redigere chrome://flags eller angive et kommandolinjeflag.</translation>
-<translation id="6838056959556423778">Tilsidesætter regler for valg af standardprinter i <ph name="PRODUCT_NAME" />.
-
-      Denne politik fastlægger reglerne for valg af standardprinter i <ph name="PRODUCT_NAME" />, som vælges, første gang udskrivningsfunktionen anvendes fra en profil.
-
-      Når denne politik er indstillet, forsøger <ph name="PRODUCT_NAME" /> at finde en printer, der har alle de angivne attributter, og vælge den som standardprinter. Den først fundne printer, der stemmer overens med politikken, vælges. Hvis der er flere match, kan enhver printer vælges ud fra den rækkefølge, som printerne blev fundet i.
-
-      Hvis denne politik ikke indstilles, eller hvis der ikke findes nogen printer, som stemmer overens med politikken, inden timeouten udløber, vælges en indbygget PDF-printer som standard. Hvis der ikke er nogen tilgængelig PDF-printer, vælges der ikke nogen printer.
-
-      Værdien parses som et JSON-objekt i overensstemmelse med følgende skema:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Om søgningen efter en printer, der opfylder attributten, skal begrænses til en specifik gruppe printere.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regulært udtryk, som matcher printer-id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regulært udtryk, som matcher printerens viste navn.",
-            "type": "string"
-          }
-        }
-      }
-
-      Printere, der er forbundet til <ph name="CLOUD_PRINT_NAME" />, klassificeres som <ph name="PRINTER_TYPE_CLOUD" />, mens de øvrige printere klassificeres som <ph name="PRINTER_TYPE_LOCAL" />.
-      Hvis et felt udelades, matcher alle værdier. Hvis du f.eks. ikke specificerer forbindelsen, vil et tryk på Vis udskrift starte en søgning efter alle typer printere – både lokalt og i skyen.
-      Almindelige søgemønstre skal overholde JavaScript RegExp-syntaksen, og der skelnes mellem store og små bogstaver.</translation>
 <translation id="6843296367238757293">Denne politik er forældet. Det anbefales ikke at bruge den. Læs mere på https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Denne politik er blevet fjernet i <ph name="PRODUCT_NAME" /> 68 og erstattet af <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Denne politik er forældet og fjernet i M66, da den kun blev brugt til interne test, og den er til fare for sikkerheden.
@@ -4193,30 +4080,6 @@
       Denne politik berører kun brugere, som er godkendt ved hjælp af SAML.
 
       Politikkens værdi skal angives i sekunder.</translation>
-<translation id="9027787254195333560">Denne politik giver dig mulighed for at konfigurere det avatarbillede, der repræsenterer brugeren på loginskærmen. Politikken konfigureres ved at angive den webadresse, hvor <ph name="PRODUCT_OS_NAME" /> kan downloade avatarbilledet og en kryptografisk hash-værdi, som bruges til at bekræfte downloadens integritet. Billedet skal være i .jpeg-format, og dets størrelse må ikke overstige 512 kB. Webadressen skal være tilgængelig uden nogen form for godkendelse.
-
-      Avatarbilledet downloades og cachelagres. Det downloades igen, når webadressen eller hash-værdien ændres.
-
-      Politikken skal angives som en streng, der udtrykker webadressen og hash-værdien i JSON-format i overensstemmelse med følgende skema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Den webadresse, hvorfra avatarbilledet kan downloades.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "SHA-256-hash-værdien for avatarbilledet.",
-            "type": "string"
-          }
-        }
-      }
-
-      Hvis denne politik er konfigureret, downloader og anvender <ph name="PRODUCT_OS_NAME" /> avatarbilledet.
-
-      Hvis du konfigurerer denne politik, kan brugerne ikke ændre eller tilsidesætte den.
-
-      Hvis politikken ikke er konfigureret, kan brugerne vælge et avatarbillede, der repræsenterer dem på loginskærmen.</translation>
 <translation id="9035964157729712237">Udvidelses-id'er, der skal udelades fra sortlisten</translation>
 <translation id="9038058011835642205">Angiver en liste over websites, der installeres i baggrunden uden brugerinteraktion, og som ikke kan afinstalleres eller deaktiveres af brugeren.
 
@@ -4229,7 +4092,6 @@
       Hvis du konfigurerer denne politik, kan brugerne ikke ændre eller tilsidesætte den.
 
       Politikkens værdi skal angives i millisekunder. Værdierne skal ligge inden for et interval på mellem 30 sekunder og 24 timer.</translation>
-<translation id="9042911395677044526">Tillader, at netværkskonfigurationen gøres gældende pr. bruger til en <ph name="PRODUCT_OS_NAME" />-enhed. Netværkskonfigurationen er en JSON-formateret streng, sådan som den er defineret af formatet Open Network Configuration som beskrevet på <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Denne politik styrer, om enheden skal opdateres til en Quick Fix Build.
 
       Hvis værdien for politikken er angivet som et token, der er tilknyttet en Quick Fix Build, opdateres enheden til den tilsvarende Quick Fix Build, hvis opdateringen ikke blokeres af en anden politik.
@@ -4302,17 +4164,6 @@
       Hvis politikken er angivet som Falsk, er "Sidehoveder og sidefødder" ikke markeret i dialogboksen Vis udskrift, og brugeren kan ikke ændre den.
 
       Hvis politikken er angivet som Sand, er "Sidehoveder og sidefødder" markeret i dialogboksen Vis udskrift, og brugeren kan ikke ændre det.</translation>
-<translation id="9213347477683611358">Konfigurer baggrundsbillede på enhedsniveau, der vises på loginskærmen, hvis der ikke er nogen bruger, der er logget ind på enheden. Politikken angives ved at angive den webadresse, som Chrome OS-enheden kan downloade baggrundsbilledet fra, samt et kryptografisk hash, der bruges til at bekræfte downloadens integritet. Billedet skal være i JPEG-format, og filstørrelsen må ikke overskride 16 MB. Webadressen skal være tilgængelig uden godkendelse. Baggrundsbilledet downloades og gemmes i cachen. Det downloades på ny, hver gang webadressen eller hashet ændres.
-
-      Politikken bør angives som en streng, der viser webadressen og hashet i JSON-format, f.eks.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Hvis baggrundsbilledepolitikken for enheden er angivet, downloader og bruger Chrome OS baggrundsbilledet på loginskærmen, hvis der ikke er nogen bruger, der er logget ind på enheden endnu. Når brugeren logger ind, starter brugerens baggrundsbilledepolitik.
-
-      Hvis enhedens baggrundsbilledepolitik ikke angives, bestemmer brugerens baggrundsbilledepolitik, hvad der skal vises, hvis brugerens baggrundsbilledepolitik er angivet.</translation>
 <translation id="9217154963008402249">Hyppighed for netværkspakker til overvågning</translation>
 <translation id="922540222991413931">Konfigurer udvidelser, apps og installationskilder til brugerscripts</translation>
 <translation id="924557436754151212">Importer gemte adgangskoder fra standardbrowser på første visning</translation>
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 9d08ff29..7570720 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -332,9 +332,9 @@
 
           Wenn "DeviceDockMacAddress" ausgewählt ist oder die Richtlinie nicht festgelegt wurde, wird die eingetragene Dock-MAC-Adresse des Geräts verwendet.
 
-          Ist "DeviceNicMacAddress" festgelegt, dann wird die MAC-Adresse des NIC (Netzwerkschnittstellencontrollers) des Geräts verwendet.
+          Ist "DeviceNicMacAddress" festgelegt, dann wird die MAC-Adresse der NIC (Netzwerkkarte) des Geräts verwendet.
 
-          Ist "DockNicMacAddress" ausgewählt, dann wird die MAC-Adresse des Dock-NIC verwendet.
+          Ist "DockNicMacAddress" ausgewählt, dann wird die MAC-Adresse der Dock-NIC verwendet.
 
           Diese Einstellung kann vom Nutzer nicht geändert werden.</translation>
 <translation id="1507957856411744193">Wenn diese Richtlinie auf "true" gesetzt ist, stellt <ph name="PRODUCT_NAME" /> eine Verbindung zu Übertragungsgeräten unter allen IP-Adressen her, nicht nur zu jenen unter privaten RFC1918- oder RFC4193-Adressen.
@@ -411,7 +411,6 @@
 
       Achtung: Es wird nicht empfohlen, die Steuerung der <ph name="PRODUCT_OS_NAME" />-Version einer Kiosk-App zu überlassen, da das Gerät dann unter Umständen Softwareupdates und wichtige Sicherheitspatches nicht erhält. Wird die Steuerung der <ph name="PRODUCT_OS_NAME" />-Version abgegeben, besteht eventuell ein Risiko für die Nutzer.</translation>
 <translation id="1675002386741412210">Unterstützt von:</translation>
-<translation id="1689963000958717134">Ermöglicht das Übernehmen einer per Push übertragenen Netzwerkkonfiguration für alle Nutzer eines <ph name="PRODUCT_OS_NAME" />-Geräts. Die Netzwerkkonfiguration ist ein JSON-formatierter String, der den Open Network Configuration-Vorgaben unter <ph name="ONC_SPEC_URL" /> entspricht.</translation>
 <translation id="1704516734140344991">Hiermit werden Verfügbarkeit und Verhalten der Updatefunktion für die <ph name="TPM_FIRMWARE_UPDATE_TPM" />-Firmware konfiguriert.
 
       Einzelne Einstellungen können in den JSON-Eigenschaften festgelegt werden:
@@ -955,16 +954,6 @@
       Wird diese Einstellung deaktiviert, können Webseiten kein JavaScript verwenden und der Nutzer kann diese Einstellung nicht ändern.
 
       Ist diese Einstellung aktiviert oder nicht definiert, können Webseiten JavaScript verwenden, wobei der Nutzer diese Einstellung jedoch ändern kann.</translation>
-<translation id="2747157663401642394">Konfiguriert Einstellungen zur Erweiterungsverwaltung für <ph name="PRODUCT_NAME" />.
-
-          Mit dieser Richtlinie werden verschiedene Einstellungen gesteuert, darunter Einstellungen, die von anderen auf Erweiterungen bezogenen Richtlinien geregelt werden. Durch diese Richtlinie werden ältere Richtlinien überschrieben, wenn beide konfiguriert sind.
-
-          Mit dieser Richtlinie wird eine Erweiterungs-ID oder eine Update-URL ihrer Konfiguration zugeordnet. Bei einer Erweiterungs-ID wird die Konfiguration nur auf die angegebene Erweiterung angewendet. Eine Standardkonfiguration kann für die Spezial-ID "<ph name="DEFAULT_SCOPE" />" festgelegt werden, die auf alle Erweiterungen angewendet wird, für die keine benutzerdefinierte Konfiguration in dieser Richtlinie konfiguriert ist. Bei einer Update-URL wird die Konfiguration auf alle Erweiterungen mit genau der im Manifest dieser Erweiterung angegebenen Update-URL angewendet, wie unter <ph name="LINK_TO_EXTENSION_DOC1" /> erläutert.
-
-          Bei Windows-Instanzen, die nicht Teil einer <ph name="MS_AD_NAME" />-Domain sind, bleibt die erzwungene Installation auf die im Chrome Web Store aufgeführten Apps und Erweiterungen beschränkt.
-
-          Eine vollständige Beschreibung möglicher Einstellungen und des Aufbaus dieser Richtlinie finden Sie unter https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Den von WebRTC verwendeten Bereich lokaler UDP-Ports einschränken</translation>
 <translation id="2757054304033424106">Typen von Erweiterungen bzw. Apps, die installiert werden können</translation>
 <translation id="2758084448533744848">Gibt die erzwungene Zeitzone an, die für das Gerät verwendet wird. Wenn diese Richtlinie konfiguriert ist, können Nutzer die festgelegte Zeitzone auf dem Gerät nicht überschreiben. Ist ein ungültiger Wert angegeben, wird die Richtlinie stattdessen mithilfe von "GMT" aktiviert. Wird ein leerer String angegeben, wird die Richtlinie ignoriert.
@@ -1067,7 +1056,7 @@
       Wenn Sie diese Einstellung deaktivieren oder keinen Wert festlegen, wird für die Druckvorschau der zuletzt genutzte Drucker als Standarddrucker verwendet.
 
       Ist diese Einstellung aktiviert, wird für die Druckvorschau der Standarddrucker des Betriebssystems als Standarddrucker ausgewählt.</translation>
-<translation id="285627849510728211">Legt die Tageskonfiguration für den erweiterten Akkulademodus fest</translation>
+<translation id="285627849510728211">Tageskonfiguration für den erweiterten Akkulademodus festlegen</translation>
 <translation id="2856674246949497058">Führen Sie ein Rollback durch und bleiben Sie bei der Zielversion, falls die Version des Betriebssystems neuer ist als die der Zielversion. Außerdem sollten Sie während des Vorgangs einen Powerwash durchführen.</translation>
 <translation id="2872961005593481000">Herunterfahren</translation>
 <translation id="2873651257716068683">Dadurch wird die standardmäßige Druckseitengröße überschrieben. Wenn die Seitengröße nicht verfügbar ist, wird die Richtlinie ignoriert.</translation>
@@ -1184,11 +1173,11 @@
       Ist diese Richtlinie auf "false" gesetzt, ist die WPAD-Optimierung deaktiviert, sodass <ph name="PRODUCT_NAME" /> länger auf DNS-basierte WPAD-Server warten muss. Wenn die Richtlinie aktiviert oder nicht festgelegt ist, ist die WPAD-Optimierung aktiviert.
 
       Unabhängig davon, ob und wie die Richtlinie festgelegt ist, kann die WPAD-Optimierung nicht von Nutzern verändert werden.</translation>
-<translation id="3071839057966069710">Es wird eine Liste der Drucker konfiguriert.
+<translation id="3071839057966069710">Hiermit wird eine Liste von Druckern konfiguriert.
 
       Mit dieser Richtlinie können Administratoren den Nutzern Druckerkonfigurationen zur Verfügung stellen.
 
-      "<ph name="PRINTER_DISPLAY_NAME" />" und "<ph name="PRINTER_DESCRIPTION" />" sind Freiform-Strings, die für eine einfachere Druckerauswahl angepasst werden können. "<ph name="PRINTER_MANUFACTURER" />" und "<ph name="PRINTER_MODEL" />" dienen der vereinfachten Druckererkennung durch die Endnutzer. Sie geben den Hersteller und das Modell des Druckers an. Bei "<ph name="PRINTER_URI" />" sollte es sich um eine Adresse, einschließlich <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> und <ph name="URI_QUEUE" /> handeln, auf die über einen Client-Computer zugegriffen werden kann. Die <ph name="PRINTER_UUID" /> ist optional. Bei Angabe wird sie zum Entfernen von Duplikaten bei <ph name="ZEROCONF_DISCOVERY" />-Druckern verwendet.
+      "<ph name="PRINTER_DISPLAY_NAME" />" und "<ph name="PRINTER_DESCRIPTION" />" sind Freiform-Strings, die für eine einfachere Druckerauswahl angepasst werden können. Mit "<ph name="PRINTER_MANUFACTURER" />" und "<ph name="PRINTER_MODEL" />" können Endnutzer einen Drucker leichter erkennen. Sie geben den Hersteller und das Modell des Druckers an. Bei "<ph name="PRINTER_URI" />" sollte es sich um eine Adresse einschließlich <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> und <ph name="URI_QUEUE" /> handeln, auf die über einen Client-Computer zugegriffen werden kann. Die <ph name="PRINTER_UUID" /> ist optional. Ist sie angegeben, wird sie zum Entfernen von Duplikaten bei <ph name="ZEROCONF_DISCOVERY" />-Druckern verwendet.
 
       "<ph name="PRINTER_EFFECTIVE_MODEL" />" muss mit einem der Strings übereinstimmen, die einen von <ph name="PRODUCT_NAME" /> unterstützten Drucker angeben. Der String wird zur Ermittlung und Installation der korrekten PPD für den Drucker verwendet. Weitere Informationen finden Sie unter https://support.google.com/chrome?p=noncloudprint.
 
@@ -1261,7 +1250,7 @@
 <translation id="3220624000494482595">Wenn die Kiosk-App eine Android-App ist, hat sie keine Kontrolle über die <ph name="PRODUCT_OS_NAME" />-Version, auch wenn diese Richtlinie auf <ph name="TRUE" /> gesetzt ist.</translation>
 <translation id="3236046242843493070">URL-Muster für die Installation von Erweiterungen, Apps und Nutzerskripten von</translation>
 <translation id="3240609035816615922">Richtlinie für den Zugriff auf die Konfiguration von Druckern.</translation>
-<translation id="3240655340884151271">MAC-Adresse der im Dock verbauten Netzwerkkarte</translation>
+<translation id="3240655340884151271">MAC-Adresse der im Dock verbauten NIC</translation>
 <translation id="3243309373265599239">Hiermit wird angegeben, nach welchem Zeitraum ohne Nutzereingabe der Bildschirm im Netzbetrieb abgedunkelt wird.
 
           Wenn für diese Richtlinie ein höherer Wert als null festgelegt wird, gibt dieser an, wie lange ein Nutzer inaktiv sein muss, bevor <ph name="PRODUCT_OS_NAME" /> den Bildschirm abdunkelt.
@@ -1285,7 +1274,7 @@
        Ist diese Einstellung deaktiviert, können Nutzer den Proxy nicht aktivieren und der Computer darf seine Drucker nicht für <ph name="CLOUD_PRINT_NAME" /> freigeben.</translation>
 <translation id="3312206664202507568">Aktiviert eine Seite auf "chrome://password-change", auf der SAML-Nutzer ihre SAML-Passwörter bei laufender Sitzung ändern können. Hierdurch wird dafür gesorgt, dass das SAML-Passwort und das Passwort für den Sperrbildschirm des Geräts synchronisiert bleiben.
 
-      Außerdem ermöglicht diese Richtlinie Benachrichtigungen, mit denen SAML-Nutzer gewarnt werden, wenn ihre SAML-Passwörter bald ablaufen. Auf diese Weise können sie das Problem sofort dadurch beheben, dass sie bei laufender Sitzung ihr Passwort ändern.
+      Außerdem ermöglicht diese Richtlinie Benachrichtigungen, mit denen SAML-Nutzer gewarnt werden, wenn ihre SAML-Passwörter bald ablaufen. Sie können dann direkt bei laufender Sitzung ihr Passwort ändern.
       Allerdings werden diese Benachrichtigungen nur angezeigt, wenn vom SAML-Identitätsanbieter während des SAML-Anmeldeablaufs Informationen zum Ablauf des Passworts an das Gerät gesendet werden.
 
       Ist diese Richtlinie eingestellt, dann kann der Nutzer sie weder ändern noch überschreiben.</translation>
@@ -1416,7 +1405,7 @@
       Wenn diese Richtlinie auf "DeveloperToolsAllowed" (Wert 1), gesetzt ist, können die Entwicklertools und die JavaScript-Konsole in allen Kontexten aufgerufen und verwendet werden. Dies gilt auch für Erweiterungen, die über die Unternehmensrichtlinie installiert wurden.
       Wenn diese Richtlinie auf "DeveloperToolsDisallowed" (Wert 2) gesetzt ist, kann nicht auf die Entwicklertools zugegriffen werden und Websiteelemente können nicht mehr überprüft werden. Alle Tastenkombinationen und Menü- oder Kontextmenüeinträge, mit denen die Entwicklertools oder die JavaScript-Konsole aufgerufen werden, sind deaktiviert.</translation>
 <translation id="3547954654003013442">Proxy-Einstellungen</translation>
-<translation id="3550875587920006460">Wenn diese Richtlinie konfiguriert ist, kann ein benutzerdefinierter Zeitplan zum Prüfen auf Updates festgelegt werden. Er gilt für alle Nutzer und alle Oberflächen auf diesem Gerät. Das Gerät sucht dann gemäß dem Zeitplan nach Updates. Wenn geplante Prüfungen auf Updates nicht mehr durchgeführt werden sollen, müssen Sie die Richtlinie entfernen.</translation>
+<translation id="3550875587920006460">Mit dieser Richtlinie kann ein benutzerdefinierter Zeitplan zum Prüfen auf Updates festgelegt werden. Er gilt für alle Nutzer und alle Oberflächen auf diesem Gerät. Wenn ein Zeitplan aktiviert wird, sucht das Gerät entsprechend nach Updates. Wenn geplante Prüfungen auf Updates nicht mehr durchgeführt werden sollen, muss die Richtlinie entfernt werden.</translation>
 <translation id="355118380775352753">Websites, die in einem alternativen Browser geöffnet werden sollen</translation>
 <translation id="3554984410014457319">Google Assistant erlauben, bei Gesprächen zuzuhören und so zu prüfen, ob die Wortgruppe für die Sprachaktivierung genannt wird</translation>
 <translation id="356579196325389849">Nutzer dürfen die Chrome OS-Release-Version konfigurieren</translation>
@@ -1648,17 +1637,17 @@
       Wenn diese Richtlinie auf "True" gesetzt oder nicht konfiguriert ist, können Nutzer Angebote über die Chrome OS-Registrierung einlösen.
 
       Ist die Richtlinie auf "False" eingestellt, können Nutzer keine Angebote einlösen.</translation>
-<translation id="4008233182078913897">Hierdurch wird eine Liste von Apps und Erweiterungen festgelegt, die automatisch installiert werden, also ohne Interaktion des Nutzers, und die vom Nutzer weder deinstalliert noch deaktiviert werden können. Alle von den Apps und Erweiterungen angeforderten Berechtigungen werden implizit, ohne Eingriff durch den Nutzer, gewährt. Dazu gehören auch alle weiteren Berechtigungen, die von künftigen Versionen der Apps oder Erweiterungen angefordert werden. Außerdem werden den Erweiterungs-APIs "enterprise.deviceAttributes" und "enterprise.platformKeys" Berechtigungen erteilt. Diese beiden APIs stehen bei Apps und Erweiterungen ohne erzwungene Installation nicht zur Verfügung.
+<translation id="4008233182078913897">Gibt eine Liste von Apps und Erweiterungen an, die automatisch, ohne Zutun des Nutzers, installiert werden und die nicht von ihm deinstalliert oder deaktiviert werden können. Alle von den Apps und Erweiterungen angeforderten Berechtigungen werden implizit, ohne Eingriff durch den Nutzer, gewährt. Dazu gehören auch alle weiteren Berechtigungen, die von künftigen Versionen der App oder Erweiterung angefordert werden. Außerdem werden den Erweiterungs-APIs "enterprise.deviceAttributes" und "enterprise.platformKeys" Berechtigungen erteilt. Diese beiden APIs stehen bei Apps oder Erweiterungen ohne erzwungene Installation nicht zur Verfügung.
 
-          Diese Richtlinie hat Vorrang gegenüber einer möglicherweise damit in Konflikt stehenden Richtlinie "<ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />". Wenn eine App oder Erweiterung mit erzwungener Installation aus dieser Liste entfernt wird, wird sie automatisch von <ph name="PRODUCT_NAME" /> deinstalliert.
+Diese Richtlinie hat Vorrang gegenüber einer möglicherweise in Konflikt stehenden Richtlinie "<ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />". Wenn eine App oder Erweiterung mit erzwungener Installation aus dieser Liste entfernt wird, wird sie automatisch von <ph name="PRODUCT_NAME" /> deinstalliert.
 
 Bei Windows-Instanzen, die nicht Teil einer <ph name="MS_AD_NAME" />-Domain sind, bleibt die erzwungene Installation auf die im Chrome Web Store aufgeführten Apps und Erweiterungen beschränkt.
 
-          Beachten Sie, dass Nutzer den Quellcode jeder Erweiterung mithilfe der Entwicklertools ändern können. Danach funktioniert die entsprechende Erweiterung eventuell nicht mehr. Wenn Sie das verhindern möchten, können Sie die Richtlinie "<ph name="DEVELOPER_TOOLS_POLICY_NAME" />" festlegen.
+Der Quellcode jeder Erweiterung kann mithilfe der Entwicklertools von Nutzern geändert werden. Danach funktioniert die entsprechende Erweiterung eventuell nicht mehr. Wenn Sie dies verhindern möchten, können Sie die Richtlinie "<ph name="DEVELOPER_TOOLS_POLICY_NAME" />" festlegen.
 
-          Jedes Listenelement der Richtlinie ist ein String mit einer Erweiterungs-ID und einer optionalen Update-URL, die durch ein Semikolon (<ph name="SEMICOLON" />) getrennt sind. Die Erweiterungs-ID ist der String mit 32 Buchstaben, den Sie beispielsweise im Entwicklermodus in <ph name="CHROME_EXTENSIONS_LINK" /> sehen. Die Update-URL sollte, sofern festgelegt, auf ein XML-Dokument mit einem Update-Manifest verweisen, wie in <ph name="LINK_TO_EXTENSION_DOC1" /> beschrieben. Standardmäßig kommt die Update-URL des Chrome Web Store zum Einsatz, die derzeit "https://clients2.google.com/service/update2/crx" lautet. Die in dieser Richtlinie festgelegte Update-URL wird nur für die erste Installation verwendet. In nachfolgenden Updates der Erweiterung kommt die Update-URL zum Einsatz, die im Manifest der Erweiterung angegeben wurde. Außerdem war die explizite Festlegung der Update-URL in <ph name="PRODUCT_NAME" />-Versionen bis einschließlich Version 67 obligatorisch.
+Jedes Listenelement der Richtlinie ist ein String mit einer Erweiterungs-ID und einer optionalen Update-URL, die durch ein Semikolon (<ph name="SEMICOLON" />) getrennt sind. Die Erweiterungs-ID ist der String mit 32 Buchstaben, den Sie beispielsweise im Entwicklermodus unter <ph name="CHROME_EXTENSIONS_LINK" /> sehen. Die Update-URL sollte, sofern festgelegt, auf ein XML-Dokument mit einem Update-Manifest verweisen, wie unter <ph name="LINK_TO_EXTENSION_DOC1" /> beschrieben. Standardmäßig kommt die Update-URL des Chrome Web Store zum Einsatz, die derzeit "https://clients2.google.com/service/update2/crx" lautet. Die in dieser Richtlinie festgelegte Update-URL wird nur für die erste Installation verwendet. In nachfolgenden Updates der Erweiterung kommt die Update-URL zum Einsatz, die im Manifest der Erweiterung angegeben wurde. Außerdem war die explizite Festlegung der Update-URL in <ph name="PRODUCT_NAME" />-Versionen bis einschließlich Version 67 obligatorisch.
 
-          Beispiel: <ph name="EXTENSION_POLICY_EXAMPLE" /> installiert die Erweiterung mit der ID "<ph name="EXTENSION_ID_SAMPLE" />" über die standardmäßige Update-URL aus dem Chrome Web Store. Weitere Informationen zum Hosten von Erweiterungen finden Sie unter: <ph name="LINK_TO_EXTENSION_DOC2" />.
+Beispiel: "<ph name="EXTENSION_POLICY_EXAMPLE" />" installiert die Erweiterung mit der ID "<ph name="EXTENSION_ID_SAMPLE" />" über die standardmäßige Update-URL aus dem Chrome Web Store. Weitere Informationen zum Hosting von Erweiterungen finden Sie unter <ph name="LINK_TO_EXTENSION_DOC2" />.
 
 Wenn diese Richtlinie nicht festgelegt ist, werden Apps und Erweiterungen nicht automatisch installiert und der Nutzer kann jede App oder Erweiterung in <ph name="PRODUCT_NAME" /> deinstallieren.
 
@@ -1710,30 +1699,6 @@
       Diese Richtlinie wirkt sich nur auf Nutzer aus, die sich über SAML authentifizieren.</translation>
 <translation id="4105989332710272578">Erzwingung der Zertifikatstransparenz für eine Liste von URLs deaktivieren</translation>
 <translation id="4121350739760194865">App-Werbung nicht auf der "Neuer Tab"-Seite anzeigen</translation>
-<translation id="4125606414556046117">Mit dieser Richtlinie können Sie das Hintergrundbild konfigurieren, das dem Nutzer auf dem Desktop und auf dem Anmeldebildschirm angezeigt wird. Bei der Konfiguration der Richtlinie wird eine URL angegeben, über die <ph name="PRODUCT_OS_NAME" /> das Hintergrundbild und einen kryptografischen Hash zur Verifizierung der Integrität des Downloads herunterladen kann. Das Bild muss im JPEG-Format vorliegen und darf nicht größer als 16 MB sein. Der Zugriff auf die URL muss ohne Authentifizierung möglich sein.
-
-      Das Hintergrundbild wird heruntergeladen und im Cache gespeichert. Sobald sich die URL oder der Hash ändert, wird es noch einmal heruntergeladen.
-
-      Die Richtlinie sollte als String mit der URL und dem Hash im JSON-Format gemäß folgendem Schema angegeben werden:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Die URL, über die das Hintergrundbild heruntergeladen werden kann.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Der SHA-256-Hash des Hintergrundbilds.",
-            "type": "string"
-          }
-        }
-      }
-
-      Wenn diese Richtlinie konfiguriert ist, wird das Hintergrundbild von <ph name="PRODUCT_OS_NAME" /> heruntergeladen und verwendet.
-
-      Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden.
-
-      Ist die Richtlinie nicht konfiguriert, kann der Nutzer ein Bild auswählen, das als Hintergrund auf dem Desktop und dem Anmeldebildschirm angezeigt werden soll.</translation>
 <translation id="412697421478384751">Nutzern erlauben, schwache PINs als Sperrbildschirm-PIN festzulegen</translation>
 <translation id="4138655880188755661">Zeitlimit</translation>
 <translation id="4144164749344898721">Mit dieser Richtlinie können Sie mehrere Einstellungen zur Energieverwaltung bei Inaktivität des Nutzers festlegen.
@@ -1878,7 +1843,7 @@
 <translation id="4360826270668210664">Wenn diese Richtlinie konfiguriert ist, verlangt der Host für den Remotezugriff von Clients, die sich authentifizieren, ein Authentifizierungstoken von dieser URL, damit eine Verbindung aufgebaut werden kann. Diese Richtlinie muss in Verbindung mit "RemoteAccessHostTokenValidationUrl" verwendet werden.
 
           Diese Funktion ist derzeit serverseitig deaktiviert.</translation>
-<translation id="4363057787588706121">Erlaubt das Zusammenführen von Listenrichtlinien aus unterschiedlichen Quellen</translation>
+<translation id="4363057787588706121">Zusammenführen von Listenrichtlinien aus unterschiedlichen Quellen erlauben</translation>
 <translation id="436581050240847513">Gerätenetzwerk-Schnittstellen melden</translation>
 <translation id="4372704773119750918">Nutzer in Unternehmen dürfen keine Mehrfachprofile verwenden (weder als primärer, noch als sekundärer Nutzer)</translation>
 <translation id="4377599627073874279">Anzeige aller Bilder auf allen Websites zulassen</translation>
@@ -2606,10 +2571,10 @@
 <translation id="5898486742390981550">Wenn mehrere Nutzer angemeldet sind, kann nur der Hauptnutzer Android-Apps verwenden.</translation>
 <translation id="5901427587865226597">Nur Duplexdruck</translation>
 <translation id="5903898512448364160">
-      Ist die Richtlinie auf "true" gesetzt, hat die Cloudrichtlinie Vorrang, wenn sie mit der Plattformrichtlinie in Konflikt steht.
+      Wenn die Richtlinie auf "true" gesetzt wird, hat die Cloudrichtlinie Vorrang, wenn sie mit der Plattformrichtlinie in Konflikt steht.
       Falls die Richtlinie auf "false" gesetzt oder nicht konfiguriert ist, hat die Plattformrichtlinie Vorrang, wenn sie mit der Cloudrichtlinie in Konflikt steht.
 
-      Diese Richtlinie ist nur als obligatorische Computer-Plattformvariante verfügbar. Sie gilt nur für Cloudrichtlinien auf Computern.
+      Diese Richtlinie ist nur als erforderliche Computer-Plattformrichtlinie verfügbar und wirkt sich lediglich auf Cloudrichtlinien auf Computern aus.
       </translation>
 <translation id="5905473632148429217">OCSP/CRL-Online-Prüfungen aktivieren</translation>
 <translation id="5906199912611534122">Ermöglicht die Aktivierung oder Deaktivierung der Netzwerkbegrenzung.
@@ -2641,7 +2606,7 @@
 <translation id="5950205771952201658">Da Online-Überprüfungen zu SoftFail-Zertifikatssperren keinen wirkungsvollen Sicherheitseffekt bieten, werden sie ab <ph name="PRODUCT_NAME" />-Version 19 standardmäßig deaktiviert. Wenn Sie diese Richtlinie auf "true" setzen, wird das vorherige Verhalten wiederhergestellt und es werden online OCSP-/CRL-Prüfungen durchgeführt.
 
       Falls die Richtlinie nicht konfiguriert oder auf "false" eingestellt ist, führt <ph name="PRODUCT_NAME" /> ab <ph name="PRODUCT_NAME" />-Version 19 keine Online-Überprüfungen auf Zertifikatssperren mehr durch.</translation>
-<translation id="5961137303188584693">MAC-Adresse des im Gerät verbauten NIC</translation>
+<translation id="5961137303188584693">MAC-Adresse der im Gerät verbauten NIC</translation>
 <translation id="5966615072639944554">Erweiterungen, die die Remote Attestation API zur Bestätigung der Nutzeridentität verwenden dürfen</translation>
 <translation id="5983708779415553259">Standardverhalten für Websites, die nicht zu einem Inhaltspaket gehören</translation>
 <translation id="5997543603646547632">Standardmäßig 24-Stunden-Uhr verwenden</translation>
@@ -2652,59 +2617,12 @@
 
       Wenn diese Richtlinie nicht festgelegt oder auf "false" gesetzt wurde, wird bei Druckaufträgen die Druckvorschau angezeigt.</translation>
 <translation id="6022948604095165524">Aktion beim Start</translation>
-<translation id="6023030044732320798">Gibt die Richtlinien an, die für die ARC-Laufzeit übergeben werden. Es muss ein gültiger JSON-Wert angegeben werden.
-
-      Diese Richtlinie kann verwendet werden, um zu konfigurieren, welche Android-Apps automatisch auf dem Gerät installiert werden:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android-App-Kennzeichnung, z. B. "com.google.android.gm" für Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Gibt an, wie eine App installiert wird. OPTIONAL: Die App wird nicht automatisch installiert, der Nutzer kann sie jedoch installieren. Dies ist die Standardeinstellung, falls diese Richtlinie nicht konfiguriert wurde. PRELOAD: Die App wird automatisch installiert, aber der Nutzer kann sie deinstallieren. FORCE_INSTALLED: Die App wird automatisch installiert und der Nutzer kann sie nicht deinstallieren. BLOCKED: Die App wird blockiert und kann nicht installiert werden. Wenn die App im Rahmen einer vorherigen Richtlinie installiert wurde, wird sie deinstalliert.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Richtlinie bezüglich der Erlaubnis für Berechtigungsanfragen an Apps. PERMISSION_POLICY_UNSPECIFIED: Die Richtlinie ist nicht konfiguriert. Wenn keine Richtlinie für Berechtigungen auf allen Ebenen konfiguriert wird, wird das Verhalten 'PROMPT' standardmäßig verwendet. PROMPT: Der Nutzer wird aufgefordert, eine Erlaubnis zu erteilen. GRANT: Eine Erlaubnis wird automatisch erteilt. DENY: Eine Erlaubnis wird automatisch abgelehnt.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "App-spezifisches JSON-Konfigurationsobjekt mit einem Satz an Schlüssel/Wert-Paaren, z. B. '"managedConfiguration": { "key1": value1, "key2": value2 }'. Die Schlüssel sind im App-Manifest definiert.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Um Apps an den Launcher anzuheften, siehe "PinnedLauncherApps".</translation>
 <translation id="602728333950205286">Google Instant-URL der Standardsuchmaschine</translation>
 <translation id="603410445099326293">Parameter für URL der Vorschlagsuche, die POST verwendet</translation>
 <translation id="6034341625190551415">Legt die Typen für öffentliche Sitzungen und Kiosk-Konten fest.</translation>
 <translation id="6034603289689965535">Erlaubt einer Seite, während des Unloads Pop-ups einzublenden</translation>
 <translation id="6036523166753287175">Firewallausnahme über Host für Remotezugriff aktivieren</translation>
-<translation id="605475635122964053">Hiermit wird der PIN-Druckmodus eingeschränkt. Wenn die Richtlinie nicht konfiguriert ist, wird keine Einschränkung angewendet. Wenn der Modus nicht verfügbar ist, wird diese Richtlinie ignoriert. Der PIN-Druckmodus wird nur für Drucker angewendet, die IPPS, USB oder IPP über USB verwenden. </translation>
+<translation id="605475635122964053">Hiermit wird der PIN-Druckmodus eingeschränkt. Wenn die Richtlinie nicht konfiguriert ist, gelten keine Einschränkungen. Ist der Modus nicht verfügbar, wird diese Richtlinie ignoriert. Der PIN-Druckmodus wird nur für Drucker angewendet, die das IPPS- oder USB-Protokoll bzw. IPP über USB verwenden. </translation>
 <translation id="6070667616071269965">Tastaturlayouts der Anmeldeseite</translation>
 <translation id="6074963268421707432">Anzeige von Desktop-Benachrichtigungen für keine Website zulassen</translation>
 <translation id="6074964551275531965">Zeitraum für Updatebenachrichtigungen festlegen</translation>
@@ -2804,7 +2722,7 @@
       Wenn die Richtlinie deaktiviert ist, erfolgt kein Import der AutoFill-Formulardaten.
 
       Ist die Richtlinie nicht konfiguriert, wird der Nutzer möglicherweise gefragt, ob ein Import erfolgen soll, oder der Import findet automatisch statt.</translation>
-<translation id="6221175752766085998">Lässt Zertifikate zu, die von lokalen Vertrauensankern ausgestellt werden, bei denen die "subjectAlternativeName"-Erweiterung fehlt</translation>
+<translation id="6221175752766085998">Zertifikate zulassen, die von lokalen Vertrauensankern ausgestellt werden, bei denen die "subjectAlternativeName"-Erweiterung fehlt</translation>
 <translation id="6224304369267200483">Automatischer Nachweis des Sicherheitsschlüssels durch URLs/Domains</translation>
 <translation id="6233173491898450179">Downloadverzeichnis festlegen</translation>
 <translation id="6244210204546589761">Beim Start zu öffnende URLs</translation>
@@ -3034,37 +2952,6 @@
       Wenn diese Richtlinie auf "False" gesetzt wurde, wird der integrierte DNS-Client nie verwendet.
 
       Wenn diese Richtlinie nicht konfiguriert ist, ist der integrierte DNS-Client unter MacOS, Android – sofern weder ein privates DNS noch ein VPN aktiviert ist – und ChromeOS standardmäßig aktiviert. Der Nutzer kann dann über die Bearbeitung von chrome://flags oder die Festlegung eines Befehlszeilen-Flags entscheiden, ob der integrierte DNS-Client verwendet wird oder nicht.</translation>
-<translation id="6838056959556423778">Überschreibt die Regeln von <ph name="PRODUCT_NAME" /> zur Auswahl des Standarddruckers.
-
-      Diese Richtlinie legt die Regeln für die Auswahl des Standarddruckers in <ph name="PRODUCT_NAME" /> fest. Diese Auswahl erfolgt, wenn in einem Profil zum ersten Mal die Druckfunktion genutzt wird.
-
-      Wenn diese Richtlinie konfiguriert ist, sucht <ph name="PRODUCT_NAME" /> einen passenden Drucker, der alle angegebenen Merkmale aufweist, und wählt diesen als Standarddrucker aus. Der erste Drucker, der die Richtlinie erfüllt, wird ausgewählt. Falls keine eindeutige Übereinstimmung gefunden wird, kann jeder übereinstimmende Drucker ausgewählt werden. Das hängt von der Reihenfolge ab, in der die Drucker gefunden werden.
-
-      Wenn diese Richtlinie nicht konfiguriert wurde oder kein passender Drucker innerhalb des Zeitlimits gefunden wird, wird als Standarddrucker der integrierte PDF-Drucker oder – falls dieser nicht verfügbar ist – gar kein Drucker ausgewählt.
-
-      Der Wert wird als JSON-Objekt gemäß dem folgenden Schema geparst:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Suche nach dem passenden Drucker auf eine bestimmte Reihe von Druckern beschränken?",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regulärer Ausdruck für Drucker-ID",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regulärer Ausdruck für den angezeigten Namen des Druckers",
-            "type": "string"
-          }
-        }
-      }
-
-      Die mit <ph name="CLOUD_PRINT_NAME" /> verbundenen Drucker werden als "<ph name="PRINTER_TYPE_CLOUD" />" bezeichnet. Die anderen Drucker werden als "<ph name="PRINTER_TYPE_LOCAL" />" klassifiziert.
-      Wird ein Feld ausgelassen, bedeutet das, alle Werte stimmen überein. Beispiel: Wenn Sie keinen Wert für die Konnektivität angeben, wird die Erkennung sämtlicher Druckertypen, "local" und "cloud", über die Druckvorschau gestartet.
-      Die Muster für reguläre Ausdrücke müssen der JavaScript-RegExp-Syntax folgen und die Groß-/Kleinschreibung ist zu beachten.</translation>
 <translation id="6843296367238757293">Diese Richtlinie ist veraltet. Von ihrer Verwendung wird abgeraten. Weitere Informationen dazu finden Sie unter https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Diese Richtlinie wurde in Version 68 von <ph name="PRODUCT_NAME" /> entfernt und durch "<ph name="ARC_GLS_POLICY_NAME" />" ersetzt.</translation>
 <translation id="6856743875250214792">Diese Richtlinie ist veraltet und wurde aus M66 entfernt, da sie nur für interne Tests genutzt wurde und ein Sicherheitsrisiko darstellt.
@@ -3334,7 +3221,7 @@
 <translation id="7273823081800296768">Wenn diese Einstellung aktiviert oder nicht konfiguriert ist, kann der Nutzer beim Herstellen der Verbindung Clients und Hosts koppeln. Dadurch braucht nicht jedes Mal eine PIN eingegeben zu werden.
 
           Bei Deaktivierung dieser Einstellung ist diese Funktion nicht verfügbar.</translation>
-<translation id="7274077256421167535">Gemeinsame Stromversorgung für USB aktivieren</translation>
+<translation id="7274077256421167535">Gemeinsame Stromversorgung per USB aktivieren</translation>
 <translation id="7275334191706090484">Verwaltete Lesezeichen</translation>
 <translation id="7291084543582732020">Wenn Sie die Einstellung aktivieren, können Nutzer Smart Lock verwenden, wenn die Voraussetzungen für die Funktion erfüllt sind.
 
@@ -4052,7 +3939,7 @@
       Wenn diese Einstellung deaktiviert oder nicht konfiguriert ist, leitet der Passwortschutzdienst Nutzer an https://myaccounts.google.com weiter, damit sie ihr Passwort ändern können.
       Diese Richtlinie steht nur bei Windows-Instanzen zur Verfügung, die Teil einer <ph name="MS_AD_NAME" />-Domain sind, oder bei Windows 10 Pro- oder Enterprise-Instanzen, bei denen zur Geräteverwaltung eine Anmeldung vorgenommen wurde.</translation>
 <translation id="8798099450830957504">Standardeinstellung</translation>
-<translation id="8800453707696044281">Legt den Akkuladestand (%) für benutzerdefiniertes Beenden des Ladevorgangs fest</translation>
+<translation id="8800453707696044281">Den Akkuladestand (%) für benutzerdefiniertes Beenden des Ladevorgangs festlegen</translation>
 <translation id="8801680448782904838">Nutzer benachrichtigen, dass ein Neustart des Browsers oder des Geräts empfohlen wird oder erforderlich ist</translation>
 <translation id="8818173863808665831">Meldet den Standort des Geräts.
 
@@ -4179,30 +4066,6 @@
       Diese Richtlinie betrifft nur Nutzer, die sich über SAML authentifizieren.
 
       Der Wert sollte in Sekunden angegeben werden.</translation>
-<translation id="9027787254195333560">Über diese Richtlinie können Sie das Avatarbild des Nutzers für den Anmeldebildschirm konfigurieren. Zum Festlegen der Richtlinie muss die URL, über die <ph name="PRODUCT_OS_NAME" /> das Avatarbild herunterladen kann, sowie ein kryptografischer Hash angegeben werden, um die Integrität des Downloads zu verifizieren. Das Bild muss im JPEG-Format vorliegen und darf nicht größer als 512 KB sein. Der Zugriff auf die URL muss ohne Authentifizierung möglich sein.
-
-      Das Avatarbild wird heruntergeladen und im Cache gespeichert. Sobald sich die URL oder der Hash ändert, wird es noch einmal heruntergeladen.
-
-      Die Richtlinie sollte als String mit der URL und dem Hash im JSON-Format gemäß folgendem Schema angegeben werden:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Die URL, über die das Avatarbild heruntergeladen werden kann.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Der SHA-256-Hash des Avatarbilds.",
-            "type": "string"
-          }
-        }
-      }
-
-      Ist diese Richtlinie konfiguriert, wird das Avatarbild von <ph name="PRODUCT_OS_NAME" /> heruntergeladen und verwendet.
-
-      Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden.
-
-      Ist die Richtlinie nicht konfiguriert, kann der Nutzer sein Avatarbild für den Anmeldebildschirm selbst auswählen.</translation>
 <translation id="9035964157729712237">Aus der schwarzen Liste auszuschließende Erweiterungs-IDs</translation>
 <translation id="9038058011835642205">Hierdurch wird eine Liste von Web-Apps festgelegt, die automatisch installiert werden, also ohne Interaktion des Nutzers, und die vom Nutzer weder deinstalliert noch deaktiviert werden können.
 
@@ -4215,7 +4078,6 @@
       Wenn Sie diese Richtlinie konfigurieren, kann sie vom Nutzer nicht geändert oder überschrieben werden.
 
       Der Richtlinienwert sollte in Millisekunden angegeben werden. Der Wert kann zwischen 30 Sekunden und 24 Stunden liegen.</translation>
-<translation id="9042911395677044526">Ermöglicht das Übernehmen einer per Push übertragenen Netzwerkkonfiguration pro Nutzer für ein <ph name="PRODUCT_OS_NAME" />-Gerät. Die Netzwerkkonfiguration ist ein JSON-formatierter String, der den Open Network Configuration-Vorgaben unter <ph name="ONC_SPEC_URL" /> entspricht.</translation>
 <translation id="9050853837490399534">Diese Richtlinie gibt vor, ob das Gerät auf einen Quick-Fix-Build aktualisiert werden soll.
 
       Wenn als Richtlinienwert ein Token festgelegt ist, das mit einem Quick-Fix-Build verknüpft ist, wird das Gerät auf den entsprechenden Build aktualisiert, sofern eine solche Aktualisierung nicht durch eine andere Richtlinie blockiert wird.
@@ -4289,17 +4151,6 @@
 Wenn die Richtlinie auf "false" gesetzt ist, ist "Kopf- und Fußzeilen" im Dialogfeld "Druckvorschau" nicht ausgewählt und der Nutzer kann dies nicht ändern.
 
 Wenn die Richtlinie auf "true" gesetzt ist, ist "Kopf- und Fußzeilen" im Dialogfeld "Druckvorschau" ausgewählt und der Nutzer kann dies nicht ändern.</translation>
-<translation id="9213347477683611358">Hiermit kann das Hintergrundbild auf Geräteebene konfiguriert werden, das auf dem Anmeldebildschirm angezeigt wird, wenn sich noch kein Nutzer auf dem Gerät angemeldet hat. Die Richtlinie wird konfiguriert, indem die URL, über die das Chrome OS-Gerät das Hintergrundbild herunterladen kann, und ein kryptografischer Hash, mit dem die Integrität des Downloads überprüft wird, festgelegt werden. Das Bild muss das JPEG-Format aufweisen und darf eine Dateigröße von 16 MB nicht überschreiten. Die URL muss ohne Authentifizierung zugänglich sein. Das Hintergrundbild wird heruntergeladen und im Cache gespeichert. Es wird jedes Mal neu heruntergeladen, wenn sich die URL oder der Hash ändert.
-
-      Die Richtlinie sollte als String angegeben werden, der die URL und den Hash im JSON-Format ausgibt, z. B.:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Wenn die Gerätehintergrundrichtlinie konfiguriert ist, lädt das Chrome OS-Gerät das Hintergrundbild herunter und verwendet es für den Anmeldebildschirm, sofern sich noch kein Nutzer auf dem Gerät angemeldet hat. Sobald sich der Nutzer anmeldet, wird die Hintergrundrichtlinie des Nutzers aktiviert.
-
-      Wenn die Gerätehintergrundrichtlinie nicht konfiguriert ist, wird über die Hintergrundrichtlinie des Nutzers festgelegt, was angezeigt wird, sofern die Hintergrundrichtlinie des Nutzers konfiguriert ist.</translation>
 <translation id="9217154963008402249">Häufigkeit von Kontrollnetzwerkpaketen</translation>
 <translation id="922540222991413931">Installationsquellen für Erweiterungen, Apps und Nutzerskripte konfigurieren</translation>
 <translation id="924557436754151212">Gespeicherte Passwörter bei erster Ausführung aus Standardbrowser importieren</translation>
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index 5aa6fe5..4cf1194f 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -420,7 +420,6 @@
 
       Προειδοποίηση: Δεν συνιστάται να αναθέσετε τον έλεγχο της έκδοσης <ph name="PRODUCT_OS_NAME" /> σε μια εφαρμογή kiosk καθώς ενδέχεται να παρεμποδίσει τη λήψη ενημερώσεων και σημαντικών επιδιορθώσεων ασφάλειας από τη συσκευή. Η ανάθεση του ελέγχου της έκδοσης <ph name="PRODUCT_OS_NAME" /> ενδέχεται να αφήσει εκτεθειμένους τους χρήστες.</translation>
 <translation id="1675002386741412210">Υποστηρίζεται σε:</translation>
-<translation id="1689963000958717134">Επιτρέπει την προώθηση της διαμόρφωσης δικτύου για την εφαρμογή για όλους τους χρήστες σε μια συσκευή <ph name="PRODUCT_OS_NAME" />. Η διαμόρφωση δικτύου είναι μια συμβολοσειρά με μορφοποίηση JSON, όπως καθορίζεται από την Ανοιχτή μορφή διαμόρφωσης δικτύου που περιγράφεται στη διεύθυνση <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Διαμορφώνει τη διαθεσιμότητα και τη συμπεριφορά της λειτουργίας ενημέρωσης υλικολογισμικού <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Μπορούν να καθοριστούν μεμονωμένες ρυθμίσεις στις ιδιότητες JSON:
@@ -976,16 +975,6 @@
       Αν αυτή η ρύθμιση είναι απενεργοποιημένη, οι ιστοσελίδες δεν μπορούν να χρησιμοποιούν την JavaScript και ο χρήστης δεν μπορεί να αλλάξει αυτήν τη ρύθμιση.
 
       Αν αυτή η ρύθμιση είναι ενεργοποιημένη ή δεν οριστεί, οι ιστοσελίδες θα μπορούν να χρησιμοποιούν την JavaScript, αλλά ο χρήστης θα μπορεί να αλλάξει αυτήν τη ρύθμιση.</translation>
-<translation id="2747157663401642394">Διαμορφώνει τις ρυθμίσεις διαχείρισης επεκτάσεων για το <ph name="PRODUCT_NAME" />.
-
-          Αυτή η πολιτική ελέγχει πολλές ρυθμίσεις, συμπεριλαμβανομένων των ρυθμίσεων που ελέγχονται από τυχόν υφιστάμενες πολιτικές που σχετίζονται με τις επεκτάσεις. Αυτή η πολιτική θα παρακάμπτει κάθε πολιτική παλαιού τύπου σε περίπτωση που έχουν οριστεί και οι δύο.
-
-          Αυτή η πολιτική συνδέει ένα αναγνωριστικό επέκτασης ή ένα URL ενημέρωσης με την αντίστοιχη διαμόρφωση. Με ένα αναγνωριστικό επέκτασης, η διαμόρφωση θα εφαρμοστεί μόνο στην καθορισμένη επέκταση. Μπορεί να οριστεί μια προεπιλεγμένη διαμόρφωση για το ειδικό αναγνωριστικό <ph name="DEFAULT_SCOPE" />, η οποία θα εφαρμοστεί σε όλες τις επεκτάσεις που δεν έχουν προσαρμοσμένη διαμόρφωση καθορισμένη σε αυτήν την πολιτική. Με ένα URL ενημέρωσης, η διαμόρφωση θα εφαρμοστεί σε όλες τις επεκτάσεις που έχουν ακριβώς το ίδιο URL ενημέρωσης που αναφέρεται στο μανιφέστο αυτής της επέκτασης, όπως περιγράφεται στο <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Για παρουσίες Windows που δεν συμμετέχουν σε τομέα <ph name="MS_AD_NAME" /> η αναγκαστική εγκατάσταση περιορίζεται στις εφαρμογές και στις επεκτάσεις που περιλαμβάνονται στο Chrome Web Store.
-
-          Για να δείτε μια πλήρη περιγραφή των πιθανών ρυθμίσεων και της δομής αυτής της πολιτικής, επισκεφτείτε τη διεύθυνση https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Περιορίστε το εύρος των τοπικών θυρών UDP που χρησιμοποιούνται από το WebRTC</translation>
 <translation id="2757054304033424106">Τύποι επεκτάσεων/εφαρμογών που επιτρέπεται να εγκατασταθούν</translation>
 <translation id="2758084448533744848">Προσδιορίζει τη ζώνη ώρας που θα χρησιμοποιείται από τη συσκευή. Όταν αυτή η πολιτική έχει οριστεί, οι χρήστες στη συσκευή δεν μπορούν να παρακάμψουν την καθορισμένη ζώνη ώρας. Εάν καταχωριστεί μια μη έγκυρη τιμή, η πολιτική ενεργοποιείται χρησιμοποιώντας τη ζώνη ώρας "GMT". Εάν καταχωριστεί μια κενή συμβολοσειρά, γίνεται παράβλεψη της πολιτικής.
@@ -1755,30 +1744,6 @@
       Αυτή η πολιτική επηρεάζει μόνο τους χρήστες που πραγματοποιούν έλεγχο ταυτότητας μέσω SAML.</translation>
 <translation id="4105989332710272578">Απενεργοποίηση επιβολής Διαφάνειας πιστοποιητικών για μια λίστα με URL</translation>
 <translation id="4121350739760194865">Να μην επιτρέπεται η εμφάνιση προσφορών εφαρμογών στη σελίδα νέας καρτέλας</translation>
-<translation id="4125606414556046117">Αυτή η πολιτική σάς επιτρέπει να διαμορφώσετε την εικόνα ταπετσαρίας για την επιφάνεια εργασίας και το φόντο της οθόνης σύνδεσης για τον χρήστη. Η πολιτική ορίζεται με τον καθορισμό του URL από όπου το <ph name="PRODUCT_OS_NAME" /> μπορεί να φορτώσει την εικόνα ταπετσαρίας και έναν κρυπτογραφικό κατακερματισμό που χρησιμοποιείται για την επαλήθευση της ακεραιότητας της λήψης. Η εικόνα πρέπει να είναι σε μορφή JPEG και το μέγεθός της να μην υπερβαίνει τα 16 MB. Το URL πρέπει να είναι προσβάσιμο χωρίς έλεγχο ταυτότητας.
-
-      Γίνεται λήψη της εικόνας ταπετσαρίας και αποθήκευση στην κρυφή μνήμη. Λαμβάνεται ξανά, όποτε αλλάζει το URL ή ο κατακερματισμός.
-
-      Η πολιτική πρέπει να καθορίζεται ως συμβολοσειρά που εκφράζει το URL και τον κατακερματισμό σε μορφή JSON, σύμφωνα με το ακόλουθο σχήμα:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Το URL από όπου μπορεί να γίνει λήψη της εικόνας ταπετσαρίας.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Ο κατακερματισμός SHA-256 της εικόνας ταπετσαρίας.",
-            "type": "string"
-          }
-        }
-      }
-
-      Εάν οριστεί η συγκεκριμένη πολιτική, το <ph name="PRODUCT_OS_NAME" /> θα λαμβάνει και θα χρησιμοποιεί την εικόνα ταπετσαρίας.
-
-      Εάν ρυθμίσετε αυτήν την πολιτική, οι χρήστες δεν μπορούν να την αλλάξουν ή να την παρακάμψουν.
-
-      Εάν δεν ορίσετε την πολιτική, ο χρήστης μπορεί να επιλέξει μια εικόνα που θα εμφανίζεται στην επιφάνεια εργασίας και στο φόντο της οθόνης σύνδεσης.</translation>
 <translation id="412697421478384751">Επιτρέπει στους χρήστες να ορίσουν αδύναμους αριθμούς PIN για τον αριθμό PIN κλειδώματος οθόνης.</translation>
 <translation id="4138655880188755661">Χρονικό όριο</translation>
 <translation id="4144164749344898721">Αυτή η πολιτική ελέγχει πολλαπλές ρυθμίσεις για τη στρατηγική διαχείρισης ενέργειας κατά τα διαστήματα αδράνειας του χρήστη.
@@ -2739,53 +2704,6 @@
 
       Εάν αυτή η πολιτική δεν έχει οριστεί ή έχει οριστεί ως εσφαλμένη, οι εντολές εκτύπωσης ενεργοποιούν την οθόνη προεπισκόπησης εκτύπωσης.</translation>
 <translation id="6022948604095165524">Ενέργεια κατά την εκκίνηση</translation>
-<translation id="6023030044732320798">Καθορίζει ένα σύνολο πολιτικών οι οποίες θα μεταβιβαστούν στο χρόνο εκτέλεσης (runtime) ARC. Η τιμή θα πρέπει να είναι έγκυρο αρχείο JSON.
-
-      Αυτή η πολιτική μπορεί να χρησιμοποιηθεί για τη ρύθμιση των εφαρμογών Android που είναι αυτόματα εγκατεστημένες στην εφαρμογή:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Αναγνωριστικό εφαρμογής Android, π.χ. "com.google.android.gm" για το Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Καθορίζει τον τρόπο εγκατάστασης μιας εφαρμογής. OPTIONAL: Η εφαρμογή δεν εγκαθίσταται αυτόματα, αλλά μπορεί να την εγκαταστήσει ο χρήστης. Αυτή είναι η προεπιλογή εάν δεν καθοριστεί αυτή η πολιτική. PRELOAD: Η εφαρμογή εγκαθίσταται αυτόματα, αλλά ο χρήσης μπορεί να την εγκαταστήσει. FORCE_INSTALLED: Η εφαρμογή εγκαθίσταται αυτόματα και ο χρήστης δεν μπορεί να την απεγκαταστήσει. ΑΠΟΚΛΕΙΣΜΕΝΗ: Η εφαρμογή είναι αποκλεισμένη δεν μπορεί να εγκατασταθεί. Εάν η εφαρμογή έχει εγκατασταθεί με κάποια προηγούμενη πολιτική, θα απεγκατασταθεί.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Πολιτική για την εκχώρηση αιτημάτων άδειας στις εφαρμογές. PERMISSION_POLICY_UNSPECIFIED: Η πολιτική δεν καθορίστηκε. Εάν δεν έχει καθοριστεί πολιτική για κάποια άδεια σε οποιοδήποτε επίπεδο, η συμπεριφορά "PROMPT" χρησιμοποιείται από προεπιλογή. PROMPT: Ερώτηση στον χρήστη για εκχώρηση άδειας. GRANT: Αυτόματη εκχώρηση άδειας. DENY: Αυτόματη άρνηση άδειας.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Αντικείμενο διαμόρφωσης JSON συγκεκριμένα για εφαρμογή με ένα σύνολο ζευγών κλειδιών-τιμών, π.χ. '"managedConfiguration": { "key1": value1, "key2": value2 }'. Αυτά τα κλειδιά καθορίζονται στο μανιφέστο της εφαρμογής.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Για να καρφιτσώσετε εφαρμογές στην εφαρμογή εκκίνησης, ανατρέξτε στο PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Προεπιλεγμένη διεύθυνση URL instant πάροχο αναζήτησης</translation>
 <translation id="603410445099326293">Παράμετροι για πρόταση διεύθυνσης URL που χρησιμοποιεί POST</translation>
 <translation id="6034341625190551415">Ελέγχει τους τύπους δημόσιων περιόδων λειτουργίας και λογαριασμών kiosk.</translation>
@@ -3135,37 +3053,6 @@
       Εάν αυτή η πολιτική έχει οριστεί ως μη αληθής, το ενσωματωμένο πρόγραμμα-πελάτης DNS δεν θα χρησιμοποιηθεί ποτέ.
 
       Εάν αυτή η πολιτική δεν έχει οριστεί, το ενσωματωμένο πρόγραμμα-πελάτης DNS θα ενεργοποιείται από προεπιλογή σε MacOS, Android (όταν δεν έχει ενεργοποιηθεί ούτε το ιδιωτικό DNS ούτε το VPN) και ChromeOS και οι χρήστες θα μπορούν είτε να επιλέξουν εάν θα χρησιμοποιείται το ενσωματωμένο πρόγραμμα-πελάτης DNS, είτε μέσω της επεξεργασίας του chrome://flags είτε μέσω του καθορισμού μιας επισήμανσης γραμμής εντολών.</translation>
-<translation id="6838056959556423778">Παρακάμπτει τους προεπιλεγμένους κανόνες για την επιλογή εκτυπωτή στο <ph name="PRODUCT_NAME" />.
-
-      Αυτή η πολιτική προσδιορίζει τους κανόνες για την επιλογή του προεπιλεγμένου εκτυπωτή στο <ph name="PRODUCT_NAME" />, η οποία πραγματοποιείται την πρώτη φορά που χρησιμοποιείται η λειτουργία εκτύπωσης σε κάποιο προφίλ.
-
-      Μετά τον ορισμό αυτής της πολιτικής, το <ph name="PRODUCT_NAME" /> θα επιχειρήσει να εντοπίσει έναν εκτυπωτή ο οποίος αντιστοιχεί σε όλα τα καθορισμένα χαρακτηριστικά και θα τον επιλέξει ως προεπιλεγμένο εκτυπωτή. Επιλέγεται ο πρώτος εκτυπωτής που εντοπίζεται και αντιστοιχεί με την πολιτική, ενώ σε περίπτωση μη εντοπισμού μοναδικής αντιστοίχισης, μπορεί να επιλεγεί οποιοσδήποτε εκτυπωτής, ανάλογα με τη σειρά εντοπισμού τους.
-
-      Εάν δεν έχει οριστεί αυτή η πολιτική ή δεν εντοπιστεί εκτυπωτής που αντιστοιχεί σε αυτά τα χαρακτηριστικά εντός του χρονικού ορίου λήξης, ως εκτυπωτής ορίζεται από προεπιλογή ο ενσωματωμένος εκτυπωτής PDF ή δεν επιλέγεται κάποιος εκτυπωτής, εάν δεν υπάρχει διαθέσιμος εκτυπωτής PDF.
-
-      Η τιμή αναλύεται ως αντικείμενο JSON και ακολουθεί το παρακάτω σχήμα:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Εάν θα υπάρχει περιορισμός στην αναζήτηση εκτυπωτή που αντιστοιχεί με τα χαρακτηριστικά σε συγκεκριμένο σύνολο εκτυπωτών.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Τυπική έκφραση για το αναγνωριστικό του εκτυπωτή αντιστοίχισης.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Τυπική έκφραση για το εμφανιζόμενο όνομα του εκτυπωτή αντιστοίχισης.",
-            "type": "string"
-          }
-        }
-      }
-
-      Οι εκτυπωτές που είναι συνδεδεμένοι στο <ph name="CLOUD_PRINT_NAME" /> θεωρούνται εκτυπωτές <ph name="PRINTER_TYPE_CLOUD" />, ενώ οι υπόλοιποι εκτυπωτές κατηγοριοποιούνται ως <ph name="PRINTER_TYPE_LOCAL" />.
-      Η παράλειψη ενός πεδίου υποδηλώνει ότι όλες οι τιμές αντιστοιχίζονται, για παράδειγμα, ο μη προσδιορισμός της συνδεσιμότητας θα προκαλέσει την έναρξη από την Προεπισκόπιση εκτύπωσης του εντοπισμού όλων των τύπων εκτυπωτών, τοπικών και cloud.
-      Τα μοτίβα των τυπικών εκφράσεων πρέπει να ακολουθούν τη σύνταξη JavaScript RegExp και οι αντιστοιχίσεις χαρακτηρίζονται από διάκριση πεζών-κεφαλαίων.</translation>
 <translation id="6843296367238757293">Αυτή η πολιτική έχει καταργηθεί. Δεν συνιστάται η χρήση της. Διαβάστε περισσότερα στη διεύθυνση https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Αυτή η πολιτική καταργήθηκε στο <ph name="PRODUCT_NAME" /> 68 και αντικαταστάθηκε από την πολιτική <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Αυτή η πολιτική καταργήθηκε και αφαιρέθηκε στο M66, επειδή χρησιμοποιήθηκε για εσωτερικές δοκιμές και αποτελεί κίνδυνο ασφαλείας.
@@ -4339,30 +4226,6 @@
       Αυτή η πολιτική επηρεάζει μόνο τους χρήστες που πραγματοποίησαν έλεγχο ταυτότητας μέσω SAML.
 
       Η τιμής της πολιτικής θα πρέπει να προσδιοριστεί σε δευτερόλεπτα.</translation>
-<translation id="9027787254195333560">Αυτή η πολιτική σάς επιτρέπει να διαμορφώσετε την εικόνα avatar που αντιπροσωπεύει τον χρήστη στην οθόνη σύνδεσης. Η πολιτική ορίζεται με καθορισμό του URL από το οποίο το <ph name="PRODUCT_OS_NAME" /> μπορεί να κατεβάσει την εικόνα avatar και έναν κρυπτογραφικό κατακερματισμό που χρησιμοποιείται για την επαλήθευση της ακεραιότητας της λήψης. Η εικόνα πρέπει να είναι σε μορφή JPEG και το μέγεθός της δεν πρέπει να υπερβαίνει τα 512 kB. Το URL πρέπει να είναι προσβάσιμο χωρίς έλεγχο ταυτότητας.
-
-      Γίνεται λήψη της εικόνας avatar και αποθήκευση στην κρυφή μνήμη. Λαμβάνεται ξανά, όποτε αλλάζει το URL ή ο κατακερματισμός.
-
-      Η πολιτική πρέπει να καθορίζεται ως συμβολοσειρά που εκφράζει το URL και τον κατακερματισμό σε μορφή JSON, σύμφωνα με το ακόλουθο σχήμα:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Το URL από όπου μπορεί να γίνει λήψη της εικόνας avatar.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Ο κατακερματισμός SHA-256 της εικόνας avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Εάν οριστεί η συγκεκριμένη πολιτική, το <ph name="PRODUCT_OS_NAME" /> θα λαμβάνει και θα χρησιμοποιεί την εικόνα avatar.
-
-      Εάν ρυθμίσετε αυτήν την πολιτική, οι χρήστες δεν μπορούν να την αλλάξουν ή να την παρακάμψουν.
-
-      Εάν δεν ορίσετε την πολιτική, ο χρήστης μπορεί να επιλέξει την εικόνα avatar που τον αντιπροσωπεύει στην οθόνη σύνδεσης.</translation>
 <translation id="9035964157729712237">Αναγνωριστικά επέκτασης για εξαίρεση από τη λίστα αποκλεισμένων</translation>
 <translation id="9038058011835642205">Ορίζει μια λίστα ιστοτόπων που εγκαθίστανται αθόρυβα, χωρίς παρέμβαση του χρήστη, και δεν μπορούν να απεγκατασταθούν ή να απενεργοποιηθούν από τον χρήστη.
 
@@ -4375,7 +4238,6 @@
       Εάν ρυθμίσετε αυτήν την πολιτική, οι χρήστες δεν μπορούν να την αλλάξουν ή να την παρακάμψουν.
 
       Η τιμή της πολιτικής θα πρέπει να καθορίζεται σε χιλιοστά του δευτερολέπτου. Οι τιμές περιλαμβάνονται σε εύρος 30 δευτερολέπτων έως 24 ωρών.</translation>
-<translation id="9042911395677044526">Επιτρέπει την προώθηση της διαμόρφωσης δικτύου για την εφαρμογή ανά χρήστη σε μια συσκευή <ph name="PRODUCT_OS_NAME" />. Η διαμόρφωση δικτύου είναι μια συμβολοσειρά με μορφοποίηση JSON, όπως καθορίζεται από την Ανοιχτή μορφή διαμόρφωσης δικτύου που περιγράφεται στο <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Αυτή η πολιτική ελέγχει αν η συσκευή πρέπει να ενημερωθεί με μια Έκδοση ταχείας διόρθωσης.
 
       Αν η πολιτική οριστεί με ένα διακριτικό που αντιστοιχεί σε μια Έκδοση ταχείας διόρθωσης, η συσκευή θα ενημερωθεί με την αντίστοιχη Έκδοση ταχείας διόρθωσης, εφόσον η ενημέρωση δεν απαγορεύεται από κάποια άλλη πολιτική.
@@ -4455,17 +4317,6 @@
       Εάν η πολιτική οριστεί ως ψευδής ("false"), το στοιχείο "Κεφαλίδες και υποσέλιδα" ('Headers and footers') δεν θα είναι επιλεγμένο στο παράθυρο διαλόγου προεπισκόπησης εκτύπωσης και ο χρήστης δεν θα μπορεί να το αλλάξει.
 
       Εάν η πολιτική οριστεί ως αληθής ("true"), το στοιχείο "Κεφαλίδες και υποσέλιδα" ('Headers and footers') θα είναι επιλεγμένο στο παράθυρο διαλόγου προεπισκόπησης εκτύπωσης και ο χρήστης δεν θα μπορεί να το αλλάξει.</translation>
-<translation id="9213347477683611358">Διαμόρφωση της εικόνας ταπετσαρίας σε επίπεδο συσκευής, η οποία εμφανίζεται στην οθόνη σύνδεσης, εάν δεν έχει συνδεθεί ακόμα κανένας χρήστης στη συσκευή. Η πολιτική ορίζεται μέσω του καθορισμού του URL από το οποίο η συσκευή Chrome OS μπορεί να κατεβάσει την εικόνα ταπετσαρίας και έναν κατακερματισμό κρυπτογράφησης ο οποίος χρησιμοποιείται για την επαλήθευση της ακεραιότητας της λήψης. Η εικόνα θα πρέπει να είναι σε μορφή JPEG και το μέγεθος του αρχείου δεν θα πρέπει να ξεπερνά τα 16 MB. Το URL θα πρέπει να είναι προσβάσιμο χωρίς περαιτέρω έλεγχο ταυτότητας. Η εικόνα ταπετσαρίας λαμβάνεται και αποθηκεύεται στην κρυφή μνήμη. Η λήψη της θα επαναλαμβάνεται κάθε φορά που αλλάζει το URL ή ο κατακερματισμός.
-
-      Η πολιτική θα πρέπει να καθορίζεται ως μια συμβολοσειρά που εκφράζει το URL και τον κατακερματισμό (hash) με τη μορφή JSON, π.χ.
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Εάν έχει οριστεί η πολιτική ταπετσαρίας συσκευής, η συσκευή Chrome OS θα κατεβάσει και θα χρησιμοποιήσει την εικόνα ταπετσαρίας στην οθόνη σύνδεσης, εάν δεν έχει συνδεθεί ακόμα κάποιος χρήστης στη συσκευή. Μόλις συνδεθεί ο χρήστης, ξεκινά η εφαρμογή της πολιτικής ταπετσαρίας του χρήστη.
-
-      Εάν δεν έχει οριστεί η πολιτική ταπετσαρίας συσκευής, η απόφαση για το περιεχόμενο που θα εμφανίζεται έγκειται στην πολιτική ταπετσαρίας χρήστη, εάν έχει οριστεί η πολιτική ταπετσαρίας χρήστη.</translation>
 <translation id="9217154963008402249">Συχνότητα πακέτων δικτύου παρακολούθησης</translation>
 <translation id="922540222991413931">Διαμόρφωση προελεύσεων εγκατάστασης επεκτάσεων, εφαρμογών και σεναρίων χρήστη</translation>
 <translation id="924557436754151212">Εισαγωγή αποθηκευμένων κωδικών πρόσβασης από το προεπιλεγμένο πρόγραμμα περιήγησης στην πρώτη εκτέλεση</translation>
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 48cea2c..7a9bf2aa 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -414,7 +414,6 @@
 
       Warning: It is not recommended to delegate control of the <ph name="PRODUCT_OS_NAME" /> version to a kiosk app as it may prevent the device from receiving software updates and critical security fixes. Delegating control of the <ph name="PRODUCT_OS_NAME" /> version might leave users at risk.</translation>
 <translation id="1675002386741412210">Supported on:</translation>
-<translation id="1689963000958717134">Allows pushing network configuration to be applied for all users of a <ph name="PRODUCT_OS_NAME" /> device. The network configuration is a JSON-formatted string as defined by the Open Network Configuration format described at <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Configures availability and behaviour of <ph name="TPM_FIRMWARE_UPDATE_TPM" /> firmware update functionality.
 
       Individual settings can be specified in JSON properties:
@@ -972,16 +971,6 @@
       If this setting is disabled, web pages cannot use JavaScript and the user cannot change that setting.
 
       If this setting is enabled or not set, web pages can use JavaScript but the user can change that setting.</translation>
-<translation id="2747157663401642394">Configures extension management settings for <ph name="PRODUCT_NAME" />.
-
-          This policy controls multiple settings, including settings controlled by any existing extension-related policies. This policy will override any legacy policies if both are set.
-
-          This policy maps an extension ID or an update URL to its configuration. With an extension ID, configuration will be applied to the specified extension only. A default configuration can be set for the special ID <ph name="DEFAULT_SCOPE" />, which will apply to all extensions that don't have a custom configuration set in this policy. With an update URL, configuration will be applied to all extensions with the exact update URL stated in manifest of this extension, as described at <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          For Windows instances that are not joined to a <ph name="MS_AD_NAME" /> domain, forced installation is limited to apps and extensions listed in the Chrome Web Store.
-
-          For a full description of possible settings and structure of this policy, please visit https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Restrict the range of local UDP ports used by WebRTC</translation>
 <translation id="2757054304033424106">Types of extensions/apps that are allowed to be installed</translation>
 <translation id="2758084448533744848">Specifies the enforced timezone to be used for the device. When this policy is set, users on the device cannot override the specified timezone. If an invalid value is provided, the policy is still activated using "GMT" instead. If an empty string is provided, the policy is ignored.
@@ -1750,30 +1739,6 @@
       This policy affects only users who authenticate using SAML.</translation>
 <translation id="4105989332710272578">Disable Certificate Transparency enforcement for a list of URLs</translation>
 <translation id="4121350739760194865">Prevent app promotions from appearing on the new tab page</translation>
-<translation id="4125606414556046117">This policy allows you to configure the wallpaper image that is shown on the desktop and on the login screen background for the user. The policy is set by specifying the URL from which <ph name="PRODUCT_OS_NAME" /> can download the wallpaper image and a cryptographic hash used to verify the integrity of the download. The image must be in JPEG format, and its file size must not exceed 16 MB. The URL must be accessible without any authentication.
-
-      The wallpaper image is downloaded and cached. It will be re-downloaded whenever the URL or the hash changes.
-
-      The policy should be specified as a string that expresses the URL and hash in JSON format, conforming to the following schema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "The URL from which the wallpaper image can be downloaded.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "The SHA-256 hash of the wallpaper image.",
-            "type": "string"
-          }
-        }
-      }
-
-      If this policy is set, <ph name="PRODUCT_OS_NAME" /> will download and use the wallpaper image.
-
-      If you set this policy, users cannot change or override it.
-
-      If the policy is left not set, the user can choose an image to be shown on the desktop and on the login screen background.</translation>
 <translation id="412697421478384751">Enable users to set weak PINs for the lock screen PIN</translation>
 <translation id="4138655880188755661">Time Limit</translation>
 <translation id="4144164749344898721">This policy controls multiple settings for the power management strategy when the user becomes idle.
@@ -2727,53 +2692,6 @@
 
       If this policy is not set or is set to false, print commands trigger the print preview screen.</translation>
 <translation id="6022948604095165524">Action on start-up</translation>
-<translation id="6023030044732320798">Specifies a set of policies that will be handed over to the ARC runtime. The value must be valid JSON.
-
-      This policy can be used to configure which Android apps are automatically installed on the device:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android app identifier, e.g. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": 'Specifies how an app is installed. OPTIONAL: The app is not installed automatically, but the user can install it. This is the default if this policy is not specified. PRELOAD: The app is installed automatically, but the user can uninstall it. FORCE_INSTALLED: The app is installed automatically and the user cannot uninstall it. BLOCKED: The app is blocked and cannot be installed. If the app was installed under a previous policy it will be uninstalled.',
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": 'Policy for granting permission requests to apps. PERMISSION_POLICY_UNSPECIFIED: Policy not specified. If no policy is specified for a permission at any level, then the `PROMPT` behaviour is used by default. PROMPT: Prompt the user to grant a permission. GRANT: Automatically grant a permission. DENY: Automatically deny a permission.',
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": 'App-specific JSON configuration object with a set of key-value pairs, e.g. '"managedConfiguration": { "key1": value1, "key2": value2 }'. The keys are defined in the app manifest.',
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      To pin apps to the launcher, see PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Default search provider instant URL</translation>
 <translation id="603410445099326293">Parameters for suggest URL which uses POST</translation>
 <translation id="6034341625190551415">Controls public session and kiosk account types.</translation>
@@ -3123,37 +3041,6 @@
       If this policy is set to false, the built-in DNS client will never be used.
 
       If this policy is left not set, the built-in DNS client will be enabled by default on MacOS, Android (when neither Private DNS nor VPN are enabled) and ChromeOS, and the users will be able to change whether the built-in DNS client is used by editing chrome://flags or specifying a command-line flag.</translation>
-<translation id="6838056959556423778">Overrides <ph name="PRODUCT_NAME" /> default printer selection rules.
-
-      This policy determines the rules for selecting the default printer in <ph name="PRODUCT_NAME" /> which happens the first time that the print function is used with a profile.
-
-      When this policy is set, <ph name="PRODUCT_NAME" /> will attempt to find a printer matching all of the specified attributes, and select it as default printer. The first printer found matching the policy is selected; in the case of non-unique matches, any matching printer can be selected, depending on the order in which printers are discovered.
-
-      If this policy is not set or a matching printer is not found within the timeout, the printer defaults to built-in PDF printer or no printer selected, when PDF printer is not available.
-
-      The value is parsed as JSON object, conforming to the following schema:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Whether to limit the search of the matching printer to a specific set of printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regular expression to match printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regular expression to match printer display name.",
-            "type": "string"
-          }
-        }
-      }
-
-      Printers connected to <ph name="CLOUD_PRINT_NAME" /> are considered <ph name="PRINTER_TYPE_CLOUD" />; the rest of the printers are classified as <ph name="PRINTER_TYPE_LOCAL" />.
-      Omitting a field means all values match. For example, not specifying connectivity will cause Print Preview to initiate the discovery of all kinds of printers: local and cloud.
-      Regular expression patterns must follow the JavaScript RegExp syntax and matches are case sensitive.</translation>
 <translation id="6843296367238757293">This policy is deprecated. Its usage is discouraged. Read more at https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">This policy was removed in <ph name="PRODUCT_NAME" /> 68 and replaced by <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">This policy is deprecated and removed in M66, because it was used only for internal testing and it is a security liability.
@@ -4326,30 +4213,6 @@
       This policy only affects users who authenticated using SAML.
 
       The policy value should be specified in seconds.</translation>
-<translation id="9027787254195333560">This policy allows you to configure the avatar image representing the user on the login screen. The policy is set by specifying the URL from which <ph name="PRODUCT_OS_NAME" /> can download the avatar image and a cryptographic hash used to verify the integrity of the download. The image must be in JPEG format; its size must not exceed 512 KB. The URL must be accessible without any authentication.
-
-      The avatar image is downloaded and cached. It will be re-downloaded whenever the URL or the hash changes.
-
-      The policy should be specified as a string that expresses the URL and hash in JSON format, conforming to the following schema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "The URL from which the avatar image can be downloaded.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "The SHA-256 hash of the avatar image.",
-            "type": "string"
-          }
-        }
-      }
-
-      If this policy is set, <ph name="PRODUCT_OS_NAME" /> will download and use the avatar image.
-
-      If you set this policy, users cannot change or override it.
-
-      If the policy is left not set, the user can choose the avatar image representing them on the login screen.</translation>
 <translation id="9035964157729712237">Extension IDs to exempt from the blacklist</translation>
 <translation id="9038058011835642205">Specifies a list of websites that are installed silently, without user interaction, and which cannot be uninstalled nor disabled by the user.
 
@@ -4362,7 +4225,6 @@
       If you set this policy, users cannot change or override it.
 
       The policy value should be specified in milliseconds. Values are clamped to a range of 30 seconds to 24 hours.</translation>
-<translation id="9042911395677044526">Allows pushing network configuration to be applied per-user to a <ph name="PRODUCT_OS_NAME" /> device. The network configuration is a JSON-formatted string as defined by the Open Network Configuration format described at <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">This policy controls whether or not the device should be updated to a Quick Fix Build.
 
       If policy value is set to a token that maps to a Quick Fix Build, the device will be updated to the corresponding Quick Fix Build if the update is not blocked by another policy.
@@ -4442,17 +4304,6 @@
       If the policy is set to false, 'Headers and footers' is not selected in the print preview dialogue and the user cannot change it.
 
       If the policy is set to true, 'Headers and footers' is selected in the print preview dialogue and the user cannot change it.</translation>
-<translation id="9213347477683611358">Configure device-level wallpaper image that is shown on the login screen if no user has yet signed in to the device. The policy is set by specifying the URL from which the Chrome OS device can download the wallpaper image and a cryptographic hash used to verify the integrity of the download. The image must be in JPEG format, its file size must not exceed 16 MB. The URL must be accessible without any authentication. The wallpaper image is downloaded and cached. It will be re-downloaded whenever the URL or the hash changes.
-
-      The policy should be specified as a string that expresses the URL and hash in JSON format, e.g.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      If the device wallpaper policy is set, the Chrome OS device will download and use the wallpaper image on the login screen if no user has yet signed in to the device. Once the user logs in, the user's wallpaper policy kicks in.
-
-      If the device wallpaper policy is left not set, it's the user's wallpaper policy to decide what to show if the user's wallpaper policy is set.</translation>
 <translation id="9217154963008402249">Frequency of monitoring network packets</translation>
 <translation id="922540222991413931">Configure extension, app, and user script install sources</translation>
 <translation id="924557436754151212">Import saved passwords from default browser on first run</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 8466fe5..609e8d0 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -410,7 +410,6 @@
 
       Advertencia: No se recomienda delegar el control de la versión de <ph name="PRODUCT_OS_NAME" /> a una Aplicación de kiosko ya que puede evitar que el dispositivo reciba actualizaciones de software y correcciones de seguridad críticas. Delegar el control de la versión de <ph name="PRODUCT_OS_NAME" /> puede poner en riesgo a los usuarios.</translation>
 <translation id="1675002386741412210">Compatible con:</translation>
-<translation id="1689963000958717134">Permite aplicar la configuración de red a todos los usuarios de un dispositivo <ph name="PRODUCT_OS_NAME" />. La configuración de red es una cadena escrita en formato JSON, como se define en el formato Open Network Configuration que se describe en <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="1704516734140344991">Configura la disponibilidad y el comportamiento de la función de actualización del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Se pueden especificar opciones de configuración particulares en las propiedades de JSON:
@@ -942,16 +941,6 @@
       Si esta configuración está inhabilitada, las páginas web no podrán usar JavaScript y el usuario no podrá cambiar esa configuración.
 
       Si esta configuración está habilitada o no está establecida, las páginas web podrán usar JavaScript pero el usuario podrá cambiar esa configuración.</translation>
-<translation id="2747157663401642394">Establece la configuración de la administración de extensiones para <ph name="PRODUCT_NAME" />.
-
-          Esta política controla varias opciones de configuración, incluida la configuración regida por políticas existentes relacionadas con extensiones. Esta política anulará cualquier política heredada si se configuran ambas.
-
-          Esta política asigna un ID de extensión o una URL de actualización a su configuración. Con un ID de extensión, la configuración se aplicará a la extensión especificada únicamente. Es posible establecer una configuración predeterminada para el ID especial <ph name="DEFAULT_SCOPE" />, que se aplicará a todas las extensiones que no tengan una configuración personalizada en esta política. Con una URL de actualización, la configuración se aplicará a todas las extensiones con la URL de actualización exacta establecida en el manifiesto de esta extensión, como se describe en <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Para las instancias de Windows que no están unidas a un dominio de <ph name="MS_AD_NAME" />, solo se pueden instalar de manera automática las apps y extensiones que aparecen en Chrome Web Store.
-
-          Para obtener una descripción completa de las opciones de configuración posibles y la estructura de esta política, visita https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Restringir el intervalo de puertos UDP locales que usa WebRTC</translation>
 <translation id="2757054304033424106">Tipos de extensiones o aplicaciones que se pueden instalar</translation>
 <translation id="2758084448533744848">Especifica la zona horaria que se aplicará en el dispositivo. Cuando se configura esta política, los usuarios del dispositivo no pueden anular la zona horaria especificada. Si se proporciona un valor no válido, la política se activará de todas formas, pero con la zona horaria "GMT". Si se proporciona una string vacía, se ignorará la política.
@@ -1197,7 +1186,7 @@
 <translation id="3077183141551274418">Habilitar o inhabilitar los ciclos de vida de las pestañas</translation>
 <translation id="3079417254871857650">Especifica la acción que debe realizarse cuando se creó el directorio principal del usuario con la encriptación ecryptfs.
 
-      Si configuras esta política como "DisallowArc", se inhabilitarán las apps de Android para el usuario y no se realizará la migración de la encriptación ecryptfs a ext4. Si el directorio principal ya cuenta con la encriptación ext4, no se inhabilitarán las apps de Android.
+      Si configuras esta política como "DisallowArc", se inhabilitarán las apps de Android para el usuario, y no se realizará la migración de la encriptación ecryptfs a ext4. Si el directorio principal ya cuenta con la encriptación ext4, no se inhabilitarán las apps de Android.
 
       Si configuras esta política como "Migrate", los directorios principales con la encriptación ecryptfs se migrarán automáticamente a la encriptación ext4 cuando el usuario acceda, sin solicitarle permiso.
 
@@ -1515,7 +1504,7 @@
 <translation id="3826475866868158882">Se habilitaron los Servicios de ubicación de Google</translation>
 <translation id="3831054243924627613">Esta política controla el estado inicial de la funcionalidad de Android para hacer copias de seguridad y aplicar restablecimientos.
 
-      Si no se configura o se establece como <ph name="BR_DISABLED" />, se inhabilitará la funcionalidad de Android para hacer copias de seguridad y aplicar restablecimientos.
+      Si no se configura o se establece como <ph name="BR_DISABLED" />, se inhabilitará esa funcionalidad de Android.
 
       Si esta política se establece como <ph name="BR_ENABLED" />, se habilitará la funcionalidad de Android para hacer copias de seguridad y aplicar restablecimientos.
 
@@ -1711,30 +1700,6 @@
       Esta política solo afecta a los usuarios que realizan la autenticación con SAML.</translation>
 <translation id="4105989332710272578">Inhabilitar la aplicación del Certificado de transparencia para una lista de URL</translation>
 <translation id="4121350739760194865">Impedir que aparezcan las promociones de aplicaciones en la página de la nueva pestaña</translation>
-<translation id="4125606414556046117">Esta política te permite configurar la imagen del fondo de pantalla del escritorio y de la pantalla de acceso del usuario. Para configurarla, indica la dirección URL desde la cual <ph name="PRODUCT_OS_NAME" /> puede descargar la imagen del fondo de pantalla y un hash criptográfico que verifique la integridad de la descarga. La imagen debe estar en formato JPEG y pesar 16 MB como máximo. Se debe poder acceder a la dirección URL sin autenticación previa.
-
-      La imagen del fondo de pantalla se descarga y queda almacenada en caché. Cada vez que cambie la URL o el hash, la imagen se volverá a descargar.
-
-      La política debe indicarse como una cadena que expresa la dirección URL y el hash en formato JSON, y según el siguiente esquema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Dirección URL desde la cual se puede descargar la imagen del fondo de pantalla",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hash SHA-256 de la imagen del fondo de pantalla",
-            "type": "string"
-          }
-        }
-      }
-
-      Si se configura esta política, <ph name="PRODUCT_OS_NAME" /> descargará y utilizará la imagen del fondo de pantalla.
-
-      Si configuras esta política, los usuarios no podrán modificarla ni anularla.
-
-      Si no se configura esta política, los usuarios podrán elegir la imagen del fondo de pantalla del escritorio y de la pantalla de acceso.</translation>
 <translation id="412697421478384751">Permitir que los usuarios establezcan PIN no seguros para la pantalla bloqueada</translation>
 <translation id="4138655880188755661">Límite de tiempo</translation>
 <translation id="4144164749344898721">Esta política controla distintas configuraciones de la estrategia de administración de energía cuando el usuario está inactivo.
@@ -2478,7 +2443,7 @@
 <translation id="5630352020869108293">Restaurar la última sesión</translation>
 <translation id="5643906875497889108">Controla los tipos de extensiones o apps que se pueden instalar y limita el acceso al tiempo de ejecución.
 
-          Esta configuración incluye en la lista blanca los tipos de extensiones o apps permitidos que se pueden instalar en <ph name="PRODUCT_NAME" /> y los hosts con los que pueden interactuar. El valor es una lista con las siguientes strings: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". Para obtener más información sobre estos tipos, consulta la documentación de extensiones de <ph name="PRODUCT_NAME" />.
+          Esta configuración incluye en la lista blanca los tipos de extensiones o apps permitidos que se pueden instalar en <ph name="PRODUCT_NAME" /> y los hosts con los que pueden interactuar. El valor es una lista con los siguientes strings: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". Para obtener más información sobre estos tipos, consulta la documentación de extensiones de <ph name="PRODUCT_NAME" />.
 
           Ten en cuenta que esta política también afecta las extensiones y apps que se instalan de forma automática mediante la política ExtensionInstallForcelist.
 
@@ -2649,59 +2614,12 @@
 
       Si esta política no se establece o se inhabilita, los comandos de impresión muestran la pantalla de vista previa de impresión.</translation>
 <translation id="6022948604095165524">Acción al iniciar</translation>
-<translation id="6023030044732320798">Especifica el conjunto de políticas que se enviará al tiempo de ejecución de ARC. El valor debe ser un formato JSON válido.
-
-      Esta política se puede usar para configurar qué apps de Android se instalan de forma automática:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identificador de app de Android, p. ej., "com.google.android.gm" para Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Especifica cómo se instala una app. OPTIONAL: La app no se instala de forma automática, pero el usuario puede instalarla. Esta es la configuración predeterminada si no se especifica esta política. PRELOAD: La app se instala de forma automática, pero el usuario puede desinstalarla. FORCE_INSTALLED: La app se instala de forma automática, y el usuario no puede desinstalarla. BLOCKED: La app está bloqueada o no se puede instalar. Si la app se instaló con una política anterior, se desinstalará.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Política de otorgamiento de permisos para las apps que lo soliciten. PERMISSION_POLICY_UNSPECIFIED: La política no se especifica. Si no se especifica ninguna política para un permiso en cualquier nivel, se usa el comportamiento "PROMPT" de forma predeterminada. PROMPT: Solicita al usuario que otorgue un permiso. GRANT: Otorga un permiso de forma automática. DENY: Deniega un permiso de forma automática.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Objeto de configuración JSON específico de apps con un conjunto de pares clave-valor, p. ej. '"managedConfiguration": { "key1": value1, "key2": value2 }'. Las claves se definen en el manifiesto de la app.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Para fijar apps al Launcher, consulta PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL instantánea del proveedor de búsqueda predeterminado</translation>
 <translation id="603410445099326293">Parámetros para URL de sugerencia que utiliza POST</translation>
 <translation id="6034341625190551415">Controla la sesión pública y los tipos de cuenta del kiosko.</translation>
 <translation id="6034603289689965535">Permite que una página muestre ventanas emergentes durante su descarga</translation>
 <translation id="6036523166753287175">Habilitar el cruce seguro de firewall desde hosts de acceso remoto</translation>
-<translation id="605475635122964053">Restringe el modo de impresión con PIN. Si no se configura la política, no se aplicará ninguna restricción. Si el modo no está disponible, se ignorará esta política. Ten en cuenta que la función de impresión de PIN solo se habilitará para impresoras que usen uno de los protocolos IPPS, USB o IPP-over-USB </translation>
+<translation id="605475635122964053">Restringe el modo de impresión con PIN. Si no se configura la política, no se aplicará ninguna restricción. Si el modo no está disponible, se ignorará esta política. Ten en cuenta que la función de impresión con PIN solo se habilitará para impresoras que usen uno de los protocolos IPPS, USB o IPP-over-USB </translation>
 <translation id="6070667616071269965">Diseños de teclado de la pantalla de acceso del dispositivo</translation>
 <translation id="6074963268421707432">No permitir que los sitios muestren notificaciones de escritorio.</translation>
 <translation id="6074964551275531965">Establecer el período para las notificaciones de actualización</translation>
@@ -3043,37 +2961,6 @@
       Si se establece como falsa, no se utilizará el cliente DNS integrado.
 
       Si no se establece, se habilitará el cliente DNS integrado de forma predeterminada en MacOS, el Sistema operativo Chrome y Android (cuando no están habilitados el DNS privado ni la VPN). Además, los usuarios podrán decidir si se utiliza el cliente DNS integrado al editar chrome://flags o al especificar una marca de línea de comandos.</translation>
-<translation id="6838056959556423778">Anula las reglas predeterminadas de selección de impresora de <ph name="PRODUCT_NAME" />.
-
-      Esta política determina las reglas para seleccionar la impresora predeterminada en <ph name="PRODUCT_NAME" />, que sucede la primera vez que se usa la función de impresión con un perfil.
-
-      Cuando se establezca esta política, <ph name="PRODUCT_NAME" /> buscará una impresora que cuente con todos los atributos especificados. Selecciónala como impresora predeterminada. Se elige la primera impresora que coincida con la política. En el caso de que haya más de una coincidencia, se puede seleccionar cualquier impresora encontrada, en función del orden en el que se encontraron.
-
-      Si no se establece esta política o no se encuentra ninguna impresora que coincida dentro del tiempo de espera, se selecciona como predeterminada la impresora PDF integrada o, en caso de que no esté disponible, no se selecciona ninguna.
-
-      El valor se analiza como un objeto JSON, de acuerdo al siguiente esquema:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Limitar la búsqueda de la impresora a un grupo específico.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Expresión regular que coincida con el ID de la impresora.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Expresión regular que coincida con el nombre comercial de la impresora.",
-            "type": "string"
-          }
-        }
-      }
-
-      Las impresoras conectadas a <ph name="CLOUD_PRINT_NAME" /> se consideran <ph name="PRINTER_TYPE_CLOUD" />; el resto de las impresoras se clasifican como <ph name="PRINTER_TYPE_LOCAL" />.
-      Si se omite un campo, todos los valores se consideran coincidentes. Por ejemplo, si no se especifica la conectividad, la Vista previa de impresión iniciará la búsqueda de todo tipo de impresoras, ya sea locales o en la nube.
-      Los patrones de expresión regulares deben seguir la sintaxis de JavaScript RegExp, y las coincidencias distinguen entre mayúsculas y minúsculas.</translation>
 <translation id="6843296367238757293">Esta política es obsoleta, por lo que no se recomienda su uso. Obtén más información en https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">En la versión 68 de <ph name="PRODUCT_NAME" />, se quitó esta política y se reemplazó por <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Esta política dejó de estar disponible y se quitó de M66 porque se usó solo para realizar pruebas internas y representa un riesgo para la seguridad.
@@ -3224,7 +3111,7 @@
       Si no estableces esta política, los usuarios podrán decidir si quieren que sea necesaria una contraseña para volver a activar el dispositivo o no.</translation>
 <translation id="7107148737865880402">Habilita la política de administración de la energía para el uso compartido de energía con USB.
 
-          Ciertos dispositivos tienen un puerto USB específico, marcado con un ícono de rayo o de batería, que se puede usar para cargar dispositivos como teléfonos móviles con la batería del sistema. Esta política afecta el comportamiento de carga de este puerto mientras el sistema está apagado o en suspensión. Esta política no afecta los demás puertos USB ni el comportamiento de carga cuando el sistema está activado.
+          Ciertos dispositivos tienen un puerto USB específico, marcado con un ícono de rayo o de batería, que se puede usar para cargar dispositivos, como teléfonos móviles, con la batería del sistema. Esta política afecta el comportamiento de carga de este puerto mientras el sistema está apagado o en suspensión. Esta política no afecta los demás puertos USB ni el comportamiento de carga cuando el sistema está activado.
 
           En ese caso, el puerto USB siempre proporcionará energía.
 
@@ -4224,30 +4111,6 @@
       Esta política solo afecta a los usuarios autenticados mediante SAML.
 
       El valor de la política debe especificarse en segundos.</translation>
-<translation id="9027787254195333560">Esta política permite configurar la imagen de avatar que identifica al usuario en la pantalla de acceso. Para configurarla, indica la URL desde la cual <ph name="PRODUCT_OS_NAME" /> puede descargar la imagen de avatar y un hash criptográfico que verifique la integridad de la descarga. La imagen debe estar en formato JPEG y no pesar más de 512 kB. Se debe poder acceder a la dirección URL sin autenticación previa.
-
-      La imagen de avatar se descarga y queda almacenada en caché. Cada vez que cambie la URL o el hash, la imagen se volverá a descargar.
-
-      La política debe indicarse como una cadena que expresa la dirección URL y el hash en formato JSON, y según el siguiente esquema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Dirección URL desde la cual se puede descargar la imagen de avatar",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hash SHA-256 de la imagen de avatar",
-            "type": "string"
-          }
-        }
-      }
-
-      Si se configura esta política, <ph name="PRODUCT_OS_NAME" /> descargará y utilizará la imagen de avatar.
-
-      Si configuras esta política, los usuarios no podrán modificarla ni anularla.
-
-      Si no se configura esta política, los usuarios podrán elegir la imagen de avatar que los identifique en la pantalla de acceso.</translation>
 <translation id="9035964157729712237">Identificaciones de extensión para excluir de la lista negra</translation>
 <translation id="9038058011835642205">Especifica una lista de sitios web instalados de manera silenciosa, sin interacción del usuario y que este no puede desinstalar ni inhabilitar.
 
@@ -4260,7 +4123,6 @@
       Si configuras esta política, los usuarios no podrán modificarla ni anularla.
 
       El valor de la política debe especificarse en milisegundos. Los valores están fijados en un intervalo de entre 30 segundos y 24 horas.</translation>
-<translation id="9042911395677044526">Permite aplicar la configuración de red al dispositivo <ph name="PRODUCT_OS_NAME" /> por usuario. La configuración de red es una cadena escrita en formato JSON, como la define el formato Open Network Configuration que se describe en <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="9050853837490399534">Esta política controla si se debe actualizar el dispositivo a una versión de corrección rápida.
 
       Si se establece el valor de esta política en un token que se mapee a una versión de corrección rápida, se actualizará el dispositivo a la versión de corrección rápida correspondiente en caso de que otra política no haya bloqueado la actualización.
@@ -4333,17 +4195,6 @@
       Si se establece como falsa, no aparecerá seleccionada la opción "Encabezados y pies de página" en el cuadro de vista previa de la impresión y el usuario no podrá cambiarla.
 
       Si se establece como verdadera, aparecerá seleccionada la opción "Encabezados y pies de página" en el cuadro de vista previa de la impresión y el usuario no podrá cambiarla.</translation>
-<translation id="9213347477683611358">Si aún ningún usuario accedió a su cuenta en el dispositivo, configura una imagen de fondo de pantalla en el dispositivo que se muestre en la pantalla de acceso. Para establecer la política, especifica la URL correspondiente a la imagen de fondo de pantalla para que el dispositivo con el Sistema operativo Chrome pueda descargarla y un hash criptográfico para verificar la integridad de la descarga. La imagen debe estar en formato JPEG y el tamaño no debe superar los 16 MB. El acceso a la URL no debe requerir autenticación. La imagen de fondo de pantalla se descarga y almacena en caché. Si la URL o el hash cambian, la imagen se volverá a descargar.
-
-      La política debe especificarse como una string que contenga la URL y el hash en formato JSON, p. ej.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Si se establece la política de fondo de pantalla del dispositivo, el dispositivo con el Sistema operativo Chrome descargará y usará la imagen de fondo de pantalla en la pantalla de acceso si aún ningún usuario accedió a su cuenta en el dispositivo. Una vez que el usuario acceda a su cuenta, se habilita la política de fondo de pantalla del usuario.
-
-      Si no se establece la política de fondo de pantalla del dispositivo, la política de fondo de pantalla del usuario, en caso de establecerse, decide lo que se muestra.</translation>
 <translation id="9217154963008402249">Frecuencia de envío de paquetes de red de control</translation>
 <translation id="922540222991413931">Configurar fuentes de instalación de secuencias de comandos de usuario, aplicaciones y extensiones</translation>
 <translation id="924557436754151212">Importar las contraseñas guardadas del navegador predeterminado en la primera ejecución</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 91cc07b..36e001c 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -408,7 +408,6 @@
 
       Advertencia: No se recomienda delegar el control de la versión de <ph name="PRODUCT_OS_NAME" /> a una aplicación de kiosco porque puede evitar que el dispositivo reciba actualizaciones de software y correcciones de seguridad muy importantes. Delegar el control de la versión de <ph name="PRODUCT_OS_NAME" /> podría suponer un riesgo para los usuarios.</translation>
 <translation id="1675002386741412210">Compatible con:</translation>
-<translation id="1689963000958717134">Permite aplicar la configuración de red para todos los usuarios de un dispositivo <ph name="PRODUCT_OS_NAME" />. La configuración de red es una cadena en formato JSON, tal y como se define en la página sobre el formato Open Network Configuration (<ph name="ONC_SPEC_URL" />).</translation>
 <translation id="1704516734140344991">Configura la disponibilidad y el comportamiento de la función de actualización del firmware de <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Los ajustes individuales se pueden especificar en las propiedades de JSON:
@@ -972,16 +971,6 @@
       Si no se habilita esta opción, las páginas web no podrán utilizar JavaScript y los usuarios no podrán cambiar esta configuración.
 
       Si se habilita esta opción o si no se establece, las páginas web podrán utilizar JavaScript y los usuarios podrán modificar esta configuración.</translation>
-<translation id="2747157663401642394">Configura las opciones de gestión de extensiones de <ph name="PRODUCT_NAME" />.
-
-          Esta política controla varias opciones, incluidas las opciones controladas por cualquier política de extensiones. Además, anula cualquier política anterior si se establecen ambas.
-
-          Esta política asigna un ID de extensión o una URL de actualización a su configuración. Si se utiliza un ID de extensión, la configuración solo se aplicará a la extensión especificada. Se puede definir una configuración predeterminada para el ID especial <ph name="DEFAULT_SCOPE" />, que se aplicará a todas las extensiones para las que no se haya definido una configuración personalizada en esta política. Si se utiliza una URL de actualización, la configuración se aplicará a todas las extensiones que incluyan la misma URL de actualización en su archivo de manifiesto, como se indica en <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Para las instancias de Windows que no estén conectadas a un dominio de <ph name="MS_AD_NAME" />, la instalación forzada se limita a las aplicaciones y extensiones que se muestran en Chrome Web Store.
-
-          Para consultar una descripción completa de las posibles opciones y la estructura de esta política, accede a https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Restringe el intervalo de puertos UDP locales utilizado por WebRTC</translation>
 <translation id="2757054304033424106">Tipos de extensiones o aplicaciones que se pueden instalar</translation>
 <translation id="2758084448533744848">Especifica la zona horaria aplicada que se utilizará en el dispositivo. Si se define esta política, los usuarios del dispositivo no podrán cambiar la zona horaria definida. Si se proporciona un valor que no sea válido, esta política seguirá activa utilizando "GMT". Si se proporciona una cadena de texto vacía, la política se ignorará.
@@ -1752,30 +1741,6 @@
       Esta política solo afecta a los usuarios que usen la autenticación con SAML.</translation>
 <translation id="4105989332710272578">No permite que se aplique la Transparencia en Certificados a una lista de URLs</translation>
 <translation id="4121350739760194865">Evitar que las promociones de aplicaciones aparezcan en la página Nueva pestaña</translation>
-<translation id="4125606414556046117">Esta política permite configurar la imagen de fondo de pantalla que se muestra en el escritorio y en la pantalla de inicio de sesión del usuario. La política se establece especificando la URL desde la que <ph name="PRODUCT_OS_NAME" /> puede descargar la imagen de fondo de pantalla y un hash criptográfico que se usa para verificar la integridad de la descarga. La imagen debe estar en formato JPEG y su tamaño no debe superar los 16 MB. Se debe poder acceder a la URL sin autenticación.
-
-      La imagen de fondo de pantalla se descarga y almacena en caché. Se volverá a descargar si se cambian la URL o el hash.
-
-      La política se debe especificar como una cadena que represente la URL y el hash en formato JSON de acuerdo con el siguiente esquema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "La URL desde la que se puede descargar la imagen de fondo de pantalla".,
-            "type": "string"
-          },
-          "hash": {
-            "description": "El hash SHA-256 de la imagen de fondo de pantalla".,
-            "type": "string"
-          }
-        }
-      }
-
-      Si se asigna un valor a esta política, <ph name="PRODUCT_OS_NAME" /> descargará y usará la imagen de fondo de pantalla.
-
-      Además, los usuarios no podrán cambiarla ni anularla.
-
-      Si no se le asigna ninguno, los usuarios podrán elegir una imagen para mostrarla en el escritorio y en el fondo de la pantalla de inicio de sesión.</translation>
 <translation id="412697421478384751">Permitir que los usuarios utilicen un PIN poco seguro para la pantalla de bloqueo</translation>
 <translation id="4138655880188755661">Límite de tiempo</translation>
 <translation id="4144164749344898721">Esta política permite controlar diferentes opciones de configuración de la estrategia de gestión de energía cuando el usuario está inactivo.
@@ -2738,53 +2703,6 @@
 
       Si esta política no se establece o se establece en falsa, los comandos de impresión muestran la pantalla de vista previa de impresión.</translation>
 <translation id="6022948604095165524">Acción al iniciar</translation>
-<translation id="6023030044732320798">Especifica las políticas que se enviarán al tiempo de ejecución ARC. Se debe usar un valor JSON válido.
-
-      Esta política se puede utilizar para configurar qué aplicaciones de Android se instalan automáticamente en el dispositivo:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identificador de aplicaciones de Android, p. ej., "com.google.android.gm" en el caso de Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Especifica cómo se instala una aplicación. OPTIONAL: la aplicación no se instala automáticamente, pero el usuario puede instalarla. Es la opción predeterminada si no se especifica esta política. PRELOAD: la aplicación se instala automáticamente, pero el usuario puede desinstalarla. FORCE_INSTALLED: la aplicación se instala automáticamente y el usuario no puede desinstalarla. BLOCKED: la aplicación está bloqueada y no se puede instalar. Si la aplicación se ha instalado con una política anterior, se desinstalará.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Política para conceder solicitudes de permisos a las aplicaciones. PERMISSION_POLICY_UNSPECIFIED: la política no se ha especificado. Si no se asigna una política específica a un permiso a cualquier nivel, se utiliza el comportamiento 'PROMPT' de forma predeterminada. PROMPT: pide al usuario que conceda un permiso. GRANT: se concede automáticamente un permiso. DENY: se deniega automáticamente un permiso.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Objeto de configuración JSON específico de la aplicación con un conjunto de pares clave/valor, p. ej., "managedConfiguration". { "key1": value1, "key2": value2 }'. Las claves se definen en el archivo de manifiesto de la aplicación.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Para fijar aplicaciones en el menú, consulta la política PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL de función Instant del proveedor de búsquedas predeterminadas</translation>
 <translation id="603410445099326293">Parámetros para URL sugerida que utiliza POST</translation>
 <translation id="6034341625190551415">Controla los tipos de cuenta de sesión pública y de kiosko.</translation>
@@ -3138,37 +3056,6 @@
       Si se le asigna el valor "False", no se utilizará el cliente DNS integrado.
 
       Si no se define esta política, el cliente DNS integrado estará habilitado de forma predeterminada en MacOS, Android (si no se ha habilitado un DNS privado o una VPN) y Chrome OS, y los usuarios podrán especificar si se utiliza el cliente DNS integrado editando chrome://flags o especificando un indicador de línea de comandos.</translation>
-<translation id="6838056959556423778">Anula las reglas para seleccionar la impresora predeterminada de <ph name="PRODUCT_NAME" />.
-
-      Esta política determina las reglas para seleccionar la impresora predeterminada en <ph name="PRODUCT_NAME" />. Esto ocurre la primera vez que se utiliza la función de imprimir con un perfil.
-
-      Si se habilita esta política, <ph name="PRODUCT_NAME" /> intentará encontrar una impresora con todos los atributos especificados y la seleccionará como impresora predeterminada. Se seleccionará la primera impresora detectada cuyas características coincidan con la política. Si coincide más de una impresora, puedes seleccionar cualquiera de ellas en función del orden en el que se detecten.
-
-      Si no se habilita esta política o no se encuentra ninguna impresora que coincida durante el tiempo de espera, se utilizará la impresora de PDF integrada de forma predeterminada o no seleccionará ninguna impresora si la impresora de PDF no está disponible.
-
-      El valor se analiza como objeto JSON, de acuerdo con el siguiente esquema:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Decide si se limita la búsqueda de impresoras a un conjunto específico de impresoras.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Expresión regular con la que debe coincidir el ID de la impresora.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Expresión regular con la que debe coincidir el nombre visible de la impresora.",
-            "type": "string"
-          }
-        }
-      }
-
-      Las impresoras conectadas a <ph name="CLOUD_PRINT_NAME" /> se consideran <ph name="PRINTER_TYPE_CLOUD" />, y el resto de las impresoras se clasifican como  <ph name="PRINTER_TYPE_LOCAL" />.
-      La omisión de algún campo significa que todos los valores coinciden. Por ejemplo, si no se especifica la conectividad, la vista previa de impresión buscará todo tipo de impresoras, tanto locales como en la nube.
-      Los patrones de expresión regular deben seguir la sintaxis JavaScript RegExp y las coincidencias distinguen entre mayúsculas y minúsculas.</translation>
 <translation id="6843296367238757293">Esta política está obsoleta. Te recomendamos que no la utilices. Consulta https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Esta política se retiró en <ph name="PRODUCT_NAME" /> 68 y se ha sustituido por <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Esta política está obsoleta y se ha quitado de M66, ya que solo se utilizaba para realizar pruebas internas y es un requisito de seguridad.
@@ -4324,30 +4211,6 @@
       Esta política solo afecta a los usuarios autenticados a través de SAML.
 
       El valor de la política se debe especificar en segundos.</translation>
-<translation id="9027787254195333560">Esta política permite configurar la imagen del avatar que representa al usuario en la pantalla de inicio de sesión. La política se establece especificando la URL desde la que <ph name="PRODUCT_OS_NAME" /> puede descargar la imagen del avatar y un hash criptográfico que se utiliza para verificar la integridad de la descarga. La imagen debe tener formato JPEG y un tamaño no superior a 512 KB. Se debe poder acceder a la URL sin autenticación.
-
-      La imagen del avatar se descarga y se almacena en caché. Se volverá a descargar si se cambian la URL o el hash.
-
-      La política se debe especificar como una cadena que represente la URL y el hash en formato JSON de acuerdo con el siguiente esquema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "La URL desde la que se puede descargar la imagen del avatar".,
-            "type": "string"
-          },
-          "hash": {
-            "description": "El hash SHA-256 de la imagen del avatar".,
-            "type": "string"
-          }
-        }
-      }
-
-      Si se asigna un valor a esta política, <ph name="PRODUCT_OS_NAME" /> descargará y usará la imagen del avatar.
-
-      Además, los usuarios no podrán cambiarla ni anularla.
-
-      Si no se asigna ningún valor a esta política, el usuario podrá elegir la imagen del avatar que le representará en la pantalla de inicio de sesión.</translation>
 <translation id="9035964157729712237">ID de extensiones que no deben estar incluidas en la lista negra</translation>
 <translation id="9038058011835642205">Permite especificar una lista de sitios web que se instalan de forma automática sin la intervención del usuario, que no podrá desinstalarlos ni inhabilitarlos.
 
@@ -4360,7 +4223,6 @@
       Si asignas un valor a esta política, los usuarios no podrán cambiarla ni anularla.
 
       El valor de esta política debe estar especificado en milisegundos. Los valores están fijados en un intervalo que comprendido entre 30 segundos y 24 horas.</translation>
-<translation id="9042911395677044526">Permite aplicar la configuración de red al dispositivo <ph name="PRODUCT_OS_NAME" /> de cada usuario. La configuración de red es una cadena escrita en formato JSON, tal como se define en la siguiente página sobre el formato Open Network Configuration: <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Esta política determina si es necesario o no que el dispositivo se actualice a una versión Quick Fix.
 
       Si el valor de la política se establece en un token que se asocia a una versión Quick Fix, el dispositivo se actualizará a la versión Quick Fix correspondiente, a no ser que otra política bloquee la actualización.
@@ -4439,17 +4301,6 @@
       Si se le asigna el valor "False", la opción "Encabezado y pie de página" estará desmarcada en el cuadro de diálogo de la vista previa de impresión y los usuarios no podrán cambiarla.
 
       Si se le asigna el valor "True", la opción "Encabezado y pie de página" estará marcada en el cuadro de diálogo de la vista previa de impresión y los usuarios podrán cambiarla.</translation>
-<translation id="9213347477683611358">Permite configurar la imagen de fondo de pantalla del dispositivo que se muestra en la pantalla de inicio de sesión si ningún usuario ha iniciado sesión en el dispositivo. La política se define especificando la URL desde la que el dispositivo Chrome OS puede descargar la imagen de fondo de pantalla y un hash criptográfico que se utiliza para verificar la integridad de la descarga. La imagen debe tener formato JPEG y un tamaño no superior a 16 MB. Se debe poder acceder a la URL sin autenticación. La imagen de fondo de pantalla se descarga, se almacena en caché y se vuelve a descargar cada vez que se produce un cambio en la URL o en el hash.
-
-      La política se debe especificar como una cadena que represente la URL y el hash en formato JSON, p.ej.,
-      {
-        "url": "https://example.com/fondo_dispositivo.jpg",
-        "hash": "ejemplodehashdefondo"
-      }
-
-      Si se establece la política de fondo de pantalla del dispositivo, el dispositivo Chrome OS descargará y utilizará la imagen de fondo de pantalla en la pantalla de inicio de sesión si ningún usuario ha iniciado sesión en el dispositivo. Una vez que el usuario inicie sesión, se aplicará la política de fondo de pantalla del usuario.
-
-      Si no se establece la política de fondo de pantalla del dispositivo y está definida la política de fondo de pantalla del usuario, esta es la que decide qué contenido mostrar.</translation>
 <translation id="9217154963008402249">Frecuencia de los paquetes de red de supervisión</translation>
 <translation id="922540222991413931">Configurar fuentes de instalación de secuencias de comandos de usuario, aplicaciones y extensiones</translation>
 <translation id="924557436754151212">Importar las contraseñas guardadas desde el navegador predeterminado en la primera ejecución</translation>
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index 62d502a..c7aea15 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -420,7 +420,6 @@
 
       Hoiatus. Operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> versiooni juhtimist ei ole soovitatav üle anda kioskirakendusele, kuna see võib takistada seadmel tarkvaravärskendusi ja kriitilisi turvapaikasid vastu võtmast. Operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> versiooni juhtimise üleandmine võib kasutajad ohtu seada.</translation>
 <translation id="1675002386741412210">Toetatud:</translation>
-<translation id="1689963000958717134">Võimaldab jõustada võrgu konfigureerimise kõigile <ph name="PRODUCT_OS_NAME" /> seadme kasutajatele. Võrgu konfigureerimine on JSON-i vormingus string, mille määrab aadressil <ph name="ONC_SPEC_URL" /> kirjeldatud vorming Open Network Configuration</translation>
 <translation id="1704516734140344991">Seadistab rakenduse <ph name="TPM_FIRMWARE_UPDATE_TPM" /> püsivaravärskenduse funktsiooni saadavaloleku ja käitumise.
 
       JSON-i atribuutides saab määrata üksikud seaded.
@@ -982,16 +981,6 @@
       Kui see seade keelatakse, ei saa veebilehed JavaScripti kasutada ja kasutaja ei saa seda seadet muuta.
 
       Kui see seade on lubatud või määramata, saavad veebilehed JavaScripti kasutada, kuid kasutajad saavad seda seadet muuta.</translation>
-<translation id="2747157663401642394">Seadistab rakenduse <ph name="PRODUCT_NAME" /> laienduste haldamise seaded.
-
-          Reegel juhib mitut seadet, sealhulgas seadeid, mida juhivad olemasolevad laiendustega seotud reeglid. Reegel alistab kõik pärandreeglid, kui mõlemad on määratud.
-
-          Reegel vastendab laienduse ID või värskenduse URL-i seadistusega. Laienduse ID-ga rakendatakse seadistus ainult määratud laiendusele. Spetsiaalse ID <ph name="DEFAULT_SCOPE" /> jaoks saab määrata vaikeseadistuse, mis kehtib kõikide laienduste puhul, millele ei ole reeglis määratud kohandatud seadistust. Värskenduse URL-iga rakendatakse seadistus kõikidele laiendustele, mille täpne värskenduse URL on märgitud laienduse manifesti, nagu on kirjeldatud jaotises <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Windowsi eksemplaride puhul, mis ei ole ühendatud domeeniga <ph name="MS_AD_NAME" />, saab sundinstallida vaid Chrome’i veebipoes olevaid rakendusi ja laiendusi.
-
-          Vaadake reegli võimalike seadete ja struktuuri täielikku kirjeldust: https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">WebRTC kasutatavate kohalike UDP-portide vahemiku piiramine</translation>
 <translation id="2757054304033424106">Laienduste/rakenduste tüübid, mille installimine on lubatud</translation>
 <translation id="2758084448533744848">Määrab jõustatud ajavööndi, mida seadmes kasutada. Kui see reegel on määratud, ei saa seadme kasutajad määratud ajavööndit alistada. Kui esitatakse kehtetu väärtus, siis aktiveeritakse reegel selle asemel siiski väärtusega „GMT”. Kui esitatakse tühi string, siis reeglit eiratakse.
@@ -1702,7 +1691,7 @@
 
           Pange tähele, et arendaja tööriistadega saavad kasutajad muuta iga laienduse lähtekoodi (mis võib põhjustada laienduse väärtalitlust). Kui see on probleem, tuleb määrata reegel <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
 
-          Reegli iga loendiüksus on string, mis sisaldab laienduse ID-d ja „värskenduse” URL-i, mis on eraldatud semikooloniga (<ph name="SEMICOLON" />). Laienduse ID on 32-täheline string, mis kuvatakse näiteks arendajarežiimis aadressil <ph name="CHROME_EXTENSIONS_LINK" />. Värskenduse URL peab viitama XML-dokumendi värskendusmanifestile, nagu on kirjeldatud jaotises<ph name="LINK_TO_EXTENSION_DOC1" />. Vaikimisi kasutatakse Chrome'i veebipoe värskenduse URL-i (praegu „https://clients2.google.com/service/update2/crx”). Pange tähele, et reeglis määratud värskenduse URL-i kasutatakse vaid algsel installimisel ja laienduse tulevased värskendused kasutavad laienduse manifestis märgitud värskenduse URL-i. Samuti pange tähele, et selgesõnalise värskenduse URL-i määramine oli kuni rakenduse <ph name="PRODUCT_NAME" /> 67. versioonini kohustuslik.
+          Reegli iga loendiüksus on string, mis sisaldab laienduse ID-d ja „värskenduse” URL-i, mis on eraldatud semikooloniga (<ph name="SEMICOLON" />). Laienduse ID on 32-täheline string, mis kuvatakse näiteks arendajarežiimis aadressil <ph name="CHROME_EXTENSIONS_LINK" />. Värskenduse URL peab viitama XML-dokumendi värskendusmanifestile, nagu on kirjeldatud jaotises <ph name="LINK_TO_EXTENSION_DOC1" />. Vaikimisi kasutatakse Chrome'i veebipoe värskenduse URL-i (praegu „https://clients2.google.com/service/update2/crx”). Pange tähele, et reeglis määratud värskenduse URL-i kasutatakse vaid algsel installimisel ja laienduse tulevased värskendused kasutavad laienduse manifestis märgitud värskenduse URL-i. Samuti pange tähele, et selgesõnalise värskenduse URL-i määramine oli kuni rakenduse <ph name="PRODUCT_NAME" /> 67. versioonini kohustuslik.
 
           Näiteks reegel <ph name="EXTENSION_POLICY_EXAMPLE" /> installib laienduse ID-ga <ph name="EXTENSION_ID_SAMPLE" /> standardselt Chrome'i veebipoe värskenduse URL-ilt. Lisateavet laienduste hostimise kohta leiate siit: <ph name="LINK_TO_EXTENSION_DOC2" />.
 
@@ -1758,30 +1747,6 @@
       Reegel mõjutab ainult kasutajaid, kes kasutavad autentimiseks SAML-i.</translation>
 <translation id="4105989332710272578">Sertifikaadi läbipaistvuse jõustamise keelamine URL-ide loendi jaoks</translation>
 <translation id="4121350739760194865">Rakenduste reklaamide ilmumise takistamine uuel vahelehel</translation>
-<translation id="4125606414556046117">Reegel võimaldab seadistada taustapildi, mis kuvatakse kasutaja töölaual ja sisselogimisekraani taustal. Reegli seadistamiseks määrake URL, millelt <ph name="PRODUCT_OS_NAME" /> saab alla laadida taustapildi ja allalaaditava sisu terviklikkuse kinnitamiseks kasutatava krüptograafilise räsi. Pilt peab olema JPEG-vormingus ja faili maht ei tohi olla suurem kui 16 MB. URL peab olema juurdepääsetav autentimiseta.
-
-      Taustapilt laaditakse alla ja talletatakse vahemällu. URL-i või räsi muutumisel laaditakse pilt uuesti alla.
-
-      Reegel tuleb määrata stringina, mis esitab URL-i ja räsi JSON-vormingus järgmise skeemi alusel.
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": „URL, millelt laaditakse alla taustapilt.”,
-            "type": "string"
-          },
-          "hash": {
-            "description": „Taustapildi SHA-256 räsi.”,
-            "type": "string"
-          }
-        }
-      }
-
-      Kui reegel on määratud, laadib <ph name="PRODUCT_OS_NAME" /> alla taustapildi ja kasutab seda.
-
-      Kui määrate reegli, ei saa kasutajad seda muuta ega alistada.
-
-      Kui jätate reegli määramata, saab kasutaja valida töölaual ja sisselogimisekraani taustal kuvatava pildi.</translation>
 <translation id="412697421478384751">Nõrkade lukustuskuva PIN-koodide määramise lubamine</translation>
 <translation id="4138655880188755661">Ajapiirang</translation>
 <translation id="4144164749344898721">See reegel juhib mitut seadet, mis reguleerivad toitehalduse strateegiat kasutaja tegevusetuse ajal.
@@ -2740,53 +2705,6 @@
 
       Kui reegel on määramata või keelatud, ilmub printimiskäsu sisestamisel printimise eelvaate kuva.</translation>
 <translation id="6022948604095165524">Toiming käivitamisel</translation>
-<translation id="6023030044732320798">Määrab reeglite kogumi, mis edastatakse ARC käitusajale. Väärtus peab olema sobiv JSON.
-
-      Selle reegli abil saab seadistada, millised Androidi rakendused automaatselt seadmesse installitakse:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Androidi rakenduse identifikaator, nt „com.google.android.gm” Gmaili puhul",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Määrab, kuidas rakendus installitakse. OPTIONAL: rakendust ei installita automaatselt, kuid kasutaja saab selle installida. Kui seda reeglit ei määrata, on see vaikeseade. PRELOAD: rakendus installitakse automaatselt, kuid kasutaja saab selle desinstallida. FORCE_INSTALLED: rakendus installitakse automaatselt ja kasutaja ei saa seda desinstallida. BLOCKED: rakendus on blokeeritud ja seda ei saa installida. Kui rakendus installiti eelmise reegli põhjal, siis see desinstallitakse.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Reegel rakendustele lubade taotluste andmiseks. PERMISSION_POLICY_UNSPECIFIED: reeglit pole määratud. Kui loa jaoks pole reeglit määratud mitte ühelgi tasemel, kasutatakse vaikimisi käitumist `PROMPT`. PROMPT: kasutajal palutakse luba anda. GRANT: luba antakse automaatselt. DENY: luba keelatakse automaatselt.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Rakendusepõhine JSON-i konfiguratsiooniobjekt, millel on komplekt võtmeväärtuse paare, nt '"managedConfiguration": { "key1": value1, "key2": value2 }'. Võtmed määratakse rakenduse manifestis.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Rakenduste kinnitamiseks käivitusprogrammi vaadake reeglit PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Vaikeotsingupakkuja Instant-URL</translation>
 <translation id="603410445099326293">Parameetrid POST-meetodit kasutava soovituse URL-i jaoks</translation>
 <translation id="6034341625190551415">Haldab avalikku seanssi ja kioski kontotüüpe.</translation>
@@ -3139,38 +3057,6 @@
       Kui reegel on keelatud, siis ei kasutata sisseehitatud DNS-i klienti kunagi.
 
       Kui reegel on määramata, on sisseehitatud DNS-i klient MacOS-is, Androidis (kui nii privaatne DNS kui ka VPN ei ole lubatud) ja ChromeOS-is vaikimisi lubatud ning kasutajad saavad otsustada, kas rakendus kasutab sisseehitatud DNS-i klienti, muutes atribuuti chrome://flags või määrates käsurea lipu.</translation>
-<translation id="6838056959556423778">Alistatakse rakenduse <ph name="PRODUCT_NAME" /> vaikeprinteri valimise reeglid.
-
-      Selle reegliga määratakse reeglid rakenduses <ph name="PRODUCT_NAME" /> vaikeprinteri valimiseks, mis toimub esimesel korral, kui profiilil printimisfunktsiooni kasutatakse.
-
-      Kui reegel on määratud, üritab rakendus <ph name="PRODUCT_NAME" /> leida printeri, mis vastab kõigile määratud atribuutidele, ja valib selle vaikeprinteriks. Valitakse esimene printer, mis reeglitele vastab. Kui reeglitele vastavaid printereid on mitu, saab nende avastamise järjekorrast olenevalt valida mis tahes sobiva printeri.
-
-      Kui seda reeglit ei määrata või määratud aja jooksul ei leita reeglitele vastavat printerit, määratakse vaikimisi printeriks sisseehitatud PDF-printer. Kui PDF-printer pole saadaval, siis printerit ei valita.
-
-      Väärtus sõelutakse JSON-objektina, mis vastab järgmisele skeemile:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Kas piirata sobiva printeri otsing konkreetse printerite komplektiga?",
-            "type": {
-              "enum": [ "local", "cloud" ]
-            }
-          },
-          "idPattern": {
-            "description": "Regulaaravaldis, mis ühtib printeri ID-ga.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regulaaravaldis, mis ühtib printeri kuvatava nimega.",
-            "type": "string"
-          }
-        }
-      }
-
-      Rakendusega <ph name="CLOUD_PRINT_NAME" /> ühendatud printerid loetakse gruppi <ph name="PRINTER_TYPE_CLOUD" /> kuuluvateks, ülejäänud printerid kuuluvad gruppi <ph name="PRINTER_TYPE_LOCAL" />.
-      Välja vahelejätmine tähendab, et kõik väärtused ühtivad. Näiteks kui ühenduvust ei määrata, käivitab printimise eelvaade igat tüüpi printerite (nii kohalike kui ka pilvepõhiste printerite) otsimise.
-      Regulaaravaldise mustrid peavad järgima atribuudi JavaScript RegExp süntaksit ja vasted on tõstutundlikud.</translation>
 <translation id="6843296367238757293">Selle reegli tugi on katkestatud. Seda ei ole soovitatav kasutada Vaadake lisateavet aadressilt https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Reegel eemaldati operatsioonisüsteemist <ph name="PRODUCT_NAME" /> 68 ja see asendati reegliga <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Selle reegli tugi on katkestatud ja see on versioonist M66 eemaldatud, kuna seda kasutati ainult sisetestides ja see sisaldab turvaauku.
@@ -4344,30 +4230,6 @@
       See reegel mõjutab ainult neid kasutajad, kes kasutavad autentimiseks SAML-i.
 
       Reegli väärtus tuleb määrata sekundites.</translation>
-<translation id="9027787254195333560">Selle reegliga saate seadistada avatari pildi, mis kujutab kasutajat sisselogimisekraanil. Reegli seadistamiseks määrake URL, kust <ph name="PRODUCT_OS_NAME" /> saab alla laadida avatari pildi, ja krüptograafiline räsiväärtus, mida kasutatakse allalaadimise terviklikkuse kinnitamiseks. Pilt peab olema JPEG-vormingus, mille maksimaalne maht on 512 kB. URL peab olema juurdepääsetav autentimiseta.
-
-      Avatari pilt laaditakse alla ja talletatakse vahemällu. URL-i või räsi muutumisel laaditakse pilt uuesti alla.
-
-      Reegel tuleb määrata stringina, mis esitab URL-i ja räsi JSON-vormingus järgmise skeemi alusel.
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": „URL, millelt laaditakse alla avatari pilt.”,
-            "type": "string"
-          },
-          "hash": {
-            "description": „Avatari pildi SHA-256 räsi.”,
-            "type": "string"
-          }
-        }
-      }
-
-      Kui reegel on määratud, laadib <ph name="PRODUCT_OS_NAME" /> alla avatari pildi ja kasutab seda.
-
-      Kui määrate reegli, ei saa kasutajad seda muuta ega alistada.
-
-      Kui jätate reegli määramata, saab kasutaja valida avatari pildi, mis neid sisselogimiskuval kujutab.</translation>
 <translation id="9035964157729712237">Mustast nimekirjast välistatud laienduste ID-d</translation>
 <translation id="9038058011835642205">Määrab loendi veebisaitidest, mis installitakse märkamatult, ilma et kasutaja peaks sekkuma, ning mida kasutaja ei saa desinstallida ega keelata.
 
@@ -4380,7 +4242,6 @@
       Kui määrate reegli, ei saa kasutajad seda muuta ega alistada.
 
       Reegli väärtus tuleb määrata millisekundites. Väärtus peab olema vahemikus 30 sekundit kuni 24 tundi.</translation>
-<translation id="9042911395677044526">Võimaldab võrguseadistuse kasutajapõhiselt teenuse <ph name="PRODUCT_OS_NAME" /> seadmes jõustada. Võrguseadistus on JSON-i vormingus string, mille määratleb Open Network Configuration vorming, mida kirjeldatakse aadressil <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">See reegel juhib, kas seadme peaks kiirparanduse järgule värskendama või mitte.
 
       Kui reegli väärtuseks määratakse märk, mis suunab kiirparanduse järgule, värskendatakse seade vastavale kiirparanduse järgule, kui mõni teine reegel värskendust ei blokeeri.
@@ -4460,17 +4321,6 @@
       Kui reegel on seatud väärtusele Väär, ei ole seade „Päised ja jalused” printimise eelvaate dialoogis valitud ja kasutaja ei saa seda muuta.
 
       Kui reegel on seatud väärtusele Tõene, on seade „Päised ja jalused” printimise eelvaate dialoogis valitud ja kasutaja ei saa seda muuta.</translation>
-<translation id="9213347477683611358">Seadistage seadmetasemel taustapildi kujutis, mis kuvatakse sisselogimisekraanil, kui ükski kasutaja pole veel seadmesse sisse loginud. Selle reegli määramiseks tuleb määrata URL, kust Chrome OS-i seade saab alla laadida taustapildi kujutise ja krüptograafilise räsiväärtuse, mida kasutatakse allalaadimise terviklikkuse kontrollimiseks. Kujutis peab olema JPEG-vormingus ja faili suurus ei tohi ületada 16 MB. URL peab olema autentimiseta juurdepääsetav. Taustapildi kujutis laaditakse alla ja salvestatakse vahemällu. See laaditakse uuesti alla iga kord, kui URL või räsiväärtus muutub.
-
-      Reegel tuleks määrata stringina, mis näitab URL-i ja räsiväärtust JSON-vormingus, nt
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Kui seadme taustapildi reegel on määratud, laadib Chrome OS-i seade taustapildi kujutise alla ja kasutab seda sisselogimisekraanil, kui ükski kasutaja pole veel seadmesse sisse loginud. Kui kasutaja sisse logib, rakendatakse kasutaja taustapildi reeglit.
-
-      Kui seadme taustapildi reegel on määramata, otsustab kasutaja taustapildi reegel, mida näidata, kui kasutaja taustapildi reegel on määratud.</translation>
 <translation id="9217154963008402249">Võrgupakettide jälgimise sagedus</translation>
 <translation id="922540222991413931">Seadistage laienduste, rakenduste ja kasutaja skriptide installimise allikad</translation>
 <translation id="924557436754151212">Impordi salvestatud paroolid vaikebrauserist esimesel käitamisel</translation>
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index e3a419be..4b8fa65 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -406,7 +406,6 @@
 
       هشدار: توصیه نمی‌شود کنترل نسخه <ph name="PRODUCT_OS_NAME" /> به برنامه kiosk محول شود زیرا ممکن است باعث شود دستگاه نتواند به‌روزرسانی‌های نرم‌افزار و رفع اشکالات مهم امنیتی را دریافت کند. محول کردن کنترل نسخه <ph name="PRODUCT_OS_NAME" /> می‌تواند کاربران را در معرض خطر قرار دهد.</translation>
 <translation id="1675002386741412210">پشتیبانی شده در تاریخ:</translation>
-<translation id="1689963000958717134">‏اجازه می‌دهد پیکربندی شبکه ارسال داده برای همه کاربران یک دستگاه <ph name="PRODUCT_OS_NAME" /> اعمال شود. پیکربندی شبکه یک رشته با قالب JSON است، به صورتی که توسط قالب پیکربندی شبکه باز در <ph name="ONC_SPEC_URL" /> توضیح داده شده است.</translation>
 <translation id="1704516734140344991">‏دردسترس بودن و رفتار عملکرد به‌روزرسانی سفت‌افزار <ph name="TPM_FIRMWARE_UPDATE_TPM" /> را پیکربندی می‌کند.
 
       تنظیمات جداگانه را می‌توان در ویژگی‌های JSON مشخص کرد:
@@ -944,16 +943,6 @@
  اگر این تنظیمات غیرفعال باشد، صفحات وب نمی‌توانند از جاوااسکریپت استفاده کنند و کاربر نمی‌تواند تنظیمات را تغییر دهد.
 
  اگر این تنظیمات فعال باشد یا تنظیم نشده باشد، صفحات وب می‌توانند از جاوااسکریپت استفاده کنند ولی کاربر می‌تواند آن تنظیمات را تغییر دهد.</translation>
-<translation id="2747157663401642394">‏تنظیمات مدیریت افزونه را برای <ph name="PRODUCT_NAME" /> پیکربندی می‌کند.
-
-          این خط‌مشی چند تنظیم را کنترل می‌کند، ازجمله تنظیماتی که با هر خط‌مشی موجود مربوط با افزونه کنترل می‌شود. اگر این خط‌مشی تنظیم شود، هر خط‌مشی‌ قدیمی‌ تنظیم‌شده‌ای لغو می‌شود.
-
-          این خط‌مشی شناسه افزونه یا نشانی وب به‌روزرسانی‌ای را در پیکربندی‌اش نگاشت می‌کند. با شناسه افزونه، پیکربندی فقط روی افزونه مشخص‌شده اعمال می‌شود. پیکربندی پیش‌فرض می‌تواند برای شناسه خاص <ph name="DEFAULT_SCOPE" /> تنظیم شود که روی همه افزونه‌هایی که پیکربندی سفارشی‌ای برای آن‌ها در این خط‌مشی تنظیم نشده باشد، اعمال شود. با نشانی وب به‌روزرسانی، پیکربندی روی همه افزونه‌های دارای نشانی وب به‌روزرسانی که دقیقاً در مانیفست این افزونه بیان شده است، به‌صورت توصیف‌شده در <ph name="LINK_TO_EXTENSION_DOC1" />، اعمال می‌شود.
-
-          برای نمونه‌های Windows که به دامنه <ph name="MS_AD_NAME" /> نپیوسته‌اند، نصب اجباری به برنامه‌ها و افزونه‌های فهرست‌شده در «نت‌بازار Chrome» محدود می‌شود.
-
-          برای شرح کامل تنظیمات ممکن و ساختار این خط‌مشی، لطفاً به این نشانی بروید: https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">‏محدود کردن دامنه درگاه‌های UDP محلی مورداستفاده WebRTC</translation>
 <translation id="2757054304033424106">انواع فایل افزودنی/ برنامه‌هایی که مجاز به نصب هستند</translation>
 <translation id="2758084448533744848">‏منطقه زمانی اجباری را برای استفاده در دستگاه مشخص می‌کند. وقتی این خط‌مشی تنظیم شود، کاربران دستگاه نمی‌توانند منطقه زمانی مشخص‌شده را لغو کنند. اگر مقدار نامعتبری تنظیم شود، خط‌مشی همچنان فعال باقی می‌ماند و از «GMT» به‌جای مقدار نامعتبر استفاده می‌کند. اگر رشته خالی تنظیم شود، خط‌مشی نادیده گرفته می‌شود.
@@ -1710,30 +1699,6 @@
       این خط‌مشی فقط کاربرانی را تحت‌تأثیر قرار می‌دهد که بااستفاده از SAML احراز هویت می‌شوند.</translation>
 <translation id="4105989332710272578">غیرفعال‌سازی اجرای شفافیت گواهینامه برای فهرستی از نشانی‌های وب</translation>
 <translation id="4121350739760194865">مانع از نمایش تبلیغات برنامه در صفحه برگهٔ جدید می‌شود</translation>
-<translation id="4125606414556046117">‏این خط‌مشی به شما اجازه می‌دهد تصویر کاغذدیواری را که در میز کار و در پس‌زمینه صفحه ورود به سیستم برای کاربر نشان داده می‌شود پیکربندی کنید. این خط‌مشی با مشخص کردن نشانی وبی که <ph name="PRODUCT_OS_NAME" /> می‌تواند تصویر کاغذدیواری را از آن بارگیری کند و درهم‌سازی رمزگذاری موردِاستفاده برای به‌تأیید رساندن یکپارچگی بارگیری، تنظیم می‌شود. تصویر باید در قالب JPEG باشد، اندازه فایل آن نباید بیشتر از ۱۶ مگابایت باشد. نشانی وب باید بدون احراز هویت قابل دسترسی باشد.
-
-      تصویر کاغذدیواری بارگیری و در حافظه پنهان ذخیره می‌شود. هرگاه نشانی وب یا درهم‌سازی تغییر کند، دوباره بارگیری خواهد شد.
-
-      این خط‌مشی باید به‌عنوان رشته‌ای که نشانی وب را بیان می‌کند و درهم‌سازی در قالب JSON و مطابق با طرح زیر مشخص شود:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "نشانی وبی که تصویر کاغذدیواری را از آن می‌توان بارگیری کرد."،
-            "type": "string"
-          },
-          "hash": {
-            "description": "درهم‌سازی SHA-256 تصویر کاغذدیواری."،
-            "type": "string"
-          }
-        }
-      }
-
-      اگر این خط‌مشی تنظیم شود، <ph name="PRODUCT_OS_NAME" /> تصویر کاغذدیواری را بارگیری و استفاده می‌کند.
-
-      اگر این خط‌مشی را تنظیم کنید، کاربران نمی‌توانند آن را تغییر دهند یا لغو کنند.
-
-      اگر این خط‌مشی تنظیم نشود، کاربر می‌تواند تصویری را انتخاب کند که در میز کار و در پس‌زمینه صفحه ورود به سیستم نشان داده می‌شود.</translation>
 <translation id="412697421478384751">امکان دادن به کاربران برای تنظیم پین‌های ضعیف برای پین صفحه درحالت قفل</translation>
 <translation id="4138655880188755661">محدودیت زمانی</translation>
 <translation id="4144164749344898721">‏این خط‌مشی چند تنظیم را برای راهبرد مدیریت نیرو هنگام عدم‌فعالیت کاربر کنترل می‌کند.
@@ -2650,55 +2615,6 @@
 
       اگر این خط‌مشی تنظیم نشده باشد یا اشتباه تنظیم شده باشد، دستورهای چاپ صفحه پیش‌نمایش چاپ را فعال می‌کنند.</translation>
 <translation id="6022948604095165524">عملکرد در هنگام راه‌اندازی</translation>
-<translation id="6023030044732320798">‏مجموعه‌ای از خط‌مشی‌ها را مشخص می‌کند که در زمان اجرای ARC ارائه خواهند شد. مقدار باید JSON معتبر باشد. 
-
-      این خط‌مشی می‌تواند برای پیکربندی اینکه کدام برنامه‌های Android به‌طور خودکار در دستگاه نصب شوند استفاده شود.
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "شناسه برنامه Android، برای نمونه «com.google.android.gm» برای «Gmail»،
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "نحوه نصب برنامه را مشخص می‌کند. 
-OPTIONAL: برنامه به‌طور خودکار نصب نشده است اما کاربر می‌تواند آن را نصب کند. اگر این خط‌مشی تعیین نشده باشد، این گزینه پیش‌تنظیم است. 
-PRELOAD: برنامه به‌طور خودکار نصب شده است اما کاربر می‌تواند آن را حذف نصب کند. FORCE_INSTALLED: برنامه به‌طور خودکار نصب شده است و کاربر نمی‌تواند آن را حذف نصب کند. BLOCKED: برنامه مسدود شده است و نمی‌تواند نصب شود. اگر برنامه طبق خط‌مشی قبلی نصب شده باشد، حذف نصب خواهد شد.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "خط‌مشی برای اعطای مجوز درخواست‌ها به برنامه‌ها. PERMISSION_POLICY_UNSPECIFIED: خط‌مشی مشخص نشده است. اگر هیچ خط‌مشی‌ای در هیچ سطحی برای مجوز مشخص نشده باشد، به‌طور پیش‌فرض از رفتار «PROMPT» استفاده می‌شود. PROMPT: کاربر را تشویق به اعطای مجوز می‌کند. GRANT: به‌طور خودکار مجوز اعطا می‌کند. DENY: به‌طور خودکار مجوز را رد می‌کند.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "موضوع پیکربندی JSON مخصوص برنامه با مجموعه‌ای از جفت مقادیر کلیدی، برای نمونه «"managedConfiguration": { "key1": value1, "key2": value2 }». کلیدها در مانیفست برنامه تعریف شده‌اند.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      برای پین کردن برنامه‌ها به راه‌انداز، PinnedLauncherApps را ببینید.</translation>
 <translation id="602728333950205286">‏URL جستجوی آنی برای ارائه دهنده جستجوی پیش‌فرض</translation>
 <translation id="603410445099326293">‏پارامترهای نشانی وب پیشنهادی که از POST استفاده می‌کند</translation>
 <translation id="6034341625190551415">‏جلسه عمومی و نوع حساب kiosk را کنترل می‌کند.</translation>
@@ -3036,37 +2952,6 @@
       اگر این خط‌مشی روی نادرست تنظیم شود، هیچ‌گاه از کارخواه DNS داخلی استفاده نمی‌شود.
 
       اگر این خط‌مشی تنظیم نشود، کارخواه DNS داخلی به‌طور پیش‌فرض در MacOS،‏ Android (اگر نه DNS خصوصی و نه VPN فعال باشند) و ChromeOS فعال است و کاربران می‌توانند با ویرایش chrome://flags یا تعیین پرچم خط فرمان انتخاب کنند از کارخواه DNS داخلی استفاده شود یا نه.</translation>
-<translation id="6838056959556423778">‏قوانین انتخاب چاپگر پیش‌فرض <ph name="PRODUCT_NAME" /> را لغو می‌کند.
-
-      این خط‌مشی، قوانین انتخاب چاپگر پیش‌فرض را در <ph name="PRODUCT_NAME" /> تعیین می‌کند که در اولین استفاده از عملکرد چاپ با نمایه صورت می‌گیرد.
-
-      وقتی این خط‌مشی تنظیم شده باشد، <ph name="PRODUCT_NAME" /> تلاش خواهد کرد چاپگری پیدا کند که با همه ویژگی‌های مشخص‌شده منطبق باشد و آن را به‌عنوان چاپگر پیش‌فرض انتخاب کند. اولین چاپگری که مطابق با این خط‌مشی باشد انتخاب می‌شود و درصورت مطابقت با چند مورد، هر چاپگر منطبقی می‌تواند بستگی به ترتیب پیدا شدن انتخاب شود.
-
-      اگر این خط‌مشی تنظیم نشود یا چاپگر منطبقی در مهلت زمانی پیدا نشود، چاپگر PDF داخلی به‌عنوان چاپگر پیش‌فرض انتخاب می‌شود یا اگر چاپگر PDF دردسترس نباشد، چاپگری انتخاب نمی‌شود.
-
-      مقدار به‌عنوان شیء JSON و مطابق با طرح زیر تجزیه می‌شود:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Whether to limit the search of the matching printer to a specific set of printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regular expression to match printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regular expression to match printer display name.",
-            "type": "string"
-          }
-        }
-      }
-
-      چاپگرهای متصل به <ph name="CLOUD_PRINT_NAME" /> به‌عنوان <ph name="PRINTER_TYPE_CLOUD" /> درنظر گرفته می‌شود، مابقی چاپگرها به‌عنوان <ph name="PRINTER_TYPE_LOCAL" /> دسته‌بندی می‌شود.
-      حذف یک فیلد به این معنی است که همه مقادیر منطبق شوند، مثلاً مشخص نکردن قابلیت اتصال باعث خواهد شد «پیش‌نمایش چاپ» شروع به جستجوی همه انواع چاپگر (محلی و ابری) کند.
-      الگوهای عبارت باقاعده باید از ساختار دستوری JavaScript RegExp پیروی کنند و موارد منطبق به حروف بزرگ و کوچک حساس هستند.</translation>
 <translation id="6843296367238757293">‏این خط‌مشی منسوخ شده است. توصیه نمی‌کنیم از آن استفاده کنید. برای اطلاعات بیشتر به https://support.google.com/chrome/a/answer/7643500 بروید</translation>
 <translation id="684856667300805181">این خط‌مشی در <ph name="PRODUCT_NAME" /> نسخه ۶۸ حذف شده است و <ph name="ARC_GLS_POLICY_NAME" /> جایگزین آن شده است.</translation>
 <translation id="6856743875250214792">‏این خط‌مشی منسوخ شده و در M66 حذف شده است چون فقط برای آزمایش داخلی استفاده می‌شد و یک مسئولیت امنیتی است.
@@ -4202,30 +4087,6 @@
       این خط‌مشی تنها مشمول کاربرانی می‌شود که با استفاده از SAML احراز هویت می‌کنند.
 
       مقدار این خط‌مشی باید به ثانیه مشخص شود.</translation>
-<translation id="9027787254195333560">‏این خط‌مشی به شما امکان می‌دهد تصویر چهره‌نمای معرف کاربر را در صفحه ورود به سیستم پیکر‌بندی کنید. این خط‌مشی با مشخص کردن نشانی‌ وبی تنظیم می‌شود که<ph name="PRODUCT_OS_NAME" /> از آنجا می‌تواند تصویر چهره‌نما و درهم‌سازی رمزگذاری‌شده (مورد استفاده برای تأیید یکپارچگی بارگیری) را بارگیری کند. این تصویر باید در قالب JPEG باشد و اندازه آن نباید از ۵۱۲ کیلوبایت بیشتر شود. نشانی وب باید بدون احراز هویت قابل دسترسی باشد.
-
-      تصویر چهره‌نما بارگیری و در حافظه پنهان ذخیره می‌شود. هرگاه نشانی وب یا درهم‌سازی تغییر کند، دوباره بارگیری خواهد شد.
-
-      این خط‌مشی باید به‌عنوان رشته‌ای که نشانی وب را بیان می‌کند و درهم‌سازی در قالب JSON و مطابق با طرح زیر مشخص شود:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "نشانی وبی که تصویر چهره‌نما از آن می‌تواند بارگیری شود."،
-            "type": "string"
-          },
-          "hash": {
-            "description": "درهم‌سازی SHA-256 تصویر چهره‌نما."،
-            "type": "string"
-          }
-        }
-      }
-
-      اگر این خط‌مشی تنظیم شود، <ph name="PRODUCT_OS_NAME" /> تصویر چهره‌نما را بارگیری و از آن استفاده می‌کند.
-
-      اگر این خط‌مشی را تنظیم کنید، کاربران نمی‌توانند آن را تغییر دهند یا لغو کنند.
-
-      اگر خط‌مشی تنظیم نشود، کاربر می‌تواند تصویر چهره‌نمای معرف خود را در صفحه ورود به سیستم انتخاب کند.</translation>
 <translation id="9035964157729712237">شناسه افزونه هایی که از فهرست سیاه مستثنا شده‌اند</translation>
 <translation id="9038058011835642205">‏فهرستی از وب‌سایت‌ها را مشخص می‌کند که به‌صورت بی‌صدا و بدون تعامل کاربر، در صفحه ورود به سیستم نصب شده‌اند و کاربر نمی‌تواند حذف نصب یا غیرفعالشان کند.
 
@@ -4238,7 +4099,6 @@
       اگر این خط‌مشی را تنظیم کنید، کاربران نمی‌توانند آن را تغییر دهند یا لغو کنند.
 
       مقدار خط‌مشی باید برحسب میلی‌ثانیه باشد. مقادیر در محدوده ۳۰ ثانیه تا ۲۴ ساعت نگه‌داشته می‌شوند.</translation>
-<translation id="9042911395677044526">‏اجازه می‌دهد پیکربندی شبکه ارسال داده برای هر کاربر در یک دستگاه <ph name="PRODUCT_OS_NAME" /> اعمال شود. پیکربندی شبکه یک رشته با قالب JSON است، به صورتی که توسط قالب پیکربندی شبکه باز در <ph name="ONC_SPEC_URL" /> توضیح داده شده است.</translation>
 <translation id="9050853837490399534">‏این خط‌مشی کنترل می‌کند که آیا دستگاه باید به Quick Fix Build به‌روزرسانی شود یا نه.
 
       اگر مقدار خط‌مشی روی کدی تنظیم شود که به Quick Fix Build نگاشت کند، دستگاه به Quick Fix Build مربوطه به‌روزرسانی می‌شود، مگر خط‌مشی دیگری این به‌روزرسانی را مسدود کرده باشد.
@@ -4311,17 +4171,6 @@
       اگر این خط‌مشی روی نادرست تنظیم شود، «سرصفحه‌ها و پانویس‌ها» در کادر گفتگوی پیش‌نمایش چاپ انتخاب نشده است و کاربر نمی‌تواند آن را تغییر دهد.
 
       اگر این خط‌مشی روی درست تنظیم شود، «سرصفحه‌ها و پانویس‌ها» در کادر گفتگوی پیش‌نمایش چاپ انتخاب شده است و کاربر نمی‌تواند آن را تغییر دهد.</translation>
-<translation id="9213347477683611358">‏اگر هنوز کاربری وارد سیستم دستگاه نشده باشد، تصویر کاغذدیواری در سطح دستگاه را که در صفحه ورود به سیستم نمایش داده می‌شود پیکربندی می‌کند. این خط‌مشی با مشخص کردن نشانی وبی تنظیم می‌شود که دستگاه دارای سیستم عامل Chrome می‌تواند تصویر کاغذدیواری را از آن بارگیری کند و یک هش رمزگذاری برای تأیید یکپارچگی بارگیری استفاده می‌شود. این تصویر باید با قالب JPEG باشد و اندازه فایل نباید بیشتر از ۱۶ مگابایت باشد. نشانی وب نباید هیچ‌گونه احراز هویت قابل‌دسترسی داشته باشد. تصویر کاغذدیواری بارگیری‌شده و در حافظه پنهان ذخیره می‌شود. هرگاه که نشانی وب یا هش تغییر کند دوباره بارگیری می‌شود.
-
-      این خط‌مشی باید به‌عنوان رشته‌ای تنظیم شود که نشانی وب و هش را در قالب JSON بیان می‌کند، برای مثال،
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      اگر خط‌مشی کاغذدیواری دستگاه تنظیم شود، درصورتی‌که هنوز کاربری وارد سیستم دستگاه دارای سیستم عامل Chrome نشده باشد، دستگاه تصویر کاغذدیواری را روی صفحه ورود به سیستم بارگیری کرده و از آن استفاده می‌کند. هنگامی که کاربر به سیستم وارد شود، خط‌مشی کاغذدیواری کاربر فعال می‌شود.
-
-      اگر خط‌مشی کاغذدیواری دستگاه تنظیم‌نشده باقی بماند، خط‌مشی کاغذدیواری کاربر است که تصمیم می‌گیرد در صورت تنظیم این خط‌مشی چه چیزی را نشان دهد.</translation>
 <translation id="9217154963008402249">فراوانی بسته‌های نظارتی شبکه</translation>
 <translation id="922540222991413931">پیکربندی منابع نصب اسکریپت کاربر، برنامه و برنامهٔ افزودنی</translation>
 <translation id="924557436754151212">وارد کردن گذرواژه‌های ذخیره شده از مرورگر پیش‌فرض در اولین اجرا</translation>
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index 54434d5..e926de2 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -414,7 +414,6 @@
 
       Varoitus: emme suosittele <ph name="PRODUCT_OS_NAME" /> ‑version hallinnan antamista kioskisovellukselle, sillä tämä voi estää laitetta saamasta ohjelmistopäivityksiä ja kriittisiä tietoturvapäivityksiä. Jos <ph name="PRODUCT_OS_NAME" /> ‑version hallinta annetaan sovellukselle, käyttäjät voivat vaarantua.</translation>
 <translation id="1675002386741412210">Tuettu kohteissa:</translation>
-<translation id="1689963000958717134">Antaa määrittää tuotetta <ph name="PRODUCT_OS_NAME" /> käyttävien laitteiden verkkoasetukset kaikille käyttäjille. Verkkoasetukset määritetään JSON-muotoiltuna merkkijonona Open Network Configuration -muodossa, josta on lisätietoja osoitteessa <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Määrittää <ph name="TPM_FIRMWARE_UPDATE_TPM" />-laiteohjelmiston päivitystoiminnon saatavuuden ja toiminnan.
 
       Yksittäisiä asetuksia voi määrittää JSON-ominaisuuksissa:
@@ -955,16 +954,6 @@
       Jos tämä asetus ei ole käytössä, verkkosivut eivät voi käyttää JavaScriptiä eivätkä käyttäjät voi muuttaa asetusta.
 
       Jos tämä asetus on käytössä tai sitä ei ole määritetty, verkkosivut voivat käyttää JavaScriptiä, mutta käyttäjät voivat muuttaa asetusta.</translation>
-<translation id="2747157663401642394">Määrittää laajennusten hallinta-asetukset, joita <ph name="PRODUCT_NAME" /> käyttää.
-
-          Tämä käytäntö vaikuttaa moniin asetuksiin, jotka voivat olla esimerkiksi olemassa olevien laajennuksia koskevien käytäntöjen alaisia. Tämä käytäntö korvaa mahdollisesti käytössä olevat vanhat käytännöt.
-
-          Tämä käytäntö käyttää laajennustunnusta tai päivityksen URL-osoitetta. Laajennustunnusta käytettäessä määritys koskee vain tunnusta vastaavaa laajennusta. Oletusarvoinen määritys voidaan asettaa käyttämällä tunnusta <ph name="DEFAULT_SCOPE" />. Se koskee kaikkia laajennuksia, joille ei ole asetettu muokattua määritystä tässä käytännössä. Päivityksen URL-osoitetta käytettäessä määritys koskee kaikkia laajennuksia, jotka käyttävät täsmälleen laajennuksen luettelossa määriteltyä päivityksen URL-osoitetta. Katso <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Windowsin esiintymissä, joita ei ole liitetty <ph name="MS_AD_NAME" /> ‑verkkotunnukseen, pakotettu asennus on mahdollinen vain sovelluksille ja laajennuksille, jotka on lueteltu Chrome Web Storessa.
-
-          Päivityksen URL-osoitetta käytettäessä määritys koskee kaikkia laajennuksia, jotka käyttävät täsmälleen laajennuksen luettelossa määriteltyä päivityksen URL-osoitetta. Katso https://www.chromium.org/administrators/policy-list-3/extension-settings-full.
-          </translation>
 <translation id="2753637905605932878">Rajoita WebRTC:n käyttämiä paikallisia UDP-portteja</translation>
 <translation id="2757054304033424106">Laajennuksien tai sovelluksien tyypit, joita saa asentaa</translation>
 <translation id="2758084448533744848">Määrittää laitteella käytettävän aikavyöhykkeen. Jos tämä käytäntö on määritetty, laitteen käyttäjät eivät voi ohittaa asetettua aikavyöhykettä. Jos arvo on virheellinen, käytännön aktivoinnin yhteydessä käytetään GMT-vyöhykettä. Jos käytännön arvo on tyhjä merkkijono, käytäntö ohitetaan.
@@ -1288,7 +1277,7 @@
 Jos asetus ei ole käytössä, käyttäjät eivät voi ottaa välityspalvelinta käyttöön eikä kone voi jakaa tulostimiaan palvelussa <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="3312206664202507568">Ottaa osoitteessa chrome://password-change käyttöön sivun, jossa SAML-käyttäjät voivat vaihtaa SAML-salasanansa käyttökerran aikana, mikä varmistaa sen, että SAML-salasana ja laitteen lukitusnäyttö pysyvät synkronoituina.
 
-      Tämä käytäntö ottaa myös käyttöön ilmoitukset, jotka varoittavat SAML-käyttäjiä, kun heidän SAML-salasanansa ovat vanhentumassa, jotta välittömästi vaihtaa salasanan käyttökerran aikana.
+      Tämä käytäntö ottaa myös käyttöön ilmoitukset, jotka varoittavat SAML-käyttäjiä, kun heidän SAML-salasanansa ovat vanhentumassa, jotta he voivat välittömästi vaihtaa salasanan käyttökerran aikana.
       Nämä ilmoitukset näytetään vain, jos SAML-tunnistustietojen tarjoaja lähettää salasanan vanhentumistiedot laitteelle SAML-kirjautumisprosessin aikana.
 
       Jos tämä käytäntö on määritetty, käyttäjä ei voi muuttaa tai ohittaa sitä.</translation>
@@ -1727,30 +1716,6 @@
       Tämä käytäntö vaikuttaa vain käyttäjiin, jotka käyttävät SAML-todennusta.</translation>
 <translation id="4105989332710272578">Poista Certificate Transparency ‑vaatimus tietyiltä URL-osoitteilta</translation>
 <translation id="4121350739760194865">Estä sovelluskampanjoita näkymästä uusi välilehti -sivulla</translation>
-<translation id="4125606414556046117">Tämän käytännön avulla voit määrittää taustakuvan, jota käytetään käyttäjän työpöydällä ja kirjautumisnäytöllä. Määritä tämän käytännön arvoksi URL-osoite, josta <ph name="PRODUCT_OS_NAME" /> voi ladata taustakuvan, ja salauksen hajautusarvo, jonka avulla tarkistetaan latauksen eheys. Kuvan on oltava JPEG-muodossa, ja sen sallittu enimmäiskoko on 16 Mt. Pääsy URL-osoitteeseen ei saa edellyttää todennusta.
-
-      Taustakuva ladataan ja tallennetaan välimuistiin. Se ladataan uudelleen aina, kun URL-osoite tai hajautusarvo muuttuu.
-
-      Määritä käytäntö alla olevan mallin mukaisena merkkijonona, jossa URL-osoite ja hajautusarvo ilmaistaan JSON-muodossa:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL-osoite, josta taustakuva voidaan ladata.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Taustakuvan SHA-256-hajautusarvo.",
-            "type": "string"
-          }
-        }
-      }
-
-      Jos tämä käytäntö on määritetty, <ph name="PRODUCT_OS_NAME" /> lataa taustakuvan ja käyttää sitä.
-
-      Jos tämä käytäntö on määritetty, käyttäjät eivät voi muuttaa tai ohittaa sitä.
-
-      Jos tätä käytäntöä ei ole määritetty, käyttäjä voi valita työpöydällä ja kirjautumisnäytöllä näkyvän taustakuvan.</translation>
 <translation id="412697421478384751">Salli käyttäjän määrittää heikko lukitusnäytön PIN-koodi</translation>
 <translation id="4138655880188755661">Aikaraja</translation>
 <translation id="4144164749344898721">Tämä käytäntö säätelee useita käyttämättömyystilanteen virranhallinta-asetuksia.
@@ -2513,7 +2478,7 @@
 
           Jos tätä asetusta ei ole määritetty, kaiken tyyppisiä sovelluksia ja laajennuksia voi asentaa.
 
-          Ennen versiota 75 useiden pilkuilla erotettuja laajennustunnuksia käyttöä ei tueta ja se ohitetaan. Käytännön muita osia sovelletaan jatkossakin.</translation>
+          Ennen versiota 75 useiden pilkuilla erotettujen laajennustunnusten käyttöä ei tueta ja se ohitetaan. Käytännön muita osia sovelletaan jatkossakin.</translation>
 <translation id="5645779841392247734">Salli evästeet näissä sivustoissa</translation>
 <translation id="5689430183304951538">Tulostuksen oletussivukoko</translation>
 <translation id="5693469654327063861">Salli tietojen siirtäminen</translation>
@@ -2675,51 +2640,6 @@
 
 Jos tämä asetus ei ole käytössä tai jos sen arvo on false, tulostuskomento avaa tulostuksen esikatseluruudun.</translation>
 <translation id="6022948604095165524">Toiminto käynnistettäessä</translation>
-<translation id="6023030044732320798">Määrittää ARC-suorituspalvelulle toimitettavat käytännöt. Arvon on oltava kelvollinen JSON-tiedosto.
-
-      Tällä käytännöllä voidaan määritellä laitteelle automaattisesti asennettavat Android-sovellukset:
-
-     {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-              "description": "Android-sovelluksen tunniste, esimerkiksi com.google.android.gm Gmailin tapauksessa",
-              "type": "string"
-            },
-            "installType": {
-              "description": "Kuvailee sovelluksen asennustapaa. OPTIONAL: Sovellusta ei asenneta automaattisesti, mutta käyttäjä voi asentaa sen. Tämä on oletuksena käytössä, jos käytäntöä ei ole määritetty. PRELOAD: Sovellus asennetaan automaattisesti, mutta käyttäjä voi poistaa sen. FORCE_INSTALLED: Sovellus asennetaan automaattisesti, eikä käyttäjä voi poistaa sitä. BLOCKED: Sovellus on estetty eikä sitä voi asentaa. Jos sovellus on asennettu aiemman käytännön johdosta, se poistetaan.",
-              "type": "string",
-              "enum": [
-                "OPTIONAL"
-                "PRELOAD",
-                "FORCE_INSTALLED",
-                "BLOCKED"
-              ]
-            },
-            "defaultPermissionPolicy": {
-              "description": "Sovellusten käyttöoikeuspyyntöihin sovellettava käytäntö. PERMISSION_POLICY_UNSPECIFIED: Käytäntöä ei ole määritetty. Jos sitä ei ole määritetty millään tasolla, PROMPT-valintaa sovelletaan oletuksena. PROMPT: Kysy käyttäjältä, myönnetäänkö käyttöoikeus. GRANT: Myönnä käyttöoikeus automaattisesti. DENY: Evää käyttöoikeus automaattisesti.",
-              "type": "string",
-              "enum": [
-                "PERMISSION_POLICY_UNSPECIFIED",
-                "PROMPT",
-                "GRANT",
-                "DENY"
-              ]
-            },
-            "managedConfiguration": {
-              "description": "Sovelluskohtainen JSON-määrityksen merkkijono, jolla on tietyt avainarvoparit, esimerkiksi '"managedConfiguration": { "key1": value1, "key2": value2 }'. Avaimet määritellään luettelotiedostossa.",
-              "type": "string"
-            }
-          }
-        }
-      }
-
-      Sovellusten kiinnittämistä käynnistysohjelmaan hallinnoi PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Oletushakupalvelun Instant-URL-osoite</translation>
 <translation id="603410445099326293">POST-metodia käyttävän ehdotushaun URL-osoitteen parametrit</translation>
 <translation id="6034341625190551415">Määrittää julkisten istuntojen ja kioskien tilityypit</translation>
@@ -3066,38 +2986,6 @@
       Jos tämän käytännön arvo on epätosi, sisäänrakennettua DNS-asiakassovellusta ei käytetä koskaan.
 
       Jos tätä käytäntöä ei ole määritetty, sisäänrakennettu DNS-asiakassovellus otetaan oletuksena käyttöön MacOSissa, Androidissa (kun yksityinen DNS ja VPN eivät ole käytössä) ja Chrome-käyttöjärjestelmässä. Lisäksi käyttäjät voivat ottaa sisäänrakennetun DNS-asiakassovelluksen käyttöön tai poistaa sen käytöstä chrome://flags-sivun tai komentorivin avulla.</translation>
-<translation id="6838056959556423778">Ohittaa tuotteen <ph name="PRODUCT_NAME" /> oletustulostimen valinnan säännöt.
-
-      Tämä käytäntö määrittää säännöt, joiden perusteella <ph name="PRODUCT_NAME" /> valitsee oletustulostimen, kun tulostustoimintoa käytetään profiilin kautta ensimmäistä kertaa.
-
-      Kun käytäntö on määritetty, <ph name="PRODUCT_NAME" /> pyrkii löytämään tulostimen, joka täyttää kaikki asetut vaatimukset, ja valitsemaan sen oletustulostimeksi. Valinta kohdistuu ensimmäiseen tulostimeen, joka vastaa käytäntöä. Jos useita tulostimia löydetään, mikä tahansa niistä voi tulla valituksi, riippuen niiden löytämisjärjestyksestä.
-
-      Jos käytäntöä ei ole määritetty tai sopivaa tulostinta ei ole löydetty ennen aikakatkaisua, tulostin valitsee oletukseksi sisäänrakennetun tulostuksen PDF:ään tai se ei valitse mitään, jos PDF-tulostusta ei ole saatavilla.
-
-      Arvo merkitään JSON-objektin muodossa seuraavan mallin mukaisesti:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Rajoitetaanko sopivan tulostimen etsintä tiettyyn tulostinjoukkoon.",
-            "type": {
-            "enum": [ "local", "cloud" ]
-            }
-          },
-          "idPattern": {
-            "description": "Säännöllinen lauseke, joka vastaa tulostimen tunnusta.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Säännöllinen lauseke, joka vastaa tulostimen näyttönimeä.",
-            "type": "string"
-          }
-        }
-      }
-
-      Palveluun <ph name="CLOUD_PRINT_NAME" /> yhdistetyt tulostimet ovat tyyppiä <ph name="PRINTER_TYPE_CLOUD" />, ja muut tulostimet ovat tyyppiä <ph name="PRINTER_TYPE_LOCAL" />.
-      Kentän tyhjäksi jättäminen tarkoittaa, että kaikki arvot hyväksytään siihen. Jos esimerkiksi yhteydet jätetään tyhjäksi, tulostuksen esikatselu pyrkii löytämään sekä pilvitulostimia että paikallisia tulostimia.
-      Säännöllisten lausekkeiden muodon tulee noudattaa JavaScript RegExp ‑syntaksia, ja kirjainkoolla on väliä osumissa.</translation>
 <translation id="6843296367238757293">Tämä käytäntö on vanhentunut. Suosittelemme, että et käytä sitä. Lue lisää täältä: https://support.google.com/chrome/a/answer/7643500.</translation>
 <translation id="684856667300805181">Tämä käytäntö poistettiin tuotteessa <ph name="PRODUCT_NAME" /> 68 ja korvattiin käytännöllä <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Tämä käytäntö on poistettu käytöstä ja M66:sta, sillä sitä käytettiin ainoastaan sisäisessä testauksessa. Se on lisäksi tietosuojariski.
@@ -4231,30 +4119,6 @@
       Tämä käytäntö koskee vain SAML-todennusta käyttäviä käyttäjiä.
 
       Määritä käytännön arvo sekunteina.</translation>
-<translation id="9027787254195333560">Tämän käytännön avulla voit määrittää käyttäjän avatar-kuvan, joka näkyy kirjautumisnäytöllä. Määritä tämän käytännön arvoksi URL-osoite, josta <ph name="PRODUCT_OS_NAME" /> voi ladata avatarin, ja salauksen hajautusarvo, jonka avulla tarkistetaan latauksen eheys. Kuvan on oltava JPEG-muodossa, ja sen sallittu enimmäiskoko on 512 kt. Pääsy URL-osoitteeseen ei saa edellyttää todennusta.
-
-      Avatar ladataan ja tallennetaan välimuistiin. Se ladataan uudelleen aina, kun URL-osoite tai hajautusarvo muuttuu.
-
-      Määritä käytäntö alla olevan mallin mukaisena merkkijonona, jossa URL-osoite ja hajautusarvo ilmaistaan JSON-muodossa:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL-osoite, josta avatar voidaan ladata.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Avatarin SHA-256-hajautusarvo.",
-            "type": "string"
-          }
-        }
-      }
-
-      Jos tämä käytäntö on määritetty, <ph name="PRODUCT_OS_NAME" /> lataa avatarin ja käyttää sitä.
-
-      Jos tämä käytäntö on määritetty, käyttäjät eivät voi muuttaa tai ohittaa sitä.
-
-      Jos tätä käytäntöä ei ole määritetty, käyttäjä voi valita kirjautumisnäytöllä näkyvän avatar-kuvan itse.</translation>
 <translation id="9035964157729712237">Kieltoluettelosta poistettavat laajennuksien tunnukset</translation>
 <translation id="9038058011835642205">Määrittää luettelon verkkosivustoista, jotka asennetaan huomaamattomasti ilman käyttäjän toimenpiteitä ja joita käyttäjä ei voi poistaa käytöstä tai kokonaan.
 
@@ -4267,7 +4131,6 @@
       Jos tämä käytäntö on määritetty, käyttäjät eivät voi muuttaa tai ohittaa sitä.
 
       Määritä käytännön arvo millisekunteina. Arvoa muutetaan tarvittaessa niin, että se on vähintään 30 sekuntia ja enintään 24 tuntia.</translation>
-<translation id="9042911395677044526">Antaa määrittää tuotetta <ph name="PRODUCT_OS_NAME" /> käyttävien laitteiden verkkoasetukset käyttäjäkohtaisesti. Verkkoasetukset määritetään JSON-muotoiltuna merkkijonona Open Network Configuration -muodossa, josta on lisätietoja osoitteessa <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Tämä käytäntö määrittää, päivitetäänkö laite Quick Fix ‑versioon.
 
       Jos käytännön arvo on Quick Fix ‑versioon yhdistettävä tunnus, laite päivitetään vastaavaan Quick Fix ‑versioon, ellei toinen käytäntö estä päivittämistä.
@@ -4340,17 +4203,6 @@
       Jos käytännön arvoksi on määritetty epätosi, ylä- ja alatunnisteita ei ole valittu tulostuksen esikatseluikkunassa, eikä käyttäjä voi muuttaa asetusta.
 
       Jos käytännön arvoksi on määritetty tosi, ylä- ja alatunnisteet on valittu tulostuksen esikatseluikkunassa, ja käyttäjä voi muuttaa asetusta.</translation>
-<translation id="9213347477683611358">Määritä laitetason taustakuva, joka näytetään kirjautumisnäytöllä, kun yksikään käyttäjä ei ole kirjautuneena laitteelle. Käytäntö määritetään antamalla URL-osoite, josta Chrome-käyttöjärjestelmää käyttävä laite voi ladata taustakuvan ja hajautusarvo, jonka avulla lataus todennetaan. Kuvan on oltava JPEG-muodossa, ja sen enimmäiskoko on 16 Mt. URL-osoitteen käyttäminen ei saa edellyttää todennusta. Taustakuva ladataan ja tallennetaan välimuistiin. Kuva ladataan uudelleen, jos URL-osoite tai hajautusarvo muuttuu.
-
-      Määritä käytäntö merkkijonona, joka sisältää URL-osoitteen ja hajautusarvon JSON-muodossa, esim.
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Jos laitteelle on määritetty taustakuvakäytäntö eikä kukaan käyttäjistä ole kirjautunut laitteelle, Chrome-käyttöjärjestelmää käyttävä laite lataa taustakuvan ja käyttää sitä kirjautumisnäytöllä. Kun käyttäjä kirjautuu sisään, hänen taustakuvakäytäntönsä astuu voimaan.
-
-      Jos laitteelle ei ole määritetty taustakuvakäytäntöä, käyttäjän taustakuvakäytäntö (jos sellainen on määritetty) määrittää näytettävän kuvan.</translation>
 <translation id="9217154963008402249">Verkon valvontapakettien lähetystiheys</translation>
 <translation id="922540222991413931">Määritä laajennusten, sovellusten ja käyttäjien komentosarjojen asennuslähteet</translation>
 <translation id="924557436754151212">Tuo tallennetut salasanat oletusselaimesta ensimmäisellä käyttökerralla</translation>
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index 2b762a5fb..39b3b901 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -415,7 +415,6 @@
 
       Babala: Hindi inirerekomenda ang pagtatalaga ng kontrol sa bersyon ng <ph name="PRODUCT_OS_NAME" /> sa isang kiosk app dahil maaari nitong pigilan ang pagtanggap ng device ng mga update sa software at kritikal na pag-aayos sa seguridad. Maaaring malagay sa peligro ang mga user kung magtatalaga ng kontrol sa bersyon ng <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="1675002386741412210">Suportado sa:</translation>
-<translation id="1689963000958717134">Nagbibigay-daan na malapat sa lahat ng user ang configuration ng pushing network sa isang <ph name="PRODUCT_OS_NAME" /> na device. Ang configuration ng network ay isang string na naka-format sa JSON tulad ng tinutukoy ng format ng Configuration ng Open Network na inilalarawan sa <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Kino-configure ang availability at gawi ng functionality ng pag-update sa <ph name="TPM_FIRMWARE_UPDATE_TPM" /> firmware.
 
       Matutukoy ang mga indibidwal na setting sa mga JSON property:
@@ -976,16 +975,6 @@
       Kung hindi pinagana ang setting na ito, hindi makakagamit ng JavaScript ang mga web page at hindi mababago ng user ang setting na iyon.
 
       Kung pinagana o hindi nakatakda ang setting na ito, makakagamit ng JavaScript ang mga web page ngunit mababago ng user ang setting na iyon.</translation>
-<translation id="2747157663401642394">Kino-configure ang mga setting ng pamamahala ng extension para sa <ph name="PRODUCT_NAME" />.
-
-          Kinokontrol ng patakarang ito ang maraming setting, kabilang ang mga setting na kinokontrol ng anumang kasalukuyang patakarang nauugnay sa extension. Io-override ng patakarang ito ang anumang patakaran ng legacy kung parehong naitakda.
-
-          Nagmamapa ang patakarang ito ng extension ID o ng URL ng update sa configuration nito. Gamit ang isang extension ID, ilalapat ang configuration sa tinukoy na extension lang. Puwedeng itakda ang isang default na configuration para sa espesyal na ID <ph name="DEFAULT_SCOPE" /> na ilalapat sa lahat ng extension na walang nakatakdang custom na configuration sa patakarang ito. Gamit ang isang URL ng update, ilalapat ang configuration sa lahat ng extension na may eksaktong URL ng update na nakasaad sa manifest ng extension na ito, gaya ng nakasaad sa <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Para sa mga instance ng Windows na hindi kasama sa isang domain ng <ph name="MS_AD_NAME" />, nililimitahan ang sapilitang pag-install sa mga app at extension na nakalista sa Chrome Web Store.
-
-          Para sa kumpletong paglalarawan ng mga posibleng setting at istruktura ng patakarang ito, bumisita sa https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Paghigpitan ang hanay ng mga lokal na UDP port na ginagamit ng WebRTC</translation>
 <translation id="2757054304033424106">Mga uri ng mga extension/apps na pinapayagang ma-install</translation>
 <translation id="2758084448533744848">Tinutukoy ang ipinatupad na timezone na gagamitin para sa device. Kapag naitakda na ang patakarang ito, hindi maaaring i-override ng mga user sa device ang tinukoy na timezone. Kung may ibinigay na invalid na value, ia-activate pa rin ang patakarang ito gamit ang "GMT" sa halip. Kung may ibinigay na walang lamang string, binabalewala ang patakaran.
@@ -1214,7 +1203,7 @@
       Nagbibigay-daan ang patakarang ito sa mga administrator na magbigay ng mga configuration ng printer para sa
       kanilang mga user.
 
-      Ang <ph name="PRINTER_DISPLAY_NAME" /> at <ph name="PRINTER_DESCRIPTION" /> ay mga free form ns string na puwedeng i-customize para sa mas madaling pagpili ng printer. Pinapadali ng <ph name="PRINTER_MANUFACTURER" /> at <ph name="PRINTER_MODEL" /> ang pagtukoy ng printer ng mga end user. Kinakatawan ng mga ito ang manufacturer at modelo ng printer. Ang <ph name="PRINTER_URI" /> ay dapat isang address na mapupuntahan mula sa isang client na computer kabilang ang <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, at <ph name="URI_QUEUE" />. Opsyonal ang <ph name="PRINTER_UUID" />. Kung ibibigay, gagamitin ito para makatulong na mag-deduplicate ng mga printer sa <ph name="ZEROCONF_DISCOVERY" />.
+      Ang <ph name="PRINTER_DISPLAY_NAME" /> at <ph name="PRINTER_DESCRIPTION" /> ay mga free form na string na puwedeng i-customize para sa mas madaling pagpili ng printer. Pinapadali ng <ph name="PRINTER_MANUFACTURER" /> at <ph name="PRINTER_MODEL" /> ang pagtukoy ng printer ng mga end user. Kinakatawan ng mga ito ang manufacturer at modelo ng printer. Ang <ph name="PRINTER_URI" /> ay dapat isang address na mapupuntahan mula sa isang client na computer kabilang ang <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, at <ph name="URI_QUEUE" />. Opsyonal ang <ph name="PRINTER_UUID" />. Kung ibibigay, gagamitin ito para makatulong na mag-deduplicate ng mga printer sa <ph name="ZEROCONF_DISCOVERY" />.
 
       Tumutugma dapat ang <ph name="PRINTER_EFFECTIVE_MODEL" /> sa isa sa mga string na kumakatawan sa printer na sinusuportahan ng <ph name="PRODUCT_NAME" />. Gagamitin ang string para tukuyin at i-install ang naaangkop na PPD para sa printer. Makakahanap ng higit pang impormasyon sa https://support.google.com/chrome?p=noncloudprint.
 
@@ -1757,30 +1746,6 @@
       Maaapektuhan lang ng patakarang ito ang mga user na nao-authenticate gamit ang SAML.</translation>
 <translation id="4105989332710272578">I-disable ang pagpapatupad ng Transparency ng Certificate para sa isang listahan ng mga URL</translation>
 <translation id="4121350739760194865">Pigilan ang paglitaw ng mga pag-promote ng app sa pahina ng bagong tab</translation>
-<translation id="4125606414556046117">Nagbibigay-daan sa iyo ang patakarang itong i-configure ang larawan sa wallpaper na ipinapakita sa desktop at sa background ng screen sa pag-log in para sa user. Itinatakda ang patakaran sa pamamagitan ng pagtukoy sa URL kung saan mada-download ng <ph name="PRODUCT_OS_NAME" /> ang larawan sa wallpaper at isang cryptographic na hash na ginagamit para i-verify ang integridad ng download. Dapat ay nasa format na JPEG ang larawan at hindi dapat lumampas sa 16MB ang laki ng file nito. Dapat ay accessible ang URL nang walang anumang pag-authenticate.
-
-      Dina-download at kina-cache ang larawan sa wallpaper. Muli itong ida-download sa tuwing magbabago ang URL o ang hash.
-
-      Dapat tukuyin ang patakaran bilang string na nagsasaad sa URL at hash sa format na JSON, at umaayon sa sumusunod na schema:
-      {
-        "uri": "object",
-        "mga property": {
-          "url": {
-            "paglalarawan": "Ang URL kung saan mada-download ang larawan sa wallpaper.",
-            "uri": "string"
-          },
-          "hash": {
-            "paglalarawan": "Ang SHA-256 hash ng larawan sa wallpaper.",
-            "uri": "string"
-          }
-        }
-      }
-
-      Kung itatakda ang patakarang ito, ida-download at gagamitin ng <ph name="PRODUCT_OS_NAME" /> ang larawan sa wallpaper.
-
-      Kung itatakda mo ang patakarang ito, hindi ito mababago o mao-override ng mga user.
-
-      Kung hahayaang hindi nakatakda ang patakaran, puwedeng pumili ang user ng larawang ipapakita sa desktop at sa background ng screen sa pag-log in.</translation>
 <translation id="412697421478384751">I-enable ang mga user na magtakda ng madadaling hulaang PIN para sa PIN ng lock screen</translation>
 <translation id="4138655880188755661">Limitasyon sa Oras</translation>
 <translation id="4144164749344898721">Kinokontrol ng patakarang ito ang maraming setting para sa diskarte ng pamamahala sa power kapag naging idle ang user.
@@ -2736,53 +2701,6 @@
 
       Kung hindi nakatakda ang patakarang ito o nakatakda sa false, iti-trigger ng mga command sa pag-print ang screen ng preview sa pag-print.</translation>
 <translation id="6022948604095165524">Pagkilos sa startup</translation>
-<translation id="6023030044732320798">Tumutukoy ng hanay ng mga patakarang ipapasa sa runtime ng ARC. Dapat ay valid na JSON ang value.
-
-      Magagamit ang patakarang ito upang i-configure kung aling mga Android app ang awtomatikong ii-install sa device:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identifier ng Android app, hal., "com.google.android.gm" para sa Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Tumutukoy sa kung paano ii-install ang isang app. OPTIONAL: Hindi awtomatikong ii-install ang app, ngunit maaari itong i-install ng user. Ito ang default kung hindi tutukuyin ang patakarang ito. PRELOAD: Awtomatikong ii-install ang app, ngunit maaari itong i-uninstall ng user. FORCE_INSTALLED: Awtomatikong ii-install ang app at hindi ito maaaring i-uninstall ng user. BLOCKED: Naka-block ang app at hindi maaaring i-install. Kung na-install ang app alinsunod sa dating patakaran, maa-uninstall ito.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Patakaran sa pagbibigay ng mga kahilingan sa pahintulot sa mga app. PERMISSION_POLICY_UNSPECIFIED: Hindi tinukoy ang patakaran. Kung walang tutukuying patakaran para sa isang pahintulot sa anumang antas, gagamitin bilang default ang `PROMPT` na gawi. PROMPT: Nagpa-prompt sa user na magbigay ng pahintulot. GRANT: Awtomatikong nagbibigay ng pahintulot. DENY: Awtomatikong hindi nagbibigay ng pahintulot.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Partikular sa app na object ng configuration ng JSON na may hanay ng mga key-value na pares, hal., '"managedConfiguration": { "key1": value1, "key2": value2 }'. Tinutukoy ang mga key sa manifest ng app.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Upang mag-pin ng mga app sa launcher, tingnan ang PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Instant na URL ng default na provider ng paghahanap</translation>
 <translation id="603410445099326293">Mga parameter para sa URL ng mungkahi na ginagamit ang POST</translation>
 <translation id="6034341625190551415">Nagkokontrol sa pampublikong session at mga uri ng account ng kiosk.</translation>
@@ -3136,37 +3054,6 @@
       Kung itatakda sa false ang patakarang ito, hindi kailanman gagamitin ang built-in na DNS client.
 
       Kung iiwang hindi nakatakda ang patakarang ito, mae-enable bilang default ang built-in na DNS client sa MacOS, Android (kapag hindi naka-enable ang Private DNS at VPN), at ChromeOS, at magagawa ng mga user na baguhin kung gagamitin ang built-in na DNS client sa pamamagitan ng pag-edit ng chrome://flags o pagtukoy ng command-line flag.</translation>
-<translation id="6838056959556423778">Ino-override ang mga default na panuntunan sa pagpili ng printer ng <ph name="PRODUCT_NAME" />.
-
-      Tinutukoy ng patakarang ito ang mga panuntunan para sa pagpili sa default na printer sa <ph name="PRODUCT_NAME" /> na magaganap sa unang beses na gagamitin ang function na pag-print sa pamamagitan ng isang profile.
-
-      Kapag nakatakda ang patakarang ito, tatangkain ng <ph name="PRODUCT_NAME" /> na maghanap ng printer na tumutugma sa lahat ng natukoy na attribute, at pipiliin ito bilang default na printer. Pipiliin ang unang printer na mahahanap na tumutugma sa patakaran, kung may hindi natatanging pagtutugma, maaaring piliin ang anumang tumutugmang printer, depende sa pagkakasunud-sunod ng pagtuklas sa mga printer.
-
-      Kung hindi nakatakda ang patakarang ito o walang mahahanap na tumutugmang printer sa panahon ng timeout, magde-default ang printer sa naka-built in na PDF printer o walang napiling printer, kapag hindi available ang PDF printer.
-
-      Naka-parse ang value bilang JSON object na sumusunod sa schema sa ibaba:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Kung lilimitahan o hindi ang paghahanap sa tumutugmang printer sa isang partikular na set ng mga printer.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Karaniwang expression para magtugma ng printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Karaniwang expression para magtugma ng display name ng printer .",
-            "type": "string"
-          }
-        }
-      }
-
-      Ang mga printer na nakakonekta sa <ph name="CLOUD_PRINT_NAME" /> ay itinuturing na <ph name="PRINTER_TYPE_CLOUD" />, ang iba pang printer ay kabilang sa klasipikasyong <ph name="PRINTER_TYPE_LOCAL" />.
-      Nangangahulugan ang pag-aalis ng field na ang lahat ng tugma ng value, halimbawa, na hindi tumutukoy ng pagkakakonekta ay magdudulot sa Print Preview na simulan ang pagtuklas ng lahat ng uri ng printer, lokal, at cloud.
-      Dapat sumunod ang mga pattern ng regular na expression sa JavaScript RegExp syntax at case sensistive ang mga tugma.</translation>
 <translation id="6843296367238757293">Hindi na ginagamit ang patakarang ito. Hindi hinihikayat ang paggamit nito. Magbasa pa sa https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Inalis ang patakarang ito sa <ph name="PRODUCT_NAME" /> 68 at pinalitan ito ng <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Hindi na ginagamit at tinanggal na ang patakarang ito sa M66, dahil ginamit lang ito para sa internal na pagsubok at isa itong sagutin sa seguridad.
@@ -4341,30 +4228,6 @@
       Naaapektuhan lang ng patakarang ito ang mga user na nag-authenticate gamit ang SAML.
 
       Dapat ay nakasaad ang value ng patakaran sa pamamagitan ng segundo.</translation>
-<translation id="9027787254195333560">Nagbibigay-daan sa iyo ang patakarang ito na i-configure ang larawan ng avatar na kumakatawan sa user sa screen sa pag-log in. Itinatakda ang patakaran sa pamamagitan ng pagtukoy sa URL kung saan mada-download ng <ph name="PRODUCT_OS_NAME" /> ang larawan ng avatar at isang cryptographic na hash na ginagamit para i-verify ang integridad ng download. Dapat ay nasa format na JPEG ang larawan, hindi dapat lumampas sa 512kB ang laki nito. Dapat ay accessible ang URL nang walang anumang pag-authenticate.
-
-      Dina-download at kina-cache ang larawan ng avatar. Muli itong ida-download sa tuwing magbabago ang URL o ang hash.
-
-      Dapat tukuyin ang patakaran bilang string na nagsasaad sa URL at hash sa format na JSON, at umaayon sa sumusunod na schema:
-      {
-        "uri": "object",
-        "mga property": {
-          "url": {
-            "paglalarawan": "Ang URL kung saan mada-download ang larawan ng avatar.",
-            "uri": "string"
-          },
-          "hash": {
-            "paglalarawan": "Ang SHA-256 hash ng larawan ng avatar.",
-            "uri": "string"
-          }
-        }
-      }
-
-      Kung itatakda ang patakarang ito, ida-download at gagamitin ng <ph name="PRODUCT_OS_NAME" /> ang larawan ng avatar.
-
-      Kung itatakda mo ang patakarang ito, hindi ito mababago o mao-override ng mga user.
-
-      Kung hahayaang hindi nakatakda ang patakaran, puwedeng piliin ng user ang larawan ng avatar na kumakatawan sa kanya sa screen sa pag-log in.</translation>
 <translation id="9035964157729712237">Ang mga ID ng Extension upang maibukod mula sa blacklist</translation>
 <translation id="9038058011835642205">Tumutukoy ng listahan ng mga website na na-install nang silent, nang walang pakikipag-ugnayan sa user, at hindi maa-uninstall o madi-disable ng user.
 
@@ -4377,7 +4240,6 @@
       Kung itatakda mo ang patakarang ito, hindi ito mababago o mao-override ng mga user.
 
       Dapat isaad ang value ng patakaran gamit ang millisecond. Papanatilihin ang mga value sa hanay na 30 segundo hanggang 24 na oras.</translation>
-<translation id="9042911395677044526">Nagbibigay-daan na malapat sa bawat user ang configuration ng pushing network sa isang <ph name="PRODUCT_OS_NAME" /> na device. Ang configuration ng network ay isang naka-format sa JSON  na string tulad ng tinutukoy ng format ng Configuration ng Open Network na inilalarawan sa <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Kinokontrol ng patakarang ito kung dapat i-update o hindi ang device sa isang Quick Fix Build.
 
       Kung ang value ng patakaran ay naitakda sa token na nagmamapa sa isang Quick Fix Build, ia-update ang device sa kaukulang Quick Fix Build kung ang update ay hindi na-block ng isa pang patakaran.
@@ -4457,17 +4319,6 @@
       Kung nakatakda sa false ang patakaran, hindi napili ang 'Mga header at footer' sa dialog ng preview ng pag-print, at hindi ito mababago ng user.
 
       Kung nakatakda sa true ang patakaran, napili ang 'Mga header at footer' sa dialog ng preview ng pag-print, at hindi ito mababago ng user.</translation>
-<translation id="9213347477683611358">Nagko-configure ng larawan ng wallpaper sa device na ipinapakita sa screen ng pag-login kung wala pang naka-sign in na user sa device. Itinatakda ang patakaran sa pamamagitan ng pagtukoy sa URL kung saan maaaring i-download ng Chrome OS device ang larawan ng wallpaper at isang cryptographic hash na ginagamit upang i-verify ang integridad ng pag-download. Dapat ay nasa format na JPEG ang larawan, at hindi dapat lumampas ang laki ng file sa 16MB. Dapat ay naa-access ang URL nang walang anumang pag-authenticate. Na-download at na-cache ang larawan ng wallpaper. Ida-download itong muli sa tuwing magbabago ang URL o ang hash.
-
-      Dapat ay tukuyin ang patakaran bilang isang string na nagpapakita ng URL at hash sa format na JSON, hal.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Kung nakatakda ang patakaran sa wallpaper ng device, ida-download at gagamitin ng Chrome OS device ang larawan ng wallpaper sa screen ng pag-login kung wala pang naka-sign in na user sa device. Kapag naka-login na ang user, ilalapat na ang patakaran sa wallpaper ng user.
-
-      Kung hindi nakatakda ang patakaran sa wallpaper ng device, ang patakaran sa wallpaper ng user ang magpapasya kung ano ang ipapakita kung nakatakda na ang patakaran sa wallpaper ng user.</translation>
 <translation id="9217154963008402249">Dalas ng mga sinusubaybayang network packet</translation>
 <translation id="922540222991413931">Mag-configure ng mga pinagmulan ng pag-install ng extension, app, at script ng user</translation>
 <translation id="924557436754151212">Mag-import ng mga naka-save na password mula sa default na browser sa unang pagtakbo</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index d0179d4..9f2a536a 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -415,7 +415,6 @@
 
       Avertissement : Il est recommandé de ne pas déléguer le contrôle de la version de <ph name="PRODUCT_OS_NAME" /> à une application kiosque, car l'appareil risque de ne pas recevoir les mises à jour logicielles et les correctifs de sécurité essentiels. La délégation du contrôle de la version de <ph name="PRODUCT_OS_NAME" /> pourrait constituer un risque pour les utilisateurs.</translation>
 <translation id="1675002386741412210">Compatible avec :</translation>
-<translation id="1689963000958717134">Permet de transférer l'application de la configuration réseau à tous les utilisateurs d'un appareil fonctionnant avec <ph name="PRODUCT_OS_NAME" />. La configuration réseau correspond à une chaîne formatée par JSON conformément au format de configuration de réseau ouvert, décrit à l'adresse <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="1704516734140344991">Configure la disponibilité et le comportement de la fonctionnalité de mise à jour du micrologiciel <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Les paramètres individuels peuvent être spécifiés dans les propriétés JSON :
@@ -979,16 +978,6 @@
       Si vous désactivez ce paramètre, les pages Web ne peuvent pas utiliser JavaScript et l'utilisateur n'est pas en mesure de le modifier.
 
       Si vous activez ce paramètre ou si vous ne le définissez pas, les pages Web peuvent utiliser JavaScript, mais l'utilisateur n'est pas en mesure de le modifier.</translation>
-<translation id="2747157663401642394">Configure les paramètres de gestion des extensions pour <ph name="PRODUCT_NAME" />.
-
-          Cette règle contrôle plusieurs paramètres, y compris ceux contrôlés par des règles existantes associées à une extension. Le cas échéant, elle remplace les anciennes règles.
-
-          Cette règle fait correspondre un ID d'extension ou une URL de mise à jour avec sa configuration. Avec un ID d'extension, la configuration n'est appliquée qu'à l'extension spécifiée. Une configuration par défaut peut être définie pour l'ID spécial <ph name="DEFAULT_SCOPE" />, lequel s'applique à toutes les extensions pour lesquelles aucune configuration personnalisée n'est définie dans cette règle. Avec une URL de mise à jour, la configuration est appliquée à l'ensemble des extensions avec l'URL de mise à jour telle qu'elle est indiquée dans le fichier manifeste de cette extension, comme indiqué sur la page <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Pour les instances Windows qui ne sont pas associées à un domaine <ph name="MS_AD_NAME" />, l'installation d'office est limitée aux applications et aux extensions répertoriées sur le Chrome Web Store.
-
-          Pour accéder à une description complète de la structure et des paramètres possibles pour cette règle, veuillez consulter la page https://www.chromium.org/administrators/policy-list-3/extension-settings-full.
-          </translation>
 <translation id="2753637905605932878">Restreindre la portée des ports UDP locaux utilisés par WebRTC</translation>
 <translation id="2757054304033424106">Types d'extensions ou d'applications autorisés à être installés</translation>
 <translation id="2758084448533744848">Indique le fuseau horaire à utiliser sur l'appareil. Si cette règle est configurée, les utilisateurs de l'appareil ne peuvent pas remplacer le fuseau horaire spécifié. Si une valeur non valide est utilisée, la règle est toutefois activée avec le fuseau horaire "GMT". Si une chaîne vide est utilisée, cette règle est ignorée.
@@ -1755,30 +1744,6 @@
       Cette règle ne concerne que les utilisateurs qui s'authentifient avec SAML.</translation>
 <translation id="4105989332710272578">Désactiver l'application des règles de transparence des certificats pour une liste d'URL</translation>
 <translation id="4121350739760194865">Empêcher les promotions pour des applications de s'afficher sur la page Nouvel onglet</translation>
-<translation id="4125606414556046117">Cette règle vous permet de configurer l'image de fond d'écran qui s'affiche sur le bureau et en arrière-plan sur l'écran de connexion de l'utilisateur. Pour la configurer, vous devez indiquer l'URL depuis laquelle <ph name="PRODUCT_OS_NAME" /> peut télécharger l'image de fond d'écran et un hachage chiffré utilisé pour vérifier l'intégrité du téléchargement. L'image doit être au format JPEG, et sa taille ne doit pas dépasser 16 Mo. L'URL doit être accessible sans authentification.
-
-      L'image de fond d'écran est téléchargée et mise en cache. Elle sera de nouveau téléchargée à chaque modification de l'URL ou du hachage.
-
-      Cette règle doit être spécifiée sous la forme d'une chaîne qui exprime l'URL et le hachage au format JSON, conformément au format suivant :
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL depuis laquelle l'image de fond d'écran peut être téléchargée.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hachage SHA-256 de l'image de fond d'écran.",
-            "type": "string"
-          }
-        }
-      }
-
-      Si cette règle est définie, l'image de fond d'écran est téléchargée et utilisée dans <ph name="PRODUCT_OS_NAME" />.
-
-      Si vous définissez cette règle, les utilisateurs n'ont pas la possibilité de la modifier ni de l'ignorer.
-
-      Si la règle n'est pas définie, l'utilisateur peut choisir une image à afficher sur le bureau et en arrière-plan de l'écran de connexion.</translation>
 <translation id="412697421478384751">Autoriser les utilisateurs à définir des codes ayant un niveau de sécurité faible pour le code de l'écran de verrouillage</translation>
 <translation id="4138655880188755661">Période limite</translation>
 <translation id="4144164749344898721">Cette règle contrôle plusieurs paramètres pour la stratégie de gestion de l'alimentation lorsque l'utilisateur est inactif.
@@ -2739,53 +2704,6 @@
 
       Si cette règle n'est pas configurée ou si elle est définie sur "False", les commandes d'impressions génèrent un aperçu avant impression.</translation>
 <translation id="6022948604095165524">Action au démarrage</translation>
-<translation id="6023030044732320798">Indique un ensemble de règles transmises à l'exécution ARC. Un fichier JSON valide doit être spécifié.
-
-      Cette règle peut être utilisée pour configurer les applications Android automatiquement installées sur l'appareil :
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identifiant de l'application Android, p. ex. "com.google.android.gm" pour Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Indique la façon dont s'installe une application. OPTIONAL : l'application ne s'installe pas automatiquement, mais l'utilisateur peut l'installer. Il s'agit du réglage par défaut si cette règle n'est pas spécifiée. PRELOAD : l'application s'installe automatiquement, mais l'utilisateur peut la désinstaller. FORCE_INSTALLED : l'application s'installe automatiquement, et l'utilisateur ne peut pas la désinstaller. BLOCKED : l'application est bloquée et ne peut pas être installée. Si l'application a été installée dans le cadre d'une ancienne règle, elle sera désinstallée.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Règle pour répondre aux demandes d'autorisation des applications. PERMISSION_POLICY_UNSPECIFIED : règle non spécifiée. Si aucune règle n'est spécifiée pour une autorisation à quelque niveau que ce soit, le comportement `PROMPT` est utilisé par défaut. PROMPT : demander à l'utilisateur d'accorder une autorisation. GRANT : accorder automatiquement une autorisation. DENY : refuser automatiquement une autorisation.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Objet de configuration JSON propre à l'application avec un ensemble de paires clé/valeur, p. ex. '"managedConfiguration": { "key1": value1, "key2": value2 }'. Les clés sont définies dans le fichier manifeste de l'application.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Pour épingler des applications sur le lanceur d'applications, reportez-vous à PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL de recherche instantanée du moteur de recherche par défaut</translation>
 <translation id="603410445099326293">Paramètres pour l'URL de suggestion utilisant POST</translation>
 <translation id="6034341625190551415">Contrôle les types de comptes kiosque et les sessions publiques.</translation>
@@ -3139,37 +3057,6 @@
       Si cette règle est définie sur "False", le client DNS intégré n'est jamais utilisé.
 
       Si cette règle n'est pas configurée, le client DNS intégré est activé par défaut sur Mac OS, Android (lorsque ni le DNS privé, ni le VPN ne sont activés) et Chrome OS, et l'utilisateur peut choisir si le client DNS intégré doit être utilisé ou non, soit en modifiant chrome://flags, soit à l'aide d'un indicateur de ligne de commande.</translation>
-<translation id="6838056959556423778">Remplace les instructions de sélection de l'imprimante par défaut pour <ph name="PRODUCT_NAME" />.
-
-      Cette règle détermine les instructions de sélection de l'imprimante par défaut dans <ph name="PRODUCT_NAME" />, la première fois que la fonction d'impression est utilisée avec un profil donné.
-
-      Si cette règle est définie, <ph name="PRODUCT_NAME" /> essaie de trouver une imprimante correspondant à tous les attributs spécifiés et la définit comme imprimante par défaut. La première imprimante retenue d'après ces critères est sélectionnée. Si plusieurs imprimantes correspondent aux attributs spécifiés, l'une d'entre elles est sélectionnée (selon l'ordre dans lequel elles ont été découvertes).
-
-      Si cette règle n'est pas définie ou si aucune imprimante n'est retenue dans le délai imparti, l'imprimante par défaut est l'imprimante PDF intégrée à l'outil. Si l'imprimante PDF n'est pas disponible, aucune imprimante n'est sélectionnée.
-
-      La valeur est analysée en tant qu'objet JSON, conformément au schéma suivant :
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Pour limiter ou ne pas limiter la recherche d'une imprimante correspondant aux critères spécifiés à un groupe d'imprimantes spécifique",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Expression régulière correspondant à l'ID de l'imprimante",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Expression régulière correspondant au nom à afficher de l'imprimante",
-            "type": "string"
-          }
-        }
-      }
-
-      Les imprimantes connectées à <ph name="CLOUD_PRINT_NAME" /> sont considérées comme étant de type <ph name="PRINTER_TYPE_CLOUD" />, et les autres sont de type <ph name="PRINTER_TYPE_LOCAL" />.
-      Si vous ne renseignez pas un champ, cela signifie que toutes les valeurs seront prises en compte. Par exemple, si vous ne spécifiez pas de connectivité, l'aperçu avant impression propose toutes sortes d'imprimantes, à la fois de type "local" et "cloud".
-      Les schémas d'expressions régulières doivent suivre la syntaxe JavaScript RegExp, et les résultats sont sensibles à la casse.</translation>
 <translation id="6843296367238757293">Cette règle est obsolète. Nous vous déconseillons de l'utiliser. Pour en savoir plus, rendez-vous sur https://support.google.com/chrome/a/answer/7643500.</translation>
 <translation id="684856667300805181">Cette règle a été supprimée dans <ph name="PRODUCT_NAME" /> 68 et remplacée par <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Cette règle désormais obsolète a été supprimée dans M66, car elle servait uniquement aux tests internes et ne permettait pas de garantir la sécurité.
@@ -4327,30 +4214,6 @@
       Cette règle n'affecte que les utilisateurs qui se sont authentifiés via SAML.
 
       La valeur doit être indiquée en secondes.</translation>
-<translation id="9027787254195333560">Cette règle vous permet de configurer l'image d'avatar représentant l'utilisateur sur l'écran de connexion. Pour définir cette règle, indiquez l'URL à laquelle <ph name="PRODUCT_OS_NAME" /> peut télécharger l'image d'avatar, ainsi qu'un hachage chiffré, utilisé pour vérifier l'intégrité du téléchargement. L'image doit être au format JPEG et ne doit pas dépasser 512 Ko. L'URL doit être accessible sans authentification.
-
-      L'image d'avatar est téléchargée et mise en cache. Elle sera de nouveau téléchargée à chaque modification de l'URL ou du hachage.
-
-      Cette règle doit être spécifiée sous la forme d'une chaîne qui exprime l'URL et le hachage au format JSON, conformément au format suivant :
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL depuis laquelle l'image de l'avatar peut être téléchargée.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hachage SHA-256 de l'image de l'avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Si cette règle est définie, l'image de l'avatar est téléchargée et utilisée dans <ph name="PRODUCT_OS_NAME" />.
-
-      Si vous définissez cette règle, les utilisateurs n'ont pas la possibilité de la modifier ni de l'ignorer.
-
-      Si la règle n'est pas définie, l'utilisateur peut choisir l'image de l'avatar qui le représente dans l'écran de connexion.</translation>
 <translation id="9035964157729712237">Identifiants d'extension à exclure de la liste noire</translation>
 <translation id="9038058011835642205">Définit la liste des sites Web qui sont installés silencieusement, sans aucune intervention de l'utilisateur, et que ce dernier ne peut pas désinstaller ni désactiver.
 
@@ -4363,7 +4226,6 @@
       Si vous définissez cette règle, les utilisateurs n'ont pas la possibilité de la modifier ni de l'ignorer.
 
       La valeur de la règle doit être indiquée en millisecondes. Cette valeur doit être comprise entre 30 secondes et 24 heures.</translation>
-<translation id="9042911395677044526">Permet de transférer l'application de la configuration réseau par utilisateur vers un appareil utilisant <ph name="PRODUCT_OS_NAME" />. La configuration réseau correspond à une chaîne formatée par JSON conformément au format de configuration de réseau ouvert, décrit sous <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="9050853837490399534">Cette règle détermine si un build Quick Fix doit être installé sur l'appareil.
 
       Si la règle est définie sur un jeton qui correspond à un build Quick Fix, l'appareil sera mis à jour avec le build Quick Fix correspondant à condition que la mise à jour ne soit pas bloquée par une autre règle.
@@ -4441,17 +4303,6 @@
       Si la règle n'est pas définie, l'utilisateur peut décider d'imprimer les en-têtes et les pieds de page.
       Si la règle est définie sur False, "En-têtes et pieds de page" n'est pas sélectionné dans la boîte de dialogue d'aperçu avant impression et l'utilisateur ne peut pas le modifier.
       Si la règle est définie sur True, "En-têtes et pieds de page" est sélectionné dans la boîte de dialogue d'aperçu avant impression et l'utilisateur ne peut pas le modifier.</translation>
-<translation id="9213347477683611358">Configurez l'image de fond d'écran qui s'affiche sur l'écran de connexion de l'appareil si aucun utilisateur ne s'est encore connecté à celui-ci. Pour définir cette règle, indiquez l'URL à laquelle l'appareil Chrome OS peut télécharger l'image de fond d'écran ainsi qu'un hachage chiffré, utilisé pour vérifier l'intégrité du téléchargement. L'image doit être au format JPEG et ne doit pas dépasser 16 Mo. L'URL doit être accessible sans authentification. L'image de fond d'écran est téléchargée et mise en cache. Elle est à nouveau téléchargée dès que l'URL ou le hachage sont modifiés.
-
-      La règle doit prendre la forme d'une chaîne indiquant l'URL et le hachage au format JSON, conformément à l'exemple suivant :
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Si la règle du fond d'écran de l'appareil est définie, l'appareil Chrome OS télécharge et utilise l'image de fond d'écran sur l'écran de connexion si personne ne s'est encore connecté à l'appareil. Dès qu'un utilisateur se connecte, la règle de fond d'écran de cet utilisateur s'applique.
-
-      Si vous ne configurez pas la règle de fond d'écran de l'appareil, et si la règle de fond d'écran de l'utilisateur est définie, cette dernière détermine le contenu à afficher.</translation>
 <translation id="9217154963008402249">Fréquence des paquets réseau de contrôle</translation>
 <translation id="922540222991413931">Configurer les sources d'installation des extensions, des applications et des scripts d'utilisateur</translation>
 <translation id="924557436754151212">Importer les mots de passe enregistrés du navigateur par défaut à la première exécution</translation>
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index c8e1008..a7e9834 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -414,7 +414,6 @@
 
       ચેતવણી: <ph name="PRODUCT_OS_NAME" /> વર્ઝનના નિયંત્રણના અધિકારને કોઈ કિઓસ્ક ઍપ્લિકેશનને સોંપવાની ભલામણ કરવામાં આવતી નથી, કેમકે તે વપરાશકર્તાઓને સોફ્ટવેર અપડેટ અને મહત્ત્વપૂર્ણ સુરક્ષા ફિક્સેસ પ્રાપ્ત કરવાથી અટકાવી શકે છે. <ph name="PRODUCT_OS_NAME" /> વર્ઝનના નિયંત્રણના અધિકાર સોંપવાથી વપરાશકર્તાઓ જોખમમાં મૂકાઈ શકે છે.</translation>
 <translation id="1675002386741412210">આના પર સપોર્ટેડ:</translation>
-<translation id="1689963000958717134"><ph name="PRODUCT_OS_NAME" /> ઉપકરણના બધા વપરાશકર્તાઓ માટે પુશિંગ નેટવર્ક ગોઠવણીને લાગુ કરવાનું મંજૂર કરે છે. નેટવર્ક ગોઠવણી <ph name="ONC_SPEC_URL" /> પર વર્ણવેલા ઑપન નેટવર્ક ગોઠવણી ફોર્મેટ દ્વારા નિર્ધારિત કર્યા મુજબની એક JSON-ફોર્મેટેડ સ્ટ્રિંગ છે</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> ફર્મવેયર અપડેટની કાર્યક્ષમતાની ઉપલબ્ધતા અને વર્તણૂકની ગોઠવણી કરે છે.
 
       વ્યક્તિગત સેટિંગનો ઉલ્લેખ JSON પ્રોપર્ટીમાં કરી શકાય છે:
@@ -960,16 +959,6 @@
       જો આ સેટિંગ અક્ષમ છે, તો વેબ પૃષ્ઠો JavaScript નો ઉપયોગ કરી શકતા નથી અને વપરાશકર્તા તે સેટિંગ બદલી શકતા નથી.
 
       જો આ સેટિંગ સક્ષમ છે, તો વેબ પૃષ્ઠો JavaScript નો ઉપયોગ કરી શકે છે અને વપરાશકર્તા તે સેટિંગ બદલી શકે છે.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> માટે એક્સ્ટેન્શન મેનેજમેન્ટ સેટિંગને ગોઠવે છે.
-
-          આ પૉલિસી એક્સ્ટેન્શનથી સંબંધિત કોઈપણ અસ્તિત્વમાં રહેલી પૉલિસી દ્વારા નિયંત્રિત સેટિંગ સહિત એકથી વધુ સેટિંગને નિયંત્રિત કરે છે. જો બન્ને સેટ કરેલી હોય તો આ પૉલિસી કોઈપણ જૂની પૉલિસીને ઓવરરાઇડ કરશે.
-
-          આ પૉલિસી તેની ગોઠવણી માટે એક્સ્ટેન્શન ID અથવા અપડેટ URLને મૅપ કરે છે. એક્સ્ટેન્શન ID વડે, ગોઠવણી ફક્ત ઉલ્લેખિત એક્સ્ટેન્શન પર જ લાગુ કરવામાં આવશે. વિશિષ્ટ ID <ph name="DEFAULT_SCOPE" /> માટે ડિફૉલ્ટ ગોઠવણી સેટ કરવામાં આવી શકે છે, જે આ પૉલિસીમાં કસ્ટમ ગોઠવણી સેટ ન ધરાવતા બધા એક્સ્ટેન્શન પર લાગુ થશે. અપડેટ URL વડે, <ph name="LINK_TO_EXTENSION_DOC1" /> પર વર્ણવ્યાં મુજબ આ એક્સ્ટેન્શનના મેનિફેસ્ટમાં ઉલ્લેખિત ચોક્કસ અપડેટ URL ધરાવતા બધા એક્સ્ટેન્શન પર લાગુ કરવામાં આવશે.
-
-           <ph name="MS_AD_NAME" /> ડોમેન સાથે જોડાયેલી ન હોય એવી Windows આવૃત્તિ માટે, ફરજિયાત ઇન્સ્ટૉલેશન Chrome વેબ સ્ટોરમાં સૂચિબદ્ધ ઍપ અને એક્સ્ટેન્શન પૂરતું મર્યાદિત છે.
-
-          આ પૉલિસીનાં સંભવિત સેટિંગ અને સંરચનાના પૂર્ણ વર્ણન માટે, કૃપા કરીને https://www.chromium.org/administrators/policy-list-3/extension-settings-fullની મુલાકાત લો
-          </translation>
 <translation id="2753637905605932878">WebRTC દ્વારા ઉપયોગમાં લેવાતાં સ્થાનિક UDP પોર્ટ્સની શ્રેણીને સીમિત કરો</translation>
 <translation id="2757054304033424106">એક્સ્ટેન્શન્સ/એપ્લિકેશન્સના પ્રકાર છે કે જે ઇન્સ્ટોલ કરવાની મંજૂરી છે</translation>
 <translation id="2758084448533744848">ડિવાઇસમાં ઉપયોગ કરવાના લાગુ કરેલા સમયઝોનનો ઉલ્લેખ કરે છે. જ્યારે આ નીતિ સેટ કરી હોય, ત્યારે ડિવાઇસના વપરાશકર્તાઓ ઉલ્લેખિત સમયઝોનને ઓવરરાઇડ કરી શકતા નથી. જો અમાન્ય મૂલ્ય પ્રદાન કરવામાં આવે, તો નીતિ ત્યારે પણ તેના બદલે "GMT"નો ઉપયોગ કરીને સક્રિય કરવામાં આવે છે. જો ખાલી સ્ટ્રિંગ પ્રદાન કરવામાં આવે, તો નીતિને અવગણવામાં આવે છે.
@@ -1736,30 +1725,6 @@
       આ નીતિ માત્ર SAMLનો ઉપયોગ કરીને પ્રમાણીકરણ કરતા વપરાશકર્તાઓને અસર કરે છે.</translation>
 <translation id="4105989332710272578">URL ની સૂચિ માટે પ્રમાણપત્ર પારદર્શિતા અમલીકરણ બંધ કરો</translation>
 <translation id="4121350739760194865">ઍપ્લિકેશન  પ્રમોશનને નવા ટૅબ પૃષ્ઠ પર દેખાવાથી અટકાવો</translation>
-<translation id="4125606414556046117">આ નીતિથી તમે ડેસ્કટૉપ પર અને વપરાશકર્તા માટે લોગિન સ્ક્રીન બૅકગ્રાઉન્ડમાં બતાવવામાં આવી રહેલ વૉલપેપર છબીને ગોઠવી શકો છો. <ph name="PRODUCT_OS_NAME" /> જ્યાંથી ડાઉનલોડ કરી શકે છે તે URLનો ઉલ્લેખ કરીને નીતિ સેટ કરી છે અને ડાઉનલોડની પ્રમાણિકતાને ચકાસવા માટે ક્રિપ્ટોગ્રાફિક હૅશનો ઉપયોગ કર્યો છે. છબી JPEG ફૉર્મેટમાં હોવી આવશ્યક છે, તેનું કદ 16MB ને વટાવી શકતું નથી. URL કોઈપણ પ્રમાણીકરણ વિના ઍક્સેસિબલ હોવું આવશ્યક છે.
-
-      વૉલપેપર છબી ડાઉનલોડ કરી અને કેશ કરી છે. જ્યારે પણ URL અથવા હૅશ બદલાય ત્યારે તે ફરીથી ડાઉનલોડ કરવામાં આવશે.
-
-      નીચેની સ્કીમાનું પાલન કરીને નીતિને URL અને JSON ફૉર્મેટમાં વ્યક્ત કરતી સ્ટ્રિંગ તરીકે ઉલ્લેખિત કરવી જોઈએ:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL કે જેમાંથી વૉલપેપર છબી ડાઉનલોડ કરી શકાય છે.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "વૉલપેપર છબીનું SHA-256 હૅશ.",
-            "type": "string"
-          }
-        }
-      }
-
-      જો આ નીતિ સેટ કરેલી છે, તો <ph name="PRODUCT_OS_NAME" /> વૉલપેપર છબી ડાઉનલોડ કરશે અને ઉપયોગમાં લેશે.
-
-      જો તમે આ નીતિને સેટ કરો છો, તો વપરાશકર્તાઓ તેને બદલી અથવા ઓવરરાઇડ કરી શકતાં નથી.
-
-      જો આ નીતિ સેટ કર્યા વિના છોડી દીધી હોય, તો વપરાશકર્તા ડેસ્કટૉપ પર અને લોગિન સ્ક્રીન બૅકગ્રાઉન્ડ પર બતાવવામાં આવેલ છબીને પસંદ કરી શકે છે.</translation>
 <translation id="412697421478384751">વપરાશકર્તાઓને લૉક સ્ક્રીન પિન તરીકે નબળા પિન સેટ કરવા દેવાનું ચાલુ કરો</translation>
 <translation id="4138655880188755661">સમય મર્યાદા</translation>
 <translation id="4144164749344898721">જ્યારે વપરાશકર્તા નિષ્ક્રિય થાય ત્યારે આ નીતિ પાવર મેનેજમેન્ટ વ્યૂહરચના માટે એકથી વધુ સેટિંગને નિયંત્રિત કરે છે.
@@ -2718,53 +2683,6 @@
 
       જો આ નીતિ સેટ નથી અથવા તે ખોટા પર સેટ છે, તો પ્રિન્ટ આદેશો પ્રિન્ટ પ્રીવ્યૂ સ્ક્રીનને ટ્રિગર કરે છે.</translation>
 <translation id="6022948604095165524">સ્ટાર્ટઅપ પર ક્રિયા</translation>
-<translation id="6023030044732320798">નીતિઓનો એ સેટ ઉલ્લેખિત કરે છે જે ARC રનટાઇમને સોંપવામાં આવશે. મૂલ્ય માન્ય JSON હોવું જોઈએ.
-
-      ડિવાઇસમાં કઈ Android ઍપ ઑટોમૅટિક રીતે ઇન્સ્ટૉલ થાય તેની ગોઠવણ કરવા માટે આ નીતિનો ઉપયોગ થઈ શકે છે:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android app identifier, e.g. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Specifies how an app is installed. OPTIONAL: The app is not installed automatically, but the user can install it. This is the default if this policy is not specified. PRELOAD: The app is installed automatically, but the user can uninstall it. FORCE_INSTALLED: The app is installed automatically and the user cannot uninstall it. BLOCKED: The app is blocked and cannot be installed. If the app was installed under a previous policy it will be uninstalled.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Policy for granting permission requests to apps. PERMISSION_POLICY_UNSPECIFIED: Policy not specified. If no policy is specified for a permission at any level, then the `PROMPT` behavior is used by default. PROMPT: Prompt the user to grant a permission. GRANT: Automatically grant a permission. DENY: Automatically deny a permission.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "App-specific JSON configuration object with a set of key-value pairs, e.g. '"managedConfiguration": { "key1": value1, "key2": value2 }'. The keys are defined in the app manifest.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      લૉન્ચર પર ઍપને પિન કરવા માટે, PinnedLauncherApps જુઓ.</translation>
 <translation id="602728333950205286">ડિફોલ્ટ શોધ પ્રદાતા ત્વરિત URL</translation>
 <translation id="603410445099326293">POST નો ઉપયોગ કરતી URL સૂચવવા માટેના પેરામીટર્સ</translation>
 <translation id="6034341625190551415">સાર્વજનિક સત્ર અને કિઓસ્ક પ્રકારના એકાઉન્ટનું નિયંત્રણ કરે છે.</translation>
@@ -3112,36 +3030,6 @@
       જો આ પૉલિસી false પર સેટ હોય, તો બિલ્ટ-ઇન DNS ક્લાયન્ટનો ઉપયોગ ક્યારેય થશે નહીં.
 
       જો આ પૉલિસી સેટ કર્યા વગર છોડી હોય, તો બિલ્ટ-ઇન DNS ક્લાયન્ટને MacOS, Android (ખાનગી DNS અથવા VPN ચાલુ ન હોવા પર) અને ChromeOS પર ડિફૉલ્ટ રૂપથી સેટ કરવામાં આવશે અને ઉપયોગકર્તા chrome://flagsમાં ફેરફાર કરીને કે આદેશ-રેખા ધ્વજનો ઉલ્લેખ કરીને બિલ્ટ-ઇન DNS ક્લાયન્ટનો ઉપયોગ કરવો કે કેમ તેમાં ફેરફાર કરી શકશે.</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> ડિફૉલ્ટ પ્રિન્ટર પસંદગી નિયમોને ઓવરરાઇડ કરે છે.
-
-      આ નીતિ <ph name="PRODUCT_NAME" />માં ડિફૉલ્ટ પ્રિન્ટર પસંદ કરવાના નિયમો નક્કી કરે છે, જે પ્રોફાઇલ સાથે પ્રિન્ટનું કાર્ય પ્રથમ વખત થાય ત્યારે ઉપયોગમાં લેવાય છે.
-      જ્યારે આ નીતિ સેટ કરેલ હોય, ત્યારે <ph name="PRODUCT_NAME" /> આપેલ બધી જ વિશેષતાઓ સાથે મેળ ખાતું પ્રિન્ટર શોધવાનો પ્રયત્ન કરશે અને તેને ડિફૉલ્ટ પ્રિન્ટર તરીકે પસંદ કરશે. નીતિ સાથે મેળ ખાતું જે પ્રથમ પ્રિન્ટર મળે તે પસંદ કરવામાં આવે છે, અને જો એક કરતાં વધારે પ્રિન્ટર મળે, તો પ્રિન્ટર શોધાયાના ક્રમના આધારે કોઈપણ મેળ ખાતું પ્રિન્ટર પસંદ કરી શકાશે.
-
-      જો આ નીતિ સેટ કરવામાં આવી ન હોય અથવા સમય સમાપ્ત થતા સુધીમાં મેળ ખાતું પ્રિન્ટર ન મળે, તો પ્રિન્ટર ડિફૉલ્ટ તરીકે બિલ્ટ-ઇન PDF પ્રિન્ટર પસંદ કરે છે અથવા જ્યારે PDF પ્રિન્ટર ઉપલબ્ધ ન હોય તેવા કિસ્સામાં ડિફૉલ્ટ તરીકે પ્રિન્ટર પસંદ કરેલ નથી બતાવે છે.
-
-      આ મૂલ્યનું, નીચે આપેલ સ્કીમાને કન્ફર્મ કરે તે રીતે, JSON ઑબ્જેક્ટ તરીકે વિશ્લેષણ કરાય છે:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Whether to limit the search of the matching printer to a specific set of printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regular expression to match printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regular expression to match printer display name.",
-            "type": "string"
-          }
-        }
-      }
-
-      <ph name="CLOUD_PRINT_NAME" /> સાથે કનેક્ટ કરેલાં પ્રિન્ટર <ph name="PRINTER_TYPE_CLOUD" /> ગણાય છે, અને બાકીનાં પ્રિન્ટર <ph name="PRINTER_TYPE_LOCAL" /> તરીકે વર્ગીકૃત કરાય છે.
-      કોઈ ફીલ્ડ છોડી દેવાનો અર્થ એ કે, બધાં મૂલ્ય મેળ ખાય છે, ઉદાહરણ તરીકે, કનેક્ટિવિટી સ્પષ્ટ ન કરવાને પરિણામે પ્રિન્ટ પ્રિવ્યૂ, સ્થાનિક અને ક્લાઉડ, એમ તમામ પ્રકારના પ્રિન્ટર શોધવાનું શરૂ કરશે.
-      નિયમિત એક્સપ્રેશન પૅટર્ન, JavaScript RegExp સિન્ટેક્સને ફૉલો કરતી હોવી જોઈએ તેમજ મેચ કેસ સેન્સિટિવ હોય છે.</translation>
 <translation id="6843296367238757293">આ પૉલિસી ટાળવામાં આવી છે. તેનો વપરાશ ન કરવાની સલાહ આપવામાં આવે છે. https://support.google.com/chrome/a/answer/7643500 પર વધુ વાંચો</translation>
 <translation id="684856667300805181">આ નીતિ <ph name="PRODUCT_NAME" /> 68માંથી કાઢી નાખવામાં આવી હતી અને તેના બદલે <ph name="ARC_GLS_POLICY_NAME" /> આવી હતી.</translation>
 <translation id="6856743875250214792">આ નીતિ M66માં ટાળવામાં અને કાઢી નાખવામાં આવી છે, કારણ કે તે માત્ર આંતરિક પરીક્ષણ માટે ઉપયોગ કરવામાં આવતી હતી અને તે એક સુરક્ષા જવાબદારી છે.
@@ -4312,30 +4200,6 @@
       આ નીતિ માત્ર SAMLનો ઉપયોગ કરીને પ્રમાણીકૃત થયેલ વપરાશકર્તાઓને પ્રભાવિત કરે છે.
 
       નીતિ મૂલ્યનો ઉલ્લેખ સેકંડમાં કરવો જોઈએ.</translation>
-<translation id="9027787254195333560">આ નીતિ લોગિન સ્ક્રીન પર વપરાશકર્તાને પ્રસ્તુત કરતી અવતાર છબીને ગોઠવવાની તમને મંજૂરી આપે છે. નીતિ તે URLને ઉલ્લેખિત કરીને સેટ કરી છે કે જેમાંથી <ph name="PRODUCT_OS_NAME" /> અવતાર છબી ડાઉનલોડ કરી શકે છે અને ક્રિપ્ટોગ્રાફિક હેશનો ઉપયોગ ડાઉનલોડની પ્રામાણિકતાને ચકાસવા માટે થાય છે. છબી JPEG ફોર્મેટમાં હોવી આવશ્યક છે, તેના કદે 512kB વટાવવા ન જોઈએ. URL કોઈપણ પ્રમાણીકરણ વિના ઍક્સેસિબલ હોવું આવશ્યક છે.
-
-      અવતાર છબી ડાઉનલોડ અને કેશ કરી છે. જ્યારે પણ URL અથવા હેશ બદલાય ત્યારે તે ફરીથી ડાઉનલોડ કરવામાં આવશે.
-
-      નીતિને એવી સ્ટ્રિંગ તરીકે ઉલ્લેખિત કરવી જોઈએ જે URL અને હેશને JSON ફોર્મેટમાં નીચેના સ્કીમાનું પાલન કરીને વ્યક્ત કરે છે:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL કે જેમાંથી અવતાર છબી ડાઉનલોડ કરી શકાય છે.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "અવતાર છબીનો SHA-1 હેશ.",
-            "type": "string"
-          }
-        }
-      }
-
-      જો આ નીતિ સેટ કરી છે, તો <ph name="PRODUCT_OS_NAME" /> ડાઉનલોડ કરવામાં આવશે અને અવતાર છબીનો ઉપયોગ કરશે.
-
-      જો તમે આ નીતિ સેટ કરો છો, તો વપરાશકર્તાઓ તેને બદલી અથવા ઓવરરાઇડ કરી શકતાં નથી.
-
-      જો આ નીતિ સેટ કર્યા વગરની રાખી છે, તો વપરાશકર્તા લોગિન સ્ક્રીન પર તેમને પ્રસ્તુત કરતી અવતાર છબી પસંદ કરી શકે છે..</translation>
 <translation id="9035964157729712237">બ્લેકલિસ્ટમાંથી છોડવા માટેના એક્સ્ટેંશન ID</translation>
 <translation id="9038058011835642205">એવી વેબસાઇટની સૂચિનો ઉલ્લેખ કરે છે કે જે વપરાશકર્તાની ક્રિયાપ્રતિક્રિયા વિના, સાઇલન્ટ રીતે ઇન્સ્ટૉલ થાય છે અને જેને વપરાશકર્તા અનઇન્સ્ટૉલ કે બંધ કરી શકતા નથી.
 
@@ -4348,7 +4212,6 @@
       જો તમે આ નીતિ સેટ કરતા નથી, તો વપરાશકર્તાઓ તેને બદલી કે ઓવરરાઇડ કરી શકતા નથી.
 
       મૂલ્ય મિલિસેકન્ડમાં ઉલ્લેખિત હોવું જોઈએ. મૂલ્યો 30 સેકંડથી 24 કલાકની રેંજમાં જોડાયેલ હોય છે.</translation>
-<translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> ઉપકરણના વપરાશકર્તા-દીઠ પુશિંગ નેટવર્ક ગોઠવણીને લાગુ કરવાનું મંજૂર કરે છે. નેટવર્ક ગોઠવણી <ph name="ONC_SPEC_URL" /> પર વર્ણવેલા ઑપન નેટવર્ક ગોઠવણી ફૉર્મેટ દ્વારા નિર્ધારિત કર્યા મુજબની એક JSON-ફૉર્મેટેડ સ્ટ્રિંગ છે</translation>
 <translation id="9050853837490399534">આ નીતિ ડિવાઇસને ક્વિક ફિક્સ બિલ્ડ પર અપડેટ કરવું જોઈએ કે નહીં તે નિયંત્રિત કરે છે.
 
       જો આ નીતિ મૂલ્યને ક્વિક ફિક્સ બિલ્ડને મૅપ કરનારા ટોકન પર સેટ કરેલું હોય, ત્યારે જો તેને બીજી નીતિ દ્વારા બ્લૉક કરેલું ન હોય તો પછી ડિવાઇસને સંબંધિત ક્વિક ફિક્સ બિલ્ડ પર અપડેટ કરવામાં આવશે.
@@ -4429,17 +4292,6 @@
       નીતિ False પર સેટ કરવામાં આવી હોય, તો પ્રિન્ટ પ્રિવ્યૂ સંવાદમાં 'હેડર અને ફૂટર'નો વિકલ્પ પસંદ કરાતો નથી, તેમજ વપરાશકર્તા તે બદલી શકતા નથી.
 
       નીતિ True પર સેટ કરવામાં આવી હોય, તો પ્રિન્ટ પ્રિવ્યૂ સંવાદમાં 'હેડર અને ફૂટર'નો વિકલ્પ પસંદ કરવામાં આવે છે, તેમજ વપરાશકર્તા તે બદલી શકતા નથી.</translation>
-<translation id="9213347477683611358">તે ડિવાઇસ-સ્તર વૉલપેપર છબીને ગોઠવો કે જે જો કોઈ વપરાશકર્તાએ હજી પણ ડિવાઇસમાં સાઇન ઇન ન કર્યું હોવાની સ્થિતિમાં લોગિન સ્ક્રીન પર બતાવવામાં આવે છે. નીતિને તે URLનો ઉલ્લેખ કરીને સેટ કરવામાં આવે છે કે જેમાંથી Chrome OS ડિવાઇસ, ડાઉનલોડની અખંડતાને ચકાસવા માટે ઉપયોગમાં લેવાયેલ વૉલપેપર છબી અને ક્રિપ્ટોગ્રાફિક હૅશને ડાઉનલોડ કરી શકે છે. છબી JPEG ફોર્મેટમાં હોવી જરૂરી છે, તેનું ફાઇલ કદ 16MB ને ન ઓળંગે એ જરૂરી છે. URL કોઈ પણ પ્રમાણીકરણ વિના ઍક્સેસિબલ હોવું જરૂરી છે. વૉલપેપર છબી ડાઉનલોડ કરેલી અને કૅશ કરેલી છે. જ્યારે પણ URL અથવા હૅશ બદલાય ત્યારે તે ફરીથી ડાઉનલોડ કરવામાં આવશે.
-
-      નીતિને એક સ્ટ્રિંગ તરીકે ઉલ્લેખિત કરવી જોઈએ કે જે URL અને હૅશને JSON ફોર્મેટમાં પ્રસ્તુત કરે છે, ઉ.દા.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      જો ડિવાઇસ વૉલપેપર નીતિ સેટ કરેલ હોય, તો જો કોઈ વપરાશકર્તાએ હજી સુધી ડિવાઇસમાં સાઇન ઇન ન કર્યું હોવાની સ્થિતિમાં Chrome OS ડિવાઇસ, વૉલપેપર છબીને ડાઉનલોડ કરશે અને લોગિન સ્ક્રીન પર ઉપયોગમાં લેશે. એકવાર વપરાશકર્તા લોગ ઇન થઈ જાય, તે પછી વપરાશકર્તાની વૉલપેપર નીતિ લાગુ થાય છે.
-
-      જો ડિવાઇસ વૉલપેપર નીતિ સેટ કર્યા વિના છોડી હોય, તો વપરાશકર્તાની વૉલપેપર નીતિને એ નક્કી કરવાનું રહે છે કે જો વપરાશકર્તાની વૉલપેપર નીતિ સેટ કરેલ હોવા પર શું બતાવવામાં આવે.</translation>
 <translation id="9217154963008402249">નેટવર્ક પૅકેટ્સના નિરીક્ષણની તીવ્રતા</translation>
 <translation id="922540222991413931">એક્સટેન્શન, ઍપ્લિકેશન અને વપરાશકર્તા સ્ક્રિપ્ટ ઇન્સ્ટોલ સ્રોતોને ગોઠવો</translation>
 <translation id="924557436754151212">પહેલા ચલાવવા પર ડિફૉલ્ટ બ્રાઉઝરથી સાચવેલા પાસવર્ડ્સને આયાત કરો</translation>
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index 3963ebc..6cc49be 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -156,7 +156,7 @@
 
           अगर यह नीति सेट किए बिना छोड़ दी जाती है, तो सभी साइटों के लिए वैश्विक डिफ़ॉल्ट मान का इस्तेमाल या तो 'DefaultImagesSetting' नीति के सेट होने पर इससे किया जाएगा या फिर उपयोगकर्ता के निजी कॉन्फ़िगरेशन से किया जाएगा.
 
-          ध्यान दें कि पहले इस नीति को Android पर गलती से चालू कर दिया गया था लेकिन इस कार्यक्षमता ने कभी भी Android पर पूरी तरह से काम नहीं किया.</translation>
+          ध्यान दें कि पहले इस नीति को Android पर गलती से चालू कर दिया गया था लेकिन इस काम की क्षमता ने कभी भी Android पर पूरी तरह से काम नहीं किया.</translation>
 <translation id="1194005076170619046">अगर यह नीति चालू की गई हो, तो किसी सत्र के चालू होने और स्क्रीन लॉक नहीं होने के दौरान, लाल रंग का लॉगआउट करें बटन सिस्टम ट्रे में दिखाई देता है.
 
       अगर यह नीति बंद हो या इसके बारे में बताया न गया हो, तो सिस्टम ट्रे में लाल रंग का लॉगआउट करें बटन दिखाई देता है.</translation>
@@ -416,7 +416,6 @@
 
       चेतावनी: यह सुझाव नहीं दिया जाता है कि <ph name="PRODUCT_OS_NAME" /> वर्शन का नियंत्रण किसी किओस्क ऐप्लिकेशन को सौंपा जाए, क्योंकि इससे डिवाइस को सॉफ़्टवेयर अपडेट और ज़रूरी सुरक्षा समाधान नहीं मिल पाते हैं. <ph name="PRODUCT_OS_NAME" /> वर्शन का नियंत्रण सौंपने से उपयोगकर्ता जोखिम में पड़ सकते हैं.</translation>
 <translation id="1675002386741412210">इस पर समर्थित:</translation>
-<translation id="1689963000958717134">किसी <ph name="PRODUCT_OS_NAME" /> डिवाइस के सभी उपयोगकर्ताओं पर लागू होने के लिए नेटवर्क कॉन्फ़िगरेशन को पुश करने की अनुमति देती है. नेटवर्क कॉन्फ़िगरेशन, <ph name="ONC_SPEC_URL" /> में वर्णित ओपन नेटवर्क कॉन्फ़िगरेशन प्रारूप द्वारा परिभाषित JSON-प्रारूपण स्ट्रिंग होता है</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> फ़र्मवेयर अपडेट होने की क्षमता की मौजूदगी और व्यवहार को कॉन्फ़िगर करती है.
 
       जेएसओएन प्रॉपर्टी में अलग-अलग सेटिंग तय की जा सकती हैं:
@@ -976,16 +975,6 @@
       अगर यह सेटिंग के बंद है तो, वेब पेज JavaScript का उपयोग नहीं कर सकते और उपयोगकर्ता उस सेटिंग को बदल नहीं सकता.
 
       अगर यह सेटिंग चालू है या सेट नहीं है तो, वेब पेज JavaScript का उपयोग कर सकते हैं लेकिन उपयोगकर्ता उस सेटिंग को बदल सकता है.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> के लिए एक्सटेंशन प्रबंधन सेटिंग कॉन्फ़िगर करता है.
-
-यह नीति कई सेटिंग को नियंत्रित करती है. इसमें वे सेटिंग भी शामिल हैं, जाे किसी भी मौजूदा एक्सटेंशन से जुड़ी नीतियों से नियंत्रित की जाती हैं. अगर दोनों सेटिंग चालू हैं, तो यह नीति पुरानी नीतियों को बदल देगी.
-
-          यह नीति एक्सटेंशन आईडी या अपडेट यूआरएल को इसके कॉन्फ़िगरेशन में मैप करती है. एक्सटेंशन आईडी के ज़रिए, कॉन्फ़िगरेशन सिर्फ़ खास एक्सटेंशन पर ही लागू होगा. एक डिफ़ॉल्ट कॉन्फ़िगरेशन खास आईडी <ph name="DEFAULT_SCOPE" /> के लिए सेट किया जा सकता है, जो उन सभी एक्सटेंशन पर लागू होगा जिनके लिए इस नीति में कस्टम कॉन्फ़िगरेशन सेट नहीं है. अपडेट यूआरएल के ज़रिए, इस एक्सटेंशन के मेनिफ़ेस्ट में बताए गए समान अपडेट यूआरएल के साथ सभी एक्सटेंशन पर कॉन्फ़िगरेशन लागू किया जाएगा. ऐसा <ph name="LINK_TO_EXTENSION_DOC1" /> में बताया गया है.
-
-उन Windows इंस्टेंस के लिए जो किसी <ph name="MS_AD_NAME" /> डोमेन में शामिल नहीं हैं, 'Chrome वेब स्टोर' में शामिल ऐप्लिकेशन और एक्सटेंशन के लिए ही अनइंस्टॉल न किए जा सकने की सुविधा लागू हाेती है.
-
-          इस नीति की संभावित सेटिंग और बनावट की पूरी जानकारी के लिए, कृपया https://www.chromium.org/administrators/policy-list-3/extension-settings-full पर जाएं
-          </translation>
 <translation id="2753637905605932878">WebRTC द्वारा उपयोग किए जाने वाले स्थानीय UDP पोर्ट की सीमा प्रतिबंधित करें</translation>
 <translation id="2757054304033424106">एक्सटेंशन/ऐप्स  के ऐसे प्रकार जिन्हें इंस्टॉल किए जाने की अनुमति है</translation>
 <translation id="2758084448533744848">डिवाइस के लिए इस्तेमाल किए जाने वाले लागू किए गए समय क्षेत्र को बताती है. जब यह नीति सेट की जाती है, तो डिवाइस के उपयोगकर्ता बताए गए समय क्षेत्र को बदल नहीं सकते. अगर कोई गलत मान दिया जाता है, तो नीति इसके बजाय "GMT" का इस्तेमाल करके अब भी चालू रहती है. अगर कोई खाली स्ट्रिंग दी जाती है, तो नीति को अनदेखा कर दिया जाता है.
@@ -1247,7 +1236,7 @@
 
           अगर यह नीति सेट किए बिना छोड़ दी जाती है, तो सभी साइटों के लिए वैश्विक डिफ़ॉल्ट मान का इस्तेमाल या तो 'DefaultImagesSetting' नीति के सेट होने पर इससे किया जाएगा या फिर उपयोगकर्ता के निजी कॉन्फ़िगरेशन से किया जाएगा.
 
-          ध्यान दें कि पहले इस नीति को Android पर गलती से चालू कर दिया गया था लेकिन इस कार्यक्षमता ने कभी भी Android पर पूरी तरह से काम नहीं किया.</translation>
+          ध्यान दें कि पहले इस नीति को Android पर गलती से चालू कर दिया गया था लेकिन इस काम की क्षमता ने कभी भी Android पर पूरी तरह से काम नहीं किया.</translation>
 <translation id="3091832372132789233">उन डिवाइस की बैटरी चार्ज करें जिन्हें प्राथमिक रूप से किसी बाहरी पावर स्रोत से कनेक्ट किया गया है.</translation>
 <translation id="3096595567015595053">सक्षम प्‍लग इन की सूची</translation>
 <translation id="3101501961102569744">प्रॉक्सी सर्वर सेटिंग निर्दिष्ट करने का तरीका चुनें</translation>
@@ -1755,30 +1744,6 @@
       इस नीति का असर सिर्फ़ उन उपयोगकर्ताओं पर होता है जो पहचान की पुष्टि के लिए SAML का इस्तेमाल करते हैं.</translation>
 <translation id="4105989332710272578">यूआरएल की एक सूची के लिए 'प्रमाणपत्र पारदर्शिता' को लागू करना बंद करें</translation>
 <translation id="4121350739760194865">ऐप्‍लिकेशन प्रचार को नए टैब पेज पर दिखाई देने से रोकें</translation>
-<translation id="4125606414556046117">यह नीति आपको वह वॉलपेपर इमेज कॉन्फ़िगर करने देती है जिसे डेस्कटॉप पर और इस्तेमाल करने वाले के लॉगिन स्क्रीन बैकग्राउंड पर दिखाया जाता है. यह नीति सेट करने के लिए उस यूआरएल को तय किया जाता है जिससे <ph name="PRODUCT_OS_NAME" /> वॉलपेपर इमेज डाउनलोड कर सकता है. साथ ही, डाउनलोड की प्रमाणिकता की पुष्टि करने के लिए क्रिप्टोग्राफ़िक हैश का इस्तेमाल किया जाता है. इमेज जेपीईजी फ़ॉर्मैट में होनी चाहिए, इसका आकार 16 एमबी से ज़्यादा नहीं होना चाहिए. यूआरएल ऐसा होना चाहिए जिसे बिना किसी प्रमाणीकरण के एक्सेस किया जा सके.
-
-      वॉलपेपर इमेज को डाउनलोड और कैश कर लिया गया है. जब भी यूआरएल या हैश बदलेगा इसे फिर से डाउनलोड किया जाएगा.
-
-      नीति को एक ऐसी स्ट्रिंग के तौर पर दिया जाना चाहिए जो नीचे बताए गए स्कीमा का अनुसरण करते हुए यूआरएल और हैश को JSON फ़ॉर्मैट में बताए.
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "यूआरएल जहां से वॉलपेपर इमेज को डाउनलोड किया जा सकता है.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "वॉलपेपर इमेज का हैश SHA-256.",
-            "type": "string"
-          }
-        }
-      }
-
-     अगर यह नीति सेट होती है, तो <ph name="PRODUCT_OS_NAME" /> वॉलपेपर इमेज को डाउनलोड और इस्तेमाल करेगा.
-
-      अगर आप यह नीति सेट करते हैं, तो इस्तेमाल करने वाले लोग न तो इसे बदल सकते हैं, न ही ओवरराइड कर सकते हैं.
-
-      अगर नीति को सेट नहीं करते हैं, तो उपयोगकर्ता डेस्कटॉप और लॉगिन स्क्रीन बैकग्राउंड पर दिखाने के लिए इमेज चुन सकता है.</translation>
 <translation id="412697421478384751">उपयोगकर्ताओं को लॉक स्क्रीन पिन के लिए कमज़ोर पिन सेट करने देती है</translation>
 <translation id="4138655880188755661">समय सीमा</translation>
 <translation id="4144164749344898721">यह नीति, इस्तेमाल करने वाले की ओर से कोई गतिविधि न होने पर, पावर प्रबंधन रणनीति के लिए एक से ज़्यादा सेटिंग नियंत्रित करती है.
@@ -2098,7 +2063,7 @@
 <translation id="4832852360828533362">उपयोगकर्ता और डिवाइस की रिपोर्ट करना</translation>
 <translation id="4834526953114077364">काफ़ी खाली स्‍थान नहीं होने तक, हाल ही में सबसे कम उपयोग करने वाले उन उपयोगकर्ताओं को निकाल दिया जाता है, जिन्‍होंने पिछले 3 माह में प्रवेश नहीं किया है</translation>
 <translation id="4835622243021053389">NTLMv2 प्रमाणीकरण चालू करें.</translation>
-<translation id="4858735034935305895">पूर्ण स्क्रीन मोड की अनुमति दें</translation>
+<translation id="4858735034935305895">फ़ुल स्क्रीन मोड की अनुमति दें</translation>
 <translation id="4861767323695239729">किसी उपयोगकर्ता सत्र में इनपुट के लिए मंज़ूर किए गए तरीके कॉन्फ़िगर करें</translation>
 <translation id="487460824085252184">डेटा अपने आप दूसरी जगह भेजें, उपयोगकर्ता की सहमति के लिए न पूछें.</translation>
 <translation id="4874982543810021567">इन साइटों पर WebUSB ब्लॉक करें</translation>
@@ -2741,53 +2706,6 @@
 
       अगर यह नीति सेट नहीं की गई हो या गलत पर सेट की गई हो तो, प्रिंट के लिए दिया गया निर्देश प्रिंट की झलक स्क्रीन को शुरू कर देता है.</translation>
 <translation id="6022948604095165524">स्टार्टअप पर कार्रवाई</translation>
-<translation id="6023030044732320798">ऐसी नीतियों के समूह के बारे में बताता है जिन्हें ARC रनटाइम को सौंप दिया जाएगा. मान कोई मान्य JSON होना चाहिए.
-
-      इस नीति का इस्तेमाल यह कॉन्फ़िगर करने के लिए किया जा सकता है कि डिवाइस पर कौन से ऐप्लिकेशन अपने आप इंस्टॉल हुए हैं:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "विवरण": "Android app पहचानकर्ता, उदाहरण के लिए, Gmail के लिए "com.google.android.gm"",
-                  "type": "string"
-                },
-                "installType": {
-                  "विवरण": "बताता है कि कोई ऐप्लिकेशन कैसे इंस्टॉल किया जाता है. OPTIONAL: ऐप्लिकेशन अपने आप इंस्टॉल नहीं होते हैं, लेकिन उपयोगकर्ता इसे इंस्टॉल कर सकते हैं. अगर यह नीति बताई नहीं गई है, तो ऐसा डिफ़ॉल्ट रूप से होता है. PRELOAD: ऐप्लिकेशन अपने आप इंस्टॉल हो जाता है, लेकिन उपयोगकर्ता उसे अनइंस्टॉल कर सकते हैं. FORCE_INSTALLED: ऐप्लिकेशन अपने आप इंस्टॉल हो जाता है और उपयोगकर्ता उसे अनइंस्टॉल नहीं कर सकते हैं. BLOCKED: ऐप्लिकेशन ब्लॉक हो जाता है और उसे इंस्टॉल नहीं किया जा सकता है. अगर ऐप्लिकेशन को किसी पुरानी नीति के अंदर इंस्टॉल किया गया था, तो उसे अनइंस्टॉल कर दिया जाएगा.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "विवरण": "ऐप्लिकेशन को अनुमति देने के अनुरोधों के लिए नीति. PERMISSION_POLICY_UNSPECIFIED: नीति बताई नहीं गई है. अगर किसी अनुमति के लिए किसी भी स्तर पर कोई नीति बताई नहीं गई है, तो डिफ़ॉल्ट रूप से `PROMPT` व्यवहार का इस्तेमाल किया जाता है. PROMPT: अनुमति देने के लिए उपयोगकर्ता को संकेत दें. GRANT: अपने आप कोई अनुमति दें. DENY: अपने आप कोई अनुमति अस्वीकार करें.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "विवण": "कुंजी-मान जोड़ों के समूह के साथ ऐप्लिकेशन-विशिष्ट JSON कॉन्फ़िगरेशन ऑब्जेक्ट, उदाहरण के लिए. '"managedConfiguration": { "key1": value1, "key2": value2 }'. कुंजियां ऐप मेनिफ़ेस्ट में निर्धारित होती हैं.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      ऐप को लॉन्चर में पिन करने के लिए, PinnedLauncherApps देखें.</translation>
 <translation id="602728333950205286">डिफ़ॉल्‍ट खोज की सुविधा इंस्टैंट URL</translation>
 <translation id="603410445099326293">POST का इस्तेमाल करने वाले URL के पैरामीटर</translation>
 <translation id="6034341625190551415">सार्वजनिक सत्र और कियोस्क खाता प्रकारों को नियंत्रित करती है.</translation>
@@ -3134,37 +3052,6 @@
       अगर नीति को गलत पर सेट किया जाता है, तो पहले से मौजूद डीएनएस क्लाइंट का इस्तेमाल कभी नहीं किया जाएगा.
 
       अगर यह नीति सेट किए बिना छोड़ दी जाती है, तो पहले से मौजूद डीएनएस क्लाइंट को MacOS, Android (निजी डीएनएस या वीपीएन के चालू न होने पर) और ChromeOS पर डिफ़ॉल्ट रूप से सेट किया जाएगा, और उपयोगकर्ता यह बदलाव कर पाएंगे कि chrome://flags में बदलाव करके या एक कमांड-लाइन फ़्लैग तय करके, पहले से मौजूद डीएनएस क्लाइंट का इस्तेमाल किया जाए या नहीं.</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> डिफ़ॉल्ट प्रिंटर चुनने के नियमों को ओवरराइड करती है.
-
-      यह नीति <ph name="PRODUCT_NAME" /> में डिफ़ॉल्ट प्रिंटर चुनने के नियम तय करती है. चुनने की यह प्रक्रिया 'प्रिंट फ़ंक्शन' को पहली बार किसी प्रोफ़ाइल के साथ इस्तेमाल करने पर सामने आती है.
-
-      इस नीति को सेट किए जाने पर <ph name="PRODUCT_NAME" /> सभी तय की गई विशेषताओं से मिलान करने वाला प्रिंटर ढूंढने की कोशिश करेगा और उसे डिफ़ॉल्ट प्रिंटर के रूप में चुनेगा. नीति से मिलान करने वाला जो पहला प्रिंटर मिलता है, उसे चुना जाता है. अगर पूरी तरह से मिलान करने वाला कोई प्रिंटर ना मिले, तो खोज के दौरान पहले सामने आने वाले क्रम में प्रिंटर चुने जाते हैं.
-
-      अगर यह नीति सेट नहीं की जाती है या समय खत्म होने से पहले मिलान करने वाला प्रिंटर नहीं मिलता है, तो पहले से मौजूद पीडीएफ़ प्रिंटर को डिफ़ॉल्ट प्रिंटर के रूप में चुन लिया जाता है. अगर पीडीएफ़ प्रिंटर उपलब्ध नहीं होता है, तो कोई प्रिंटर नहीं चुना जाता है.
-
-      नीचे दिए गए स्कीमा की पुष्टि करते हुए, मान को JSON ऑब्जेक्ट के रूप में पार्स किया जाता है:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "मिलान करने वाले प्रिंटर की खोज को प्रिंटर के खास सेट तक सीमित करना है या नहीं.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "प्रिंटर आईडी से मिलान करने के लिए रेगुलर एक्सप्रेशन.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "प्रिंटर के दिखाई देने वाले नाम से मिलान करने के लिए रेगुलर एक्सप्रेशन.",
-            "type": "string"
-          }
-        }
-      }
-
-      <ph name="CLOUD_PRINT_NAME" /> से कनेक्ट किए गए प्रिंटर <ph name="PRINTER_TYPE_CLOUD" /> माने जाते हैं, बाकी प्रिंटर <ph name="PRINTER_TYPE_LOCAL" /> की श्रेणी में रखे जाते हैं.
-      किसी फ़ील्ड को हटाने का मतलब है सभी मानों का मिलान करना, उदाहरण के लिए, कनेक्टिविटी तय नहीं करने से 'प्रिंट की झलक' सभी तरह के प्रिंटर, स्थानीय और क्लाउड प्रिंटर की खोज शुरू कर देगी.
-      रेगुलर एक्सप्रेशन पैटर्न को JavaScript RegExp सिंटैक्स फ़ॉलो करना होगा और मिलान केस संवेदी होते हैं.</translation>
 <translation id="6843296367238757293">यह नीति हटा दी गई है. इसके इस्तेमाल की सलाह नहीं दी जाती है. ज़्यादा जानकारी https://support.google.com/chrome/a/answer/7643500 पर पढ़ें</translation>
 <translation id="684856667300805181">इस नीति को <ph name="PRODUCT_NAME" /> 68 में हटा दिया गया है और इसकी जगह <ph name="ARC_GLS_POLICY_NAME" /> ने ले ली है.</translation>
 <translation id="6856743875250214792">M66 में यह नीति लागू नहीं है और इसे हटा दिया गया है क्योंकि इसका इस्तेमाल सिर्फ़ अंदरूनी जाँच के लिए किया जाता था और सुरक्षा के लिए यह कानूनी तौर पर जवाबदेह है.
@@ -3877,7 +3764,7 @@
 
           अगर इस नीति को सेट किए बिना छोड़ दिया जाता है, तो 'AllowImages' का इस्तेमाल किया जाएगा और उपयोगकर्ता इसे बदल सकेगा.
 
-          ध्यान दें कि पहले इस नीति को Android पर गलती से चालू कर दिया गया था लेकिन इस कार्यक्षमता ने कभी भी Android पर पूरी तरह से काम नहीं किया.</translation>
+          ध्यान दें कि पहले इस नीति को Android पर गलती से चालू कर दिया गया था लेकिन इस काम की क्षमता ने कभी भी Android पर पूरी तरह से काम नहीं किया.</translation>
 <translation id="8104962233214241919">इन साइटों के लिए स्‍वचालित रूप से क्‍लाइंट प्रमाणपत्रों को चुनें</translation>
 <translation id="8112122435099806139">डिवाइस के लिए उपयोग किया जाने वाला घड़ी का फ़ॉर्मैट तय करती है.
 
@@ -3965,7 +3852,7 @@
 
           अगर यह नीति गलत पर सेट की जाती है, तो वीडियो गतिविधि इस्तेमाल करने वाले को खाली माने जाने से नहीं रोकती.</translation>
 <translation id="8274603902181597201">उपयोगकर्ता की ecryptfs होम निर्देशिका मिटाएं और ext4 से सुरक्षित की गई, बिल्कुल नई होम निर्देशिका से शुरू करें.</translation>
-<translation id="8285435910062771358">पूर्ण-स्क्रीन आवर्धक सक्षम है</translation>
+<translation id="8285435910062771358">फ़ुल-स्क्रीन आवर्धक चालू है</translation>
 <translation id="8288199156259560552">Android पर Google के जगह की जानकारी वाली सेवा चालू करें</translation>
 <translation id="8292322992383748446">SoC घटकों के लिए हार्डवेयर आंकड़ों और पहचानकर्ताओं की रिपोर्ट करें.
 
@@ -4316,30 +4203,6 @@
       इस नीति का असर सिर्फ़ उन इस्तेमाल करने वालों पर होता है जिन्होंने एसएएमएल के इस्तेमाल से मंज़ूरी दी है.
 
       नीति का मान सेकंड में बताया जाना चाहिए.</translation>
-<translation id="9027787254195333560">यह नीति आपको अवतार इमेज को कॉन्फ़िगर करने देती है जो लॉगिन स्क्रीन पर इस्तेमाल करने वाले का प्रतिनिधित्व करता है. यह नीति उस यूआरएल को तय करके सेट की जाती है जिससे <ph name="PRODUCT_OS_NAME" /> अवतार इमेज को डाउनलोड कर सकता है. साथ ही, डाउनलोड की प्रमाणिकता की पुष्टि करने के लिए क्रिप्टोग्राफ़िक हैश का इस्तेमाल किया जाता है. इमेज जेपीईजी फ़ॉर्मैट में होनी चाहिए, इसका आकार 512kB से ज़्यादा नहीं होना चाहिए. यूआरएल ऐसा होना चाहिए जिसे बिना किसी प्रमाणीकरण के एक्सेस किया जा सके.
-
-      अवतार इमेज को डाउनलोड और कैश किया गया है. जब भी यूआरएल या हैश बदलेगा इसे फिर से डाउनलोड किया जाएगा.
-
-      नीति को एक ऐसी स्ट्रिंग के तौर पर दिया जाना चाहिए जो नीचे बताए गए स्कीमा का अनुसरण करते हुए यूआरएल और हैश को JSON फ़ॉर्मैट में बताए.
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "यूआरएल जिससे अवतार इमेज को डाउनलोड किया जा सकता है.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "अवतार इमेज का SHA-256 हैश",
-            "type": "string"
-          }
-        }
-      }
-
-      अगर नीति सेट होती है, तो <ph name="PRODUCT_OS_NAME" /> अवतार इमेज को डाउनलोड और इस्तेमाल करेगा.
-
-      अगर आप यह नीति सेट करते हैं, तो इस्तेमाल करने वाले लोग न तो इसे बदल सकते हैं, न ही ओवरराइड कर सकते हैं.
-
-      अगर नीति सेट किए बिना छोड़ दी जाती है, तो इस्तेमाल करने वाले लॉगिन स्क्रीन पर उनके बारे में बताने वाले अवतार इमेज को चुन सकते हैं.</translation>
 <translation id="9035964157729712237">प्रतिबंधित सूची से मुक्त किए जाने वाले विस्तार ID</translation>
 <translation id="9038058011835642205">यह नीति ऐसी वेबसाइटों की सूची के बारे में बताती है जिन्हें इस्तेमाल करने वाले से बातचीत किए बिना, गुपचुप इंस्टॉल किया गया है, और जिसे इस्तेमाल करने वाला न तो अनइंस्टॉल कर सकता है, न ही बंद कर सकता है.
 
@@ -4352,7 +4215,6 @@
       अगर आप यह नीति सेट करते हैं, तो इस्तेमाल करने वाले लोग न तो इसे बदल सकते हैं, न ही ओवरराइड कर सकते हैं.
 
       इस नीति का मान मिलीसेकंड में बताया जाना चाहिए. मानों को 30 सेकंड से 24 घंटों तक रखा जाता है.</translation>
-<translation id="9042911395677044526">यह नीति, हर उपयोगकर्ता पर <ph name="PRODUCT_OS_NAME" /> डिवाइस लागू करने के लिए नेटवर्क कॉन्‍फ़िगरेशन पुश करने देती है. नेटवर्क कॉन्‍फ़िगरेशन, जेएसओएन के फ़ॉर्मैट की स्‍ट्रिंग है जिसे 'ओपन नेटवर्क कॉन्‍फ़िगरेशन' ने तय किया है जो <ph name="ONC_SPEC_URL" /> पर बताया गया है.</translation>
 <translation id="9050853837490399534">यह नीति नियंत्रित करती है कि डिवाइस को 'क्विक फ़िक्स बिल्ड' में अपडेट किया जाना चाहिए या नहीं.
 
       अगर नीति का मान किसी ऐसे टोकन पर सेट किया जाता है जो 'क्विक फ़िक्स बिल्ड' से मैप करता है, तो डिवाइस को ऐसी स्थिति में संबंधित 'क्विक फ़िक्स बिल्ड' में अपडेट कर दिया जाएगा, अगर अपडेट को किसी दूसरी नीति ने ब्लॉक नहीं किया हो.
@@ -4425,18 +4287,6 @@
       अगर नीति 'गलत' पर सेट है, तो प्रिंट की झलक वाले संवाद में 'हैडर और फ़ुटर' नहीं चुना गया होता है और उपयोगकर्ता इसे बदल नहीं सकता है.
 
       अगर नीति 'सही' पर सेट है, तो प्रिंट की झलक वाले संवाद में 'हैडर और फ़ुटर' चुना गया होता है और उपयोगकर्ता इसे बदल नहीं सकता है.</translation>
-<translation id="9213347477683611358">अगर किसी भी उपयोगकर्ता ने अभी तक डिवाइस में साइन इन नहीं किया है तो, लॉगिन स्क्रीन पर दिखाई गई डिवाइस-लेवल वॉलपेपर इमेज को कॉन्फ़िगर करें. नीति को वह यूआरएल तय करके सेट किया जाता है, जिससे 'Chrome OS डिवाइस' वॉलपेपर इमेज डाउनलोड कर सकता है. डाउनलोड पूरा और सही तरह से हुआ है, इसकी पुष्टि करने के लिए क्रिप्टोग्राफ़िक हैश का इस्तेमाल किया जाता है. इमेज जेपीईजी फ़ॉर्मैट में होनी चाहिए, उसकी फ़ाइल का आकार 16MB से ज़्यादा नहीं होना चाहिए. 'पहचान करने की किसी प्रक्रिया' के बिना यूआरएल का एक्सेस होना चाहिए. वॉलपेपर इमेज को डाउनलोड करके कैश के तौर पर सेव किया जाता है. कभी भी यूआरएल या हैश के बदले जाने पर, इसे फिर से डाउलनोड किया जा सकेगा.
-
-      नीति को एक ऐसी स्ट्रिंग के रूप में तय करना चाहिए, जो यूआरएल और हैश को जेएसओएन (जेसन) फ़ॉर्मैट, उदाहरण के लिए,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      } में दिखाती हो.
-
-      अगर डिवाइस वॉलपेपर नीति सेट हो और डिवाइस में किसी भी उपयोगकर्ता ने साइन इन न किया हो तो, 'Chrome OS डिवाइस' वॉलपेपर इमेज को डाउनलोड करके लॉग इन स्क्रीन पर उसका उपयोग करेगा. उपयोगकर्ता के साइन इन करने के बाद, उपयोगकर्ता की वॉलपेपर नीति लागू हो जाती है.
-
-
-      अगर डिवाइस वॉलपेपर नीति सेट न हो और उपयोगकर्ता की वॉलपेपर नीति सेट हो तो, क्या दिखाया जाए, यह उपयोगकर्ता की वॉलपेपर नीति से तय किया जाता है.</translation>
 <translation id="9217154963008402249">नेटवर्क पैकेट मॉनीटर करने की आवृत्‍ति</translation>
 <translation id="922540222991413931">एक्सटेंशन, ऐप्लिकेशन और उपयोगकर्ता स्क्रिप्ट को इंस्टॉल करने की मंज़ूरी देने वाले स्रोतों को कॉन्फ़िगर करती है</translation>
 <translation id="924557436754151212">पहली बार चलाने पर डिफ़ॉल्‍ट ब्राउज़र से सहेजे गए पासवर्ड आयात करें</translation>
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index bc2fb0f..e71ef59 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -402,7 +402,6 @@
 
       Upozorenje: ne preporučuje se ovlastiti kiosk aplikaciju za upravljanje verzijom proizvoda <ph name="PRODUCT_OS_NAME" /> jer uređaj tako može prestati primati ažuriranja softvera i važne sigurnosne ispravke. Davanje ovlasti za upravljanje verzijom proizvoda <ph name="PRODUCT_OS_NAME" /> korisnike može izložiti opasnosti.</translation>
 <translation id="1675002386741412210">Podržano na:</translation>
-<translation id="1689963000958717134">Omogućuje nametanje primjene mrežne konfiguracije za sve korisnike uređaja <ph name="PRODUCT_OS_NAME" />. Mrežna je konfiguracija niz u formatu JSON, kao što je definirano formatom "Open Network Configuration", koji je opisan na stranici <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Konfigurira dostupnost i ponašanje funkcije ažuriranja <ph name="TPM_FIRMWARE_UPDATE_TPM" /> opreme.
 
       Pojedinačne postavke mogu se navesti u JSON svojstvima:
@@ -943,16 +942,6 @@
       Ako je ova postavka onemogućena, web-stranice ne mogu upotrebljavati JavaScript i korisnik ne može promijeniti tu postavku.
 
       Ako je ova postavka omogućena ili nije postavljena, web-stranice mogu upotrebljavati JavaScript, no korisnik može promijeniti tu postavku.</translation>
-<translation id="2747157663401642394">Konfigurira postavke upravljanja proširenjima za <ph name="PRODUCT_NAME" />.
-
-          To pravilo upravlja većim brojem postavki, uključujući postavke kojima upravljaju postojeća pravila koja se odnose na proširenja. To će pravilo nadjačati sva naslijeđena pravila ako su postavljena i ona.
-
-          To pravila mapira ID proširenja ili URL za ažuriranje u svoju konfiguraciju. Uz ID proširenja konfiguracija će se primijeniti samo na navedeno proširenje. Zadana konfiguracija može se postaviti za posebni ID <ph name="DEFAULT_SCOPE" />, koji će se primjenjivati na sva proširenja za koja nije postavljena prilagođena konfiguracija u tom pravilu. Uz URL za ažuriranje konfiguracija će se primijeniti na sva proširenja s URL-om za ažuriranje navedenim u manifestu ovog proširenja, kao što je opisano na <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Za instance Windowsa koje nisu pridružene domeni <ph name="MS_AD_NAME" />, prisilno je instaliranje ograničeno na aplikacije i proširenja navedene u Chrome web-trgovini.
-
-          Potpuni opis mogućih postavki i strukture tog pravila potražite na stranici https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Ograniči raspon lokalnih UDP priključaka kojima se koristi WebRTC</translation>
 <translation id="2757054304033424106">Vrste proširenja/aplikacija koje se smiju instalirati</translation>
 <translation id="2758084448533744848">Određuje zadanu vremensku zonu koja će se upotrebljavati za uređaj. Ako se to pravilo postavi, korisnici uređaja ne mogu nadjačati navedenu vremensku zonu. Ako se navede nevažeća vrijednost, pravilo je još uvijek aktivirano i umjesto nje upotrebljava se "GMT". Ako se navede prazan niz, pravilo se zanemaruje.
@@ -1659,7 +1648,7 @@
 
           Svaka stavka pravila niz je koji sadrži ID proširenja i URL za "ažuriranje" odvojene točkom sa zarezom (<ph name="SEMICOLON" />). ID proširenja niz je od 32 slova koji se primjerice može pronaći na <ph name="CHROME_EXTENSIONS_LINK" /> u načinu rada razvojnog programera. URL za "ažuriranje", ako se navede, treba usmjeravati na XML dokument manifesta ažuriranja kako je opisano u dokumentu <ph name="LINK_TO_EXTENSION_DOC1" />. Prema zadanim postavkama, upotrebljava se URL za ažuriranje Chrome web-trgovine (koji je trenutačno "https://clients2.google.com/service/update2/crx"). URL za "ažuriranje" postavljen u ovom pravilu upotrebljava se samo za prvo instaliranje, dok će se za daljnja ažuriranja proširenja upotrebljavati URL ažuriranja naveden u manifestu proširenja. Napominjemo i to da je eksplicitno navođenje URL-a za "ažuriranje" bilo obavezno u verzijama preglednika <ph name="PRODUCT_NAME" /> zaključno s verzijom 67.
 
-          Na primjer, <ph name="EXTENSION_POLICY_EXAMPLE" /> instalira proširenje s ID-om <ph name="EXTENSION_ID_SAMPLE" /> sa standardnog URL-a za "ažuriranje" Chrome web-trgovine. Više informacija o hostingu proširenja potražite ovdje: <ph name="LINK_TO_EXTENSION_DOC2" />.
+          Na primjer, <ph name="EXTENSION_POLICY_EXAMPLE" /> instalira proširenje s ID-jem <ph name="EXTENSION_ID_SAMPLE" /> sa standardnog URL-a za "ažuriranje" Chrome web-trgovine. Više informacija o hostingu proširenja potražite ovdje: <ph name="LINK_TO_EXTENSION_DOC2" />.
 
           Ako se to pravilo ne postavi, aplikacije ili proširenja neće se instalirati automatski i korisnik može deinstalirati bilo koju aplikaciju ili proširenje u pregledniku <ph name="PRODUCT_NAME" />.
 
@@ -1711,30 +1700,6 @@
       To se pravilo primjenjuje samo na korisnike koji se autentificiraju putem SAML-a.</translation>
 <translation id="4105989332710272578">Onemogući provedbu Transparentnosti certifikata za popis URL-ova</translation>
 <translation id="4121350739760194865">Sprječavanje prikaza promocija aplikacija na stranici Nova kartica</translation>
-<translation id="4125606414556046117">To pravilo omogućuje vam da konfigurirate sliku pozadine koja se prikazuje na radnoj površini i pozadini zaslona za prijavu korisnika. Pravilo se postavlja tako da se navede URL s kojeg <ph name="PRODUCT_OS_NAME" /> može preuzeti sliku pozadine i kriptografsko hashiranje kojim se potvrđuje integritet preuzimanja. Slika mora biti u JPEG formatu i ne smije biti veća od 16 MB. URL-u se mora moći pristupiti bez autentifikacije.
-
-      Slika pozadine preuzima se i sprema u predmemoriju. Ponovo će se preuzeti svaki put kada se URL ili hashiranje promijene.
-
-      Pravilo se navodi kao niz koji izražava URL i hashiranje u JSON formatu prema sljedećoj shemi:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL s kojeg se može preuzeti slika pozadine.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "SHA-256 raspršivanje slike pozadine.",
-            "type": "string"
-          }
-        }
-      }
-
-      Ako se pravilo postavi, <ph name="PRODUCT_OS_NAME" /> preuzet će i upotrijebiti sliku pozadine.
-
-      Ako postavite to pravilo, korisnici ga neće moći promijeniti ni nadjačati.
-
-      Ako se pravilo ne postavi, korisnik može odabrati sliku koja će se prikazivati na radnoj površini i pozadini zaslona za prijavu.</translation>
 <translation id="412697421478384751">Omogući korisnicima da postave slabe PIN-ove za zaključan zaslon</translation>
 <translation id="4138655880188755661">Vremensko ograničenje</translation>
 <translation id="4144164749344898721">To pravilo kontrolira više postavki za strategiju upravljanja napajanjem kada korisnik postane neaktivan.
@@ -2498,7 +2463,7 @@
 
           Ako se postavka ne konfigurira, neće se primjenjivati ograničenja u vezi s prihvatljivim vrstama proširenja/aplikacija.
 
-          Upotreba više ID-ova odvojenih zarezima prije verzije 75 nije podržana i preskočit će se. Ostatak pravila i dalje će se primjenjivati.</translation>
+          Upotreba više ID-jeva odvojenih zarezima prije verzije 75 nije podržana i preskočit će se. Ostatak pravila i dalje će se primjenjivati.</translation>
 <translation id="5645779841392247734">Dopusti kolačiće na ovim web-lokacijama</translation>
 <translation id="5689430183304951538">Veličina stranice zadanog ispisa</translation>
 <translation id="5693469654327063861">Dopusti premještanje podataka</translation>
@@ -2660,53 +2625,6 @@
 
       Ako to pravilo nije postavljeno ili je postavljeno na netočno, naredbe ispisa pokreću zaslon pretpregleda ispisa.</translation>
 <translation id="6022948604095165524">Radnja prilikom pokretanja</translation>
-<translation id="6023030044732320798">Određuje skup pravila koja će se prenijeti na vrijeme izvođenja ARC-a. Vrijednost mora biti važeći JSON.
-
-      To se pravilo može upotrijebiti da bi se konfiguriralo koje će se Android aplikacije automatski instalirati na uređaj:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identifikator Android aplikacije, na primjer "com.google.android.gm" za Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Određuje kako se aplikacija instalira. OPTIONAL: aplikacija se ne instalira automatski, ali je korisnik može instalirati. To je zadano ako se to pravilo ne odredi. PRELOAD: aplikacija se instalira automatski, no korisnik je može deinstalirati. FORCE_INSTALLED: aplikacija se instalira automatski i korisnik je ne može deinstalirati. BLOCKED: aplikacija je blokirana i ne može se instalirati. Ako je aplikacija instalirana prema nekom od prethodnih pravila, deinstalirat će se.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Pravilo za odobravanje zahtjeva za dopuštenje za aplikacije. PERMISSION_POLICY_UNSPECIFIED: pravilo nije određeno. Ako se pravilo za dopuštenje ne odredi ni na kojoj razini, ponašanje stavke "PROMPT" upotrebljava se prema zadanim postavkama. PROMPT: korisniku se postavlja pitanje žele li odobriti dopuštenje. GRANT: dopuštenje se odobrava automatski. DENY: dopuštenje se odbija automatski.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Konfiguracijski JSON objekt sa skupom parova ključ-vrijednost, na primjer '"managedConfiguration": { "key1": value1, "key2": value2 }'. Ključevi su definirani u manifestu aplikacije.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Ako želite prikvačiti aplikacije na pokretač, pogledajte PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Instant URL zadanog davatelja usluge pretraživanja</translation>
 <translation id="603410445099326293">Parametri URL-a za prijedloge koji upotrebljava POST</translation>
 <translation id="6034341625190551415">Upravlja javnom sesijom i vrstama računa za kiosk.</translation>
@@ -2751,7 +2669,7 @@
 
       Napominjemo da to pravilo određuje stanje Googleovih usluga lokacije samo tijekom početnog postavljanja. Korisnik može kasnije u postavkama Androida uključiti ili isključiti Googleove usluge lokacije.
 
-      Napominjemo da će se to pravilo zanemariti ako se <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> postavi na <ph name="BLOCK_GEOLOCATION_SETTING" />, a Googleove usluge lokacije uvijek će biti onemogućene.</translation>
+      Napominjemo da će se to pravilo zanemariti, a Googleove usluge lokacije onemogućiti ako se <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> postavi na <ph name="BLOCK_GEOLOCATION_SETTING" />.</translation>
 <translation id="6141402445226505817">Uvijek upotrebljavaj približno otkrivanje vremenske zone</translation>
 <translation id="6145799962557135888">Omogućuje postavljanje popisa uzoraka URL-ova koji određuju web-lokacije koje ne smiju pokretati JavaScript. Ako to pravilo nije postavljeno, upotrebljavat će se globalna zadana vrijednost za sve web-lokacije iz pravila "DefaultJavaScriptSetting", ako je postavljeno, odnosno iz osobne konfiguracije korisnika, ako nije.</translation>
 <translation id="614662973812186053">To pravilo kontrolira i prikupljanje podataka o upotrebi i dijagnostici na Androidu.</translation>
@@ -3054,37 +2972,6 @@
       Ako se pravilo postavi na False, ugrađeni DNS klijent nikad se neće upotrebljavati.
 
       Ako se to pravilo ne postavi, ugrađeni DNS klijent bit će omogućen prema zadanim postavkama na MacOS-u, Androidu (ako nisu omogućeni ni Privatni DNS ni VPN) i OS-u Chrome, a korisnici će moći promijeniti postavku upotrebe ugrađenog DNS klijenta uređivanjem oznaka na stranici chrome://flags ili navođenjem oznake naredbenog retka.</translation>
-<translation id="6838056959556423778">Nadjačava zadana pravila za odabir pisača u proizvodu <ph name="PRODUCT_NAME" />.
-
-      Tim se pravilom daju odrednice za odabir zadanog pisača u proizvodu <ph name="PRODUCT_NAME" /> prilikom prve upotrebe funkcije ispisa na profilu.
-
-      Kada se to pravilo postavi, proizvod <ph name="PRODUCT_NAME" /> pokušat će pronaći pisač koji odgovara svim navedenim atributima i odabrati ga kao zadani. Odabire se prvi pisač koji odgovara pravilu, a u slučaju da se pronađe više odgovarajućih pisača, može se odabrati bilo koji pisač ovisno o redoslijedu njihovog otkrivanja.
-
-      Ako se to pravilo ne postavi ili se ne pronađe odgovarajući pisač u okviru vremenskog ograničenja, upotrebljavat će se ugrađeni PDF pisač ili se neće odabrati nijedan ako PDF pisač nije dostupan.
-
-      Vrijednost se raščlanjuje kao JSON objekt prema sljedećoj shemi:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Treba li se ograničiti traženje odgovarajućeg pisača na određeni skup pisača.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regularni izraz koji se treba podudarati s ID-jem pisača.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regularni izraz koji se treba podudarati sa zaslonskim nazivom pisača.",
-            "type": "string"
-          }
-        }
-      }
-
-      Pisači povezani s uslugom <ph name="CLOUD_PRINT_NAME" /> smatraju se vrstom <ph name="PRINTER_TYPE_CLOUD" />, dok su ostali pisači klasificirani kao vrsta <ph name="PRINTER_TYPE_LOCAL" />.
-      Izostavljanje polja znači da su podudarne sve vrijednosti. Na primjer, ako se ne odredi povezivanje, pregled ispisa pokrenut će otkrivanje svih vrsta pisača, kako lokalnih tako i onih u oblaku.
-      Uzorci regularnih izraza moraju slijediti sintaksu JavaScript RegExp, a u podudaranjima se razlikuju mala i velika slova.</translation>
 <translation id="6843296367238757293">Pravilo je zastarjelo. Njegova se upotreba ne preporučuje. Pročitajte više na https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">To je pravilo uklonjeno iz sustava <ph name="PRODUCT_NAME" /> 68 i zamijenjeno pravilom <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">To je pravilo zastarjelo i uklonjeno u M66 budući da se upotrebljavalo samo za interno testiranje i predstavlja sigurnosni rizik.
@@ -4205,30 +4092,6 @@
       To pravilo utječe samo na korisnike koji se autentificiraju pomoću SAML-a.
 
       Vrijednost pravila navodi se u sekundama.</translation>
-<translation id="9027787254195333560">To pravilo omogućuje vam da konfigurirate sliku avatara koji predstavlja korisnika na zaslonu za prijavu. Pravilo se postavlja tako da se navede URL s kojeg <ph name="PRODUCT_OS_NAME" /> može preuzeti sliku avatara i kriptografsko hashiranje kojim se potvrđuje integritet preuzimanja. Slika mora biti u JPEG formatu i ne smije biti veća od 512 KB. URL-u se mora moći pristupiti bez autentifikacije.
-
-      Slika avatara preuzima se i sprema u predmemoriju. Ponovo će se preuzeti svaki put kada se URL ili hashiranje promijene.
-
-      Pravilo se navodi kao niz koji izražava URL i hashiranje u JSON formatu prema sljedećoj shemi:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL s kojeg se može preuzeti slika avatara.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "SHA-256 hashiranje slike avatara.",
-            "type": "string"
-          }
-        }
-      }
-
-      Ako se pravilo postavi, <ph name="PRODUCT_OS_NAME" /> preuzet će i upotrijebiti sliku avatara.
-
-      Ako postavite to pravilo, korisnici ga neće moći promijeniti ni nadjačati.
-
-      Ako se pravilo ne postavi, korisnik može odabrati sliku avatara koja će ga predstavljati na zaslonu za prijavu.</translation>
 <translation id="9035964157729712237">ID-jevi proširenja za izuzimanje s crne liste</translation>
 <translation id="9038058011835642205">Određuje popis web-lokacija koje se instaliraju u pozadini bez interakcije korisnika i koje korisnik ne može deinstalirati ni onemogućiti.
 
@@ -4241,7 +4104,6 @@
       Ako postavite to pravilo, korisnici ga neće moći promijeniti ni nadjačati.
 
       Vrijednost pravila treba se navesti u milisekundama. Vrijednosti su ograničene na raspon od 30 sekundi do 24 sata.</translation>
-<translation id="9042911395677044526">Omogućuje nametanje mrežne konfiguracije za primjenu po korisniku na uređaju <ph name="PRODUCT_OS_NAME" />. Mrežna je konfiguracija niz u formatu JSON, kao što je definirano formatom "Open Network Configuration" koji je opisan na adresi <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Pravilo određuje treba li se uređaj ažurirati na međuverziju za brzi popravak.
 
       Ako se vrijednost pravila postavi na token koji mapira na međuverziju za brzi popravak, uređaj će se ažurirati na odgovarajuću međuverziju ako ažuriranje nije blokirano drugim pravilom.
@@ -4314,17 +4176,6 @@
       Ako se pravilo postavi na False, opcija "Zaglavlja i podnožja" u dijaloškom okviru pregleda ispisa nije odabrana i korisnik to ne može promijeniti.
 
       Ako se pravilo postavi na True, opcija "Zaglavlja i podnožja" u dijaloškom okviru pregleda ispisa odabrana je i korisnik to ne može promijeniti.</translation>
-<translation id="9213347477683611358">Konfigurira pozadinsku sliku koja se prikazuje na zaslonu za prijavu na razini uređaja ako na uređaju još nema prijavljenih korisnika. Pravilo se postavlja određivanjem URL-a s kojega uređaj s OS-om Chrome može preuzeti pozadinsku sliku i kriptografskog raspršivanja za provjeru integriteta preuzimanja. Slika mora biti u JPEG formatu i ne smije biti veća od 16 MB. URL-u se mora moći pristupiti bez autentifikacije. Pozadinska slika preuzima se i sprema u predmemoriju. Ponovo će se preuzeti svaki put kada se URL ili raspršivanje promijene.
-
-      Pravilo se navodi kao niz koji izražava URL i sažetak u JSON obliku, na primjer:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Ako se postavi pravilo o pozadini uređaja, uređaj s OS-om Chrome preuzet će i upotrijebiti pozadinsku sliku na zaslonu za prijavu ako na uređaju još nema prijavljenih korisnika. Kad se korisnik prijavi, počinje se primjenjivati njegovo pravilo o pozadini.
-
-      Ako se pravilo o pozadini uređaja ne postavi, pozadinska slika odabire se na temelju korisnikovog pravila o pozadini.</translation>
 <translation id="9217154963008402249">Učestalost mrežnih paketa za praćenje</translation>
 <translation id="922540222991413931">Konfiguracija izvora instalacija proširenja, aplikacija i korisničkih skripti</translation>
 <translation id="924557436754151212">Uvoz spremljenih zaporki iz zadanog preglednika pri prvom pokretanju</translation>
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index 9dc64224..daec16e0 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -412,7 +412,6 @@
 
       Figyelem: Nem ajánlott átadni a <ph name="PRODUCT_OS_NAME" /> verziójának ellenőrzését semmilyen kioszkalkalmazásnak, ez ugyanis megakadályozhatja az eszközt abban, hogy fogadja a szoftverfrissítéseket és a kritikus biztonsági javításokat. A <ph name="PRODUCT_OS_NAME" />-verzió ellenőrzésének átadása kockázatot jelenthet a felhasználók számára.</translation>
 <translation id="1675002386741412210">Támogatott a következőkön:</translation>
-<translation id="1689963000958717134">Lehetővé teszi a hálózati konfiguráció push módszerrel történő alkalmazását a(z) <ph name="PRODUCT_OS_NAME" />-eszköz minden felhasználójára. A hálózati konfiguráció a JSON formátumú karakterlánc által meghatározott Open Network Configuration formában leírt karakterlánc, amely a következő helyen van meghatározva: <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">A <ph name="TPM_FIRMWARE_UPDATE_TPM" />-firmware-frissítési funkció rendelkezésre állását és viselkedését konfigurálja.
 
       Egyedi beállítások JSON-tulajdonságokban adhatók meg:
@@ -953,16 +952,6 @@
       Ha ez a beállítás ki van kapcsolva, akkor a weboldalak nem használhatnak JavaScriptet, és a felhasználó nem módosíthatja a beállítást.
 
       Ha be van kapcsolva vagy nincs beállítva, akkor a weboldalak használhatnak JavaScriptet, ám a felhasználó módosíthatja a beállítást.</translation>
-<translation id="2747157663401642394">A <ph name="PRODUCT_NAME" /> bővítménykezelési beállításait konfigurálja.
-
-          Ez a házirend több beállítást is szabályoz, köztük a bővítményekkel kapcsolatos meglévő házirendek beállításait. Ha régebbi házirend is be van állítva, ez a házirend felülbírálja.
-
-          A házirend bővítményazonosítót vagy frissítési URL-t társít a konfigurációjához. Bővítményazonosító esetén csak a megadott bővítményre lesz érvényes a konfiguráció. A <ph name="DEFAULT_SCOPE" /> különleges azonosítóhoz be lehet állítani alapértelmezett konfigurációt, amely az összes olyan bővítményre érvényes lesz, melyhez nincs beállítva egyéni konfiguráció ebben a házirendben. Frissítési URL esetén a konfiguráció érvényes lesz az összes olyan bővítményre, melynek manifestfájljában meghatározott frissítési URL pontosan egyezik az ebben a bővítményben meghatározott URL-lel (részletes leírás: <ph name="LINK_TO_EXTENSION_DOC1" />).
-
-          <ph name="MS_AD_NAME" />-domainhez nem csatlakozó Windows-példányok esetén a kényszerített telepítés lehetősége a Chrome Internetes áruházban megtalálható alkalmazásokra és bővítményekre korlátozódik.
-
-          A házirend lehetséges beállításainak és felépítésének teljes leírását a következő weboldalon tekintheti meg: https://www.chromium.org/administrators/policy-list-3/extension-settings-full.
-          </translation>
 <translation id="2753637905605932878">A WebRTC által használt helyi UDP-porttartományok korlátozása</translation>
 <translation id="2757054304033424106">Telepíthető bővítmény-/alkalmazástípusok</translation>
 <translation id="2758084448533744848">Az eszközön kötelezően használandó időzóna meghatározására szolgál. Ha a házirend aktív, az eszköz felhasználói nem bírálhatják felül a beállított időzónát. A házirend érvénytelen érték esetén is aktív; ebben az esetben a GMT időzónát alkalmazza. Üres érték esetén a házirend nem lép működésbe.
@@ -1720,30 +1709,6 @@
       Ez a házirend csak azokra a felhasználókra érvényes, akik SAML-alapú hitelesítést használnak.</translation>
 <translation id="4105989332710272578">A tanúsítványok átláthatósága keretrendszer végrehajtásának kikapcsolása az URL-ek egy listájánál</translation>
 <translation id="4121350739760194865">Megakadályozza az alkalmazáspromóciók megjelenését az új lap oldalon</translation>
-<translation id="4125606414556046117">Ez a házirend lehetővé teszi az asztalon és a felhasználó bejelentkező képernyőjén lévő háttérkép konfigurálását. A házirend annak az URL-nek a megadásával állítható be, ahonnan a <ph name="PRODUCT_OS_NAME" /> letöltheti a háttérképet és a letöltés integritásának ellenőrzésére szolgáló kriptográfiai hash-értéket. A képnek JPEG-formátumban kell lennie, mérete pedig nem haladhatja meg a 16 MB-ot. Az URL-nek hitelesítés nélkül is hozzáférhetőnek kell lennie.
-
-      A letöltés után a háttérkép a gyorsítótárba kerül. Ha az URL vagy a hash megváltozik, a rendszer újra letölti a háttérképet.
-
-      A házirendet olyan karakterláncként kell megadni, amely JSON-formátumban fejezi ki az URL-t és a hash-értéket, valamint megfelel a következő sémának:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Az URL, ahonnan a háttérkép letölthető.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "A háttérkép SHA-256-os hash-értéke.",
-            "type": "string"
-          }
-        }
-      }
-
-      Ha a házirend be van állítva, a <ph name="PRODUCT_OS_NAME" /> letölti és használja a háttérképet.
-
-      Ha beállítja ezt a házirendet, a felhasználó nem módosíthatja vagy bírálhatja felül.
-
-      Ha nem állítja be a házirendet, a felhasználó kiválaszthatja, hogy milyen háttérkép jelenjen meg az asztalon és a bejelentkezési képernyőn.</translation>
 <translation id="412697421478384751">Annak engedélyezése, hogy a felhasználók gyenge PIN-kódot adjanak meg a lezárási képernyő PIN-kódjaként.</translation>
 <translation id="4138655880188755661">Időkorlát</translation>
 <translation id="4144164749344898721">Ez a házirend többféle, energiagazdálkodási stratégiával kapcsolatos beállítást vezérel arra vonatkozóan, amikor a felhasználó tétlenné válik.
@@ -2668,53 +2633,6 @@
 
       Ha az irányelv nincs beállítva, vagy az értéke hamis, akkor a nyomtatási parancsok a nyomtatási előnézet képernyőt aktiválják.</translation>
 <translation id="6022948604095165524">Művelet indításkor</translation>
-<translation id="6023030044732320798">Meghatározza az ARC futási időnek átadandó házirendek készletét. Az értéknek érvényes JSON-értéknek kell lennie.
-
-      Az irányelv használható annak meghatározására, hogy milyen Android-alkalmazások települjenek automatikusan az eszközre:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android-alkalmazásazonosító, pl. "com.google.android.gm" a Gmail esetében",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Meghatározza az alkalmazás telepítésének módját. OPTIONAL: Az alkalmazás telepítése nem történik meg automatikusan, de a felhasználó elvégezheti. Ez az alapértelmezés, ha nincs meghatározva a házirend. PRELOAD: Az alkalmazás automatikusan települ, de a felhasználó eltávolíthatja. FORCE_INSTALLED: Az alkalmazás automatikusan települ, a felhasználó nem távolíthatja el. BLOCKED: Az alkalmazás le van tiltva, és nem telepíthető. Ha az alkalmazás másik házirend értelmében telepítve lett, le lesz törölve.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Ezzel a házirenddel engedélykérelmeket lehet megadni az alkalmazásoknak. PERMISSION_POLICY_UNSPECIFIED: A házirend nincs meghatározva. Ha semelyik engedélyen nincs beállítva házirend, akkor alapértelmezés szerint a rendszer a PROMPT viselkedést használja. PROMPT: A felhasználó felkérése engedély megadására. GRANT: Engedély automatikus megadása. DENY: Engedély automatikus elutasítása.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Alkalmazásspecifikus JSON-konfigurációs objektum kulcsértékpár-készlettel, pl. '"managedConfiguration": { "key1": value1, "key2": value2 }'. A kulcsok az alkalmazás jegyzékében vannak meghatározva.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Ha alkalmazást szeretne rögzíteni az indítóra, keresse meg a PinnedLauncherApps házirendet.</translation>
 <translation id="602728333950205286">Alapértelmezett keresési szolgáltató azonnali URL-je</translation>
 <translation id="603410445099326293">Paraméterek POST metódust használó javasolt URL-hez</translation>
 <translation id="6034341625190551415">A nyilvános munkamenetű és kioszk típusú fiókok szabályozására szolgál.</translation>
@@ -3062,37 +2980,6 @@
       Ha az irányelv hamis értékre van beállítva, a rendszer soha nem használja a beépített DNS-ügyfelet.
 
       Ha az irányelv nincs beállítva, a beépített DNS-ügyfél alapértelmezés szerint engedélyezve lesz MacOS, Android (ha sem a privát DNS, sem a VPN nincs aktiválva) és Chrome OS rendszereken, és a felhasználók a chrome://flags szerkesztésével vagy egy parancssori jelző megadásával módosíthatják, hogy a beépített DNS-ügyfél legyen-e használatban.</translation>
-<translation id="6838056959556423778">Felülbírálja a <ph name="PRODUCT_NAME" /> alapértelmezett nyomtatókiválasztási szabályait.
-
-      Ez a házirend határozza meg az alapértelmezett nyomtató kiválasztására vonatkozó szabályokat a nyomtatás funkció adott profillal történő első használatakor a böngészőben (<ph name="PRODUCT_NAME" />).
-
-      Ha a házirend be van állítva, a böngésző (<ph name="PRODUCT_NAME" />) megpróbál olyan nyomtatót találni, amely megfelel a megadott tulajdonságok mindegyikének, majd kijelöli alapértelmezett nyomtatónak. A házirendnek megfelelő első nyomtatót választja ki, ha pedig nincs egyedi egyezés, akkor a nyomtatók felfedezésének sorrendjétől függően bármilyen egyező nyomtatót kiválaszthat.
-
-      Ha a házirend nincs beállítva, vagy ha az időkereten belül nem talál megfelelő nyomtatót, akkor az alapértelmezett nyomtató a beépített PDF-nyomtató lesz, illetve ha az nem áll rendelkezésre, akkor nem lesz nyomtató kiválasztva.
-
-      Az érték elemzése JSON-objektumként, a következő sémának megfelelően történik:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Kell-e korlátozni az egyező nyomtatók keresését a nyomtatók egy adott készletére.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "A nyomtató azonosítójával egyező reguláris kifejezés.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "A nyomtató megjelenített nevével egyező reguláris kifejezés.",
-            "type": "string"
-          }
-        }
-      }
-
-      A(z) <ph name="CLOUD_PRINT_NAME" /> szolgáltatáshoz tartozó nyomtatók besorolása a böngészőben <ph name="PRINTER_TYPE_CLOUD" />, míg az összes többié <ph name="PRINTER_TYPE_LOCAL" />.
-      Egy adott mező üresen hagyása azt jelenti, hogy az összes érték egyezésnek számít. Ha például nincs megadva a csatlakoztathatóság, akkor a nyomtatási előnézet az összes nyomtatófajta (helyi és felhőben lévő) felfedezését megkezdi.
-      A reguláris kifejezések mintái a JavaScript RegExp szintaxist követik, és megkülönböztetik a kis- és nagybetűket.</translation>
 <translation id="6843296367238757293">Ez a házirend megszűnt. Nem javasoljuk a használatát. További információ: https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Ez a házirend el lett távolítva a <ph name="PRODUCT_NAME" /> 68-os verziójában, és a következő lépett a helyébe: <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Ez a házirend elavult, és eltávolítottuk az M66 verzióban, mert csak belső tesztelésre használtuk, és biztonsági kockázatot jelent.
@@ -4233,30 +4120,6 @@
       Ez a házirend csak azokra a felhasználókra vonatkozik, akik SAML használatával hitelesítik magukat.
 
       A házirend értékét másodpercben kell megadni.</translation>
-<translation id="9027787254195333560">Ez a házirend lehetővé teszi a felhasználó bejelentkezési képernyőn megjelenő avatarképének konfigurálását. A házirend annak az URL-nek a megadásával állítható be, ahonnan a <ph name="PRODUCT_OS_NAME" /> letöltheti az avatarképet és a letöltés integritásának ellenőrzésére szolgáló kriptográfiai hash-értéket. A képnek JPEG-formátumban kell lennie, mérete pedig nem haladhatja meg az 512 kB-ot. Az URL-nek hitelesítés nélkül is hozzáférhetőnek kell lennie.
-
-      A letöltés után az avatarkép a gyorsítótárba kerül. Ha az URL vagy a hash megváltozik, a rendszer újra letölti az avatarképet.
-
-      A házirendet olyan karakterláncként kell megadni, amely JSON-formátumban fejezi ki az URL-t és a hash-értéket, valamint megfelel a következő sémának:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Az URL, ahonnan az avatarkép letölthető.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Az avatarkép SHA-256-os hash-értéke.",
-            "type": "string"
-          }
-        }
-      }
-
-      Ha a házirend be van állítva, a <ph name="PRODUCT_OS_NAME" /> letölti és felhasználja az avatarképet.
-
-      Ha beállítja ezt a házirendet, a felhasználó nem módosíthatja vagy bírálhatja felül.
-
-      Ha nem állítja be a házirendet, a felhasználó kiválaszthatja, hogy milyen avatarkép jelenjen meg a fiókjához a bejelentkezési képernyőn.</translation>
 <translation id="9035964157729712237">A feketelista alól kivételt képező bővítményazonosítók.</translation>
 <translation id="9038058011835642205">Megadja azon webhelyek listáját, amelyek telepítése a háttérben, felhasználói interakció nélkül történik, és amelyeket a felhasználó nem távolíthat el vagy tilthat le.
 
@@ -4269,7 +4132,6 @@
       Ha beállítja ezt a házirendet, a felhasználó nem módosíthatja vagy bírálhatja felül.
 
       A házirend értékét ezredmásodpercben kell megadni. Az érték 30 másodperc és 24 óra közé eshet.</translation>
-<translation id="9042911395677044526">Lehetővé teszi a hálózati konfiguráció push módszerrel történő alkalmazását <ph name="PRODUCT_OS_NAME" /> eszközre. A hálózati konfiguráció a JSON formátumú karakterlánc által meghatározott Open Network Configuration formában leírt karakterlánc, amely a következő helyen van meghatározva: <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Ez a házirend vezérli az eszköz Quick Fix Buildre való frissítését.
 
       Ha a házirend értéke olyan tokenre van állítva, amely megfeleltethető egy Quick Fix Buildnek, akkor az eszköz frissül a kapcsolódó Quick Fix Buildre, feltéve, hogy a frissítést nem akadályozza másik házirend.
@@ -4342,17 +4204,6 @@
       Ha a házirend beállítása hamis, akkor a „Fejlécek és láblécek” beállítás nincs bejelölve a nyomtatási előnézet párbeszédpanelén, és a felhasználó ezt nem módosíthatja.
 
       Ha a házirend beállítása igaz, akkor a „Fejlécek és láblécek” beállítás be van jelölve a nyomtatási előnézet párbeszédpanelén, és a felhasználó ezt nem módosíthatja.</translation>
-<translation id="9213347477683611358">Beállítja az eszközszintű háttérképet, amely akkor jelenik meg a bejelentkezési képernyőn, ha még nem jelentkezett be felhasználó az eszközre. Az irányelv annak az URL-nek a megadásával állítható be, ahonnan a Chrome OS-eszköz letöltheti a háttérképet és a letöltés integritásának ellenőrzésére szolgáló kriptográfiai hash-értéket. A képnek JPEG formátumban kell lennie, mérete pedig nem haladhatja meg a 16 MB-ot. Az URL-nek hitelesítés nélkül is elérhetőnek kell lennie. A letöltés után a háttérkép a gyorsítótárba kerül. A rendszer az URL vagy a hash-érték változása esetén minden esetben újból letölti a képet.
-
-      Az irányelvet olyan karakterláncként kell megadni, amely JSON formátumban fejezi ki az URL-t és a hash-értéket, például:
-      {
-        „url”: „https://example.com/eszkoz_hatterkep.jpg”,
-        „hash”: „examplewallpaperhash”
-      }
-
-      Ha az eszköz háttérképekre vonatkozó irányelve van beállítva, a Chrome OS-eszköz letölti és felhasználja a háttérképet a bejelentkezési képernyőn, ha még nem jelentkezett be felhasználó az eszközre. A felhasználó bejelentkezése után a felhasználó háttérképekre vonatkozó irányelve lép érvénybe.
-
-      Ha az eszköz háttérképekre vonatkozó irányelve nincs beállítva, a felhasználó háttérképekre vonatkozó irányelvén múlik, hogy mi jelenik meg, ha a felhasználó háttérképekre vonatkozó irányelve van beállítva.</translation>
 <translation id="9217154963008402249">Az ellenőrző hálózati csomagok gyakorisága</translation>
 <translation id="922540222991413931">Bővítmény-, alkalmazás- és felhasználói szkripttelepítési források konfigurálása</translation>
 <translation id="924557436754151212">Mentett jelszavak importálása az alapértelmezett böngészőből az első indításkor</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index cfd79d9..824d133 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -397,7 +397,6 @@
 
       Peringatan: Sebaiknya jangan mendelegasikan kontrol versi <ph name="PRODUCT_OS_NAME" /> ke aplikasi kios karena tindakan tersebut dapat mencegah perangkat dari menerima update software dan perbaikan keamanan penting. Mendelegasikan kontrol versi <ph name="PRODUCT_OS_NAME" /> dapat menimbulkan risiko terhadap pengguna.</translation>
 <translation id="1675002386741412210">Didukung di:</translation>
-<translation id="1689963000958717134">Memungkinkan konfigurasi jaringan dorong untuk diterapkan pada semua pengguna perangkat <ph name="PRODUCT_OS_NAME" />. Konfigurasi jaringan adalah string berformat JSON seperti yang didefinisikan oleh format Konfigurasi Jaringan Terbuka yang dideskripsikan di <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Mengonfigurasi ketersediaan dan perilaku fungsionalitas update firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Setiap setelan dapat ditentukan dalam properti JSON:
@@ -447,7 +446,7 @@
       Jika kebijakan diaktifkan, pengguna harus memilih untuk mengikuti perilaku default, yaitu setiap situs akan dijalankan dalam prosesnya sendiri.
       Jika kebijakan ini dinonaktifkan atau tidak dikonfigurasikan, pengguna akan dapat mengubah setelan ini (misalnya, menggunakan entri "Nonaktifkan isolasi situs" di chrome://flags).
       </translation>
-<translation id="1767673020408652620">Aktifkan fitur Rekomendasi Aplikasi pada Status Nol Kotak Penelusuran</translation>
+<translation id="1767673020408652620">Aktifkan fitur Rekomendasi Aplikasi pada Status Kosong Kotak Penelusuran</translation>
 <translation id="1781356041596378058">Kebijakan ini juga mengontrol akses ke Opsi Developer Android. Jika Anda menyetel kebijakan ini ke true, pengguna tidak dapat mengakses Opsi Developer. Jika Anda menyetel kebijakan ini ke false atau tidak menyetel kebijakan ini, pengguna dapat mengakses Opsi Developer dengan menge-tap tujuh kali nomor versi di aplikasi setelan Android.</translation>
 <translation id="1793346220873697538">Nonaktifkan pencetakan PIN secara default</translation>
 <translation id="1797233582739332495">Tampilkan permintaan berulang kepada pengguna yang menunjukkan bahwa peluncuran ulang diperlukan</translation>
@@ -935,16 +934,6 @@
       Jika setelan ini dinonaktifkan, halaman web tidak dapat menggunakan JavaScript dan pengguna tidak dapat mengubah setelan ini.
 
       Jika setelan ini diaktifkan atau tidak disetel, halaman web dapat menggunakan JavaScript, namun pengguna dapat mengubah setelan tersebut.</translation>
-<translation id="2747157663401642394">Mengonfigurasi setelan pengelolaan ekstensi untuk <ph name="PRODUCT_NAME" />.
-
-          Kebijakan ini mengontrol beberapa setelan, termasuk setelan yang dikontrol oleh kebijakan terkait ekstensi yang ada. Kebijakan ini akan mengganti kebijakan yang lama jika keduanya tidak disetel.
-
-          Kebijakan ini memetakan ID ekstensi atau URL update ke konfigurasinya. Dengan ID ekstensi, konfigurasi hanya akan diterapkan ke ekstensi tertentu. Konfigurasi default dapat disetel untuk ID khusus <ph name="DEFAULT_SCOPE" />, yang akan diterapkan ke semua ekstensi yang tidak memiliki konfigurasi kustom yang disetel di kebijakan ini. Dengan URL update, konfigurasi akan diterapkan ke semua ekstensi dengan URL update yang sama persis yang ditetapkan di manifes ekstensi ini, seperti yang dijelaskan di <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Untuk instance Windows yang tidak tergabung dalam domain <ph name="MS_AD_NAME" />, penginstalan otomatis dibatasi untuk aplikasi dan ekstensi yang tercantum di Chrome Web Store.
-
-          Untuk mengetahui deskripsi lengkap terkait kemungkinan setelan dan struktur kebijakan ini, harap kunjungi https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Membatasi rentang port UDP lokal yang digunakan oleh WebRTC</translation>
 <translation id="2757054304033424106">Ketik ekstensi/aplikasi yang diizinkan untuk dipasang</translation>
 <translation id="2758084448533744848">Menentukan zona waktu yang diterapkan untuk digunakan di perangkat. Jika kebijakan ini disetel, pengguna di perangkat tidak dapat mengganti zona waktu yang ditentukan. Jika nilai yang tidak valid diberikan, kebijakan tetap diaktifkan menggunakan "GMT". Jika string kosong diberikan, kebijakan diabaikan.
@@ -962,11 +951,11 @@
 
       Setiap entri daftar menentukan pengenal, yang digunakan secara internal untuk menunjukkan akun lokal perangkat yang berbeda secara terpisah.</translation>
 <translation id="2769952903507981510">Mengonfigurasi nama domain yang dibutuhkan untuk hosting akses jarak jauh</translation>
-<translation id="2783078941107212091">Aktifkan fitur Rekomendasi Aplikasi pada Status Nol kotak penelusuran di peluncur.
+<translation id="2783078941107212091">Aktifkan fitur Rekomendasi Aplikasi pada Status Kosong kotak penelusuran di peluncur.
 
-          Jika kebijakan ini ditetapkan ke true, Rekomendasi Aplikasi dapat muncul dalam penelusuran dengan status nol.
+          Jika kebijakan ini ditetapkan ke true, Rekomendasi Aplikasi dapat muncul dalam penelusuran dengan status kosong.
 
-          Jika kebijakan ini ditetapkan ke false, Rekomendasi Aplikasi tidak akan muncul dalam penelusuran dengan status nol.
+          Jika kebijakan ini ditetapkan ke false, Rekomendasi Aplikasi tidak akan muncul dalam penelusuran dengan status kosong.
 
           Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya.
 
@@ -1635,20 +1624,19 @@
           dinonaktifkan oleh pengguna. Semua izin yang diminta oleh
           aplikasi/ekstensi diberikan secara implisit, tanpa interaksi pengguna,
           termasuk izin tambahan apa pun yang diminta oleh versi berikutnya dari
-          aplikasi/ekstensi tersebut. Selain itu, izin diberikan untuk API ekstensi
-          enterprise.deviceAttributes dan enterprise.platformKeys.
-           (Kedua API ini tidak tersedia untuk aplikasi/ekstensi yang
-          tidak diinstal otomatis.)
+          aplikasi/ekstensi tersebut. Selain itu, izin diberikan untuk API ekstensi enterprise.deviceAttributes dan enterprise.platformKeys.
+          (Kedua API ini tidak tersedia untuk aplikasi/ekstensi yang
+          tidak diinstal paksa.)
 
-          Kebijakan ini lebih diutamakan daripada kebijakan <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> yang berpotensi bentrok. Jika aplikasi atau ekstensi yang sebelumnya diinstal otomatis telah dihapus dari daftar ini, aplikasi/ekstensi tersebut akan otomatis di-uninstal oleh <ph name="PRODUCT_NAME" />.
+          Kebijakan ini lebih diutamakan daripada kebijakan <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> yang berpotensi bentrok. Jika aplikasi atau ekstensi yang sebelumnya diinstal paksa telah dihapus dari daftar ini, aplikasi/ekstensi tersebut akan otomatis di-uninstal oleh <ph name="PRODUCT_NAME" />.
 
-          Untuk instance Windows yang tidak tergabung dalam domain <ph name="MS_AD_NAME" />, penginstalan otomatis dibatasi untuk aplikasi dan ekstensi yang tercantum di Chrome Web Store.
+          Untuk instance Windows yang tidak tergabung dalam domain <ph name="MS_AD_NAME" />, penginstalan paksa dibatasi untuk aplikasi dan ekstensi yang tercantum di Chrome Web Store.
 
-          Perlu diperhatikan bahwa kode sumber untuk ekstensi apa pun dapat diubah oleh pengguna melalui Developer Tools (namun berpotensi membuat ekstensi tidak berfungsi lagi). Jika hal ini menjadi masalah, kebijakan <ph name="DEVELOPER_TOOLS_POLICY_NAME" /> sebaiknya diterapkan.
+          Perlu diperhatikan bahwa kode sumber untuk ekstensi apa pun dapat diubah oleh pengguna melalui Developer Tools (namun berpotensi membuat ekstensi tidak berfungsi lagi). Jika hal ini menjadi masalah, kebijakan <ph name="DEVELOPER_TOOLS_POLICY_NAME" /> sebaiknya ditetapkan.
 
           Setiap item daftar kebijakan merupakan string yang memuat ID ekstensi dan, terkadang, URL "update" yang dipisahkan titik koma (<ph name="SEMICOLON" />). ID ekstensi adalah string 32 huruf yang ditemukan misalnya di <ph name="CHROME_EXTENSIONS_LINK" /> saat dalam mode developer. URL "update", jika ditentukan, semestinya mengarah ke dokumen XML Manifes Update seperti yang dijelaskan di <ph name="LINK_TO_EXTENSION_DOC1" />. Secara default, URL update Chrome Web Store digunakan (yang saat ini adalah "https://clients2.google.com/service/update2/crx"). Perhatikan bahwa URL "update" yang ditetapkan dalam kebijakan ini hanya digunakan untuk penginstalan awal; update ekstensi berikutnya akan menggunakan URL update yang ditunjukkan dalam manifes ekstensi. Perhatikan juga bahwa penetapan URL "update" secara eksplisit diwajibkan pada versi <ph name="PRODUCT_NAME" /> hingga dan termasuk 67.
 
-          Misalnya, <ph name="EXTENSION_POLICY_EXAMPLE" /> menginstal ekstensi dengan id <ph name="EXTENSION_ID_SAMPLE" /> dari URL "update" Chrome Web Store standar. Untuk mendapatkan informasi selengkapnya tentang ekstensi hosting, lihat: <ph name="LINK_TO_EXTENSION_DOC2" />.
+          Misalnya, <ph name="EXTENSION_POLICY_EXAMPLE" /> menginstal aplikasi <ph name="EXTENSION_ID_SAMPLE" /> dari URL "update" Chrome Web Store standar. Untuk mendapatkan informasi selengkapnya tentang ekstensi hosting, lihat: <ph name="LINK_TO_EXTENSION_DOC2" />.
 
           Jika kebijakan ini tidak ditetapkan, tidak ada aplikasi atau ekstensi yang otomatis diinstal dan pengguna dapat meng-uninstal aplikasi atau ekstensi apa pun di <ph name="PRODUCT_NAME" />.
 
@@ -1700,30 +1688,6 @@
       Kebijakan ini hanya memengaruhi pengguna yang melakukan autentikasi menggunakan SAML.</translation>
 <translation id="4105989332710272578">Nonaktifkan penerapan Transparansi Sertifikat untuk daftar URL</translation>
 <translation id="4121350739760194865">Mencegah promosi apl muncul di halaman tab baru</translation>
-<translation id="4125606414556046117">Kebijakan ini memungkinkan Anda mengonfigurasi gambar wallpaper yang ditampilkan di desktop dan di latar belakang layar login untuk pengguna. Kebijakan ini ditetapkan dengan menentukan URL tempat <ph name="PRODUCT_OS_NAME" /> dapat mendownload gambar wallpaper dan hash kriptografi yang digunakan untuk memverifikasi integritas download. Gambar harus dalam format JPEG dan ukurannya tidak boleh lebih dari 16 MB. URL harus dapat diakses tanpa autentikasi apa pun.
-
-      Gambar wallpaper akan didownload dan disimpan di cache. Gambar akan didownload ulang setiap kali URL atau hash berubah.
-
-      Kebijakan ini harus ditentukan sebagai string yang menunjukkan URL dan hash dalam format JSON, yang sesuai dengan skema berikut:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL tempat gambar wallpaper dapat didownload.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hash SHA-256 dari gambar wallpaper.",
-            "type": "string"
-          }
-        }
-      }
-
-      Jika kebijakan ini ditetapkan, <ph name="PRODUCT_OS_NAME" /> akan mendownload dan menggunakan gambar wallpaper.
-
-      Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya.
-
-      Jika kebijakan ini tidak ditetapkan, pengguna dapat memilih gambar yang akan ditampilkan di desktop dan di latar belakang layar login.</translation>
 <translation id="412697421478384751">Izinkan pengguna menyetel PIN lemah untuk PIN layar kunci</translation>
 <translation id="4138655880188755661">Batas Waktu</translation>
 <translation id="4144164749344898721">Kebijakan ini mengontrol beberapa setelan untuk strategi pengelolaan daya saat pengguna menganggur.
@@ -2596,8 +2560,8 @@
 <translation id="5898486742390981550">Ketika beberapa pengguna masuk, hanya pengguna utama yang dapat menggunakan aplikasi Android.</translation>
 <translation id="5901427587865226597">Khusus pencetakan dupleks</translation>
 <translation id="5903898512448364160">
-      Jika kebijakan ini ditetapkan ke True, kebijakan cloud akan lebih diutamakan jika terjadi bentrok dengan kebijakan platform.
-      Jika kebijakan ini ditetapkan ke False atau tidak dikonfigurasi, kebijakan platform akan lebih diutamakan jika terjadi bentrok dengan kebijakan cloud.
+      Jika kebijakan ini ditetapkan ke true, kebijakan cloud akan lebih diutamakan jika terjadi bentrok dengan kebijakan platform.
+      Jika kebijakan ini ditetapkan ke false atau tidak dikonfigurasi, kebijakan platform akan lebih diutamakan jika terjadi bentrok dengan kebijakan cloud.
 
       Kebijakan ini hanya tersedia sebagai kebijakan platform perangkat wajib dan hanya akan memengaruhi kebijakan cloud lingkup perangkat.
       </translation>
@@ -2642,59 +2606,12 @@
 
       Jika kebijakan ini tidak disetel atau disetel ke salah, perintah cetak memicu layar pratinjau cetak.</translation>
 <translation id="6022948604095165524">Tindakan saat permulaan</translation>
-<translation id="6023030044732320798">Menentukan kumpulan kebijakan yang akan diteruskan ke ARC runtime. Nilainya harus JSON yang valid.
-
-      Kebijakan ini dapat digunakan untuk mengonfigurasi aplikasi Android mana yang dapat diinstal secara otomatis di perangkat: 
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "ID aplikasi Android, misalnya "com.google.android.gm" untuk Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Menentukan cara aplikasi diinstal. OPTIONAL: Aplikasi tersebut tidak diinstal secara otomatis, namun pengguna dapat menginstalnya. Ini merupakan default jika kebijakan tidak ditentukan. PRELOAD: Aplikasi diinstal secara otomatis, namun pengguna dapat meng-uninstalnya. FORCE_INSTALLED: Aplikasi diinstal secara otoamtis dan pengguna tidak dapat meng-uninstalnya. BLOCKED: Aplikasi diblokir dan tidak dapat diinstal. Jika aplikasi diinstal saat menggunakan kebijakan sebelumnya, aplikasi akan di-uninstal".,
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Kebijakan untuk memberi permintaan izin ke aplikasi. PERMISSION_POLICY_UNSPECIFIED: Kebijakan tidak ditentukan. Jika tidak ada kebijakan yang ditentukan untuk izin pada tingkat apa pun, perilaku `PROMPT` akan digunakan secara default. PROMPT: Meminta pengguna untuk memberi izin. GRANT: Memberi izin secara otomatis. DENY: Menolak izin secara otomatis".,
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Objek konfigurasi JSON khusus aplikasi dengan kumpulan pasangan kunci-nilai, misalnya '"managedConfiguration": { "key1": value1, "key2": value2 }'. Kunci ditentukan dalam manifes aplikasi".,
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Untuk menyematkan aplikasi ke peluncur, lihat PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL sekejap penyedia penelusuran default</translation>
 <translation id="603410445099326293">Parameter untuk URL yang disarankan yang menggunakan POST</translation>
 <translation id="6034341625190551415">Mengontrol sesi publik dan jenis akun kios.</translation>
 <translation id="6034603289689965535">Mengizinkan halaman menampilkan pop-up saat kontennya dibuka</translation>
 <translation id="6036523166753287175">Mengaktifkan firewall traversal dari host akses jarak jauh</translation>
-<translation id="605475635122964053">Membatasi mode pencetakan PIN. Kebijakan yang tidak disetel dianggap sebagai tidak ada batasan. Jika mode ini tidak tersedia, kebijakan ini akan diabaikan. Perhatikan bahwa fitur pencetakan PIN diaktifkan hanya untuk printer yang menggunakan salah satu dari protokol IPPS, USB, atau IPP-over-USB </translation>
+<translation id="605475635122964053">Membatasi mode pencetakan PIN. Kebijakan yang tidak disetel dianggap sebagai tidak ada batasan. Jika mode ini tidak tersedia, kebijakan ini akan diabaikan. Perhatikan bahwa fitur pencetakan PIN hanya diaktifkan untuk printer yang menggunakan salah satu dari protokol IPPS, USB, atau IPP-over-USB. </translation>
 <translation id="6070667616071269965">Tata letak keyboard layar login perangkat</translation>
 <translation id="6074963268421707432">Jangan izinkan situs apa pun menampilkan pemberitahuan desktop</translation>
 <translation id="6074964551275531965">Setel periode waktu untuk notifikasi update</translation>
@@ -3014,37 +2931,6 @@
       Jika kebijakan ini disetel ke false, klien DNS built-in tidak akan pernah digunakan.
 
       Jika kebijakan ini dibiarkan tidak disetel, klien DNS built-in akan diaktifkan secara default di MacOS, Android (saat DNS Pribadi atau VPN tidak diaktifkan), serta ChromeOS, dan pengguna akan dapat mengubah apakah klien DNS built-in digunakan atau tidak dengan mengedit chrome://flags atau menentukan tanda baris perintah.</translation>
-<translation id="6838056959556423778">Mengganti aturan pemilihan printer default <ph name="PRODUCT_NAME" />.
-
-      Kebijakan ini menentukan aturan untuk memilih printer default di <ph name="PRODUCT_NAME" /> yang terjadi saat fungsi cetak digunakan dengan profil untuk pertama kalinya.
-
-      Jika kebijakan ini disetel, <ph name="PRODUCT_NAME" /> akan mencoba menemukan printer yang sesuai dengan semua atribut yang ditentukan dan memilihnya sebagai printer default. Printer pertama yang ditemukan dan sesuai dengan kebijakan akan dipilih, jika ada printer non unik yang cocok maka printer tersebut dapat dipilih, bergantung pada urutan printer yang ditemukan.
-
-      Jika kebijakan ini tidak disetel atau printer yang sesuai tidak ditemukan selama waktu tunggu, printer PDF yang terpasang akan dipilih sebagai printer default, atau tidak ada printer yang dipilih jika printer PDF tidak tersedia.
-
-      Nilai tersebut diuraikan sebagai objek JSON, sesuai dengan skema berikut:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Perlu tidaknya pembatasan penelusuran printer yang sesuai untuk kumpulan printer tertentu.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Ekspresi reguler untuk mencocokkan ID printer.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Ekspresi reguler untuk mencocokkan nama tampilan printer.",
-            "type": "string"
-          }
-        }
-      }
-
-      Printer yang tersambung ke <ph name="CLOUD_PRINT_NAME" /> dianggap sebagai <ph name="PRINTER_TYPE_CLOUD" />, printer lainnya akan diklasifikasikan sebagai <ph name="PRINTER_TYPE_LOCAL" />.
-      Jika Anda menghapus satu bidang berarti semua nilai yang sesuai, misalnya, tidak menentukan konektivitas akan menyebabkan Pratinjau Cetak mulai mencari semua jenis printer, lokal, dan cloud.
-      Pola ekspresi reguler harus mengikuti sintaksis JavaScript RegExp, dan hasil yang sesuai peka huruf besar/kecil.</translation>
 <translation id="6843296367238757293">Kebijakan ini tidak digunakan lagi. Penggunaannya tidak disarankan. Baca selengkapnya di https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Kebijakan ini dihapus dalam <ph name="PRODUCT_NAME" /> 68 dan digantikan oleh <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Kebijakan ini tidak digunakan lagi dan dihapus di M66, karena hanya digunakan untuk uji coba internal dan merupakan beban keamanan.
@@ -4150,30 +4036,6 @@
       Kebijakan ini hanya memengaruhi pengguna yang menjalankan autentikasi menggunakan SAML.
 
       Nilai kebijakan harus ditentukan dalam detik.</translation>
-<translation id="9027787254195333560">Kebijakan ini memungkinkan Anda mengonfigurasi gambar avatar yang mewakili pengguna di layar login. Kebijakan ini ditetapkan dengan menentukan URL tempat <ph name="PRODUCT_OS_NAME" /> dapat mendownload gambar avatar dan hash kriptografi yang digunakan untuk memverifikasi integritas download. Gambar harus dalam format JPEG dan ukurannya tidak boleh lebih dari 512 kB. URL harus dapat diakses tanpa autentikasi apa pun.
-
-      Gambar avatar didownload dan disimpan di cache. Gambar akan didownload ulang setiap kali URL atau hash berubah.
-
-      Kebijakan ini harus ditentukan sebagai string yang menunjukkan URL dan hash dalam format JSON, yang sesuai dengan skema berikut:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL tempat gambar avatar dapat didownload.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hash SHA-256 gambar avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Jika kebijakan ini ditetapkan, <ph name="PRODUCT_OS_NAME" /> akan mendownload dan menggunakan gambar avatar.
-
-      Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya.
-
-      Jika kebijakan ini tidak ditetapkan, pengguna dapat memilih gambar avatar yang mewakili dirinya di layar login.</translation>
 <translation id="9035964157729712237">ID Ekstensi yang dikeluarkan dari daftar hitam</translation>
 <translation id="9038058011835642205">Menetapkan daftar situs yang diinstal otomatis, tanpa interaksi pengguna, dan yang tidak dapat di-uninstal atau dinonaktifkan oleh pengguna.
 
@@ -4186,7 +4048,6 @@
       Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya.
 
       Nilai kebijakan harus ditentukan dalam milidetik. Nilai dikunci ke rentang 30 detik hingga 24 jam.</translation>
-<translation id="9042911395677044526">Memungkinkan konfigurasi jaringan dorongan untuk diterapkan per pengguna ke perangkat <ph name="PRODUCT_OS_NAME" />. Konfigurasi jaringan adalah string berformat JSON seperti yang didefinisikan oleh format Konfigurasi Jaringan Terbuka yang diuraikan di <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Kebijakan ini mengontrol apakah perangkat harus diupdate ke Quick Fix Build atau tidak.
 
       Jika nilai kebijakan ditetapkan ke token yang dipetakan ke Quick Fix Build, perangkat akan diupdate ke Quick Fix Build yang sesuai jika update tidak diblokir oleh kebijakan lain.
@@ -4259,17 +4120,6 @@
       Jika kebijakan disetel ke false, 'Header dan footer' tidak dipilih dalam dialog pratinjau cetak, dan pengguna tidak dapat mengubahnya.
 
       Jika kebijakan disetel ke true, 'Header dan footer' dipilih dalam dialog pratinjau cetak, dan pengguna tidak dapat mengubahnya.</translation>
-<translation id="9213347477683611358">Mengonfigurasi gambar wallpaper tingkat perangkat yang ditampilkan di layar login jika belum ada pengguna yang login ke perangkat. Kebijakan ini disetel dengan menetapkan URL tempat perangkat Chrome OS dapat mendownload gambar wallpaper dan potongan kriptografi yang digunakan untuk memverifikasi integritas download. Gambar harus dalam format JPEG dan ukuran filenya tidak boleh melebihi 16MB. URL harus dapat diakses tanpa autentikasi apa pun. Gambar wallpaper akan didownload dan disimpan dalam cache. Gambar ini akan didownload jika URL atau potongan berubah.
-
-      Kebijakan ini harus ditetapkan sebagai string yang mengekspresikan URL dan potongan dalam format JSON, misalnya:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Jika kebijakan wallpaper perangkat disetel dan belum ada pengguna yang login ke perangkat, perangkat Chrome OS akan mendownload dan menggunakan gambar wallpaper pada layar login. Setelah pengguna login, kebijakan wallpaper pengguna akan diterapkan.
-
-      Jika kebijakan wallpaper tidak disetel namun kebijakan wallpaper pengguna disetel, kebijakan wallpaper pengguna akan menentukan gambar yang akan ditampilkan.</translation>
 <translation id="9217154963008402249">Frekuensi paket jaringan pemantauan</translation>
 <translation id="922540222991413931">Konfigurasi sumber pemasangan skrip pengguna, aplikasi, dan ekstensi</translation>
 <translation id="924557436754151212">Impor sandi yang disimpan dari browser default saat pertama kali dijalankan</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index d900d18..1c83663 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -54,13 +54,13 @@
 <translation id="1049138910114524876">Consente di configurare la lingua da utilizzare per la schermata di accesso di <ph name="PRODUCT_OS_NAME" />.
 
       Se questa norma viene impostata, la schermata di accesso verrà sempre visualizzata nella lingua stabilita dal primo valore di questa norma (la norma viene definita come elenco per la compatibilità con le versioni successive). Se la norma non viene impostata o se viene impostato un elenco vuoto, la schermata di accesso verrà visualizzata nella lingua dell'ultima sessione utente. Se la norma viene impostata su un valore non corrispondente a una lingua valida, la schermata di accesso verrà visualizzata in una lingua di riserva (attualmente en-US).</translation>
-<translation id="1052499923181221200">Questa norma non ha effetti a meno che SamlInSessionPasswordChangeEnabled sia impostata su true.
-      Se quella norma è impostata su true e questa norma è impostata su (ad esempio) 14, significa che gli utenti SAML riceveranno una notifica che li informa con 14 giorni di anticipo che la password scadrà in una determinata data.
+<translation id="1052499923181221200">Questo criterio non ha effetti a meno che SamlInSessionPasswordChangeEnabled sia impostato su true.
+      Se quel criterio è impostato su true e questo criterio è impostato su (ad esempio) 14, significa che gli utenti SAML riceveranno una notifica che li informa con 14 giorni di anticipo che la password scadrà in una determinata data.
       Quindi, gli utenti possono organizzarsi immediatamente, modificare la password all'interno della sessione e aggiornarla prima della scadenza.
-      Tuttavia, queste notifiche verranno mostrate solo se le informazioni sulla scadenza della password vengono inviate al dispositivo dal provider di identità SAML durante il flusso di accesso SAML.
-      Se imposti la norma su zero, gli utenti non riceveranno nessuna notifica in anticipo, ma verranno avvisati una volta che la password è scaduta.
+      Tuttavia, queste notifiche verranno mostrate solo se le informazioni sulla scadenza della password vengono inviate al dispositivo dal Provider di identità SAML durante il flusso di accesso SAML.
+      Se imposti il criterio su zero, gli utenti non riceveranno nessuna notifica in anticipo, ma verranno avvisati una volta che la password è scaduta.
 
-      Se questa norma viene impostata, l'utente non può modificarla o ignorarla.</translation>
+      Se questo criterio viene impostato, l'utente non può modificarlo o ignorarlo.</translation>
 <translation id="1062011392452772310">Attivazione dell'attestazione da remoto per il dispositivo</translation>
 <translation id="1062407476771304334">Sostituisci</translation>
 <translation id="1079801999187584280">Non consentire l'utilizzo degli Strumenti per sviluppatori</translation>
@@ -133,13 +133,13 @@
 <translation id="1160939557934457296">Disattiva procedendo dalla pagina di avviso Navigazione sicura</translation>
 <translation id="1171342272070128466">Consente di attivare la funzione di accessibilità Lente d'ingrandimento ancorata.
 
-          Se questa norma viene impostata su true, la lente d'ingrandimento ancorata sarà sempre attiva.
+          Se questo criterio viene impostato su true, la lente d'ingrandimento ancorata sarà sempre attiva.
 
-          Se questa norma viene impostata su false, la lente d'ingrandimento ancorata sarà sempre disattivata.
+          Se questo criterio viene impostato su false, la lente d'ingrandimento ancorata sarà sempre disattivata.
 
-          Se imposti questa norma, gli utenti non potranno modificarla o ignorarla.
+          Se questo criterio viene impostato, gli utenti non potranno modificarlo o ignorarlo.
 
-          Se questa norma non viene impostata, inizialmente la lente d'ingrandimento ancorata è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
+          Se questo criterio non viene impostato, inizialmente la lente d'ingrandimento ancorata è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation>
 <translation id="1189817621108632689">Questa norma consente di impostare un elenco di pattern URL che specificano i siti in cui non è consentita la visualizzazione di immagini.
 
           Se questa norma non viene impostata, per tutti i siti verrà utilizzato il valore predefinito globale della norma "DefaultImagesSetting", se è impostata, oppure verrà utilizzata la configurazione personale dell'utente.
@@ -317,11 +317,11 @@
 <translation id="1507382822467487898">
           Consente di configurare quale indirizzo MAC (media access control) verrà utilizzato quando il dispositivo è inserito in un dock.
 
-          Quando alcuni modelli di dispositivi vengono inseriti in un dock, per impostazione predefinita l'indirizzo MAC designato per il dispositivo viene utilizzato per identificare il dispositivo su Ethernet. Questa norma consente all'amministratore di modificare l'origine dell'indirizzo MAC mentre il dispositivo è inserito nel dock.
+          Quando alcuni modelli di dispositivi vengono inseriti in un dock, per impostazione predefinita l'indirizzo MAC designato per il dispositivo viene utilizzato per identificare il dispositivo su Ethernet. Questo criterio consente all'amministratore di modificare l'origine dell'indirizzo MAC mentre il dispositivo è inserito nel dock.
 
-          Se "DeviceDockMacAddress" è selezionato o se la norma non è impostata, verrà utilizzato l'indirizzo MAC designato del dock.
+          Se "DeviceDockMacAddress" è selezionato o se il criterio non è impostato, verrà utilizzato l'indirizzo MAC designato del dock.
 
-          Se "DeviceNicMacAddress" è selezionato, verrà utilizzato l'indirizzo MAC NIC (network interface controller).
+          Se "DeviceNicMacAddress" è selezionato, verrà utilizzato l'indirizzo MAC NIC (network interface controller) del dispositivo.
 
           Se "DockNicMacAddress" è selezionato, verrà utilizzato l'indirizzo MAC NIC del dock.
 
@@ -392,7 +392,6 @@
 
 Avviso. Non è consigliato delegare il controllo della versione di <ph name="PRODUCT_OS_NAME" /> a un'app kiosk, poiché potrebbe impedire al dispositivo di ricevere aggiornamenti software e correzioni di sicurezza fondamentali. Delegare il controllo della versione di <ph name="PRODUCT_OS_NAME" /> potrebbe mettere a rischio gli utenti.</translation>
 <translation id="1675002386741412210">Supportato su:</translation>
-<translation id="1689963000958717134">Consente di forzare l'applicazione della configurazione di rete per tutti gli utenti di un dispositivo <ph name="PRODUCT_OS_NAME" />. La configurazione di rete è una stringa in formato JSON definita secondo il formato Open Network Configuration descritto all'indirizzo <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="1704516734140344991">Consente di configurare disponibilità e comportamento della funzionalità di aggiornamento del firmware <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Le impostazioni individuali possono essere specificate nelle proprietà JSON:
@@ -739,17 +738,17 @@
 <translation id="2303795211377219696">Attiva la Compilazione automatica per le carte di credito</translation>
 <translation id="2309390639296060546">Impostazione di geolocalizzazione predefinita</translation>
 <translation id="2327252517317514801">Definisci i domini autorizzati ad accedere a G Suite</translation>
-<translation id="2356878440219553005">Consente di specificare la norma di gestione della modalità di ricarica della batteria.
+<translation id="2356878440219553005">Consente di specificare il criterio di gestione della modalità di ricarica della batteria.
 
           Controlla in modo dinamico la carica della batteria per minimizzarne l'usura dovuta alle sollecitazioni dell'utilizzo e aumentarne la durata.
 
           Se la modalità di ricarica personalizzata della batteria è selezionata, è necessario specificare DeviceBatteryChargeCustomStartCharging e DeviceBatteryChargeCustomStopCharging.
 
-          Se questa norma è impostata, la modalità di ricarica della batteria verrà applicata se supportata sul dispositivo.
+          Se questo criterio è impostato, la modalità di ricarica della batteria verrà applicata se supportata sul dispositivo.
 
-          Se questa norma non viene impostata ed è supportata sul dispositivo, verrà applicata la modalità di ricarica standard della batteria e l'impostazione non potrà essere modificata dall'utente.
+          Se questo criterio non viene impostato ed è supportato sul dispositivo, verrà applicata la modalità di ricarica standard della batteria e l'impostazione non potrà essere modificata dall'utente.
 
-          Nota: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> sostituisce questa norma se la prima è specificata.</translation>
+          Nota: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> sostituisce questo criterio se il primo è specificato.</translation>
 <translation id="237494535617297575">Consente di impostare un elenco di pattern URL che specificano i siti autorizzati a visualizzare notifiche. Se questa norma non viene impostata, per tutti i siti verrà utilizzato il valore predefinito globale della norma "DefaultNotificationsSetting", se è impostata, oppure verrà utilizzata la configurazione personale dell'utente.</translation>
 <translation id="2386362615870139244">Consenti Wakelock dello schermo</translation>
 <translation id="2411817661175306360">L'avviso di protezione tramite password non è attivo</translation>
@@ -927,16 +926,6 @@
       Se questa impostazione viene disattivata, le pagine web non potranno utilizzare JavaScript e l'utente non potrà modificare tale impostazione.
 
       Se questa impostazione viene attivata o non è impostata, le pagine web potranno utilizzare JavaScript ma l'utente potrà modificare tale impostazione.</translation>
-<translation id="2747157663401642394">Consente di configurare le impostazioni di gestione delle estensioni per <ph name="PRODUCT_NAME" />.
-
-          Questa norma controlla più impostazioni, tra cui quelle controllate da norme correlate alle estensioni già presenti. Questa norma sostituisce tutte le norme precedenti se vengono impostate entrambe.
-
-          Questa norma consente di mappare un ID estensione o un URL di aggiornamento alla relativa configurazione. Con un ID estensione, la configurazione viene applicata solo all'estensione specificata. È possibile impostare una configurazione predefinita per l'ID speciale <ph name="DEFAULT_SCOPE" />, che verrà applicato a tutte le estensioni per cui non è impostata una configurazione personalizzata in questa norma. Con un URL di aggiornamento, la configurazione verrà applicata a tutte le estensioni con l'esatto URL di aggiornamento indicato nel file manifest dell'estensione, come descritto all'indirizzo <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Per le istanze di Windows che non fanno parte di un dominio <ph name="MS_AD_NAME" />, l'installazione forzata è limitata alle app e alle estensioni elencate nel Chrome Web Store.
-
-          Per una descrizione completa delle possibili impostazioni e della struttura di questa norma, visita la pagina https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Limita l'intervallo di porte UDP locali utilizzato da WebRTC</translation>
 <translation id="2757054304033424106">Tipi di estensioni/app che possono essere installati</translation>
 <translation id="2758084448533744848">Consente di specificare il fuso orario da usare obbligatoriamente per il dispositivo. Se questa norma viene impostata, gli utenti del dispositivo non possono sostituire il fuso orario specificato. Se viene specificato un valore non valido, la norma viene attivata comunque usando il valore "GMT". Se viene specificata una stringa vuota, la norma viene ignorata.
@@ -956,13 +945,13 @@
 <translation id="2769952903507981510">Configura il nome di dominio richiesto per gli host di accesso remoto</translation>
 <translation id="2783078941107212091">Consente di attivare i consigli di app a stato nullo della casella di ricerca in Avvio app.
 
-          Se questa norma viene impostata su true, i consigli di app potrebbero essere visualizzati nella ricerca a stato nullo.
+          Se questo criterio viene impostato su true, i consigli di app potrebbero essere visualizzati nella ricerca a stato nullo.
 
-          Se questa norma viene impostata su false, i consigli di app non verranno visualizzati nella ricerca a stato nullo.
+          Se questo criterio viene impostato su false, i consigli di app non verranno visualizzati nella ricerca a stato nullo.
 
-          Se imposti questa norma, gli utenti non potranno modificarla o ignorarla.
+          Se questo criterio viene impostato, gli utenti non potranno modificarlo o ignorarlo.
 
-          Se questa norma non viene impostata, il valore predefinito è False per i dispositivi gestiti.</translation>
+          Se questo criterio non viene impostato, il valore predefinito è False per i dispositivi gestiti.</translation>
 <translation id="2787173078141616821">Segnala informazioni sullo stato di Android</translation>
 <translation id="2799297758492717491">Consenti la riproduzione automatica dei contenuti multimediali per una whitelist di pattern URL</translation>
 <translation id="2801155097555584385">Imposta il valore personalizzato espresso in percentuale raggiunto il quale la batteria avvia la ricarica</translation>
@@ -1157,9 +1146,9 @@
       Indipendentemente da se o come questa norma è impostata, l'utente non può modificare l'impostazione di ottimizzazione di WPAD.</translation>
 <translation id="3071839057966069710">Consente di configurare un elenco di stampanti.
 
-      Questa norma consente agli amministratori di fornire configurazioni delle stampanti ai propri utenti.
+      Questo criterio consente agli amministratori di fornire configurazioni delle stampanti ai propri utenti.
 
-      <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> sono stringhe in formato libero che è possibile personalizzare per selezionare facilmente le stampanti. I valori <ph name="PRINTER_MANUFACTURER" /> e <ph name="PRINTER_MODEL" />, che rappresentano il produttore e il modello della stampante, consentono agli utenti finali di identificare più facilmente le stampanti . Il valore <ph name="PRINTER_URI" /> deve essere un indirizzo raggiungibile da un computer client che includa <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> e <ph name="URI_QUEUE" />. Il valore <ph name="PRINTER_UUID" /> è facoltativo, ma se viene specificato viene utilizzato per consentire la deduplicazione delle stampanti <ph name="ZEROCONF_DISCOVERY" />.
+      <ph name="PRINTER_DISPLAY_NAME" /> e <ph name="PRINTER_DESCRIPTION" /> sono stringhe in formato libero che è possibile personalizzare per selezionare facilmente le stampanti. I valori <ph name="PRINTER_MANUFACTURER" /> e <ph name="PRINTER_MODEL" />, che rappresentano il produttore e il modello della stampante, consentono agli utenti finali di identificare più facilmente le stampanti.  Il valore <ph name="PRINTER_URI" /> deve essere un indirizzo raggiungibile da un computer client che includa <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> e <ph name="URI_QUEUE" />. Il valore <ph name="PRINTER_UUID" /> è facoltativo, ma se viene specificato viene utilizzato per consentire la deduplicazione delle stampanti <ph name="ZEROCONF_DISCOVERY" />.
 
       Il valore <ph name="PRINTER_EFFECTIVE_MODEL" /> deve corrispondere a una delle stringhe che rappresentano una stampante supportata da <ph name="PRODUCT_NAME" />. La stringa verrà usata per identificare e installare il file PPD appropriato per la stampante. È possibile trovare ulteriori informazioni all'indirizzo https://support.google.com/chrome?p=noncloudprint.
 
@@ -1169,26 +1158,26 @@
 
       La configurazione viene completata al primo utilizzo della stampante.  I file PPD vengono scaricati soltanto quando viene utilizzata la stampante.  Dopodiché, i PPD utilizzati più spesso vengono memorizzati nella cache.
 
-      Questa norma non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi.  È supplementare alla configurazione di stampanti da parte dei singoli utenti.
+      Questo criterio non influisce sulla possibilità per gli utenti di configurare le stampanti su singoli dispositivi.  È supplementare alla configurazione di stampanti da parte dei singoli utenti.
 
-      Per i dispositivi Active Directory gestiti, questa norma supporta l'espansione di <ph name="MACHINE_NAME_VARIABLE" /> al nome della macchina Active Directory oppure a una sua sottostringa. Ad esempio, se il nome della macchina è <ph name="MACHINE_NAME_EXAMPLE" />, la variabile <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> verrà sostituita dai quattro caratteri che iniziano dopo la sesta posizione, ad esempio <ph name="MACHINE_NAME_PART_EXAMPLE" />. Tieni presente che la posizione è in base zero.
+      Per i dispositivi Active Directory gestiti, questo criterio supporta l'espansione di <ph name="MACHINE_NAME_VARIABLE" /> al nome della macchina Active Directory oppure a una sua sottostringa. Ad esempio, se il nome della macchina è <ph name="MACHINE_NAME_EXAMPLE" />, la variabile <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> verrà sostituita dai quattro caratteri che iniziano dopo la sesta posizione, ad esempio <ph name="MACHINE_NAME_PART_EXAMPLE" />. Tieni presente che la posizione è in base zero.
       </translation>
 <translation id="3072045631333522102">Salvaschermo da utilizzare nella schermata di accesso in modalità retail</translation>
 <translation id="3072847235228302527">Imposta i Termini di servizio di un account locale del dispositivo</translation>
 <translation id="3077183141551274418">Abilita o disabilita i cicli di vita delle schede</translation>
 <translation id="3079417254871857650">Consente di specificare l'azione che deve essere eseguita quando la home directory dell'utente è stata creata con la crittografia ecryptfs.
 
-      Se imposti questa norma su "DisallowArc", le app Android verranno disattivate per l'utente e non verrà eseguita nessuna migrazione dalla crittografia ecryptfs alla crittografia ext4. Alle app Android non verrà impedita l'esecuzione quando la home directory è già criptata con ext4.
+      Se imposti questo criterio su "DisallowArc", le app Android verranno disattivate per l'utente e non verrà eseguita nessuna migrazione dalla crittografia ecryptfs alla crittografia ext4. Alle app Android non verrà impedita l'esecuzione quando la home directory è già criptata con ext4.
 
-      Se imposti questa norma su "Migrate", all'accesso le home directory criptate con ecryptfs migreranno automaticamente alla crittografia ext4 senza chiedere l'autorizzazione dell'utente.
+      Se imposti questo criterio su "Migrate", all'accesso le home directory criptate con ecryptfs migreranno automaticamente alla crittografia ext4 senza chiedere l'autorizzazione dell'utente.
 
-      Se imposti questa norma su "Wipe", le home directory criptate con ecryptfs saranno eliminate all'accesso e al loro posto verranno create nuove home directory criptate con ext4. Avviso: questa operazione rimuove i dati locali dell'utente.
+      Se imposti questo criterio su "Wipe", le home directory criptate con ecryptfs saranno eliminate all'accesso e al loro posto verranno create nuove home directory criptate con ext4. Avviso: questa operazione rimuove i dati locali dell'utente.
 
-      Se imposti questa norma su "MinimalMigrate", le home directory criptate con ecryptfs saranno eliminate all'accesso e al loro posto verranno create nuove home directory criptate con ext4. Tuttavia, si cercherà di mantenere i token di accesso per evitare all'utente di dover accedere di nuovo. Avviso: questa operazione rimuove i dati locali dell'utente.
+      Se imposti questo criterio su "MinimalMigrate", le home directory criptate con ecryptfs saranno eliminate all'accesso e al loro posto verranno create nuove home directory criptate con ext4. Tuttavia, si cercherà di mantenere i token di accesso per evitare all'utente di dover accedere di nuovo. Avviso: questa operazione rimuove i dati locali dell'utente.
 
-      Se imposti questa norma su un'opzione non più supportata ("AskUser" o "AskForEcryptfsArcUsers"), verrà trattata come se avessi selezionato "Migrate".
+      Se imposti questo criterio su un'opzione non più supportata ("AskUser" o "AskForEcryptfsArcUsers"), verrà trattata come se avessi selezionato "Migrate".
 
-      Questa norma non si applica agli utenti kiosk. Se questa norma non è impostata, il dispositivo si comporterà come se fosse stato scelto "DisallowArc".</translation>
+      Questo criterio non si applica agli utenti kiosk. Se questo criterio non è impostato, il dispositivo si comporterà come se fosse stato scelto "DisallowArc".</translation>
 <translation id="3086995894968271156">Consente di configurare Cast Receiver in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3088796212846734853">Questa norma consente di impostare un elenco di pattern URL che specificano i siti in cui è consentita la visualizzazione di immagini.
 
@@ -1256,10 +1245,10 @@
       Se l'impostazione è disattivata, gli utenti non possono attivare il proxy e il computer non può condividere le stampanti con <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="3312206664202507568">Consente di attivare una pagina su chrome://password-change che permette agli utenti SAML di cambiare le loro password SAML all'interno della sessione, il che assicura che le password SAML e quelle per la schermata di blocco rimangano sincronizzate.
 
-      Questa norma inoltre consente le notifiche che avvisano gli utenti SAML se le loro password SAML stanno per scadere, in modo che possano organizzarsi immediatamente ed effettuare una modifica della password all'interno della sessione.
-      Tuttavia, queste notifiche verranno mostrate solo se le informazioni sulla scadenza della password vengono inviate al dispositivo dal provider di identità SAML durante il flusso di accesso SAML.
+      Questo criterio inoltre consente le notifiche che avvisano gli utenti SAML se le loro password SAML stanno per scadere, in modo che possano organizzarsi immediatamente ed effettuare una modifica della password all'interno della sessione.
+      Tuttavia, queste notifiche verranno mostrate solo se le informazioni sulla scadenza della password vengono inviate al dispositivo dal Provider di identità SAML durante il flusso di accesso SAML.
 
-      Se questa norma viene impostata, l'utente non può modificarla o ignorarla.</translation>
+      Se questo criterio viene impostato, l'utente non può modificarlo o ignorarlo.</translation>
 <translation id="3322771899429619102">Consente di impostare un elenco di pattern URL che specificano i siti in cui è consentito l'utilizzo della generazione di chiavi. Se un pattern URL è indicato nella norma "KeygenBlockedForUrls", quest'ultima ha la precedenza su queste eccezioni.
 
           Se questa norma non viene impostata, per tutti i siti verrà utilizzato il valore predefinito globale della norma "DefaultKeygenSetting", se è impostata, oppure verrà utilizzata la configurazione personale dell'utente.</translation>
@@ -1388,7 +1377,7 @@
       Se questa norma viene impostata su "DeveloperToolsAllowed" (valore 1), gli Strumenti per sviluppatori e la console JavaScript saranno accessibili e utilizzabili in tutti i contesti, incluso il contesto delle estensioni installate in base a norme aziendali.
       Se questa norma viene impostata su "DeveloperToolsDisallowed" (valore 2), gli Strumenti per sviluppatori non saranno accessibili e non sarà più possibile esaminare gli elementi del sito web. Le eventuali scorciatoie da tastiera e le voci dei menu contestuali o di altri menu che consentono di aprire gli Strumenti per sviluppatori o la console JavaScript verranno disattivate.</translation>
 <translation id="3547954654003013442">Impostazioni proxy</translation>
-<translation id="3550875587920006460">Consente di impostare una pianificazione personalizzata per verificare la presenza di aggiornamenti. La scelta è valida per tutti gli utenti e per tutte le interfacce sul dispositivo. Dopo aver impostato la norma, il dispositivo controllerà se ci sono aggiornamenti disponibili in base alla pianificazione. La norma deve essere rimossa per annullare ulteriori controlli pianificati della disponibilità di aggiornamenti.</translation>
+<translation id="3550875587920006460">Consente di impostare una pianificazione personalizzata per verificare la presenza di aggiornamenti. La scelta è valida per tutti gli utenti e per tutte le interfacce sul dispositivo. Dopo aver impostato il criterio, il dispositivo controllerà se ci sono aggiornamenti disponibili in base alla pianificazione. Il criterio deve essere rimosso per annullare ulteriori controlli pianificati della disponibilità di aggiornamenti.</translation>
 <translation id="355118380775352753">Siti web da aprire in un browser alternativo</translation>
 <translation id="3554984410014457319">Consente all'Assistente Google di ascoltare la frase di attivazione vocale</translation>
 <translation id="356579196325389849">Gli utenti possono configurare il canale di rilascio di Chrome OS</translation>
@@ -1496,15 +1485,15 @@
 <translation id="382476126209906314">Configura il prefisso TalkGadget per gli host di accesso remoto</translation>
 <translation id="3824972131618513497">Consente di controllare le impostazioni relative alla gestione dell'alimentazione e al riavvio.</translation>
 <translation id="3826475866868158882">Servizi di geolocalizzazione di Google attivi</translation>
-<translation id="3831054243924627613">Questa norma controlla lo stato iniziale del backup e ripristino di Android.
+<translation id="3831054243924627613">Questo criterio controlla lo stato iniziale del backup e ripristino di Android.
 
-      Se questa norma non è configurata o non è impostata su <ph name="BR_DISABLED" />, il backup e ripristino di Android viene inizialmente disattivato.
+      Se questo criterio non è configurato o non è impostato su <ph name="BR_DISABLED" />, il backup e ripristino di Android viene inizialmente disattivato.
 
-      Se la norma è impostata su <ph name="BR_ENABLED" />, il backup e ripristino di Android viene inizialmente attivato.
+      Se il criterio è impostato su <ph name="BR_ENABLED" />, il backup e ripristino di Android viene inizialmente attivato.
 
-      Se la norma è impostata su <ph name="BR_UNDER_USER_CONTROL" />, all'utente viene chiesto di scegliere se utilizzare il backup e ripristino di Android. Se l'utente attiva il backup e ripristino, i dati delle app Android vengono caricati sui server di backup di Android e ripristinati dai server per le app compatibili durante la fase di reinstallazione.
+      Se il criterio è impostato su <ph name="BR_UNDER_USER_CONTROL" />, all'utente viene chiesto di scegliere se utilizzare il backup e ripristino di Android. Se l'utente attiva il backup e ripristino, i dati delle app Android vengono caricati sui server di backup di Android e ripristinati dai server per le app compatibili durante la fase di reinstallazione.
 
-      Tieni presente che questa norma controlla lo stato di backup e ripristino di Android solo durante la configurazione iniziale. L'utente può aprire le impostazioni di Android in un secondo momento e attivare o disattivare il backup e ripristino di Android.</translation>
+      Tieni presente che questo criterio controlla lo stato di backup e ripristino di Android solo durante la configurazione iniziale. L'utente può aprire le impostazioni di Android in un secondo momento e attivare o disattivare il backup e ripristino di Android.</translation>
 <translation id="3831376478177535007">Se questa impostazione viene attivata, <ph name="PRODUCT_NAME" /> consente di ritenere attendibili i certificati emessi dal team addetto alle operazioni dell'infrastruttura PKI precedente di Symantec Corporation se sono correttamente convalidati e collegati a un certificato CA riconosciuto.
 
       Tieni presente che questa norma dipende dal riconoscimento da parte del sistema operativo dei certificati dell'infrastruttura precedente di Symantec. Se un aggiornamento del sistema operativo cambia la modalità di gestione di tali certificati da parte del sistema, questa norma non viene più applicata. Inoltre, questa norma è intesa come soluzione alternativa temporanea per dare alle aziende più tempo per ritirare i certificati Symantec precedenti. Questa norma verrà rimossa il 1° gennaio 2019 o in una data successiva.
@@ -1589,9 +1578,9 @@
 
           DeviceBatteryChargeCustomStartCharging deve essere inferiore a DeviceBatteryChargeCustomStopCharging.
 
-          Questa norma viene utilizzata unicamente quando DeviceBatteryChargeMode è impostato su personalizzato.
+          Questo criterio viene utilizzato unicamente quando DeviceBatteryChargeMode è impostato su personalizzato.
 
-          Se questa norma non è configurata o non è impostata, verrà applicata la modalità di ricarica standard della batteria.</translation>
+          Se questo criterio non è configurato o non è impostato, verrà applicata la modalità di ricarica standard della batteria.</translation>
 <translation id="3925377537407648234">Imposta fattore di scala e risoluzione del display</translation>
 <translation id="3939893074578116847">Invia pacchetti di rete al server di gestione per monitorare lo stato online, per consentire
       al server di rilevare se il dispositivo è offline.
@@ -1620,21 +1609,21 @@
       Se questa norma viene impostata su true o non viene impostata, gli utenti potranno utilizzare le offerte tramite la registrazione a Chrome OS.
 
       Se questa norma viene impostata su false, gli utenti non potranno utilizzare le offerte.</translation>
-<translation id="4008233182078913897">Consente di specificare un elenco di app ed estensioni che vengono installate automaticamente, senza l'interazione dell'utente, e che non possono essere disinstallate né disattivate dall'utente. Tutte le autorizzazioni richieste dalle app/estensioni vengono concesse implicitamente, senza interazione dell'utente, comprese le eventuali autorizzazioni aggiuntive richieste dalle future versioni delle app/estensioni. Inoltre, le autorizzazioni sono concesse per le API delle estensioni enterprise.deviceAttributes ed enterprise.platformKeys. Queste due API non sono disponibili per le app/estensioni senza installazione forzata).
+<translation id="4008233182078913897">Consente di specificare un elenco di app ed estensioni che vengono installate automaticamente, senza l'interazione dell'utente, e che non possono essere disinstallate né disattivate dall'utente. Tutte le autorizzazioni richieste dalle app/estensioni vengono concesse implicitamente, senza interazione dell'utente, comprese le eventuali autorizzazioni aggiuntive richieste dalle future versioni delle app/estensioni. Inoltre, le autorizzazioni sono concesse per le API delle estensioni enterprise.deviceAttributes ed enterprise.platformKeys. Queste due API non sono disponibili per le app/estensioni senza installazione forzata.
 
-          Questa norma ha precedenza su una norma <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> potenzialmente in conflitto. Se un'app o un'estensione con installazione forzata viene rimossa da questo elenco, tale app o estensione viene disinstallata automaticamente da <ph name="PRODUCT_NAME" />.
+          Questo criterio ha precedenza su un criterio <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> potenzialmente in conflitto. Se un'app o un'estensione con installazione forzata viene rimossa da questo elenco, tale app o estensione viene disinstallata automaticamente da <ph name="PRODUCT_NAME" />.
 
           Per le istanze di Windows che non fanno parte di un dominio <ph name="MS_AD_NAME" />, l'installazione forzata è limitata alle app e alle estensioni elencate nel Chrome Web Store.
 
-          Tieni presente che il codice sorgente delle estensioni può essere modificato dagli utenti tramite Strumenti per sviluppatori (causando potenzialmente il malfunzionamento dell'estensione). Per evitare un problema di questo tipo, è consigliabile impostare la norma <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
+          Tieni presente che il codice sorgente delle estensioni può essere modificato dagli utenti tramite Strumenti per sviluppatori (causando potenzialmente il malfunzionamento dell'estensione). Per evitare un problema di questo tipo, è consigliabile impostare il criterio <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
 
-          Ogni voce della norma è una stringa contenente un ID estensione e, facoltativamente, un URL "di aggiornamento" separati da punto e virgola (<ph name="SEMICOLON" />). L'ID estensione è la stringa di 32 lettere che si trova, ad esempio, all'indirizzo <ph name="CHROME_EXTENSIONS_LINK" /> quando è attiva la modalità sviluppatore. L'URL "di aggiornamento", se specificato, deve indirizzare a un documento XML Manifest di aggiornamento, come descritto all'indirizzo <ph name="LINK_TO_EXTENSION_DOC1" />. Per impostazione predefinita, viene utilizzato l'URL di aggiornamento del Chrome Web Store (che attualmente è "https://clients2.google.com/service/update2/crx"). Tieni presente che l'URL "di aggiornamento" impostato in questa norma viene utilizzato esclusivamente per l'installazione iniziale; per i successivi aggiornamenti dell'estensione viene utilizzato l'URL di aggiornamento indicato nel file manifest dell'estensione. Inoltre, specificare l'URL "di aggiornamento" in modo esplicito era obbligatorio nelle versioni di <ph name="PRODUCT_NAME" /> fino alla 67 inclusa.
+          Ogni voce del criterio è una stringa contenente un ID estensione e, facoltativamente, un URL "di aggiornamento" separati da punto e virgola (<ph name="SEMICOLON" />). L'ID estensione è la stringa di 32 lettere che si trova, ad esempio, all'indirizzo <ph name="CHROME_EXTENSIONS_LINK" /> quando è attiva la modalità sviluppatore. L'URL "di aggiornamento", se specificato, deve indirizzare a un documento XML manifest di aggiornamento, come descritto all'indirizzo <ph name="LINK_TO_EXTENSION_DOC1" />. Per impostazione predefinita, viene utilizzato l'URL di aggiornamento del Chrome Web Store (che attualmente è "https://clients2.google.com/service/update2/crx"). Tieni presente che l'URL "di aggiornamento" impostato in questo criterio viene utilizzato esclusivamente per l'installazione iniziale; per i successivi aggiornamenti dell'estensione viene utilizzato l'URL di aggiornamento indicato nel file manifest dell'estensione. Inoltre, specificare l'URL "di aggiornamento" in modo esplicito era obbligatorio nelle versioni di <ph name="PRODUCT_NAME" /> fino alla 67 inclusa.
 
           Ad esempio, <ph name="EXTENSION_POLICY_EXAMPLE" /> installa l'estensione con ID <ph name="EXTENSION_ID_SAMPLE" /> dall'URL "di aggiornamento" del Chrome Web Store standard. Ulteriori informazioni sulle estensioni in hosting sono disponibili all'indirizzo <ph name="LINK_TO_EXTENSION_DOC2" />.
 
-          Se questa norma non viene impostata, le app e le estensioni non vengono installate automaticamente e l'utente può disinstallare qualsiasi app o estensione in <ph name="PRODUCT_NAME" />.
+          Se questo criterio non viene impostato, le app e le estensioni non vengono installate automaticamente e l'utente può disinstallare qualsiasi app o estensione in <ph name="PRODUCT_NAME" />.
 
-          Tieni presente che questa norma non si applica alla modalità di navigazione in incognito.</translation>
+          Tieni presente che questo criterio non si applica alla modalità di navigazione in incognito.</translation>
 <translation id="4008507541867797979">Se questa norma viene impostata su True o non viene configurata, nella schermata di accesso di <ph name="PRODUCT_OS_NAME" /> verranno visualizzati gli utenti esistenti tra cui sarà possibile selezionare un utente.
 
       Se la norma è impostata su False, nella schermata di accesso di <ph name="PRODUCT_OS_NAME" /> non verranno visualizzati gli utenti esistenti. Verrà visualizzata la normale schermata di accesso (richiesta di email utente e password o telefono) o la schermata interstiziale SAML (se attivata tramite la norma <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" />), a meno che non sia stata configurata una sessione gestita. Quando viene configurata una sessione gestita, verranno visualizzati solo gli account della sessione gestita, consentendo di selezionarne uno.
@@ -1682,30 +1671,6 @@
       Questa norma riguarda solo gli utenti che eseguono l'autenticazione utilizzando SAML.</translation>
 <translation id="4105989332710272578">Disattiva l'imposizione di Certificate Transparency per un elenco di URL</translation>
 <translation id="4121350739760194865">Impedisci la visualizzazione delle promozioni di applicazioni nella pagina Nuova scheda</translation>
-<translation id="4125606414556046117">Questa norma consente di configurare l'immagine di sfondo che appare all'utente sul desktop e sullo sfondo della schermata di accesso. La norma viene impostata specificando l'URL da cui <ph name="PRODUCT_OS_NAME" /> può scaricare l'immagine di sfondo e un hash di crittografia utilizzato per verificare l'integrità del download. L'immagine deve essere in formato JPEG e avere dimensioni non superiori a 16 MB. L'URL deve essere accessibile senza nessuna autenticazione.
-
-      L'immagine di sfondo viene scaricata e memorizzata nella cache. Verrà scaricata nuovamente ogni volta che l'URL o l'hash vengono modificati.
-
-      La norma deve essere specificata sotto forma di stringa, in cui l'URL e l'hash vengono espressi in formato JSON, conformemente allo schema riportato di seguito:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "L'URL da cui può essere scaricata l'immagine di sfondo.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "L'hash SHA-256 dell'immagine di sfondo.",
-            "type": "string"
-          }
-        }
-      }
-
-      Se questa norma viene impostata, <ph name="PRODUCT_OS_NAME" /> scaricherà e utilizzerà l'immagine di sfondo.
-
-      Se imposti questa norma, gli utenti non potranno modificarla o sostituirla.
-
-      Se la norma non è impostata, l'utente può scegliere un'immagine da visualizzare sul desktop e sullo sfondo della schermata di accesso.</translation>
 <translation id="412697421478384751">Consenti agli utenti di impostare PIN non sicuri per la schermata di blocco</translation>
 <translation id="4138655880188755661">Limite di tempo</translation>
 <translation id="4144164749344898721">Questa norma consente di stabilire diverse impostazioni relative alla strategia di gestione dell'alimentazione quando l'utente diventa inattivo.
@@ -1850,7 +1815,7 @@
 <translation id="4360826270668210664">Se questa norma viene impostata, l'host di accesso remoto richiederà che i client di autenticazione ottengano un token di autenticazione da questo URL per consentire la connessione. Deve essere utilizzata insieme a RemoteAccessHostTokenValidationUrl.
 
           Questa funzione è attualmente disattivata lato server.</translation>
-<translation id="4363057787588706121">Consenti l'unione delle norme nell'elenco provenienti da origini diverse</translation>
+<translation id="4363057787588706121">Consenti l'unione dei criteri nell'elenco provenienti da origini diverse</translation>
 <translation id="436581050240847513">Riporta interfacce di rete del dispositivo</translation>
 <translation id="4372704773119750918">Non permettere all'utente aziendale di far parte del profilo multiplo (principale o secondario)</translation>
 <translation id="4377599627073874279">Consenti la visualizzazione di tutte le immagini in tutti i siti</translation>
@@ -2010,7 +1975,7 @@
 <translation id="4826326557828204741">Azione da compiere quando il ritardo di inattività viene raggiunto durante l'utilizzo della batteria</translation>
 <translation id="4832852360828533362">Rapporti su dispositivi e utenti</translation>
 <translation id="4834526953114077364">Gli utenti utilizzati meno di recente che non hanno eseguito l'accesso negli ultimi tre mesi vengono rimossi fino alla disponibilità di spazio libero sufficiente</translation>
-<translation id="4835622243021053389">Attiva autenticazione NTLMv2.</translation>
+<translation id="4835622243021053389">Attiva autenticazione NTLMv2</translation>
 <translation id="4858735034935305895">Consenti modalità a schermo intero</translation>
 <translation id="4861767323695239729">Configura i metodi di immissione consentiti in una sessione utente</translation>
 <translation id="487460824085252184">Esegui automaticamente la migrazione senza chiedere il consenso dell'utente</translation>
@@ -2121,9 +2086,9 @@
 <translation id="5105313908130842249">Ritardo blocco schermo in caso di utilizzo della batteria</translation>
 <translation id="5108031557082757679">Stampanti aziendali associate ai dispositivi disattivate</translation>
 <translation id="5124368997194894978">Attiva avvio tramite CA (corrente alternata)</translation>
-<translation id="5131211790949066746">Consente di unire le norme relative all'elenco di installazione delle estensioni <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> e <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.
+<translation id="5131211790949066746">Consente di unire i criteri relativi all'elenco di installazione delle estensioni <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> e <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.
 
-      Se attivi questa impostazione, i valori delle norme relative alla piattaforma del computer, al cloud del computer e alla piattaforma dell'utente vengono uniti in un unico elenco e usati in toto; in questo modo non vengono usati soltanto i valori di una singola origine con la massima priorità.
+      Se attivi questa impostazione, i valori dei criteri relativi alla piattaforma del computer, al cloud del computer e alla piattaforma dell'utente vengono uniti in un unico elenco e usati in toto; in questo modo non vengono usati soltanto i valori di una singola origine con la massima priorità.
 
       Se disattivi questa impostazione o non la imposti, vengono recuperate soltanto le voci dell'elenco dell'origine con la massima priorità e tutte le altre origini risultano in conflitto, ma vengono ignorate.</translation>
 <translation id="5141670636904227950">Impostazione tipo di ingrandimento dello schermo predefinito attivato nella schermata di accesso</translation>
@@ -2449,13 +2414,13 @@
 
           Questa impostazione autorizza i tipi consentiti di estensioni/app che è possibile installare in <ph name="PRODUCT_NAME" /> e gli host con cui possono interagire. Il valore è un elenco di stringhe, ognuna delle quali deve corrispondere a una delle seguenti: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". Per ulteriori informazioni su questi tipi, consulta la documentazione sulle estensioni di <ph name="PRODUCT_NAME" />.
 
-          Tieni presente che questa norma riguarda anche le estensioni e le app con installazione forzata tramite ExtensionInstallForcelist.
+          Tieni presente che questo criterio riguarda anche le estensioni e le app con installazione forzata tramite ExtensionInstallForcelist.
 
           Se questa impostazione viene configurata, le estensioni/app con un tipo non presente nell'elenco non verranno installate.
 
           Se questa impostazione non viene configurata, non vengono imposte restrizioni sui tipi di estensioni/app accettabili.
 
-          Nelle versioni precedenti alla 75, l'utilizzo di diversi ID estensione separati da virgole non è supportato e verrà ignorato. Il resto della norma continuerà a essere applicato.</translation>
+          Nelle versioni precedenti alla 75, l'utilizzo di diversi ID estensione separati da virgole non è supportato e verrà ignorato. Il resto del criterio continuerà a essere applicato.</translation>
 <translation id="5645779841392247734">Consenti i cookie in questi siti</translation>
 <translation id="5689430183304951538">Dimensioni predefinite delle pagine di stampa</translation>
 <translation id="5693469654327063861">Consenti migrazione dei dati</translation>
@@ -2571,10 +2536,10 @@
 <translation id="5898486742390981550">Quando più utenti eseguono l'accesso, solo l'utente principale può utilizzare le app Android.</translation>
 <translation id="5901427587865226597">Solo stampa fronte/retro</translation>
 <translation id="5903898512448364160">
-      Se la norma viene impostata su true, in caso di conflitto la norma relativa al cloud prevale sulla norma relativa alla piattaforma.
-      Se la norma viene impostata su false o non viene configurata, in caso di conflitto la norma relativa alla piattaforma prevale sulla norma relativa al cloud.
+      Se il criterio viene impostato su true, in caso di conflitto il criterio relativo al cloud prevale sul criterio relativo alla piattaforma.
+      Se il criterio viene impostato su false o non viene configurato, in caso di conflitto il criterio relativo alla piattaforma prevale sul criterio relativo al cloud.
 
-      Questa norma è disponibile soltanto come norma obbligatoria relativa alla piattaforma del computer e interessa unicamente le norme relative al cloud in ambito computer.
+      Questo criterio è disponibile soltanto come criterio obbligatorio relativo alla piattaforma del computer e interessa unicamente i criteri relativi al cloud in ambito computer.
       </translation>
 <translation id="5905473632148429217">Attiva controlli OCSP/CRL online</translation>
 <translation id="5906199912611534122">Consente di attivare o disattivare la limitazione della larghezza di banda.
@@ -2616,59 +2581,12 @@
 
       Se il criterio non è impostato o è impostato su False, i comandi di stampa attivano la schermata dell'anteprima di stampa.</translation>
 <translation id="6022948604095165524">Azione all'avvio</translation>
-<translation id="6023030044732320798">Consente di specificare un insieme di norme che saranno trasferite al runtime ARC. Il valore deve essere un JSON valido.
-
-      È possibile usare questa norma per configurare le app Android da installare automaticamente sul dispositivo:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identificatore dell'app Android, ad esempio "com.google.android.gm" per Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Consente di specificare la modalità di installazione di un'app. OPTIONAL: l'app non viene installata automaticamente, ma l'utente può installarla. Si tratta del valore predefinito se questa norma non viene specificata. PRELOAD: l'app viene installata automaticamente, ma l'utente può disinstallarla. FORCE_INSTALLED: l'app viene installata automaticamente e l'utente non può disinstallarla. BLOCKED: l'app è bloccata e non può essere installata. Se l'app è stata installata in base a una norma precedente, verrà disinstallata.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Norma per le richieste di concessione delle autorizzazioni delle app. PERMISSION_POLICY_UNSPECIFIED: norma non specificata. Se per un'autorizzazione non viene specificata alcuna norma a nessuno livello, viene usato per impostazione predefinita il comportamento "PROMPT". PROMPT: viene chiesto all'utente di concedere un'autorizzazione. GRANT: viene concessa automaticamente un'autorizzazione. DENY: viene negata automaticamente un'autorizzazione.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Oggetto di configurazione JSON specifico dell'app con una serie di coppie chiave-valore, ad esempio '"managedConfiguration": { "key1": value1, "key2": value2 }'. Le chiavi sono definite nel file manifest dell'app.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Per bloccare le app in Avvio applicazioni, vedi la norma PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL di ricerca istantanea del provider di ricerca predefinito</translation>
 <translation id="603410445099326293">Parametri per l'URL del suggerimento che utilizza POST</translation>
 <translation id="6034341625190551415">Consente di controllare tipi di account kiosk e sessioni pubbliche.</translation>
 <translation id="6034603289689965535">Consente a una pagina di mostrare i popup durante l'unload.</translation>
 <translation id="6036523166753287175">Abilita attraversamento firewall da host di accesso remoto</translation>
-<translation id="605475635122964053">Consente di limitare la modalità di stampa PIN. Se la norma non viene impostata non vengono applicate limitazioni. Se la modalità non è disponibile, questa norma viene ignorata. Tieni presente che la funzionalità di stampa PIN viene attivata solo per le stampanti che usano uno dei protocolli IPPS, USB o IPP-over-USB. </translation>
+<translation id="605475635122964053">Consente di limitare la modalità di stampa PIN. Se il criterio non viene impostato non vengono applicate limitazioni. Se la modalità non è disponibile, questo criterio viene ignorato. Tieni presente che la funzionalità di stampa PIN viene attivata solo per le stampanti che usano uno dei protocolli IPPS, USB o IPP-over-USB. </translation>
 <translation id="6070667616071269965">Layout da tastiera della schermata di accesso del dispositivo</translation>
 <translation id="6074963268421707432">Non consentire la visualizzazione di notifiche desktop da parte dei siti</translation>
 <translation id="6074964551275531965">Imposta il periodo di tempo per le notifiche relative agli aggiornamenti</translation>
@@ -2697,17 +2615,17 @@
 <translation id="6111936128861357925">Attiva il gioco del dinosauro</translation>
 <translation id="6114416803310251055">obsoleto</translation>
 <translation id="6133088669883929098">Consenti a tutti i siti di utilizzare la generazione di chiavi</translation>
-<translation id="6136537398661737682">Questa norma consente di controllare lo stato iniziale dei servizi di geolocalizzazione di Google.
+<translation id="6136537398661737682">Questo criterio consente di controllare lo stato iniziale dei Servizi di geolocalizzazione di Google.
 
-      Se questa norma non viene configurata o viene impostata su <ph name="GLS_DISABLED" />, i servizi di geolocalizzazione di Google sono inizialmente disattivati.
+      Se questo criterio non viene configurato o viene impostato su <ph name="GLS_DISABLED" />, i Servizi di geolocalizzazione di Google sono inizialmente disattivati.
 
-      Se questa norma viene impostata su <ph name="GLS_ENABLED" />, i servizi di geolocalizzazione di Google sono inizialmente attivati.
+      Se questo criterio viene impostato su <ph name="GLS_ENABLED" />, i Servizi di geolocalizzazione di Google sono inizialmente attivati.
 
-      Se questa norma viene impostata su <ph name="GLS_UNDER_USER_CONTROL" />, all'utente viene chiesto di scegliere se utilizzare o meno i servizi di geolocalizzazione di Google. In questo modo le app Android potranno usare i servizi per inviare query sulla posizione del dispositivo; inoltre, verrà attivato l'invio a Google di dati sulla posizione anonimi.
+      Se questo criterio viene impostato su <ph name="GLS_UNDER_USER_CONTROL" />, all'utente viene chiesto di scegliere se utilizzare o meno i Servizi di geolocalizzazione di Google. In questo modo le app Android potranno usare i servizi per inviare query sulla posizione del dispositivo; inoltre, verrà attivato l'invio a Google di dati sulla posizione anonimi.
 
-      Tieni presente che questa norma consente di controllare lo stato dei servizi di geolocalizzazione di Google solo durante la configurazione iniziale. L'utente può aprire le impostazioni di Android in un secondo momento e attivare o disattivare i servizi di geolocalizzazione di Google.
+      Tieni presente che questo criterio consente di controllare lo stato dei Servizi di geolocalizzazione di Google solo durante la configurazione iniziale. L'utente può aprire le impostazioni di Android in un secondo momento e attivare o disattivare i Servizi di geolocalizzazione di Google.
 
-      Tieni presente che questa norma viene ignorata e i servizi di geolocalizzazione di Google vengono sempre disattivati se la norma <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> è impostata su <ph name="BLOCK_GEOLOCATION_SETTING" />.</translation>
+      Tieni presente che questo criterio viene ignorato e i Servizi di geolocalizzazione di Google vengono sempre disattivati se il criterio <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> è impostato su <ph name="BLOCK_GEOLOCATION_SETTING" />.</translation>
 <translation id="6141402445226505817">Utilizza sempre il rilevamento approssimativo del fuso orario</translation>
 <translation id="6145799962557135888">Consente di impostare un elenco di pattern URL che specificano i siti in cui è consentita l'esecuzione di JavaScript. Se questa norma non viene impostata, per tutti i siti verrà utilizzato il valore predefinito globale della norma "DefaultJavaScriptSetting", se è impostata, oppure verrà utilizzata la configurazione personale dell'utente.</translation>
 <translation id="614662973812186053">Questa norma controlla anche la raccolta dei dati diagnostici e sull'utilizzo di Android.</translation>
@@ -2783,13 +2701,13 @@
 <translation id="6224304369267200483">URL/domini per cui è consentita automaticamente l'attestazione diretta dei token di sicurezza</translation>
 <translation id="6233173491898450179">Imposta directory di download</translation>
 <translation id="6244210204546589761">Pagine da aprire all'avvio</translation>
-<translation id="6255387031094435995">Consente di unire le norme selezionate quando provengono da origini diverse, con stesso ambito e livello.
+<translation id="6255387031094435995">Consente di unire i criteri selezionati quando provengono da origini diverse, con stesso ambito e livello.
 
-        Se una norma è nell'elenco, nel caso ci sia conflitto tra due origini, purché abbiano lo stesso ambito e lo stesso livello, i valori verranno uniti nel nuovo elenco delle norme.
+        Se un criterio è nell'elenco, nel caso ci sia conflitto tra due origini, purché abbiano lo stesso ambito e lo stesso livello, i valori verranno uniti nel nuovo elenco dei criteri.
 
-        Se una norma è nell'elenco, nel caso ci sia conflitto tra due origini, ma anche tra ambito e/o livello, verrà applicata la norma con la priorità massima.
+        Se un criterio è nell'elenco, nel caso ci sia conflitto tra due origini, ma anche tra ambito e/o livello, verrà applicato il criterio con la priorità massima.
 
-        Se una norma non si trova nell'elenco, nel caso in cui ci siano conflitti tra origine, ambito e/o livello, verrà applicata la norma con la priorità massima.</translation>
+        Se un criterio non si trova nell'elenco, nel caso in cui ci siano conflitti tra origine, ambito e/o livello, verrà applicato il criterio con la priorità massima.</translation>
 <translation id="6258193603492867656">Consente di specificare se il Kerberos SPN generato deve includere una porta non standard. Se attivi questa impostazione e specifichi una porta non standard (cioè una porta diversa da 80 o 443), la porta verrà inclusa nel Kerberos SPN generato. Se disattivi l'impostazione o non la imposti, il Kerberos SPN generato non includerà in nessun caso una porta.</translation>
 <translation id="6261643884958898336">Segnala informazioni di identificazione dei computer</translation>
 <translation id="6281043242780654992">Consente di configurare le norme per i messaggi nativi. Gli host di messaggi nativi non autorizzati non saranno consentiti se non vengono aggiunti alla whitelist.</translation>
@@ -3006,37 +2924,6 @@
       Se la norma è impostata su false, il client DNS integrato non verrà mai utilizzato.
 
       Se la norma non viene impostata, per impostazione predefinita il client DNS integrato verrà attivato su macOS, Android (nel caso in cui non siano attivi il DNS privato né la VPN) e ChromeOS. Gli utenti saranno in grado di scegliere se il client DNS integrato è utilizzato modificando chrome://flags o specificando un flag della riga di comando.</translation>
-<translation id="6838056959556423778">Consente di sostituire le regole di selezione della stampante predefinita di <ph name="PRODUCT_NAME" />.
-
-      Questa norma consente di stabilire le regole per la selezione della stampante predefinita in <ph name="PRODUCT_NAME" />, che viene effettuata al primo utilizzo della funzione di stampa con un profilo.
-
-      Se questa norma viene impostata, <ph name="PRODUCT_NAME" /> cercherà di trovare una stampante corrispondente a tutti gli attributi specificati e la selezionerà come stampante predefinita. Verrà selezionata la prima stampante trovata corrispondente alla norma; in caso di corrispondenze non univoche, può essere selezionata qualsiasi stampante, a seconda dell'ordine di rilevamento delle stampanti.
-
-      Se questa norma non viene impostata o se non viene trovata una stampante corrispondente prima del timeout, viene selezionata come predefinita la stampante PDF integrata; se non è disponibile la stampante PDF, non viene selezionata alcuna stampante.
-
-      Il valore viene analizzato come oggetto JSON, in base al seguente schema:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Indica se limitare la ricerca della stampante corrispondente a un insieme di stampanti specifico.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Espressione regolare corrispondente all'ID stampante.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Espressione regolare corrispondente al nome visualizzato per la stampante.",
-            "type": "string"
-          }
-        }
-      }
-
-      Le stampanti connesse a <ph name="CLOUD_PRINT_NAME" /> vengono considerate <ph name="PRINTER_TYPE_CLOUD" />, mentre le altre stampanti vengono classificate come <ph name="PRINTER_TYPE_LOCAL" />.
-      L'omissione di un campo implica la corrispondenza di tutti i valori; ad esempio, se non viene specificata la connettività, nell'Anteprima di stampa viene avviato il rilevamento di tutti i tipi di stampanti, locali e cloud.
-      I modelli di espressioni regolari devono seguire la sintassi JavaScript RegExp e per le corrispondenze viene fatta distinzione tra maiuscole e minuscole.</translation>
 <translation id="6843296367238757293">Questa norma è obsoleta. Ne sconsigliamo l'utilizzo. Leggi ulteriori informazioni all'indirizzo https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Questa norma è stata rimossa in <ph name="PRODUCT_NAME" /> 68 e sostituita da <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Questa norma è obsoleta ed è stata rimossa su M66, poiché era utilizzata solo per test interni e rappresenta un rischio per la sicurezza.
@@ -3109,17 +2996,17 @@
 
 Quando lo schermo sta per essere oscurato, il modello di oscuramento smart valuta se posticipare l'azione. In tal caso, il tempo prima che lo schermo venga oscurato viene effettivamente prolungato e il ritardo di inattività, la disattivazione dello schermo e il blocco dello schermo vengono regolati in modo da rispettare gli intervalli di tempo rispetto al ritardo oscuramento schermo configurati in precedenza.
 Se questa norma è impostata su True o non è impostata, il modello di oscuramento smart verrà attivato e la quantità di tempo prima che lo schermo venga oscurato verrà estesa. Se questa norma è impostata su False, il modello di oscuramento smart non inciderà sull'oscuramento dello schermo.</translation>
-<translation id="6967394885063085697">Consente di attivare la norma di gestione della modalità di ricarica avanzata della batteria.
+<translation id="6967394885063085697">Consente di attivare il criterio di gestione della modalità di ricarica avanzata della batteria.
 
           La modalità di ricarica avanzata della batteria consente all'utente di massimizzare le condizioni della batteria. In modalità di ricarica avanzata, il sistema utilizza un algoritmo di ricarica standard e altre tecniche durante gli orari non di lavoro per massimizzare le condizioni della batteria. Durante gli orari di lavoro viene utilizzata una ricarica express. La ricarica express permette di ricaricare la batteria in modo più rapido; perciò, la carica completa avviene in tempi minori. Per ogni giorno, il tempo in cui il sistema viene usato con maggiore frequenza è specificato da ora di inizio e durata.
 
-          Se questa norma è impostata su true e DeviceAdvancedBatteryChargeModeDayConfig è impostato, la modalità di ricarica avanzata della batteria verrà sempre attivata se supportata sul dispositivo.
+          Se questo criterio è impostato su true e DeviceAdvancedBatteryChargeModeDayConfig è impostato, la modalità di ricarica avanzata della batteria verrà sempre attivata se supportata sul dispositivo.
 
-          Se questa norma è impostata su false, la modalità di ricarica avanzata della batteria è sempre disattivata.
+          Se questo criterio è impostato su false, la modalità di ricarica avanzata della batteria è sempre disattivata.
 
-          Se imposti questa norma, gli utenti non potranno modificarla o ignorarla.
+          Se imposti questo criterio, gli utenti non potranno modificarlo o ignorarlo.
 
-          Se questa norma non è impostata, la modalità di ricarica avanzata della batteria è disattivata e non può essere attivata dall'utente.</translation>
+          Se questo criterio non è impostato, la modalità di ricarica avanzata della batteria è disattivata e non può essere attivata dall'utente.</translation>
 <translation id="6972540544240464302">Seleziona configurazione programma di pianificazione attività</translation>
 <translation id="6979158407327259162">Google Drive</translation>
 <translation id="6994082778848658360">Consente di specificare in che modo è possibile usare l'hardware degli elementi di sicurezza su scheda per fornire l'autenticazione a due fattori, se compatibile con questa funzione. Il tasto di accensione del computer viene usato per rilevare la presenza fisica dell'utente.
@@ -3184,17 +3071,17 @@
       Se questa impostazione viene attivata o disattivata, gli utenti non potranno modificarla o eseguirne l'override.
 
       Se la norma non viene impostata, gli utenti potranno scegliere se impostare o meno la richiesta della password per lo sblocco del dispositivo.</translation>
-<translation id="7107148737865880402">Consente di attivare la norma di gestione per la condivisione dell'alimentazione USB.
+<translation id="7107148737865880402">Consente di attivare il criterio di gestione per la condivisione dell'alimentazione USB.
 
-          Alcuni dispositivi presentano una specifica porta USB contrassegnata con l'icona di un fulmine o di una batteria e che può essere utilizzata per ricaricare i dispositivi, ad esempio un cellulare, tramite la batteria di sistema. Questa norma influisce sul comportamento di ricarica della porta mentre il sistema è in modalità di sospensione o spento. Questa norma non influisce su altre porte USB e sul comportamento di ricarica mentre il sistema è attivo.
+          Alcuni dispositivi presentano una specifica porta USB contrassegnata con l'icona di un fulmine o di una batteria e che può essere utilizzata per ricaricare i dispositivi, ad esempio un cellulare, tramite la batteria di sistema. Questo criterio influisce sul comportamento di ricarica della porta mentre il sistema è in modalità di sospensione o spento. Questo criterio non influisce su altre porte USB e sul comportamento di ricarica mentre il sistema è attivo.
 
           Quando il sistema è attivo, la porta USB fornisce sempre energia.
 
-          Quando il sistema è in modalità di sospensione, se la norma è impostata su true, verrà fornita energia alla porta USB quando il dispositivo è collegato alla corrente o se il livello della batteria è &gt; 50%. In caso contrario, non viene fornita energia.
+          Quando il sistema è in modalità di sospensione, se il criterio è impostato su true, verrà fornita energia alla porta USB quando il dispositivo è collegato alla corrente o se il livello della batteria è &gt;50%. In caso contrario, non viene fornita energia.
 
-          Quando il sistema è spento, se la norma è impostata su true, viene fornita energia alla porta USB quando il dispositivo è collegato alla corrente. In caso contrario, non viene fornita energia.
+          Quando il sistema è spento, se il criterio è impostato su true, viene fornita energia alla porta USB quando il dispositivo è collegato alla corrente. In caso contrario, non viene fornita energia.
 
-          Se questa norma non viene impostata, la norma è attivata e non può essere disattivata dall'utente.</translation>
+          Se questo criterio non viene impostato, il criterio è attivato e non può essere disattivato dall'utente.</translation>
 <translation id="7115494316187648452">Consente di stabilire se un processo di <ph name="PRODUCT_NAME" /> è stato avviato all'accesso al sistema operativo e se resta in esecuzione dopo la chiusura dell'ultima finestra del browser, consentendo di tenere attive le applicazioni in background e la sessione di navigazione corrente, compresi eventuali cookie di sessione. Nella barra delle applicazioni viene visualizzata un'icona per il processo in background che consente di chiudere il processo in qualsiasi momento.
 
       Se questa norma viene impostata su true, la modalità in background viene attivata e non può essere controllata dall'utente tramite le impostazioni del browser.
@@ -3454,7 +3341,7 @@
 
           Questo criterio viene utilizzato unicamente quando DeviceBatteryChargeMode è impostato su personalizzato.
 
-          Se questa norma non è configurata o non è impostata, verrà applicata la modalità di ricarica standard della batteria.</translation>
+          Se questo criterio non è configurato o non è impostato, verrà applicata la modalità di ricarica standard della batteria.</translation>
 <translation id="759957074386651883">Impostazioni di Navigazione sicura</translation>
 <translation id="7604169113182304895">Le app Android potrebbero decidere volontariamente se rispettare o meno questo elenco. Non è possibile imporre il rispetto dell'elenco.</translation>
 <translation id="7612157962821894603">Contrassegni a livello di sistema da applicare all'avvio di <ph name="PRODUCT_NAME" /></translation>
@@ -3537,9 +3424,9 @@
 <translation id="7715711044277116530">Percentuale di regolazione del ritardo di oscuramento dello schermo in modalità di presentazione</translation>
 <translation id="7716781462866245042">Consente di impostare la configurazione giornaliera per la modalità di ricarica avanzata della batteria.
 
-          Questa norma viene usata soltanto se la norma DeviceAdvancedBatteryChargeModeEnabled è impostata su true.
+          Questo criterio viene usato soltanto se il criterio DeviceAdvancedBatteryChargeModeEnabled è impostato su true.
 
-          Se questa norma non viene configurata o non viene impostata, la modalità di ricarica avanzata della batteria sarà sempre disattivata.
+          Se questo criterio non viene configurato o non viene impostato, la modalità di ricarica avanzata della batteria sarà sempre disattivata.
 
           Nota: il valore del campo <ph name="CHARGE_START_TIME_FIELD_NAME" /> deve essere inferiore a quello del campo <ph name="CHARGE_END_TIME_FIELD_NAME" />.
 
@@ -3649,7 +3536,7 @@
 
       Le impostazioni della pagina iniziale dell'utente sono completamente bloccate se hai selezionato la pagina iniziale come pagina Nuova scheda oppure se hai specificato un URL che funga da pagina iniziale. Se non specifichi l'URL della pagina iniziale, l'utente può ancora impostare la pagina iniziale come pagina Nuova scheda se specifica "chrome://newtab".
 
-      La norma "URL da aprire all'avvio" viene ignorata a meno che non selezioni "Apri un elenco di URL" in "Azione all'avvio".</translation>
+      Il criterio "URL da aprire all'avvio" viene ignorato a meno che non selezioni "Apri un elenco di URL" in "Azione all'avvio".</translation>
 <translation id="7952958573604504839">La norma è obsoleta in M48 in favore di <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" /> ed è rimossa in M54.
 
       Attiva la previsione di rete in <ph name="PRODUCT_NAME" /> e impedisce agli utenti di modificare questa impostazione.
@@ -4135,30 +4022,6 @@
       Questa norma viene applicata soltanto per gli utenti che si sono autenticati tramite SAML.
 
       Il valore della norma deve essere specificato in secondi.</translation>
-<translation id="9027787254195333560">Questa norma consente di configurare l'immagine avatar che rappresenta l'utente sulla schermata di accesso. La norma viene impostata specificando l'URL da cui <ph name="PRODUCT_OS_NAME" /> può scaricare l'immagine e un hash crittografico per verificare l'integrità del download. L'immagine deve essere in formato JPEG e avere dimensioni non superiori a 512 kB. L'URL deve essere accessibile senza nessuna autenticazione.
-
-      L'immagine avatar viene scaricata e memorizzata nella cache. Verrà scaricata nuovamente ogni volta che l'URL o l'hash vengono modificati.
-
-      La norma deve essere specificata sotto forma di stringa, in cui l'URL e l'hash vengono espressi in formato JSON, conformemente allo schema riportato di seguito:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL da cui scaricare l'immagine avatar.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hash SHA-256 dell'immagine avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Se questa norma viene impostata, <ph name="PRODUCT_OS_NAME" /> scaricherà e utilizzerà l'immagine avatar.
-
-      Se imposti questa norma, gli utenti non potranno modificarla o sostituirla.
-
-      Se la norma non viene impostata, l'utente può scegliere l'immagine avatar che lo rappresenta sulla schermata di accesso.</translation>
 <translation id="9035964157729712237">ID delle estensioni da escludere dalla blacklist</translation>
 <translation id="9038058011835642205">Consente di specificare un elenco di siti web che vengono installati automaticamente, senza l'interazione dell'utente, e che non possono essere disinstallati né disattivati dall'utente.
 
@@ -4171,7 +4034,6 @@
       Se imposti questa norma, gli utenti non potranno modificarla o sostituirla.
 
       Il valore della norma deve essere specificato in millisecondi. I valori sono limitati a un intervallo compreso tra 30 secondi e 24 ore.</translation>
-<translation id="9042911395677044526">Consente di forzare l'applicazione della configurazione di rete per utente su un dispositivo <ph name="PRODUCT_OS_NAME" />. La configurazione di rete è una stringa in formato JSON definita secondo il formato Open Network Configuration descritto all'indirizzo <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="9050853837490399534">Questa norma consente di stabilire se il dispositivo debba essere aggiornato a una build di correzione rapida.
 
       Se il valore della norma viene impostato su un token associato a una build di correzione rapida, il dispositivo verrà aggiornato alla build di correzione rapida corrispondente se l'aggiornamento non è bloccato da un'altra norma.
@@ -4244,17 +4106,6 @@
       Se la norma viene impostata su false, l'opzione "Intestazioni e piè di pagina" non viene selezionata nella finestra di dialogo dell'anteprima di stampa e l'utente non può modificarla.
 
       Se la norma viene impostata su true, l'opzione "Intestazioni e piè di pagina" viene selezionata nella finestra di dialogo dell'anteprima di stampa e l'utente non può modificarla.</translation>
-<translation id="9213347477683611358">Configura l'immagine di sfondo a livello del dispositivo che viene mostrata nella schermata di accesso nel caso in cui nessun utente abbia ancora effettuato l'accesso al dispositivo. Questa norma viene impostata specificando l'URL dal quale il dispositivo Chrome OS può scaricare l'immagine di sfondo e un hash crittografico la cui funzione è quella di verificare l'integrità del download. L'immagine deve essere in formato JPEG e non deve superare le dimensioni di 16 MB. L'URL specificato deve essere accessibile senza bisogno di autenticazione. L'immagine di sfondo viene scaricata e memorizzata nella cache. Verrà scaricata nuovamente ogni volta che l'URL e l'hash vengono modificati.
-
-      La norma deve essere specificata sotto forma di stringa in cui l'URL e l'hash vengono espressi in formato JSON, ad esempio,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Nel caso in cui sia impostata la norma dello sfondo del dispositivo, il dispositivo Chrome OS scaricherà e utilizzerà l'immagine di sfondo nella schermata di accesso se nessun utente ha ancora effettuato l'accesso al dispositivo. Quando un utente accede, si attiva la norma dello sfondo dell'utente.
-
-      Nel caso in cui non venga impostata la norma dello sfondo del dispositivo, è la norma dello sfondo dell'utente a decidere cosa mostrare se si imposta la norma dello sfondo del dispositivo.</translation>
 <translation id="9217154963008402249">Frequenza dei pacchetti di rete di monitoraggio</translation>
 <translation id="922540222991413931">Configura fonti di installazione di estensioni, applicazioni e script utente</translation>
 <translation id="924557436754151212">Importa password salvate dal browser predefinito alla prima esecuzione</translation>
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index 7333cf8c..d15e605 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -404,7 +404,6 @@
 
       אזהרה: לא מומלץ להאציל את השליטה על גרסת <ph name="PRODUCT_OS_NAME" /> ליישום קיוסק כי ייתכן שהדבר ימנע מהמכשיר לקבל עדכוני תוכנה ותיקוני אבטחה קריטיים. האצלת השליטה על גרסת <ph name="PRODUCT_OS_NAME" /> עלולה להציב את המשתמשים בפני סיכון.</translation>
 <translation id="1675002386741412210">נתמכת ב:</translation>
-<translation id="1689963000958717134">‏מאפשר דחיפה של תצורת הרשת כדי שתיושם עבור כל המשתמשים של מכשיר <ph name="PRODUCT_OS_NAME" />. תצורת הרשת היא מחרוזת בפורמט JSON כפי שהוגדרה על ידי פורמט תצורת הרשת הפתוחה, באופן שמתואר ב-<ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">‏המדיניות הזו מגדירה את הזמינות וההתנהגות של פונקציונליות עדכון הקושחה של <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       ניתן לציין הגדרות נפרדות בנכסי JSON:
@@ -945,16 +944,6 @@
       אם תשבית הגדרה זו, דפי אינטרנט לא יוכלו להשתמש ב-JavaScript והמשתמשים לא יוכלו לשנות הגדרה זו.
 
       אם תפעיל הגדרה זו או לא תגדיר אותה כלל, דפי אינטרנט יוכלו להשתמש ב-JavaScript אך המשתמש יוכל לשנות את ההגדרה.</translation>
-<translation id="2747157663401642394">‏קובעת את הגדרות ניהול התוספים בשביל <ph name="PRODUCT_NAME" />.
-
-          המדיניות הזו קובעת הגדרות מרובות, כולל הגדרות שנשלטות על-ידי סעיפי מדיניות קיימים הקשורים לתוספים. המדיניות הזו עוקפת סעיפי מדיניות ישנים, אם גם הם מוגדרים.
-
-          המדיניות הזו ממפה אל התצורה שלה מזהה תוסף או כתובת URL לעדכון. אם הוגדר מזהה תוסף, התצורה תוחל רק על התוסף שצוין. אפשר להגדיר תצורת ברירת מחדל בשביל המזהה המיוחד <ph name="DEFAULT_SCOPE" />. תצורה זו תחול על כל התוספים שלא הוגדרה עבורם תצורה מותאמת אישית במדיניות הזו. אם הוגדרה כתובת URL לעדכון, התצורה תוחל על כל התוספים שבמניפסט של התוסף הזה צוינה עבורם בדיוק אותה כתובת URL לעדכון , כפי שמתואר בכתובת <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          במקרה של מופעי Windows שלא מחוברים לדומיין <ph name="MS_AD_NAME" />, ההתקנה בהגדרת מנהל מערכת מוגבלת לאפליקציות ולתוספים הזמינים בחנות האינטרנט של Chrome.
-
-          תיאור מלא של ההגדרות האפשריות ומבנה המדיניות הזו זמין בכתובת https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">‏הגבלת הטווח של יציאות UDP מקומיות שבהן נעשה שימוש ב-WebRTC</translation>
 <translation id="2757054304033424106">סוגים של תוספים/יישומים שמותר להתקין</translation>
 <translation id="2758084448533744848">‏מציינת את אזור הזמן שייאכף במכשיר. כשהמדיניות הזו מוגדרת, משתמשים במכשיר לא יכולים לעקוף את אזור הזמן שצוין. אם צוין ערך לא חוקי, המדיניות עדיין פועלת, ומחילה את הגדרת הזמן GMT. אם צוינה מחרוזת ריקה, המערכת לא מביאה בחשבון את המדיניות.
@@ -1180,7 +1169,7 @@
       מדיניות זו מאפשרת למנהלי מערכות לספק הגדרות של מדפסות
       למשתמשים.
 
-      המחרוזת <ph name="PRINTER_DISPLAY_NAME" /> והמחרוזת <ph name="PRINTER_DESCRIPTION" /> הן בעלות פורמט חופשי שניתן להתאים אישית כדי לאפשר לבחור מדפסת בקלות. הערך <ph name="PRINTER_MANUFACTURER" /> והערך <ph name="PRINTER_MODEL" /> עוזרים למשתמשי הקצה לזהות את המדפסת בקלות. הם מייצגים את היצרן והדגם של המדפסת. הערך <ph name="PRINTER_URI" /> צריך להיות כתובת שניתן להגיע אליה ממחשב לקוח, כולל ה-<ph name="URI_SCHEME" />, ה-<ph name="URI_PORT" />, וה-<ph name="URI_QUEUE" />. הערך <ph name="PRINTER_UUID" /> הוא אופציונלי. אם מציינים אותו, הוא עוזר לבטל כפילויות של מדפסות <ph name="ZEROCONF_DISCOVERY" />.
+      המחרוזת <ph name="PRINTER_DISPLAY_NAME" /> והמחרוזת <ph name="PRINTER_DESCRIPTION" /> הן בעלות פורמט חופשי שניתן להתאים אישית כדי לאפשר לבחור מדפסת בקלות. הערך <ph name="PRINTER_MANUFACTURER" /> והערך <ph name="PRINTER_MODEL" /> עוזרים למשתמשי הקצה לזהות את המדפסת בקלות. הם מייצגים את היצרן והדגם של המדפסת. הערך <ph name="PRINTER_URI" /> צריך להיות כתובת שניתן להגיע אליה ממחשב לקוח, כולל ה-<ph name="URI_SCHEME" />, ה-<ph name="URI_PORT" /> וה-<ph name="URI_QUEUE" />. הערך <ph name="PRINTER_UUID" /> הוא אופציונלי. אם מציינים אותו, הוא עוזר לבטל כפילויות של מדפסות <ph name="ZEROCONF_DISCOVERY" />.
 
       הערך <ph name="PRINTER_EFFECTIVE_MODEL" /> חייב להתאים לאחת מהמחרוזות המייצגות מדפסת נתמכת של <ph name="PRODUCT_NAME" />. המחרוזת תשמש לזיהוי ולהתקנה של ה-PPD המתאים של המדפסת. מידע נוסף זמין בכתובת https://support.google.com/chrome?p=noncloudprint.
 
@@ -1716,30 +1705,6 @@
 המדיניות הזו משפיעה רק על משתמשים שמאמתים באמצעות SAML.</translation>
 <translation id="4105989332710272578">השבתת אכיפה של 'שקיפות אישורים' ברשימת כתובות אתרים</translation>
 <translation id="4121350739760194865">מנע הצגה של קידומי מכירות של יישומים בדף הכרטיסייה החדשה</translation>
-<translation id="4125606414556046117">‏המדיניות הזו מאפשרת להגדיר את תמונת הטפט שמוצגת בשולחן העבודה וברקע של המשתמש במסך הכניסה. כדי להגדיר את המדיניות הזו, יש לציין את כתובת ה-URL שמערכת ההפעלה <ph name="PRODUCT_OS_NAME" /> יכולה להוריד ממנה את תמונת הטפט. בנוסף, יש לציין גיבוב קריפטוגרפי שמשמש לאימות התקינות של ההורדה. התמונה צריכה להיות בפורמט JPEG והגודל המרבי המותר של הקובץ הוא 16MB. כתובת ה-URL צריכה להיות נגישה ללא צורך באימות כלשהו.
-
-      המערכת מורידה את תמונת הטפט ושומרת אותה במטמון. אחרי כל שינוי של כתובת ה-URL או הגיבוב, תתבצע הורדה מחדש של התמונה.
-
-      יש להגדיר את המדיניות כמחרוזת המשקפת את כתובת ה-URL והגיבוב בפורמט JSON, בהתאם לסכימה הבאה:
-      {
-        "סוג": "אובייקט",
-        "מאפיינים": {
-          "כתובת URL": {
-            "תיאור": "כתובת ה-URL שממנה ניתן להוריד את תמונת הטפט.",
-            "סוג": "מחרוזת"
-          },
-          "גיבוב": {
-            "תיאור": "גיבוב SHA-256 של תמונת הטפט.",
-            "סוג": "מחרוזת"
-          }
-        }
-      }
-
-      אם המדיניות הזו מוגדרת, מערכת ההפעלה <ph name="PRODUCT_OS_NAME" /> תוריד את תמונת הטפט ותשתמש בה.
-
-      אם המדיניות הזו מוגדרת על ידך, המשתמשים לא יכולים לשנות או לבטל אותה.
-
-      אם המדיניות לא מוגדרת, המשתמשים יכולים לבחור תמונה שתוצג בשולחן העבודה וברקע של מסך הכניסה.</translation>
 <translation id="412697421478384751">‏משתמשים רשאים להגדיר קוד PIN חלש כקוד ה-PIN של מסך הנעילה</translation>
 <translation id="4138655880188755661">מגבלת זמן</translation>
 <translation id="4144164749344898721">‏המדיניות הזו שולטת בהגדרות מרובות של השיטה לניהול צריכת החשמל כשהמשתמש לא פעיל.
@@ -2657,53 +2622,6 @@
 
       אם מדיניות זו אינה מוגדרת או מוגדרת לא לפעול, פקודות הדפסה מפעילות את מסך התצוגה המקדימה של ההדפסה.</translation>
 <translation id="6022948604095165524">פעולה בעת ההפעלה</translation>
-<translation id="6023030044732320798">‏מציין קבוצת סעיפי מדיניות שיועברו אל זמן הריצה של ARC. הערך חייב להיות JSON חוקי.
-
-      אפשר להשתמש במדיניות הזו כדי להגדיר אילו אפליקציות Android יותקנו באופן אוטומטי במכשיר:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "מזהה אפליקציית Android , לדוגמה "com.google.android.gm" בשביל Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "מציין איך אפליקציה מותקנת. OPTIONAL: האפליקציה לא תותקן באופן אוטומטי, אבל המשתמש יוכל להתקין אותה. זו ברירת המחדל אם המדיניות הזו לא צוינה. PRELOAD: האפליקציה מותקנת באופן אוטומטי, אבל המשתמש יכול להסיר את ההתקנה שלה. FORCE_INSTALLED: האפליקציה מותקנת באופן אוטומטי והמשתמש לא יכול להסיר את ההתקנה שלה. BLOCKED: האפליקציה חסומה ולא ניתן להתקין אותה. אם האפליקציה הותקנה מתוקף מדיניות קודמת, ההתקנה שלה תוסר.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "מדיניות להענקת הרשאות על-פי בקשות של אפליקציות. PERMISSION_POLICY_UNSPECIFIED: המדיניות לא צוינה. אם לא צוינה מדיניות בשביל הרשאה ברמה כלשהי, נעשה שימוש בהתנהגות `PROMPT` כברירת מחדל. PROMPT: מוצגת למשתמש בקשה להעניק הרשאה. GRANT: הרשאה מוענקת באופן אוטומטי. DENY: הרשאה נדחית באופן אוטומטי.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "אובייקט תצורת JSON ספציפי לאפליקציה עם קבוצה של זוגות ערכי מפתח. לדוגמה: ‎'"managedConfiguration": { "key1": value1, "key2": value2 }'. T המפתחות מוגדרים במניפסט האפליקציה.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      כדי להצמיד אפליקציות למפעיל האפליקציות, יש לעיין ב-PinnedLauncherApps.</translation>
 <translation id="602728333950205286">‏כתובת אתר Instant של ספק חיפוש המוגדר כברירת מחדל</translation>
 <translation id="603410445099326293">‏פרמטרים עבור כתובת אתר להצעה שמשתמשת ב-POST</translation>
 <translation id="6034341625190551415">שולטת בסוגי חשבונות של קיוסק וסשנים ציבוריים.</translation>
@@ -3051,38 +2969,6 @@
       אם המדיניות מקבלת את הערך false, אף פעם לא נעשה שימוש בלקוח ה-DNS המובנה.
 
       אם המדיניות הזו לא מוגדרת, לקוח ה-DNS המובנה יופעל כברירת מחדל ב-MacOS, ‏Android (אם לא מופעלות אפשרויות ה-DNS הפרטי וה-VPN) ו-ChromeOS. בנוסף, המשתמשים יכולים לשנות את מצב השימוש בלקוח ה-DNS המובנה על ידי עריכת chrome://flags או ציון תכונה ניסיונית של שורת פקודה.</translation>
-<translation id="6838056959556423778">‏מבטלת את הכללים לבחירת מדפסת ברירת מחדל של <ph name="PRODUCT_NAME" />.
-
-      מדיניות זו קובעת את הכללים לבחירת מדפסת ברירת המחדל ב-<ph name="PRODUCT_NAME" />. הפעולה מתבצעת בפעם הראשונה שנעשה שימוש בפונקציית ההדפסה בפרופיל.
-
-      כשהמדיניות מוגדרת, <ph name="PRODUCT_NAME" /> ינסה למצוא מדפסת שמתאימה לכל המאפיינים שצוינו ויבחר אותה בתור מדפסת ברירת המחדל. המדפסת הראשונה שתימצא כמתאימה למדיניות תיבחר. אם ההתאמה אינה ייחודית, כל מדפסת מתאימה יכולה להיבחר, בהתאם לסדר שבו מתגלות המדפסות.
-
-      אם המדיניות לא מוגדרת או שלא נמצאה מדפסת תואמת בזמן הקצוב לתפוגה, מדפסת ה-PDF המובנית נקבעת כמדפסת ברירת המחדל. כשמדפסת ה-PDF לא זמינה, לא נבחרת מדפסת.
-
-      הערך מנותח כאובייקט JSON בהתאם לסכמה הבאה:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "אם להגביל את חיפוש המדפסת המתאימה לקבוצת מדפסות מסוימת.",
-            "type": {
-              "enum": [ "local", "cloud" ]
-            }
-          },
-          "idPattern": {
-            "description": "ביטוי רגולרי להתאמת מזהה מדפסת.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "ביטוי רגולרי להתאמת שם תצוגה של מדפסת.",
-            "type": "string"
-          }
-        }
-      }
-
-      המדפסות שמחוברות אל <ph name="CLOUD_PRINT_NAME" /> נחשבות <ph name="PRINTER_TYPE_CLOUD" /> ושאר המדפסות מסווגות כ-<ph name="PRINTER_TYPE_LOCAL" />.
-      השמטת שדה פירושה שכל הערכים תואמים. לדוגמה, השמטת 'קישוריות' תגרום לתצוגת ההדפסה המקדימה להתחיל בגילוי כל סוגי המדפסות, מקומיות ובענן.
-      דפוסי הביטוי הרגולרי צריכים להתאים לתחביר RegExp של JavaScript, וההתאמות תלויות רישיות.</translation>
 <translation id="6843296367238757293">‏המדיניות הזו הוצאה משימוש. מומלץ לא להשתמש בה. אפשר לקבל מידע נוסף בכתובת https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">המדיניות הזו הוסרה בגרסה 68 של <ph name="PRODUCT_NAME" /> והוחלפה על-ידי <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">‏המדיניות הזו הוצאה משימוש והוסרה ב-M66, כי נעשה בה שימוש רק לבדיקות פנימיות והיא יוצרת סכנת אבטחה.
@@ -4203,30 +4089,6 @@
       המדיניות משפיעה רק על משתמשים שביצעו אימות באמצעות SAML.
 
       יש לציין את הערך של המדיניות בשניות.</translation>
-<translation id="9027787254195333560">‏המדיניות הזו מאפשרת לך להגדיר את תמונת הדמות שמייצגת את המשתמש במסך הכניסה. כדי להגדיר את המדיניות הזו, יש לציין את כתובת ה-URL שמערכת ההפעלה <ph name="PRODUCT_OS_NAME" /> מורידה ממנה את תמונת הדמות. בנוסף, יש לציין גיבוב קריפטוגרפי שמשמש כדי לאמת את התקינות של ההורדה. התמונה חייבת להיות בפורמט JPEG והגודל שלה לא יכול להיות יותר מ-512kB. כתובת ה-URL צריכה להיות נגישה ללא צורך באימות כלשהו.
-
-      המערכת מורידה את תמונת הדמות ושומרת אותה במטמון. אחרי כל שינוי של כתובת ה-URL או הגיבוב, תתבצע הורדה מחדש של התמונה.
-
-      יש להגדיר את המדיניות כמחרוזת המשקפת את כתובת ה-URL והגיבוב בפורמט JSON, בהתאם לסכימה הבאה:
-      {
-        "סוג": "אובייקט",
-        "מאפיינים": {
-          "כתובת URL": {
-            "תיאור": "כתובת ה-URL שממנה ניתן להוריד את תמונת הדמות.",
-            "סוג": "מחרוזת"
-          },
-          "גיבוב": {
-            "תיאור": "גיבוב SHA-256 של תמונת הדמות.",
-            "סוג": "מחרוזת"
-          }
-        }
-      }
-
-      אם המדיניות הזו מוגדרת, מערכת ההפעלה <ph name="PRODUCT_OS_NAME" /> תוריד את תמונת הדמות ותשתמש בה.
-
-      אם המדיניות הזו מוגדרת על ידך, המשתמשים לא יכולים לשנות או לבטל אותה.
-
-      אם המדיניות לא מוגדרת, המשתמשים יכולים לבחור את תמונת הדמות שמייצגת אותם במסך הכניסה.</translation>
 <translation id="9035964157729712237">מזהי תוספים שפטורים מהוספה לרשימה השחורה</translation>
 <translation id="9038058011835642205">‏מציינת רשימת אתרים שמותקנים ברקע, ללא אינטראקציה של המשתמש ושאין באפשרותו להסיר או להשבית.
 
@@ -4239,7 +4101,6 @@
       אם המדיניות הזו מוגדרת על ידך, המשתמשים לא יכולים לשנות או לבטל אותה.
 
       הערך שהמדיניות מקבלת צריך להיות מוגדר באלפיות שנייה. הערכים מוגבלים לטווח של 30 שניות עד 24 שעות.</translation>
-<translation id="9042911395677044526">‏מאפשרת לדחוף את תצורת הרשת כדי שתיושם עבור משתמש למכשיר <ph name="PRODUCT_OS_NAME" />. תצורת הרשת היא מחרוזת בפורמט JSON כפי שהוגדרה על ידי פורמט תצורת הרשת הפתוחה, באופן המתואר ב-<ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">‏המדיניות הזו קובעת עם המכשיר יעודכן ל-Quick Fix Build.
 
       אם ערך המדיניות הוגדר כאסימון שממפה אל Quick Fix Build, המכשיר יעודכן ל-Quick Fix Build התואם, כל עוד העדכון לא חסום על-ידי מדיניות אחרת.
@@ -4313,17 +4174,6 @@
       אם המדיניות מוגדרת כ-False, האפשרות 'כותרות עליונות ותחתונות' לא נבחרת בתיבת הדו-שיח לתצוגה מקדימה של ההדפסה, והמשתמש לא יכול לשנות זאת.
 
       אם המדיניות מוגדרת כ-True, האפשרות 'כותרות עליונות ותחתונות' נבחרת בתיבת הדו-שיח לתצוגה מקדימה של ההדפסה, והמשתמש לא יכול לשנות זאת.</translation>
-<translation id="9213347477683611358">‏אם משתמשים עדיין לא התחברו למכשיר, הגדר תמונת טפט ברמת המכשיר שמוצגת במסך הכניסה. כדי להגדיר את המדיניות יש לציין את כתובת האתר שממנה מכשיר ה-Chrome OS יכול להוריד את תמונת הטפט, וייעשה שימוש ב-hash קריפטוגרפי לאימות של שלמות ההורדה. התמונה חייבת להיות בפורמט JPEG, והגודל המקסימלי של הקובץ הוא 16MB. כתובת האתר חייבת להיות נגישה בלי צורך באימות. מתבצעת הורדה של תמונת הטפט ואז מתבצעת שמירה במטמון. תתבצע הורדה חוזרת שלה בכל שינוי של כתובת האתר או של ה-hash.
-
-      יש לציין את המדיניות כמחרוזת שמפרטת את כתובת האתר ואת ה-hash בפורמט JSON, כגון:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      אם הוגדרה במכשיר מדיניות לגבי טפט, מכשיר ה-Chrome OS יוריד את תמונת הטפט וישתמש בה במסך הכניסה - אם משתמשים לא התחברו עדיין למכשיר. אחרי התחברות של משתמש, תיושם המדיניות שלו לגבי טפט.
-
-      אם לא מוגדרת מדיניות לגבי טפט במכשיר, והמשתמש הגדיר מדיניות כזו, המדיניות של המשתמש תקבע מה יוצג.</translation>
 <translation id="9217154963008402249">תדירות מנות הרשת לניטור</translation>
 <translation id="922540222991413931">הגדר את מקורות התקנת התוספים, היישומים והסקריפטים של משתמשים</translation>
 <translation id="924557436754151212">ייבא סיסמאות שנשמרו מדפדפן ברירת המחדל בהפעלה הראשונה</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index af4eecd5..6e54ed1 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -411,7 +411,6 @@
 
       警告: <ph name="PRODUCT_OS_NAME" /> のバージョンの制御をキオスクアプリに委ねることはおすすめしません。このようにした場合、デバイスでソフトウェアのアップデートや重要なセキュリティ修正を取得できなくなる可能性があります。つまり、<ph name="PRODUCT_OS_NAME" /> のバージョンの制御を委ねると、ユーザーが危険にさらされる恐れがあります。</translation>
 <translation id="1675002386741412210">サポート対象:</translation>
-<translation id="1689963000958717134"><ph name="PRODUCT_OS_NAME" /> デバイスのすべてのユーザーにプッシュ型ネットワーク設定を適用できます。ネットワーク設定は、Open Network Configuration 形式(<ph name="ONC_SPEC_URL" /> をご覧ください)で定義された JSON 形式の文字列です。</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> ファームウェア アップデート機能を利用可能にするかどうか、利用可能にする場合はその動作を設定します。
 
       個々の設定は JSON プロパティで指定できます。
@@ -942,16 +941,6 @@
       この設定が無効になっている場合は、ウェブページで JavaScript を使用できず、ユーザーはその設定を変更できません。
 
       この設定が有効または未設定の場合、ウェブページで JavaScript を使用できますが、ユーザーはこの設定を変更できます。</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> の拡張機能の管理設定を指定します。
-
-          このポリシーでは、拡張機能に関する既存のポリシーで管理されている設定など、複数の設定を管理します。このポリシーと以前のポリシーの両方が設定されている場合は、このポリシーが優先されます。
-
-          このポリシーは、拡張機能 ID または更新 URL をそれぞれの設定にマッピングします。拡張機能 ID を使用する場合、設定は指定した拡張機能にのみ適用されます。また、「<ph name="DEFAULT_SCOPE" />」という特別な ID でデフォルトの設定を指定できます。デフォルトの設定は、このポリシーでカスタムの設定が指定されていないすべての拡張機能に適用されます。更新 URL を使用する場合、設定はこの拡張機能のマニフェストで指定されている更新 URL を使用する、すべての拡張機能に適用されます(<ph name="LINK_TO_EXTENSION_DOC1" /> を参照)。
-
-          <ph name="MS_AD_NAME" /> ドメインに登録されていない Windows インスタンスについては、強制インストールできるのは Chrome ウェブストアに公開されているアプリと拡張機能のみとなります。
-
-          このポリシーで指定できる設定とその構成の詳しい説明については、https://www.chromium.org/administrators/policy-list-3/extension-settings-full をご覧ください。
-          </translation>
 <translation id="2753637905605932878">WebRTC が使用するローカル UDP ポートの範囲を制限する</translation>
 <translation id="2757054304033424106">インストールが許可されている拡張機能/アプリのタイプ</translation>
 <translation id="2758084448533744848">デバイスで使用する既定のタイムゾーンを指定します。このポリシーが設定されている場合、デバイスのユーザーは指定されたタイムゾーンを変更できません。無効な値を指定してもポリシーは有効で、この場合は「GMT」が使用されます。空白の文字列を指定した場合、ポリシーは無視されます。
@@ -977,7 +966,7 @@
 
           このポリシーが設定されている場合、ユーザーが設定を変更またはオーバーライドすることはできません。
 
-          このポリシーが未設定の場合、管理対象のデバイスのデフォルトは false になります。</translation>
+          このポリシーが未設定の場合、管理対象デバイスのデフォルトは false になります。</translation>
 <translation id="2787173078141616821">Android のステータスに関する情報を報告する</translation>
 <translation id="2799297758492717491">メディアの自動再生を許可する URL パターンのホワイトリストを指定する</translation>
 <translation id="2801155097555584385">バッテリー充電のカスタムの充電開始設定(%)を行う</translation>
@@ -1189,7 +1178,7 @@
 
       このポリシーでは、ユーザーが各自のデバイスでプリンタを設定できるかどうかは制御されません。このポリシーは、個々のユーザーのプリンタ設定をサポートすることを目的としたものです。
 
-      Active Directory の管理下にあるデバイスの場合、このポリシーでは、<ph name="MACHINE_NAME_VARIABLE" /> から Active Directory のマシン名またはその部分文字列への展開がサポートされます。たとえばマシン名が <ph name="MACHINE_NAME_EXAMPLE" />の場合、<ph name="MACHINE_NAME_VARIABLE_EXAMPLE" />は 6 文字目以降の 4 文字(<ph name="MACHINE_NAME_PART_EXAMPLE" />)に置き換えられます(先頭をゼロ文字目として数えます)。
+      Active Directory の管理下にあるデバイスの場合、このポリシーでは、<ph name="MACHINE_NAME_VARIABLE" /> から Active Directory のマシン名またはその部分文字列への展開がサポートされます。たとえばマシン名が <ph name="MACHINE_NAME_EXAMPLE" /> の場合、<ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> は 6 文字目以降の 4 文字(<ph name="MACHINE_NAME_PART_EXAMPLE" />)に置き換えられます(先頭をゼロ文字目として数えます)。
       </translation>
 <translation id="3072045631333522102">小売りモードでのログイン画面に使用するスクリーンセーバー</translation>
 <translation id="3072847235228302527">デバイスのローカル アカウントの利用規約を設定する</translation>
@@ -1640,13 +1629,13 @@
       このポリシーを true に設定した場合または未設定の場合、ユーザーは Chrome OS の登録特典を利用できます。
 
       このポリシーを false に設定した場合、ユーザーは特典を利用できません。</translation>
-<translation id="4008233182078913897">ユーザーに操作を求めずにサイレント インストールするアプリとアプリと拡張機能のリストを指定します。ユーザーはここで指定されたアプリや拡張機能をアンインストールすることも無効化することもできません。ここで指定されたアプリや拡張機能によってリクエストされるすべての権限は、ユーザーに確認を求めることなく暗黙的に許可されます。これには、アプリや拡張機能の将来のバージョンで新たにリクエストされる追加権限も含まれます。さらに、enterprise.deviceAttributes 拡張機能 API と enterprise.platformKeys 拡張機能 API に対しても権限が許可されます(この 2 つの API は、強制的にインストールされるアプリや拡張機能でのみ利用可能です)。
+<translation id="4008233182078913897">ユーザーに操作を求めずにサイレント インストールするアプリと拡張機能のリストを指定します。ユーザーはここで指定されたアプリや拡張機能をアンインストールすることも無効化することもできません。ここで指定されたアプリや拡張機能によってリクエストされるすべての権限は、ユーザーに確認を求めることなく暗黙的に許可されます。これには、アプリや拡張機能の将来のバージョンで新たにリクエストされる追加権限も含まれます。さらに、enterprise.deviceAttributes 拡張機能 API と enterprise.platformKeys 拡張機能 API に対しても権限が許可されます(この 2 つの API は、強制的にインストールされるアプリや拡張機能でのみ利用可能です)。
 
           このポリシーが <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> ポリシーと競合する場合は、このポリシーが優先されます。以前に強制的にインストールされたアプリまたは拡張機能がこのリストから削除された場合、そのアプリまたは拡張機能は <ph name="PRODUCT_NAME" /> によって自動的にアンインストールされます。
 
-          <ph name="MS_AD_NAME" /> ドメインに追加されていない Windows インスタンスの場合、強制インストールは Chrome ウェブストアのリストにあるアプリと拡張機能に限定されます。
+          <ph name="MS_AD_NAME" /> ドメインに登録されていない Windows インスタンスの場合、強制的にインストールされるのは Chrome ウェブストアに公開されているアプリと拡張機能のみとなります。
 
-          ただしどの拡張機能についても、ユーザーはデベロッパー ツールを使用してソースコードを変更することができます(その場合、拡張機能が機能しなくなることがあります)。こうした変更を禁止したい場合は、<ph name="DEVELOPER_TOOLS_POLICY_NAME" /> ポリシーを設定してください。
+          なお、どの拡張機能についても、ユーザーはデベロッパー ツールを使用してソースコードを変更することができます(その場合、拡張機能が機能しなくなることがあります)。こうした変更を禁止したい場合は、<ph name="DEVELOPER_TOOLS_POLICY_NAME" /> ポリシーを設定してください。
 
           このポリシーの各リスト項目には、拡張機能 ID と「更新」URL(省略可)をセミコロン(<ph name="SEMICOLON" />)で区切った文字列を指定します。拡張機能 ID は 32 文字の文字列で、デベロッパー モードで <ph name="CHROME_EXTENSIONS_LINK" /> を開くと確認できます。「更新」URL には、更新マニフェスト XML ドキュメントを指定する必要があります(指定する場合)(<ph name="LINK_TO_EXTENSION_DOC1" /> の説明をご覧ください)。デフォルトでは Chrome ウェブストアの更新 URL(現時点では「https://clients2.google.com/service/update2/crx」)が使用されます。なお、このポリシーで設定された「更新」URL は初回のインストールでのみ使用され、その後の拡張機能の更新には、拡張機能のマニフェストで指定されている更新 URL が使用されます。また、<ph name="PRODUCT_NAME" /> のバージョン 67 以下では「更新」URL の明示的な指定が必須となっていました。
 
@@ -1702,29 +1691,6 @@
       このポリシーは、SAML を使用して認証を行うユーザーのみに影響します。</translation>
 <translation id="4105989332710272578">指定した URL に対して証明書の透明性ポリシーの適用を無効にする</translation>
 <translation id="4121350739760194865">アプリのプロモーションが新しいタブ ページに表示されないようにする</translation>
-<translation id="4125606414556046117">このポリシーでは、デスクトップ画面やログイン画面の背景に表示される壁紙画像を設定できます。このポリシーを設定するには、<ph name="PRODUCT_OS_NAME" /> での壁紙画像のダウンロード元の URL と、ダウンロードの整合性の確認に使用する暗号化ハッシュを指定します。画像は JPEG 形式で、ファイルサイズは 16 MB 以下である必要があります。URL には認証なしでアクセスできる必要があります。
-
-      壁紙画像はダウンロードされ、キャッシュに保存されます。URL またはハッシュが変更された場合は常に再ダウンロードされます。
-
-      このポリシーには、URL とハッシュを表す文字列を JSON 形式で指定します。次のスキーマに準拠する必要があります。
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "The URL from which the wallpaper image can be downloaded.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "The SHA-256 hash of the wallpaper image.",
-            "type": "string"
-          }
-        }
-      }
-
-      このポリシーを設定した場合、<ph name="PRODUCT_OS_NAME" /> は壁紙画像をダウンロードして使用します。
-
-      このポリシーを設定した場合、ユーザーが変更したりオーバライドしたりすることはできません。
-      このポリシーが未設定の場合、ユーザーはデスクトップ画面やログイン画面の背景に表示される画像を選択できます。</translation>
 <translation id="412697421478384751">ロック画面の PIN として強度の低い PIN を設定可能にする</translation>
 <translation id="4138655880188755661">時間制限</translation>
 <translation id="4144164749344898721">このポリシーでは、ユーザーがアイドル状態になったときの電力管理戦略に関する複数の設定を管理します。
@@ -2639,53 +2605,6 @@
 
       このポリシーが設定されていない場合や false に設定されている場合、印刷コマンドを実行すると印刷プレビュー画面が表示されます。</translation>
 <translation id="6022948604095165524">起動時の操作</translation>
-<translation id="6023030044732320798">ARC ランタイムに渡される一連のポリシーを指定します。値は有効な JSON である必要があります。
-
-      このポリシーを使用して、デバイスにどの Android アプリを自動的にインストールするかを設定できます。
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android アプリ識別子。たとえば、Gmail は "com.google.android.gm" など",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "アプリのインストール方法を指定します。OPTIONAL: アプリは自動的にはインストールされませんが、ユーザーがインストールすることはできます。このポリシーが指定されていない場合は、デフォルトでこの設定が使用されます。PRELOAD: アプリは自動的にインストールされますが、ユーザーがアンインストールすることもできます。FORCE_INSTALLED: アプリは自動的にインストールされ、ユーザーがアンインストールすることはできません。BLOCKED: アプリはブロックされ、インストールできません。以前のポリシーによってアプリがインストール済みの場合はアンインストールされます。",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "アプリへの権限付与のリクエストに関するポリシーです。PERMISSION_POLICY_UNSPECIFIED: ポリシーを指定しません。権限に関するポリシーがどのレベルでも指定されていなければ、デフォルトで「PROMPT」の動作が適用されます。PROMPT: 権限を付与するよう促すメッセージをユーザーに表示します。GRANT: 自動的に権限を付与します。DENY: 自動的に権限の付与を拒否します。",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "アプリ固有の JSON 設定文字列です。例: '"managedConfiguration": { "key1": value1, "key2": value2 }'。キーはアプリのマニフェストで定義されます。",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      ランチャーにアプリを固定する場合は、PinnedLauncherApps をご覧ください。</translation>
 <translation id="602728333950205286">デフォルトの検索プロバイダのインスタント検索 URL</translation>
 <translation id="603410445099326293">POST を使用するキーワード候補による検索 URL のパラメータ</translation>
 <translation id="6034341625190551415">公開セッションとキオスク アカウントを制御します。</translation>
@@ -3030,37 +2949,6 @@
       このポリシーを false に設定すると、組み込みの DNS クライアントは使用されません。
 
       このポリシーを未設定のままにすると、MacOS、Android(プライベート DNS も VPN も有効にしていない場合)、Chrome OS では組み込みの DNS クライアントがデフォルトで有効になります。ただし、ユーザーは chrome://flags を編集するかコマンドライン フラグを指定することで、組み込みの DNS クライアントを使用するかどうかを変更できます。</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> のデフォルト プリンタ選択ルールをオーバーライドします。
-
-      このポリシーは、<ph name="PRODUCT_NAME" /> のデフォルト プリンタを選択するルールを決定します。これは、各プロフィールで印刷プロフィールが初めて使用されるときに行われます。
-
-      このポリシーが設定されていると、<ph name="PRODUCT_NAME" /> は、指定されたすべての属性に一致するプリンタを探して選択し、デフォルト プリンタに設定しようと試みます。最初に見つかったポリシーに一致するプリンタが選択されます。適合するプリンタが複数ある場合は、最初に見つかったプリンタが選択されます。
-
-      このポリシーが設定されていない場合や、タイムアウトするまでに一致するプリンタが見つからない場合、デフォルト プリンタは組み込みの PDF プリンタに設定されますが、PDF プリンタが利用できない場合は、プリンタは設定されません。
-
-      値は JSON オブジェクトとして解析され、次のスキーマに一致するものです。
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "照合するプリンタの検索を特定のプリンタのセットに限定するかどうか",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "プリンタ ID と照合する正規表現",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "プリンタの表示名と照合する正規表現",
-            "type": "string"
-          }
-        }
-      }
-
-      「<ph name="CLOUD_PRINT_NAME" />」に接続されるプリンタは「<ph name="PRINTER_TYPE_CLOUD" />」と見なされ、それ以外のプリンタは「<ph name="PRINTER_TYPE_LOCAL" />」に分類されます。
-      項目の値の指定を省略すると、すべての値に一致することになります。たとえば、接続の種類を指定しない場合、印刷プレビューはローカルとクラウドを問わず、あらゆる種類のプリンタの検出を開始することになります。
-      正規表現のパターンは JavaScript RegExp 構文に従う必要があり、照合の際に大文字と小文字が区別されます。</translation>
 <translation id="6843296367238757293">このポリシーはサポートを終了しているため、使用しないことをおすすめします。詳しくは、https://support.google.com/chrome/a/answer/7643500 をご覧ください。</translation>
 <translation id="684856667300805181">このポリシーは <ph name="PRODUCT_NAME" /> 68 で削除され、<ph name="ARC_GLS_POLICY_NAME" /> に置き換えられました。</translation>
 <translation id="6856743875250214792">このポリシーは内部テストのみに使用されており、セキュリティ保証の観点から、M66 ではサポート終了および削除となりました。
@@ -3135,13 +3023,13 @@
       このポリシーが True に設定されているか未設定の場合は、スマート消灯モデルが有効になり、画面が暗くなるまでの時間が必要に応じて延長されるようになります。このポリシーが False に設定されている場合は、画面が暗くなるまでの時間がスマート消灯モデルによって変更されることはありません。</translation>
 <translation id="6967394885063085697">詳細なバッテリー充電モードの電力管理ポリシーを有効にします。
 
-          ユーザーは、詳細なバッテリー充電モードを使ってバッテリーを最適な状態にすることができます。詳細な充電モードでは、システムは、ユーザーが使用していない間、標準の充電アルゴリズムや他の技術を活用してバッテリーを最適な状態にします。ユーザーが使用している間は、急速充電が行われます。急速充電により、より短時間でバッテリーをフル充電できます。曜日ごとに、システムの使用頻度が最も高くなる時間帯を開始時間とその継続時間で指定します。
+          ユーザーは、詳細なバッテリー充電モードを使ってバッテリーを最適な状態にすることができます。詳細な充電モードでは、システムは、ユーザーが使用していない間、標準の充電アルゴリズムや他の技術を活用してバッテリーを最適な状態にします。ユーザーが使用している間は、急速充電が行われます。急速充電により、より短時間でバッテリーをフル充電できます。曜日ごとに、システムの使用頻度が最も高くなる時間帯を、開始時間とその継続時間で指定します。
 
           このポリシーを true に設定していて、DeviceAdvancedBatteryChargeModeDayConfig が設定されている場合、詳細なバッテリー充電モードに対応しているデバイスではこのモードが常に有効になります。
 
           このポリシーを false に設定した場合、詳細なバッテリー充電モードは常に無効になります。
 
-          このポリシーを設定した場合、ユーザーは変更したりオーバーライドしたりすることはできません。
+          このポリシーを設定した場合、ユーザーが設定を変更またはオーバーライドすることはできません。
 
           このポリシーを未設定のままにした場合、詳細なバッテリー充電モードは無効となり、ユーザーが有効にすることはできません。</translation>
 <translation id="6972540544240464302">タスク スケジューラ設定を選択します</translation>
@@ -4187,29 +4075,6 @@
       このポリシーは、SAML を使用して認証を行ったユーザーにのみ適用されます。
 
       ポリシーの値は秒単位で指定します。</translation>
-<translation id="9027787254195333560">このポリシーでは、ログイン画面でユーザーを表すアバター画像を設定できます。このポリシーを設定するには、<ph name="PRODUCT_OS_NAME" /> によるアバター画像のダウンロード元の URL と、ダウンロードの整合性の確認に使用する暗号化ハッシュを指定します。画像は JPEG 形式で、サイズは 512 KB 以下である必要があります。URL には認証なしでアクセスできる必要があります。
-
-      アバター画像はダウンロードされ、キャッシュに保存されます。URL またはハッシュが変更された場合は常に再ダウンロードされます。
-
-      このポリシーには、URL とハッシュを表す文字列を JSON 形式で指定します。次のスキーマに準拠する必要があります。
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "The URL from which the avatar image can be downloaded.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "The SHA-256 hash of the avatar image.",
-            "type": "string"
-          }
-        }
-      }
-
-      このポリシーを設定した場合、<ph name="PRODUCT_OS_NAME" /> はアバター画像をダウンロードして使用します。
-
-      このポリシーを設定した場合、ユーザーが変更したりオーバライドしたりすることはできません。
-      このポリシーが未設定の場合、ユーザーはログイン画面でユーザーを表すアバター画像を選択できます。</translation>
 <translation id="9035964157729712237">ブラックリストから除外する拡張機能 ID</translation>
 <translation id="9038058011835642205">ユーザーの操作なしでアプリをサイレント インストールするウェブサイトのリストを指定します。ユーザーはこれらのアプリをアンインストールしたり、無効にしたりできません。
 
@@ -4221,7 +4086,6 @@
 
       このポリシーを設定した場合、ユーザーが変更したりオーバライドしたりすることはできません。
       ポリシーの値はミリ秒単位で指定します。値の範囲は 30 秒~24 時間です。</translation>
-<translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> デバイスのユーザーごとにプッシュ型ネットワーク設定を適用できます。ネットワーク設定は、Open Network Configuration 形式(<ph name="ONC_SPEC_URL" /> を参照)で定義された JSON 形式の文字列です。</translation>
 <translation id="9050853837490399534">このポリシーでは、デバイスを Quick Fix ビルドに更新するかどうかを管理します。
 
       Quick Fix ビルドにマッピングされているトークンをポリシーの値に設定した場合、別のポリシーで更新がブロックされていない限り、デバイスを対応する Quick Fix ビルドに更新します。
@@ -4294,17 +4158,6 @@
       このポリシーが False に設定されている場合、印刷プレビュー ダイアログの [ヘッダーとフッター] はオフになり、ユーザーがこれを変更することはできません。
 
       このポリシーが True に設定されている場合、印刷プレビュー ダイアログの [ヘッダーとフッター] はオンになり、ユーザーがこれを変更することはできません。</translation>
-<translation id="9213347477683611358">どのユーザーもログインしていない場合にログイン画面に表示する、デバイスの壁紙画像を設定します。このポリシーを設定するには、Chrome OS デバイスが壁紙の画像と暗号化ハッシュをダウンロードすることのできる URL を指定します(暗号化ハッシュはファイルが完全にダウンロードされたかどうかの確認に使用されます)。画像の形式は JPEG、サイズは 16 MB 以下とし、URL には認証なしでアクセスできる必要があります。壁紙画像はダウンロードされた後、キャッシュされます。URL またはハッシュに変更があった場合は再度ダウンロードされます。
-
-      このポリシーには、URL とハッシュを表す JSON 形式の文字列を次のように指定します。
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      デバイスの壁紙ポリシーが設定されていて、どのユーザーもデバイスにログインしていない場合、Chrome OS デバイスは壁紙をダウンロードしてログイン画面に表示します。ユーザーがログインすると、そのユーザーの壁紙ポリシーが適用されます。
-
-      デバイスの壁紙ポリシーが設定されておらず、ユーザーの壁紙ポリシーが設定されている場合は、ユーザーの壁紙ポリシーによって表示される壁紙が決まります。</translation>
 <translation id="9217154963008402249">監視ネットワーク パケットの送信間隔</translation>
 <translation id="922540222991413931">拡張機能、アプリ、ユーザー スクリプトのインストール ソースを設定する</translation>
 <translation id="924557436754151212">初回実行時にデフォルトのブラウザから保存したパスワードをインポートする</translation>
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index 65e15781..04c278a 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -383,7 +383,6 @@
 
       ಎಚ್ಚರಿಕೆ: <ph name="PRODUCT_OS_NAME" /> ಆವೃತ್ತಿಯ ನಿಯಂತ್ರಣವನ್ನು ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ನಿಯೋಜಿಸಲು ಶಿಫಾರಸು ಮಾಡಲಾಗಿಲ್ಲ ಏಕೆಂದರೆ ಇದು ಸಾಫ್ಟ್‌ವೇರ್ ಅಪ್‌ಡೇಟ್‌ಗಳು ಮತ್ತು ಪ್ರಮುಖವಾದ ಭದ್ರತೆ ಪರಿಹಾರಗಳನ್ನು ಸಾಧನವು ಸ್ವೀಕರಿಸುವುದನ್ನು ತಡೆಗಟ್ಟಬಹುದು. <ph name="PRODUCT_OS_NAME" /> ಆವೃತ್ತಿಯ ನಿಯಂತ್ರಣವನ್ನು ನಿಯೋಜಿಸುವುದು ಬಳಕೆದಾರರು ಅಪಾಯಕ್ಕೆ ಈಡಾಗಬಹುದು.</translation>
 <translation id="1675002386741412210">ಇದನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ:</translation>
-<translation id="1689963000958717134"><ph name="PRODUCT_OS_NAME" /> ಸಾಧನದ ಎಲ್ಲ ಬಳಕೆದಾರರಿಗಾಗಿ ಅನ್ವಯಿಸಲಾದ ಪುಶಿಂಗ್ ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ. ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್‌‌ <ph name="ONC_SPEC_URL" /> ನಲ್ಲಿ ವಿವರಿಸಲಾದ ತೆರೆದ ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್ ಸ್ವರೂಪದಿಂದ ವ್ಯಾಖ್ಯಾನಿಸಲಾದಂತಹ JSON- ಸ್ವರೂಪದ ಸ್ಟ್ರಿಂಗ್ ಆಗಿದೆ</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> ಫರ್ಮ್‌ವೇರ್ ಅಪ್‌ಡೇಟ್ ಕಾರ್ಯಾಚರಣೆಯ ಲಭ್ಯತೆ ಹಾಗೂ ವರ್ತನೆಯನ್ನು ಇದು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ.
 
       ಪ್ರತ್ಯೇಕ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು JSON ಗುಣಲಕ್ಷಣಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು:
@@ -911,16 +910,6 @@
       ಈ ಸೆಟ್ಟಿಂಗ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದಲ್ಲಿ, ವೆಬ್ ಪುಟಗಳಿಗೆ JavaScript ಅನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ ಮತ್ತು ಬಳಕೆದಾರರಿಗೆ ಆ ಸೆಟ್ಟಿಂಗ್ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.
 
       ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ ಅಥವಾ ಹೊಂದಿಸದಿದ್ದರೆ, ವೆಬ್ ಪುಟಗಳು JavaScript ಅನ್ನು ಬಳಸಬಹುದು ಆದರೆ ಬಳಕೆದಾರರು ಆ ಸೆಟ್ಟಿಂಗ್ ಬದಲಾಯಿಸಬಹುದಾಗಿದೆ.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> ನ ವಿಸ್ತರಣೆ ನಿರ್ವಹಣಾ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ.
-
-          ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಯಾವುದೇ ವಿಸ್ತರಣೆ-ಸಂಬಂಧಿತ ಕಾರ್ಯನೀತಿಗಳ ನಿಯಂತ್ರಣಕ್ಕೆ ಒಳಪಟ್ಟ ಸೆಟ್ಟಿಂಗ್‌ಗಳೂ ಸೇರಿದಂತೆ, ಹಲವು ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ನಿಯಂತ್ರಿಸುತ್ತದೆ. ಇದರ ಜೊತೆಗೆ ಯಾವುದೇ ಪರಂಪರಾನುಗತ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಹ ಹೊಂದಿಸಿದರೆ, ಈ ಕಾರ್ಯನೀತಿಯು ಅದನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ.
-
-          ಈ ಕಾರ್ಯನೀತಿಯು ಅದರ ಕಾನ್ಫಿಗರೇಶನ್‌ಗೆ, ವಿಸ್ತರಣೆ ಐಡಿ ಅಥವಾ ಅಪ್‌ಡೇಟ್ URL ಆನ್ನು ಮ್ಯಾಪ್ ಮಾಡುತ್ತದೆ. ವಿಸ್ತರಣೆ ಐಡಿಯನ್ನು ಬಳಸಿದರೆ, ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ವಿಸ್ತರಣೆಗೆ ಮಾತ್ರ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ. ವಿಶೇಷ ಐಡಿ <ph name="DEFAULT_SCOPE" /> ಗಾಗಿ ಡಿಫಾಲ್ಟ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಹೊಂದಿಸಬಹುದು. ಈ ಕಾರ್ಯನೀತಿಯಲ್ಲಿ ಕಸ್ಟಮ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಹೊಂದಿಸಿರದ ಎಲ್ಲ ವಿಸ್ತರಣೆಗಳಿಗೆ ಈ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ವಯಿಸುತ್ತದೆ. ಅಪ್‌ಡೇಟ್ URL ಅನ್ನು ಬಳಸಿದರೆ, <ph name="LINK_TO_EXTENSION_DOC1" /> ನಲ್ಲಿ ವಿವರಿಸಿರುವಂತೆ, ಈ ವಿಸ್ತರಣೆಯ ಮ್ಯಾನಿಫೆಸ್ಟ್‌ನಲ್ಲಿ ಹೇಳಿರುವ ನಿಖರವಾದ ಅಪ್‌ಡೇಟ್ URL ಅನ್ನು ಹೊಂದಿರುವ ಎಲ್ಲಾ ವಿಸ್ತರಣೆಗಳಿಗೂ ಈ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ.
-
-          <ph name="MS_AD_NAME" /> ಡೊಮೇನ್‌ಗೆ ಸೇರಿರದ Windows ನಿದರ್ಶನಗಳಲ್ಲಿ, ಬಲವಂತದ ಇನ್‌ಸ್ಟಾಲೇಶನ್, Chrome ವೆಬ್ ಸ್ಟೋರ್‌ನಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಿದ ಆ್ಯಪ್‌ಗಳು ಹಾಗೂ ವಿಸ್ತರಣೆಗಳಿಗೆ ಸೀಮಿತವಾಗಿರುತ್ತದೆ.
-
-          ಈ ಕಾರ್ಯನೀತಿಯ ಸಂಭಾವ್ಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಹಾಗೂ ಸಂರಚನೆಯ ಕುರಿತಾದ ಸಂಪೂರ್ಣ ವಿವರಣೆಗಾಗಿ, https://www.chromium.org/administrators/policy-list-3/extension-settings-full ಗೆ ಭೇಟಿ ನೀಡಿ
-          </translation>
 <translation id="2753637905605932878">WebRTC ಬಳಸುವ ಸ್ಥಳೀಯ UDP ಪೋರ್ಟ್‌ಗಳ ವ್ಯಾಪ್ತಿಯನ್ನು ನಿಯಂತ್ರಿಸಿ</translation>
 <translation id="2757054304033424106">ಸ್ಥಾಪಿಸುವಿಕೆಗೆ ಅನುಮತಿಸಲಾಗುವ extensions/apps ಪ್ರಕಾರಗಳು.</translation>
 <translation id="2758084448533744848">ಸಾಧನಕ್ಕಾಗಿ ಬಳಸಬೇಕಾದ ಜಾರಿಗೊಳಿಸಿದ ಸಮಯ ವಲಯವನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದರೆ, ನಿರ್ದಿಷ್ಟಪಡಿಸಿರುವ ಸಮಯ ವಲಯವನ್ನು ಸಾಧನದಲ್ಲಿರುವ ಬಳಕೆದಾರರು ಅತಿಕ್ರಮಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಒಂದು ಅಮಾನ್ಯ ಮೌಲ್ಯವನ್ನು ಒದಗಿಸಿದ್ದರೆ, ಬದಲಿಗೆ ಕಾರ್ಯನೀತಿಯನ್ನು ಈಗಲೂ "GMT" ಬಳಸಿಕೊಂಡು ಸಕ್ರಿಯಗೊಳಿಸಬಹುದಾಗಿದೆ. ಒಂದು ವೇಳೆ ಖಾಲಿ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಒದಗಿಸಿದ್ದರೆ, ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.
@@ -938,7 +927,7 @@
 
       ಪ್ರತಿ ಪಟ್ಟಿಯ ನಮೂದು ಗುರುತಿಸುವಿಕೆಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ, ಇದನ್ನು ವಿಭಿನ್ನ ಸಾಧನಗಳ-ಸ್ಥಳೀಯ ಖಾತೆಗಳನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ಹೇಳಲು ಆಂತರಿಕವಾಗಿ ಬಳಸಬಹುದಾಗಿರುತ್ತದೆ.</translation>
 <translation id="2769952903507981510">ರಿಮೋಟ್ ಪ್ರವೇಶ ಹೋಸ್ಟ್‌ಗಳಿಗೆ ಅಗತ್ಯವಿರುವ ಡೊಮೇನ್ ಹೆಸರನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation>
-<translation id="2783078941107212091">ಲಾಂಛರ್‌ನಲ್ಲಿರುವ ಹುಡುಕಾಟ ಬಾಕ್ಸ್‌ನ ಶೂನ್ಯ ಸ್ಥಿತಿಯಲ್ಲಿನ ಆ್ಯಪ್ ಶಿಫಾರಸನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ
+<translation id="2783078941107212091">ಲಾಂಚರ್‌ನಲ್ಲಿರುವ ಹುಡುಕಾಟ ಬಾಕ್ಸ್‌ನ ಶೂನ್ಯ ಸ್ಥಿತಿಯಲ್ಲಿನ ಆ್ಯಪ್ ಶಿಫಾರಸನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ
 
           ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸರಿ ಎಂಬುದಾಗಿ ಹೊಂದಿಸಿದರೆ, ಆ್ಯಪ್ ಶಿಫಾರಸುಗಳು ಶೂನ್ಯ ಸ್ಥಿತಿ ಹುಡುಕಾಟದಲ್ಲಿ ಗೋಚರಿಸಬಹುದು.
 
@@ -1658,27 +1647,6 @@
       SAML ಬಳಸಿಕೊಂಡು ಪ್ರಮಾಣೀಕರಿಸುವ ಬಳಕೆದಾರರ ಮೇಲೆ ಮಾತ್ರ ಈ ಕಾರ್ಯನೀತಿಯು ಪರಿಣಾಮ ಬೀರುತ್ತದೆ.</translation>
 <translation id="4105989332710272578">URL ಗಳ ಪಟ್ಟಿಗೆ ಪ್ರಮಾಣಪತ್ರ ಪಾರದರ್ಶಕತೆ ಜಾರಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="4121350739760194865">ಹೊಸ ಟ್ಯಾಬ್ ಪುಟದಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರಚಾರಗಳನ್ನು ತಡೆಗಟ್ಟುತ್ತದೆ</translation>
-<translation id="4125606414556046117">ಡೆಸ್ಕ್‌ಟಾಪ್‌ನಲ್ಲಿ ಮತ್ತು ಬಳಕೆದಾರರಿಗಾಗಿ ಲಾಗಿನ್ ಪರದೆಯ ಹಿನ್ನೆಲೆಯಲ್ಲಿರುವ ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಈ ನೀತಿಯು ನಿಮಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ವಾಲ್‌ಪೇಪರ್ ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದಾದ <ph name="PRODUCT_OS_NAME" /> ನಿಂದ URL ಅನ್ನು ಸೂಚಿಸುವುದರ ಮೂಲಕ ಮತ್ತು ಡೌನ್‌ಲೋಡ್‌ನ ಸಮಗ್ರತೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಬಳಸುವ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಹ್ಯಾಶ್ ಅನ್ನು ಸೂಚಿಸುವುದರ ಮೂಲಕ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ. ಚಿತ್ರವು JPEG ಸ್ವರೂಪದಲ್ಲಿರಬೇಕು, ಅದರ ಗಾತ್ರವು 16MB ಮೀರಬಾರದು. ಯಾವುದೇ ದೃಢೀಕರಣವಿಲ್ಲದೆ ಸುಲಭವಾಗಿ URL ಪ್ರವೇಶಿಸುವಂತಿರಬೇಕು.
-
-      ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ, ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ. URL ಅಥವಾ ಹ್ಯಾಶ್ ಬದಲಾವಣೆ ಆದಾಗಲೆಲ್ಲಾ ಇದನ್ನು ಮರು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.
- 
-ಈ ಕೆಳಗಿನ ಸ್ಕೀಮಾ ಅನುರೂಪವಾಗಿರುವ, URL ಮತ್ತು ಹ್ಯಾಶ್ ಅನ್ನು JSON ಫಾರ್ಮ್ಯಾಟ್‌ನಲ್ಲಿ ವ್ಯಕ್ತಪಡಿಸುವಂತಹ ಸ್ಟ್ರಿಂಗ್‌ನ ರೂಪದಲ್ಲಿ ನೀತಿಯನ್ನು ಸೂಚಿಸಿರಬೇಕು:
-      { 
-        "type": "object",
-        "properties": {   
-         "url": {    
-          "description": "ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದಾದ URL .",
-          "type": "string"
-         }, 
-         "hash": {
-          "description": "ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರದ SHA-256 ಹ್ಯಾಶ್.", 
-          "type": "string"
-        }
-      } 
-    }
-ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದ್ದರೆ, <ph name="PRODUCT_OS_NAME" /> ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿಕೊಳ್ಳುತ್ತದೆ ಮತ್ತು ಬಳಸಿಕೊಳ್ಳುತ್ತದೆ.
-        ನೀವು ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರು ಅದನ್ನು ಬದಲಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
-        ಒಂದು ವೇಳೆ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, ಬಳಕೆದಾರರು ಡೆಸ್ಕ್‌ಟಾಪ್‌ನಲ್ಲಿ ಮತ್ತು ಲಾಗಿನ ಪರದೆಯ ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲು ಚಿತ್ರವೊಂದನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಳ್ಳಬಹುದು.</translation>
 <translation id="412697421478384751">ಲಾಕ್‌ ಪರದೆ ಪಿನ್‌ಗೆ ದುರ್ಬಲ ಪಿನ್‌‍ಗಳನ್ನು ಸೆಟ್‌ ಮಾಡಲು ಬಳಕೆದಾರರನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="4138655880188755661">ಸಮಯದ ಮಿತಿ</translation>
 <translation id="4144164749344898721">ಬಳಕೆದಾರರು ತಟಸ್ಥರಾಗಿದ್ದಾಗ ಪವರ್‌ ನಿರ್ವಹಣೆಯ ಕಾರ್ಯತಂತ್ರಕ್ಕಾಗಿ ಈ ಕಾರ್ಯನೀತಿಯು ಹಲವು ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ.
@@ -2583,53 +2551,6 @@
 
       ಒಂದು ವೇಳೆ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿಲ್ಲದ್ದಿದ್ದರೆ ಅಥವಾ ತಪ್ಪಾಗಿ ಹೊಂದಿಸಿದ್ದರೆ, ಮುದ್ರಣ ಆದೇಶಗಳು ಮುದ್ರಮ ಪೂರ್ವವೀಕ್ಷಣೆ ಪರದೆಯನ್ನು ಟ್ರಿಗ್ಗರ್ ಮಾಡುತ್ತವೆ.</translation>
 <translation id="6022948604095165524">ಪ್ರಾರಂಭದಲ್ಲಿನ ಕ್ರಿಯೆ</translation>
-<translation id="6023030044732320798">ARC ರನ್‌ಟೈಮ್‌ಗೆ ನೀಡಲಾಗುವ ನೀತಿಗಳ ಸಮೂಹವನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. ಮೌಲ್ಯವು ಮಾನ್ಯವಾದ JSON ಆಗಿರಬೇಕು.
-
-      ಈ ಸಾಧನದಲ್ಲಿ ಯಾವ Android ಅಪ್ಲಿಕೇಶನ್‍ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತದೆ ಎನ್ನುವುದನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಬಳಸಬಹುದು:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android ಅಪ್ಲಿಕೇಶನ್ ಗುರುತಿಸುವಿಕೆ, ಉದಾ."com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಹೇಗೆ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತದೆ ಎನ್ನುವುದನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. OPTIONAL: ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ, ಆದರೆ ಬಳಕೆದಾರರು ಅದನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಬಹುದು. ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿರದಿದ್ದರೆ, ಇದು ಡಿಫಾಲ್ಟ್ ಆಗಿರುತ್ತದೆ. PRELOAD: ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತದೆ, ಆದರೆ ಬಳಕೆದಾರರು ಅದನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಬಹುದು. FORCE_INSTALLED: ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತದೆ, ಆದರೆ ಬಳಕೆದಾರರು ಅದನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. BLOCKED: ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಮತ್ತು ಅದನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಹಿಂದಿನ ಕಾರ್ಯನೀತಿಯ ಅಡಿಯಲ್ಲಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿದ್ದರೆ, ಅದನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗುವುದು."
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಕೋರಿಕೆಗಳನ್ನು ಅನುಮೋದಿಸುವ ಕಾರ್ಯನೀತಿ. PERMISSION_POLICY_UNSPECIFIED: ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿಲ್ಲ. ಯಾವುದೇ ಹಂತದಲ್ಲೂ, ಯಾವುದೇ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿರದಿದ್ದರೆ, `PROMPT` ವರ್ತನೆಯನ್ನು ಡಿಫಾಲ್ಟ್ ಆಗಿ ಬಳಸಲಾಗುತ್ತದೆ. PROMPT: ಅನುಮತಿ ನೀಡಲು ಬಳಕೆದಾರರಿಗೆ ಪ್ರಾಂಪ್ಟ್ ಮಾಡುವುದು. GRANT: ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅನುಮತಿ ನೀಡುವುದು. DENY: ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅನುಮತಿ ನಿರಾಕರಿಸುವುದು.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "ಅಪ್ಲಿಕೇಶನ್-ನಿರ್ದಿಷ್ಟ JSON ಕಾನ್ಫಿಗರೇಶನ್ ಸ್ಟ್ರಿಂಗ್.  '"managedConfiguration": { "key1": value1, "key2": value2 }'. ಕೀಗಳನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಮ್ಯಾನಿಫೆಸ್ಟ್‌ನಲ್ಲಿ ವ್ಯಾಖ್ಯಾನಿಸಲಾಗಿರುತ್ತದೆ. ಅವು ಸಾಮಾನ್ಯವಾಗಿ ಹೀಗೆ ಕಾಣಿಸುತ್ತವೆ, ಉದಾ.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-     ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲಾಂಚರ್‌ಗೆ ಪಿನ್ ಮಾಡಲು, PinnedLauncherApps ನೋಡಿ.</translation>
 <translation id="602728333950205286">ಡಿಫಾಲ್ಟ್ ಹುಡುಕಾಟ ನೀಡುಗರ ಇನ್‌ಸ್ಟೆಂಟ್ URL</translation>
 <translation id="603410445099326293">POST ಬಳಸುವ ಸಲಹೆ URL ಗಾಗಿ ಮಾನದಂಡಗಳು</translation>
 <translation id="6034341625190551415">ಸಾರ್ವಜನಿಕ ಸೆಶನ್ ಮತ್ತು ಕಿಯೋಸ್ಕ್ ಖಾತೆಯ ಪ್ರಕಾರಗಳನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation>
@@ -2972,38 +2893,6 @@
       ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದರೆ, ಅಂತರ್ನಿರ್ಮಿತ DNS ಕ್ಲೈಂಟ್ ಅನ್ನು ಎಂದಿಗೂ ಬಳಸಲಾಗುವುದಿಲ್ಲ.
 
       ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, MacOS, Android ನಲ್ಲಿ (ಖಾಸಗಿ DNS ಅಥವಾ VPN ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿರದಿದ್ದಾಗ) ಮತ್ತು ChromeOS ನಲ್ಲಿ ಅಂತರ್ನಿರ್ಮಿತ DNS ಕ್ಲೈಂಟ್ ಅನ್ನು ಡೀಫಾಲ್ಟ್ ಆಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅಂತರ್ನಿರ್ಮಿತ DNS ಕ್ಲೈಂಟ್ ಅನ್ನು chrome://flags ಎಡಿಟ್ ಮಾಡುವ ಮೂಲಕ ಬಳಸಬಹುದೇ ಅಥವಾ ಕಮಾಂಡ್-ಲೈನ್ ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ ಮೂಲಕ ಬಳಸಬಹುದೇ ಎನ್ನುವುದನ್ನು ಬದಲಾಯಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> ಡಿಫಾಲ್ಟ್ ಪ್ರಿಂಟರ್ ಆಯ್ಕೆಯ ನಿಯಮಗಳನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ.
-
-<ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ಡಿಫಾಲ್ಟ್ ಪ್ರಿಂಟರ್ ಆಯ್ಕೆಮಾಡುವುದಕ್ಕಾಗಿನ ನಿಯಮಗಳನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ನಿರ್ಣಯಿಸುತ್ತದೆ ಮತ್ತು ಇದು ಪ್ರೊಫೈಲ್ ಜೊತೆಗೆ ಮೊದಲ ಬಾರಿಗೆ ಮುದ್ರಣ ಕಾರ್ಯವನ್ನು ಬಳಸಿದಾಗ ನಡೆಯುತ್ತದೆ.
-
-ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದಾಗ, ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಎಲ್ಲಾ ಗುಣಲಕ್ಷಣಗಳಿಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವ ಪ್ರಿಂಟರ್ ಅನ್ನು ಹುಡುಕಲು <ph name="PRODUCT_NAME" /> 
-ಪ್ರಯತ್ನಿಸುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಡಿಫಾಲ್ಟ್ ಪ್ರಿಂಟರ್ ಆಗಿ ಆಯ್ಕೆಮಾಡುತ್ತದೆ. ಕಾರ್ಯನೀತಿಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತದೆಂದು ಕಂಡುಬರುವ ಮೊದಲ ಪ್ರಿಂಟರ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗುತ್ತದೆ, ಅನನ್ಯವಲ್ಲದ ಹೊಂದಾಣಿಕೆಯ ಸಂದರ್ಭದಲ್ಲಿ, ಪ್ರಿಂಟರ್‌ಗಳು ಕಂಡುಬಂದ ಕ್ರಮವನ್ನು ಆಧರಿಸಿ ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಯಾಗುವ ಪ್ರಿಂಟರ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಬಹುದು.
-
-ಒಂದು ವೇಳೆ ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ ಅಥವಾ ಸಮಯ ಮುಗಿಯುವುದರೊಳಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವ ಪ್ರಿಂಟರ್ ಕಂಡುಬರದಿದ್ದರೆ, ಬಿಲ್ಟ್-ಇನ್ PDF ಪ್ರಿಂಟರ್‌ಗೆ ಪ್ರಿಂಟರ್ ಡಿಫಾಲ್ಟ್ ಆಗಿ ಬದಲಾಗುತ್ತದೆ ಅಥವಾ PDF ಪ್ರಿಂಟರ್ ಲಭ್ಯವಿರದೇ ಇರುವಾಗ ಯಾವುದೇ ಪ್ರಿಂಟರ್ ಆಯ್ಕೆಮಾಡಲಾಗುವುದಿಲ್ಲ. 
-
-ಮುಂದಿನ ರೂಪುರೇಷೆಗೆ ಬದ್ಧವಾಗಿಟ್ಟುಕೊಂಡು, ಮೌಲ್ಯವನ್ನು JSON ಆಬ್ಜೆಕ್ಟ್ ಆಗಿ ಪಾರ್ಸ್ ಮಾಡಲಾಗಿದೆ:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "ಹೋಲಿಕೆಯಾಗುವ ಪ್ರಿಂಟರ್‌ನ ಹುಡುಕಾಟವನ್ನು ನಿರ್ದಿಷ್ಟ ಪ್ರಿಂಟರ್‌ಗಳ ಗುಂಪಿಗೆ ಸೀಮಿತಗೊಳಿಸಬೇಕೇ ಅಥವಾ ಬೇಡವೇ.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "ಪ್ರಿಂಟರ್ ಐಡಿಗೆ ಹೋಲಿಕೆಯಾಗಲು ನಿಯಮಿತ ಅಭಿವ್ಯಕ್ತಿ.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "ಪ್ರಿಂಟರ್ ಡಿಸ್‍ಪ್ಲೇ ಹೆಸರಿಗೆ ಹೋಲಿಕೆಯಾಗಲು ನಿಯಮಿತ ಅಭಿವ್ಯಕ್ತಿ.",
-            "type": "string"
-          }
-        }
-      }
-
-<ph name="CLOUD_PRINT_NAME" /> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವ ಪ್ರಿಂಟರ್‌ಗಳನ್ನು <ph name="PRINTER_TYPE_CLOUD" /> ಎಂದು ಪರಿಗಣಿಸಲಾಗಿದೆ, ಉಳಿದ ಪ್ರಿಂಟರ್‌ಗಳನ್ನು <ph name="PRINTER_TYPE_LOCAL" /> ಎಂಬುದಾಗಿ ವರ್ಗೀಕರಿಸಲಾಗಿದೆ.
-ಕ್ಷೇತ್ರವೊಂದನ್ನು ಹೊರತುಪಡಿಸುವುದು ಎಂದರೆ ಎಲ್ಲಾ ಮೌಲ್ಯಗಳು ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತವೆ ಎಂದರ್ಥ, ಉದಾಹರಣೆಗೆ, ಸಂಪರ್ಕತೆಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸದೇ ಇರುವುದರಿಂದ ಪ್ರಿಂಟರ್‌ ಪೂರ್ವವೀಕ್ಷಣೆಯು ಸ್ಥಳೀಯ ಮತ್ತು ಕ್ಲೌಡ್‍ನಂತಹ ಎಲ್ಲಾ ಪ್ರಕಾರಗಳ ಪ್ರಿಂಟರ್‌ಗಳನ್ನು ಶೋಧಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗುತ್ತದೆ.
-ರೆಗ್ಯುಲರ್ ಎಕ್ಸ್‌ಪ್ರೆಶನ್ ಪ್ಯಾಟರ್ನ್‌ಗಳು JavaScript RegExp ಸಿಂಟ್ಯಾಕ್ಸ್ ಅನುಸರಿಸಬೇಕು ಮತ್ತು ಹೊಂದಾಣಿಕೆಗಳು ಕೇಸ್ ಸೆನ್ಸಿಟಿವ್ ಆಗಿರುತ್ತವೆ.</translation>
 <translation id="6843296367238757293">ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ತಡೆಹಿಡಿಯಲಾಗಿದೆ. ಅದನ್ನು ಬಳಸುವುದನ್ನು ನಾವು ಪ್ರೋತ್ಸಾಹಿಸುವುದಿಲ್ಲ. https://support.google.com/chrome/a/answer/7643500 ನಲ್ಲಿ ಹೆಚ್ಚಿನ ವಿವರಗಳನ್ನು ಓದಿ</translation>
 <translation id="684856667300805181">ಈ ಕಾರ್ಯನೀತಿಯನ್ನು <ph name="PRODUCT_NAME" /> 68 ನಲ್ಲಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ ಮತ್ತು <ph name="ARC_GLS_POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯೊಂದಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ.</translation>
 <translation id="6856743875250214792">ಈ ನೀತಿಯನ್ನು ಅಸಮ್ಮತಿಸಲಾಗಿದೆ ಮತ್ತು M66 ನಲ್ಲಿ ತೆಗೆದುಹಾಕಲಾಗಿದೆ, ಏಕೆಂದರೆ ಇದು ಆಂತರಿಕ ಪರೀಕ್ಷೆಗಾಗಿ ಮಾತ್ರ ಬಳಸಲ್ಪಟ್ಟಿದೆ ಮತ್ತು ಇದು ಸುರಕ್ಷತೆಯ ಬಾಧ್ಯಸ್ಥಿಕೆಯಾಗಿದೆ.
@@ -4098,30 +3987,6 @@
       SAML ಬಳಸಿಕೊಂಡು ದೃಢೀಕರಿಸಿದ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ ಈ ನೀತಿಯು ಪರಿಣಾಮ ಬೀರುತ್ತದೆ.
 
       ನೀತಿಯ ಮೌಲ್ಯವನ್ನು ಸೆಕೆಂಡುಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕು.</translation>
-<translation id="9027787254195333560">ಈ ನೀತಿಯು ಲಾಗ್‌ಇನ್‌ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಬಳಕೆದಾರರು ಪ್ರತಿನಿಧಿಸುವ ಅವತಾರ್ ಚಿತ್ರವನ್ನು ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲು ನಿಮಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಡೌನ್‌ಲೋಡ್ ಸಮಗ್ರತೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಬಳಸುವ ಗುಪ್ತ ಲಿಪಿ ಶಾಸ್ತ್ರದ ಹ್ಯಾಶ್ ಮತ್ತು ಅವತಾರ್ ಚಿತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದಾದ <ph name="PRODUCT_OS_NAME" /> ದಿಂದ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ URL ಮೂಲಕ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ. ಚಿತ್ರವು JPEG ಸ್ವರೂಪದಲ್ಲಿರಬೇಕು, ಅದರ ಗಾತ್ರವು 512kB ಮೀರಬಾರದು. URL ಅನ್ನು ಯಾವುದೇ ದೃಢೀಕರಣ ಇಲ್ಲದೆ ಪ್ರವೇಶಿಸುವಂತಿರಬೇಕು. 
-
-      ಅವತಾರ್ ಚಿತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲಾಗಿರುತ್ತದೆ ಮತ್ತು ಸಂಗ್ರಹಿಸಲಾಗಿರುತ್ತದೆ. ಯಾವಾಗಲಾದರೂ URL ಅಥವಾ ಹ್ಯಾಶ್‌ ಬದಲಾವಣೆಯಾದಾಗ ಅದು ಮರು ಡೌನ್‌ಲೋಡ್‌ ಆಗುತ್ತದೆ. 
-
-      ಕೆಳಗಿನ ಸ್ಕೀಮಾಗೆ ದೃಢೀಕರಿಸುವ ಮೂಲಕ URL ವ್ಯಕ್ತಪಡಿಸುವ ಅದರ ಸ್ಟ್ರಿಂಗ್‌ನಂತೆ ನೀತಿಯನ್ನು ಸೂಚಿಸಬೇಕು ಮತ್ತು ಹ್ಯಾಶ್‌ JSON ಸ್ವರೂಪದಲ್ಲಿರಬೇಕು:
- {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "ಅವತಾರ್ ಚಿತ್ರದಿಂದ ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದಾದಂತಹ URL.",
- "type": "string"
-          },
-          "hash": {
-            "description":"ಅವತಾರ್ ಚಿತ್ರದ SHA-256 ಹ್ಯಾಶ್‌.",
-"type": "string"
-          }
-        }
-      }
-
-      ಒಂದು ವೇಳೆ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದರೆ, <ph name="PRODUCT_OS_NAME" /> ಡೌನ್‌ಲೋಡ್‌ ಮಾಡುತ್ತದೆ ಮತ್ತು ಅವತಾರ್ ಚಿತ್ರವನ್ನು ಬಳಸುತ್ತದೆ.
-
-      ಒಂದು ವೇಳೆ ಈ ನೀತಿಯನ್ನು ನೀವು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರು ಅದನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲಾಗುವುದಿಲ್ಲ. 
-
-      ಒಂದು ವೇಳೆ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ,ಲಾಗಿನ್ ಪರದೆಯ ಮೇಲೆ ಅವರನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಅವತಾರ್ ಚಿತ್ರವನ್ನು ಬಳಕೆದಾರರು ಆಯ್ಕೆ ಮಾಡಬಹುದು.</translation>
 <translation id="9035964157729712237">ಕಪ್ಪುಪಟ್ಟಿಯಿಂದ ವಿನಾಯತಿಗೊಳಿಸಬೇಕಾದ ವಿಸ್ತರಣೆ IDಗಳು</translation>
 <translation id="9038058011835642205">ಬಳಕೆದಾರರ ಸಹಯೋಗವಿಲ್ಲದೆ ನಿಶ್ಶಬ್ದವಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗುವ ವೆಬ್‌ಸೈಟ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ಇದು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. ಇವುಗಳನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ಅಥವಾ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
 
@@ -4134,7 +3999,6 @@
     ಈ ನೀತಿಯನ್ನು ನೀವು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರಿಗೆ ಅದನ್ನು ಬದಲಾಯಿಸಲು ಅಥವಾ ಅತಿಕ್ರಮಿಸಲಾಗುವುದಿಲ್ಲ.
 
     ನೀತಿ ಮೌಲ್ಯವನ್ನು ಮಿಲಿಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕು. ಮೌಲ್ಯಗಳನ್ನು 30 ಸೆಕೆಂಡ್‌ಗಳಿಂದ 24 ಗಂಟೆಗಳ ವ್ಯಾಪ್ತಿಗೆ ಹಿಡಿದಿಡಲಾಗಿದೆ.</translation>
-<translation id="9042911395677044526">ಸಾಧನದ ಪ್ರತಿ-ಬಳಕೆದಾರನಿಗೆ ಪುಶಿಂಗ್ ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್‌‌ನನ್ನು <ph name="PRODUCT_OS_NAME" /> ಸಾಧನದ ಪ್ರತಿ-ಬಳಕೆದಾರನಿಗೆ ಅನ್ವಯಿಸುವಂತೆ ಅನುಮತಿಸುತ್ತದೆ. ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್‌‌ <ph name="ONC_SPEC_URL" /> ನಲ್ಲಿ ವ್ಯಾಖ್ಯಾನಿಸಲಾದ ತೆರೆದ ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್ ಸ್ವರೂಪದಿಂದ ವಿವರಿಸಲಾದಂತಹ JSON- ಸ್ವರೂಪದ ಸ್ಟ್ರಿಂಗ್ ಆಗಿದೆ</translation>
 <translation id="9050853837490399534">ಕ್ವಿಕ್ ಫಿಕ್ಸ್ ಬಿಲ್ಡ್ ಪಡೆಯುವ ಸಲುವಾಗಿ ಸಾಧನವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಬೇಕೇ ಅಥವಾ ಬೇಡವೇ ಎಂಬುದನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ನಿಯಂತ್ರಿಸುತ್ತದೆ.
 
       ಕಾರ್ಯನೀತಿಯ ಮೌಲ್ಯವನ್ನು, ಕ್ವಿಕ್ ಫಿಕ್ಸ್ ಬಿಲ್ಡ್‌ಗೆ ಮ್ಯಾಪ್ ಮಾಡುವ ಟೋಕನ್‍ಗೆ ಹೊಂದಿಸಿದರೆ, ಬೇರೊಂದು ಕಾರ್ಯನೀತಿಯು ಅಪ್‍ಡೇಟ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸದ ಸಂದರ್ಭದಲ್ಲಿ, ಸಂಬಂಧಿತ ಕ್ವಿಕ್ ಫಿಕ್ಸ್ ಬಿಲ್ಡ್ ಪಡೆಯುವುದಕ್ಕಾಗಿ ಸಾಧನವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತದೆ.
@@ -4207,17 +4071,6 @@
 ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದರೆ, ಮುದ್ರಣ ಪೂರ್ವವೀಕ್ಷಣೆ ಡೈಲಾಗ್‌ನಲ್ಲಿ 'ಶೀರ್ಷಿಕೆಗಳು ಮತ್ತು ಅಡಿಟಿಪ್ಪಣಿಗಳನ್ನು' ಆಯ್ಕೆ ಮಾಡಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ಬಳಕೆದಾರರು ಅದನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.
 
 ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿದರೆ, ಮುದ್ರಣ ಪೂರ್ವವೀಕ್ಷಣೆ ಡೈಲಾಗ್‌ನಲ್ಲಿ 'ಶೀರ್ಷಿಕೆಗಳು ಮತ್ತು ಅಡಿಟಿಪ್ಪಣಿಗಳು' ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಅದನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
-<translation id="9213347477683611358">ಸಾಧನಕ್ಕೆ ಯಾವುದೇ ಬಳಕೆದಾರರು ಇನ್ನೂ ಸೈನ್‌ ಇನ್ ಮಾಡಿಲ್ಲದಿದ್ದರೆ ಲಾಗಿನ್ ಪರದೆಯಲ್ಲಿ ತೋರಿಸಲಾದ ಸಾಧನ-ಮಟ್ಟದ ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರವನ್ನು ಸಾಧನ ಮಟ್ಟವು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತದೆ. ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರವನ್ನು Chrome OS ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದಾದ URL ಅನ್ನು ಸೂಚಿಸುವುದರ ಮೂಲಕ ಮತ್ತು ಡೌನ್‌ಲೋಡ್‌ನ ಸಮಗ್ರತೆಯನ್ನು ಪರಿಶೀಲಿಸಲು ಬಳಸುವ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಹ್ಯಾಶ್ ಅನ್ನು ಸೂಚಿಸುವುದರ ಮೂಲಕ ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ. ಚಿತ್ರವು JPEG ಸ್ವರೂಪದಲ್ಲಿರಬೇಕು, ಇದರ ಫೈಲ್ ಗಾತ್ರವು 16MB ಮೀರಬಾರದು. ಯಾವುದೇ ದೃಢೀಕರಣವಿಲ್ಲದೇ URL ಪ್ರವೇಶಿಸುವಂತಿರಬೇಕು. ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ, ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ. URL ಅಥವಾ ಹ್ಯಾಶ್ ಬದಲಾವಣೆ ಆದಾಗಲೆಲ್ಲಾ ಇದನ್ನು ಮರು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.
-
-      URL ಮತ್ತು JSON ನಲ್ಲಿ ಹ್ಯಾಶ್ ಸ್ವರೂಪದಲ್ಲಿ ವ್ಯಕ್ತಪಡಿಸುವಂತಹ ಸ್ಟ್ರಿಂಗ್‌ನ ರೂಪದಲ್ಲಿ ನೀತಿಯನ್ನು ಸೂಚಿಸಿರಬೇಕು, ಉದಾ.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      ಸಾಧನ ವಾಲ್‌ಪೇಪರ್ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದ್ದರೆ, ಸಾಧನಕ್ಕೆ ಯಾವುದೇ ಬಳಕೆದಾರರು ಇನ್ನೂ ಸೈನ್‌ ಇನ್ ಮಾಡಿಲ್ಲದಿದ್ದರೆ ಲಾಗಿನ್ ಮಾಡಲಾದ ಪರದೆಯಲ್ಲಿನ ವಾಲ್‌ಪೇಪರ್ ಚಿತ್ರವನ್ನು Chrome OS ಸಾಧನವು ಡೌನ್‌ಲೋಡ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಬಳಸುತ್ತದೆ. ಒಮ್ಮೆ ಬಳಕೆದಾರರು ಲಾಗ್‌ಇನ್ ಮಾಡಿದಾಗ ಬಳಕೆದಾರರ ವಾಲ್‌ಪೇಪರ್ ನೀತಿಯು ಕಾರ್ಯಗತಗೊಳ್ಳುತ್ತದೆ.
-
-      ಸಾಧನದ ವಾಲ್‌ಪೇಪರ್‌ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದಲ್ಲಿ ಅಥವಾ ಬಳಕೆದಾರರ ವಾಲ್‌ಪೇಪರ್‌‌‌‌‌ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದಾಗ ಏನನ್ನೂ ತೋರಿಸಬೇಕು ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸಲು ಬಳಕೆದಾರರ ವಾಲ್‌ಪೇಪರ್‌‌ ನೀತಿ ನಿರ್ಧರಿಸಬೇಕಾಗುತ್ತದೆ.</translation>
 <translation id="9217154963008402249">ನೆಟ್‌ವರ್ಕ್‌ ಪ್ಯಾಕೇಟ್‌ಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಆವರ್ತನೆ</translation>
 <translation id="922540222991413931">ವಿಸ್ತರಣೆ, ಅಪ್ಲಿಕೇಶನ್, ಮತ್ತು ಬಳಕೆದಾರ ಸ್ಕ್ರಿಪ್ಟ್ ಸ್ಥಾಪನೆ ಮೂಲಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation>
 <translation id="924557436754151212">ಮೊದಲ ಚಾಲನೆಯಲ್ಲಿ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್‌ನಿಂದ ಉಳಿಸಿದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಆಮದು ಮಾಡಿ</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index ed68537f..682d188 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -416,7 +416,6 @@
 
       경고: <ph name="PRODUCT_OS_NAME" /> 버전의 컨트롤을 키오스크 앱에 위임하면 기기가 소프트웨어 업데이트나 주요 보안 수정사항을 받지 못하게 될 수 있으므로 권장되지 않습니다. <ph name="PRODUCT_OS_NAME" /> 버전의 컨트롤을 위임하면 사용자가 위험에 처할 수 있습니다.</translation>
 <translation id="1675002386741412210">지원:</translation>
-<translation id="1689963000958717134"><ph name="PRODUCT_OS_NAME" /> 기기에 모든 사용자에게 적용되는 네트워크 구성을 사용하도록 허용합니다. 네트워크 구성은 <ph name="ONC_SPEC_URL" />에서 설명한 개방형 네트워크 구성에서 정의한 대로 JSON 형식의 문자열입니다.</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> 펌웨어 업데이트 기능의 사용 가능 여부 및 동작을 설정합니다.
 
       개별 설정을 JSON 속성으로 지정할 수 있습니다.
@@ -977,16 +976,6 @@
       이 설정을 사용 중지하면 웹 페이지에서 자바스크립트를 사용할 수 없으며, 사용자는 해당 설정을 변경할 수 없습니다.
 
       이 설정을 사용하도록 설정하거나 설정을 지정하지 않는 경우 웹 페이지에서 자바스크립트를 사용할 수 있지만, 사용자는 해당 설정을 변경할 수 있습니다.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" />에 관한 확장 프로그램 관리 설정을 구성합니다.
-
-          이 정책은 기존 확장 프로그램 관련 정책에서 제어하는 설정을 비롯한 여러 설정을 제어합니다. 기존 정책이 함께 설정되어 있는 경우 이 정책이 우선합니다.
-
-          이 정책은 확장 프로그램 ID 또는 업데이트 URL을 구성에 매핑합니다. 확장 프로그램 ID가 있으면 구성이 지정된 확장 프로그램에만 적용됩니다. 특수 ID <ph name="DEFAULT_SCOPE" />에 기본 구성을 설정할 수 있으며, 이는 정책에서 맞춤 구성이 설정되지 않은 모든 확장 프로그램에 적용됩니다. 업데이트 URL이 있으면 구성은 <ph name="LINK_TO_EXTENSION_DOC1" />의 설명과 같이 이 확장 프로그램 매니페스트에 규정된 정확한 업데이트 URL을 포함하는 모든 확장 프로그램에 적용됩니다.
-
-          <ph name="MS_AD_NAME" /> 도메인에 연결되지 않은 Windows 인스턴스의 경우 강제 설치는 Chrome 웹 스토어에 등록된 앱과 확장 프로그램으로 제한됩니다.
-
-          이 정책에서 가능한 설정과 구조에 관한 전체 설명은 다음 페이지를 참조하세요. https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">WebRTC가 사용하는 로컬 UDP 포트 범위 제한</translation>
 <translation id="2757054304033424106">설치가 허용된 확장 프로그램/앱 유형</translation>
 <translation id="2758084448533744848">기기에서 강제로 사용될 시간대를 지정합니다. 이 정책이 설정되어 있으면 기기의 사용자가 지정된 시간대를 재정의할 수 없습니다. 잘못된 값을 입력하는 경우 정책이 계속 활성화되는 대신 'GMT'를 사용합니다. 빈 문자열을 입력하는 경우 정책은 무시됩니다.
@@ -1759,30 +1748,6 @@
       이 정책은 SAML을 사용하여 인증하는 사용자에게만 영향을 미칩니다.</translation>
 <translation id="4105989332710272578">일부 URL 목록에는 인증서 투명성 시행 사용 중지</translation>
 <translation id="4121350739760194865">앱 프로모션이 새 탭 페이지에 표시되지 않도록 합니다.</translation>
-<translation id="4125606414556046117">이 정책을 사용하면 사용자의 데스크톱 및 로그인 화면 배경에 표시되는 배경화면 이미지를 설정할 수 있습니다. <ph name="PRODUCT_OS_NAME" />에서 배경화면 이미지를 다운로드하고 다운로드한 항목의 무결성을 확인하는 데 사용되는 암호화 해시를 지정하여 정책을 설정할 수 있습니다. 이미지는 JPEG 형식이어야 하며 파일 크기는 16MB를 초과하지 않아야 합니다. URL은 인증 없이 액세스할 수 있어야 합니다.
-
-      배경화면 이미지는 다운로드 및 캐시되며 URL이나 해시가 변경될 때마다 다시 다운로드됩니다.
-
-      이 정책은 URL 및 해시를 JSON 형식으로 표현하는 문자열로 지정되어야 하며 다음 스키마를 따라야 합니다.
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "배경화면 이미지를 다운로드할 수 있는 URL입니다.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "배경화면 이미지의 SHA-256 해시입니다.",
-            "type": "string"
-          }
-        }
-      }
-
-      이 정책을 설정하면 <ph name="PRODUCT_OS_NAME" />에서 배경화면 이미지를 다운로드하여 사용합니다.
-
-      이 정책을 설정하면 사용자는 변경하거나 덮어쓸 수 없습니다.
-
-      이 정책을 설정하지 않으면 사용자가 데스크톱 및 로그인 화면 배경에 표시되는 이미지를 선택할 수 있습니다.</translation>
 <translation id="412697421478384751">사용자가 잠금 화면 PIN으로 보안 강도가 약한 PIN을 사용할 수 있게 허용</translation>
 <translation id="4138655880188755661">시간 제한</translation>
 <translation id="4144164749344898721">이 정책은 사용자가 유휴 상태가 될 때 전원 관리 전략을 위한 여러 설정을 관리합니다.
@@ -2742,53 +2707,6 @@
 
       이 정책을 설정하지 않거나 false로 설정하면 인쇄 명령 시 인쇄 미리보기 화면이 열립니다.</translation>
 <translation id="6022948604095165524">시작 시 동작</translation>
-<translation id="6023030044732320798">ARC 런타임에 전달될 정책 모음을 지정합니다. 유효한 JSON 값이어야 합니다..
-
-      이 정책을 사용하여 기기에 자동 설치될 Android 앱을 설정할 수 있습니다.
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android app identifier, e.g. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "앱의 설치 방법을 지정합니다. OPTIONAL: 앱이 자동으로 설치되지 않으며 사용자가 앱을 설치할 수 있습니다. 이 값은 이 정책이 지정되지 않은 경우의 기본값입니다. PRELOAD: 앱이 자동으로 설치되지만 사용자가 앱을 제거할 수 있습니다. FORCE_INSTALLED: 앱이 자동으로 설치되며 사용자가 제거할 수 없습니다. BLOCKED: 앱이 차단되며 설치할 수 없습니다. 이전 정책하에서 설치된 앱은 제거됩니다.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "앱에 대한 권한 요청을 허가하는 정책입니다. PERMISSION_POLICY_UNSPECIFIED: 정책이 지정되지 않았습니다. 어떤 수준에서도 권한과 관련된 정책이 지정되지 않은 경우, 'PROMPT' 동작이 기본값으로 사용됩니다. PROMPT: 사용자에게 권한을 허가하라는 메시지를 표시합니다. GRANT: 자동으로 권한을 허가합니다. DENY: 자동으로 권한을 거부합니다.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "키-값 쌍이 있는 앱별 JSON 설정 객체입니다. 예: '"managedConfiguration": { "key1": value1, "key2": value2 }'. 키는 앱 매니페스트에 정의되어 있습니다.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      런처에 앱을 고정하려면 PinnedLauncherApps를 참조하세요.</translation>
 <translation id="602728333950205286">기본 검색 공급자 순간 검색 URL</translation>
 <translation id="603410445099326293">POST를 사용하는 추천 URL용 매개변수</translation>
 <translation id="6034341625190551415">공개 세션 및 키오스크 계정 유형을 제어합니다.</translation>
@@ -3142,36 +3060,6 @@
       이 정책이 false로 설정되면 내장 DNS를 사용하지 않습니다.
 
       이 정책이 설정되지 않으면 MacOS, Android(비공개 DNS 또는 VPN이 사용 설정되지 않은 경우), ChromeOS에서 내장 DNS 클라이언트가 기본으로 사용 설정되며, 사용자는 chrome://flags를 수정하거나 명령줄 플래그를 사용하여 내장 DNS 클라이언트 사용 여부를 변경할 수 있습니다.</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> 기본 프린터 선택 규칙을 재정의합니다.
-
-      이 정책은 <ph name="PRODUCT_NAME" />에서 기본 프린터를 선택하는 규칙을 결정하며, 프로필을 통해 인쇄 기능을 처음 사용할 때 적용됩니다.
-
-      정책을 설정하면 <ph name="PRODUCT_NAME" />이(가) 지정된 속성과 모두 일치하는 프린터를 찾으려고 시도하며, 찾은 프린터를 기본 프린터로 선택합니다. 정책과 일치하는 프린터 중 첫 번째로 발견된 프린터가 선택되며, 일치하는 프린터가 여러 대인 경우 발견된 순서에 따라 일치하는 프린터 중 어떤 것이든 선택될 수 있습니다.
-      정책이 설정되어 있지 않거나 제한시간 안에 일치하는 프린터를 찾지 못한 경우, 내장 PDF 프린터가 기본으로 설정되며, PDF 프린터를 사용할 수 없는 경우 프린터가 선택되지 않습니다.
-
-      값은 다음 스키마에 따라 JSON 객체로 파싱됩니다.
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "일치하는 프린터 검색을 특정 프린터 집합으로 제한할지 여부",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "일치하는 프린터 ID를 찾기 위한 정규 표현식",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "일치하는 프린터 표시 이름을 찾기 위한 정규 표현식",
-            "type": "string"
-          }
-        }
-      }
-
-      <ph name="CLOUD_PRINT_NAME" />에 연결된 프린터는 <ph name="PRINTER_TYPE_CLOUD" />(으)로, 나머지 프린터는 <ph name="PRINTER_TYPE_LOCAL" />(으)로 분류됩니다.
-      필드가 생략된 경우 모든 값이 가능하다는 의미입니다. 예를 들어, 연결을 지정하지 않으면 인쇄 미리보기에서 로컬과 클라우드 등 모든 종류의 프린터를 검색합니다.
-      정규 표현식 패턴은 자바스크립트 RegExp 구문을 따라야 하며, 검색은 대소문자를 구분합니다.</translation>
 <translation id="6843296367238757293">지원 중단된 정책입니다. 사용하지 마시기 바랍니다. https://support.google.com/chrome/a/answer/7643500에서 자세히 알아보세요.</translation>
 <translation id="684856667300805181">이 정책은 <ph name="PRODUCT_NAME" /> 68에서 삭제되었으며 <ph name="ARC_GLS_POLICY_NAME" />(으)로 교체되었습니다.</translation>
 <translation id="6856743875250214792">이 정책은 내부 테스트용으로만 사용되었으며 보안 문제를 일으킬 수 있기 때문에 M66에서 지원 중단되고 삭제됩니다.
@@ -4346,30 +4234,6 @@
       이 정책은 SAML을 사용하여 인증한 사용자에게만 적용됩니다.
 
       이 정책의 값은 초 단위로 지정해야 합니다.</translation>
-<translation id="9027787254195333560">이 정책은 사용자가 로그인 화면에서 자신을 표현하는 아바타 이미지를 설정할 수 있도록 해 줍니다. 정책은 <ph name="PRODUCT_OS_NAME" />에서 아바타 이미지 및 다운로드의 무결성을 확인하는 데 사용되는 암호화 해시를 다운로드할 수 있는 URL을 지정함으로써 설정됩니다. 이미지는 JPEG 형식이어야 하며, 크기는 512KB를 초과하지 않아야 합니다. URL은 인증 없이 액세스할 수 있어야 합니다.
-
-      아바타 이미지는 다운로드 및 저장되며 URL이나 해시가 변경될 때마다 다시 다운로드됩니다.
-
-      이 정책은 URL 및 해시를 JSON 형식으로 표현하는 문자열로 지정되어야 하며 다음 스키마를 따라야 합니다.
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "아바타 이미지를 다운로드할 수 있는 URL",
-            "type": "string"
-          },
-          "hash": {
-            "description": "아바타 이미지의 SHA-256 해시",
-            "type": "string"
-          }
-        }
-      }
-
-      이 정책이 설정되면 <ph name="PRODUCT_OS_NAME" />에서 아바타 이미지를 다운로드하여 사용합니다.
-
-      이 정책을 설정하면 사용자는 변경하거나 덮어쓸 수 없습니다.
-
-      정책을 설정하지 않는 경우, 사용자가 로그인 화면에서 자신을 표현하는 아바타 이미지를 선택할 수 있습니다.</translation>
 <translation id="9035964157729712237">차단목록에서 제외할 확장 프로그램 ID</translation>
 <translation id="9038058011835642205">사용자가 개입하지 않아도 자동 설치되며 사용자가 제거하거나 사용 중지할 수 없는 웹사이트의 목록을 지정합니다.
 
@@ -4382,7 +4246,6 @@
       이 정책을 설정하면 사용자는 변경하거나 덮어쓸 수 없습니다.
 
       이 정책 값은 밀리초로 지정되어야 하며 값은 30초에서 24시간 범위로 잘립니다.</translation>
-<translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> 기기에 사용자별로 적용되는 네트워크 구성을 사용하도록 허용합니다. 네트워크 구성은 <ph name="ONC_SPEC_URL" />에서 설명한 개방형 네트워크 구성에서 정의한 대로 JSON 형식의 문자열입니다. </translation>
 <translation id="9050853837490399534">이 정책은 기기가 빠른 픽스 빌드로 업데이트되어야 하는지 여부를 제어합니다.
 
       정책 값이 빠른 픽스 빌드로 매핑되는 토큰으로 설정된 경우 업데이트가 다른 정책에 의해 차단되지 않으면 기기가 빠른 픽스 빌드로 업데이트됩니다.
@@ -4462,17 +4325,6 @@
       정책이 False로 설정되어 있으면 인쇄 미리보기 대화상자에 '머리글 및 바닥글'이 선택되지 않으며 사용자는 이를 변경할 수 없습니다.
 
       정책이 True로 설정되어 있으면 인쇄 미리보기 대화상자에 '머리글과 바닥글'이 선택되어 있으며 사용자가 이를 변경할 수 없습니다.</translation>
-<translation id="9213347477683611358">기기에 로그인한 사용자가 없을 때 로그인 화면에 표시되는 기기 수준의 배경화면 이미지를 설정합니다. 이 정책은 Chrome OS 기기에서 배경화면 이미지를 다운로드할 URL과 다운로드의 무결성을 확인하는 데 사용되는 암호화 해시를 지정하여 설정할 수 있습니다. 이미지는 JPEG 형식이어야 하며 파일 크기는 16MB를 넘지 않아야 합니다. URL은 어떠한 인증도 없이 액세스할 수 있어야 합니다. 배경화면 이미지는 다운로드 및 캐시됩니다. URL이나 해시가 변경될 때마다 배경화면 이미지도 다시 다운로드됩니다.
-
-      이 정책은 JSON 형식으로 URL과 해시를 표현하는 문자열로 지정되어야 합니다. 예:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      기기 배경화면 정책이 설정되면 Chrome OS 기기는 기기에 로그인한 사용자가 없을 때 배경화면 이미지를 다운로드하여 로그인 화면에 사용합니다. 사용자가 로그인하면 사용자의 배경화면 정책이 사용됩니다.
-
-      기기 배경화면 정책이 설정되지 않았으며 사용자의 배경화면 정책이 설정된 경우, 사용자의 배경화면 정책에 따라 표시되는 배경화면이 결정됩니다.</translation>
 <translation id="9217154963008402249">네트워크 패킷 모니터링 빈도</translation>
 <translation id="922540222991413931">확장 프로그램, 앱, 사용자 스크립트 설치 소스 등 설정</translation>
 <translation id="924557436754151212">처음 실행 시 기본 브라우저에서 저장된 비밀번호 가져오기</translation>
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb
index dbb7a8ed..ae698138 100644
--- a/components/policy/resources/policy_templates_lt.xtb
+++ b/components/policy/resources/policy_templates_lt.xtb
@@ -417,7 +417,6 @@
 
       Įspėjimas: nerekomenduojama viešojo terminalo programai perduoti leidimo valdyti „<ph name="PRODUCT_OS_NAME" />“ versiją, nes ji gali neleisti įrenginiui gauti naujinių ir svarbių saugos pataisų. Perdavus leidimą valdyti „<ph name="PRODUCT_OS_NAME" />“ versiją gali kilti grėsmė naudotojų saugai.</translation>
 <translation id="1675002386741412210">Palaikoma naudojant:</translation>
-<translation id="1689963000958717134">Leidžiama naudoti tinklo konfigūraciją, kad būtų taikoma visiems „<ph name="PRODUCT_OS_NAME" />“ įrenginio naudotojams. Tinklo konfigūracija yra JSON suformatuota eilutė, kaip nurodyta atvirojo tinklo konfigūracijos formato, aprašyto šiuo adresu: <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Konfigūruojamas <ph name="TPM_FIRMWARE_UPDATE_TPM" /> aparatinės programinės įrangos atnaujinimo funkcijų pasiekiamumas ir elgsena.
 
       Atskirus nustatymus galima nurodyti JSON nuosavybėse.
@@ -978,16 +977,6 @@
       Jei šis nustatymas išjungtas, tinklalapiuose nebus galima naudoti „JavaScript“ ir naudotojas negalės pakeisti to nustatymo.
 
       Jei šis nustatymas įgalintas ar nenustatytas, tinklalapiuose bus galima naudoti „JavaScript“, bet naudotojas galės pakeisti tą nustatymą.</translation>
-<translation id="2747157663401642394">Konfigūruojami „<ph name="PRODUCT_NAME" />“ plėtinių valdymo nustatymai.
-
-          Pagal šią politiką valdomi keli nustatymai, įskaitant nustatymus, valdomus pagal bet kokią esamą su plėtiniais susijusią politiką. Ši politika pakeis bet kokią pasenusią politiką, jei abi yra nustatytos.
-
-          Ši politika susieja plėtinio ID ar naujinio URL su konfigūracija. Naudojant plėtinio ID, konfigūracija bus taikoma tik nurodytam plėtiniui. Galima nustatyti specialaus ID <ph name="DEFAULT_SCOPE" /> numatytąją konfigūraciją, taikomą visiems plėtiniams, kurių tinkinta konfigūracija nenustatyta šioje politikoje. Naudojant naujinio URL, konfigūracija bus taikoma visiems plėtiniams su tiksliu naujinio URL, pateiktu šio plėtinio apraše, kaip nurodyta <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          „Windows“ objektų, kurie neprijungti prie „<ph name="MS_AD_NAME" />“ domeno, priverstinis diegimas ribojamas naudojant plėtinius, nurodytus „Chrome“ internetinėje parduotuvėje
-
-          Jei norite peržiūrėti visą galimų šios politikos nustatymų ir struktūros aprašą, apsilankykite adresu https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">„WebRTC“ naudojamų vietinių UDP prievadų diapazono apribojimas</translation>
 <translation id="2757054304033424106">Leidžiami įdiegti plėtinių / programų tipai</translation>
 <translation id="2758084448533744848">Nurodoma įrenginyje naudotina taikoma laiko juosta. Kai ši politika nustatyta, įrenginio naudotojai negali nepaisyti nurodytos laiko juostos. Jei pateikta netinkama vertė, politika vis tiek suaktyvinama naudojant GMT. Jei paliekama tuščia eilutė, politikos nepaisoma.
@@ -1757,30 +1746,6 @@
       Ši politika daro įtaką tik naudotojams, kurie autentifikuojami naudojant SAML.</translation>
 <translation id="4105989332710272578">Sertifikato skaidrumo taikymo URL sąrašui išjungimas</translation>
 <translation id="4121350739760194865">Neleisti rodyti programų reklamų naujo skirtuko puslapyje</translation>
-<translation id="4125606414556046117">Pagal šią politiką leidžiama konfigūruoti ekrano fono vaizdą, kuris rodomas naudotojo darbalaukyje ir prisijungimo ekrano fone. Politika nustatoma nurodant URL, iš kurio „<ph name="PRODUCT_OS_NAME" />“ gali atsisiųsti ekrano fono vaizdą ir kriptografinę maišą, naudojamą atsisiuntimo vientisumui patikrinti. Vaizdas turi būti JPEG formato, ne didesnis nei 16 MB. URL turi būti galima pasiekti nenustačius tapatybės.
-
-      Ekrano fono vaizdas atsisiunčiamas ir saugomas talpykloje. Jis bus pakartotinai atsisiųstas pakeitus URL ar maišą.
-
-      Politika turi būti nurodyta kaip eilutė, išreiškianti URL ir maišą JSON formatu, atitinkanti nurodytą schemą:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL adresas, kuriuo galima atsisiųsti ekrano fono vaizdą.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Ekrano fono vaizdo SHA-256 maiša.",
-            "type": "string"
-          }
-        }
-      }
-
-      Nustačius šią politiką, „<ph name="PRODUCT_OS_NAME" />“ atsisiųs ir naudos ekrano fono vaizdą.
-
-      Jei nustatysite šią politiką, naudotojai negalės jos pakeisti ar nepaisyti.
-
-      Nenustačius politikos, naudotojas gali pasirinkti darbalaukyje ir prisijungimo ekrano fone rodytiną vaizdą.</translation>
 <translation id="412697421478384751">Leisti naudotojams nustatyti nesudėtingus užrakinimo ekrano PIN kodus</translation>
 <translation id="4138655880188755661">Laiko apribojimas</translation>
 <translation id="4144164749344898721">Ši politika valdo kelis maitinimo valdymo strategijos, kai naudotojas tampa neaktyvus, nustatymus.
@@ -2742,53 +2707,6 @@
 
       Jei ši politika nenustatyta arba deaktyvinta, įvykdžius spausdinimo komandą atveriamas spaudinio peržiūros ekranas.</translation>
 <translation id="6022948604095165524">Veiksmai paleidžiant</translation>
-<translation id="6023030044732320798">Nurodomos politikos nuostatos, kurios bus perduotos vykdant ARC. Vertė turi būti galiojantis JSON.
-
-      Ši politika gali būti naudojama norint sukonfigūruoti, kurios „Android“ programos yra automatiškai įdiegiamos įrenginyje:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "„Android“ programos identifikatorius, pvz., "com.google.android.gm" skirtas „Gmail“",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Nurodoma, kaip įdiegta programa. OPTIONAL: programa neįdiegta automatiškai, bet ją gali įdiegti naudotojas. Tai yra numatytasis nustatymas, jei ši politika nėra nurodoma. PRELOAD: programa įdiegta automatiškai, bet naudotojas gali ją pašalinti. FORCE_INSTALLED: programa įdiegta automatiškai, ir naudotojas negali jos pašalinti. BLOCKED: programa yra užblokuota ir negali būti įdiegta. Jei programa buvo įdiegta galiojant ankstesnei politikai, ji bus pašalinta.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Leidimo suteikimo programoms užklausų politika. PERMISSION_POLICY_UNSPECIFIED: politika nenurodyta. Jei nenurodyta jokia leidimo politika jokiu lygmeniu, pagal numatytuosius nustatymus naudojama PROMPT elgsena. PROMPT: paraginti naudotoją suteikti leidimą. GRANT: automatiškai suteikti leidimą. DENY: automatiškai atmesti leidimą.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Konkrečios programos JSON konfigūracijos objektas su rakto reikšmių porų rinkiniu, pvz., "managedConfiguration": { "key1": value1, "key2": value2 }. Raktai nurodyti programos apraše.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Jei norite prisegti programas prie paleidimo priemonės, žr. „PinnedLauncherApps“.</translation>
 <translation id="602728333950205286">Numatytojo paieškos teikėjo intuityviosios paieškos URL</translation>
 <translation id="603410445099326293">Pasiūlymų URL parametrai, kuriuose naudojama POST</translation>
 <translation id="6034341625190551415">Valdoma viešoji sesija ir viešojo terminalo sąskaitų tipai.</translation>
@@ -3142,36 +3060,6 @@
       Jei ši politika nustatyta kaip „Netiesa“, integruota DNS kliento programa niekada nebus naudojama.
 
       Jei ši politika nenustatyta, pagal numatytuosius nustatymus bus įgalinta integruota DNS kliento programa „Mac“ OS, „Android“ (kai neįgalintas nei privatus DNS, nei VPN) ir „Chrome“ OS ir naudotojai galės pakeisti, ar integruota DNS kliento programa naudojama, redaguodami chrome://flags arba nurodydami komandų eilutės žymą.</translation>
-<translation id="6838056959556423778">Nepaisoma „<ph name="PRODUCT_NAME" />“ numatytojo spausdintuvo pasirinkimo taisyklių.
-
-      Pagal šią politiką nustatomos numatytojo spausdintuvo pasirinkimo „<ph name="PRODUCT_NAME" />“ taisyklės. Spausdintuvas pasirenkamas pirmą kartą profilyje naudojant spausdinimo funkciją.
-
-      Kai ši politika nustatyta, „<ph name="PRODUCT_NAME" />“ bandys rasti visus nurodytus atributus atitinkantį spausdintuvą ir pasirinks jį kaip numatytąjį spausdintuvą. Pasirenkamas pirmas politiką atitikęs spausdintuvas. Jei atitiktis nėra unikali, gali būti pasirinktas bet koks spausdintuvas, atsižvelgiant į spausdintuvų aptikimo eilės tvarką.
-
-      Jei ši politika nenustatyta arba per skirtą laiką nerandamas atitinkantis spausdintuvas, kaip numatytasis spausdintuvas pasirenkamas įtaisytasis PDF spausdintuvas arba nepasirenkamas joks spausdintuvas, jei PDF spausdintuvas nepasiekiamas.
-
-      Vertė analizuojama kaip JSON objektas, atitinkantis toliau nurodytą schemą:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Whether to limit the search of the matching printer to a specific set of printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regular expression to match printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regular expression to match printer display name.",
-            "type": "string"
-          }
-        }
-      }
-      Prie „<ph name="CLOUD_PRINT_NAME" />“ prijungti spausdintuvai laikomi „<ph name="PRINTER_TYPE_CLOUD" />“, o kiti spausdintuvai priskiriami kategorijai „<ph name="PRINTER_TYPE_LOCAL" />“.
-      Jei laukas praleidžiamas, tai reiškia, kad atitiko visos vertės. Pvz., nenurodžius ryšio spausdinimo peržiūra inicijuos visų tipų spausdintuvų (vietinių ir iš debesies) aptikimą.
-      Reguliariųjų reiškinių šablonai turi atitikti „JavaScript“ reguliariųjų reiškinių sintaksę. Atitiktyse skiriamos didžiosios ir mažosios raidės.</translation>
 <translation id="6843296367238757293">Ši politika nebenaudojama. Jos naudojimas nutrauktas. Daugiau informacijos adresu https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Ši politika pašalinta „<ph name="PRODUCT_NAME" />“ 68 ir pakeista „<ph name="ARC_GLS_POLICY_NAME" />“.</translation>
 <translation id="6856743875250214792">Ši politika nebenaudojama ir yra pašalinta iš M66, nes ji buvo naudojama tik vidinio testavimo tikslais ir tai yra saugos atsakomybė.
@@ -4344,30 +4232,6 @@
       Ši politika turi įtakos tik naudotojams, kurie autentifikuoti naudojant SAML.
 
       Politikos vertė turėtų būti nustatyta per kelias sekundes.</translation>
-<translation id="9027787254195333560">Ši politika suteikia galimybę konfigūruoti prisijungimo ekrane rodomą naudotojo pseudoportreto vaizdą. Politiką reikia nustatyti nurodant URL, iš kurio „<ph name="PRODUCT_OS_NAME" />“ gali atsisiųsti pseudoportreto vaizdą, ir kriptografinę maišos vertę, kuri naudojama atsisiuntimo vientisumui patvirtinti. Vaizdas turi būti JPEG formato, o dydis neturi viršyti 512 KB. URL turi būti galima pasiekti nenustačius tapatybės.
-
-      Pseudoportreto vaizdas atsisiunčiamas ir įkeliamas į talpyklą. Jis bus pakartotinai atsisiųstas pakeitus URL ar maišą.
-
-      Politika turi būti nurodyta kaip eilutė, išreiškianti URL ir maišą JSON formatu, atitinkanti nurodytą schemą:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL, iš kurio galima atsisiųsti pseudoportreto vaizdą.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Pseudoportreto vaizdo SHA-256 maišos vertė.",
-            "type": "string"
-          }
-        }
-      }
-
-      Jei ši politika nustatyta, „<ph name="PRODUCT_OS_NAME" />“ atsisiųs ir naudos pseudoportreto vaizdą.
-
-      Jei nustatysite šią politiką, naudotojai negalės jos pakeisti ar nepaisyti.
-
-      Jei politika nenustatyta, naudotojas gali pasirinkti pseudoportreto vaizdą, rodomą prisijungimo ekrane.</translation>
 <translation id="9035964157729712237">Į juodąjį sąrašą neįtrauktinų plėtinių ID</translation>
 <translation id="9038058011835642205">Nurodomas sąrašas programų, kurios įdiegiamos automatiškai, naudotojui neatliekant jokių veiksmų, ir kurių naudotojas negali pašalinti arba išjungti.
 
@@ -4380,7 +4244,6 @@
       Jei nustatysite šią politiką, naudotojai negalės jos pakeisti ar nepaisyti.
 
       Politikos vertė turi būti nurodyta milisekundėmis. Vertės gali būti nuo 30 sekundžių iki 24 valandų.</translation>
-<translation id="9042911395677044526">Leidžiama pateikti tinklo konfigūraciją, kad būtų taikoma „<ph name="PRODUCT_OS_NAME" />“ įrenginiui pagal naudotoją. Tinklo konfigūracija yra JSON formatuota eilutė, apibrėžta pagal „Atvirosios tinklo konfigūracijos“ formatą, nurodytą šiuo adresu: <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Naudojant šią politiką nurodoma, ar įrenginys turi būti atnaujintas į „Quick Fix Build“.
 
       Jei politikos reikšmė yra prieigos raktas, susiejantis su „Quick Fix Build“, įrenginys bus atnaujintas į atitinkamą „Quick Fix Build“, jei naujinio neblokuos kita politika.
@@ -4460,17 +4323,6 @@
       Jei politika nustatyta kaip „Netiesa“, parinktis „Antraštės ir poraštės“ nepasirenkama spaudinio peržiūros dialogo lange ir naudotojas negali to pakeisti.
 
       Jei politika nustatyta kaip „Tiesa“, parinktis „Antraštės ir poraštės“ pasirenkama spaudinio peržiūros dialogo lange ir naudotojas negali to pakeisti.</translation>
-<translation id="9213347477683611358">Konfigūruokite įrenginio lygio ekrano fono vaizdą, kuris rodomas prisijungimo ekrane, jei prie įrenginio neprisijungė joks naudotojas. Politika nustatoma nurodant URL, kuriuo „Chrome“ OS įrenginys gali atsisiųsti ekrano fono vaizdą ir kriptografinę maišos vertę, kuri naudojama atsisiuntimo vientisumui patvirtinti. Vaizdas turi būti JPEG formato, o dydis neturi viršyti 16 MB. URL turi būti pasiekiamas be autentifikavimo. Ekrano fono vaizdas atsisiunčiamas ir įkeliamas į talpyklą. Jis bus iš naujo atsisiųstas pasikeitus URL arba maišos vertei.
-
-      Politika turėtų būti nurodyta kaip eilutė, kurioje pateikiamas URL ir maišos vertė JSON formatu, pvz.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Jei nustatyta įrenginio politika, „Chrome“ OS įrenginys atsisiųs ir naudos ekrano fono vaizdą prisijungimo ekrane, jei joks naudotojas neprisijungė prie įrenginio. Kai naudotojas prisijungs, įsigalios naudotojo ekrano fono politika.
-
-      Jei įrenginio ekrano fono politika nenustatyta, naudotojo ekrano fono politika, jei nustatyta, lemia, kas bus rodoma.</translation>
 <translation id="9217154963008402249">Tinklo paketų stebėjimo dažnis</translation>
 <translation id="922540222991413931">Konfigūruokite plėtinio, programos ir naudotojo scenarijaus įdiegimo šaltinius.</translation>
 <translation id="924557436754151212">Importuoti išsaugotus slaptažodžius iš numatytosios naršyklės paleidžiant pirmą kartą</translation>
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index bcc4531..cada14a6 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -405,7 +405,6 @@
 
       Brīdinājums: nav ieteicams piešķirt kioska lietotnei <ph name="PRODUCT_OS_NAME" /> versijas kontroli, jo ierīcē var netikt saņemti programmatūras atjauninājumi un kritiski drošības labojumi. <ph name="PRODUCT_OS_NAME" /> versijas kontroles deleģēšana var apdraudēt lietotājus.</translation>
 <translation id="1675002386741412210">Saderīga ar:</translation>
-<translation id="1689963000958717134">Ļauj pārsūtīšanas tīkla konfigurāciju izmantot visiem ierīces <ph name="PRODUCT_OS_NAME" /> lietotājiem. Tīkla konfigurācija ir JSON formatēta virkne, kā tas definēts šeit aprakstītajā atvērtā tīkla konfigurācijas formātā: <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="1704516734140344991">Tiek konfigurēta <ph name="TPM_FIRMWARE_UPDATE_TPM" /> programmaparatūras atjauninājuma funkcionalitātes pieejamība un darbība.
 
       Atsevišķus iestatījumus var norādīt JSON rekvizītos.
@@ -967,16 +966,6 @@
       Ja šis iestatījums ir atspējots, tīmekļa lapās nevar lietot valodu JavaScript un lietotājs nevar mainīt šo iestatījumu.
 
       Ja šis iestatījums ir iespējots vai nav iestatīts, tīmekļa lapās var lietot valodu JavaScript, taču lietotājs var mainīt šo iestatījumu.</translation>
-<translation id="2747157663401642394">Šī politika tiek izmantota, lai konfigurētu <ph name="PRODUCT_NAME" /> paplašinājumu pārvaldības iestatījumus.
-
-          Ar šo politiku tiek regulēti vairāki iestatījumi, tostarp iestatījumi, kas tiek regulēti esošajās ar paplašinājumiem saistītajās politikās. Ja šī politika ir iestatīta, ar to tiek ignorētas jebkādas iestatītās mantotās politikas.
-
-          Izmantojot šo politiku, paplašinājuma ID vai atjauninājuma vietrādis URL tiek kartēts tā konfigurācijā. Izmantojot paplašinājuma ID, konfigurācija tiek piemērota tikai konkrētajam paplašinājumam. Īpašajam ID “<ph name="DEFAULT_SCOPE" />” var iestatīt noklusējuma konfigurāciju, kas tiks lietota visiem paplašinājumiem, kuriem šajā politikā nav iestatīta pielāgota konfigurācija. Izmantojot atjauninājuma vietrādi URL, konfigurācija tiek lietota visiem paplašinājumiem, kuru manifestā ir norādīts konkrētais atjauninājuma vietrādis URL (kā aprakstīts šeit: <ph name="LINK_TO_EXTENSION_DOC1" />).
-
-          Windows datoros, kas nav pievienoti <ph name="MS_AD_NAME" /> domēnam, piespiedu instalēšana attiecas tikai uz lietotnēm un paplašinājumiem, kas norādīti Chrome interneta veikalā.
-
-          Pilnu iespējamo iestatījumu un šīs politikas struktūras aprakstu skatiet tīmekļa vietnē https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">WebRTC izmantoto lokālo UDP portu diapazona ierobežošana</translation>
 <translation id="2757054304033424106">Paplašinājumu/lietotņu veidi, kurus var instalēt</translation>
 <translation id="2758084448533744848">Norāda noteikto laika joslu, kas jāizmanto ierīcē. Ja šī politika ir iestatīta, ierīces lietotāji nevar ignorēt norādīto laika joslu. Ja ir norādīta nederīga vērība, politika joprojām ir aktivizēta, izmantojot vērtību “GMT”. Ja ir norādīta tukša virkne, politika tiek ignorēta.
@@ -1743,30 +1732,6 @@
       Šī politika attiecas tikai uz tiem lietotājiem, kuri autentifikācijai izmanto SAML.</translation>
 <translation id="4105989332710272578">Atspējot Certificate Transparency piemērošanu norādītajiem vietrāžiem URL</translation>
 <translation id="4121350739760194865">Novērst lietotņu reklāmu rādīšanu Jaunas cilnes lapā.</translation>
-<translation id="4125606414556046117">Izmantojot šo politiku, varat konfigurēt fona tapetes attēlu, kas tiek rādīts darbvirsmā un lietotāja pieteikšanās ekrāna fonā. Politika tiek iestatīta, norādot URL, no kura <ph name="PRODUCT_OS_NAME" /> var lejupielādēt fona tapetes attēlu un kriptogrāfisku jaucējkodu, kas tiek izmantots lejupielādes integritātes pārbaudei. Attēlam ir jābūt JPEG formātā, un tā lielums nedrīkst pārsniegt 16 MB. URL ir jābūt pieejamam bez autentifikācijas.
-
-      Fona tapetes attēls tiek lejupielādēts un saglabāts kešatmiņā. Tas tiks lejupielādēts atkārtoti, kad mainīsies URL vai jaucējkods.
-
-      Politika ir jānorāda kā virkne, kas attēlo URL un jaucējkodu JSON formātā atbilstoši tālāk minētajai shēmai.
-      {
-        “tips”: objekts,
-        “īpašības”: {
-          “url”: {
-            “apraksts”: “URL, no kura var lejupielādēt fona tapetes attēlu”,
-            “tips”: “virkne”
-          },
-          “jaucējkods”: {
-            “apraksts”: “Fona tapetes attēla SHA-256 jaucējkods.”,
-            “tips”: “virkne”
-          }
-        }
-      }
-
-      Ja šī politika ir iestatīta, <ph name="PRODUCT_OS_NAME" /> lejupielādēs un izmantos fona tapetes attēlu.
-
-      Ja iestatīsiet šo politiku, lietotāji to nevarēs mainīt vai ignorēt.
-
-      Ja šī politika netiek iestatīta, lietotājs var izvēlēties attēlu, kas tiek rādīts darbvirsmā un pieteikšanās ekrāna fonā.</translation>
 <translation id="412697421478384751">Atļauja lietotājiem iestatīt nedrošus ekrāna bloķēšanas PIN</translation>
 <translation id="4138655880188755661">Laika ierobežojums</translation>
 <translation id="4144164749344898721">Šī politika kontrolē vairākus barošanas pārvaldības iestatījumus neaktivitātes gadījumā.
@@ -2730,53 +2695,6 @@
 
       Ja šī politikas nav iestatīta vai ir izvēlēta vērtība Aplams, drukāšanas komanda aktivizēs drukas priekšskatījuma ekrānu.</translation>
 <translation id="6022948604095165524">Darbība startēšanas brīdī</translation>
-<translation id="6023030044732320798">Norāda politiku kopu, kura tiks pārsūtīta ARC izpildlaikam. Vērtībai jābūt derīgai JSON vērtībai.
-
-      Šo politiku var izmantot, lai konfigurētu, kuras Android lietotnes tiek automātiski instalētas ierīcē:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android lietotņu identifikators, piemēram, "com.google.android.gm" pakalpojumam Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Norāda, kā lietotne tiek instalēta. OPTIONAL: lietotne netiek instalēta automātiski, taču lietotājs var to instalēt. Šis ir noklusējuma iestatījums, ja šī politika nav norādīta. PRELOAD: lietotne tiek instalēta automātiski, taču lietotājs var to atinstalēt. FORCE_INSTALLED: lietotne tiek instalēta automātiski, un lietotājs nevar to atinstalēt. BLOCKED: lietotne ir bloķēta, un to nevar instalēt. Ja lietotne tika instalēta saskaņā ar iepriekšēju politiku, tā tiks atinstalēta.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Politika atļauju pieprasījumu piešķiršanai lietotnēm. PERMISSION_POLICY_UNSPECIFIED: politika nav norādīta. Ja atļaujai nevienā līmenī nav norādīta neviena politika, pēc noklusējuma tiek izmantots iestatījums PROMPT. PROMPT: prasīt lietotājam piešķirt atļauju. GRANT: automātiski piešķirt atļauju. DENY: automātiski noraidīt atļauju.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Konkrētas lietotnes JSON konfigurācijas objekti ar atslēgas/vērtības pāru kopu, piemēram, '"managedConfiguration": { "key1": value1, "key2": value2 }'. Atslēgas ir norādītas lietotnes manifestā.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Lai piespraustu lietotnes palaišanas programmai, skatiet politiku PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Noklusējuma meklētājprogrammas dinamisko mekl. rezultātu URL</translation>
 <translation id="603410445099326293">Parametri ieteikumu meklēšanas vietrādim URL, kurā izmantota metode POST</translation>
 <translation id="6034341625190551415">Kontrolē publiskās sesijas un kioska kontu veidus.</translation>
@@ -3113,37 +3031,6 @@
       Ja šai politikai ir iestatīta vērtība “false”, iebūvētais DNS klients nekad netiek izmantots.
 
       Ja šī politika nav iestatīta, iebūvētais DNS klients tiek iespējots pēc noklusējuma sistēmā Mac OS, Android (kad nav iespējots privātais DNS vai VPN) un Chrome OS, un lietotāji var mainīt iebūvētā DNS klienta izmantošanas iestatījumu, veicot izmaiņas lapā chrome://flags vai norādot komandrindiņas karodziņu.</translation>
-<translation id="6838056959556423778">Tiek ignorētas <ph name="PRODUCT_NAME" /> noklusējuma printera atlasīšanas kārtulas.
-
-      Šī politika nosaka kārtulas, kas paredzētas noklusējuma printera atlasīšanai pārlūkā <ph name="PRODUCT_NAME" />, pirmo reizi profilā izmantojot drukāšanas funkciju.
-
-      Ja šī politika ir iestatīta, <ph name="PRODUCT_NAME" /> mēģinās atrast printeri, kurš atbilst visiem norādītajiem atribūtiem, un atlasīt to kā noklusējuma printeri. Tiek atlasīts pirmais printeris, kurš atbilst politikai. Ja nav unikālas atbilstības, var tikt atlasīts jebkurš printeris atkarībā no tā, kādā secībā printeri tiek atrasti.
-
-      Ja šī politika nav iestatīta vai noildzes laikā nav atrasts atbilstošs printeris, kā noklusējuma vērtība tiek atlasīts iebūvētais PDF printeris. Ja PDF printeris nav pieejams, netiek atlasīts neviens printeris.
-
-      Vērtība tiek parsēta kā JSON objekts atbilstoši šai shēmai::
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Vai ierobežot atbilstoša printera meklēšanu konkrētu printeru kopā.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regulārā izteiksme, kurai ir jāatbilst printera ID.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regulārā izteiksme, kurai ir jāatbilst printera rādāmajam nosaukumam.",
-            "type": "string"
-          }
-        }
-      }
-
-      Pakalpojumam <ph name="CLOUD_PRINT_NAME" /> pievienotie printeri tiek uzskatīti par “<ph name="PRINTER_TYPE_CLOUD" />”, pārējie printeri tiek klasificēti kā “<ph name="PRINTER_TYPE_LOCAL" />”.
-      Neaizpildot lauku, tam atbilst visas vērtības, piemēram, nenorādot savienojamību, drukas priekšskatījumā tiek uzsākta visu veidu printeru atklāšana — gan vietējo, gan mākoņa.
-      Regulārās izteiksmes shēmām ir jāatbilst JavaScript RegExp sintaksei, un atbilstības ir reģistrjutīgas.</translation>
 <translation id="6843296367238757293">Šī politika ir novecojusi. Nav ieteicams to lietot. Uzziniet vairāk šeit: https://support.google.com/chrome/a/answer/7643500.</translation>
 <translation id="684856667300805181">Šī politika tika noņemta <ph name="PRODUCT_NAME" /> 68 versijā, un to aizstāj politika <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Ar atjauninājumu M66 šai politikai tika pārtraukts atbalsts un tā tika noņemta, jo tā tika izmantota tikai iekšējai testēšanai un apdraud drošību.
@@ -4302,30 +4189,6 @@
       Šī politika attiecas tikai uz lietotājiem, kuri tika autentificēti, izmantojot SAML.
 
       Politikas vērtība ir jānorāda sekundēs.</translation>
-<translation id="9027787254195333560">Šī politika ļauj konfigurēt lietotāja iemiesojuma attēlu, kas tiek rādīts pieteikšanās ekrānā. Politika tiek iestatīta, norādot URL, no kura <ph name="PRODUCT_OS_NAME" /> var lejupielādēt iemiesojuma attēlu un šifrēšanas jaukšanu, kas tiek izmantota, lai apstiprinātu lejupielādes integritāti. Attēlam ir jābūt JPEG formātā, un tā lielums nedrīkst pārsniegt 512 KB. URL ir jābūt pieejamam bez autentifikācijas.
-
-      Iemiesojuma attēls ir lejupielādēts un saglabāts kešatmiņā. Tas tiks lejupielādēts atkārtoti, kad mainīsies URL vai jaucējkods.
-
-      Politika ir jānorāda kā virkne, kas attēlo URL un jaucējkodu JSON formātā atbilstoši tālāk minētajai shēmai.
-      {
-        “tips”: objekts,
-        “īpašības”: {
-          “url”: {
-            “apraksts”: “URL, no kura var lejupielādēt iemiesojuma attēlu”,
-            “tips”: “virkne”
-          },
-          “jaucējkods”: {
-            “apraksts”: “Iemiesojuma attēla SHA-256 jaucējkods.”,
-            “tips”: “virkne”
-          }
-        }
-      }
-
-      Ja šī politika ir iestatīta, <ph name="PRODUCT_OS_NAME" /> lejupielādēs un izmantos iemiesojuma attēlu.
-
-      Ja iestatīsiet šo politiku, lietotāji to nevarēs mainīt vai ignorēt.
-
-      Ja šī politika netiek iestatīta, lietotājs varēs izvēlēties savu iemiesojuma attēlu, ko rādīt pieteikšanās ekrānā.</translation>
 <translation id="9035964157729712237">Paplašinājumu ID numuri, kas noņemami no melnā saraksta</translation>
 <translation id="9038058011835642205">Norāda sarakstu ar vietnēm, kuras tiek instalētas neuzraudzīti (bez lietotāja iejaukšanās) un kuras lietotājs nevar atinstalēt vai atspējot.
 
@@ -4338,8 +4201,6 @@
       Ja iestatīsiet šo politiku, lietotāji to nevarēs mainīt vai ignorēt.
 
       Politikas vērtība ir jānorāda milisekundēs. Vērtība ir jānorāda diapazonā no 30 sekundēm līdz 24 stundām.</translation>
-<translation id="9042911395677044526">Ļauj pārsūtīšanas tīkla konfigurāciju izmantot konkrētam lietotājam <ph name="PRODUCT_OS_NAME" /> ierīcē. Tīkla konfigurācija ir JSON formatēta virkne, kā 
-definēts Atvērta tīkla konfigurācijas formātā, kas aprakstīts šeit: <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Šī politika kontrolē to, vai ierīci var atjaunināt, izmantojot ātrā risinājuma būvējumu.
 
       Ja kā politikas vērtība ir iestatīts marķieris, kas novirza uz ātrā risinājuma būvējumu, ierīce tiks atjaunināta, izmantojot attiecīgo ātrā risinājuma būvējumu; izņēmums ir gadījumi, kad atjaunināšanu bloķē cita politika.
@@ -4419,17 +4280,6 @@
       Ja politika ir iestatīta kā “false”, galvenes un kājenes netiek atlasītas drukāšanas priekšskatījuma dialoglodziņā un lietotājs to nevar mainīt.
 
       Ja politika ir iestatīta kā “true”, galvenes un kājenes tiek atlasītas drukāšanas priekšskatījuma dialoglodziņā un lietotājs nevar to mainīt.</translation>
-<translation id="9213347477683611358">Konfigurējiet ierīces līmeņa fona tapetes attēlu, kas tiek rādīts pieteikšanās ekrānā, ja ierīcē vēl nav pierakstījies neviens lietotājs. Politika tiek iestatīta, norādot URL, no kura Chrome OS ierīce var lejupielādēt fona tapetes attēlu, un kriptogrāfisku jaucējkodu, kas tiek izmantots lejupielādes integritātes pārbaudei. Attēlam jābūt JPEG formātā, tā lielums nedrīkst pārsniegt 16 MB. Lai piekļūtu vietrādim URL, nedrīkst pieprasīt autentificēšanos. Fona tapetes attēls tiek lejupielādēts un saglabāts kešatmiņā. Tas tiks atkārtoti lejupielādēts, kad tiks mainīts URL vai jaucējkods.
-
-      Politika ir jānorāda kā virkne, kurā ietverts URL un jaucējkods JSON formātā, piemēram,
-      {
-        "url": "https://example.com/ierices_fona_tapete.jpg",
-        "hash": "fonatapetesjaucejkodapiemers"
-      }
-
-      Ja ierīces fona tapetes politika būs iestatīta un neviens lietotājs vēl nebūs pierakstījies ierīcē, Chrome OS ierīce lejupielādēs un pieteikšanās ekrānā izmantos fona tapetes attēlu. Tiklīdz kāds lietotājs pieteiksies, tiks aktivizēta lietotāja fona tapetes politika.
-
-      Ja ierīces fona tapetes politika nebūs iestatīta, taču lietotāja fona tapetes politika būs iestatīta, lietotāja fona tapetes politika noteiks, kas tiks rādīts.</translation>
 <translation id="9217154963008402249">Pārraudzības tīkla pakešu biežums</translation>
 <translation id="922540222991413931">Konfigurē paplašinājumu, lietotņu un lietotāja skriptu instalēšanas avotus</translation>
 <translation id="924557436754151212">Saglabāto paroļu importēšana no noklusējuma pārlūka pirmajā palaišanas reizē</translation>
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 0ec24014..b461ac5 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -51,13 +51,13 @@
 <translation id="1049138910114524876"><ph name="PRODUCT_OS_NAME" /> സൈൻ ഇൻ സ്‌ക്രീനിൽ നൽകിയിട്ടുള്ള ഭാഷ കോൺഫിഗർ ചെയ്യുന്നു.
 
       ഈ നയം സജ്ജമാക്കിയിരിക്കുന്നെങ്കിൽ, ഈ നയത്തിന്റെ ആദ്യത്തെ മൂല്യം നൽകിയിട്ടുള്ള ഭാഷയിൽ എല്ലായ്‌പ്പോഴും സൈൻ ഇൻ സ്‌ക്രീൻ പ്രദർശിപ്പിക്കും (തുടർന്നുള്ള അനുയോജ്യതയ്‌ക്കായി നയത്തെ ഒരു ലിസ്‌റ്റായി നിർവ്വചിച്ചിരിക്കുന്നു).  ഈ നയം സജ്ജമാക്കാതിരിക്കുകയോ ശൂന്യമായ ലിസ്‌റ്റിലേക്ക് സജ്ജമാക്കുകയോ ആണെങ്കിൽ, അവസാന ഉപയോക്തൃ സെഷനിന്റെ ഭാഷയിൽ സൈൻ ഇൻ സ്‌ക്രീൻ പ്രദർശിപ്പിക്കും.  തെറ്റായ ഭാഷാ മൂല്യത്തിലേക്കാണ് ഈ നയം സജ്ജമാക്കിയിരിക്കുന്നതെങ്കിൽ, സൈൻ ഇൻ സ്‌ക്രീനിനെ ഒരു ഫാൾബാക്ക് ഭാഷയിൽ പ്രദർശിപ്പിക്കും (നിലവിൽ, en-US-ൽ).</translation>
-<translation id="1052499923181221200">SamlInSessionPasswordChangeEnabled ശരി അല്ലെങ്കിൽ ഈ നയം ബാധകമാകില്ല.
+<translation id="1052499923181221200">SamlInSessionPasswordChangeEnabled ശരി എന്ന് സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ ഈ നയം ബാധകമാകില്ല.
       ആ നയം ശരിയും, ഒപ്പം ഈ നയം (ഉദാഹരണത്തിന്) 14 എന്ന് സജ്ജീകരിക്കുകയും ചെയ്‌താൽ, SAML ഉപയോക്താക്കളുടെ പാസ്‌വേഡ് ഒരു നിശ്‌ചിത തീയതിയിൽ കാലഹരണപ്പെടാൻ പോകുകയാണെന്ന് 14 ദിവസം മുമ്പ് അവർക്ക് അറിയിപ്പ് ലഭിക്കുമെന്നാണ് ഇതിലൂടെ അർത്ഥമാക്കുന്നത്.
       തുടർന്ന് ഒരു ഇൻ സെഷൻ പാസ്‌വേഡ് മാറ്റത്തിലൂടെയും പാസ്‌വേഡ് കാലഹരണപ്പെടുന്നതിന് മുമ്പ് അത് അപ്‌ഡേറ്റ് ചെയ്‌തും അവർക്ക് ഈ പ്രശ്‌നം ഉടൻ കൈകാര്യം ചെയ്യാനാകും.
-      എന്നാൽ SAML ലോഗിൻ ഫ്ലോയ്‌ക്കിടയിൽ SAML ഐഡന്റിറ്റി പ്രൊവൈഡർ പാസ്‌വേഡ് കാലഹരണപ്പെടൽ അറിയിപ്പ് ഉപകരണത്തിലേക്ക് അയച്ചിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ അറിയിപ്പുകൾ കാണിക്കൂ.
-      ഈ നയം ശൂന്യമെന്ന് സജ്ജീകരിക്കുന്നതിന് അർത്ഥം ഉപയോക്താക്കൾക്ക് മുൻകൂട്ടി അറിയിപ്പ് ലഭിക്കില്ല എന്നാണ് - പാസ്‌വേഡ് കാലഹരണപ്പെട്ട് കഴിഞ്ഞതിന് ശേഷമേ അവർക്ക് അറിയിപ്പ് ലഭിക്കുകയുള്ളൂ.
+      എന്നാൽ SAML ലോഗിൻ ഫ്ലോയ്‌ക്കിടയിൽ SAML ഐഡൻ്റിറ്റി പ്രൊവൈഡർ പാസ്‌വേഡ് കാലഹരണപ്പെടൽ അറിയിപ്പ് ഉപകരണത്തിലേക്ക് അയച്ചിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ അറിയിപ്പുകൾ കാണിക്കൂ.
+      ഉപയോക്താക്കൾക്ക് മുൻകൂട്ടി അറിയിപ്പ് ലഭിക്കില്ല എന്നാണ് ഈ നയം ശൂന്യമെന്ന് സജ്ജീകരിക്കുന്നതിന് അർത്ഥം - പാസ്‌വേഡ് കാലഹരണപ്പെട്ട് കഴിഞ്ഞതിന് ശേഷമേ അവർക്ക് അറിയിപ്പ് ലഭിക്കുകയുള്ളൂ.
 
-      ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താവിന് അത് മാറ്റാനോ റദ്ദാക്കാനോ കഴിയില്ല.</translation>
+      ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ ഉപയോക്താവിന് അത് മാറ്റാനോ റദ്ദാക്കാനോ കഴിയില്ല.</translation>
 <translation id="1062011392452772310">ഉപകരണത്തിനായി റിമോട്ട് അറ്റസ്റ്റേഷൻ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1062407476771304334">മാറ്റിസ്ഥാപിക്കുക</translation>
 <translation id="1079801999187584280">ഡെവലപ്പര്‍ ടൂളുകളുടെ ഉപയോഗം അനുവദിക്കാതിരിക്കുക</translation>
@@ -134,7 +134,7 @@
 
           ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചാൽ, ഡോക്ക് ചെയ്‌ത മാഗ്നിഫയർ എപ്പോഴും പ്രവർത്തനക്ഷമമായിരിക്കും.
 
-          ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചാൽ, ഡോക്ക് ചെയ്‌ത മാഗ്നിഫയർ എപ്പോഴും പ്രവർത്തനരഹിതമായിരിക്കും.
+          ഈ നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചാൽ, ഡോക്ക് ചെയ്‌ത മാഗ്നിഫയർ എപ്പോഴും പ്രവർത്തനരഹിതമായിരിക്കും.
 
           ഈ നയം സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല.
 
@@ -308,15 +308,15 @@
 <translation id="1502843533062797703">മൂന്നാം കക്ഷി സോഫ്‌റ്റ്‌വെയർ ഇഞ്ചെക്ഷൻ ബ്ലോക്കിംഗ് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1504431521196476721">വിദൂര അറ്റസ്‌റ്റേഷൻ</translation>
 <translation id="1507382822467487898">
-          ഉപകരണത്തിലേക്ക് ഡോക്ക് കണക്‌റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ ഏത് MAC (മീഡിയ ആക്‌സസ് നിയന്ത്രണം) വിലാസമാണ് ഉപയോഗിക്കുന്നതെന്ന് വ്യക്തമാക്കുന്നു.
+          ഉപകരണത്തിലേക്ക് ഡോക്ക് കണക്റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ ഏത് MAC (മീഡിയ ആക്‌സസ് നിയന്ത്രണം) വിലാസമാണ് ഉപയോഗിക്കുന്നതെന്ന് വ്യക്തമാക്കുന്നു.
 
-          ചില ഉപകരണ മോഡലുകളിലേക്ക് ഒരു ഡോക്ക് കണക്‌റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ, ഇതർ‌നെറ്റിൽ ഡിഫോൾട്ടായി ഉപകരണത്തെ തിരിച്ചറിയാൻ ഉപകരണത്തിത്തിന്റെ നിയുക്ത ഡോക്ക് MAC വിലാസം ഉപയോഗിക്കുന്നു. ഡോക്ക് ചെയ്‌തിരിക്കുമ്പോൾ MAC വിലാസത്തിന്റെ ഉറവിടം മാറ്റാൻ ഈ നയം അഡ്‌മിനെ അനുവദിക്കുന്നു.
+          ചില ഉപകരണ മോഡലുകളിലേക്ക് ഒരു ഡോക്ക് കണക്‌റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ, ഇതർ‌നെറ്റിൽ ഡിഫോൾട്ടായി ഉപകരണത്തെ തിരിച്ചറിയാൻ ഉപകരണത്തിത്തിന്റെ നിയുക്ത ഡോക്ക് MAC വിലാസം ഉപയോഗിക്കുന്നു. ഡോക്ക് ചെയ്‌തിരിക്കുമ്പോൾ MAC വിലാസത്തിൻ്റെ ഉറവിടം മാറ്റാൻ ഈ നയം അഡ്‌മിനെ അനുവദിക്കുന്നു.
 
           'DeviceDockMacAddress' തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിലോ നയം സജ്ജീകരിക്കാതെ വിട്ടാലോ ഉപകരണത്തിന്റെ നിയുക്ത ഡോക്ക് MAC വിലാസം ഉപയോഗിക്കും.
 
           'DeviceNicMacAddress' തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ, ഉപകരണത്തിന്റെ NIC (നെറ്റ്‌വർക്ക് ഇന്റർഫേസ് കൺട്രോളർ) MAC വിലാസം ഉപയോഗിക്കും.
 
-          'DockNicMacAddress' തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ, ഡോക്കിന്റെ NIC MAC വിലാസം ഉപയോഗിക്കും.
+          'DockNicMacAddress' തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ ഡോക്കിൻ്റെ NIC MAC വിലാസം ഉപയോഗിക്കും.
 
           ഈ ക്രമീകരണം ഉപയോക്താവിന് മാറ്റാനാവില്ല.</translation>
 <translation id="1507957856411744193">ഈ നയം 'ട്രൂ' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, RFC1918/RFC4193 സ്വകാര്യ വിലാസങ്ങളിലെ മാത്രമല്ല, എല്ലാ IP വിലാസങ്ങളിലെ Cast ഉപകരണങ്ങളിലേക്കും <ph name="PRODUCT_NAME" /> കണക്‌റ്റ് ചെയ്യും.
@@ -390,7 +390,6 @@
 
       ശ്രദ്ധിക്കുക: സോഫ്‌റ്റ്‌വെയർ അപ്‌ഡേറ്റുകളും നിർണ്ണായകമായ സുരക്ഷാ പരിഹാരങ്ങളും സ്വീകരിക്കുന്നതിൽ നിന്ന് ഉപകരണത്തെ തടയാനിടയുള്ളതിനാൽ <ph name="PRODUCT_OS_NAME" /> പതിപ്പിന്റെ നിയന്ത്രണം കിയോസ്‌ക് ആപ്പിന് നൽകാൻ ശുപാർശ ചെയ്യുന്നില്ല. <ph name="PRODUCT_OS_NAME" /> പതിപ്പിന്റെ നിയന്ത്രണം നൽകുന്നത് ഉപയോക്താക്കളെ അപകടത്തിലാക്കിയേക്കാം.</translation>
 <translation id="1675002386741412210">ഇനി പറയുന്നതില്‍ പിന്തുണയ്ക്കുന്നു:</translation>
-<translation id="1689963000958717134">ഒരു <ph name="PRODUCT_OS_NAME" /> ഉപകരണത്തിലെ എല്ലാ ഉപയോക്താക്കൾക്കും ബാധകമാക്കുന്നതിന് നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷനെ പ്രേരിപ്പിക്കുന്നതിന് അനുവദിക്കുന്നു. <ph name="ONC_SPEC_URL" /> എന്നതിൽ വിവരിച്ചിരിക്കുന്ന ഓപ്പൺ നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ ഫോർമാറ്റ് നിർവചിച്ചിരിക്കുന്നത് പോലെ JSON-ഫോർമാറ്റുള്ള സ്‌ട്രിംഗാണ് നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> ഫേംവെയർ അപ്‌ഡേറ്റ് ചെയ്യൽ സവിശേഷതയുടെ പ്രവർത്തനരീതിയും ലഭ്യതയും കോൺഫിഗർ ചെയ്യുന്നു.
 
       വ്യക്തിഗത ക്രമീകരണം JSON പ്രോപ്പർട്ടികളിൽ വ്യക്തമാക്കാം:
@@ -749,13 +748,13 @@
 <translation id="2303795211377219696">ക്രെഡിറ്റ് കാർഡുകൾക്ക് സ്വയമേവ പൂരിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="2309390639296060546">ഡിഫോൾട്ട് ജിയോലൊക്കേഷന്‍ ക്രമീകരണം</translation>
 <translation id="2327252517317514801">G Suite ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കപ്പെട്ട ഡൊമെയ്‌നുകൾ നിർവ്വചിക്കുക</translation>
-<translation id="2356878440219553005">ബാറ്ററി ചാർജ് മോഡ് പവർ മാനേജ്‌മെന്റ് നയം വ്യക്തമാക്കുന്നു.
+<translation id="2356878440219553005">ബാറ്ററി ചാർജ് മോഡ് പവർ മാനേജ്‌മെൻ്റ് നയം വ്യക്തമാക്കുന്നു.
 
           ചാർജിംഗ് രീതിയിലെ അപാകതകൾ കൊണ്ടുള്ള സമ്മർദ്ദത്തിൽ ബാറ്ററി കേടാകാതിരിക്കാനും അതിന്‍റെ ആയുസ് വർദ്ധിപ്പിക്കാനും ബാറ്ററി ചാർജിംഗ് കാര്യക്ഷമമായി നിയന്ത്രിക്കുക.
 
-          ഇഷ്‌ടാനുസൃത ബാറ്ററി ചാർജ് മോഡ് തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ, DeviceBatteryChargeCustomStartCharging, DeviceBatteryChargeCustomStopCharging എന്നിവ വ്യക്തമാക്കണം.
+          ഇഷ്‌ടാനുസൃത ബാറ്ററി ചാർജ് മോഡ് തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ DeviceBatteryChargeCustomStartCharging, DeviceBatteryChargeCustomStopCharging എന്നിവ വ്യക്തമാക്കണം.
 
-          ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപകരണത്തിൽ പിന്തുണയ്‌ക്കുമെങ്കിൽ ബാറ്ററി ചാർജ് മോഡ് ബാധകമാകും.
+          ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ ഉപകരണത്തിൽ പിന്തുണയ്‌ക്കുമെങ്കിൽ ബാറ്ററി ചാർജ് മോഡ് ബാധകമാകും.
 
           ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയും നയം ഉപകരണത്തിൽ പിന്തുണയ്‌ക്കുകയും ചെയ്‌താൽ അടിസ്ഥാന ബാറ്ററി ചാർജ് മോഡ് ബാധകമാകും, ഉപയോക്താവിന് അത് മാറ്റാനുമാവില്ല.
 
@@ -949,16 +948,6 @@
       ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയാൽ, വെബ് പേജുകൾക്ക് JavaScript ഉപയോഗിക്കാൻ കഴിയില്ല, ഒപ്പം ഉപയോക്താക്കൾക്ക് ആ ക്രമീകരണം മാറ്റാനുമാകില്ല.
 
       ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുകയോ സജ്ജീകരിക്കാത്ത നിലയിലോ ആണെങ്കിൽ, വെബ്‌പേജുകൾക്ക് JavaScript ഉപയോഗിക്കാനാകുമെങ്കിലും ഉപയോക്താക്കൾക്ക് ഈ ക്രമീകരണം മാറ്റാൻ കഴിയും.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> എന്നതിൻ്റെ വിപുലീകരണ മാനേജ്‌മെൻ്റ് ക്രമീകരണം കോൺഫിഗർ ചെയ്യുന്നു.
-
-          നിലവിലുള്ള വിപുലീകരണവുമായി ബന്ധപ്പെട്ട ഏതെങ്കിലും നയങ്ങൾ ഉൾപ്പെടെയുള്ള ഒന്നിലധികം ക്രമീകരണങ്ങൾ ഈ നയം നിയന്ത്രിക്കുന്നു. രണ്ടും സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ ഈ നയം ഏത് ലെഗസി നയങ്ങളെയും അസാധുവാക്കും.
-
-          ഈ നയം അതിൻ്റെ കോൺഫിഗറേഷനിലേക്ക് ഒരു വിപുലീകരണ ഐഡി അല്ലെങ്കിൽ അപ്‌ഡേറ്റ് URL മാപ്പ് ചെയ്യുന്നു. വിപുലീകരണ ഐഡി ഉപയോഗിക്കുമ്പോൾ നിർദ്ദിഷ്ട വിപുലീകരണത്തിന് മാത്രമേ കോൺഫിഗറേഷൻ ബാധകമാകൂ. പ്രത്യേക ഐഡിയായ <ph name="DEFAULT_SCOPE" />-ന് ഡിഫോൾട്ട് കോൺഫിഗറേഷൻ സജ്ജീകരിക്കാനാവും, അത് ഈ നയത്തിൽ ഇഷ്‌ടാനുസൃത കോൺഫിഗറേഷൻ സജ്ജീകരിച്ചിട്ടില്ലാത്ത എല്ലാ വിപുലീകരണങ്ങൾക്കും ബാധകമാകും. <ph name="LINK_TO_EXTENSION_DOC1" /> എന്നതിൽ വിവരിച്ചിരിക്കുന്നത് പ്രകാരം, അപ്‌ഡേറ്റ് ചെയ്‌ത URL ഉപയോഗിച്ച്, ഈ വിപുലീകരണത്തിലെ മാനിഫെസ്‌റ്റിൽ പ്രതിപാദിച്ചിരിക്കുന്ന കൃത്യമായ അപ്‌ഡേ‌റ്റ് URL ഉള്ള എല്ലാ വിപുലീകരണങ്ങളിലും കോൺഫിഗറേഷൻ പ്രയോഗിക്കും.
-
-          <ph name="MS_AD_NAME" /> ഡൊമെയ്‌നിൽ ചേർന്നിട്ടില്ലാത്ത Windows ഇൻസ്‌റ്റൻസുകൾക്ക്, Chrome വെബ്‌സ്‌റ്റോറിൽ ലിസ്‌റ്റ് ചെയ്‌തിട്ടുള്ള ആപ്പുകൾക്കും വിപുലീകരണങ്ങൾക്കും നിർബന്ധിത ഇൻസ്‌റ്റലേഷൻ പരിമിതമാക്കിയിരിക്കുന്നു.
-
-          സാധ്യമായ ക്രമീകരണത്തിൻ്റെയും ഈ നയത്തിൻ്റെ ഘടനയുടെയും പൂർണ്ണ വിവരണത്തിന് https://www.chromium.org/administrators/policy-list-3/extension-settings-full സന്ദർശിക്കുക
-          </translation>
 <translation id="2753637905605932878">WebRTC ഉപയോഗിക്കുന്ന ലോക്കൽ UDP പോർട്ടുകളുടെ ശ്രേണി നിയന്ത്രിതമാക്കുക</translation>
 <translation id="2757054304033424106">ഇൻസ്റ്റാൾ ചെയ്യാൻ അനുവദിച്ച വിപുലീകരണ/അപ്ലിക്കേഷൻ തരങ്ങൾ</translation>
 <translation id="2758084448533744848">ഉപകരണത്തിനായി ഉപയോഗിക്കാനുള്ള നിർബന്ധിത സമയമേഖല വ്യക്തമാക്കുന്നു. ഈ നയം സജ്ജീകരിച്ചിരിക്കുന്ന സമയത്ത്, ഉപകരണത്തിലെ ഉപയോക്താക്കൾക്ക് പ്രസ്‌തുത സമയമേഖല അസാധുവാക്കാനാവില്ല. അസാധുവായ ഒരു മൂല്യം നൽകിക്കഴിഞ്ഞാൽ, നയം അതിന് പകരമായി "GMT" തന്നെ സജീവമാക്കും. ശൂന്യമായ ഒരു സ്‌ട്രിംഗ് നൽകിക്കഴിഞ്ഞാൽ, നയം ഒഴിവാക്കപ്പെടും.
@@ -1061,7 +1050,7 @@
       നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുന്നുവെങ്കിലോ ഒരു മൂല്യം സജ്ജമാക്കുന്നില്ലെങ്കിലോ, ഡിഫോൾട്ട് ലക്ഷ്യസ്ഥാന തിരഞ്ഞെടുപ്പായി അച്ചടി പ്രിവ്യൂ ഉപയോഗിക്കുക ഏറ്റവും സമീപകാലത്ത് ഉപയോഗിച്ച പ്രിന്ററാണ്.
 
       നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുന്നുവെങ്കിൽ, ഡിഫോൾട്ട് ലക്ഷ്യസ്ഥാന തിരഞ്ഞെടുപ്പായി അച്ചടി പ്രിവ്യൂ ഉപയോഗിക്കുക OS സിസ്റ്റം ഡിഫോൾട്ട് പ്രിന്ററാണ്.</translation>
-<translation id="285627849510728211">വിപുലമായ ബാറ്ററി ചാർജ് മോഡ് ദിന കോൺഫിഗറേഷൻ സജ്ജീകരിക്കുക</translation>
+<translation id="285627849510728211">വിപുലമായ ബാറ്ററി ചാർജ് മോഡ് ദിന കോൺഫിഗറേഷൻ സജ്ജീകരിക്കുക.</translation>
 <translation id="2856674246949497058">OS പതിപ്പ് ടാർഗറ്റിനെക്കാൾ പുതിയതാണെങ്കിൽ ടാർഗറ്റ് പതിപ്പിലേക്ക് തിരികെ പോയി അതിൽ തുടരുക. പ്രോസസിന്റെ സമയത്ത് powerwash ചെയ്യുക.</translation>
 <translation id="2872961005593481000">അടയ്ക്കുക</translation>
 <translation id="2873651257716068683">ഡിഫോൾട്ട് പ്രിന്റിംഗ് പേജ് വലുപ്പം അസാധുവാക്കുന്നു. പേജ് വലുപ്പം ലഭ്യമല്ലെങ്കിൽ ഈ നയം അവഗണിക്കപ്പെടും.</translation>
@@ -1205,7 +1194,7 @@
 
       നിങ്ങൾ ഈ നയം 'Wipe' ആയി സജ്ജീകരിച്ചാൽ, സൈൻ ഇൻ ചെയ്യുമ്പോൾ ecryptfs-encrypted ഹോം ഡയറക്‌റ്ററികൾ ഇല്ലാതാക്കപ്പെടുകയും പകരം പുതിയ ext4-encrypted ഡയറക്‌റ്ററികൾ സൃഷ്‌ടിക്കപ്പെടുകയും ചെയ്യും. മുന്നറിയിപ്പ്: ഇത് ഉപയോക്താവിൻ്റെ ലോക്കൽ ഡാറ്റ നീക്കം ചെയ്യും.
 
-      നിങ്ങൾ ഈ നയം 'MinimalMigrate' എന്നതിലേക്ക് സജ്ജീകരിച്ചാൽ, സൈൻ ഇൻ ചെയ്യുമ്പോൾ ecryptfs-encrypted ഹോം ഡയറക്‌റ്ററികൾ ഇല്ലാതാക്കപ്പെടുകയും പകരം പുതിയ ext4-encrypted ഡയറക്‌റ്ററികൾ സൃഷ്‌ടിക്കപ്പെടുകയും ചെയ്യും. എന്നിരുന്നാലും ലോഗിൻ ടോക്കണുകൾ സംരക്ഷിക്കുന്നതിനാൽ ഉപയോക്താവിന് വീണ്ടും സൈൻ ഇൻ ചെയ്യേണ്ടിവരില്ല. മുന്നറിയിപ്പ്: ഇത് ഉപയോക്താവിൻ്റെ ലോക്കൽ ഡാറ്റ നീക്കം ചെയ്യും.
+      നിങ്ങൾ ഈ നയം 'MinimalMigrate' ആയി സജ്ജീകരിച്ചാൽ, സൈൻ ഇൻ ചെയ്യുമ്പോൾ ecryptfs-encrypted ഹോം ഡയറക്‌റ്ററികൾ ഇല്ലാതാക്കപ്പെടുകയും പകരം പുതിയ ext4-encrypted ഡയറക്‌റ്ററികൾ സൃഷ്‌ടിക്കപ്പെടുകയും ചെയ്യും. എന്നിരുന്നാലും ലോഗിൻ ടോക്കണുകൾ സംരക്ഷിക്കുന്നതിനാൽ ഉപയോക്താവിന് വീണ്ടും സൈൻ ഇൻ ചെയ്യേണ്ടിവരില്ല. മുന്നറിയിപ്പ്: ഇത് ഉപയോക്താവിൻ്റെ ലോക്കൽ ഡാറ്റ നീക്കം ചെയ്യും.
 
       നിങ്ങൾ ഈ നയം, പിന്തുണയ്‌ക്കാത്ത ഒരു ഓപ്‌ഷനിലേക്ക് ('AskUser' അല്ലെങ്കിൽ 'AskForEcryptfsArcUsers') സജ്ജീകരിച്ചാൽ, അതിന് പകരമായി 'Migrate' തിരഞ്ഞെടുത്തതായി പരിഗണിക്കും.
 
@@ -1243,7 +1232,7 @@
           ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുകയാണെങ്കിൽ, സിസ്‌റ്റം നിലയിൽ ഇൻസ്‌റ്റാൾ ചെയ്‌തിരിക്കുന്ന പ്രാദേശിക സന്ദേശമയയ്‌ക്കൽ ഹോസ്‌റ്റുകളെ മാത്രമേ <ph name="PRODUCT_NAME" /> ഉപയോഗിക്കൂ.
 
           ഈ ക്രമീകരണം സജ്ജമാക്കുകയോ സജ്ജമാക്കാതെ വിടുകയോ ചെയ്യുകയാണെങ്കിൽ <ph name="PRODUCT_NAME" /> ഉപയോക്തൃനില  പ്രാദേശിക സന്ദേശമയയ്‌ക്കൽ ഹോസ്‌റ്റുകളുടെ ഉപയോഗം അനുവദിക്കുന്നു.</translation>
-<translation id="3177802893484440532">ലോക്കൽ ട്രസ്‌റ്റ് ആങ്കർമാർക്ക് OCSP/CRL പരിശോധനകൾ ആവശ്യമാണ്</translation>
+<translation id="3177802893484440532">ലോക്കൽ ട്രസ്‌റ്റ് ആങ്കർമാർക്ക് ഓൺലൈൻ OCSP/CRL പരിശോധനകൾ ആവശ്യമാണ്</translation>
 <translation id="3185009703220253572"><ph name="SINCE_VERSION" /> പതിപ്പിന്‌ ശേഷം</translation>
 <translation id="3187220842205194486">Android ആപ്പുകൾക്ക് കോർപ്പറേറ്റ് കീകളിൽ ആക്‌സസ് ലഭിക്കില്ല. അവയ്‌ക്ക് ഈ നയം ബാധകമല്ല.</translation>
 <translation id="3205825995289802549">ആദ്യ റണ്ണിൽ ആദ്യ ബ്രൗസർ വലുതാക്കുക</translation>
@@ -1257,7 +1246,7 @@
 <translation id="3220624000494482595">നയം <ph name="TRUE" /> എന്ന് സജ്ജമാക്കിയിരിക്കുകയാണെങ്കിൽ പോലും കിയോസ്‌ക് ആപ്പ് Android ആപ്പാണെങ്കിൽ, ഇതിന് <ph name="PRODUCT_OS_NAME" /> പതിപ്പിൽ നിയന്ത്രണം ഉണ്ടായിരിക്കില്ല.</translation>
 <translation id="3236046242843493070">വിപുലീകരണം, അപ്ലിക്കേഷൻ, ഉപയോക്തൃ സ്‌ക്രിപ്റ്റ് ഇൻസ്റ്റാളുകൾ എന്നിവ അനുവദിക്കുന്നതിനുള്ള URL പാറ്റേണുകൾ</translation>
 <translation id="3240609035816615922">പ്രിന്‍റർ കോൺഫിഗറേഷൻ ആക്‌സസ് നയം.</translation>
-<translation id="3240655340884151271">ഡോക്കിന്റെ ഇൻബിൽറ്റ് NIC MAC വിലാസം</translation>
+<translation id="3240655340884151271">ഡോക്കിൻ്റെ ഇൻബിൽറ്റ് NIC MAC വിലാസം</translation>
 <translation id="3243309373265599239">AC പവറിൽ പ്രവർത്തിക്കുമ്പോൽ സ്‌ക്രീൻ തെളിച്ചം കുറച്ചതിനുശേഷം, ഉപയോക്തൃ ഇൻപുട്ടില്ലാതെയുള്ള സമയദൈർഘ്യം വ്യക്തമാക്കുന്നു.
 
           ഈ നയം പൂജ്യത്തേക്കാൾ കൂടിയ മൂല്യമായി സജ്ജമാക്കുമ്പോൾ, അത് <ph name="PRODUCT_OS_NAME" /> സ്‌ക്രീൻ തെളിച്ചം കുറയ്‌ക്കുന്നതിന് മുമ്പ് ഉപയോക്താവ് നിഷ്‌ക്രിയമായി തുടരേണ്ട സമയ ദൈർഘ്യം വ്യക്തമാക്കുന്നു. 
@@ -1282,9 +1271,9 @@
 <translation id="3312206664202507568">SAML പാസ്‌വേഡും ഉപകരണ ലോക്ക്‌സ്‌ക്രീൻ പാസ്‌വേഡും സമന്വയത്തിൽ ആണെന്ന് ഉറപ്പാക്കുന്ന, ഇൻ സെഷനിൽ SAML ഉപയോക്താക്കളെ അവരുടെ പാസ്‌വേഡ് മാറ്റാൻ അനുവദിക്കുന്ന ഒരു പേജ് chrome://password-change എന്നതിൽ പ്രവർത്തനക്ഷമമാക്കുന്നു.
 
       SAML ഉപയോക്താക്കളുടെ SAML പാസ്‌വേഡ് കാലഹരണപ്പെടാൻ പോവുകയാണെങ്കിൽ അക്കാര്യം അവരെ അറിയിക്കുകയും ഉടൻ തന്നെ ഇൻ സെഷൻ പാസ്‌വേഡ് മാറ്റത്തിലൂടെ പ്രശ്‌നം കൈകാര്യം ചെയ്യാനും സഹായിക്കുന്ന അറിയിപ്പുകളെയും ഈ നയം പ്രവർത്തനക്ഷമമാക്കുന്നു.
-      എന്നാൽ SAML ലോഗിൻ ഫ്ലോയ്‌ക്കിടയിൽ SAML ഐഡന്റിറ്റി പ്രൊവൈഡർ പാസ്‌വേഡ് കാലഹരണപ്പെടൽ അറിയിപ്പ് ഉപകരണത്തിലേക്ക് അയച്ചിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ അറിയിപ്പുകൾ കാണിക്കൂ.
+      എന്നാൽ SAML ലോഗിൻ ഫ്ലോയ്‌ക്കിടയിൽ SAML ഐഡൻ്റിറ്റി പ്രൊവൈഡർ പാസ്‌വേഡ് കാലഹരണപ്പെടൽ അറിയിപ്പ് ഉപകരണത്തിലേക്ക് അയച്ചിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ അറിയിപ്പുകൾ കാണിക്കൂ.
 
-      ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താവിന് അത് മാറ്റാനോ റദ്ദാക്കാനോ കഴിയില്ല.</translation>
+      ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ ഉപയോക്താവിന് അത് മാറ്റാനോ റദ്ദാക്കാനോ കഴിയില്ല.</translation>
 <translation id="3322771899429619102">കീ സൃഷ്‌ടിക്കലിന് ഉപയോഗിക്കാൻ അനുവദിക്കുന്ന സൈറ്റുകൾ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ലിസ്‌റ്റ് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. url പാറ്റേൺ 'KeygenBlockedForUrls'-ൽ ആണെങ്കിൽ, അത് ഈ ഒഴിവാക്കലുകളെ അസാധുവാക്കുന്നു.
 
           ഈ നയം സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിൽ എല്ലാ സൈറ്റുകൾക്കുമുള്ള ആഗോള ഡിഫോൾട്ട് മൂല്യം, 'DefaultKeygenSetting' നയം സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ അല്ലെങ്കിൽ ഉപയോക്താവിന്റെ വ്യക്തിപരമായ കോൺഫിഗറേഷനിൽ നിന്നോ, ഉപയോഗിക്കുന്നതാണ്.</translation>
@@ -1413,7 +1402,7 @@
       ഈ നയം 'DeveloperToolsAllowed' (മൂല്യം 1) എന്നാണ് സജ്ജീകരിച്ചിരിക്കുന്നതെങ്കിൽ, എന്റർപ്രൈസ് നയം മുഖേന വിപുലീകരണങ്ങൾ ഇൻസ്‌റ്റാൾ ചെയ്‌തിട്ടുള്ള സന്ദർഭങ്ങളിൽ ഉൾപ്പെടെയുള്ള എല്ലാ സന്ദർഭങ്ങളിലും ഡെവലപ്പർ ടൂളുകളും JavaScript കൺസോളും ആക്‌സസ് ചെയ്യാനും ഉപയോഗിക്കാനുമാവും.
       ഈ നയം 'DeveloperToolsDisallowed' (മൂല്യം 2) എന്നാണ് സജ്ജീകരിച്ചിരിക്കുന്നതെങ്കിൽ, ഇനിയങ്ങോട്ട് ഡെവലപ്പർ ടൂളുകൾ ആക്‌സസ് ചെയ്യാനും വെബ്‌സൈറ്റ് ഘടകങ്ങൾ പരിശോധിക്കാനുമാവില്ല. ഡെവലപ്പർ ടൂളുകളോ JavaScript കൺസോളോ തുറക്കുന്നതിനുള്ള എല്ലാ കീബോർഡ് കുറുക്കുവഴികളും മെനു അല്ലെങ്കിൽ സന്ദർഭ മെനു എൻട്രികളും പ്രവർത്തനരഹിതമാക്കും.</translation>
 <translation id="3547954654003013442">പ്രോക്‌സി ക്രമീകരണം</translation>
-<translation id="3550875587920006460">അപ്‍ഡേറ്റുകളുണ്ടോ എന്ന് പരിശോധിക്കാൻ ഇഷ്ടാനുസൃത ഷെഡ്യൂൾ സജ്ജമാക്കാൻ അനുവദിക്കുന്നു. എല്ലാ ഉപയോക്താക്കൾക്കും ഉപകരണത്തിലെ എല്ലാ ഇൻ്റർഫേസുകൾക്കും ഇത് ബാധകമാണ്. സജ്ജീകരിച്ച് കഴിഞ്ഞാൽ, ഉപകരണം ഷെഡ്യൂളിനനുസരിച്ച് അപ്‌ഡേറ്റുകളുണ്ടോയെന്ന് പരിശോധിക്കും. ഷെഡ്യൂൾ ചെയ്‌ത അപ്‌ഡേറ്റ് പരിശോധനകൾ നിർത്താൻ ഈ നയം നീക്കം ചെയ്യേണ്ടതുണ്ട്.</translation>
+<translation id="3550875587920006460">അപ്‍ഡേറ്റുകളുണ്ടോ എന്ന് പരിശോധിക്കാൻ ഇഷ്ടാനുസൃത ഷെഡ്യൂൾ സജ്ജമാക്കാൻ അനുവദിക്കുന്നു. എല്ലാ ഉപയോക്താക്കൾക്കും ഉപകരണത്തിലെ എല്ലാ ഇൻ്റർഫേസുകൾക്കും ഇത് ബാധകമാണ്. സജ്ജീകരിച്ച് കഴിഞ്ഞാൽ, ഉപകരണം ഷെഡ്യൂളിനനുസരിച്ച് അപ്‌ഡേറ്റുകളുണ്ടോയെന്ന് പരിശോധിക്കും. ഷെഡ്യൂൾ ചെയ്‌ത അപ്‌ഡേറ്റ് പരിശോധനകൾ റദ്ദാക്കാൻ ഈ നയം നീക്കം ചെയ്യേണ്ടതുണ്ട്.</translation>
 <translation id="355118380775352753">ഇതര ബ്രൗസറിൽ തുറക്കാനുള്ള വെബ്‌സൈറ്റുകൾ</translation>
 <translation id="3554984410014457319">Google അസിസ്‌റ്റൻ്റിനെ വോയ്‌സ് സജീവമാക്കൽ പദം കേൾക്കാൻ അനുവദിക്കുക</translation>
 <translation id="356579196325389849">ഉപയോക്താക്കൾ Chrome OS റിലീസ് ചാനൽ കോൺഫിഗർ ചെയ്യേണ്ടതായി വന്നേക്കാം</translation>
@@ -1526,9 +1515,9 @@
 
       ഈ നയം കോൺഫിഗർ ചെയ്യാത്തപ്പോഴോ <ph name="BR_DISABLED" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോഴോ, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ പ്രാഥമികമായി പ്രവർത്തനരഹിതമായിരിക്കും.
 
-      ഈ നയം <ph name="BR_ENABLED" /> എന്നതിലേക്ക് സജ്ജീകരിക്കുമ്പോൾ, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ പ്രാഥമികമായി പ്രവർത്തനക്ഷമമായിരിക്കും.
+      ഈ നയം <ph name="BR_ENABLED" /> എന്ന് സജ്ജീകരിക്കുമ്പോൾ, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ പ്രാഥമികമായി പ്രവർത്തനക്ഷമമായിരിക്കും.
 
-      ഈ നയം <ph name="BR_UNDER_USER_CONTROL" /> എന്നതിലേക്ക് സജ്ജീകരിക്കുമ്പോൾ, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ ഉപയോഗിക്കണോ എന്ന് തിരഞ്ഞെടുക്കാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടും. ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ ഉപയോക്താവ് പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, Android ആപ്പ് ഡാറ്റ Android ബാക്കപ്പ് സെർവറുകളിലേക്ക് അപ്‌ലോഡ് ചെയ്യുകയും അനുയോജ്യമായ ആപ്പുകൾ വീണ്ടും ഇൻസ്‌റ്റാൾ ചെയ്യുന്നതനുസരിച്ച് അവയിൽ നിന്ന് പുനഃസ്ഥാപിക്കുകയും ചെയ്യുന്നു.
+      ഈ നയം <ph name="BR_UNDER_USER_CONTROL" /> എന്ന് സജ്ജീകരിക്കുമ്പോൾ, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ ഉപയോഗിക്കണോ എന്ന് തിരഞ്ഞെടുക്കാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടും. ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ ഉപയോക്താവ് പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, Android ആപ്പ് ഡാറ്റ Android ബാക്കപ്പ് സെർവറുകളിലേക്ക് അപ്‌ലോഡ് ചെയ്യുകയും അനുയോജ്യമായ ആപ്പുകൾ വീണ്ടും ഇൻസ്‌റ്റാൾ ചെയ്യുന്നതനുസരിച്ച് അവയിൽ നിന്ന് പുനഃസ്ഥാപിക്കുകയും ചെയ്യുന്നു.
 
       പ്രാഥമിക സജ്ജീകരണ സമയത്ത് മാത്രമേ ഈ നയം Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ നിലയെ നിയന്ത്രിക്കുകയുള്ളൂ എന്ന കാര്യം ശ്രദ്ധിക്കുക. അതിന് ശേഷം ഉപയോക്താവിന് Android ക്രമീകരണം തുറന്ന്, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ ഓൺ/ഓഫ് ആക്കാം</translation>
 <translation id="3831376478177535007">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമായിരിക്കുമ്പോൾ, അംഗീകൃത CA സർട്ടിഫിക്കറ്റ് സാധൂകരിക്കുകയും ബന്ധിപ്പിക്കുകയും ചെയ്യുകയാണെങ്കിൽ,  Symantec Corporation-ന്റെ Legacy PKI പ്രവർത്തനങ്ങൾ നൽകിയ സർട്ടിഫിക്കറ്റുകൾ <ph name="PRODUCT_NAME" /> അനുവദിക്കും
@@ -1715,29 +1704,6 @@
       SAML ഉപയോഗിച്ച് പരിശോധിച്ചുറപ്പിക്കുന്ന ഉപയോക്താക്കൾക്ക് മാത്രമേ ഈ നയം ബാധകമാകൂ.</translation>
 <translation id="4105989332710272578">URL-കളുടെ ഒരു ലിസ്‌റ്റിൽ സർട്ടിഫിക്കറ്റ് സുതാര്യത നടപ്പിലാക്കൽ പ്രവർത്തനരഹിതമാക്കുക</translation>
 <translation id="4121350739760194865">പുതിയ ടാബ് പേജിൽ ദൃശ്യമാകുന്നതിൽ നിന്നും ആ പ്രൊമോഷനുകളെ തടയുക</translation>
-<translation id="4125606414556046117">ഡെസ്‌ക്‌ടോപ്പിൽ കാണിച്ചിരിക്കുന്നതും ഉപയോക്താവിന്റെ ലോഗിൻ സ്ക്രീൻ പശ്ചാത്തലത്തിലുള്ളതുമായ, വാൾപേപ്പർ ചിത്രം കോൺഫിഗർ ചെയ്യാൻ ഈ നയം നിങ്ങളെ അനുവദിക്കുന്നു. വാൾപേപ്പർ ചിത്രം ഡൗൺലോഡ് ചെയ്യാനാകുന്ന <ph name="PRODUCT_OS_NAME" /> എന്നതിൽ നിന്നും ഡൗൺലോഡിന്റെ സമഗ്രത പരിശോധിച്ചുറപ്പിക്കുന്നതിന് ഉപയോഗിക്കുന്ന ഒരു ഗൂഢഭാഷാ ഹാഷിൽ നിന്നുമുള്ള URL വ്യക്തമാക്കിയാണ് ഈ നയം സജ്ജീകരിക്കുന്നത്. ചിത്രം JPEG ഫോർമാറ്റിലുള്ളതും, 16MB യിൽ കൂടാത്ത വലുപ്പത്തിലുള്ളതുമായിരിക്കണം. യാതൊരു പരിശോധിച്ചുറപ്പിക്കലുമില്ലാതെ തന്നെ URL ആക്‌സസ് ചെയ്യാവുന്നതായിരിക്കണം. 
-
-      വാൾപേപ്പർ ചിത്രം ഡൗൺലോഡ് ചെയ്‌ത് കാഷെ ചെയ്‌തു. URL അല്ലെങ്കിൽ ഹാഷ് മാറുമ്പോഴൊക്കെ അത് വീണ്ടും ഡൗൺലോഡ് ചെയ്യും. 
-
-     ഈ നയം, URL-നെ സൂചിപ്പിക്കുന്ന സ്ട്രിംഗ് ആയും ഹാഷിനെ JSON ഫോർമാറ്റിലും ഇനിപ്പറയുന്ന സ്കീമയ്ക്കനുസരിച്ച് വ്യക്തമാക്കണം: 
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "വാൾപേപ്പർ ചിത്രം ഡൗൺലോഡ് ചെയ്യാനാകുന്ന URL.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "വാൾപേപ്പർ ചിത്രത്തിന്റെ SHA-256 ഹാഷ്.",
-            "type": "string"
-          }
-        }
-      }
-      ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> ഡൗൺലോഡ് ചെയ്ത് വാൾപേപ്പർ ചിത്രം ഉപയോഗിക്കും.
-
-      നിങ്ങൾ ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല.
-
-      ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, ഡെസ്‌ക്ടോപ്പിലും ലോഗിൻ സ്ക്രീൻ പശ്ചാത്തലത്തിലും ദൃശ്യമാക്കുന്നതിന് ഉപയോക്താവിന് ഒരു ചിത്രം തിരഞ്ഞെടുക്കാനാകും.</translation>
 <translation id="412697421478384751">ലോക്ക് സ്‌ക്രീൻ പിൻ നമ്പറിൽ ദുർബലമായ പിൻ നമ്പറുകൾ സജ്ജീകരിക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കുക</translation>
 <translation id="4138655880188755661">സമയ പരിധി</translation>
 <translation id="4144164749344898721">ഉപയോക്താവ് നിഷ്‌ക്രിയമായിരിക്കുമ്പോൾ പവർ മാനേജ്മെൻ്റ് തന്ത്രത്തിനായി ഈ നയം ഒന്നിലേറെ ക്രമീകരണങ്ങൾ നിയന്ത്രിക്കുന്നു.
@@ -1847,7 +1813,7 @@
       ഒരു ആപ്പ് ഐഡി അടങ്ങിയ നയം കൊണ്ട്, ലോക്ക് സ്‌ക്രീനിൽ ഒരു ആപ്പിനെ കുറിപ്പ്-എടുക്കൽ ആപ്പായി പ്രവർത്തനക്ഷമമാക്കാൻ ഉപയോക്താവിനു കഴിയുമെന്ന് അർത്ഥമാക്കുന്നില്ല എന്നത് ശ്രദ്ധിക്കുക - ഉദാഹരണത്തിന്, Chrome 61-ൽ, ലഭ്യമായ ആപ്പുകളുടെ ഗണത്തെ പ്ലാറ്റ്‌ഫോമിനാൽ കൂടുതൽ നിയന്ത്രിച്ചിരിക്കുന്നു.
 
       നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, നയം നടപ്പിലാക്കിയിട്ടുള്ള ലോക്ക് സ്‌ക്രീനിൽ ഉപയോക്താവിന് പ്രവർത്തനക്ഷമമാക്കാൻ കഴിയുന്ന ആപ്പ് ഗണവുമായി ബന്ധപ്പെട്ട് നിയന്ത്രണങ്ങളൊന്നും ഉണ്ടായിരിക്കുകയില്ല.</translation>
-<translation id="4313767483634435271">ഉപകരണത്തിന്റെ നിയുക്ത ഡോക്ക് MAC വിലാസം</translation>
+<translation id="4313767483634435271">ഉപകരണത്തിൻ്റെ നിയുക്ത ഡോക്ക് MAC വിലാസം</translation>
 <translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> പതിപ്പ് നിയന്ത്രിക്കാൻ, കാലതാമസമില്ലാതെ കിയോസ്‌ക് ആപ്പ് സ്വയം സമാരംഭിക്കുന്നതിന് അനുവദിക്കുക.</translation>
 <translation id="4325690621216251241">സിസ്റ്റം ട്രേയിൽ ഒരു ലോഗ്ഔട്ട് ബട്ടൺ ചേർക്കുക</translation>
 <translation id="4332177773549877617">Android ആപ്പ് ഇൻസ്‌റ്റാളുകളുടെ ഇവൻ്റുകൾ ലോഗ് ചെയ്യുക</translation>
@@ -2295,7 +2261,7 @@
 
       ഈ നയം സജ്ജമാക്കാതിരിക്കുകയോ അല്ലെങ്കിൽ ശൂന്യമായ സ്‌ട്രിംഗിലേക്കോ അസാധുവായ പോർട്ട് ശ്രേണിയിലേക്കോ സജ്ജമാക്കുകയോ ആണെങ്കിൽ, ലഭ്യമായ ഏതൊരു ലോക്കൽ UDP പോർട്ടും ഉപയോഗിക്കാൻ WebRTC-നെ അനുവദിക്കും.</translation>
 <translation id="5290940294294002042">ഉപയോക്താവിന്‌ പ്രവർത്തനക്ഷമമാക്കാൻ/പ്രവർത്തനരഹിതമാക്കാൻ കഴിയുന്ന പ്ലഗിനുകളുടെ ഒരു ലിസ്റ്റ് നിര്‍ദേശിക്കുക</translation>
-<translation id="5306186200045823863">Symantec Corporation-ന്റെ Legacy PKI Infrastructure-ൽ വിശ്വാസമർപ്പിക്കൂ</translation>
+<translation id="5306186200045823863">Symantec Corporation-ൻ്റെ Legacy PKI Infrastructure-ൽ വിശ്വാസമർപ്പിക്കൂ</translation>
 <translation id="5307432759655324440">അദൃശ്യ മോഡ് ലഭ്യത</translation>
 <translation id="5318185076587284965">വിദൂര ആക്‌സസ് ഹോസ്‌റ്റിലൂടെ റിലെ സെർവറുകളുടെ ഉപയോഗം പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="5323128137188992869"><ph name="PRODUCT_NAME" /> ഉപയോഗിക്കുന്ന ഉപകരണത്തിലേക്ക് കാസ്‌റ്റ് ചെയ്യാൻ ഉള്ളടക്കത്തെ അനുവദിക്കുക.
@@ -2509,7 +2475,7 @@
 <translation id="5630352020869108293">അവസാന സെഷൻ പുനഃസ്ഥാപിക്കുക</translation>
 <translation id="5643906875497889108">ഏതൊക്കെ ആപ്പ്/വിപുലീകരണ തരങ്ങൾ ഇൻസ്‌റ്റാൾ ചെയ്യാൻ അനുവദിക്കണമെന്നതിനെ നിയന്ത്രിക്കുകയും റൺടൈം ആക്‌സസിനെ പരിമിതപ്പെടുത്തുകയും ചെയ്യുന്നു.
 
-          <ph name="PRODUCT_NAME" />-ൽ ഇൻസ്‌റ്റാൾ ചെയ്യാവുന്ന അനുവദനീയമായ വിപുലീകരണ/ആപ്പുകളുടെ തരങ്ങളെയും ഏതൊക്കെ ഹോസ്‌റ്റുകൾക്ക് അവയുമായി സഹകരിക്കാനാകുമെന്നതിനെയും ഈ ക്രമീകരണം വൈറ്റ്‌-ലിസ്‌റ്റ് ചെയ്യുന്നു. ഈ മൂല്യം സ്‌ട്രിംഗുകളുടെ ഒരു ലിസ്‌റ്റാണ്, അവയിൽ ഓരോന്നും ഇനിപ്പറയുന്നവയിൽ ഒന്നായിരിക്കണം: "വിപുലീകരണം", "തീം", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". ഈ തരങ്ങളെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക് <ph name="PRODUCT_NAME" /> വിപുലീകരണങ്ങളുടെ ഡോക്യുമെന്റേഷൻ കാണുക.
+          <ph name="PRODUCT_NAME" />-ൽ ഇൻസ്‌റ്റാൾ ചെയ്യാവുന്ന അനുവദനീയമായ വിപുലീകരണ/ആപ്പുകളുടെ തരങ്ങളെയും ഏതൊക്കെ ഹോസ്‌റ്റുകൾക്ക് അവയുമായി സഹകരിക്കാനാകുമെന്നതിനെയും ഈ ക്രമീകരണം വൈറ്റ്‌-ലിസ്‌റ്റ് ചെയ്യുന്നു. ഈ മൂല്യം സ്‌ട്രിംഗുകളുടെ ഒരു ലിസ്‌റ്റാണ്, അവയിൽ ഓരോന്നും ഇനിപ്പറയുന്നവയിൽ ഒന്നായിരിക്കണം: "വിപുലീകരണം", "തീം", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". ഈ തരങ്ങളെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക് <ph name="PRODUCT_NAME" /> വിപുലീകരണങ്ങളുടെ ഡോക്യുമെൻ്റേഷൻ കാണുക.
 
           ExtensionInstallForcelist മുഖേന നിർബന്ധിതമായി ഇൻസ്റ്റാൾ ചെയ്‌ത വിപുലീകരണങ്ങൾക്കും ആപ്പുകൾക്കും ഈ നയം ബാധികമായിരിക്കും എന്ന കാര്യം ശ്രദ്ധിക്കുക.
 
@@ -2639,7 +2605,7 @@
 <translation id="5898486742390981550">ഒന്നിലധികം ഉപയോക്താക്കൾ ലോഗിൻ ചെയ്‌തിരിക്കുമ്പോൾ, പ്രാഥമിക ഉപയോക്താവിന് മാത്രമേ Android ആപ്പുകൾ ഉപയോഗിക്കാനാവൂ.</translation>
 <translation id="5901427587865226597">രണ്ട് വശത്തുമുള്ള അച്ചടി മാത്രം</translation>
 <translation id="5903898512448364160">
-      ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ക്ലൗഡ് നയത്തിന് പ്ലാറ്റ്‌ഫോം നയവുമായി വൈരുദ്ധ്യമുണ്ടായാൽ ക്ലൗഡ് നയത്തിന് മുൻഗണന ലഭിക്കുന്നു.
+      ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ ക്ലൗഡ് നയത്തിന് പ്ലാറ്റ്‌ഫോം നയവുമായി വൈരുദ്ധ്യമുണ്ടായാൽ ക്ലൗഡ് നയത്തിന് മുൻഗണന ലഭിക്കുന്നു.
       ഈ നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ, പ്ലാറ്റ്‌ഫോം നയത്തിന് ക്ലൗഡ് നയവുമായി വൈരുദ്ധ്യമുണ്ടായാൽ പ്ലാറ്റ്‌ഫോം നയത്തിന് മുൻഗണന ലഭിക്കുന്നു.
 
       ഒരു നിർബന്ധിത മെഷീൻ പ്ലാറ്റ്‌ഫോം നയമായി മാത്രം ലഭ്യമാകുന്ന ഈ നയം, മെഷീൻ സ്കോപ്പ് ക്ലൗഡ് നയങ്ങളെ മാത്രമേ ബാധിക്കുകയുള്ളൂ.
@@ -2674,7 +2640,7 @@
 <translation id="5950205771952201658">സോഫ്‌റ്റ്‌വെയർ പരാജയം എന്ന വസ്‌തുതയുടെ വെളിച്ചത്തിൽ, ഓൺലൈൻ അസാധുവാക്കൽ പരിശോധനകൾ ഫലപ്രദമായ സുരക്ഷാ പ്രയോജനമൊന്നും നൽകാത്തതിനാൽ, <ph name="PRODUCT_NAME" /> പതിപ്പ് 19-ലും അതിനുശേഷമുള്ളവയിലും അവ സ്ഥിരമായി പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു. ഈ നയം ശരി എന്ന് സജ്ജമാക്കുന്നതിലൂടെ, മുമ്പത്തെ പ്രവർത്തനരീതി പുനഃസ്ഥാപിച്ച് ഓൺലൈൻ OCSP/CRL പരിശോധനകൾ നിർവ്വഹിക്കും.
 
       ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ തെറ്റ് എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ, <ph name="PRODUCT_NAME" /> 19-ലും അതിനുശേഷമുള്ളവയിലും <ph name="PRODUCT_NAME" /> ഓൺലൈൻ അസാധുവാക്കൽ പരിശോധനകൾ നിർവ്വഹിക്കില്ല.</translation>
-<translation id="5961137303188584693">ഉപകരണത്തിന്‍റെ ബിൽറ്റ് ഇൻ NIC MAC വിലാസം</translation>
+<translation id="5961137303188584693">ഉപകരണത്തിൻ്റെ ബിൽറ്റ് ഇൻ NIC MAC വിലാസം</translation>
 <translation id="5966615072639944554">വിദൂര അറ്റസ്‌റ്റേഷൻ API ഉപയോഗിക്കാൻ വിപുലീകരണങ്ങൾ അനുവദിച്ചിരിക്കുന്നു</translation>
 <translation id="5983708779415553259">ഉള്ളടക്ക പാക്കിലൊന്നുമില്ലാത്ത സൈറ്റുകളുടെ ഡിഫോൾട്ട് പെരുമാറ്റം</translation>
 <translation id="5997543603646547632">ഡിഫോൾട്ടായി 24 മണിക്കൂർ ക്ലോക്ക് ഉപയോഗിക്കുക</translation>
@@ -2685,53 +2651,6 @@
 
       ഈ നയം സജ്ജമാക്കിയില്ലെങ്കിൽ അല്ലെങ്കിൽ തെറ്റായി സജ്ജമാക്കിയെങ്കിൽ, പ്രിന്റ് കമാന്റുകൾ പ്രിന്റ് പ്രിവ്യൂ സ്‌ക്രീൻ ട്രിഗർ ചെയ്യും.</translation>
 <translation id="6022948604095165524">തുടക്കത്തിലെ പ്രവര്‍ത്തനം</translation>
-<translation id="6023030044732320798">ARC റൺ‌ടൈമിലേക്ക് കൈമാറുന്ന ഒരു കൂട്ടം നയങ്ങൾ വ്യക്തമാക്കുന്നു. മൂല്യം സാധുതയുള്ള JSON ആയിരിക്കണം.
-
-      ഉപകരണത്തിൽ ഏതൊക്കെ Android ആപ്പുകൾ സ്വയമേവ ഇൻസ്റ്റാൾ ചെയ്യണമെന്ന് കോൺഫിഗർ ചെയ്യാൻ ഈ നയം ഉപയോഗിക്കാനാകും:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android app identifier, e.g. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Specifies how an app is installed. OPTIONAL: The app is not installed automatically, but the user can install it. This is the default if this policy is not specified. PRELOAD: The app is installed automatically, but the user can uninstall it. FORCE_INSTALLED: The app is installed automatically and the user cannot uninstall it. BLOCKED: The app is blocked and cannot be installed. If the app was installed under a previous policy it will be uninstalled.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Policy for granting permission requests to apps. PERMISSION_POLICY_UNSPECIFIED: Policy not specified. If no policy is specified for a permission at any level, then the `PROMPT` behavior is used by default. PROMPT: Prompt the user to grant a permission. GRANT: Automatically grant a permission. DENY: Automatically deny a permission.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "App-specific JSON configuration object with a set of key-value pairs, e.g. '"managedConfiguration": { "key1": value1, "key2": value2 }'. The keys are defined in the app manifest.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      ലോഞ്ചറിലേക്ക് ആപ്പുകൾ പിൻ ചെയ്യാൻ, PinnedLauncherApps കാണുക.</translation>
 <translation id="602728333950205286">ഡിഫോൾട്ട് തിരയൽ ദാതാവിന്‍റെ തല്‍ക്ഷണ URL</translation>
 <translation id="603410445099326293">POST ഉപയോഗിക്കുന്ന URL നിർദ്ദേശിക്കാനുള്ള പാരാമീറ്ററുകൾ</translation>
 <translation id="6034341625190551415">പബ്ലിക് സെഷൻ കിയോസ്‌ക് അക്കൗണ്ട് തരങ്ങൾ എന്നിവയെ നിയന്ത്രിക്കുന്നു.</translation>
@@ -2768,11 +2687,11 @@
 <translation id="6133088669883929098">കീ സൃഷ്‌ടിക്കൽ ഉപയോഗിക്കാൻ എല്ലാ സൈറ്റുകളെയും അനുവദിക്കുക</translation>
 <translation id="6136537398661737682">ഈ നയം Google ലൊക്കേഷൻ സേവനങ്ങളുടെ പ്രാഥമിക നില നിയന്ത്രിക്കുന്നു.
 
-      ഈ നയം കോൺഫിഗർ ചെയ്യാത്തപ്പോഴോ <ph name="GLS_DISABLED" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോഴോ, Google ലൊക്കേഷൻ സേവനങ്ങൾ പ്രാഥമികമായി പ്രവർത്തനരഹിതമായിരിക്കും.
+      ഈ നയം കോൺഫിഗർ ചെയ്യാത്തപ്പോഴോ <ph name="GLS_DISABLED" /> എന്ന് സജ്ജീകരിച്ചിരിക്കുമ്പോഴോ, Google ലൊക്കേഷൻ സേവനങ്ങൾ പ്രാഥമികമായി പ്രവർത്തനരഹിതമായിരിക്കും.
 
-      ഈ നയം <ph name="GLS_ENABLED" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോൾ, Google ലൊക്കേഷൻ സേവനങ്ങൾ പ്രാഥമികമായി പ്രവർത്തനക്ഷമമായിരിക്കും.
+      ഈ നയം <ph name="GLS_ENABLED" /> എന്ന് സജ്ജീകരിച്ചിരിക്കുമ്പോൾ, Google ലൊക്കേഷൻ സേവനങ്ങൾ പ്രാഥമികമായി പ്രവർത്തനക്ഷമമായിരിക്കും.
 
-      ഈ നയം <ph name="GLS_UNDER_USER_CONTROL" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോൾ Google ലൊക്കേഷൻ സേവനങ്ങൾ ഉപയോഗിക്കണോ എന്ന് തിരഞ്ഞെടുക്കാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടും. ഉപകരണ ലൊക്കേഷൻ ചോദിക്കുന്നതിനായി സേവനങ്ങൾ ഉപയോഗിക്കാൻ ഇത് Android ആപ്പുകളെ അനുവദിക്കും, Google-ന് അജ്ഞാത ലൊക്കേഷൻ ഡാറ്റ സമർപ്പിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുകയും ചെയ്യും.
+      ഈ നയം <ph name="GLS_UNDER_USER_CONTROL" /> എന്ന് സജ്ജീകരിച്ചിരിക്കുമ്പോൾ Google ലൊക്കേഷൻ സേവനങ്ങൾ ഉപയോഗിക്കണോ എന്ന് തിരഞ്ഞെടുക്കാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടും. ഉപകരണ ലൊക്കേഷൻ ചോദിക്കുന്നതിനായി സേവനങ്ങൾ ഉപയോഗിക്കാൻ ഇത് Android ആപ്പുകളെ അനുവദിക്കും, Google-ന് അജ്ഞാത ലൊക്കേഷൻ ഡാറ്റ സമർപ്പിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുകയും ചെയ്യും.
 
       പ്രാഥമിക സജ്ജീകരണ സമയത്ത് മാത്രമാണ് Google ലൊക്കേഷൻ സേവനങ്ങളുടെ നിലയെ ഈ നയം നിയന്ത്രിക്കുന്നുവെന്ന കാര്യം ശ്രദ്ധിക്കുക. ഇതിന് ശേഷം ഉപയോക്താവിന് Android ക്രമീകരണം തുറന്ന് Google ലൊക്കേഷൻ സേവനങ്ങൾ ഓൺ/ഓഫ് ആക്കാം.
 
@@ -3071,37 +2990,6 @@
       ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, അന്തർനിർമ്മിതമായ DNS ക്ലയന്‍റ് ഒരിക്കലും ഉപയോഗിക്കില്ല.
 
       ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, MacOS, Android (സ്വകാര്യ DNS അല്ലെങ്കിൽ VPN പ്രവർത്തനരഹിതമായിരിക്കുമ്പോൾ), ChromeOS എന്നിവയിൽ അന്തർനിർമ്മിതമായ DNS ക്ലയന്‍റ് ഡിഫോൾട്ടായി പ്രവർത്തനക്ഷമമാകും, കൂടാതെ chrome://flags എഡിറ്റ് ചെയ്‌ത് അന്തർനിർമ്മിതമായ DNS ക്ലയന്‍റ് ഉപയോഗിക്കണോ അതോ കമാൻഡ്-ലൈൻ ഫ്ലാഗ് നിർദ്ദേശിക്കണോ എന്നത് ഉപയോക്താക്കൾക്ക് മാറ്റാനാവും.</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> ഡിഫോൾട്ട് പ്രിന്റർ തിരഞ്ഞെടുക്കൽ നയങ്ങളെ അസാധുവാക്കുന്നു.
-
-      ഒരു പ്രൊഫൈലിനൊപ്പം പ്രിന്റ് പ്രവർത്തനം ആദ്യമായി ഉപയോഗിക്കുമ്പോൾ <ph name="PRODUCT_NAME" />-ൽ ഡിഫോൾട്ട് പ്രിന്റർ തിരഞ്ഞെടുക്കാനുള്ള നയങ്ങൾ ഈ നയം നിർണ്ണയിക്കുന്നു.
-      
-      ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, വ്യക്തമാക്കിയ എല്ലാ ആട്രിബ്യൂട്ടുകളും പൊരുത്തപ്പെടുന്ന ഒരു പ്രിന്റർ കണ്ടെത്താൻ <ph name="PRODUCT_NAME" /> ശ്രമിക്കുകയും അത് ഡിഫോൾട്ട് പ്രിന്റർ ആയി തിരഞ്ഞെടുക്കുകയും ചെയ്യും. നയവുമായി പൊരുത്തപ്പെടുന്നതായി കണ്ടെത്തുന്ന ആദ്യ പ്രിന്റർ തിരഞ്ഞെടുക്കും, പൊരുത്തപ്പെടുന്ന ഒന്നിലധികം പ്രിന്ററുകൾ ഉണ്ടെങ്കിൽ, പ്രിന്ററുകൾ കണ്ടെത്തുന്നതിന്റെ ക്രമത്തെ ആശ്രയിച്ച്, പൊരുത്തപ്പെടുന്ന ഏതെങ്കിലും പ്രിന്റർ തിരഞ്ഞെടുക്കാനാവും.
-
-      ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ സമയപരിധിക്കുള്ളിൽ പൊരുത്തപ്പെടുന്ന പ്രിന്റർ കണ്ടെത്തിയില്ലെങ്കിലോ, പ്രിന്റർ ഡിഫോൾട്ടായി, അന്തർനിർമ്മിതമായ PDF പ്രിന്ററിലേക്കോ, PDF പ്രിന്റർ ലഭ്യമല്ലെങ്കിൽ പ്രിന്റർ തിരഞ്ഞെടുത്തില്ല എന്നതിലേക്കോ മാറുന്നു.
-
-      .ഇനിപ്പറയുന്ന സ്‌കീമ അനുസരിച്ചുള്ള ഒരു JSON ഒബ്‌ജക്റ്റ് ആയാണ് ഈ മൂല്യം വിശകലനം ചെയ്യുക:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "അനുയോജ്യമായ പ്രിന്ററിന്റെ തിരയൽ, ഒരു സെറ്റ് നിർദ്ദിഷ്‌ട പ്രിന്ററുകളിലേക്ക് പരിമിതപ്പെടുത്തണോ എന്നത്.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "പ്രിന്റർ ഐഡി പൊരുത്തപ്പെടുത്തുന്നതിനുള്ള റെഗുലർ എക്‌സ്‌പ്രഷൻ.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "പ്രിന്റർ ഡിസ്‌പ്ലേ പേര് പൊരുത്തപ്പെടുന്നതിനുള്ള റെഗുലർ എക്‌സ്‌പ്രഷൻ.",
-            "type": "string"
-          }
-        }
-      }
-
-      <ph name="CLOUD_PRINT_NAME" />-ലേക്ക് ബന്ധിപ്പിച്ച പ്രിന്ററുകൾ <ph name="PRINTER_TYPE_CLOUD" /> ആയി പരിഗണിക്കപ്പെടുന്നു, അവശേഷിക്കുന്ന പ്രിന്ററുകൾ <ph name="PRINTER_TYPE_LOCAL" /> ആയി തരംതിരിക്കപ്പെടുന്നു.
-      ഒരു ഫീൽഡ് വിട്ടുകളയുന്നതിനർത്ഥം എല്ലാ മൂല്യങ്ങളും പൊരുത്തപ്പെടുന്നു എന്നാണ്, ഉദാഹരണത്തിന്, കണക്‌റ്റിവിറ്റി നിർദ്ദേശിക്കാതിരിക്കുന്നത്, പ്രിന്റ് പ്രിവ്യൂ ലോക്കലും ക്ലൗഡുമായ എല്ലാ തരത്തിലുള്ള പ്രിന്ററുകളും കണ്ടെത്തുന്നതിന് തുടക്കമിടാൻ കാരണമാവും.
-      റെഗുലർ എക്‌സ്‌പ്രഷൻ പാറ്റേണുകൾ JavaScript RegExp വാക്യഘടന പിന്തുടരണം, ഒപ്പം പൊരുത്തങ്ങൾ കേസ് സെൻസിറ്റീവ് ആണ്.</translation>
 <translation id="6843296367238757293">ഈ നയം അവസാനിപ്പിച്ചു. ഇതിന്‍റെ ഉപയോഗം നിരുത്സാഹപ്പെടുത്തുന്നു. https://support.google.com/chrome/a/answer/7643500 എന്നതിൽ കൂടുതൽ വായിക്കുക</translation>
 <translation id="684856667300805181"><ph name="PRODUCT_NAME" /> 68-ൽ ഈ നയം നീക്കം ചെയ്യുകയും പകരമായി <ph name="ARC_GLS_POLICY_NAME" /> ബാധകമാക്കുകയും ചെയ്‌തു.</translation>
 <translation id="6856743875250214792">ഇന്റേണൽ പരിശോധനയ്ക്ക് മാത്രം ഉപയോഗിച്ചിരുന്നതുകൊണ്ടും അത് ഒരു സുരക്ഷാ ബാധ്യത ആയതിനാലും M66-ൽ ഈ നയം അവസാനിപ്പിച്ച് നീക്കം ചെയ്തിരിക്കുന്നു.
@@ -3177,13 +3065,13 @@
 ഈ നയം 'ശരി' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ സജ്ജീകരിക്കാതിരുന്നാലോ, സ്‌മാർട്ട് ഡിം മോഡൽ പ്രവർത്തനക്ഷമമാക്കുകയും സ്ക്രീൻ മങ്ങുന്നതുവരെ സമയം ദീർഘിപ്പിക്കാൻ അനുവദിക്കുകയും ചെയ്യും. ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, സ്ക്രീൻ മങ്ങിക്കുന്നതിനെ, സ്‌മാർട്ട് ഡിം മോഡൽ ബാധിക്കില്ല.</translation>
 <translation id="6967394885063085697">വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് പവർ മാനേജ്‌മെന്റ് നയം പ്രവർത്തനക്ഷമമാക്കുക.
 
-          ബാറ്ററിയുടെ ആയുസ് വർധിപ്പിക്കാൻ വിപുലീകരിച്ച ബാറ്ററി ചാർജിംഗ് മോഡ് ഉപയോക്താവിനെ സഹായിക്കുന്നു. വിപുലീകരിച്ച ചാർജിംഗ് മോഡിൽ ആയിരിക്കുമ്പോൾ സിസ്‌റ്റം പ്രവർത്തിക്കാത്ത സമയങ്ങളിൽ ബാറ്ററിയുടെ ആയുസ് വർധിപ്പിക്കാൻ അടിസ്ഥാന ചാർജിംഗ് അൽഗരിതവും മറ്റ് സാങ്കേതികവിദ്യകളും ഉപയോഗിക്കുന്നു. പ്രവർത്തന സമയത്ത് എക്‌സ്‌പ്രസ് ചാർജ് ഉപയോഗിക്കുന്നു. വേഗത്തിൽ ചാർജ് ആകാൻ എക്‌സ്‌പ്രസ് ചാർജ് ബാറ്ററിയെ അനുവദിക്കുന്നതിനാൽ, ബാറ്ററി പെട്ടന്ന് പൂർണ്ണ ചാർജ് ആകുന്നു. ഓരോ ദിവസവും സിസ്‌റ്റം ഏറ്റവുമധികം ഉപയോഗിക്കുന്ന സമയം, ആരംഭ സമയവും സമയ ദൈർഘ്യവും അനുസരിച്ച് വ്യക്തമാക്കുന്നു.
+          ബാറ്ററിയുടെ ആയുസ് വർധിപ്പിക്കാൻ വിപുലീകരിച്ച ബാറ്ററി ചാർജിംഗ് മോഡ് ഉപയോക്താവിനെ സഹായിക്കുന്നു. വിപുലീകരിച്ച ചാർജിംഗ് മോഡിൽ ആയിരിക്കുമ്പോൾ സിസ്‌റ്റം പ്രവർത്തിക്കാത്ത സമയങ്ങളിൽ ബാറ്ററിയുടെ ആയുസ് വർധിപ്പിക്കാൻ അടിസ്ഥാന ചാർജിംഗ് അൽഗരിതവും മറ്റ് സാങ്കേതികവിദ്യകളും ഉപയോഗിക്കുന്നു. പ്രവർത്തന സമയത്ത് എക്‌സ്‌പ്രസ് ചാർജ് ഉപയോഗിക്കുന്നു. വേഗത്തിൽ ചാർജ് ആകാൻ എക്‌സ്‌പ്രസ് ചാർജ് ബാറ്ററിയെ അനുവദിക്കുന്നതിനാൽ ബാറ്ററി പെട്ടന്ന് പൂർണ്ണ ചാർജ് ആകുന്നു. ഓരോ ദിവസവും സിസ്‌റ്റം ഏറ്റവുമധികം ഉപയോഗിക്കുന്ന സമയം, ആരംഭ സമയവും സമയ ദൈർഘ്യവും അനുസരിച്ച് വ്യക്തമാക്കുന്നു.
 
           ഈ നയം ശരി എന്ന് സജ്ജീകരിക്കുകയും DeviceAdvancedBatteryChargeModeDayConfig സജ്ജീകരിക്കുകയും ചെയ്‌താൽ, ഉപകരണത്തിൽ പിന്തുണയ്‌ക്കുമെങ്കിൽ വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് എല്ലായ്‌പ്പോഴും പ്രവർത്തനക്ഷമമായിരിക്കും.
 
           ഈ നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചാൽ, വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് എല്ലായ്‌പ്പോഴും പ്രവർത്തനരഹിതമായിരിക്കും.
 
-          ഈ നയം സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് ഇത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല.
+          ഈ നയം സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല.
 
           ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് പ്രവർത്തനരഹിതമാകും, ഉപയോക്താക്കൾക്ക് അത് പ്രവർത്തനക്ഷമമാക്കാൻ കഴിയുകയുമില്ല.</translation>
 <translation id="6972540544240464302">ടാസ്ക്ക് ഷെഡ്യൂളർ കോൺഫിഗറേഷൻ തിരഞ്ഞെടുക്കുക</translation>
@@ -3263,9 +3151,9 @@
       ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമോ പ്രവർത്തനരഹിതമോ ആക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് ഇത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല.
 
       ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, അൺലോക്ക് ചെയ്യുന്നതിന് പാസ്‌വേഡ് ആവശ്യപ്പെടണോ വേണ്ടയോ എന്നത് ഉപയോക്താവിന് തിരഞ്ഞെടുക്കാനാകും.</translation>
-<translation id="7107148737865880402">USB പവർ പങ്കിടൽ പവർ മാനേജ്‌മെന്റ് നയം പ്രവർത്തനക്ഷമമാക്കുക.
+<translation id="7107148737865880402">USB പവർ പങ്കിടൽ പവർ മാനേജ്‌മെൻ്റ് നയം പ്രവർത്തനക്ഷമമാക്കുക.
 
-          ചില ഉപകരണങ്ങൾക്ക് ലൈറ്റ്‍നിംഗ് ബോൾട്ട് അല്ലെങ്കിൽ ബാറ്ററി ഐക്കൺ ഉപയോഗിച്ച് അടയാളപ്പെടുത്തിയ പ്രത്യേക USB പോർട്ടുകളുണ്ടാകും. സിസ്റ്റം ബാറ്ററിയിൽനിന്ന് മൊബൈൽ ഫോൺ പോലുള്ള ഉപകരണങ്ങൾ ചാർജ് ചെയ്യാൻ ഇത് ഉപയോഗിക്കാം. സിസ്‌റ്റം സ്ലീപ്പ്, ഷട്ട് ഡൗൺ മോഡുകളിൽ ആയിരിക്കുമ്പോൾ ഈ പോർട്ടിന്റെ ചാർജിംഗ് രീതിയെ ഈ നയം ബാധിക്കുന്നു. സിസ്‌റ്റം സജീവമായിരിക്കുമ്പോൾ മറ്റ് USB പോർട്ടുകളെയും ചാർജിംഗ് രീതിയെയും ഈ നയം ബാധിക്കില്ല.
+          ചില ഉപകരണങ്ങൾക്ക് ലൈറ്റ്‍നിംഗ് ബോൾട്ട് അല്ലെങ്കിൽ ബാറ്ററി ഐക്കൺ ഉപയോഗിച്ച് അടയാളപ്പെടുത്തിയ പ്രത്യേക USB പോർട്ടുകളുണ്ടാകും. സിസ്റ്റം ബാറ്ററിയിൽനിന്ന് മൊബൈൽ ഫോൺ പോലുള്ള ഉപകരണങ്ങൾ ചാർജ് ചെയ്യാൻ ഇത് ഉപയോഗിക്കാം. സിസ്‌റ്റം സ്ലീപ്പ്, ഷട്ട് ഡൗൺ മോഡുകളിൽ ആയിരിക്കുമ്പോൾ ഈ പോർട്ടിൻ്റെ ചാർജിംഗ് രീതിയെ ഈ നയം ബാധിക്കുന്നു. സിസ്‌റ്റം സജീവമായിരിക്കുമ്പോൾ മറ്റ് USB പോർട്ടുകളെയും ചാർജിംഗ് രീതിയെയും ഈ നയം ബാധിക്കില്ല.
 
           സജീവമായിരിക്കുമ്പോൾ, USB പോർട്ട് എപ്പോഴും പവർ നൽകുന്നു.
 
@@ -3273,7 +3161,7 @@
 
           ഷട്ട് ഡൗൺ ആയിരിക്കുമ്പോൾ, ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപകരണം വോൾ ചാർജറിലേക്ക് പ്ലഗ് ഇൻ ചെയ്‌തിരിക്കുമ്പോൾ USB പോർട്ടിലേക്ക് പവർ നൽകും. അല്ലെങ്കിൽ പവർ നൽകില്ല.
 
-          ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ, നയം പ്രവർത്തനക്ഷമമായിരിക്കും ഉപയോക്താവിന് അത് പ്രവർത്തനരഹിതമാക്കാനാവുകയുമില്ല.</translation>
+          ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ നയം പ്രവർത്തനക്ഷമമായിരിക്കും, ഉപയോക്താവിന് അത് പ്രവർത്തനരഹിതമാക്കാനാവുകയുമില്ല.</translation>
 <translation id="7115494316187648452">അവസാന ബ്രൗസർ വിൻഡോ അടച്ചിരിക്കുമ്പോൾ OS ലോഗിനിൽ <ph name="PRODUCT_NAME" /> പ്രോസസ് ആരംഭിച്ചിട്ടുണ്ടോ എന്ന് നിർണ്ണയിക്കുകയും സജീവമായി നിലനിർത്തുന്നതിന്, എല്ലാ സെഷൻ കുക്കികളും ഉൾപ്പെടെ പശ്ചാത്തല ആപ്‌സിനെയും നിലവിലെ ബ്രൗസിംഗ് സെഷനെയും അനുവദിച്ചുകൊണ്ട്, അവസാന ബ്രൗസർ വിൻഡോ അടയ്‌ക്കുന്നവരെ പ്രവർത്തിക്കുകയും ചെയ്യുന്നു. പശ്ചാത്തല പ്രോസസ്, സിസ്‌റ്റം ട്രേയിൽ ഒരു ഐക്കൺ പ്രദർശിപ്പിക്കുന്നതിനാൽ അവിടെ നിന്നുതന്നെ അടയ്ക്കാം.
 
       ഈ നയം ശരി എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, പശ്ചാത്തല മോഡ് പ്രവർത്തനക്ഷമമാകും എന്നാൽ പിന്നീട് ബ്രൗസർ ക്രമീകരണത്തിൽ ഉപയോക്താവിന് ഇത് നിയന്ത്രിക്കാൻ കഴിയുകയില്ല.
@@ -3620,7 +3508,7 @@
 <translation id="7712109699186360774">ഒരു സൈറ്റിന് എന്‍റെ ക്യാമറ കൂടാതെ/അല്ലെങ്കിൽ മൈക്രോഫോൺ ആക്‌സസ് ചെയ്യണമെന്നുള്ളപ്പോഴെല്ലാം ചോദിക്കുക</translation>
 <translation id="7713608076604149344">ഡൗൺലോഡ് നിയന്ത്രണങ്ങൾ</translation>
 <translation id="7715711044277116530">അവതരണ മോഡിൽ സ്‌ക്രീൻ മങ്ങുന്നതിന്റെ കാലതാമസം സ്‌കെയിൽ ചെയ്യുന്നതനുസരിച്ചുള്ള ശതമാനം</translation>
-<translation id="7716781462866245042">വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് ദിന കോൺഫിഗറേഷൻ സജ്ജീകരിക്കുക.
+<translation id="7716781462866245042">വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് ദിന കോൺഫിഗറേഷൻ സജ്ജീകരിക്കുക
 
           DeviceAdvancedBatteryChargeModeEnabled ശരി എന്ന് സജ്ജീകരിച്ചാൽ മാത്രമേ ഈ നയം ഉപയോഗിക്കൂ.
 
@@ -3734,7 +3622,7 @@
 <translation id="7941975817681987555">ഒരു നെറ്റ്‌വർക്ക് കണക്ഷനിലും നെറ്റ്‌വർക്ക് പ്രവർത്തനങ്ങൾ മുൻകൂട്ടി നൽകരുത്</translation>
 <translation id="7952007677054834789">പേജുകൾ <ph name="PRODUCT_NAME" /> എന്നതിലെ ഡിഫോൾട്ട് ഹോം പേജിലും പുതിയ ഡിഫോൾട്ട് ടാബ് പേജിലും ആരംഭത്തിൽ ലോഡ് ആകാനും ഉപയോക്താക്കൾ അത് മാറ്റുന്നതിൽ നിന്ന് തടയുന്നതിനും കോൺഫിഗർ ചെയ്യുക.
 
-      ഹോം പേജാക്കുന്നതിന് നിങ്ങൾ ഒരു പുതിയ ടാബ് പേജ് തിരഞ്ഞടുക്കുകയോ ഒരു URL ആയി സജ്ജീകരിക്കുകയും ഒപ്പം ഒരു ഹോം പേജ് URL വ്യക്‌തമാക്കുകയോ ചെയ്‌താൽ മാത്രമെ ഉപയോക്താവിന്റെ ഹോം പേജ് ക്രമീകരണം പൂർണ്ണമായും ലോക്ക് ഡൗൺ ആകുകയുള്ളു. ഹോം പേജ് URL വ്യക്തമാക്കുന്നില്ലെങ്കിൽ, 'chrome://newtab' എന്നത് വ്യക്‌തമാക്കിക്കൊണ്ട് ഉപയോക്താവിന് പുതിയ ടാബ് പേജിൽ ഹോം പേജ് ക്രമീകരിക്കാനാവും.
+      ഹോം പേജാക്കുന്നതിന് നിങ്ങൾ ഒരു പുതിയ ടാബ് പേജ് തിരഞ്ഞെടുക്കുകയോ ഒരു URL ആയി സജ്ജീകരിക്കുകയും ഒപ്പം ഒരു ഹോം പേജ് URL വ്യക്‌തമാക്കുകയോ ചെയ്‌താൽ മാത്രമേ ഉപയോക്താവിൻ്റെ ഹോം പേജ് ക്രമീകരണം പൂർണ്ണമായും ലോക്ക് ഡൗൺ ആകുകയുള്ളു. ഹോം പേജ് URL വ്യക്തമാക്കുന്നില്ലെങ്കിൽ, 'chrome://newtab' എന്നത് വ്യക്‌തമാക്കിക്കൊണ്ട് ഉപയോക്താവിന് പുതിയ ടാബ് പേജിൽ ഹോം പേജ് ക്രമീകരിക്കാനാവും.
 
       'ആരംഭ പ്രവർത്തനത്തിലെ' 'URL-കളുടെ ലിസ്‌റ്റ് തുറക്കുക' എന്നത് നിങ്ങൾ തിരഞ്ഞെടുത്തിട്ടില്ലെങ്കിൽ 'ആരംഭത്തിൽ തുറക്കേണ്ട URLകൾ' എന്ന നയം അവഗണിക്കപ്പെടും.</translation>
 <translation id="7952958573604504839"><ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" /> എന്നതിനായി M48-ൽ ഈ നയം അവസാനിപ്പിക്കുകയും M54-ൽ നിന്ന് നീക്കംചെയ്യുകയും ചെയ്തു.
@@ -4240,29 +4128,6 @@
       SAML ഉപയോഗിച്ച് പ്രാമാണീകരിച്ച ഉപയോക്താക്കൾക്ക് മാത്രമേ ഈ നയം ബാധകമാകൂ. 
 
       ഈ നയത്തിന്റെ മൂല്യം സെക്കൻഡിൽ വ്യക്തമാക്കണം.</translation>
-<translation id="9027787254195333560">ഈ നയം ലോഗിൻ സ്‌ക്രീനിലെ ഉപയോക്താവിനെ പ്രതിനിധീകരിക്കുന്ന അവതാർ ചിത്രത്തെ കോൺഫിഗർ ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു. അവതാർ ചിത്രം ഡൗൺലോഡ് ചെയ്യാനാകുന്ന <ph name="PRODUCT_OS_NAME" /> എന്നതിൽ നിന്നും ഡൗൺലോഡിന്റെ സമഗ്രത പരിശോധിച്ചുറപ്പിക്കുന്നതിന് ഉപയോഗിക്കുന്ന ഒരു ഗൂഢഭാഷ ഹാഷിൽ നിന്നുമുള്ള URL വ്യക്തമാക്കിയാണ് ഈ നയം സജ്ജീകരിക്കുന്നത്. ചിത്രം JPEG ഫോർമാറ്റിലുള്ളതും, 512kB യിൽ കൂടുതൽ വലുപ്പത്തിലുള്ളതുമായിരിക്കണം. ഏതൊരു പരിശോധിച്ചുറപ്പിക്കലും ഇല്ലാതെ തന്നെ URL ആക്‌സസ് ചെയ്യാവുന്നതായിരിക്കണം. 
-
-      അവതാർ ചിത്രം ഡൗൺലോഡ് ചെയ്‌ത് കാഷെ ചെയ്‌തു. URL അല്ലെങ്കിൽ ഹാഷ് മാറുമ്പോഴൊക്കെ അത് വീണ്ടും ഡൗൺലോഡ് ചെയ്യും. 
-
-      ഈ നയം, URL-നെ സൂചിപ്പിക്കുന്ന സ്ട്രിംഗ് ആയും ഹാഷിനെ JSON ഫോർമാറ്റിലും ഇനിപ്പറയുന്ന സ്കീമയ്ക്കനുസരിച്ച് വ്യക്തമാക്കണം: 
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "അവതാർ ചിത്രം ഡൗൺലോഡ് ചെയ്യാനാകുന്ന URL.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "അവതാർ ചിത്രത്തിന്റെ SHA-256 ഹാഷ്.",
-            "type": "string"
-          }
-        }
-      }
-      ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> അവതാർ ചിത്രം ഡൗൺലോഡ് ചെയ്ത് ഉപയോഗിക്കും.
-
-      നിങ്ങൾ ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല.
-
-      ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഉപയോക്താവിന് അവരെ ലോഗിൻ സ്‌ക്രീനിൽ പ്രതിനിധീകരിക്കുന്ന അവതാർ ചിത്രം തിരഞ്ഞെടുക്കാനാവും.</translation>
 <translation id="9035964157729712237">അനുമതിയില്ലാത്ത ലിസ്റ്റില്‍ നിന്ന് ഒഴിവാക്കാനുള്ള വിപുലീകരണ ID-കള്‍</translation>
 <translation id="9038058011835642205">ഉപയോക്താക്കളുടെ ഇടപെടൽ ഇല്ലാതെ, അവർ അറിയാതെ ഇൻസ്‌റ്റാൾ ചെയ്യുന്ന വെബ്‌സൈറ്റുകളുടെ ഒരു ലിസ്‌റ്റ് വ്യക്തമാക്കുന്നു, ഇവ ഉപയോക്താക്കൾക്ക് അൺഇൻസ്‌റ്റാൾ ചെയ്യാനോ പ്രവർത്തനരഹിതമാക്കാനോ കഴിയില്ല.
 
@@ -4275,7 +4140,6 @@
       നിങ്ങൾ ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് അത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല. 
 
       നയ മൂല്യം മില്ലിസെക്കൻഡുകളിലായിരിക്കണം. മൂല്യങ്ങൾ 30 സെക്കൻഡ് മുതൽ 24 മണിക്കൂർ വരെയുള്ള ശ്രേണിയിലാക്കിയിരിക്കുന്നു.</translation>
-<translation id="9042911395677044526">ഒരു <ph name="PRODUCT_OS_NAME" /> ഉപകരണത്തിലെ ഓരോ ഉപയോക്താവിനും ബാധകമാക്കുന്നതിന് നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷനെ പ്രേരിപ്പിക്കുന്നതിന് അനുവദിക്കുന്നു. <ph name="ONC_SPEC_URL" /> എന്നതിൽ വിവരിച്ചിരിക്കുന്ന ഓപ്പൺ നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ ഫോർമാറ്റ് നിർവചിച്ചിരിക്കുന്നത് പോലുള്ള ഒരു JSON-ഫോർമാറ്റുള്ള സ്‌ട്രിംഗാണ് നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ.</translation>
 <translation id="9050853837490399534">ഉപകരണം ഒരു Quick Fix Build-ലേക്ക് അപ്‌ഡേറ്റ് ചെയ്യണോ വേണ്ടയോ എന്ന് ഈ നയം നിയന്ത്രിക്കുന്നു.
 
       ഒരു Quick Fix Build-ലേക്ക് മാപ്പ് ചെയ്യുന്ന ഒരു ടോക്കൺ ആയാണ് നയ മൂല്യം സജ്ജീകരിച്ചിരിക്കുന്നതെങ്കിൽ, അപ്‌ഡേറ്റിനെ മറ്റൊരു നയം ബ്ലോക്ക് ചെയ്യുന്നില്ലെങ്കിൽ ബന്ധപ്പെട്ട Quick Fix Build-ലേക്ക് ഉപകരണം അപ്‌ഡേറ്റ് ചെയ്യപ്പെടും.
@@ -4355,17 +4219,6 @@
       നയം 'തെറ്റ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, 'തലക്കെട്ടുകളും അടിക്കുറിപ്പുകളും' അച്ചടി പ്രിവ്യൂ ഡയലോഗിൽ തിരഞ്ഞെടുക്കപ്പെടില്ല, ഉപയോക്താവിന് അത് മാറ്റാനുമാവില്ല.
 
       നയം 'ശരി' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, 'തലക്കെട്ടുകളും അടിക്കുറിപ്പുകളും' അച്ചടി പ്രിവ്യൂ ഡയലോഗിൽ തിരഞ്ഞെടുക്കപ്പെടും, ഉപയോക്താവിന് അത് മാറ്റാനുമാവില്ല.</translation>
-<translation id="9213347477683611358">ഉപകരണത്തിൽ ഇതുവരെ ഉപയോക്താവ് സൈൻ ഇൻ ചെയ്‌തിട്ടില്ലെങ്കിൽ ലോഗിൻ സ്‌ക്രീനിൽ കാണിച്ചിരിക്കുന്ന ഉപകരണ-ലെവൽ വാൾപേപ്പർ ചിത്രം കോൺഫിഗർ ചെയ്യുക. ഡൗൺലോഡിന്റെ സമഗ്രത പരിശോധിച്ചുറപ്പിക്കുന്നതിന് ഉപയോഗിക്കുന്ന വാൾ‌പേപ്പർ ചിത്രവും ഗൂഢഭാഷാ ഹാഷും ഡൗൺലോഡ് ചെയ്യാനാവുന്ന Chrome OS ഉപകരണത്തിൽ നിന്ന് URL വ്യക്തമാക്കിക്കൊണ്ട് നയം സജ്ജമാക്കിയിരിക്കുന്നു. ചിത്രം JPEG ഫോർമാറ്റിൽ ആയിരിക്കണം, അതിന്റെ ഫയൽ വലുപ്പം 16MB-യിൽ കൂടുകയുമരുത്. URL പരിശോധിച്ചുറപ്പിക്കാതെ തന്നെ ആക്‌സസ് ചെയ്യാൻ കഴിയുന്നതായിരിക്കണം. വാൾപേപ്പർ ചിത്രം ഡൗൺലോഡ് ചെയ്‌ത് കാഷെ ചെയ്‌തതാണ്. URL അല്ലെങ്കിൽ ഹാഷ് മാറുമ്പോഴെല്ലാം അത് വീണ്ടും ഡൗൺലോഡ് ചെയ്യപ്പെടും.
-
-      URL, ഹാഷ് എന്നിവ JSON ഫോർമാറ്റിൽ ആണെന്ന് സൂചിപ്പിക്കുന്ന ഒരു സ്‌ട്രിംഗായി നയത്തെ വ്യക്തമാക്കിയിരിക്കണം, ഉദാ,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      ഉപകരണ വാൾപേപ്പർ നയം സജ്ജമാക്കിയിരിക്കുകയാണെങ്കിൽ, ഉപകരണത്തിൽ ഇതുവരെ ഉപയോക്താവ് സൈൻ ഇൻ ചെയ്‌തിട്ടില്ലെങ്കിൽ Chrome OS ഉപകരണം, ലോഗിൻ സ്‌ക്രീനിലുള്ള വാൾപേപ്പർ ചിത്രം ഡൗൺലോഡ് ചെയ്‌ത് ഉപയോഗിക്കും. ഉപയോക്താവ് ലോഗിൻ ചെയ്‌തയുടൻ തന്നെ ഉപയോക്താവിന്റെ നയം പ്രാബല്യത്തിൽ വരും.
-
-      ഉപകരണ വാൾപേപ്പർ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, ഉപയോക്താവിന്റെ വാൾപേപ്പർ സജ്ജമാക്കുകയാണെങ്കിൽ എന്താണ് ദൃശ്യമാക്കേണ്ടത് എന്ന് തീരുമാനിക്കുന്നത് ഉപയോക്താവിന്റെ വാൾപേപ്പർ നയമാണ്.</translation>
 <translation id="9217154963008402249">നെറ്റ്‌വർക്ക് പാക്കറ്റുകളുടെ നിരീക്ഷണ ഇടവേള</translation>
 <translation id="922540222991413931">വിപുലീകരണം, അപ്ലിക്കേഷൻ, ഉപയോക്തൃ സ്‌ക്രിപ്റ്റ് ഇൻസ്റ്റാൾ ഉറവിടങ്ങൾ എന്നിവ കോൺഫിഗർ ചെയ്യുക</translation>
 <translation id="924557436754151212">ആദ്യ റൺ ചെയ്യലിലെ ഡിഫോൾട്ട് ബ്രൗസറിൽ നിന്നുമുള്ള സംരക്ഷിച്ച പാസ്‌വേഡുകൾ ഇംപോർട്ട് ചെയ്യുക</translation>
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index db890ef2..de1eba8a 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -389,7 +389,6 @@
 
       चेतावणी: <ph name="PRODUCT_OS_NAME" /> आवृत्तीचे नियंत्रण कियोस्क अॅपला देणे कदाचित डिव्हाइसला सॉफ्टवेअर अपडेट आणि गंभीर सुरक्षा निराकरणे मिळवण्यापासून प्रतिबंधित करू शकत असल्याने तसे करण्‍याची शिफारस केली जात नाही. <ph name="PRODUCT_OS_NAME" /> आवृत्तीचे नियंत्रण दिल्यामुळे वापरकर्त्यांना कदाचित धोका असू शकतो.</translation>
 <translation id="1675002386741412210">यावर समर्थित:</translation>
-<translation id="1689963000958717134">एका <ph name="PRODUCT_OS_NAME" /> डिव्हाइसच्या सर्व वापरकर्त्यांना लागू केले जाण्याची पुशिंग नेटवर्क कॉन्फिगरेशन अनुमती देते. नेटवर्क कॉन्फिगरेशन ही <ph name="ONC_SPEC_URL" /> येथे वर्णन केलेल्या खुले नेटवर्क कॉन्फिगरेशननुसार परिभाषित केलेल्या रुपात असलेली JSON-स्वरूपन केलेली स्ट्रिंग आहे</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> फर्मवेयर अपडेट कार्यक्षमतेची उपलब्धता आणि वर्तन कॉन्फिगर करते.
 
       वैयक्तिक सेटिंग्ज JSON गुणधर्मांमध्ये नमूद केली जाऊ शकतात:
@@ -937,16 +936,6 @@
       हे सेटिंग अक्षम असल्यास, वेब पेज JavaScript वापरू शकत नाहीत आणि वापरकर्ता ते सेटिंग बदलू शकत नाही.
 
       हे सेटिंग सक्षम असल्यास किंवा सेट नसल्यास, वेब पेज JavaScript वापरू शकतात परंतु वापरकर्ता ते सेटिंग बदलू शकतो.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> साठी एक्स्टेंशन व्यवस्थापन सेटिंग्ज कॉन्फिगर करते.
-
-          हे धोरण कोणत्याही सद्य एक्स्टेंशन संबंधित धोरणांनी नियंत्रित केलेल्या सेटिंग्जसह एकाहून अधिक सेटिंग्ज नियंत्रित करते. दोन्ही सेट केलेली असल्यास हे धोरण कोणतीही लेगसी धोरणे ओव्हरराइड करेल.
-
-          हे धोरण त्याच्या कॉन्फिगरेशनवर एक्स्टेंशन आयडी किंवा अपडेट URL मॅप करते. एक्स्टेंशन आयडीसोबत, कॉन्फिगरेशन फक्त नमूद केलेल्या एक्स्टेंशननाच लागू केले जाईल. विशेष आयडी <ph name="DEFAULT_SCOPE" /> साठी डीफॉल्ट कॉन्फिगरेशन सेट केले जाऊ शकते, जे या धोरणामध्ये कस्टम कॉन्फिगरेशन सेट केलेले नसलेल्या सर्व एक्स्टेंशनना लागू होईल. <ph name="LINK_TO_EXTENSION_DOC1" /> येथे वर्णन केल्याप्रमाणे, अपडेट URL सोबत, या एक्स्टेंशनच्या मॅनिफेस्टमध्ये नमूद केलेली नेमकी अपडेट URL असलेल्या सर्व एक्स्टेंशनना कॉन्फिगरेशन लागू केले जाईल.
-
-          <ph name="MS_AD_NAME" /> डोमेनसोबत न जोडलेल्या Windows इंस्टंससाठी, सक्तीचे इंस्टॉलेशन Chrome वेब स्टोअर मध्ये सूचीबद्ध केलेल्या अ‍ॅप्स आणि एक्स्टेंशनपर्यंत मर्यादित आहे.
-
-          या धोरणाची संभाव्य सेटिंग्ज आणि रचनेच्या संपूर्ण वर्णनासाठी कृपया https://www.chromium.org/administrators/policy-list-3/extension-settings-full येथे भेट द्या
-          </translation>
 <translation id="2753637905605932878">WebRTC ने वापरलेल्या स्थानिक UDP पोर्टची वर्गवारी प्रतिबंधित करा</translation>
 <translation id="2757054304033424106">इंस्टॉल केले जाण्यासाठी अनुमती असलेल्या विस्तार/अ‍ॅप्सचे प्रकार</translation>
 <translation id="2758084448533744848">डिव्हाइससाठी वापरला जाणारा लागू केलेला टाइमझोन नमूद करते. हे धोरण सेट केले असल्यास, डिव्हाइसवरील वापरकर्ते नमूद केलेला टाइमझोन ओव्हरराइड करू शकत नाहीत. चुकीचे मूल्य पुरवले गेल्यास, त्याऐवजी "GMT" वापरून धोरण तरीही अ‍ॅक्टिव्हेट केले जाऊ शकते. रिकामी स्ट्रिंग पुरवली गेल्यास, धोरणाकडे दुर्लक्ष केले जाते.
@@ -1720,28 +1709,6 @@
 हे धोरण केवळ SAML द्वारे ऑथेंटिकेट होणाऱ्या वापरकर्त्यांवर परिणाम करते.</translation>
 <translation id="4105989332710272578">URL च्या सूचीसाठी प्रमाणपत्र पारदर्शकता अंमलबजावणी अक्षम करा</translation>
 <translation id="4121350739760194865">ॲप्लिकेशन जाहिरातींना नवीन टॅब पेजवर दिसण्यापासून प्रतिबंधित करा</translation>
-<translation id="4125606414556046117">हे धोरण तुम्हाला डेस्कटॉपवर दैखवण्यात आलेली वॉलपेपर इमेज आणि वापरकर्त्यासाठी लॉगइन स्क्रीन पार्श्वभूमी कॉन्फिगर करू देते. हे धोरण एक URL नमूद करून सेट करण्यात आले आहे जेथून <ph name="PRODUCT_OS_NAME" /> वॉलपेपर इमेज डाउनलोड करू शकते आणि डाउनलोडच्या अखंडतेची पडताळणी करण्यासाठी एक क्रिप्टोग्राफिक हॅश वापरला जातो. इमेज JPEG स्वरूपात असली पाहिजे, तिचा आकार १६MBपेक्षा मोठा नसावा. URL ऑथेंटिकेशनाशिवाय अॅक्सेस करण्यायोग्य असावी.
-
-      वॉलपेपर इमेज डाउनलोड आणि कॅशे करा  केली जाते. URL किंवा हॅश बदलतो तेव्हा ती पुन्हा डाउनलोड केली जाईल.
-
-      पुढील स्कीमाची खात्री करून SON स्वरूपात URL आणि हॅश व्यक्त करणारी स्ट्रिंग म्हणून धोरण नमूद केले जावे:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL जिच्यावरून वॉलपेपर इमेज डाऊनलोड केली जाऊ शकते.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "वॉलपेपर इमेजचा SHA-256 हॅश.", "type": "string"
-          }
-        }
-      }
-
-     हे धोरण सेट केले असल्यास, <ph name="PRODUCT_OS_NAME" /> वॉलपेपर इमेज डाउनलोड करून तिचा वापर करेल.
-
-      तुम्ही हे धोरण सेट केल्यास, वापरकर्ते त्यास बदलू किंवा ओव्हरराइड करू शकणार नाहीत.
-      हे धोरण सेट न करता सोडल्यास, वापरकर्ता डेस्कटॉपवर दाखवण्यासाठी एक इमेज निवडू आणि स्क्रीन पार्शवभूमीमध्ये लॉगइन करू शकतो.</translation>
 <translation id="412697421478384751">लॉक स्क्रीन पिन करिता वापरकर्त्यांना सोपे पिन सेट करण्याची अनुमती देते</translation>
 <translation id="4138655880188755661">वेळमर्यादा</translation>
 <translation id="4144164749344898721">हे धोरण वापरकर्ता निष्क्रिय होतो तेव्हा ऊर्जा व्यवस्थापन योजनेसाठी एकाहून अधिक सेटिंग्ज नियंत्रित करते.
@@ -2690,53 +2657,6 @@
 
       हे धोरण सेट केले नसल्यास किंवा चुकीचे सेट केले असल्यास, प्रिंट आज्ञा प्रिंट पूर्वावलोकन स्क्रीन ट्रिगर करते.</translation>
 <translation id="6022948604095165524">स्टार्टअपच्या वेळची क्रिया</translation>
-<translation id="6023030044732320798">ARC रनटाइमला दिला जाणारा धोरणांचा संच नमूद करते. हे मूल्य वैध JSON असणे आवश्यक आहे.
-
-      हे धोरण डिव्हाइसवर कोणती Android अ‍ॅप्स आपोआप इंस्टॉल केली जावीत ते कॉन्फिगर करण्यासाठी वापरले जाऊ शकते:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android अ‍ॅप आयडेंटिफायर, उदा. Gmail साठी "com.google.android.gm"',
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "अ‍ॅप कसे इंस्टॉल केले जावे ते नमूद करते. OPTIONAL: अ‍ॅप आपोआप इंस्टॉल केले जात नाही, परंतु वापरकर्ता ते इंस्टॉल करू शकतो. हे धोरण नमूद केलेले नसल्यास हे डीफॉल्ट आहे. PRELOAD: अ‍ॅप आपोआप इंस्टॉल केले जाते, परंतु वापरकर्ता ते अनइंस्टॉल करू शकतो. FORCE_INSTALLED: अ‍ॅप आपोआप इंस्टॉल केले जाते आणि वापरकर्ता ते अनइंस्टॉल करू शकत नाही. BLOCKED: अ‍ॅप ब्लॉक केलेले असते आणि इंस्टॉल केले जाऊ शकत नाही. अ‍ॅप मागील धोरणाअंतर्गत इंस्टॉल केलेले असल्यास ते अनइंस्टॉल केले जाईल.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "अ‍ॅप्सना परवानगी विनंत्या देण्यासाठी धोरण. PERMISSION_POLICY_UNSPECIFIED: धोरण नमूद केलेले नाही. कोणत्याही पातळीवर परवानगीसाठी कोणतेही धोरण नमूद केलेले नसल्यास, बाय डीफॉल्ट `PROMPT` वर्तणूक वापरली जाते. PROMPT: वापरकर्त्याला परवानगी देण्याच्या सूचना देतात. GRANT: आपोआप परवानगी देतात. DENY: आपोआप परवानगी नाकारतात.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "की-मूल्य जोड्यांच्या संचासह अ‍ॅप-विशिष्ट JSON कॉन्फिगरेशन ऑब्जेक्ट, उदा. '"managedConfiguration": { "key1": value1, "key2": value2 }'. अ‍ॅप मॅनिफेस्टमध्ये कींची व्याख्या केलेली आहे.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      अ‍ॅप्सना लाँचरला पिन करण्यासाठी, PinnedLauncherApps पहा.</translation>
 <translation id="602728333950205286">डीफॉल्ट शोध प्रदाता झटपट URL</translation>
 <translation id="603410445099326293">POST वापरणार्‍या URL सूचित करण्यासाठी प्राचल</translation>
 <translation id="6034341625190551415">सार्वजनिक सेशन आणि किऑस्क खात्यांचे प्रकार नियंत्रित करते.</translation>
@@ -3065,37 +2985,6 @@
       हे धोरण असत्य वर सेट केलेले असल्यास, बिल्ट-इन DNS क्लायंट कधीही वापरला जाणार नाही.
 
       हे धोरण सेट न केलेले ठेवल्यास, बिल्ट-इन DNS क्लायंट बाय डीफॉल्ट MacOS, Android (खाजगी DNS किंवा VPN सुरू केलेले नसतील तेव्हा) आणि ChromeOS वर सुरू केला जाईल आणि वापरकर्त्याला chrome://flags संपादित करून किंवा कमांड-लाइन फ्लॅग नमूद करून बिल्ट-इन DNS क्लायंट बदलता येईल.</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> डीफॉल्ट प्रिंटर निवड नियम ओव्हरराइड करते.
-
-      हे धोरण <ph name="PRODUCT_NAME" /> मध्ये डीफॉल्ट प्रिंटर निवडण्यासाठी नियम निर्धारित करते, जे प्रोफाइलसोबत पहिल्या वेळी प्रिंट कार्य वापरताना घडते.
-
-      हे धोरण सेट केलेले असताना, <ph name="PRODUCT_NAME" /> सर्व नमूद विशेषतांशी जुळणारा प्रिंटर शोधण्याचा प्रयत्न करेल आणि तो डीफॉल्ट प्रिंटर म्हणून निवडेल. धोरणाशी जुळणारा पहिला प्रिंटर निवडला जातो, युनिक नसलेल्या जुळणीच्या बाबतीत, प्रिंटर ज्या क्रमाने शोधले जातात त्यावर अवलंबून, कोणताही जुळणारा प्रिंटर निवडला जाऊ शकतो.
-
-      हे धोरण सेट केलेले नसल्यास किंवा टाइमआउटच्या आत जुळणारा प्रिंटर न सापडल्यास, प्रिंटर बिल्ट-इन पीडीएफ प्रिंटरवर डीफॉल्ट होतो किंवा, पीडीएफ प्रिंटर उपलब्ध नसताना, कोणताही प्रिंटर निवडला जात नाही.
-
-      मूल्य JSON ऑब्जेक्ट म्हणून पार्स केले जाते, जे पुढील स्कीमाचे पालन करते:
-      {
-        "प्रकार": "ऑब्जेक्ट",
-        "गुणधर्म": {
-          "प्रकार": {
-            "वर्णन": "जुळणाऱ्या प्रिंटरचा शोध प्रिंटरच्या विशिष्ट संचापर्यंत मर्यादित करायचा का.",
-            "प्रकार": "स्ट्रिंग",
-            "enum": [ "स्थानिक", "क्लाउड" ]
-          },
-          "idPattern": {
-            "वर्णन": "प्रिंटर आयडीशी जुळण्यासाठी नियमित एक्स्प्रेशन.",
-            "type": "string"
-          },
-          "namePattern": {
-            "वर्णन": "प्रिंटर डिस्प्ले नावाशी जुळण्यासाठी रेग्युलर एक्स्प्रेशन.",
-            "प्रकार": "स्ट्रिंग"
-          }
-        }
-      }
-
-      <ph name="CLOUD_PRINT_NAME" /> शी कनेक्ट केलेले प्रिंटर <ph name="PRINTER_TYPE_CLOUD" /> समजले जातात, बाकीच्या प्रिंटरचे वर्गीकरण <ph name="PRINTER_TYPE_LOCAL" /> म्हणून केले जाते.
-      एखादे फील्ड वगळणे म्हणजे सर्व मूल्ये जुळतात, उदाहरणार्थ, कनेक्टिव्हिटी नमूद न केल्याने प्रिंट पूर्वावलोकन सर्व प्रकारच्या, स्थानिक आणि क्लाउड, प्रिंटरचा शोध सुरू करेल.
-      रेग्युलर एक्स्प्रेशन पॅटर्ननी JavaScript RegExp सिंटॅक्स फॉलो करणे आवश्यक आहे आणि जुळण्या केस सेन्सिटिव्ह असतात.</translation>
 <translation id="6843296367238757293">हे धोरण कालबाह्य झाले आहे. त्याच्या वापराला प्रोत्साहन दिले जात नाही. https://support.google.com/chrome/a/answer/7643500 येथे अधिक वाचा</translation>
 <translation id="684856667300805181"><ph name="PRODUCT_NAME" /> ६८ मध्ये हे धोरण काढले गेले आणि <ph name="ARC_GLS_POLICY_NAME" /> ने बदलले गेले.</translation>
 <translation id="6856743875250214792">या धोरणाची मुदत संपली आहे आणि M66 मधून काढले आहे, कारण ते फक्त अंतर्गत चाचणीसाठी वापरले होते आणि ते सुरक्षितता दायित्व आहे.
@@ -4219,30 +4108,6 @@
       हे धोरण केवळ SAML वापरून प्रमाणित केलेल्या वापरकर्त्यांना प्रभावित करते.
 
       या धोरणाचे मूल्य सेकंदांमध्ये नमूद केले जावे.</translation>
-<translation id="9027787254195333560">हे धोरण तुम्हाला लॉगिन स्क्रीनवरील वापरकर्त्याचे प्रतिनिधित्व करणारी अवतार इमेज कॉन्फिगर करू देते. हे धोरण ती URL नमूद करुन सेट केलेले आहे ज्यावरुन <ph name="PRODUCT_OS_NAME" /> अवतार इमेज डाउनलोड केली जाऊ शकते आणि डाउनलोडच्या अखंडत्वाची पडताळणी करण्यासाठी एका क्रिप्टोग्राफिक हॅशचा वापर केला जातो. इमेज JPEG स्वरुपात असावी, तिचा आकार ५१२kB पेक्षा मोठा नसावा. URL कोणत्याही ऑथेंटिकेशनशिवाय अॅक्सेसयोग्य असावी.
-
-      अवतार इमेज डाउनलोड आणि कॅशे करा केली आहे. URL किंवा हॅश बदलल्यावर ती पुन्हा डाउनलोड केली जाईल.
-
-      धोरण एक स्ट्रिंग म्हणून नमूद केले जावे जी खालील स्कीमाची खात्री करणाऱ्या JSON स्वरुपात URL आणि हॅश व्यक्त करते:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL जिच्यावरून अवतार इमेज डाउनलोड केली जाऊ शकते.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "अवतार इमेजचा SHA-256 हॅश.",
-            "type": "string"
-          }
-        }
-      }
-
-      हे धोरण सेट केले असल्यास, <ph name="PRODUCT_OS_NAME" /> अवतार इमेज डाउनलोड करून ती वापरेल.
-
-      तुम्ही हे धोरण सेट केल्यास, वापरकर्ते यास बदलू किंवा ओव्हरराइड करू शकत नाहीत.
-
-      धोरण सेट न करता सोडल्यास वापरकर्ता लॉग इन स्क्रीनवर त्याचे/तिचे प्रतिनिधित्व करणारी अवतार इमेज निवडू शकतो.</translation>
 <translation id="9035964157729712237">ब्लॅकलिस्टमधून मुक्त करण्याचा एक्स्टेंशन आयडी</translation>
 <translation id="9038058011835642205">सायलंट पद्धतीने, वापरकर्त्याला सूचित न करता इंस्टॉल केल्या जाणाऱ्या वेबसाइटची सूची नमूद करते जी वापरकर्ता अनइंस्टॉल करू शकत नाही किंवा बंद करू शकत नाही.
 
@@ -4255,7 +4120,6 @@
       तुम्ही हे धोरण सेट केल्यास, वापरकर्ते ते बदलू किंवा ओव्हरराइड करू शकत नाहीत.
 
       धोरण मूल्य मिलीसेकंदांमध्ये नमूद केले जावे. मूल्ये ३० सेकंद ते २४ तासांच्या श्रेणीपर्यंत पकडली जातात.</translation>
-<translation id="9042911395677044526">एका <ph name="PRODUCT_OS_NAME" /> डिव्हाइसला प्रति-वापरकर्ता पुशिंग नेटवर्क कॉन्फिगरेशन लागू केले जाण्याची अनुमती देते. नेटवर्क कॉन्फिगरेशन ही <ph name="ONC_SPEC_URL" /> येथे वर्णन केलेल्या खुले नेटवर्क कॉन्फिगरेशननुसार परिभाषित केलेल्या रुपात असलेली JSON-स्वरूपन केलेली स्ट्रिंग आहे.</translation>
 <translation id="9050853837490399534">हे धोरण डिव्हाइसला क्वीक फिक्स बिल्ड वर अपडेट करायचे की नाही ते नियंत्रित करते.
 
       धोरणाचे मूल्य क्वीक फिक्स बिल्ड इतके सेट असल्यास, इतर धोरणाने अपडेट ब्लॉक केले नाही तर डिव्हाइस संबंधित क्वीक फिक्स बिल्ड वर अपडेट करण्यात येईल.
@@ -4334,17 +4198,6 @@
 
 
       धोरण सत्यवर सेट केल्यास, प्रिंट पूर्वावलोकन डायलॉगमध्ये 'शीर्षलेख आणि तळटीप' निवडलेले असते आणि वापरकर्ता ते बदलू शकत नाही.</translation>
-<translation id="9213347477683611358">कोणत्याही वापरकर्त्याने अद्याप डिव्हाइसमध्ये साइन इन केले नसल्यास लॉगिन स्क्रीनवर दर्शविलेली डिव्हाइस-स्तराची वॉलपेपर इमेज कॉन्फिगर करा. Chrome OS डिव्हाइस ज्यावरून वॉलपेपर इमेज डाउनलोड करू शकते ती URL आणि डाउनलोडचे संकलन पडताळणी करण्‍यासाठी वापरलेला क्रिप्टोग्राफिक हॅश नमूद करून धोरण सेट केले जाते. इमेज JPEG स्वरूपात असणे आवश्‍यक आहे, तिचा फाइल आकार १६MB पेक्षा जास्त असू नये. URL कोणत्याही ऑथेंटिकेशनाशिवाय प्रवेशयोग्य असणे आवश्‍यक आहे. वॉलपेेपर इमेज डाउनलोड आणि कॅश केली जाते. URL किंवा हॅश बदलतो तेव्हा ती पुन्हा डाउनलोड केली जाईल.
-
-      JSON स्वरूपात URL आणि हॅश व्यक्त करणारी स्ट्रिंग म्हणून धोरण नमूद केले जावे, उदा.
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      डिव्हाइस वॉलपेपर धोरण सेट केले असल्यास, कोणत्याही वापरकर्त्याने अद्याप डिव्हाइसमध्ये साइन इन केले नसल्यास Chrome OS डिव्हाइस वॉलपेपर इमेज डाउनलोड करेल आणि ती लॉगिन स्क्रीन वर वापरेल. वापरकर्त्याने एकदा लॉग इन केले की, वापरकर्त्याचे वॉलपेपर धोरण वापरले जाते.
-
-      डिव्हाइस वॉलपेपर धोरण सेट न केलेले ठेवल्‍यास, वापरकर्त्याचे वॉलपेपर धोरण सेट केले असल्यास काय दर्शवावे ते वापरकर्त्याचे वॉलपेपर धोरण ठरविते.</translation>
 <translation id="9217154963008402249">नेटवर्क पॅकेटच्या परीक्षणाची वारंवारता</translation>
 <translation id="922540222991413931">एक्स्टेंशन, अॅप्लिकेशन आणि वापरकर्ता स्क्रिप्ट इंस्टॉल स्रोत कॉन्फिगर करा</translation>
 <translation id="924557436754151212">प्रथमच रन होताना डीफॉल्ट ब्राउझरमधून सेव्ह केलेले पासवर्ड इंपोर्ट करा</translation>
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index 66f3a84..24b4796 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -416,7 +416,6 @@
 
       Amaran: Anda tidak disyorkan supaya menugaskan kawalan versi <ph name="PRODUCT_OS_NAME" /> kepada apl kios kerana tindakan ini boleh menghalang peranti daripada menerima kemas kini perisian dan pembetulan keselamatan kritikal. Tindakan menugaskan kawalan versi <ph name="PRODUCT_OS_NAME" /> boleh menyebabkan pengguna terdedah kepada risiko.</translation>
 <translation id="1675002386741412210">Disokong pada:</translation>
-<translation id="1689963000958717134">Membenarkan penolakan konfigurasi rangkaian digunakan untuk semua pengguna peranti <ph name="PRODUCT_OS_NAME" />. Konfigurasi rangkaian ialah rentetan berformat JSON seperti yang ditakrifkan oleh format Konfigurasi Rangkaian Terbuka yang dihuraikan di <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Mengkonfigurasikan ketersediaan dan gelagat kefungsian kemas kini perisian tegar <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Tetapan individu boleh ditentukan dalam sifat JSON:
@@ -974,16 +973,6 @@
       Jika tetapan ini dilumpuhkan, halaman web tidak dapat menggunakan JavaScript dan pengguna tidak boleh mengubah tetapan tersebut.
 
       Jika tetapan ini didayakan atau tidak ditetapkan, halaman web boleh menggunakan JavaScript tetapi pengguna boleh mengubah tetapan tersebut.</translation>
-<translation id="2747157663401642394">Mengkonfigurasikan tetapan pengurusan sambungan untuk <ph name="PRODUCT_NAME" />.
-
-          Dasar ini mengawal berbilang tetapan, termasuk tetapan yang dikawal oleh sebarang dasar yang sedia ada berkaitan sambungan. Dasar ini akan membatalkan mana-mana dasar lama jika kedua-dua dasar ditetapkan.
-
-          Dasar ini memetakan ID sambungan atau URL kemas kini pada konfigurasi dasar. Dengan ID sambungan, konfigurasi akan digunakan pada sambungan yang ditentukan sahaja. Konfigurasi lalai boleh ditetapkan untuk ID khas <ph name="DEFAULT_SCOPE" />, yang akan digunakan pada semua sambungan yang tidak ditetapkan konfigurasi tersuai dalam dasar ini. Dengan URL kemas kini, konfigurasi akan digunakan pada semua sambungan dengan URL kemas kini tepat seperti yang dinyatakan dalam manifes sambungan ini, seperti yang diperihalkan di <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Untuk tika Windows yang tidak dihubungkan ke domain <ph name="MS_AD_NAME" />, pemasangan paksa adalah terhad kepada apl dan sambungan yang disenaraikan di Gedung Web Chrome.
-
-          Untuk mendapatkan perihalan penuh tentang tetapan dan struktur berkemungkinan dasar ini, sila lawati https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Hadkan julat port UDP setempat yang digunakan oleh WebRTC</translation>
 <translation id="2757054304033424106">Jenis sambungan/apl yang boleh dipasang</translation>
 <translation id="2758084448533744848">Menentukan zon waktu yang dikuatkuasakan, yang akan digunakan untuk peranti. Apabila dasar ini ditetapkan, pengguna pada peranti tidak boleh membatalkan zon waktu yang ditetapkan. Jika nilai tidak sah diberikan, dasar ini masih diaktifkan menggunakan "GMT". Jika rentetan kosong diberikan, dasar ini akan diabaikan.
@@ -1212,11 +1201,11 @@
       Dasar ini membolehkan pentadbir menyediakan konfigurasi pencetak untuk
       pengguna mereka.
 
-      <ph name="PRINTER_DISPLAY_NAME" /> dan <ph name="PRINTER_DESCRIPTION" /> ialah rentetan berbentuk bebas yang boleh disesuaikan untuk memudahkan pemilihan pencetak. <ph name="PRINTER_MANUFACTURER" /> dan <ph name="PRINTER_MODEL" /> berfungsi untuk memudahkan pengenalpastian pencetak oleh pengguna akhir. Maklumat ini mewakili pengeluar dan model pencetak. <ph name="PRINTER_URI" /> haruslah alamat yang boleh dihubungi daripada komputer pelanggan termasuk <ph name="URI_SCHEME" />, <ph name="URI_PORT" />dan <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> tidak diwajibkan. Jika disediakan, maklumat ini digunakan untuk membantu menyahpendua pencetak <ph name="ZEROCONF_DISCOVERY" />.
+      <ph name="PRINTER_DISPLAY_NAME" /> dan <ph name="PRINTER_DESCRIPTION" /> ialah rentetan berbentuk bebas yang boleh disesuaikan untuk memudahkan pemilihan pencetak. <ph name="PRINTER_MANUFACTURER" /> dan <ph name="PRINTER_MODEL" /> berfungsi untuk memudahkan pengenalpastian pencetak oleh pengguna akhir. Maklumat ini mewakili pengeluar dan model pencetak. <ph name="PRINTER_URI" /> haruslah alamat yang boleh dihubungi daripada komputer pelanggan termasuk <ph name="URI_SCHEME" />, <ph name="URI_PORT" />dan <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> tidak diwajibkan. Jika disediakan, maklumat ini digunakan untuk membantu pentadbir menyahpendua pencetak <ph name="ZEROCONF_DISCOVERY" />.
 
       <ph name="PRINTER_EFFECTIVE_MODEL" /> mestilah sepadan dengan satu daripada rentetan yang mewakili pencetak yang menyokong <ph name="PRODUCT_NAME" />. Rentetan akan digunakan untuk mengenal pasti dan memasang PPD yang bersesuaian untuk pencetak tersebut. Maklumat lanjut boleh didapati di https://support.google.com/chrome?p=noncloudprint.
 
-      <ph name="PRINTER_AUTOCONF" /> ialah bendera boolean yang menunjukkan sama ada IPP Everywhere harus digunakan untuk memnyediakan pencetak. Bendera ini disokong pada <ph name="PRODUCT_OS_NAME" /> versi 76 ke atas.
+      <ph name="PRINTER_AUTOCONF" /> ialah bendera boolean yang menunjukkan sama ada IPP Everywhere harus digunakan untuk menyediakan pencetak. Bendera ini disokong pada <ph name="PRODUCT_OS_NAME" /> versi 76 ke atas.
 
       Sama ada <ph name="PRINTER_EFFECTIVE_MODEL" /> harus mengandungi nama pencetak atau <ph name="PRINTER_AUTOCONF" /> harus ditetapkan kepada benar. Pencetak yang mempunyai kedua-dua sifat atau tiada mana-mana sifat akan diabaikan.
 
@@ -1755,30 +1744,6 @@
       Dasar ini mempengaruhi pengguna yang membuat pengesahan menggunakan SAML sahaja.</translation>
 <translation id="4105989332710272578">Lumpuhkan penguatkuasaan Ketelusan Sijil untuk senarai URL</translation>
 <translation id="4121350739760194865">Elakkan promosi apl daripada muncul pada halaman tab baharu</translation>
-<translation id="4125606414556046117">Dasar ini membolehkan anda mengkonfigurasi imej kertas dinding yang dipaparkan pada desktop dan pada latar belakang skrin log masuk untuk pengguna. Dasar ini ditetapkan dengan menyatakan URL tempat <ph name="PRODUCT_OS_NAME" /> boleh memuat turun imej kertas dinding dan cincangan kriptografi yang digunakan untuk mengesahkan integriti muat turun tersebut. Imej mestilah menggunakan format JPEG dan saiz fail tidak boleh melebihi 16MB. URL mestilah boleh diakses tanpa sebarang pengesahan.
-
-      Imej kertas dinding dimuat turun dan dicache. Imej akan dimuat turun semula apabila URL atau cincangan berubah.
-
-      Dasar ini harus dinyatakan sebagai rentetan yang menyampaikan URL dan cincangan dalam format JSON yang mematuhi skema berikut:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL tempat imej kertas dinding boleh dimuat turun.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Cincangan SHA-256 imej kertas dinding.",
-            "type": "string"
-          }
-        }
-      }
-
-      Jika dasar ini ditetapkan, <ph name="PRODUCT_OS_NAME" /> akan memuat turun dan menggunakan imej kertas dinding.
-
-      Jika anda menetapkan dasar ini, pengguna tidak boleh menukar atau membatalkannya.
-
-      Jika dasar ini dibiarkan tanpa ditetapkan, pengguna boleh memilih imej yang akan dipaparkan pada desktop dan pada latar belakang skrin log masuk.</translation>
 <translation id="412697421478384751">Benarkan pengguna menetapkan PIN yang lemah bagi PIN kunci skrin</translation>
 <translation id="4138655880188755661">Had Masa</translation>
 <translation id="4144164749344898721">Dasar ini mengawal berbilang tetapan untuk strategi pengurusan kuasa apabila pengguna melahu.
@@ -2738,53 +2703,6 @@
 
       Jika dasar ini tidak ditetapkan atau ditetapkan kepada palsu, arahan cetakan akan mencetuskan skrin pratonton cetakan.</translation>
 <translation id="6022948604095165524">Tindakan semasa permulaan</translation>
-<translation id="6023030044732320798">Menentukan set dasar yang akan diserahkan kepada waktu jalan ARC. Nilainya mestilah JSON sah.
-
-      Dasar ini boleh digunakan untuk mengkonfigurasikan apl Android yang akan dipasang secara automatik pada peranti:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Pengecam apl Android, mis. "com.google.android.gm" untuk Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Menentukan cara apl dipasang. OPTIONAL: Apl tidak dipasang secara automatik, tetapi pengguna boleh memasangnya. Ini ialah nilai lalai jika dasar ini tidak ditentukan. PRELOAD: Apl dipasang secara automatik, tetapi pengguna boleh menyahpasangnya. FORCE_INSTALLED: Apl dipasang secara automatik dan pengguna tidak boleh menyahpasangnya. BLOCKED: Apl disekat dan tidak boleh dipasang. Jika apl dipasang di bawah dasar sebelumnya, apl itu akan dinyahpasang.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Dasar untuk meluluskan permintaan kebenaran apl. PERMISSION_POLICY_UNSPECIFIED: Dasar tidak ditentukan. Jika tiada dasar ditentukan untuk kebenaran pada mana-mana tahap, maka tingkah laku `PROMPT` digunakan secara lalai. PROMPT: Menggesa pengguna supaya memberikan kebenaran. GRANT: Berikan kebenaran secara automatik. DENY: Nafikan kebenaran seara automatik.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Objek konfigurasi JSON khusus apl dengan set pasangan kunci dan nilai, mis. '"managedConfiguration": { "key1": value1, "key2": value2 }'. Kunci ditakrifkan dalam manifes apl.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Untuk menyematkan apl pada pelancar, lihat PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL semerta pembekal carian lalai</translation>
 <translation id="603410445099326293">Parameter untuk URL cadangan yang menggunakan POST</translation>
 <translation id="6034341625190551415">Mengawal jenis akaun sesi awam dan kios.</translation>
@@ -3138,37 +3056,6 @@
       Jika dasar ini ditetapkan kepada palsu, pelanggan DNS terbina dalam tidak akan digunakan.
 
       Jika dasar ini dibiarkan tanpa ditetapkan, pelanggan DNS terbina dalam akan didayakan secara lalai pada OS Mac, Android (apabila DNS Peribadi dan VPN dilumpuhkan) dan OS Chrome, dan pengguna akan dapat menukar sama ada pelanggan DNS terbina dalam digunakan dengan mengedit chrome://flags atau menetapkan bendera baris perintah.</translation>
-<translation id="6838056959556423778">Membatalkan peraturan pilihan pencetak lalai <ph name="PRODUCT_NAME" />.
-
-      Dasar ini menentukan peraturan untuk memilih pencetak lalai dalam <ph name="PRODUCT_NAME" /> yang berlaku apabila fungsi cetak mula-mula digunakan dengan sesuatu profil.
-
-      Apabila dasar ini ditetapkan, <ph name="PRODUCT_NAME" /> akan cuba mencari pencetak yang sepadan dengan semua atribut yang dinyatakan dan memilihnya sebagai pencetak lalai. Pencetak pertama yang ditemui sepadan dengan dasar akan dipilih. Sekiranya tiada padanan yang unik, sebarang pencetak yang sepadan boleh dipilih, bergantung pada tertib pencetak itu ditemui.
-
-      Jika dasar ini tidak ditetapkan atau pencetak yang sepadan tidak ditemui sehingga tamat masa, pencetak PDF terbina dalam akan dipilih sebagai pencetak lalai atau apabila pencetak PDF tidak tersedia, tiada pencetak dipilih akan digunakan sebagai plilihan lalai.
-
-      Nilai akan dihuraikan sebagai objek JSON yang mematuhi skema berikut:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Whether to limit the search of the matching printer to a specific set of printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regular expression to match printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regular expression to match printer display name.",
-            "type": "string"
-          }
-        }
-      }
-
-      Pencetak yang disambungkan ke <ph name="CLOUD_PRINT_NAME" /> dianggap sebagai <ph name="PRINTER_TYPE_CLOUD" />, pencetak yang selebihnya diklasifikasikan sebagai <ph name="PRINTER_TYPE_LOCAL" />.
-      Apabila medan tidak dimasukkan, bermakna semua nilai sepadan, contohnya, tidak menentukan sambungan akan menyebabkan Pratonton Cetakan memulakan penemuan semua jenis pencetak, setempat dan awan.
-      Pola ungkapan biasa mesti mematuhi sintaks RegExp JavaScript dan padanan bersifat sensitif huruf.</translation>
 <translation id="6843296367238757293">Dasar ini telah ditamatkan. Penggunaannya tidak digalakkan. Baca lebih lanjut di https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Dasar ini telah dialih keluar dalam <ph name="PRODUCT_NAME" /> 68 dan digantikan oleh <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Dasar ini ditamatkan dan dialih keluar dalam M66, kerana digunakan untuk ujian dalaman sahaja dan merupakan liabiliti keselamatan.
@@ -4344,30 +4231,6 @@
       Dasar ini mempengaruhi pengguna yang membuat pengesahan menggunakan SAML sahaja.
 
       Nilai dasar harus dinyatakan dalam saat.</translation>
-<translation id="9027787254195333560">Dasar ini membolehkan anda mengkonfigurasi imej avatar yang mewakili pengguna pada skrin log masuk. Dasar ini ditetapkan dengan menyatakan URL tempat <ph name="PRODUCT_OS_NAME" /> boleh memuat turun imej avatar dan cincangan kriptografi yang digunakan untuk mengesahkan integriti muat turun tersebut. Imej mestilah menggunakan format JPEG dan saiz imej tidak boleh melebihi 512kB. URL mestilah boleh diakses tanpa sebarang pengesahan.
-
-      Imej avatar dimuat turun dan dicache. Imej akan dimuat turun semula apabila URL atau cincangan berubah.
-
-      Dasar ini harus dinyatakan sebagai rentetan yang menyampaikan URL dan cincangan dalam format JSON yang mematuhi skema berikut:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL tempat imej avatar boleh dimuat turun.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Cincangan SHA-256 imej avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Jika dasar ini ditetapkan, <ph name="PRODUCT_OS_NAME" /> akan memuat turun dan menggunakan imej avatar.
-
-      Jika anda menetapkan dasar ini, pengguna tidak boleh menukar atau membatalkannya.
-
-      Jika dasar ini dibiarkan tanpa ditetapkan, pengguna boleh memilih imej avatar yang mewakili mereka pada skrin log masuk.</translation>
 <translation id="9035964157729712237">ID sambungan untuk dikecualikan daripada senarai hitam</translation>
 <translation id="9038058011835642205">Menentukan senarai tapak web yang dipasang secara senyap tanpa interaksi pengguna dan tapak web tersebut tidak boleh dinyahpasang atau dilumpuhkan oleh pengguna.
 
@@ -4380,7 +4243,6 @@
       Jika anda menetapkan dasar ini, pengguna tidak boleh menukar atau membatalkannya.
 
       Nilai dasar harus dinyatakan dalam milisaat. Nilai dihadkan kepada julat selama 30 saat hingga 24 jam.</translation>
-<translation id="9042911395677044526">Membenarkan penolakan konfigurasi rangkaian digunakan untuk setiap pengguna pada peranti <ph name="PRODUCT_OS_NAME" />. Konfigurasi rangkaian ialah rentetan berformat JSON seperti yang ditakrifkan oleh format Konfigurasi Rangkaian Terbuka yang dihuraikan di <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Dasar ini mengawal sama ada peranti harus dikemas kini kepada Quick Fix Build.
 
       Jika nilai dasar ditetapkan kepada token yang dipetakan kepada Quick Fix Build, peranti akan dikemas kini kepada Quick Fix Build yang sepadan jika kemas kini tidak disekat oleh dasar lain.
@@ -4460,17 +4322,6 @@
       Jika dasar ini ditetapkan kepada palsu, 'Pengepala dan pengaki' tidak dipilih dalam dialog prapaparan cetak dan pengguna tidak dapat mengubahnya.
 
       Jika dasar ditetapkan kepada benar, 'Pengepala dan pengaki' dipilih dalam dialog prapaparan cetak dan pengguna tidak dapat mengubahnya.</translation>
-<translation id="9213347477683611358">Mengkonfigurasikan imej kertas dinding tahap peranti yang dipaparkan pada skrin log masuk jika belum ada pengguna yang pernah log masuk ke peranti. Dasar ini ditetapkan dengan menentukan URL tempat peranti OS Chrome boleh memuat turun imej kertas dinding itu dan cincangan kriptografi digunakan untuk mengesahkan integriti muat turun itu. Imej mestilah dalam format JPEG dan saiznya tidak boleh melebihi 16MB. URL mestilah boleh diakses tanpa sebarang pengesahan. Imej kertas dinding dimuat turun dan dicache. Imej kertas dinding akan dimuat turun semula setiap kali URL atau cincangan berubah.
-
-      Dasar ini hendaklah ditetapkan sebagai rentetan yang menyatakan URL dan cincangan dalam format JSON, mis.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Jika dasar kertas dinding peranti ditetapkan, peranti OS Chrome akan memuat turun dan menggunakan imej kertas dinding pada skrin log masuk jika belum ada pengguna yang pernah log masuk ke peranti. Sebaik sahaja pengguna log masuk, dasar kertas dinding pengguna akan berkuat kuasa.
-
-      Jika dasar kertas dinding peranti dibiarkan tidak ditetapkan dan jika dasar kertas dinding pengguna ditetapkan, dasar kertas dinding pengguna akan menentukan item yang perlu dipaparkan.</translation>
 <translation id="9217154963008402249">Kekerapan pemantauan bingkisan rangkaian</translation>
 <translation id="922540222991413931">Konfigurasi sambungan, apl dan sumber pemasangan skrip pengguna</translation>
 <translation id="924557436754151212">Import kata laluan yang disimpan daripada penyemak imbas lalai pada kali pertama menjalankannya</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index e50f506..90d444b 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -54,7 +54,7 @@
 <translation id="1052499923181221200">Dit beleid heeft geen effect, tenzij SamlInSessionPasswordChangeEnabled is ingesteld op 'true'.
       Als dat beleid is ingesteld op 'true' en dit beleid bijvoorbeeld is ingesteld op 14, ontvangen SAML-gebruikers 14 dagen van tevoren een melding dat hun wachtwoord op een bepaalde datum verloopt.
       Ze kunnen dit direct oplossen door tijdens een sessie het wachtwoord te wijzigen voordat het verloopt.
-      Deze meldingen worden echter alleen weergegeven als de SAML-identiteitsprovider tijdens de SAML-inlogprocedure informatie over het verlopen van het wachtwoord verzendt naar het apparaat.
+      Deze meldingen worden alleen weergegeven als de SAML-identiteitsprovider tijdens de SAML-inlogprocedure informatie over het verlopen van het wachtwoord verzendt naar het apparaat.
       Als dit beleid wordt ingesteld op 0, ontvangen gebruikers van tevoren geen melding. Ze ontvangen pas een melding zodra het wachtwoord is verlopen.
 
       Als dit beleid is ingesteld, kan de gebruiker het niet wijzigen of overschrijven.</translation>
@@ -413,7 +413,6 @@
 
       Waarschuwing: Het wordt niet aanbevolen het beheer van de <ph name="PRODUCT_OS_NAME" />-versie te delegeren aan een kiosk-app, omdat het apparaat hierdoor mogelijk geen software-updates en essentiële beveiligingsoplossingen ontvangt. Als je het beheer van de <ph name="PRODUCT_OS_NAME" />-versie delegeert, kunnen gebruikers gevaar lopen.</translation>
 <translation id="1675002386741412210">Ondersteund op:</translation>
-<translation id="1689963000958717134">Hiermee kun je een netwerkconfiguratie toepassen voor alle gebruikers van een <ph name="PRODUCT_OS_NAME" />-apparaat. De netwerkconfiguratie is een tekenreeks met JSON-indeling, zoals gedefinieerd door de indeling voor open netwerkconfiguratie, beschreven op <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Hiermee configureer je de beschikbaarheid en het gedrag van de updatefunctionaliteit voor <ph name="TPM_FIRMWARE_UPDATE_TPM" />-firmware.
 
       Afzonderlijke instellingen kunnen worden gespecificeerd in json-eigenschappen:
@@ -973,16 +972,6 @@
       Als deze instelling is uitgeschakeld, kunnen webpagina's JavaScript niet gebruiken en kan de gebruiker die instelling niet wijzigen.
 
       Als deze instelling is ingeschakeld of niet wordt ingesteld, kunnen webpagina's JavaScript gebruiken, maar kan de gebruiker die instelling wijzigen.</translation>
-<translation id="2747157663401642394">Hiermee worden extensiebeheerinstellingen voor <ph name="PRODUCT_NAME" /> geconfigureerd.
-
-          Met dit beleid worden meerdere instellingen beheerd, waaronder instellingen die worden beheerd door bestaande, aan extensies gerelateerde beleidsregels. Dit beleid overschrijft alle oudere beleidsregels als beide zijn ingesteld.
-
-          Met dit beleid wordt een extensie-ID of een update-URL toegewezen aan de bijbehorende configuratie. Bij een extensie-ID wordt de configuratie uitsluitend op de opgegeven configuratie toegepast. Er kan een standaardconfiguratie worden ingesteld voor de speciale ID <ph name="DEFAULT_SCOPE" />, die wordt toegepast op alle extensies waarvoor geen aangepaste configuratie is ingesteld in dit beleid. Bij een update-URL wordt de configuratie toegepast op alle extensies met de exacte update-URL in het manifest van deze extensie, zoals beschreven in <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Voor Windows-instanties die niet zijn gekoppeld aan een <ph name="MS_AD_NAME" />-domein, is gedwongen installatie beperkt tot apps en extensies die worden vermeld in de Chrome Web Store.
-
-          Ga naar https://www.chromium.org/administrators/policy-list-3/extension-settings-full voor een volledige beschrijving van de mogelijke instellingen en de structuur van dit beleid.
-          </translation>
 <translation id="2753637905605932878">Het bereik beperken van lokale UDP-poorten die door WebRTC worden gebruikt</translation>
 <translation id="2757054304033424106">Typen extensies/apps die mogen worden geïnstalleerd</translation>
 <translation id="2758084448533744848">Specificeert de afgedwongen tijdzone die voor het apparaat moet worden gebruikt. Wanneer dit beleid is ingesteld, kunnen gebruikers op het apparaat de gespecificeerde tijdzone niet overschrijven. Als een ongeldige waarde wordt opgegeven, wordt het beleid nog steeds geactiveerd, maar dan met 'GMT' als tijdzone. Als er een lege tekenreeks wordt opgegeven, wordt het beleid genegeerd.
@@ -1234,7 +1223,7 @@
 
       Als je dit beleid instelt op 'Wipe', worden homedirectory's met ecryptfs-versleuteling verwijderd nadat je bent ingelogd en worden er in plaats daarvan nieuwe homedirectory's met ext4-versleuteling gemaakt. Waarschuwing: Hiermee worden de lokale gegevens van de gebruiker verwijderd.
 
-      Als je dit beleid instelt op 'MinimalMigrate', worden homedirectory's met ecryptfs-versleuteling verwijderd nadat je bent ingelogd en worden er in plaats daarvan nieuwe homedirectory's met ext4-versleuteling gemaakt. Er wordt echter geprobeerd de inlogtokens te behouden, zodat de gebruiker niet opnieuw hoeft in te loggen. Waarschuwing: Hiermee worden de lokale gegevens van de gebruiker verwijderd.
+      Als je dit beleid instelt op 'MinimalMigrate', worden homedirectory's met ecryptfs-versleuteling verwijderd nadat je bent ingelogd en worden er in plaats daarvan nieuwe homedirectory's met ext4-versleuteling gemaakt. Er wordt wel geprobeerd de inlogtokens te behouden, zodat de gebruiker niet opnieuw hoeft in te loggen. Waarschuwing: Hiermee worden de lokale gegevens van de gebruiker verwijderd.
 
       Als je dit beleid instelt op een optie die niet meer wordt ondersteund ('AskUser' of 'AskForEcryptfsArcUsers'), wordt het beleid uitgevoerd alsof je 'Migrate' hebt geselecteerd.
 
@@ -1311,7 +1300,7 @@
 <translation id="3312206664202507568">Hiermee wordt een pagina op chrome://password-change actief waar SAML-gebruikers hun SAML-wachtwoorden kunnen wijzigen tijdens een sessie. Dit zorgt ervoor dat het SAML-wachtwoord en het wachtwoord voor schermvergrendeling van het apparaat gesynchroniseerd blijven.
 
       Met dit beleid worden er ook meldingen gegenereerd voor SAML-gebruikers van wie het SAML-wachtwoord bijna verloopt. Ze kunnen dit dan meteen verhelpen door tijdens de sessie het wachtwoord te wijzigen.
-      Deze meldingen worden echter alleen weergegeven als de SAML-identiteitsprovider tijdens de SAML-inlogprocedure informatie over het verlopen van het wachtwoord verzendt naar het apparaat.
+      Deze meldingen worden alleen weergegeven als de SAML-identiteitsprovider tijdens de SAML-inlogprocedure informatie over het verlopen van het wachtwoord verzendt naar het apparaat.
 
       Als dit beleid is ingesteld, kan de gebruiker het niet wijzigen of overschrijven.</translation>
 <translation id="3322771899429619102">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die sleutels mogen genereren. Als een URL-patroon in 'KeygenBlockedForUrls' staat, worden deze uitzonderingen daardoor overschreven.
@@ -1681,19 +1670,19 @@
       Als dit beleid is ingesteld op 'False' kunnen gebruikers geen aanbiedingen inwisselen.</translation>
 <translation id="4008233182078913897">Hiermee wordt een lijst opgegeven met apps en extensies die zonder gebruikersinteractie op de achtergrond worden geïnstalleerd en die niet kunnen worden verwijderd of uitgeschakeld door de gebruiker. Alle rechten die worden aangevraagd door de apps/extensies, worden impliciet zonder gebruikersinteractie verleend, inclusief aanvullende rechten die worden aangevraagd door toekomstige versies van de app/extensie. Bovendien worden rechten verleend voor de API's van de enterprise.deviceAttributes- en enterprise.platformKeys-extensie. (Deze twee API's zijn niet beschikbaar voor apps/extensies die niet gedwongen zijn geïnstalleerd.)
 
-          Dit beleid krijgt voorrang boven een potentieel conflicterend <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />-beleid. Als een app of extensie die eerder gedwongen is geïnstalleerd, uit deze lijst wordt verwijderd, wordt de app of extensie automatisch verwijderd door <ph name="PRODUCT_NAME" />.
+          Dit beleid krijgt voorrang boven een potentieel conflicterend <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />-beleid. Als een app of extensie die eerder gedwongen is geïnstalleerd uit deze lijst wordt verwijderd, wordt de app of extensie automatisch verwijderd door <ph name="PRODUCT_NAME" />.
 
           Voor Windows-instanties die niet zijn gekoppeld aan een <ph name="MS_AD_NAME" />-domein, is gedwongen installatie beperkt tot apps en extensies die worden vermeld in de Chrome Web Store.
 
           Houd er rekening mee dat gebruikers de broncode van een extensie kunnen wijzigen via de ontwikkelaarstools (waardoor de extensie mogelijk niet meer functioneert). Als je je hierover zorgen maakt, moet het <ph name="DEVELOPER_TOOLS_POLICY_NAME" />-beleid worden ingesteld.
 
-          Elk lijstitem van het beleid is een tekenreeks die een extensie-ID en optioneel een update-URL bevat, gescheiden door een puntkomma (<ph name="SEMICOLON" />). De extensie-ID is de tekenreeks van 32 letters die bijvoorbeeld op <ph name="CHROME_EXTENSIONS_LINK" /> kan worden gevonden wanneer de ontwikkelaarsmodus actief is. De update-URL, indien opgegeven, moet verwijzen naar een XML-updatedocument voor het manifest, zoals beschreven op <ph name="LINK_TO_EXTENSION_DOC1" />. Standaard wordt de update-URL van de Chrome Web Store gebruikt (momenteel https://clients2.google.com/service/update2/crx). Houd er rekening mee dat de update-URL die in dit beleid is ingesteld, alleen voor de eerste installatie wordt gebruikt. Daaropvolgende updates van de extensie gebruiken de update-URL die in het manifest van de extensie wordt aangegeven. Houd er ook rekening mee dat het expliciet opgeven van de update-URL verplicht was in <ph name="PRODUCT_NAME" />-versie tot en met 67.
+          Elk lijstitem van het beleid is een tekenreeks die een extensie-ID en optioneel een update-URL bevat, gescheiden door een puntkomma (<ph name="SEMICOLON" />). De extensie-ID is de tekenreeks van 32 letters die bijvoorbeeld op <ph name="CHROME_EXTENSIONS_LINK" /> kan worden gevonden wanneer de ontwikkelaarsmodus actief is. De update-URL, indien opgegeven, moet verwijzen naar een XML-updatedocument voor het manifest, zoals beschreven op <ph name="LINK_TO_EXTENSION_DOC1" />. Standaard wordt de update-URL van de Chrome Web Store gebruikt (momenteel https://clients2.google.com/service/update2/crx). Houd er rekening mee dat de update-URL die in dit beleid is ingesteld, alleen voor de eerste installatie wordt gebruikt. Daaropvolgende updates van de extensie gebruiken de update-URL die in het manifest van de extensie wordt aangegeven. Houd er ook rekening mee dat het expliciet opgeven van de update-URL verplicht was in <ph name="PRODUCT_NAME" />-versies tot en met 67.
 
-          Met <ph name="EXTENSION_POLICY_EXAMPLE" /> wordt de app met ID <ph name="EXTENSION_ID_SAMPLE" /> bijvoorbeeld geïnstalleerd via de standaard update-URL van de Chrome Web Store. Raadpleeg voor meer informatie over de hosting van extensies de volgende link: <ph name="LINK_TO_EXTENSION_DOC2" />.
+          Met <ph name="EXTENSION_POLICY_EXAMPLE" /> wordt de extensie met de ID <ph name="EXTENSION_ID_SAMPLE" /> bijvoorbeeld geïnstalleerd via de standaard update-URL van de Chrome Web Store. Ga naar <ph name="LINK_TO_EXTENSION_DOC2" /> voor meer informatie over het hosten van extensies.
 
-          Als dit beleid niet wordt ingesteld, worden er geen apps en extensies automatisch geïnstalleerd en kan de gebruiker elke app of extensie in <ph name="PRODUCT_NAME" /> verwijderen.
+          Als dit beleid niet wordt ingesteld, worden apps en extensies automatisch geïnstalleerd en kan de gebruiker elke app of extensie in <ph name="PRODUCT_NAME" /> verwijderen.
 
-          Houd er rekening mee dat dit beleid niet van toepassing is op de incognitomodus.</translation>
+          Dit beleid is niet van toepassing op de incognitomodus.</translation>
 <translation id="4008507541867797979">Als dit beleid is ingesteld op 'True' of niet is geconfigureerd, worden op het inlogscherm van <ph name="PRODUCT_OS_NAME" /> bestaande gebruikers weergegeven die kunnen worden geselecteerd.
 
       Als dit beleid is ingesteld op 'False', worden op het inlogscherm van <ph name="PRODUCT_OS_NAME" /> geen bestaande gebruikers weergegeven. In dat geval wordt het normale inlogscherm (waar de gebruiker om een e-mailadres en wachtwoord of telefoonnummer wordt gevraagd) of het SAML-interstitial-scherm (indien ingeschakeld via het <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" />-beleid) weergegeven, tenzij er een beheerde sessie is ingesteld. Wanneer er een beheerde sessie is ingesteld, worden alleen de accounts voor de beheerde sessie weergegeven en kun je alleen een van deze accounts selecteren.
@@ -1743,30 +1732,6 @@
       Dit beleid heeft alleen gevolgen voor gebruikers die SAML-verificatie gebruiken.</translation>
 <translation id="4105989332710272578">Handhaving van Certificaattransparantie voor een lijst met URL's uitschakelen</translation>
 <translation id="4121350739760194865">Voorkomen dat app-promoties worden weergegeven op de pagina 'Nieuw tabblad'</translation>
-<translation id="4125606414556046117">Met dit beleid kun je de achtergrondafbeelding configureren die op het bureaublad en op de achtergrond van het inlogscherm voor de gebruiker wordt weergegeven. Het beleid wordt ingesteld door de URL op te geven waarvandaan <ph name="PRODUCT_OS_NAME" /> de achtergrondafbeelding en een cryptografische hash kan downloaden die wordt gebruikt om de integriteit van de download te verifiëren. De afbeelding moet een jpeg-indeling hebben en mag niet groter zijn dan 16 MB. De URL moet zonder verificatie toegankelijk zijn.
-
-      De achtergrondafbeelding wordt gedownload en opgeslagen in het cachegeheugen. Deze wordt opnieuw gedownload wanneer de URL of de hash wordt gewijzigd.
-
-      Het beleid moet worden gespecificeerd als tekenreeks die de URL en hash in JSON-indeling vertegenwoordigt, waarbij het volgende schema wordt aangehouden:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "De URL waarvandaan de achtergrondafbeelding kan worden gedownload.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "De SHA-256-hash van de achtergrondafbeelding.",
-            "type": "string"
-          }
-        }
-      }
-
-      Als dit beleid is ingesteld, downloadt en gebruikt <ph name="PRODUCT_OS_NAME" /> de achtergrondafbeelding.
-
-      Als je dit beleid instelt, kunnen gebruikers dit niet wijzigen of overschrijven.
-
-      Als het beleid niet wordt ingesteld, kan de gebruiker een afbeelding kiezen die op het bureaublad en op de achtergrond van het inlogscherm wordt weergegeven.</translation>
 <translation id="412697421478384751">Gebruikers toestaan om zwakke pincodes in te stellen als pincode voor het vergrendelingsscherm</translation>
 <translation id="4138655880188755661">Tijdslimiet</translation>
 <translation id="4144164749344898721">Dit beleid beheert meerdere instellingen voor de energiebeheerstrategie wanneer de gebruiker inactief is.
@@ -2685,7 +2650,7 @@
       Als het beleid is ingesteld op 'true', krijgt het cloudbeleid voorrang bij een conflict met het platformbeleid.
       Als het beleid is ingesteld op 'false' of niet is geconfigureerd, krijgt het platformbeleid voorrang bij een conflict met het cloudbeleid.
 
-      Dit beleid is alleen beschikbaar als verplicht machineplatformbeleid en is alleen van toepassing op cloudbeleid op machineniveau.
+      Dit beleid is uitsluitend beschikbaar als verplichte beleidsregel voor machineplatforms en is alleen van toepassing op cloudbeleid voor het machinebereik.
       </translation>
 <translation id="5905473632148429217">Online OCSP/CRL-controles inschakelen</translation>
 <translation id="5906199912611534122">Hiermee kan netwerkbeperking worden in- of uitgeschakeld.
@@ -2728,53 +2693,6 @@
 
       Als dit beleid niet is ingesteld of is ingesteld op 'false', activeren afdrukopdrachten het afdrukvoorbeeldscherm.</translation>
 <translation id="6022948604095165524">Actie bij starten</translation>
-<translation id="6023030044732320798">Hiermee wordt een reeks beleidsregels gespecificeerd om door te geven aan de ARC-runtime. De waarde moet geldige JSON zijn.
-
-      Dit beleid kan worden gebruikt om in te stellen welke Android-apps automatisch worden geïnstalleerd op het apparaat:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android-app-ID, bijv. "com.google.android.gm" voor Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Specificeert hoe een app wordt geïnstalleerd. OPTIONAL: De app wordt niet automatisch geïnstalleerd, maar de gebruiker kan deze installeren. Dit is de standaardwaarde als dit beleid niet is gespecificeerd. PRELOAD: De app wordt automatisch geïnstalleerd, maar de gebruiker kan deze verwijderen. FORCE_INSTALLED: De app wordt automatisch geïnstalleerd en de gebruiker kan deze niet verwijderen. BLOCKED: De app is geblokkeerd en kan niet worden geïnstalleerd. Als de app is geïnstalleerd op basis van een eerder beleid, wordt deze verwijderd.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Beleid voor het verlenen van machtigingen aan apps. PERMISSION_POLICY_UNSPECIFIED: Beleid niet gespecificeerd. Als er geen beleid is gespecificeerd voor een machtiging op een bepaald niveau, wordt het gedrag 'PROMPT' standaard gebruikt. PROMPT: De gebruiker vragen een machtiging te verlenen. GRANT: Een machtiging automatisch verlenen. DENY: Een machtiging automatisch weigeren.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "App-specifiek JSON-configuratieobject met een set sleutel/waarde-paren, bijv. '"managedConfiguration": { "key1": value1, "key2": value2 }'. De sleutels worden gedefinieerd in het app-manifest.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Bekijk PinnedLauncherApps als je apps wilt vastzetten in de Launcher.</translation>
 <translation id="602728333950205286">Instant-URL voor standaardzoekprovider</translation>
 <translation id="603410445099326293">Parameters voor suggestie-URL die POST gebruikt</translation>
 <translation id="6034341625190551415">Beheert accounttypen voor openbare sessies en kiosken.</translation>
@@ -3114,37 +3032,6 @@
       Als dit beleid is ingesteld op false, wordt de ingebouwde DNS-client nooit gebruikt.
 
       Als dit beleid niet wordt ingesteld, wordt de ingebouwde DNS-client standaard ingeschakeld op Mac OS, Android (wanneer Privé-DNS en VPN niet zijn ingeschakeld) en Chrome OS en kunnen de gebruikers bepalen of de ingebouwde DNS-client wordt gebruikt door chrome://flags te bewerken of een opdrachtregelmarkering op te geven.</translation>
-<translation id="6838056959556423778">Hiermee negeer je de regels van <ph name="PRODUCT_NAME" /> voor selectie van de standaardprinter.
-
-      Met dit beleid kun je bepalen welke regels je wilt gebruiken om de standaardprinter in <ph name="PRODUCT_NAME" /> te selecteren. Je kunt dit instellen wanneer de afdrukfunctie voor het eerst in een profiel wordt gebruikt.
-
-      Wanneer dit beleid is ingesteld, probeert <ph name="PRODUCT_NAME" /> een printer te vinden die overeenkomt met alle opgegeven kenmerken en wordt deze geselecteerd als standaardprinter. De eerste gevonden printer die overeenkomt met dit beleid, wordt geselecteerd. Als meerdere printers overeenkomen, kan elke willekeurige overeenkomende printer worden geselecteerd, afhankelijk van de volgorde waarin de printers worden gevonden.
-
-      Als dit beleid niet is ingesteld, of als er geen overeenkomende printer binnen de time-outperiode wordt gevonden, wordt de printer standaard ingesteld op de ingebouwde pdf-printer, of er wordt geen printer geselecteerd, als de pdf-printer niet beschikbaar is.
-
-      De waarde wordt geparseerd als JSON-object, overeenkomend met het volgende schema:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Zoeken van overeenkomende printer al of niet beperken tot een specifieke reeks printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Reguliere expressie voor overeenkomende printer-ID.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Reguliere expressie voor overeenkomende printerweergavenaam.",
-            "type": "string"
-          }
-        }
-      }
-
-      Printers die zijn gekoppeld aan <ph name="CLOUD_PRINT_NAME" /> worden als printers van het type <ph name="PRINTER_TYPE_CLOUD" /> beschouwd. De overige printers worden geclassificeerd als <ph name="PRINTER_TYPE_LOCAL" />.
-      Wanneer een veld wordt overgeslagen, betekent dit dat alle waarden overeenkomen. Als er bijvoorbeeld geen verbinding wordt opgegeven, worden voor het afdrukvoorbeeld alle typen printers gedetecteerd, zowel lokale als cloudprinters.
-      Reguliere-expressiepatronen moeten de JavaScript RegExp-syntaxis volgen en namen komen alleen overeen als ook het hoofdlettergebruik klopt (hoofdlettergevoelig).</translation>
 <translation id="6843296367238757293">Dit beleid is beëindigd. Het gebruik ervan wordt afgeraden. Ga naar https://support.google.com/chrome/a/answer/7643500 voor meer informatie</translation>
 <translation id="684856667300805181">Dit beleid is in <ph name="PRODUCT_NAME" /> 68 verwijderd en vervangen door <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Dit beleid is beëindigd en uit M66 verwijderd, omdat het alleen werd gebruikt voor interne testen en een beveiligingsrisico vormt.
@@ -4293,30 +4180,6 @@
       Dit beleid is alleen van toepassing op gebruikers die zijn geverifieerd met SAML.
 
       De beleidswaarde moet worden gespecificeerd in seconden.</translation>
-<translation id="9027787254195333560">Met dit beleid kun je de avatarafbeelding configureren die voor de gebruiker wordt weergegeven op het inlogscherm. Het beleid wordt ingesteld door de URL op te geven waar <ph name="PRODUCT_OS_NAME" /> de avatarafbeelding kan downloaden, evenals een cryptografische hash die wordt gebruikt om de integriteit van de download te verifiëren. De afbeelding moet de jpeg-indeling hebben en mag niet groter zijn dan 512 KB. De URL moet zonder verificatie toegankelijk zijn.
-
-      De avatarafbeelding wordt gedownload en opgeslagen in het cachegeheugen. Deze wordt opnieuw gedownload wanneer de URL of de hash wordt gewijzigd.
-
-      Het beleid moet worden gespecificeerd als tekenreeks die de URL en hash in JSON-indeling vertegenwoordigt, waarbij het volgende schema wordt aangehouden:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "De URL waarvandaan de avatarafbeelding kan worden gedownload.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "De SHA-256-hash van de avatarafbeelding.",
-            "type": "string"
-          }
-        }
-      }
-
-      Als dit beleid is ingesteld, downloadt en gebruikt <ph name="PRODUCT_OS_NAME" /> de avatarafbeelding.
-
-      Als je dit beleid instelt, kunnen gebruikers dit niet wijzigen of overschrijven.
-
-      Als het beleid niet wordt ingesteld, kan de gebruiker de avatarafbeelding voor het inlogscherm zelf kiezen.</translation>
 <translation id="9035964157729712237">Extensie-ID's die zijn vrijgesteld van de zwarte lijst</translation>
 <translation id="9038058011835642205">Specificeert een lijst met web-apps die op de achtergrond worden geïnstalleerd zonder interactie van de gebruiker en die niet kunnen worden verwijderd of uitgeschakeld door de gebruiker.
 
@@ -4329,7 +4192,6 @@
       Als je dit beleid instelt, kunnen gebruikers dit niet wijzigen of overschrijven.
 
       De beleidswaarde moet worden gespecificeerd in milliseconden. Waarden worden afgerond tot een bereik van dertig seconden tot vierentwintig uur.</translation>
-<translation id="9042911395677044526">Hiermee kun je een gebruikerspecifieke netwerkconfiguratie toepassen op een <ph name="PRODUCT_OS_NAME" />-apparaat. De netwerkconfiguratie is een tekenreeks met JSON-indeling, zoals gedefinieerd door de indeling voor open netwerkconfiguratie, beschreven op <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Met dit beleid wordt bepaald of het apparaat moet worden geüpdatet naar een Quick Fix Build.
 
       Als de beleidswaarde is ingesteld op een token dat naar een Quick Fix Build verwijst, wordt het apparaat geüpdatet naar de bijbehorende Quick Fix Build als de update niet wordt geblokkeerd door een ander beleid.
@@ -4409,17 +4271,6 @@
       Als het beleid is ingesteld op 'False', is het selectievakje 'Kop- en voetteksten' niet aangevinkt in het dialoogvenster met het afdrukvoorbeeld en kan de gebruiker dit niet wijzigen.
 
       Als het beleid is ingesteld op 'True', is het selectievakje 'Kop- en voetteksten' aangevinkt in het dialoogvenster met het afdrukvoorbeeld en kan de gebruiker dit niet wijzigen.</translation>
-<translation id="9213347477683611358">Configureer een achtergrondafbeelding op apparaatniveau die wordt weergegeven op het inlogscherm als er nog geen gebruiker is ingelogd bij het apparaat. Je kunt het beleid instellen door de URL op te geven waar het Chrome OS-apparaat de achtergrondafbeelding kan downloaden, evenals een cryptografische hash waarmee de integriteit van de download kan worden gecontroleerd. De afbeelding moet de JPEG-indeling hebben en het bestand mag niet groter dan 16 MB zijn. De URL moet zonder verificatie toegankelijk zijn. De achtergrondafbeelding wordt gedownload en opgeslagen in het cachegeheugen. De afbeelding wordt opnieuw gedownload wanneer de URL of de hash verandert.
-
-      Het beleid moet worden opgegeven als tekenreeks die de URL en hash aangeeft in JSON-indeling, bijvoorbeeld:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Als het achtergrondbeleid voor het apparaat is ingesteld, downloadt het Chrome OS-apparaat de achtergrondafbeelding en gebruikt deze op het inlogscherm als er nog geen gebruiker is ingelogd bij het apparaat. Zodra de gebruiker inlogt, wordt het achtergrondbeleid van de gebruiker toegepast.
-
-      Als het achtergrondbeleid voor het apparaat niet is ingesteld, wordt op basis van het achtergrondbeleid van de gebruiker (als dit is ingesteld) bepaald wat wordt weergegeven.</translation>
 <translation id="9217154963008402249">Frequentie van netwerkpakketten voor bijhouden</translation>
 <translation id="922540222991413931">Installatiebronnen voor het configureren van extensies, apps en gebruikersscripts</translation>
 <translation id="924557436754151212">Opgeslagen wachtwoorden importeren uit standaardbrowser bij eerste uitvoering</translation>
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index fad0fa81..5d69abd9 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -399,7 +399,6 @@
 
       Advarsel: Det er ikke anbefalt å delegere kontroll over <ph name="PRODUCT_OS_NAME" />-versjonen til en kioskapp, siden dette kan hindre enheten i å motta programvareoppdateringer og kritiske sikkerhetsløsninger. Hvis kontroll over <ph name="PRODUCT_OS_NAME" />-versjonen delegeres, kan brukerne bli utsatt for risiko.</translation>
 <translation id="1675002386741412210">Støttes på:</translation>
-<translation id="1689963000958717134">Tillater skyving av nettverkskonfigurasjon for alle brukere av en <ph name="PRODUCT_OS_NAME" />-enhet. Nettverkskonfigurasjonen er en JSON-formatert streng, som definert av Open Network Configuration-formatet beskrevet på <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Konfigurerer tilgjengeligheten og funksjonaliteten for oppdatering av <ph name="TPM_FIRMWARE_UPDATE_TPM" />-fastvaren.
 
       Enkeltinnstillinger kan angis i JSON-egenskaper:
@@ -761,7 +760,7 @@
 
           Hvis denne regelen er angitt, brukes modus for batterilading hvis enheten støtter det.
 
-          Hvis denne regelen ikke er angitt, men enheten støtter regelen, brukes standard modus for batterilading og kan ikke endres av brukeren.
+          Hvis denne regelen ikke er angitt, men enheten støtter regelen, brukes standard modus for batterilading, og dette kan ikke endres av brukeren.
 
           Merk: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> overstyrer denne regelen hvis førstnevnte er angitt.</translation>
 <translation id="237494535617297575">Gjør at du kan angi en liste over nettadressemønstre som spesifiserer hvilke nettsteder som får vise varsler. Hvis denne retningslinjen ikke angis, brukes den globale verdien for alle nettsteder, enten fra retningslinjen DefaultNotificationsSetting hvis den er angitt, eller av brukerens egen konfigurasjon hvis den nevnte retningslinjen ikke er angitt.</translation>
@@ -949,16 +948,6 @@
      Hvis denne innstillingen er deaktivert, kan ikke nettsidene bruke JavaScript og brukeren kan ikke endre innstillingen.
 
       Hvis denne innstillingen er aktivert eller ikke angitt, kan nettsider bruke JavaScript, men brukeren kan endre innstillingen.</translation>
-<translation id="2747157663401642394">Konfigurerer innstillinger for administrering av utvidelser for <ph name="PRODUCT_NAME" />.
-
-          Denne regelen styrer flere innstillinger, inkludert innstillinger som styres av eksisterende regler knyttet til utvidelser. Denne regelen overstyrer eventuelle eldre regler hvis begge er angitt.
-
-          Denne regelen tilordner konfigurasjonen en utvidelses-ID eller en oppdateringsnettadresse. Med en utvidelses-ID blir konfigurasjonen kun brukt for den bestemte utvidelsen. En standardkonfigurering kan angis for den spesielle ID-en <ph name="DEFAULT_SCOPE" />, som gjelder for alle utvidelser uten tilpasset konfigurering i denne regelen. Med en oppdateringsnettadresse brukes konfigureringen for alle utvidelser med den nøyaktige oppdateringsnettadressen som står oppført i manifestet til denne utvidelsen, som beskrevet på <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          For Windows-forekomster som ikke er tilknyttet noe <ph name="MS_AD_NAME" />-domene, begrenses administratorinstallering til apper og utvidelser oppført i Chrome Nettmarked.
-
-          For å se en fullstendig beskrivelse av mulige innstillinger og strukturen for denne regelen, gå til https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Begrens området for lokale UDP-porter som brukes av WebRTC</translation>
 <translation id="2757054304033424106">Utvidelser og apper som kan installeres</translation>
 <translation id="2758084448533744848">Spesifiserer en tidssone som enheten tvinges til å bruke. Når denne regelen er angitt, kan ikke brukere av enheten overstyre den spesifiserte tidssonen. Hvis en ugyldig verdi angis, aktiveres regelen likevel og bruker «GMT» i stedet. Hvis en tom streng angis, ignoreres regelen.
@@ -1664,7 +1653,7 @@
 
          Vær oppmerksom på at kildekoden for utvidelsene kan endres av brukere via utviklerverktøy (noe som potensielt kan føre til at utvidelsene ikke fungerer). Hvis dette kan bli et problem, bør du angi regelen <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
 
-          Hvert av elementene i listen er en streng som inneholder en utvidelses-ID og eventuelt (valgfritt) en oppdateringsadresse, atskilt med semikolon (<ph name="SEMICOLON" />). Utvidelses-ID-en er strengen på 32 tegn du for eksempel finner i <ph name="CHROME_EXTENSIONS_LINK" /> når du er i utviklermodus. Oppdateringsadressen skal være til et oppdateringsmanifest i XML-format, som beskrevet her: <ph name="LINK_TO_EXTENSION_DOC1" />. Oppdateringsadressen for Chrome Nettmarked brukes som standard (og for øyeblikket er den «https://clients2.google.com/service/update2/crx»). Vær oppmerksom på at oppdateringsadressen som angis i denne regelen, bare brukes for den første installasjonen. Påfølgende oppdateringer av utvidelsen bruker oppdateringsadressen som er beskrevet i utvidelsens manifest. Vær også oppmerksom på at det var uttrykkelig påkrevd å angi oppdateringsadressen i <ph name="PRODUCT_NAME" />-versjoner opptil og inkludert 67.
+          Hvert av elementene i listen er en streng som inneholder en utvidelses-ID og eventuelt (valgfritt) en oppdateringsadresse, atskilt med semikolon (<ph name="SEMICOLON" />). Utvidelses-ID-en er strengen på 32 tegn du for eksempel finner i <ph name="CHROME_EXTENSIONS_LINK" /> når du er i utviklermodus. Oppdateringsadressen skal være til et oppdateringsmanifest i XML-format, som beskrevet her: <ph name="LINK_TO_EXTENSION_DOC1" />. Oppdateringsadressen for Chrome Nettmarked brukes som standard (og for øyeblikket er den «https://clients2.google.com/service/update2/crx»). Vær oppmerksom på at oppdateringsadressen som angis i denne regelen, bare brukes for den første installasjonen. Påfølgende oppdateringer av utvidelsen bruker oppdateringsadressen som er beskrevet i utvidelsens manifest. Vær også oppmerksom på at det var uttrykkelig påkrevd å angi oppdateringsadressen i <ph name="PRODUCT_NAME" />-versjoner til og med 67.
 
           For eksempel installerer <ph name="EXTENSION_POLICY_EXAMPLE" /> utvidelsen med ID-en <ph name="EXTENSION_ID_SAMPLE" /> fra den oppdateringsadressen som er standard for Chrome Nettmarked. Gå til <ph name="LINK_TO_EXTENSION_DOC2" /> for å finne ut mer om verter for utvidelser.
 
@@ -1720,30 +1709,6 @@
       Denne regelen påvirker bare brukere som autentiserer via SAML.</translation>
 <translation id="4105989332710272578">Slå av tvungen sertifikatåpenhet for en liste med nettadresser</translation>
 <translation id="4121350739760194865">Gjør at programkampanjer ikke vises på siden Ny fane</translation>
-<translation id="4125606414556046117">Med denne regelen kan du konfigurere bakgrunnsbildet som vises på skrivebordet og på brukernes påloggingssider. Du angir denne innstillingen ved å spesifisere hvilken nettadresse <ph name="PRODUCT_OS_NAME" /> kan laste ned bakgrunnsbildet fra, og en kryptografisk hash som brukes til å bekrefte at ingen har tuklet med nedlastingen. Bildet må være i JPEG-format og ikke større enn 16 MB. Nettadressen må være tilgjengelig uten krav om autentisering.
-
-      Bakgrunnsbildet blir lastet ned og bufret. Det lastes ned på nytt hver gang nettadressen eller hashen endres.
-
-      Du må spesifisere denne innstillingen som en streng med nettadressen og hashen i JSON-format – i samsvar med denne malen:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Nettadressen bakgrunnsbildet kan lastes ned fra.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "SHA-256-hashen for bakgrunnsbildet.",
-            "type": "string"
-          }
-        }
-      }
-
-      Hvis denne regelen er angitt, blir bakgrunnsbildet lastet ned og brukt i <ph name="PRODUCT_OS_NAME" />.
-
-      Hvis du angir denne regelen, kan ikke brukerne endre eller overstyre den.
-
-      Hvis denne regelen ikke er angitt, kan brukerne selv velge hvilket bakgrunnsbilde de vil bruke for skrivebordet og påloggingsskjermen.</translation>
 <translation id="412697421478384751">Gjør det mulig for brukere å angi svake PIN-koder for låseskjermen</translation>
 <translation id="4138655880188755661">Tidsgrense</translation>
 <translation id="4144164749344898721">Denne regelen kontrollerer flere innstillinger for strømstyring når brukeren er inaktiv.
@@ -2525,7 +2490,7 @@
 
           Hvis denne innstillingen ikke er konfigurert, legges det ingen begrensninger på godkjente app- og utvidelsestyper.
 
-          Bruk av flere utvidelses-ID-er atskilt med komma støttes ikke før versjon 75 og blir hoppet over. Resten av regelen fortsetter å gjelde.</translation>
+          Bruk av flere utvidelses-ID-er atskilt med komma støttes ikke og ignoreres før versjon 75. Resten av regelen fortsetter å gjelde.</translation>
 <translation id="5645779841392247734">Tillat informasjonskapsler på disse nettstedene</translation>
 <translation id="5689430183304951538">Standard sidestørrelse for utskrift</translation>
 <translation id="5693469654327063861">Tillat dataoverføring</translation>
@@ -2689,53 +2654,6 @@
 
       Hvis denne innstillingen ikke angis, eller angis som feil, kommer utskriftskommandoene til å utløse forhåndsvisningsskjermen for utskrifter.</translation>
 <translation id="6022948604095165524">Handling ved oppstart</translation>
-<translation id="6023030044732320798">Angir et sett med regler som overleveres til ARC-kjøringen. Verdien må være gyldig JSON.
-
-      Denne regelen kan brukes til å konfigurere hvilke Android-apper som installeres automatisk på enheten:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android app-identifikator, for eksempel "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Spesifiserer hvordan en app skal installeres. OPTIONAL: Appen installeres ikke automatisk, men brukeren kan installere den. Denne brukes som standard hvis regelen ikke er angitt. PRELOAD: Appen installeres automatisk, men brukeren kan avinstallere den. FORCE_INSTALLED: Appen installeres automatisk, og brukeren kan ikke avinstallere den. BLOCKED: Appen blokkeres og kan ikke installeres. Hvis appen ble installert under en annen regel, blir den avinstallert.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Regel for å gi tillatelser til apper på forespørsel. PERMISSION_POLICY_UNSPECIFIED: Ingen regel er angitt. Hvis ingen regel er angitt for en tillatelse på noe nivå, brukes funksjonaliteten for `PROMPT` som standard. PROMPT: Spør brukeren om å gi tillatelse. GRANT: Gi tillatelse automatisk. DENY: Avvis tillatelse automatisk.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Appspesifikt JSON-konfigureringsobjekt med et sett med nøkkelverdi-par, for eksempel '"managedConfiguration": { "nøkkel1": verdi1, "nøkkel2": verdi2}'. Nøklene er definert i appmanifestet.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      For å feste apper til appoversikten, se PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Umiddelbar nettadresse for standard søkeleverandør</translation>
 <translation id="603410445099326293">Parametere for forslagsnettadressser som bruker POST</translation>
 <translation id="6034341625190551415">Kontrollerer typer kioskkontoer og offentlige økter.</translation>
@@ -2864,9 +2782,9 @@
 
         Hvis regler står på listen og det oppstår konflikt mellom to kilder med samme omfang og nivå, blir verdiene slått sammen til en ny regelliste.
 
-        Hvis regler står på listen og det oppstår konflikt mellom to kilder som dessuten har ulikt omfang eller nivå, brukes reglene med høyest prioritet.
+        Hvis en regel står på listen og det oppstår konflikt mellom to kilder som dessuten har ulikt omfang eller nivå, brukes regelen som har høyest prioritet.
 
-        Hvis regler ikke står på listen og det oppstår konflikt mellom kilder, omfang eller nivåer, brukes reglene med høyest prioritet.</translation>
+        Hvis en regel ikke står på listen og det oppstår konflikt mellom kilder, omfang eller nivå, brukes regelen som har høyest prioritet.</translation>
 <translation id="6258193603492867656">Angir om den genererte Kerberos-SPN-en skal inneholde en ikke-standard port.
 
           Hvis du aktiverer denne innstillingen, og en ikke-standard port (dvs. en annen port enn 80 eller 443) oppgis, omfattes den av den genererte Kerberos-SPN-en.
@@ -3090,38 +3008,6 @@
       Hvis denne regelen er satt til «false» (usann), brukes aldri den innebygde DNS-klienten.
 
       Hvis denne regelen ikke angis, blir den innebygde DNS-klienten slått på som standard på MacOS, Android (når verken Privat DNS eller VPN er slått på) og ChromeOS, og brukerne kan endre om den innebygde DNS-klienten skal brukes eller ikke, ved å endre chrome://flags eller spesifisere et flagg i kommandolinjen.</translation>
-<translation id="6838056959556423778">Overstyrer reglene for valg av standardskriver i <ph name="PRODUCT_NAME" />.
-
-      Denne regelen fastsetter reglene for valg av standardskriver i <ph name="PRODUCT_NAME" />, noe som skjer den første gangen utskriftsfunksjonen brukes med en profil.
-
-      Når denne regelen er angitt, prøver <ph name="PRODUCT_NAME" /> å finne en skriver som har alle de spesifiserte attributtene, og velger den som standardskriver. Den første skriveren som blir funnet og som samsvarer med regelen, blir valgt. Hvis flere skrivere har alle de spesifiserte attributtene, velges en av dem vilkårlig, avhengig av rekkefølgen de oppdages i.
-
-      Hvis denne regelen ikke er angitt, eller hvis det ikke blir funnet noen skriver som har alle attributtene, innen operasjonen blir tidsavbrutt, blir den innebygde PDF-skriveren valgt. Hvis PDF-skriveren ikke er tilgjengelig, blir det ikke valgt noen skriver.
-
-      Verdien parses som et JSON-objekt i henhold til følgende oppsett:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Om søket etter den samsvarende skriveren skal begrenses til et spesifikt sett med skrivere.",
-            "type": "string" {
-              "enum": [ "local", "cloud" ]
-            }
-          },
-          "idPattern": {
-            "description": "Et regulært uttrykk som samsvarer med skriverens ID.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Et regulært uttrykk som samsvarer med skriverens visningsnavn.",
-            "type": "string"
-          }
-        }
-      }
-
-      Skrivere som kobles til <ph name="CLOUD_PRINT_NAME" />, anses for å være <ph name="PRINTER_TYPE_CLOUD" />. Resten av skriverne klassifiseres som <ph name="PRINTER_TYPE_LOCAL" />.
-      Hvis du hopper over et felt, gjelder alle verdier. Det vil si at hvis du for eksempel ikke spesifiserer tilkoblingsmulighetene, søker forhåndsvisningen av utskrift etter alle slags skrivere – både lokale og i skyen.
-      Mønstrene for regulære uttrykk må følge JavaScript RegExp-syntaksen, og treffene skiller mellom store og små bokstaver.</translation>
 <translation id="6843296367238757293">Denne regelen er avviklet. Vi anbefaler å ikke bruke den. Les mer på https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Denne regelen ble fjernet i <ph name="PRODUCT_NAME" /> 68 og erstattet av <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Denne regelen er avviklet og fjernet i M66, fordi den bare ble brukt til intern testing og er en sikkerhetsrisiko.
@@ -4254,30 +4140,6 @@
       Denne regelen påvirker bare brukere som autentiserer seg via SAML.
 
       Regelverdien skal angis i sekunder.</translation>
-<translation id="9027787254195333560">Med denne regelen kan du konfigurere hvilket brukerbilde som representerer brukeren på påloggingsskjermen. Du angir denne regelen ved å spesifisere nettadressen <ph name="PRODUCT_OS_NAME" /> kan laste ned brukerbildet fra, og en kryptografisk hash som brukes til å bekrefte at ingen har tuklet med nedlastingen. Bildet må være i JPEG-format og ikke større enn 512 kB. Nettadressen må være tilgjengelig uten krav om autentisering.
-
-      Brukerbildet blir lastet ned og bufret. Det lastes ned på nytt hver gang nettadressen eller hashen endres.
-
-      Du må spesifisere denne innstillingen som en streng med nettadressen og hashen i JSON-format – i samsvar med denne malen:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Nettadressen brukerbildet kan lastes ned fra.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "SHA-256-hashen for brukerbildet.",
-            "type": "string"
-          }
-        }
-      }
-
-      Hvis denne regelen er angitt, blir brukerbildet lastet ned og brukt i <ph name="PRODUCT_OS_NAME" />.
-
-      Hvis du angir denne regelen, kan ikke brukerne endre eller overstyre den.
-
-      Hvis denne innstillingen ikke er angitt, kan brukerne velge sine egne brukerbilder for påloggingskjermen.</translation>
 <translation id="9035964157729712237">Utvidelses-ID-er som skal unntas sperrelisten</translation>
 <translation id="9038058011835642205">Spesifiserer en liste over nettsteder som installeres stille (uten brukerinteraksjon) og ikke kan avinstalleres eller deaktiveres av brukeren.
 
@@ -4290,7 +4152,6 @@
       Hvis du angir denne regelen, kan ikke brukerne endre eller overstyre den.
 
       Verdien for denne regelen skal angis i millisekunder. Verdien må være mellom 30 sekunder og 24 timer.</translation>
-<translation id="9042911395677044526">Tillater skyving av nettverkskonfigurasjon for enkeltbrukere på en <ph name="PRODUCT_OS_NAME" />-enhet. Nettverkskonfigurasjon er en JSON-formatert streng, som definert av Open Network Configuration-formatet beskrevet på <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Denne regelen styrer om enheten skal oppdateres til en hurtigfiks-delversjon.
 
       Hvis regelverdien er satt til et token som tilsvarer en hurtigfiks-delversjon, oppdateres enheten til den tilsvarende hurtigfiks-delversjonen hvis ikke oppdateringen blokkeres av en annen regel.
@@ -4370,17 +4231,6 @@
       Hvis denne regelen er angitt som «false» (usant), velges ikke topp- og bunntekst i dialogboksen for forhåndsvisning av utskrifter, og brukeren kan ikke endre dette.
 
       Hvis denne regelen er angitt som «true» (sant), velges topp- og bunntekst i dialogboksen for forhåndsvisning av utskrifter, og brukeren kan ikke endre dette.</translation>
-<translation id="9213347477683611358">Konfigurer bakgrunnsbildet som vises på påloggingsskjermen, på enhentsnivå hvis ingen brukere har logget på enheten ennå. Regelen angis ved å spesifisere nettadressen hvor Chrome OS-enheten kan laste ned bakgrunnsbildet, og dessuten en kryptografisk hash-verdi som brukes til bekrefte nedlastingens integritet. Bildet må være i JPEG-format, og filstørrelsen kan ikke overskride 16 MB. Nettadressen må være tilgjengelig uten autentisering. Bakgrunnsbildet lastes ned og bufres. Det lastes ned på nytt hvis nettadressen eller hash-verdien endres.
-
-      Regelen skal spesifiseres som en streng der nettadressen og hash-verdien skrives i JSON-format, for eksempel
-      {
-        «url»: "https://example.com/device_wallpaper.jpg",
-        «hash»: "examplewallpaperhash"
-      }
-
-      Hvis regelen for enhetsbakgrunn ikke angis, laster Chrome OS ned og bruker bakgrunnsbildet på påloggingsskjermen hvis ingen brukere har logget på enheten ennå. Når en bruker logger på, blir den aktuelle brukerens bakgrunnsregler tatt i bruk.
-
-      Hvis regelen for enhetsbakgrunn ikke angis, bestemmer brukerens bakgrunnsregler hva som vises – såfremt brukerens bakgrunnsregler er angitt.</translation>
 <translation id="9217154963008402249">Frekvensen for nettverkspakker for overvåking</translation>
 <translation id="922540222991413931">Konfigurering av installeringskilder for utvidelser, programmer og brukerskript</translation>
 <translation id="924557436754151212">Importér lagrede passord fra standard nettleser ved første kjøring</translation>
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index 747da4ef..e218613 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -408,7 +408,6 @@
 
       Ostrzeżenie: delegowanie kontroli nad tym, w jakiej wersji ma być używany system <ph name="PRODUCT_OS_NAME" />, do aplikacji kiosku nie jest zalecane, ponieważ w rezultacie urządzenie może nie otrzymywać aktualizacji oprogramowania ani bardzo ważnych poprawek zabezpieczeń. Delegowanie kontroli nad tym, w jakiej wersji ma być używany system <ph name="PRODUCT_OS_NAME" />, może narazić użytkowników na niebezpieczeństwo.</translation>
 <translation id="1675002386741412210">Obsługiwana przez:</translation>
-<translation id="1689963000958717134">Pozwala na przesyłanie konfiguracji sieciowej w trybie push do urządzeń z <ph name="PRODUCT_OS_NAME" /> dla wszystkich użytkowników. Konfiguracja sieci to łańcuch w formacie JSON zgodny z formatem Open Network Configuration opisanym na <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Konfiguruje dostępność i zachowanie funkcji aktualizacji oprogramowania <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Poszczególne ustawienia można określić we właściwościach JSON:
@@ -947,16 +946,6 @@
       Jeśli to ustawienie zostanie wyłączone, strony nie będą mogły używać JavaScriptu, a użytkownik nie będzie mógł zmienić tego ustawienia.
 
       Jeśli to ustawienie będzie włączone lub nieustawione, strony będą mogły używać JavaScriptu, ale użytkownik będzie mógł zmienić to ustawienie.</translation>
-<translation id="2747157663401642394">Konfiguruje ustawienia zarządzania rozszerzeniami w: <ph name="PRODUCT_NAME" />.
-
-          Ta zasada kontroluje wiele ustawień, w tym te kontrolowane przez dotychczasowe zasady związane z rozszerzeniami. Ta zasada zastąpi wszystkie wcześniejsze skonfigurowane zasady.
-
-          Ta zasada mapuje w swojej konfiguracji identyfikator rozszerzenia lub URL aktualizacji. W przypadku identyfikatora rozszerzenia konfiguracja będzie stosowana tylko do oznaczonego nim rozszerzenia. W przypadku rozszerzeń, które nie mają osobnej konfiguracji ustawionej w tej zasadzie, można stosować konfigurację domyślną, określając identyfikator specjalny <ph name="DEFAULT_SCOPE" />. W przypadku adresu URL aktualizacji konfiguracja będzie obowiązywać we wszystkich rozszerzeniach zawierających w swoich plikach manifestu ten konkretny URL aktualizacji, zgodnie z opisem tutaj: <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          W przypadku instancji systemu Windows, które nie są połączone z domeną <ph name="MS_AD_NAME" />, wymuszonej instalacji będą podlegać tylko aplikacje i rozszerzenia z Chrome Web Store.
-
-          Pełny opis struktury tej zasady i możliwych ustawień można znaleźć na https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Ograniczanie zakresu lokalnych portów UDP używanych przez WebRTC</translation>
 <translation id="2757054304033424106">Typy rozszerzeń/aplikacji, które można instalować</translation>
 <translation id="2758084448533744848">Określa strefę czasową, której użycie zostało wymuszone na urządzeniu. Jeśli ustawisz tę zasadę, użytkownicy urządzenia nie będą mogli zmieniać określonej strefy czasowej. Jeśli podasz nieprawidłową wartość, zasada zostanie aktywowana z ustawieniem „GMT”. Jeśli podasz pusty ciąg znaków, zasada będzie ignorowana.
@@ -1182,11 +1171,11 @@
 
       <ph name="PRINTER_DISPLAY_NAME" /> i <ph name="PRINTER_DESCRIPTION" /> to dowolny tekst, który ma ułatwić wybranie drukarki. <ph name="PRINTER_MANUFACTURER" /> i <ph name="PRINTER_MODEL" /> ułatwiają użytkownikom identyfikację drukarki. Oznaczają producenta i model drukarki. <ph name="PRINTER_URI" /> to adres, który powinien być dostępny z komputera klienckiego, zawierający te składniki: <ph name="URI_SCHEME" />, <ph name="URI_PORT" /> i <ph name="URI_QUEUE" />. Opcjonalny składnik to <ph name="PRINTER_UUID" />. Jeśli jest podany, umożliwia usunięcie duplikatów drukarek <ph name="ZEROCONF_DISCOVERY" />.
 
-      Ciąg znaków <ph name="PRINTER_EFFECTIVE_MODEL" /> musi być zgodny z jednym z ciągów oznaczających drukarkę współpracującą z <ph name="PRODUCT_NAME" />. Zostanie on użyty do zidentyfikowania oraz zainstalowania pliku PPD odpowiedniego dla drukarki. Więcej informacji znajdziesz na https://support.google.com/chrome?p=noncloudprint.
+      Ciąg znaków <ph name="PRINTER_EFFECTIVE_MODEL" /> musi być zgodny z jednym z ciągów oznaczających drukarkę współpracującą z <ph name="PRODUCT_NAME" />. Zostanie on użyty do zidentyfikowania oraz zainstalowania pliku PPD odpowiedniego dla drukarki. Więcej informacji znajdziesz na stronie https://support.google.com/chrome?p=noncloudprint.
 
       <ph name="PRINTER_AUTOCONF" /> to flaga wartości logicznej, która określa, czy do konfiguracji drukarki ma zostać użyty standard IPP Everywhere. Ta flaga działa w <ph name="PRODUCT_OS_NAME" /> w wersji 76 i nowszych.
 
-      Musi zostać spełniony jeden z dwóch warunków: <ph name="PRINTER_EFFECTIVE_MODEL" /> musi zawierać nazwę drukarki lub ustawienie <ph name="PRINTER_AUTOCONF" /> musi mieć wartość Prawda. Drukarki z obydwiema tymi właściwościami lub nieposiadające żadnej z nich będą ignorowane.
+      Musi zostać spełniony jeden z dwóch warunków: <ph name="PRINTER_EFFECTIVE_MODEL" /> musi zawierać nazwę drukarki lub ustawienie <ph name="PRINTER_AUTOCONF" /> musi mieć wartość Prawda. Drukarki spełniające oba te warunki lub niespełniające żadnego z nich będą ignorowane.
 
       Konfiguracja drukarki jest wykonywana podczas jej pierwszego użycia.  Pliki PPD nie są pobierane przed użyciem drukarki.  Później często używane pliki PPD są przechowywane w pamięci podręcznej.
 
@@ -1410,7 +1399,7 @@
       Jeśli ta zasada jest ustawiona na wartość „DeveloperToolsAllowed” (wartość 1), narzędzia dla deweloperów i konsola JavaScript są dostępne we wszystkich kontekstach, również w kontekście rozszerzeń zainstalowanych przez zasady przedsiębiorstwa.
       Jeśli ta zasada jest ustawiona na wartość „DeveloperToolsDisallowed” (wartość 2), narzędzia dla deweloperów są niedostępne i nie można badać elementów na stronach. Wyłączone będą wszystkie skróty klawiszowe oraz pozycje menu i menu kontekstowego, które otwierają narzędzia dla deweloperów i konsolę JavaScript.</translation>
 <translation id="3547954654003013442">Ustawienia serwera proxy</translation>
-<translation id="3550875587920006460">Umożliwia ustawienie niestandardowego harmonogramu sprawdzania dostępności aktualizacji. Dotyczy to wszystkich użytkowników oraz wszystkich interfejsów na urządzeniu. Po ustawieniu zasady urządzenie sprawdza dostępność aktualizacji zgodnie z harmonogramem. Aby anulować kolejne zaplanowane sprawdzanie dostępności aktualizacji, musisz usunąć tę zasadę.</translation>
+<translation id="3550875587920006460">Umożliwia ustawienie niestandardowego harmonogramu sprawdzania dostępności aktualizacji. Dotyczy to wszystkich użytkowników oraz wszystkich interfejsów na urządzeniu. Po skonfigurowaniu zasady urządzenie sprawdza dostępność aktualizacji zgodnie z harmonogramem. Aby anulować kolejne zaplanowane sprawdzanie dostępności aktualizacji, musisz usunąć tę zasadę.</translation>
 <translation id="355118380775352753">Witryny otwierane w alternatywnej przeglądarce</translation>
 <translation id="3554984410014457319">Zezwól Asystentowi Google nasłuchiwać wyrażenia aktywującego obsługę komend głosowych</translation>
 <translation id="356579196325389849">Użytkownicy mogą skonfigurować kanał wersji Chrome OS</translation>
@@ -1642,21 +1631,21 @@
       Jeśli nie skonfigurujesz tej zasady lub ustawisz dla niej wartość prawda, użytkownicy będą mogli wykorzystywać oferty przy rejestracji systemu operacyjnego Chrome.
 
       Jeśli ustawisz tu wartość fałsz, użytkownicy nie będą mogli wykorzystywać ofert.</translation>
-<translation id="4008233182078913897">Określa listę aplikacji i rozszerzeń, które zostaną zainstalowane dyskretnie, bez interakcji z użytkownikiem, a użytkownik nie będzie mógł ich odinstalować ani wyłączyć. Aplikacje/rozszerzenia bez interakcji z użytkownikiem otrzymają wszystkie uprawnienia, o które proszą, w tym wszelkie dodatkowe uprawnienia, o które będą prosić przyszłe ich wersje. Otrzymają też uprawnienia do interfejsów API dla rozszerzeń enterprise.deviceAttributes i enterprise.platformKeys. (Te dwa interfejsy API nie są dostępne dla aplikacji/rozszerzeń, których instalacja nie jest wymuszana).
+<translation id="4008233182078913897">Określa listę aplikacji i rozszerzeń, które zostaną zainstalowane dyskretnie, bez interakcji z użytkownikiem, a użytkownik nie będzie mógł ich odinstalować ani wyłączyć. Aplikacje/rozszerzenia otrzymają bez interakcji z użytkownikiem wszystkie uprawnienia, o które proszą, w tym wszelkie dodatkowe uprawnienia, o które będą prosić ich przyszłe wersje. Otrzymają też uprawnienia do interfejsów API dla rozszerzeń enterprise.deviceAttributes i enterprise.platformKeys. (Te dwa interfejsy API są niedostępne w przypadku aplikacji/rozszerzeń, których instalacja nie jest wymuszana).
 
-Ta zasada ma pierwszeństwo przed potencjalnie powodującą konflikt zasadą <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />. Jeśli z tej listy zostaną usunięte aplikacja lub rozszerzenie, których instalacja została wymuszona wcześniej, <ph name="PRODUCT_NAME" /> automatycznie je odinstaluje.
+Ta zasada ma pierwszeństwo przed potencjalnie powodującą konflikt zasadą <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />. Jeśli z tej listy zostaną usunięte aplikacje lub rozszerzenia, których instalacja została wymuszona wcześniej, <ph name="PRODUCT_NAME" /> automatycznie je odinstaluje.
 
 W przypadku systemów Windows niepodłączonych do domeny <ph name="MS_AD_NAME" /> wymuszona instalacja jest ograniczona do aplikacji i rozszerzeń dostępnych w Chrome Web Store.
 
-Pamiętaj, że kod źródłowy każdego rozszerzenia można zmodyfikować za pomocą Narzędzi dla programistów (potencjalnie zakłócając jego działanie). Jeśli jest to problemem, ustaw zasadę <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
+Pamiętaj, że kod źródłowy każdego rozszerzenia można zmodyfikować za pomocą Narzędzi dla programistów (potencjalnie zakłócając jego działanie). Jeśli stanowi to problem, skonfiguruj zasadę <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
 
-Każdy element na liście tej zasady jest ciągiem zawierającym identyfikator rozszerzenia i opcjonalnie URL „aktualizacji” oddzielone średnikiem (<ph name="SEMICOLON" />). Identyfikator rozszerzenia to ciąg 32 znaków, który znajdziesz np. na <ph name="CHROME_EXTENSIONS_LINK" /> w trybie programisty. URL „aktualizacji” powinien wskazywać plik manifestu aktualizacji w postaci dokumentu XML, zgodnie z opisem na <ph name="LINK_TO_EXTENSION_DOC1" />. Domyślnie używany jest URL aktualizacji Chrome Web Store (obecnie to „https://clients2.google.com/service/update2/crx”). Uwaga: URL „aktualizacji” ustawiony przez tę zasadę jest używany tylko podczas pierwszej instalacji. Późniejsze aktualizacje rozszerzenia korzystają z adresu URL aktualizacji wskazanego w pliku manifestu. Pamiętaj też, że podanie adresu URL „aktualizacji” było obowiązkowe w <ph name="PRODUCT_NAME" /> do wersji 67 włącznie.
+Każdy element na liście tej zasady jest ciągiem zawierającym identyfikator rozszerzenia i opcjonalnie adres URL „aktualizacji” oddzielone średnikiem (<ph name="SEMICOLON" />). Identyfikator rozszerzenia to ciąg 32 znaków, który znajdziesz np. na <ph name="CHROME_EXTENSIONS_LINK" /> w trybie programisty. Adres URL „aktualizacji” powinien wskazywać plik manifestu aktualizacji w postaci dokumentu XML, zgodnie z opisem na <ph name="LINK_TO_EXTENSION_DOC1" />. Domyślnie używany jest adres URL „aktualizacji” Chrome Web Store (obecnie to „https://clients2.google.com/service/update2/crx”). Uwaga: adres URL „aktualizacji” ustawiony przez tę zasadę jest używany tylko podczas pierwszej instalacji. Późniejsze aktualizacje rozszerzenia korzystają z adresu URL „aktualizacji” wskazanego w pliku manifestu. Pamiętaj też, że podanie adresu URL „aktualizacji” było obowiązkowe w <ph name="PRODUCT_NAME" /> do wersji 67 włącznie.
 
-Na przykład <ph name="EXTENSION_POLICY_EXAMPLE" /> instaluje rozszerzenie o identyfikatorze <ph name="EXTENSION_ID_SAMPLE" /> ze standardowego adresu URL „aktualizacji” Chrome Web Store. Więcej informacji o hostowaniu rozszerzeń znajdziesz na <ph name="LINK_TO_EXTENSION_DOC2" />.
+Na przykład <ph name="EXTENSION_POLICY_EXAMPLE" /> instaluje rozszerzenie o identyfikatorze <ph name="EXTENSION_ID_SAMPLE" /> ze standardowego adresu URL „aktualizacji” Chrome Web Store. Więcej informacji o hostowaniu rozszerzeń znajdziesz na stronie <ph name="LINK_TO_EXTENSION_DOC2" />.
 
-Jeśli ta zasada nie jest ustawiona, aplikacje ani rozszerzenia nie są instalowane automatycznie, a użytkownik może odinstalować dowolne z nich w <ph name="PRODUCT_NAME" />.
+Jeśli ta zasada nie jest skonfigurowana, aplikacje ani rozszerzenia nie są instalowane automatycznie, a użytkownik może odinstalować dowolne z nich w <ph name="PRODUCT_NAME" />.
 
-Uwaga: ta zasada nie jest stosowana do trybu incognito.</translation>
+Uwaga: ta zasada nie ma zastosowania do trybu incognito.</translation>
 <translation id="4008507541867797979">Gdy ta zasada ma wartość prawda lub jest nieskonfigurowana, <ph name="PRODUCT_OS_NAME" /> będzie wyświetlać istniejących użytkowników na ekranie logowania i umożliwiać wybranie jednego z nich.
 
       Gdy zasada ma wartość fałsz, <ph name="PRODUCT_OS_NAME" /> nie będzie wyświetlać istniejących użytkowników na ekranie logowania. Wyświetlony zostanie normalny ekran logowania (umożliwiający wpisanie adresu e-mail i hasła lub numeru telefonu użytkownika) lub ekran SAML (jeśli jest włączony przy użyciu zasady <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" />), chyba że skonfigurowana jest sesja zarządzania – w takim przypadku wyświetlane będą tylko konta z sesją zarządzaną i będzie można wybrać jedno z nich.
@@ -1706,30 +1695,6 @@
       Ta zasada ma wpływ tylko na użytkowników uwierzytelniających się za pomocą SAML.</translation>
 <translation id="4105989332710272578">Wyłącz egzekwowanie protokołu Certificate Transparency dla adresów URL z listy</translation>
 <translation id="4121350739760194865">Zablokuj wyświetlanie promocji aplikacji na stronie Nowa karta</translation>
-<translation id="4125606414556046117">Ta zasada umożliwia skonfigurowanie obrazu tapety, który użytkownik widzi na pulpicie i na ekranie logowania Zasadę konfiguruje się przez podanie adresu URL, z którego <ph name="PRODUCT_OS_NAME" /> może pobrać obraz tapety, oraz hasha kryptograficznego służącego do weryfikacji integralności pobranego pliku. Obraz musi mieć format JPEG i nie może być większy niż 16 MB. URL musi być dostępny bez uwierzytelniania.
-
-      Obraz tapety jest pobierany i przechowywany w pamięci podręcznej. Zostanie pobrany ponownie po każdej zmianie adresu URL lub hasha.
-
-      Zasada musi być podana w postaci ciągu w formacie JSON zawierającego URL i hash, zgodnie z tym schematem:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Adres URL, z którego można pobrać obraz tapety.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Skrót SHA-256 obrazu tapety.",
-            "type": "string"
-          }
-        }
-      }
-
-Jeśli ta zasada jest skonfigurowana, <ph name="PRODUCT_OS_NAME" /> będzie pobierać obraz tapety i go używać.
-
-      Jeśli skonfigurujesz tę zasadę, użytkownicy nie będą mogli jej zmienić ani zastąpić.
-
-      Jeśli zasada pozostanie nieskonfigurowana, użytkownicy będą mogli samodzielnie wybierać obrazy wyświetlane na pulpicie i jako tło na ekranie logowania.</translation>
 <translation id="412697421478384751">Zezwalaj użytkownikom na ustawianie słabych kodów PIN blokady ekranu</translation>
 <translation id="4138655880188755661">Limit czasu</translation>
 <translation id="4144164749344898721">Ta zasada określa szereg ustawień strategii zarządzania energią, która jest stosowana, gdy użytkownik jest nieaktywny.
@@ -1759,7 +1724,7 @@
 <translation id="4150201353443180367">Wyświetlacz</translation>
 <translation id="4157003184375321727">Zgłoś wersje systemu operacyjnego i oprogramowania układowego</translation>
 <translation id="4157594634940419685">Zezwalaj na dostęp do natywnych drukarek CUPS</translation>
-<translation id="4160962198980004898">Źródło adresu MAC urządzenia zadokowanego</translation>
+<translation id="4160962198980004898">Źródło adresu MAC zadokowanego urządzenia</translation>
 <translation id="4163705126749612234">Służy do konfigurowania wymaganych nazw domen klientów, które będą stosowane do klientów dostępu zdalnego. Blokuje też użytkownikom możliwość zmiany tych nazw.
 
           Jeśli ta zasada jest włączona, z hostem mogą się łączyć tylko klienty ze wskazanych domen.
@@ -2605,10 +2570,10 @@
 <translation id="5898486742390981550">Gdy zalogowanych jest wielu użytkowników, tylko główny użytkownik może używać aplikacji na Androida.</translation>
 <translation id="5901427587865226597">Tylko drukowanie dwustronne</translation>
 <translation id="5903898512448364160">
-      Po wybraniu dla tej zasady wartości Prawda zasady dotyczące chmury mają pierwszeństwo przed zasadami dotyczącymi platformy, gdy z nimi kolidują.
-      Jeśli ta zasada ma wartość Fałsz lub nie jest skonfigurowana, zasady dotyczące platformy mają pierwszeństwo przed zasadami dotyczącymi chmury, gdy z nimi kolidują.
+      Po wybraniu dla tej zasady wartości Prawda zasady chmury mają pierwszeństwo przed zasadami platformy, gdy z nimi kolidują.
+      Jeśli ta zasada ma wartość Fałsz lub nie jest skonfigurowana, zasady platformy mają pierwszeństwo przed zasadami chmury, gdy z nimi kolidują.
 
-      Ta zasada jest dostępna tylko jako obowiązkowa zasada platformy komputera i ma zastosowanie wyłącznie do zasad dotyczących chmury obejmujących cały komputer.
+      Ta zasada jest dostępna tylko jako obowiązkowa zasada platformy komputera i ma wpływ wyłącznie na zasady chmury, które obejmują cały komputer.
       </translation>
 <translation id="5905473632148429217">Włącz sprawdzanie OCSP/CRL online</translation>
 <translation id="5906199912611534122">Umożliwia włączenie lub wyłączenie ograniczenia przepustowości sieci.
@@ -2651,53 +2616,6 @@
 
       Jeśli ta opcja będzie nieustawiona lub wyłączona, polecenia wydruku będą wyświetlać ekran podglądu.</translation>
 <translation id="6022948604095165524">Działanie po uruchomieniu</translation>
-<translation id="6023030044732320798">Określa zestaw zasad przesyłany do środowiska wykonawczego ARC. Wartość musi być prawidłowym kodem JSON.
-
-      Za pomocą tej zasady można wskazać aplikacje na Androida, które mają być automatycznie instalowane na urządzeniu:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "identyfikator aplikacji na Androida, np. "com.google.android.gm" w przypadku Gmaila",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Określa sposób instalowania aplikacji. OPTIONAL: aplikacja nie jest instalowana automatycznie, ale użytkownik może ją zainstalować. To ustawienie domyślne, gdy ta zasada nie jest skonfigurowana. PRELOAD: aplikacja jest instalowana automatycznie, ale użytkownik może ją odinstalować. FORCE_INSTALLED: aplikacja jest instalowana automatycznie i użytkownik nie może jej odinstalować. BLOCKED: aplikacja jest zablokowana i nie można jej zainstalować. Jeśli aplikacja została zainstalowana podczas obowiązywania wcześniejszej zasady, zostanie odinstalowana.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Zasada przyznawania uprawnień aplikacjom. PERMISSION_POLICY_UNSPECIFIED: zasada nie jest określona. Jeśli uprawnienie nie ma zasady na żadnym poziomie, domyślnie stosowane jest zachowanie PROMPT. PROMPT: użytkownik jest proszony o przyznanie uprawnień. GRANT: automatyczne przyznanie uprawnień. DENY: automatyczna odmowa uprawnień.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Obiekt JSON z konfiguracją specyficzną dla danej aplikacji w postaci par klucz-wartość, np. '"managedConfiguration": { "klucz1": wartość1, "klucz2": wartość2 }'. Klucze są zdefiniowane w manifeście aplikacji.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Przypinanie aplikacji do menu startowego, zobacz PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Adres URL wyszukiwania dynamicznego od domyślnego dostawcy wyszukiwania</translation>
 <translation id="603410445099326293">Parametry dla sugerowania URL-i używających POST</translation>
 <translation id="6034341625190551415">Kontroluje sesje publiczne i rodzaje kont kiosku.</translation>
@@ -3045,37 +2963,6 @@
       Jeśli dla tej zasady wybrane jest ustawienie Fałsz, wbudowany klient DNS nigdy nie będzie używany.
 
       Jeśli ta zasada jest nieskonfigurowana, wbudowany klient DNS będzie domyślnie włączony w MacOS, Androidzie (jeśli nie włączono ani prywatnego serwera DNS, ani sieci VPN) i Chrome OS. Poza tym użytkownicy będą mogli włączać i wyłączać wbudowanego klienta DNS na stronie chrome://flags lub za pomocą flagi wiersza poleceń.</translation>
-<translation id="6838056959556423778">Zastępuje reguły wybierania domyślnej drukarki w <ph name="PRODUCT_NAME" />.
-
-      Ta zasada określa reguły wybierania domyślnej drukarki w <ph name="PRODUCT_NAME" />. Ma to miejsce podczas pierwszego użycia funkcji drukowania w danym profilu.
-
-      Gdy ta zasada jest skonfigurowana, <ph name="PRODUCT_NAME" /> spróbuje znaleźć drukarkę odpowiadającą wszystkim określonym atrybutom, a następnie wybierze ją jako domyślną. Wybierana jest pierwsza znaleziona drukarka, która odpowiada atrybutom. Jeśli jest kilka drukarek odpowiadających atrybutom, wybrana może być dowolna z nich – znaczenie ma tutaj kolejność ich wykrycia.
-
-      Jeśli zasada nie jest skonfigurowana lub drukarka odpowiadająca atrybutom nie zostanie znaleziona w przeznaczonym na to czasie, jako domyślna wybierana jest wbudowana drukarka PDF, a jeśli nie jest ona dostępna, drukarka domyślna nie jest wybierana.
-
-      Wartość musi być obiektem JSON o następującym schemacie:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Czy ograniczyć wyszukiwanie do określonego zbioru drukarek.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Wyrażenie regularne określające identyfikator drukarki.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Wyrażenie regularne określające wyświetlaną nazwę drukarki.",
-            "type": "string"
-          }
-        }
-      }
-
-      Typ <ph name="PRINTER_TYPE_CLOUD" /> to drukarki połączone z <ph name="CLOUD_PRINT_NAME" />, pozostałe to typ <ph name="PRINTER_TYPE_LOCAL" />.
-      Pominięcie któregoś pola oznacza, że brane są pod uwagę wszystkie wartości, np. jeśli nie określisz typu połączenia, funkcja podglądu wydruku zacznie wykrywać wszystkie rodzaje drukarek – lokalne i w chmurze.
-      Wyrażenia regularne muszą mieć składnię JavaScript RegExp. Rozróżniana jest wielkość liter.</translation>
 <translation id="6843296367238757293">Ta zasada jest wycofana. Nie zalecamy jej używania. Więcej informacji: https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Ta zasada została usunięta w <ph name="PRODUCT_NAME" /> 68 i zastąpiona zasadą <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Ta zasada została wycofana i usunięta w M66, ponieważ była używana tylko do testów wewnętrznych i obniżała bezpieczeństwo.
@@ -4203,30 +4090,6 @@
       Ta zasada dotyczy tylko użytkowników, którzy uwierzytelnili się za pomocą SAML.
 
       Wartość zasady należy podać w sekundach.</translation>
-<translation id="9027787254195333560">Ta zasada pozwala wskazać obraz awatara, który oznacza użytkownika na ekranie logowania. Aby ją skonfigurować, podaj URL, z którego <ph name="PRODUCT_OS_NAME" /> może pobrać obraz awatara, oraz hash kryptograficzny używany do weryfikacji poprawności pobranego pliku. Obraz musi być w formacie JPEG, a jego rozmiar nie może przekraczać 512 KB. URL musi być dostępny bez uwierzytelniania.
-
-      Po pobraniu obraz awatara jest zapisywany w pamięci podręcznej. Zostanie pobrany ponownie po każdej zmianie adresu URL lub hasha.
-
-      Zasada musi być podana w postaci ciągu w formacie JSON zawierającego URL i hash, zgodnie z tym schematem:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL, z którego można pobrać obraz awatara.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hash SHA-256 obrazu awatara.",
-            "type": "string"
-          }
-        }
-      }
-
-Po skonfigurowaniu tej zasady <ph name="PRODUCT_OS_NAME" /> pobiera obraz awatara i korzysta z niego.
-
-      Jeśli skonfigurujesz tę zasadę, użytkownicy nie będą mogli jej zmienić ani zastąpić.
-
-      Jeśli zasada pozostanie nieskonfigurowana, użytkownik może wybrać obraz awatara, który będzie oznaczał go na ekranie logowania.</translation>
 <translation id="9035964157729712237">Identyfikatory rozszerzeń nieobjętych czarną listą</translation>
 <translation id="9038058011835642205">Służy do określenia listy witryn, które są instalowane dyskretnie (bez interakcji z użytkownikiem) i których użytkownik nie może odinstalować ani wyłączyć.
 
@@ -4239,7 +4102,6 @@
       Jeśli skonfigurujesz tę zasadę, użytkownicy nie będą mogli jej zmienić ani zastąpić.
 
       Wartość ustawienia tej zasady należy podać w milisekundach. Dozwolone są wartości od 30 sekund do 24 godzin.</translation>
-<translation id="9042911395677044526">Pozwala na przesyłanie konfiguracji sieciowej w trybie push do urządzeń z <ph name="PRODUCT_OS_NAME" /> dla poszczególnych użytkowników. Konfiguracja sieci to łańcuch w formacie JSON zgodny z formatem Open Network Configuration opisanym na <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Ta zasada określa, czy urządzenie ma zostać zaktualizowane pod kątem kompilacji Quick Fix.
 
       Jeśli jako wartość zasady zostanie ustawiony token mapujący kompilację Quick Fix, urządzenie zostanie zaktualizowane pod kątem odpowiedniej kompilacji Quick Fix, chyba że inna zasada zablokuje aktualizację.
@@ -4310,17 +4172,6 @@
       Jeśli zasada ma wartość fałsz, opcja „Nagłówki i stopki” jest wyłączona w oknie podglądu wydruku, a użytkownik nie może jej zmienić.
 
       Jeśli zasada ma wartość prawda, opcja „Nagłówki i stopki” jest włączona w oknie podglądu wydruku, a użytkownik nie może jej zmienić.</translation>
-<translation id="9213347477683611358">Skonfiguruj tapetę na poziomie urządzenia wyświetlaną na ekranie logowania, jeśli żaden użytkownik nie jest jeszcze zalogowany na urządzeniu. Aby ustawić tę zasadę, podaj adres URL, z którego urządzenie z Chrome OS może pobrać tapetę, a także skrót kryptograficzny używany do weryfikacji poprawności pobranego pliku. Obraz musi być w formacie JPEG, a jego rozmiar nie może przekraczać 16 MB. URL musi być dostępny bez żadnego uwierzytelniania. Po pobraniu tapeta jest zapisywana w pamięci podręcznej. Gdy URL lub skrót się zmieni, pobieranie jest powtarzane.
-
-      Zasadę należy zdefiniować jako ciąg znaków w formacie JSON zawierający URL i skrót, zgodnie z tym schematem:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "przykladowyskrottapety"
-      }
-
-      Jeśli zasada tapety urządzenia jest ustawiona, urządzenie z Chrome OS pobiera tapetę i wyświetla ją na ekranie logowania, gdy żaden użytkownik nie jest jeszcze zalogowany na urządzeniu. Gdy użytkownik się zaloguje, zaczyna działać zasada tapety tego użytkownika.
-
-      Jeśli zasada tapety na urządzeniu nie jest ustawiona, o wyświetlaniu tapety decyduje zasada tapety użytkownika (jeśli jest ustawiona).</translation>
 <translation id="9217154963008402249">Częstotliwość pakietów sieciowych monitorowania</translation>
 <translation id="922540222991413931">Konfiguruj źródła instalacji rozszerzeń, aplikacji i skryptów użytkownika</translation>
 <translation id="924557436754151212">Importuj zapisane hasła z przeglądarki domyślnej przy pierwszym uruchomieniu</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index c394e410..d859be5a 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -405,7 +405,6 @@
 
       Aviso: não é recomendado que o controle da versão do <ph name="PRODUCT_OS_NAME" /> seja delegado a um aplicativo de quiosque, pois ele pode impedir que o dispositivo receba atualizações de software e correções de segurança críticas. Delegar o controle da versão do <ph name="PRODUCT_OS_NAME" /> pode colocar os usuários em risco.</translation>
 <translation id="1675002386741412210">Com suporte em:</translation>
-<translation id="1689963000958717134">Permite que a configuração de rede seja aplicada a todos os usuários de dispositivos <ph name="PRODUCT_OS_NAME" />. A configuração de rede é uma string formatada em JSON, conforme definido pelo formato Open Network Configuration descrito em <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Configura a disponibilidade e o comportamento da funcionalidade de atualização do firmware do <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       As configurações individuais podem ser especificadas nas propriedades JSON:
@@ -941,16 +940,6 @@
       Se esta configuração for desativada, as páginas da Web não poderão usar JavaScript, e o usuário não poderá alterá-la.
 
       Se esta configuração for ativada ou não for definida, as páginas da Web poderão usar JavaScript, mas o usuário poderá alterá-la.</translation>
-<translation id="2747157663401642394">Define as configurações do gerenciamento de extensão do <ph name="PRODUCT_NAME" />.
-
-          Esta política controla várias configurações, inclusive aquelas controladas pelas políticas existentes relacionadas a extensões. Esta política substituirá todas as políticas legadas se ambas estiverem definidas.
-
-          Esta política mapeia um código de extensão ou um URL de atualização para a própria configuração. Com um código de extensão, a configuração será aplicada apenas à extensão especificada. Uma configuração padrão pode ser definida para o código especial <ph name="DEFAULT_SCOPE" />, que será aplicado a todas as extensões que não tiverem um conjunto de configurações personalizadas nesta política. Com um URL de atualização, a configuração será aplicada a todas as extensões com o URL de atualização exato indicado no manifesto dessa extensão, como descrito em <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Para instâncias do Windows que não estão associadas a um domínio <ph name="MS_AD_NAME" />, a instalação forçada é limitada a apps e extensões listados na Chrome Web Store.
-
-          Para ver uma descrição completa das possíveis configurações e estrutura desta política, visite https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Restringir o alcance das portas UDP locais usadas por WebRTC</translation>
 <translation id="2757054304033424106">Tipos de extensões/aplicativos que podem ser instalados</translation>
 <translation id="2758084448533744848">Especifica o fuso horário aplicado que será usado no dispositivo. Quando esta política é definida, os usuários no dispositivo não podem modificar o fuso horário especificado. Se um valor inválido for inserido, a política continuará ativada e usará "GMT". Se uma string vazia for inserida, a política será ignorada.
@@ -1699,30 +1688,6 @@
 Esta política afeta apenas os usuários que autenticam usando SAML.</translation>
 <translation id="4105989332710272578">Desativar a aplicação da Transparência dos certificados para uma lista de URLs</translation>
 <translation id="4121350739760194865">Evitar que promoções de aplicativos apareçam na página nova guia</translation>
-<translation id="4125606414556046117">Esta política permite que você configure a imagem de plano de fundo mostrada na área de trabalho e na tela de login do usuário. A política é definida ao especificar o URL a partir do qual o <ph name="PRODUCT_OS_NAME" /> pode fazer o download da imagem de plano de fundo e uma hash criptográfica usada para verificar a integridade do download. A imagem precisa estar no formato JPEG, e o tamanho desse arquivo não pode ultrapassar 16 MB. É necessário que o URL possa ser acessado sem qualquer tipo de autenticação.
-
-      A imagem do plano de fundo é transferida por download e armazenada em cache. O download será refeito sempre que o URL ou a hash mudarem.
-
-      A política precisa ser especificada como uma string que expressa o URL e a hash no formato JSON, de acordo com este esquema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL de onde a imagem de plano de fundo pode ser transferida por download.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "A hash SHA-256 da imagem do plano de fundo.",
-            "type": "string"
-          }
-        }
-      }
-
-      Se esta política for definida, o <ph name="PRODUCT_OS_NAME" /> fará o download e usará a imagem do plano de fundo.
-
-      Se você definir esta política, os usuários não poderão alterá-la ou substituí-la.
-
-      Se a política não for definida, os usuários poderão escolher uma imagem para ser exibida na área de trabalho e na tela de login.</translation>
 <translation id="412697421478384751">Permitir que os usuários definam PINs fracos para a tela de bloqueio</translation>
 <translation id="4138655880188755661">Limite de tempo</translation>
 <translation id="4144164749344898721">Esta política controla várias configurações para a estratégia de gerenciamento de energia quando o usuário fica inativo.
@@ -2630,53 +2595,6 @@
 
       Se esta política não estiver definida ou se estiver definida como falsa, os comandos de impressão acionarão a tela de visualização de impressão.</translation>
 <translation id="6022948604095165524">Ação na inicialização</translation>
-<translation id="6023030044732320798">Especifica um conjunto de políticas que serão entregues ao tempo de execução de ARC. O valor deve ser um JSON válido.
-
-      Esta política pode ser usada para configurar quais aplicativos Android são instalados automaticamente no dispositivo:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "identificador do aplicativo Android, por exemplo, "com.google.android.gm" para Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Especifica como um aplicativo é instalado. OPTIONAL: o aplicativo não é instalado automaticamente, mas o usuário pode instalá-lo. Esse será o padrão se essa política não for especificada. PRELOAD: o aplicativo é instalado automaticamente, mas o usuário pode desinstalá-lo. FORCE_INSTALLED: o aplicativo é instalado automaticamente, e o usuário não pode desinstalá-lo. BLOCKED: o aplicativo é bloqueado e não pode ser instalado. Se o aplicativo tiver sido instalado com uma política anterior, ele será desinstalado.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Política para conceder solicitações de permissão a aplicativos. PERMISSION_POLICY_UNSPECIFIED: política não especificada. Se nenhuma política for especificada para uma permissão em nenhum nível, o comportamento `PROMPT` será usado por padrão. PROMPT: solicitar que o usuário para conceda uma permissão. GRANT: conceder uma permissão automaticamente. DENY: negar uma permissão automaticamente.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Objeto de configuração JSON específico do aplicativo com um conjunto de pares de chave-valor, por exemplo, '"managedConfiguration": { "key1": value1, "key2": value2 }'. As chaves são definidas no manifesto do aplicativo.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Para fixar aplicativos na tela de início, consulte PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL instantâneo do provedor de pesquisa padrão</translation>
 <translation id="603410445099326293">Parâmetros para URL de sugestões que usa POST</translation>
 <translation id="6034341625190551415">Controla sessões públicas e tipos de conta de quiosque.</translation>
@@ -3024,37 +2942,6 @@
       Se esta política estiver definida como falsa, o cliente DNS integrado nunca será usado.
 
       Se esta política não for definida, o cliente DNS integrado será ativado por padrão no MacOS, Android (quando nem o DNS privado nem a VPN estiverem ativados) e no ChromeOS, e os usuários poderão decidir se o cliente DNS integrado será usado pela edição de chrome://flags ou pela especificação da sinalização de uma linha de comando.</translation>
-<translation id="6838056959556423778">Modifica as regras de seleção de impressora padrão do <ph name="PRODUCT_NAME" />.
-
-      Esta política determina as regras para seleção da impressora padrão no <ph name="PRODUCT_NAME" />, o que ocorre na primeira vez em que a função de impressão é usada com um perfil.
-
-      Quando esta política é configurada, o <ph name="PRODUCT_NAME" /> tenta encontrar uma impressora que corresponda a todos os atributos especificados e a seleciona como impressora padrão. A primeira impressora encontrada que corresponda à política é selecionada. Caso haja mais de uma correspondência, qualquer impressora correspondente pode ser selecionada, dependendo da ordem em que as impressoras são descobertas.
-
-      Se esta política não for configurada ou se a impressora correspondente não for encontrada dentro do tempo limite, a impressora padrão passará a ser a impressora de PDF incorporada ou "nenhuma impressora selecionada", quando a impressora de PDF não estiver disponível.
-
-      O valor é analisado como um objeto JSON, em conformidade com o seguinte esquema:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Limitar ou não a pesquisa da impressora correspondente a um conjunto específico de impressoras.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Expressão regular que corresponda ao código da impressora.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Expressão regular que corresponda ao nome de exibição da impressora.",
-            "type": "string"
-          }
-        }
-      }
-
-      As impressoras conectadas ao <ph name="CLOUD_PRINT_NAME" /> são consideradas <ph name="PRINTER_TYPE_CLOUD" />, e as demais são classificadas como <ph name="PRINTER_TYPE_LOCAL" />.
-      A omissão de um campo significa que todos os valores correspondem. Por exemplo, a não especificação da conectividade fará com que a visualização da impressão inicie a descoberta de todos os tipos de impressoras, locais e na nuvem.
-      Os padrões de expressão regulares devem seguir a sintaxe do JavaScript RegExp, e as correspondências diferenciam maiúsculas de minúsculas.</translation>
 <translation id="6843296367238757293">Essa política está obsoleta. Seu uso não é recomendável. Leia mais em https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Esta política foi removida no <ph name="PRODUCT_NAME" /> 68 e substituída por <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">O uso desta política está suspenso. A política foi removida na versão M66 porque era usada apenas para testes internos e representava risco de segurança.
@@ -4185,30 +4072,6 @@
       Esta política só afeta usuários que fizeram a autenticação com SAML.
 
       O valor da política precisa ser especificado em segundos.</translation>
-<translation id="9027787254195333560">Esta política permite que você configure a imagem de avatar que representa o usuário na tela de login. A política é definida pela especificação do URL do qual o <ph name="PRODUCT_OS_NAME" /> pode fazer o download da imagem de avatar e de uma hash criptográfica usada para verificar a integridade do download. A imagem precisa estar no formato JPEG. O tamanho não pode ser superior a 512 KB. É necessário que o URL possa ser acessado sem qualquer tipo de autenticação.
-
-      A imagem de avatar será transferida por download e armazenada em cache. O download será refeito sempre que o URL ou a hash mudarem.
-
-      A política precisa ser especificada como uma string que expressa o URL e a hash no formato JSON, de acordo com este esquema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL de onde a imagem de avatar pode ser transferida por download.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "A hash SHA-256 da imagem de avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Se esta política for definida, o <ph name="PRODUCT_OS_NAME" /> fará o download e usará a imagem de avatar.
-
-      Se você definir esta política, os usuários não poderão alterá-la ou substituí-la.
-
-      Se a política não for definida, o usuário poderá escolher a imagem de avatar que o representará na tela de login.</translation>
 <translation id="9035964157729712237">IDs de extensão que serão isentos da lista de proibições</translation>
 <translation id="9038058011835642205">Especifica uma lista de sites que são instalados silenciosamente, sem qualquer interação do usuário e sem permitir a desinstalação nem a desativação feita por ele.
 
@@ -4221,7 +4084,6 @@
       Se você definir esta política, os usuários não poderão alterá-la ou substituí-la.
 
       O valor da política precisa ser especificado em milissegundos. Os valores são ajustados a um intervalo entre 30 segundos e 24 horas.</translation>
-<translation id="9042911395677044526">Permite aplicar a configuração de rede por usuário de dispositivo <ph name="PRODUCT_OS_NAME" />. A configuração de rede é uma string formatada em JSON, conforme definido pelo formato Open Network Configuration descrito em <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Esta política controla se é necessário ou não que o dispositivo seja atualizado para um Quick Fix Build.
 
       Se o valor da política for definido para um token que mapeia para um Quick Fix Build, o dispositivo será atualizado para o Quick Fix Build correspondente se a atualização não estiver bloqueada por outra política.
@@ -4294,17 +4156,6 @@
       Se a política for definida como falsa, a opção "Cabeçalhos e rodapés" não ficará selecionada na caixa de diálogo de visualização de impressão, e o usuário não poderá alterá-la.
 
       Se a política for definida como verdadeira, a opção "Cabeçalhos e rodapés" ficará selecionada na caixa de diálogo de visualização de impressão, e o usuário não poderá alterá-la.</translation>
-<translation id="9213347477683611358">Configura a imagem de plano de fundo do dispositivo que é exibida na tela de login se nenhum usuário está conectado ao dispositivo. A política é definida pela especificação do URL no qual o dispositivo Chrome OS pode fazer o download da imagem de plano de fundo e de um hash criptográfico usado para verificar a integridade do download. A imagem deve estar no formato JPEG, e seu tamanho não deve ultrapassar 16 MB. O URL deve ser acessado sem nenhuma autenticação. A imagem de plano de fundo é transferida por download e armazenada em cash. Sempre que o URL ou o hash muda, o download é feito novamente.
-
-      A política deve ser especificada como uma string que expressa o URL e o hash no formato JSON, por exemplo,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Se a política de plano de fundo do dispositivo for definida, o dispositivo Chrome OS fará o download e usará a imagem de plano de fundo na tela de login caso nenhum usuário tenha se conectado ao dispositivo. Depois que o usuário se conecta, a política de plano de fundo dele entra em ação.
-
-      Se a política de plano de fundo do dispositivo não for definida, a política de plano de fundo do usuário poderá escolher o que exibir.</translation>
 <translation id="9217154963008402249">Frequência de pacotes de monitoramento de rede</translation>
 <translation id="922540222991413931">Configurar extensão, aplicativo e origens de instalação do script do usuário</translation>
 <translation id="924557436754151212">Importar senhas salvas do navegador padrão na primeira execução</translation>
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index af9daca1..b52baa3 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -416,7 +416,6 @@
 
       Aviso: não é recomendado delegar o controlo da versão do <ph name="PRODUCT_OS_NAME" /> a uma aplicação de quiosque, pois tal pode impedir o dispositivo de receber atualizações de software e correções de segurança críticas. Delegar o controlo da versão do <ph name="PRODUCT_OS_NAME" /> pode colocar os utilizadores em risco.</translation>
 <translation id="1675002386741412210">Suportado em:</translation>
-<translation id="1689963000958717134">Permite que a configuração de rede seja aplicada para todos os utilizadores de um dispositivo <ph name="PRODUCT_OS_NAME" />. A configuração de rede é uma cadeia de formato JSON, conforme definido pelo formato de Configuração de Rede Aberta descrito em <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Configura a disponibilidade e o comportamento da funcionalidade de atualização de firmware do <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       É possível especificar definições individuais nas propriedades de JSON:
@@ -779,7 +778,7 @@
 
           Se esta política não for definida e for suportada no dispositivo, o modo de carregamento padrão da bateria é aplicado e não pode ser alterado pelo utilizador.
 
-          Nota: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> substitui esta política, se a anterior for especificada.</translation>
+          Nota: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> substitui esta política se a anterior for especificada.</translation>
 <translation id="237494535617297575">Permite definir uma lista de padrões de URL que especificam os Web sites autorizados a apresentar notificações. Se esta política não for definida, será utilizado o valor global predefinido para todos os Web sites, seja a partir da política "DefaultNotificationsSetting", caso esteja definida, ou a partir da configuração pessoal do utilizador.</translation>
 <translation id="2386362615870139244">Permitir bloqueios de ativação do ecrã</translation>
 <translation id="2411817661175306360">O aviso de proteção por palavra-passe está desativado.</translation>
@@ -956,16 +955,6 @@
 
       Se a definição estiver desativada, as páginas Web não podem utilizar o JavaScript e o utilizador não pode alterá-la.
       Se a definição estiver ativada ou por definir, as páginas Web podem utilizar o JavaScript, mas o utilizador pode alterá-la.</translation>
-<translation id="2747157663401642394">Configura as definições de gestão de extensões do <ph name="PRODUCT_NAME" />.
-
-          Esta política controla várias definições, incluindo definições controladas por quaisquer políticas existentes relativas a extensões. Além disso, substitui todas as políticas antigas, caso estejam ambas definidas.
-
-          Esta política mapeia um ID de extensão ou um URL de atualização para a respetiva configuração. Com um ID de extensão, a configuração é aplicada apenas à extensão especificada. É possível definir uma configuração predefinida para o ID especial <ph name="DEFAULT_SCOPE" />, que irá aplicar-se a todas as extensões que não tenham uma configuração personalizada definida nesta política. Com um URL de atualização, a configuração é aplicada a todas as extensões com o URL de atualização exato indicado no manifesto desta extensão, conforme descrito em <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Em instâncias do Windows que não fazem parte de um domínio <ph name="MS_AD_NAME" />, a instalação forçada está limitada a aplicações e extensões apresentadas na Web Store do Chrome.
-
-          Para obter uma descrição completa das definições possíveis e da estrutura desta política, aceda a https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Restringir o intervalo de portas UDP locais utilizadas pelo WebRTC</translation>
 <translation id="2757054304033424106">Tipos de extensões/aplicações com permissão para serem instaladas</translation>
 <translation id="2758084448533744848">Especifica o fuso horário aplicado a utilizar para o dispositivo. Quando esta política estiver definida, os utilizadores no dispositivo não podem substituir o fuso horário especificado. Se for fornecido um valor inválido, a política continua ativada e utilizará "GMT" como alternativa. Se for fornecida uma string vazia, a política é ignorada.
@@ -1221,7 +1210,7 @@
 
       Se definir esta política como uma opção que deixou de ser suportada ("AskUser" ou "AskForEcryptfsArcUsers"), então esta é processada como se tivesse selecionado "Migrate".
 
-      Esta politica não se aplica aos utilizadores de quiosque. Se esta política não for definida, o dispositivo apresentará um comportamento semelhante a "DisallowArc".</translation>
+      Esta política não se aplica aos utilizadores de quiosque. Se esta política não for definida, o dispositivo apresentará um comportamento semelhante a "DisallowArc".</translation>
 <translation id="3086995894968271156">Configura o Recetor do Cast no <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3088796212846734853">Permite definir uma lista de padrões de URL que especificam os sites autorizados a apresentar imagens.
 
@@ -1533,9 +1522,9 @@
 <translation id="3826475866868158882">Serviços de localização da Google ativados.</translation>
 <translation id="3831054243924627613">Esta política controla o estado inicial do serviço de cópia de segurança e restauro do Android.
 
-      Quando esta política não está configurada ou está <ph name="BR_DISABLED" />, o serviço de cópia de segurança e restauro do Android está inicialmente desativado.
+      Quando esta política não está configurada ou está <ph name="BR_DISABLED" />, o serviço de cópia de segurança e restauro do Android encontra-se inicialmente desativado.
 
-      Quando esta política está definida como <ph name="BR_ENABLED" />, o serviço de cópia de segurança e restauro do Android está inicialmente ativado.
+      Quando esta política está definida como <ph name="BR_ENABLED" />, o serviço de cópia de segurança e restauro do Android encontra-se inicialmente ativado.
 
       Quando esta política está definida como <ph name="BR_UNDER_USER_CONTROL" />, é perguntado ao utilizador se pretende utilizar o serviço de cópia de segurança e restauro do Android. Se o utilizador ativar o serviço de cópia de segurança e restauro, os dados de aplicações para Android são carregados para os servidores de cópia de segurança do Android e restaurados a partir dos mesmos após a reinstalação de aplicações compatíveis.
 
@@ -1623,7 +1612,7 @@
 <translation id="3915395663995367577">URL para um ficheiro .pac de proxy</translation>
 <translation id="3920892052017026701">Defina o início de carregamento da bateria personalizado em percentagem.
 
-          A bateria começa a carregar quando a carga da bateria atinge o valor do início de carregamento personalizado.
+          A bateria começa a ser carregada quando a carga da bateria atinge o valor do início de carregamento personalizado.
 
           O valor DeviceBatteryChargeCustomStartCharging tem de ser inferior ao valor DeviceBatteryChargeCustomStopCharging.
 
@@ -1728,30 +1717,6 @@
       Esta política afeta apenas utilizadores que fazem a autenticação através de SAML.</translation>
 <translation id="4105989332710272578">Desativar a imposição da Transparência de certificados para uma lista de URLs</translation>
 <translation id="4121350739760194865">Impedir a apresentação de promoções de aplicações na página de novo separador</translation>
-<translation id="4125606414556046117">Esta política permite-lhe configurar a imagem de fundo apresentada no ambiente de trabalho e no fundo do ecrã de início de sessão do utilizador. A política é definida ao especificar o URL a partir do qual o <ph name="PRODUCT_OS_NAME" /> pode transferir a imagem de fundo e um hash criptográfico utilizado para confirmar a integridade da transferência. A imagem tem de estar no formato JPEG e o tamanho não pode exceder 16 MB. O URL tem de ser acessível sem qualquer autenticação.
-
-      A imagem de fundo é transferida e colocada em cache. Será transferida novamente sempre que o URL ou o hash forem alterados.
-
-      A política deve ser especificada como uma string que expresse o URL e o hash em formato JSON, em conformidade com o esquema seguinte:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "O URL a partir do qual é possível transferir a imagem de fundo.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "O hash SHA-256 da imagem de fundo.",
-            "type": "string"
-          }
-        }
-      }
-
-      Se esta política estiver definida, o <ph name="PRODUCT_OS_NAME" /> transfere e utiliza a imagem de fundo.
-
-      Se definir esta política, os utilizadores não a podem alterar nem substituir.
-
-      Se não definir a política, o utilizador pode escolher uma imagem para apresentação no ambiente de trabalho e no fundo do ecrã de início de sessão.</translation>
 <translation id="412697421478384751">Permitir aos utilizadores definirem PINs fracos para o PIN do ecrã de bloqueio</translation>
 <translation id="4138655880188755661">Limite de tempo</translation>
 <translation id="4144164749344898721">Esta política controla várias definições para a estratégia de gestão de energia quando o utilizador fica inativo.
@@ -2672,53 +2637,6 @@
 
       Se esta política não estiver definida ou estiver definida como falsa, os comandos de impressão acionam o ecrã de pré-visualização da impressão.</translation>
 <translation id="6022948604095165524">Ação no arranque</translation>
-<translation id="6023030044732320798">Especifica um conjunto de políticas que são transmitidas ao tempo de execução ARC. O valor tem de ser um formato JSON válido.
-
-      É possível utilizar esta política para configurar quais as aplicações para Android automaticamente instaladas no dispositivo:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identificador da aplicação Android, por exemplo, «com.google.android.gm» para o Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Especifica o modo de instalação de uma aplicação. OPTIONAL: a aplicação não é instalada automaticamente, mas o utilizador pode instalá-la. É a predefinição se esta política não for especificada. PRELOAD: a aplicação é instalada automaticamente, mas o utilizador pode desinstalá-la. FORCE_INSTALLED: a aplicação é instalada automaticamente e o utilizador não a pode desinstalar. BLOCKED: a aplicação está bloqueada e não pode ser instalada. Se a aplicação tiver sido instalada no âmbito de uma política anterior, é desinstalada.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Política para conceder pedidos de autorização às aplicações. PERMISSION_POLICY_UNSPECIFIED: política não especificada. Se não estiver especificada nenhuma política para uma autorização a qualquer nível, é utilizado o comportamento `PROMPT` por predefinição. PROMPT: solicite ao utilizador que conceda uma autorização. GRANT: conceda automaticamente uma autorização. DENY: recuse automaticamente uma autorização.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Objeto de configuração JSON específico da aplicação com um conjunto de pares de chave-valor, por exemplo, '"managedConfiguration": { "key1": value1, "key2": value2 }'. As chaves são definidas no manifesto da aplicação.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Para fixar aplicações ao iniciador, consulte PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL instantâneo do fornecedor de pesquisas predefinido</translation>
 <translation id="603410445099326293">Parâmetros do URL de sugestões que utilize POST</translation>
 <translation id="6034341625190551415">Controla os tipos de conta de sessão pública e quiosque.</translation>
@@ -3066,37 +2984,6 @@
       Se esta política estiver definida como falsa, o cliente DNS incorporado nunca será utilizado.
 
       Se esta política não estiver definida, o cliente DNS incorporado será ativado por predefinição no MacOS, no Android (quando nem o DNS privado nem a VPN estiverem ativados) e no Chrome OS, e os utilizadores poderão alterar se o cliente DNS incorporado é utilizado ao editar chrome://flags ou especificar um sinalizador de linha de comandos.</translation>
-<translation id="6838056959556423778">Substitui as regras de seleção da impressora predefinida do <ph name="PRODUCT_NAME" />.
-
-      Esta política determina as regras para a seleção da impressora predefinida em <ph name="PRODUCT_NAME" /> que ocorre quando a função de impressão é utilizada com um perfil pela primeira vez.
-
-      Quando esta política está definida, o <ph name="PRODUCT_NAME" /> tenta localizar uma impressora que corresponda a todos os atributos especificados e selecioná-la como impressora predefinida. É selecionada a primeira impressora localizada que corresponda à política. Se a correspondência não for única, pode ser selecionada qualquer impressora correspondente, consoante a ordem pela qual as impressoras são detetadas.
-
-      Se esta política não estiver definida ou não for encontrada uma impressora correspondente no limite de tempo, é predefinida a impressora PDF incorporada ou não é selecionada qualquer impressora quando a impressora PDF não está disponível.
-
-      O valor é analisado como um objeto JSON em conformidade com o esquema seguinte:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Limitar ou não a pesquisa da impressora correspondente a um conjunto específico de impressoras.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Expressão regular para corresponder ao ID da impressora.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Expressão regular para corresponder ao nome a apresentar da impressora.",
-            "type": "string"
-          }
-        }
-      }
-
-      As impressoras ligadas ao <ph name="CLOUD_PRINT_NAME" /> são consideradas como <ph name="PRINTER_TYPE_CLOUD" /> e as restantes são classificadas como <ph name="PRINTER_TYPE_LOCAL" />.
-      Omitir um campo significa que todos os valores são correspondentes, por exemplo, não especificar a conetividade faz com que a Pré-visualização da impressão inicie a deteção de todos os tipos de impressoras: locais e na nuvem.
-      Os padrões da expressão regular têm de seguir a sintaxe JavaScript RegExp e as correspondências são sensíveis a maiúsculas e minúsculas.</translation>
 <translation id="6843296367238757293">Esta política foi descontinuada. A sua utilização é desaconselhada. Leia mais em https://support.google.com/chrome/a/answer/7643500.</translation>
 <translation id="684856667300805181">Esta política foi removida no <ph name="PRODUCT_NAME" /> 68 e substituída por <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Esta política foi descontinuada e removida no M66, uma vez que era utilizada apenas para testes internos e representa um risco de segurança.
@@ -3171,7 +3058,7 @@
       Se esta política não for definida ou estiver definida como verdadeira, o modelo de escurecimento inteligente será ativado para poder prolongar o tempo que precede o escurecimento do ecrã. Se estiver definida como falsa, o modelo de escurecimento inteligente não irá influenciar o escurecimento do ecrã.</translation>
 <translation id="6967394885063085697">Ative a política de gestão de energia do modo de carregamento da bateria avançado.
 
-          O modo de carregamento da bateria avançado permite que o utilizador maximize o estado da bateria. No modo de carregamento avançado o sistema utiliza um algoritmo de carregamento padrão e outras técnicas durante as horas de inatividade para maximizar o estado da bateria. Durante as horas de atividade, é utilizado o carregamento rápido. Este carregamento rápido permite carregar a bateria mais rapidamente e, consequentemente, esta fica totalmente carregada mais cedo. Em cada dia, o horário durante o qual o sistema é utilizado mais intensamente é especificado pela hora de início e pela duração.
+          O modo de carregamento da bateria avançado permite que o utilizador maximize o estado da bateria. No modo de carregamento avançado, o sistema utiliza um algoritmo de carregamento padrão e outras técnicas durante as horas de inatividade para maximizar o estado da bateria. Durante as horas de atividade, é utilizado o carregamento rápido. Este carregamento rápido permite carregar a bateria mais rapidamente e, consequentemente, esta fica totalmente carregada mais cedo. Em cada dia, o horário durante o qual o sistema é utilizado mais intensamente é especificado pela hora de início e pela duração.
 
           Se esta política for definida como verdadeira e DeviceAdvancedBatteryChargeModeDayConfig estiver definido, então o modo de carregamento avançado da bateria estará sempre ativado, se for suportado pelo dispositivo.
 
@@ -3251,9 +3138,9 @@
 
           Quando o sistema está ativo, a porta USB fornece sempre energia.
 
-          Quando o sistema está suspenso, se esta política estiver definida como verdadeira, é fornecida energia à porta USB quando o dispositivo estiver ligado à tomada ou se o nível de bateria for &gt; 50%. De outro modo, não é fornecida energia.
+          Quando o sistema está suspenso, se esta política estiver definida como verdadeira, é fornecida energia à porta USB quando o dispositivo estiver ligado à tomada ou se o nível de bateria for superior a 50%. De outro modo, não é fornecida energia.
 
-          Quando o sistema está desligado, se esta política estiver definida como verdadeira, então é fornecida energia à porta USB quando o dispositivo estiver ligado à tomada. De outro modo, não é fornecida energia.
+          Quando o sistema está desligado, se esta política estiver definida como verdadeira, então será fornecida energia à porta USB quando o dispositivo estiver ligado à tomada. De outro modo, não é fornecida energia.
 
           Se esta política não for definida, então estará ativa e não poderá ser desativada pelo utilizador.</translation>
 <translation id="7115494316187648452">Determina se um processo do <ph name="PRODUCT_NAME" /> é iniciado ao iniciar sessão no SO e continua a ser executado quando a última janela do navegador é fechada, permitindo que as aplicações em segundo plano e a sessão de navegação atual permaneçam ativas, incluindo todos os cookies de sessão. O processo em segundo plano apresenta um ícone no tabuleiro do sistema e pode sempre ser fechado a partir daí.
@@ -4232,30 +4119,6 @@
       Esta política apenas afeta os utilizadores que efetuaram a autenticação através de SAML.
 
       O valor da política deve ser especificado em segundos.</translation>
-<translation id="9027787254195333560">Esta política permite-lhe configurar a imagem do avatar que representa o utilizador no ecrã de início de sessão. A política é definida ao especificar o URL a partir do qual o <ph name="PRODUCT_OS_NAME" /> pode transferir a imagem do avatar e um hash criptográfico utilizado para validar a integridade da transferência. A imagem tem de estar no formato JPEG e o tamanho não pode exceder 512 kB. O URL tem de ser acessível sem qualquer autenticação.
-
-      A imagem do avatar é transferida e colocada em cache. Será transferida novamente sempre que o URL ou o hash forem alterados.
-
-      A política deve ser especificada como uma string que expresse o URL e o hash em formato JSON, em conformidade com o esquema seguinte:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "O URL a partir do qual é possível transferir a imagem do avatar.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "O hash SHA-256 da imagem do avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Se esta política estiver definida, o <ph name="PRODUCT_OS_NAME" /> transfere e utiliza a imagem do avatar.
-
-      Se definir esta política, os utilizadores não a podem alterar nem substituir.
-
-      Se não definir a política, o utilizador pode escolher a imagem do avatar que o representa no ecrã de início de sessão.</translation>
 <translation id="9035964157729712237">IDs de extensões a excluir da lista negra</translation>
 <translation id="9038058011835642205">Especifica uma lista de Websites que são instalados em silêncio, sem interação do utilizador, e que não podem ser desinstalados nem desativados por aquele.
 
@@ -4268,7 +4131,6 @@
       Se definir esta política, os utilizadores não a podem alterar nem substituir.
 
       O valor da política deve ser especificado em milissegundos. Os valores estão limitados a um intervalo entre 30 segundos e 24 horas.</translation>
-<translation id="9042911395677044526">Permite que a configuração de rede seja aplicada por utilizador para um aparelho <ph name="PRODUCT_OS_NAME" />. A configuração de rede é uma cadeia de formato JSON, conforme definido pelo formato de Configuração de Rede Aberta descrito em <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Esta política controla se o dispositivo deve ou não ser atualizado para uma Compilação de correção rápida.
 
       Se o valor da política for definido como um token que mapeia para uma Compilação de correção rápida, o dispositivo será atualizado para a Compilação de correção rápida correspondente, caso a atualização não seja bloqueada por nenhuma outra política.
@@ -4341,17 +4203,6 @@
       Se a política estiver definida como falsa, os "cabeçalhos e rodapés" não são selecionados na caixa de diálogo de pré-visualização da impressão e o utilizador não pode alterar isso.
 
       Se a política estiver definida como verdadeira, os "cabeçalhos e rodapés" são selecionados na caixa de diálogo de pré-visualização da impressão e o utilizador não pode alterar isso.</translation>
-<translation id="9213347477683611358">Configure uma imagem de fundo ao nível do dispositivo mostrada no ecrã de início de sessão se nenhum utilizador tiver iniciado sessão no dispositivo. A política é definida ao especificar o URL a partir do qual o dispositivo com o Chrome OS pode transferir a imagem de fundo e um hash criptográfico para verificar a integridade da transferência. A imagem tem de estar no formato JPEG e o tamanho do ficheiro não pode exceder 16 MB. O URL tem de ser acessível sem nenhuma autenticação. A imagem de fundo é transferida e colocada na cache. É transferida sempre que o URL ou o hash for alterado.
-
-      A política deve ser especificada como uma string que expressa o URL e o hash no formato JSON, por exemplo,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Se a política de imagem de fundo do dispositivo estiver definida, o dispositivo com o Chrome OS transfere e utiliza a imagem de fundo no ecrã de início de sessão se nenhum utilizador tiver iniciado sessão no dispositivo. Depois de o utilizador iniciar sessão, é aplicada a política de imagem de fundo do mesmo.
-
-      Se a política de imagem de fundo do dispositivo não estiver definida, cabe à política de imagem de fundo do utilizador decidir o que deve apresentar se estiver definida.</translation>
 <translation id="9217154963008402249">Frequência dos pacotes de monitorização de rede</translation>
 <translation id="922540222991413931">Configurar fontes de instalação de extensões, aplicações e scripts do utilizador</translation>
 <translation id="924557436754151212">Importar palavras-passe guardadas a partir do navegador predefinido na primeira execução</translation>
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index f69e0910..0fff749e 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -402,7 +402,6 @@
 
       Avertisment: nu se recomandă să delegi controlul asupra versiunii <ph name="PRODUCT_OS_NAME" /> unei aplicații chioșc, deoarece dispozitivul poate fi împiedicat să primească actualizări de software și remedieri importante de securitate. Dacă delegi controlul asupra versiunii <ph name="PRODUCT_OS_NAME" />, este posibil să pui în pericol utilizatorii.</translation>
 <translation id="1675002386741412210">Acceptat de:</translation>
-<translation id="1689963000958717134">Această politică permite trimiterea configurației rețelei pentru a fi aplicată pentru toți utilizatorii unui dispozitiv <ph name="PRODUCT_OS_NAME" />. Configurația rețelei este un șir în formatul JSON, așa cum este acesta definit de formatul Open Network Configuration descris la <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Configurează disponibilitatea și comportamentul funcției de actualizare a firmware-ului <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Setările individuale pot fi specificate în proprietățile JSON:
@@ -943,16 +942,6 @@
       Dacă această setare este dezactivată, paginile web nu pot utiliza JavaScript, iar utilizatorii nu pot modifica această setare.
 
       Dacă această setare este activată sau nu este configurată, paginile web pot utiliza JavaScript, dar utilizatorul poate schimba această setare.</translation>
-<translation id="2747157663401642394">Configurează setările de gestionare a extensiilor pentru <ph name="PRODUCT_NAME" />.
-
-          Această politică stabilește mai multe setări, inclusiv pe cele controlate de eventualele politici existente privind extensiile. Politica va anula toate politicile vechi dacă ambele sunt setate.
-
-          Această politică asociază un ID de extensie sau o adresă URL de actualizare la configurația sa. În cazul unui ID de extensie, configurația va fi aplicată numai pentru extensia specificată. O configurație prestabilită poate fi setată pentru ID-ul special <ph name="DEFAULT_SCOPE" />, care se va aplica pentru toate extensiile care nu au o configurație personalizată setată în această politică. În cazul unei adrese URL de actualizare, configurația se va aplica pentru toate extensiile cu adresa URL de actualizare exactă specificată în manifestul acestei extensii, conform descrierii de la <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Pentru copiile Windows neasociate unui domeniu <ph name="MS_AD_NAME" />, instalarea automată este limitată la aplicațiile și extensiile afișate în Magazinul web Chrome.
-
-          Pentru o descriere completă a setărilor posibile și a structurii acestei politici, accesează https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Restricționează intervalul de porturi UDP locale folosite de WebRTC</translation>
 <translation id="2757054304033424106">Tipuri de extensii/aplicații a căror instalare este permisă</translation>
 <translation id="2758084448533744848">Specifică fusul orar care va fi folosit pentru dispozitiv. Când această politică este setată, utilizatorii de pe dispozitiv nu pot modifica fusul orar specificat. Dacă este furnizată o valoare nevalidă, politica este totuși activată folosind „GMT”. Dacă este furnizat un șir gol, politica este ignorată.
@@ -978,7 +967,7 @@
 
           Dacă setezi această politică, utilizatorii nu pot să o modifice sau să o anuleze.
 
-          Dacă politica nu este setată, valoarea prestabilită este Fals pentru dispozitivele gestionate.</translation>
+          Dacă politica nu este setată, valoarea prestabilită este False pentru dispozitivele gestionate.</translation>
 <translation id="2787173078141616821">Raportează informații despre starea Android</translation>
 <translation id="2799297758492717491">Permite redarea automată a conținutului media pentru o listă albă cu șabloane de adrese URL</translation>
 <translation id="2801155097555584385">Setează în procente valoarea personalizată la care bateria începe să se încarce</translation>
@@ -1179,7 +1168,7 @@
       Această politică permite administratorilor să ofere utilizatorilor configurații ale
       imprimantelor.
 
-      <ph name="PRINTER_DISPLAY_NAME" /> și <ph name="PRINTER_DESCRIPTION" /> sunt șiruri cu formă liberă care pot fi personalizate pentru a selecta mai ușor o imprimantă. <ph name="PRINTER_MANUFACTURER" /> și <ph name="PRINTER_MODEL" /> sunt folosite pentru a simplifica identificarea imprimantei de utilizatorii finali. Acestea reprezintă producătorul și modelul imprimantei. <ph name="PRINTER_URI" /> trebuie să fie o adresă care poate fi accesată de pe computerul unui client, inclusiv <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, și <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> este opțional. Dacă este specificat, acesta este folosit pentru a deduplica imprimantele <ph name="ZEROCONF_DISCOVERY" />.
+      <ph name="PRINTER_DISPLAY_NAME" /> și <ph name="PRINTER_DESCRIPTION" /> sunt șiruri cu formă liberă care pot fi personalizate pentru a selecta mai ușor o imprimantă. <ph name="PRINTER_MANUFACTURER" /> și <ph name="PRINTER_MODEL" /> sunt folosite pentru a simplifica identificarea imprimantei de utilizatorii finali. Acestea reprezintă producătorul și modelul imprimantei. <ph name="PRINTER_URI" /> trebuie să fie o adresă care poate fi accesată de pe un computer client, inclusiv <ph name="URI_SCHEME" />, <ph name="URI_PORT" />, și <ph name="URI_QUEUE" />. <ph name="PRINTER_UUID" /> este opțional. Dacă este specificat, acesta este folosit pentru a deduplica imprimantele <ph name="ZEROCONF_DISCOVERY" />.
 
       <ph name="PRINTER_EFFECTIVE_MODEL" /> trebuie să corespundă unuia dintre șirurile care reprezintă o imprimantă <ph name="PRODUCT_NAME" /> compatibilă. Șirul va fi folosit pentru a identifica și instala PPD-ul corespunzător imprimantei. Mai multe informații sunt disponibile la https://support.google.com/chrome?p=noncloudprint.
 
@@ -1645,25 +1634,25 @@
       Dacă politica este activată sau nu este configurată, utilizatorii pot valorifica oferte prin înregistrarea sistemului de operare Chrome.
 
       Dacă politica nu este activată, utilizatorii nu vor putea valorifica oferte.</translation>
-<translation id="4008233182078913897">Specifică o listă de aplicații și extensii instalate în fundal,
-          fără intervenția utilizatorului și care nu pot fi dezinstalate sau
-          dezactivate de acesta. Toate permisiunile solicitate de
-          aplicații/extensii sunt acordate în mod prestabilit, fără intervenția utilizatorului,
-          inclusiv orice permisiune suplimentară solicitată de viitoarele versiuni ale
-          aplicației/extensiei. În plus, permisiunile sunt acordate pentru
-          API-urile extensiei
-          enterprise.deviceAttributes și enterprise.platformKeys. (Aceste două API-uri nu sunt disponibile pentru aplicațiile/extensiile care
-          nu sunt instalate forțat.)
+<translation id="4008233182078913897">Specifică o listă de aplicații și extensii care sunt instalate în fundal,
+          fără intervenția utilizatorului, și care nu pot fi dezinstalate sau
+          dezactivate de utilizator. Toate permisiunile solicitate de
+          aplicații/extensii sunt acordate implicit, fără intervenția utilizatorului,
+          inclusiv orice permisiune suplimentară solicitată de versiunile ulterioare ale
+          aplicației/extensiei. Mai mult, sunt acordate permisiuni pentru
+          API-urile extensiilor enterprise.deviceAttributes și
+          enterprise.platformKeys. (Aceste două API-uri nu sunt disponibile pentru aplicațiile/extensiile care
+          nu sunt instalate automat.)
 
-          Această politică are prioritate față de o politică <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> care poate crea conflicte. Dacă o aplicație sau o extensie care a fost instalată forțat anterior este eliminată din listă, aceasta este dezinstalată automat de <ph name="PRODUCT_NAME" />.
+          Politica are prioritate față de o politică <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> care poate fi în conflict. Dacă o aplicație sau extensie care a fost instalată automat anterior este eliminată din listă, este dezinstalată automat de <ph name="PRODUCT_NAME" />.
 
-          Pentru instanțele Windows neasociate unui domeniu <ph name="MS_AD_NAME" />, instalarea forțată se limitează la aplicațiile și extensiile afișate în Magazinul web Chrome.
+          Pentru exemplarele de Windows neasociate unui domeniu <ph name="MS_AD_NAME" />, instalarea automată se limitează la aplicațiile și extensiile afișate în Magazinul web Chrome.
 
-          Reține că utilizatorii pot să modifice codul sursă al oricărei extensii cu ajutorul Developer Tools (ceea ce poate face extensia nefuncțională). Dacă acest aspect creează probleme, trebuie să se seteze politica <ph name="DEVELOPER_TOOLS_POLICY_NAME" />.
+          Reține că utilizatorii pot să modifice codul sursă al oricărei extensii cu ajutorul Developer Tools (ceea ce poate face ca extensia să fie nefuncțională). Dacă acest aspect creează probleme, politica <ph name="DEVELOPER_TOOLS_POLICY_NAME" /> trebuie să fie setată.
 
-          Fiecare element din lista politicii este un șir care include un ID al extensiei și, opțional, o adresă URL de „actualizare”, separate prin punct și virgulă (<ph name="SEMICOLON" />). ID-ul extensiei este un șir alcătuit din 32 de litere și se găsește, de exemplu, la <ph name="CHROME_EXTENSIONS_LINK" /> în modul pentru dezvoltatori. Adresa URL de „actualizare”, dacă este specificată, trebuie să trimită la un document XML cu manifestul de actualizare, conform descrierii de la <ph name="LINK_TO_EXTENSION_DOC1" />. În mod prestabilit, se folosește adresa URL de actualizare a Magazinului web Chrome (care acum este „https://clients2.google.com/service/update2/crx”). Reține că adresa URL de „actualizare” setată în această politică este folosită numai la instalarea inițială. Actualizările ulterioare ale extensiei vor folosi adresa URL de actualizare indicată în manifestul extensiei. Reține și că specificarea explicită a adresei URL de „actualizare” era obligatorie în versiunile <ph name="PRODUCT_NAME" /> de până la 67, inclusiv.
+          Fiecare element din lista politicii este un șir care include un ID al extensiei și, opțional, o adresă URL de „actualizare”, separate prin punct și virgulă (<ph name="SEMICOLON" />). ID-ul de extensie este un șir alcătuit din 32 de litere găsit, de exemplu, la <ph name="CHROME_EXTENSIONS_LINK" /> în modul pentru dezvoltatori. Adresa URL de „actualizare”, dacă este specificată, trebuie să trimită la un document XML cu manifestul de actualizare, conform descrierii de la <ph name="LINK_TO_EXTENSION_DOC1" />. În mod prestabilit, se folosește adresa URL de actualizare a Magazinului web Chrome (care acum este „https://clients2.google.com/service/update2/crx”). Reține că adresa URL de „actualizare” setată în această politică este folosită numai la instalarea inițială. Actualizările ulterioare ale extensiei vor folosi adresa URL de actualizare indicată în manifestul extensiei. Reține și că indicarea explicită a adresei URL de „actualizare” era obligatorie în versiunea 67 de <ph name="PRODUCT_NAME" /> și versiunile anterioare.
 
-          De exemplu, <ph name="EXTENSION_POLICY_EXAMPLE" /> instalează aplicația <ph name="EXTENSION_ID_SAMPLE" /> de la adresa URL standard de „actualizare” din Magazinul web Chrome. Pentru mai multe informații despre găzduirea extensiilor, accesează <ph name="LINK_TO_EXTENSION_DOC2" />.
+          De exemplu, <ph name="EXTENSION_POLICY_EXAMPLE" /> instalează extensia cu ID-ul <ph name="EXTENSION_ID_SAMPLE" /> de la adresa de „actualizare” standard a Magazinului web Chrome. Pentru mai multe informații despre găzduirea extensiilor, accesează: <ph name="LINK_TO_EXTENSION_DOC2" />.
 
           Dacă politica nu este setată, nicio aplicație sau extensie nu va fi instalată automat, iar utilizatorul poate dezinstala orice aplicație sau extensie din <ph name="PRODUCT_NAME" />.
 
@@ -1715,30 +1704,6 @@
       Această politică afectează doar utilizatorii care se autentifică prin SAML.</translation>
 <translation id="4105989332710272578">Dezactivează aplicarea politicii privind Transparența certificatului pentru o listă de adrese URL</translation>
 <translation id="4121350739760194865">Împiedicați promoțiile aplicațiilor să apară în pagina Filă nouă</translation>
-<translation id="4125606414556046117">Cu această politică poți configura imaginea de fundal care se afișează pe desktop și pe fundalul ecranului de conectare pentru utilizator. Politica este setată prin specificarea adresei URL de la care <ph name="PRODUCT_OS_NAME" /> poate descărca imaginea de fundal și a unui cod hash criptografic utilizat pentru a verifica integritatea descărcării. Imaginea trebuie să fie în format JPEG, iar dimensiunea acesteia nu trebuie să depășească 16 MB. Adresa URL trebuie să poată fi accesată fără autentificare.
-
-      Imaginea de fundal este descărcată și salvată în memoria cache. Aceasta va fi descărcată din nou ori de câte ori adresa URL sau codul hash se modifică.
-
-      Politica trebuie să fie specificată ca șir ce exprimă adresa URL și codul hash în format JSON, în conformitate cu următoarea schemă:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Adresa URL de la care imaginea de fundal poate fi descărcată.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Codul hash SHA-256 al imaginii de fundal.",
-            "type": "string"
-          }
-        }
-      }
-
-      Dacă politica este configurată, <ph name="PRODUCT_OS_NAME" /> va descărca și va folosi imaginea de fundal.
-
-      Dacă setezi această politică, utilizatorii nu pot să o modifice sau să o anuleze.
-
-      Dacă politica nu este configurată, utilizatorul poate alege imaginea de afișat pe desktop și pe fundalul ecranului de conectare.</translation>
 <translation id="412697421478384751">Permite utilizatorilor să seteze coduri PIN slabe pentru ecranul de blocare</translation>
 <translation id="4138655880188755661">Limita de timp</translation>
 <translation id="4144164749344898721">Această politică controlează mai multe setări pentru strategia de gestionare a consumului de energie atunci când utilizatorul devine inactiv.
@@ -2162,7 +2127,7 @@
 <translation id="5124368997194894978">Activează pornirea pe c.a. (curent alternativ)</translation>
 <translation id="5131211790949066746">Activează îmbinarea politicilor din listă privind extensiile instalate: <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> și <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.
 
-      Dacă activezi această setare, valorile pentru politica platformei dispozitivului, politica în cloud a dispozitivului și politica platformei utilizatorului sunt îmbinate într-o listă și folosite ca întreg, fără a mai folosi numai valorile din sursa cu cea mai mare prioritate.
+      Dacă activezi această setare, valorile pentru politica platformei dispozitivului, politica privind serviciile cloud a dispozitivului și politica platformei utilizatorului sunt îmbinate într-o listă și folosite ca întreg, fără a mai folosi numai valorile din sursa cu cea mai mare prioritate.
 
       Dacă dezactivezi această setare sau nu o configurezi, sunt luate numai intrările în listă din sursa cu cea mai mare prioritate, iar toate celelalte surse sunt afișate drept conflicte, dar sunt ignorate.</translation>
 <translation id="5141670636904227950">Setați tipul prestabilit al lupei pentru ecran activate pe ecranul de conectare</translation>
@@ -2499,7 +2464,7 @@
 
           Setarea trece pe lista albă tipurile permise de extensii/aplicații care pot fi instalate în <ph name="PRODUCT_NAME" /> și gazdele cu care pot interacționa. Valoarea este o listă de șiruri și fiecare dintre acestea ar trebui să fie una dintre următoarele: „extension”, „theme”, „user_script”, „hosted_app”, „legacy_packaged_app”, „platform_app”. Consultă documentația privind extensiile pentru <ph name="PRODUCT_NAME" /> pentru mai multe informații despre aceste tipuri.
 
-          Reține că această politică se aplică și extensiilor și aplicațiilor care vor fi instalate forțat prin ExtensionInstallForcelist.
+          Reține că această politică se aplică și extensiilor și aplicațiilor care vor fi instalate automat prin ExtensionInstallForcelist.
 
           Dacă setarea este configurată, extensiile/aplicațiile care au un tip ce nu se află pe listă nu vor fi instalate.
 
@@ -2621,10 +2586,10 @@
 <translation id="5898486742390981550">Când sunt conectați mai mulți utilizatori, numai utilizatorul principal poate folosi aplicațiile Android.</translation>
 <translation id="5901427587865226597">Numai printare duplex</translation>
 <translation id="5903898512448364160">
-      Când politica este activată, politica în cloud are prioritate dacă este în conflict cu politica platformei.
-      Când politica este dezactivată sau nu este configurată, politica platformei are prioritate dacă este în conflict cu politica în cloud.
+      Când politica este activată, politica privind serviciile cloud are prioritate dacă este în conflict cu politica platformei.
+      Când politica este dezactivată sau nu este configurată, politica platformei are prioritate dacă este în conflict cu politica privind serviciile cloud.
 
-      Politica este disponibilă numai ca politică obligatorie a platformei dispozitivului și stabilește numai politicile în cloud privind aria de acoperire a dispozitivului.
+      Politica este disponibilă numai ca politică obligatorie a platformei dispozitivului și stabilește numai politicile privind serviciile cloud ale domeniului dispozitivului.
       </translation>
 <translation id="5905473632148429217">Activează verificările OCSP/CRL online</translation>
 <translation id="5906199912611534122">Permite activarea sau dezactivarea limitării rețelei.
@@ -2667,53 +2632,6 @@
 
       Dacă această politică nu este configurată sau este dezactivată, comenzile de printare declanșează ecranul de previzualizare înainte de printare.</translation>
 <translation id="6022948604095165524">Acțiune la pornire</translation>
-<translation id="6023030044732320798">Specifică un set de politici care vor fi trimise în procesul ARC. Valoarea trebuie să fie un fișier JSON valid.
-
-      Această politică poate fi folosită pentru a configura ce aplicații Android sunt instalate automat pe dispozitiv:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identificatorul aplicației Android, de ex., „com.google.android.gmˮ pentru Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Specifică modul în care este instalată aplicația. OPTIONAL: aplicația nu este instalată automat, dar utilizatorul poate să o instaleze. Aceasta este opțiunea prestabilită, dacă politica nu este specificată. PRELOAD: aplicația este instalată automat, dar utilizatorul poate să o dezinstaleze. FORCE_INSTALLED: aplicația este instalată automat și utilizatorul nu o poate dezinstala. BLOCKED: aplicația este blocată și nu poate fi instalată. Dacă aplicația a fost instalată conform unei politici anterioare, va fi dezinstalată.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Politica pentru acordarea solicitărilor de permisiune aplicațiilor. PERMISSION_POLICY_UNSPECIFIED: politica nu este specificată. Dacă nu este specificată nicio politică pentru o permisiune la niciun nivel, comportamentul „PROMPT” este folosit în mod prestabilit. PROMPT: solicită unui utilizator să acorde o permisiune. GRANT: acordă automat o permisiune. DENY: refuză automat o permisiune.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Obiect de configurare JSON specific aplicației cu un set de perechi cheie-valoare, de ex., „"managedConfiguration": { "key1": value1, "key2": value2 }”. Cheile sunt definite în manifestul aplicației.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Pentru a fixa aplicațiile în lansator, consultă PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Adresa URL instant a furnizorului de căutare prestabilit</translation>
 <translation id="603410445099326293">Parametrii pentru adresa URL a sugestiei care utilizează POST</translation>
 <translation id="6034341625190551415">Controlează sesiunile publice și tipurile de cont kiosk.</translation>
@@ -3061,37 +2979,6 @@
       Dacă această politică este dezactivată, clientul DNS integrat nu va fi utilizat niciodată.
 
       Dacă această politică nu este configurată, clientul DNS integrat va fi activat în mod implicit pe MacOS, Android (când nu este activat nici DNS privat, nici VPN) și ChromeOS, iar utilizatorii vor putea alege dacă se utilizează clientul DNS integrat, modificând chrome://flags sau specificând un semnalizator în linia de comandă.</translation>
-<translation id="6838056959556423778">Modifică regulile de selectare a imprimantei prestabilite pentru <ph name="PRODUCT_NAME" />.
-
-      Această politică stabilește regulile de selectare a imprimantei prestabilite pentru <ph name="PRODUCT_NAME" />, acțiune care are loc atunci când funcția de printare este folosită pentru prima dată cu un profil.
-
-      Dacă politica este configurată, <ph name="PRODUCT_NAME" /> va încerca să găsească o imprimantă care corespunde cu toate atributele specificate și o va selecta ca imprimantă prestabilită. Se va selecta prima imprimantă conformă cu politica; dacă mai multe imprimante sunt conforme cu politica, oricare dintre acestea poate fi selectată, în funcție de ordinea în care sunt descoperite.
-
-      Dacă politica nu este configurată sau nu se găsește nicio imprimantă conformă cu politica în timpul limită, imprimanta prestabilită va fi imprimanta PDF încorporată sau, când imprimanta PDF nu este disponibilă, nu se va selecta nicio imprimantă.
-
-      Valoarea este analizată ca obiect JSON, în conformitate cu următoarea schemă:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Dacă se limitează căutarea la un anumit grup de imprimante.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Expresie regulată pentru ID-ul imprimantei.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Expresie regulată pentru numele afișat al imprimantei.",
-            "type": "string"
-          }
-        }
-      }
-
-      Imprimantele conectate la <ph name="CLOUD_PRINT_NAME" /> intră în categoria <ph name="PRINTER_TYPE_CLOUD" />, iar restul imprimantelor sunt clasificate ca <ph name="PRINTER_TYPE_LOCAL" />.
-      Dacă un câmp nu este completat, toate valorile coincid. De exemplu, dacă nu este specificată conectivitatea, Vizualizarea înainte de printare va iniția descoperirea tuturor tipurilor de imprimante, locale și din cloud.
-      Șabloanele expresiei regulate trebuie să respecte sintaxa RegExp JavaScript, iar valorile care coincid disting între scrierea cu majuscule și minuscule.</translation>
 <translation id="6843296367238757293">Această politică este învechită. Nu se recomandă folosirea ei. Citește mai multe la https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Această politică a fost eliminată în <ph name="PRODUCT_NAME" /> 68 și înlocuită cu <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Această politică este învechită și eliminată din M66, deoarece a fost folosită doar pentru testare internă și reprezintă un risc de securitate.
@@ -3166,9 +3053,9 @@
 Dacă politica este setată la True sau nu este setată, modelul inteligent de reducere a luminozității va fi activat și va putea extinde timpul până la întunecarea ecranului. Dacă politica este setată la False, modelul inteligent de reducere a luminozității nu va influența întunecarea ecranului.</translation>
 <translation id="6967394885063085697">Activează politica de gestionare a alimentării privind modul de încărcare avansată a bateriei.
 
-          Folosind modul de încărcare avansată a bateriei, utilizatorul poate să maximizeze durata de viață a bateriei. În modul de încărcare avansată a bateriei, sistemul va folosi algoritmul de încărcare standard și alte tehnici în timpul orelor nelucrătoare pentru a maximiza durata de viață a bateriei. În timpul orelor de lucru se folosește încărcarea expres. Cu încărcarea expres, bateria poate fi încărcată mai rapid și, astfel, bateria este încărcată complet mai repede. Pentru fiecare zi, orele la care sistemul va fi folosit cel mai intens sunt indicate de ora de începere și de durată.
+          Folosind modul de încărcare avansată a bateriei, utilizatorul poate să maximizeze durata de viață a bateriei. În modul de încărcare avansată a bateriei, sistemul va folosi algoritmul de încărcare standard și alte tehnici când dispozitivul nu este activ pentru a maximiza durata de viață a bateriei. Când dispozitivul este activ, se folosește încărcarea expres. Cu încărcarea expres, bateria poate fi încărcată mai rapid și, astfel, bateria este încărcată complet mai repede. Pentru fiecare zi, orele la care sistemul va fi folosit cel mai intens sunt indicate de ora de începere și de durată.
 
-          Dacă politica este activată și DeviceAdvancedBatteryChargeModeDayConfig este setată, modul de încărcare avansată a bateriei va fi activat întotdeauna dacă este acceptat de dispozitiv.
+          Dacă politica este activată și valoarea DeviceAdvancedBatteryChargeModeDayConfig este setată, modul de încărcare avansată a bateriei va fi activat întotdeauna dacă este acceptat de dispozitiv.
 
           Dacă politica este dezactivată, modul de încărcare avansată a bateriei va fi dezactivat întotdeauna.
 
@@ -4212,30 +4099,6 @@
       Politica afectează numai utilizatorii care s-au autentificat folosind SAML.
 
       Valoarea politicii trebuie specificată în milisecunde.</translation>
-<translation id="9027787254195333560">Cu această politică poți configura imaginea avatar a utilizatorului pe ecranul de conectare. Politica este setată prin specificarea adresei URL de la care <ph name="PRODUCT_OS_NAME" /> poate descărca imaginea avatar și a unui cod hash criptografic utilizat pentru a verifica integritatea descărcării. Imaginea trebuie să fie în format JPEG, iar mărimea sa nu trebuie să depășească 512 KB. Adresa URL trebuie să poată fi accesată fără autentificare.
-
-      Imaginea avatar este descărcată și salvată în memoria cache. Aceasta va fi descărcată din nou ori de câte ori adresa URL sau codul hash se modifică.
-
-      Politica trebuie să fie specificată ca șir ce exprimă adresa URL și codul hash în format JSON, în conformitate cu următoarea schemă:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Adresa URL de la care imaginea cu avatarul poate fi descărcată.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Codul hash SHA-256 al imaginii avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Dacă această politică este setată, <ph name="PRODUCT_OS_NAME" /> va descărca și va folosi imaginea avatar.
-
-      Dacă setezi această politică, utilizatorii nu pot să o modifice sau să o anuleze.
-
-      Dacă politica nu este setată, utilizatorul poate alege imaginea avatar care îl reprezintă pe ecranul de conectare.</translation>
 <translation id="9035964157729712237">ID-urile extensiilor excluse din lista neagră</translation>
 <translation id="9038058011835642205">Specifică o listă cu site-uri care sunt instalate în fundal, fără intervenția utilizatorului, și care nu pot fi dezinstalate sau dezactivate de utilizator.
 
@@ -4248,7 +4111,6 @@
       Dacă setezi această politică, utilizatorii nu pot să o modifice sau să o anuleze.
 
       Valoarea politicii trebuie specificată în milisecunde. Valorile variază între 30 de secunde și 24 de ore.</translation>
-<translation id="9042911395677044526">Această politică permite trimiterea configurației rețelei pentru a fi aplicată pentru fiecare utilizator pe un dispozitiv cu <ph name="PRODUCT_OS_NAME" />. Configurația rețelei este un șir în formatul JSON, conform definirii acestuia de către formatul Open Network Configuration descris la <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Politica stabilește dacă este necesar ca dispozitivul să fie actualizat la o versiune de Quick Fix.
 
       Dacă valoarea politicii este setată la un indicativ care corespunde unei versiuni de Quick Fix, dispozitivul va fi actualizat la versiunea corespunzătoare dacă actualizarea nu este blocată de altă politică.
@@ -4321,17 +4183,6 @@
       Dacă politica este dezactivată, opțiunea „Anteturi și subsoluri” nu este selectată în dialogul de previzualizare înainte de printare, iar utilizatorul nu o poate schimba.
 
       Dacă politica este activată, opțiunea „Anteturi și subsoluri” este selectată în dialogul de previzualizare înainte de printare, iar utilizatorul nu o poate schimba.</translation>
-<translation id="9213347477683611358">Configurează imaginea de fundal la nivel de dispozitiv afișată pe ecranul de conectare, dacă încă nu s-a conectat niciun utilizator pe dispozitiv. Politica se configurează prin specificarea adresei URL de la care dispozitivul cu sistemul de operare Chrome poate descărca imaginea de fundal și a unui cod hash criptografic folosit pentru a verifica integritatea descărcării. Imaginea trebuie să fie în format JPEG, iar dimensiunea fișierului nu trebuie să depășească 16 MB. Adresa URL trebuie să poată fi accesată fără autentificare. Imaginea de fundal este descărcată și stocată în memoria cache. Aceasta va fi descărcată din nou, ori de câte ori adresa URL sau codul hash se modifică.
-
-      Politica trebuie să fie specificată ca șir ce exprimă adresa URL și codul hash în format JSON, de ex.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Dacă politica privind imaginea de fundal a dispozitivului este configurată, dispozitivul cu sistemul de operare Chrome va descărca și va folosi imaginea de fundal pe ecranul de conectare, dacă încă nu s-a conectat niciun utilizator pe dispozitiv. După ce un utilizator se conectează, se aplică politica acestuia privind imaginea de fundal.
-
-      Dacă politica privind imaginea de fundal a dispozitivului nu este configurată, politica utilizatorului privind imaginea de fundal decide ce se afișează, dacă aceasta este configurată.</translation>
 <translation id="9217154963008402249">Frecvența pachetelor de monitorizare din rețea</translation>
 <translation id="922540222991413931">Configurați sursele pentru instalarea extensiilor, a aplicațiilor și a scripturilor de utilizator</translation>
 <translation id="924557436754151212">Importați parolele salvate din browserul prestabilit, la prima rulare</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 35689c3..b38bdc9 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -406,7 +406,6 @@
 
       Внимание! Разрешая киоск-приложениям задавать версию <ph name="PRODUCT_OS_NAME" />, вы подвергаете пользователей риску. Это может привести к тому, что устройство перестанет получать обновления <ph name="PRODUCT_OS_NAME" /> и системы безопасности.</translation>
 <translation id="1675002386741412210">Поддерживается в:</translation>
-<translation id="1689963000958717134">Позволяет принудительно применить конфигурацию сети для всех пользователей устройства <ph name="PRODUCT_OS_NAME" />. Конфигурация сети представляет собой строку в формате JSON согласно стандарту Open Network Configuration, описанному на странице <ph name="ONC_SPEC_URL" />.</translation>
 <translation id="1704516734140344991">Настраивает обновление встроенного ПО для доверенного платформенного модуля (<ph name="TPM_FIRMWARE_UPDATE_TPM" />).
 
       Отдельные параметры могут быть заданы в формате JSON.
@@ -942,14 +941,6 @@
       Если отключить это правило, JavaScript на веб-страницах будет запрещен и никто кроме вас не сможет изменить эту настройку.
 
       Если включить или не настраивать это правило, JavaScript на веб-страницах будет разрешен, но у пользователей будет возможность его запретить.</translation>
-<translation id="2747157663401642394">Позволяет управлять расширениями для <ph name="PRODUCT_NAME" />.
-Это правило контролирует различные настройки расширений, включая те, которые заданы в других правилах. Оно также переопределяет ранее действовавшие настройки.
-
-          Настройки применяются либо на основе идентификатора, либо на основе URL обновления. Если указать идентификатор расширения, настройка будет применена только к нему, а если задать идентификатор <ph name="DEFAULT_SCOPE" /> – ко всем расширениям, для которых в правиле не задана отдельная конфигурация. URL обновления применяется ко всем расширениям, в манифесте которых приведен этот URL, как описано здесь: <ph name="LINK_TO_EXTENSION_DOC1" />.
-Для экземпляров Windows, не входящих в домен <ph name="MS_AD_NAME" />, принудительная установка ограничена расширениями, доступными в Интернет-магазине Chrome.
-
-          Чтобы просмотреть полное описание и структуру правила, перейдите по ссылке https://www.chromium.org/administrators/policy-list-3/extension-settings-full.
-          </translation>
 <translation id="2753637905605932878">Ограничивать диапазон локальных портов UDP, используемых WebRTC</translation>
 <translation id="2757054304033424106">Типы расширений и приложений, которые разрешено устанавливать</translation>
 <translation id="2758084448533744848">Определяет часовой пояс для устройства, используемый по умолчанию. Если правило настроено, пользователи не смогут изменять установленный часовой пояс. Если задано некорректное значение, правило все равно активируется, используя при этом значение "GMT". Если задана пустая строка, правило игнорируется.
@@ -1181,7 +1172,7 @@
 
       Логический флаг <ph name="PRINTER_AUTOCONF" /> показывает, будет ли для настройки принтера использоваться стандарт IPP Everywhere. Этот флаг поддерживается в <ph name="PRODUCT_OS_NAME" /> начиная с версии 76.
 
-      Необходимо указать название принтера в строке <ph name="PRINTER_EFFECTIVE_MODEL" /> или установить значение True для параметра <ph name="PRINTER_AUTOCONF" />. Если заданы оба этих параметра или ни один из них, принтер будет проигнорирован.
+      Необходимо указать название принтера в строке <ph name="PRINTER_EFFECTIVE_MODEL" /> или установить значение True для параметра <ph name="PRINTER_AUTOCONF" />. Если заданы оба этих параметра или не задан ни один из них, принтер будет проигнорирован.
 
       Настройка принтера завершается после первого использования.  До этого момента PPD-файлы не скачиваются.  В дальнейшем часто используемые PPD-файлы кешируются.
 
@@ -1695,30 +1686,6 @@
       Это правило затрагивает только пользователей, которые выполняют вход с использованием SAML.</translation>
 <translation id="4105989332710272578">Отключение проверки сертификатов для определенных сайтов</translation>
 <translation id="4121350739760194865">Запрет на появление рекламы приложений на странице быстрого доступа</translation>
-<translation id="4125606414556046117">Позволяет выбрать обои для рабочего стола и экрана входа в систему. Чтобы настроить правило, необходимо указать URL, откуда <ph name="PRODUCT_OS_NAME" /> может скачать изображение, а также криптографический хеш, с помощью которого проверяется целостность скачанного файла. Поддерживаются изображения в формате JPEG размером не более 16 МБ. URL должен быть доступен без аутентификации.
-
-      Изображение скачивается и сохраняется в кеше. В случае изменения URL или хеша файл скачивается повторно.
-
-      Правило необходимо задать в виде строки, содержащей URL и хеш в формате JSON, используя следующий шаблон:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL, с которого можно скачать изображение",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Хеш SHA-256 для проверки изображения",
-            "type": "string"
-          }
-        }
-      }
-
-      Если правило будет настроено, <ph name="PRODUCT_OS_NAME" /> скачает изображение и установит его в качестве обоев.
-
-      Если правило настроено, пользователи не могут изменить или перезаписать его.
-
-      Если правило не настроено, пользователям разрешается самостоятельно выбирать обои для рабочего стола и экрана входа.</translation>
 <translation id="412697421478384751">Разрешать пользователям устанавливать ненадежные PIN-коды для разблокировки экрана</translation>
 <translation id="4138655880188755661">Ограничение времени</translation>
 <translation id="4144164749344898721">Правило определяет параметры электропитания в случае, когда пользователь некоторое время не выполняет действий на устройстве.
@@ -2645,53 +2612,6 @@
 
 Если параметр не установлен или задано значение false, при печати будет открываться окно предварительного просмотра.</translation>
 <translation id="6022948604095165524">Действие при запуске</translation>
-<translation id="6023030044732320798">Задает набор правил, которые будут переданы в среду выполнения ARC. Значение должно быть действительной строкой JSON.
-
-      С помощью этого правила можно выбрать, какие приложения Android будут установлены на устройство автоматически.
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Идентификатор приложения Android, например "com.google.android.gm" для Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Определяет параметры установки приложений. OPTIONAL: приложение не устанавливается автоматически, но его может установить пользователь. Если правило не настроено, это значение используется по умолчанию. PRELOAD: приложение устанавливается автоматически, но пользователь может удалить его. FORCE_INSTALLED: приложение устанавливается автоматически, и пользователь не может удалить его. BLOCKED: приложение заблокировано, и пользователь не может его установить. Если приложение было установлено ранее, оно будет удалено.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Управляет разрешениями для приложений. PERMISSION_POLICY_UNSPECIFIED: правило не настроено. В этом случае по умолчанию используется значение PROMPT. PROMPT: пользователю предлагается предоставить приложению необходимые разрешения. GRANT: разрешение предоставляется автоматически. DENY: запрос на получение разрешения автоматически отклоняется.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Объект конфигурации JSON для конкретного приложения. Содержит пары "ключ-значение", например '"managedConfiguration": { "key1": value1, "key2": value2 }'. Ключи прописаны в манифесте.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Чтобы закрепить приложения на панели запуска, используйте правило PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL Живого поиска для поисковой системы по умолчанию</translation>
 <translation id="603410445099326293">Параметры для запросов POST к URL-адресу поиска предложений</translation>
 <translation id="6034341625190551415">Определяет типы аккаунтов для сеанса общего доступа и режима киоска.</translation>
@@ -2818,11 +2738,11 @@
 <translation id="6244210204546589761">URL, открывающиеся при запуске</translation>
 <translation id="6255387031094435995">Позволяет объединять выбранные правила из разных источников с одинаковыми областями действия и уровнем.
 
-        Если правило есть в списке, в случае конфликта между двумя источниками с одинаковыми областями действия и уровнем, значения будут объединены в новый список.
+        Если правило есть в списке, то в случае конфликта между двумя источниками с одинаковыми областями действия и уровнем, значения будут объединены в новый список.
 
-        Если правило есть в списке, в случае конфликта между двумя источниками, а также между различными областями действия и/или уровнем будет применяться правило с наивысшим приоритетом.
+        Если правило есть в списке, то в случае конфликта между двумя источниками, а также между различными областями действия и/или уровнем будет применяться правило с наивысшим приоритетом.
 
-        Если правила нет в списке, в случае конфликта между источниками, областями действия и/или уровнем будет применяться правило с наивысшим приоритетом.</translation>
+        Если правила нет в списке, то в случае конфликта между источниками, областями действия и/или уровнем будет применяться правило с наивысшим приоритетом.</translation>
 <translation id="6258193603492867656">Определяет, нужно ли включать нестандартный порт в созданное название SPN Kerberos. Если этот параметр активен и указан нестандартный порт (то есть любой порт, кроме 80 или 443), он будет включен в созданное название SPN Kerberos. Если этот параметр неактивен, в созданном названии SPN Kerberos порт не указывается.</translation>
 <translation id="6261643884958898336">Сообщать данные, идентифицирующие компьютер</translation>
 <translation id="6281043242780654992">Задает правила для обмена сообщениями с оригинальными приложениями. Хосты такого обмена, включенные в черный список, будут загружаться только в том случае, если они добавлены в белый.</translation>
@@ -3041,37 +2961,6 @@
       Если задано значение False, встроенный клиент DNS не используется.
 
       Если правило не настроено, встроенный клиент DNS будет по умолчанию включен для устройств macOS, Android (если не включен персональный DNS-сервер или VPN) и Chrome OS. При этом пользователи смогут изменить эту настройку с помощью chrome://flags или флага командной строки.</translation>
-<translation id="6838056959556423778">Переопределяет правила выбора принтера по умолчанию в <ph name="PRODUCT_NAME" />.
-
-      Это правило определяет принцип выбора принтера по умолчанию в <ph name="PRODUCT_NAME" />, когда в профиле впервые запускается печать.
-
-      Когда для правила заданы значения, <ph name="PRODUCT_NAME" /> выполнит поиск принтера, соответствующего всем указанным атрибутам, и установит его в качестве принтера по умолчанию. Если подходящих принтеров несколько, будет выбран тот из них, который программа обнаружит первым.
-
-      Когда значения не заданы или подходящий принтер не найден в течение определенного промежутка времени, по умолчанию используется встроенный принтер PDF. Если он недоступен, принтер по умолчанию выбран не будет.
-
-      Значение интерпретируется как объект JSON в соответствии со следующей схемой:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Whether to limit the search of the matching printer to a specific set of printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regular expression to match printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regular expression to match printer display name.",
-            "type": "string"
-          }
-        }
-      }
-
-      Принтеры, подключенные к <ph name="CLOUD_PRINT_NAME" />, относятся к типу "<ph name="PRINTER_TYPE_CLOUD" />", а все остальные – к типу "<ph name="PRINTER_TYPE_LOCAL" />".
-      Если значение в поле не указано, то при поиске учитываются все допустимые значения этой категории. Например, если не указан тип подключения, то будет выполнен поиск всех принтеров – как облачных, так и обычных.
-      Формат регулярных выражений должен соответствовать синтаксису JavaScript RegExp с учетом регистра символов.</translation>
 <translation id="6843296367238757293">Правило устарело. Его использование не рекомендуется. Подробную информацию можно найти на странице https://support.google.com/chrome/a/answer/7643500.</translation>
 <translation id="684856667300805181">В <ph name="PRODUCT_NAME" /> 68 правило было заменено на <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Это правило устарело и было удалено в версии M66 из соображений безопасности, поскольку использовалось только для внутреннего тестирования.
@@ -4199,30 +4088,6 @@
       Правило затрагивает только тех пользователей, которые проходят аутентификацию с помощью SAML.
 
       Значение правила указывается в секундах.</translation>
-<translation id="9027787254195333560">Позволяет выбрать аватар для экрана входа в систему. Чтобы настроить правило, необходимо указать URL, откуда <ph name="PRODUCT_OS_NAME" /> может скачать изображение, а также криптографический хеш, с помощью которого проверяется целостность скачанного файла. Поддерживаются изображения в формате JPEG размером не более 512 КБ. URL должен быть доступен без аутентификации.
-
-      Изображение скачивается и сохраняется в кеше. В случае изменения URL или хеша файл скачивается повторно.
-
-      Правило необходимо задать в виде строки, содержащей URL и хеш в формате JSON, используя следующий шаблон:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL, с которого можно скачать изображение",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Хеш SHA-256 для проверки изображения",
-            "type": "string"
-          }
-        }
-      }
-
-      Если правило будет настроено, <ph name="PRODUCT_OS_NAME" /> скачает изображение и установит его в качестве аватара.
-
-      Если правило настроено, пользователи не могут изменить или перезаписать его.
-
-      Если правило не настроено, пользователи смогут самостоятельно выбирать аватар для экрана входа в систему.</translation>
 <translation id="9035964157729712237">Идентификаторы расширений, исключаемых из черного списка</translation>
 <translation id="9038058011835642205">Позволяет указать список сайтов, которые устанавливаются без участия пользователя и которые нельзя удалить или отключить.
 
@@ -4235,7 +4100,6 @@
       Если правило настроено, пользователи не могут изменить или перезаписать его.
 
       Значение указывается в миллисекундах и составляет от 30 секунд до 24 часов.</translation>
-<translation id="9042911395677044526">Позволяет принудительно переносить конфигурацию сети конкретного пользователя на любые устройства <ph name="PRODUCT_OS_NAME" />. Конфигурация сети описывается строкой в формате JSON, который определен форматом Open Network Configuration, с которым можно ознакомиться, перейдя по адресу <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Это правило определяет, будет ли на устройстве устанавливаться Quick Fix Build.
 
       Если в значении правила есть токен, указывающий на сборку Quick Fix Build, она будет установлена на устройстве (если это не запрещено другим правилом).
@@ -4307,17 +4171,6 @@
       Если правило отключено (False), в диалоговом окне печати нет возможности выбора и пользователь не может изменить эти настройки.
 
       Если правило активно (True), печать колонтитулов выбрана в диалоговом окне печати и пользователь не может изменить эти настройки.</translation>
-<translation id="9213347477683611358">Позволяет выбрать изображение, которое будет использоваться на экране входа, если ни один пользователь не вошел в аккаунт. Необходимо указать URL, с которого устройство с Chrome OS может скачать файл изображения для обоев и хеш-сумму для проверки его целостности. Файл должен иметь формат JPEG, а его размер не должен превышать 16 МБ. Для доступа к URL не должна требоваться аутентификация. Изображение для обоев кешируется после скачивания. После изменения URL или хеш-суммы файл скачивается повторно.
-
-      Правило необходимо задать в виде строки, содержащей URL и хеш-сумму, в формате JSON, используя следующий шаблон:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Если это правило задано, устройство с Chrome OS скачает изображение и будет его использовать в качестве обоев на экране входа до тех пор, пока один из пользователей не войдет в свой аккаунт. Затем начинает работать правило, устанавливающее обои этого пользователя.
-
-      Если это правило не задано, то обои выбираются в соответствии с правилом, устанавливающим обои пользователя (если оно определено).</translation>
 <translation id="9217154963008402249">Частота отправки сетевых пакетов</translation>
 <translation id="922540222991413931">Настроить источники для установки расширений, приложений и пользовательских скриптов</translation>
 <translation id="924557436754151212">Импорт сохраненных паролей из браузера, используемого по умолчанию, при первом запуске</translation>
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index 4edd601..23e6026 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -391,7 +391,6 @@
 
       Upozornenie: Neodporúča sa delegovať ovládanie verzie systému <ph name="PRODUCT_OS_NAME" /> verejnej aplikácii, pretože môže zariadeniu zabrániť získavať aktualizácie softvéru a kritické opravy chýb zabezpečenia. Delegovanie ovládania verzie systému <ph name="PRODUCT_OS_NAME" /> môže používateľov vystaviť riziku.</translation>
 <translation id="1675002386741412210">Podporované na:</translation>
-<translation id="1689963000958717134">Umožňuje preniesť konfiguráciu siete, ktorá sa použije pre všetkých používateľov v zariadení so systémom <ph name="PRODUCT_OS_NAME" />. Konfigurácia siete je reťazec vo formáte JSON, ktorý sa riadi definíciou formátu Open Network Configuration uvedenou na adrese <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Umožňuje konfigurovať dostupnosť a správanie funkcií aktualizácie firmvéru <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Jednotlivé nastavenia môžete určiť vo vlastnostiach JSON:
@@ -952,16 +951,6 @@
       Ak je toto nastavenie zakázané, webové stránky nebudú môcť používať jazyk JavaScript a používateľ toto nastavenie nebude môcť zmeniť.
 
       Ak toto pravidlo ponecháte nenastavené, webové stránky budú môcť používať jazyk JavaScript, ale používateľ bude môcť toto nastavenie zmeniť.</translation>
-<translation id="2747157663401642394">Konfiguruje nastavenia správy rozšírení pre <ph name="PRODUCT_NAME" />.
-
-          Toto pravidlo ovláda viaceré nastavenia, ako aj nastavenia ovládané existujúcimi pravidlami týkajúcimi sa rozšírení. Ak nastavíte obe, toto pravidlo prepíše všetky staré pravidlá.
-
-          Toto pravidlo namapuje identifikátor rozšírenia alebo webovú adresu aktualizácie na svoju konfiguráciu. Keď bude mať k dispozícii identifikátor rozšírenia, konfigurácia sa použije iba pre ním určené rozšírenie. Pre špeciálny identifikátor <ph name="DEFAULT_SCOPE" /> môžete nastaviť predvolenú konfiguráciu, ktorá sa použije pre všetky rozšírenia, pre ktoré ste v rámci tohto pravidla nenastavili vlastnú konfiguráciu. Keď bude mať k dispozícii webovú adresu aktualizácie, konfigurácia sa použije pre všetky rozšírenia s presnou webovou adresou aktualizácie stanovenou v manifeste tohto rozšírenia tak, ako je to uvedené na <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          V prípade inštancií systému Windows nepripojených k doméne <ph name="MS_AD_NAME" /> sa vynucuje inštalácia iba aplikácií a rozšírení uvedených v Internetovom obchode Chrome.
-
-          Úplný popis možných nastavení a štruktúry tohto pravidla nájdete na https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Obmedzenie rozsahu miestnych portov UDP používaných rozhraním WebRTC</translation>
 <translation id="2757054304033424106">Typy rozšírení/aplikácií, ktorých inštalácia je povolená</translation>
 <translation id="2758084448533744848">Umožňuje špecifikovať časové pásmo, ktoré sa bude presadzovať v zariadení. Keď nastavíte toto pravidlo, používatelia nemôžu v zariadení špecifikované časové pásmo prepísať. Ak poskytnete neplatnú hodnotu, toto pravidlo sa aktivuje s časovým pásmom GMT. Ak poskytnete prázdny reťazec, toto pravidlo sa bude ignorovať.
@@ -1196,7 +1185,7 @@
 
       <ph name="PRINTER_AUTOCONF" /> je boolovský príznak označujúci, či sa má tlačiareň nastaviť pomocou štandardu IPP Everywhere. Tento príznak podporuje prehliadač <ph name="PRODUCT_OS_NAME" /> od verzie 76 (vrátane nej).
 
-      <ph name="PRINTER_EFFECTIVE_MODEL" /> by mal obsahovať názov tlačiarne alebo pravidlo <ph name="PRINTER_AUTOCONF" /> by malo byť nastavené na hodnotu true. Tlačiarne s vlastníctvami aj bez nich budú ignorované.
+      <ph name="PRINTER_EFFECTIVE_MODEL" /> by mal obsahovať názov tlačiarne alebo pravidlo <ph name="PRINTER_AUTOCONF" /> by malo byť nastavené na hodnotu true. Tlačiarne s nastavenými vlastnosťami aj bez nich budú ignorované.
 
       Nastavenie tlačiarne sa dokončí pri prvom použití.  Súbory PPD sa stiahnu až pri použití tlačiarne.  Často používané súbory PPD sa následne uložia do vyrovnávacej pamäte.
 
@@ -1626,7 +1615,7 @@
 <translation id="3915395663995367577">Webová adresa súboru PAC servera proxy</translation>
 <translation id="3920892052017026701">Nastavte vlastnú hodnotu začatia nabíjania batérie v percentách.
 
-          Batéria sa začne nabíjať, keď dosiahne vlastnú hodnotu nabíjania batérie.
+          Batéria sa začne nabíjať, keď dosiahne vlastnú hodnotu nabitia.
 
           Parameter DeviceBatteryChargeCustomStartCharging musí byť menší ako DeviceBatteryChargeCustomStopCharging.
 
@@ -1661,7 +1650,7 @@
       Ak je toto pravidlo nastavené na hodnotu true alebo je ponechané bez nastavenia, používatelia si pri registrácii OS Chrome budú môcť uplatniť ponuky.
 
       Ak je toto pravidlo nastavené na hodnotu false, používatelia si nebudú môcť uplatniť ponuky.</translation>
-<translation id="4008233182078913897">Umožňuje určiť zoznam aplikácií a rozšírení, ktoré sa inštalujú potichu bez interakcie používateľa a používateľ ich nemôže odinštalovať ani zakázať. Všetky povolenia vyžadované aplikáciami alebo rozšíreniami sú bezpodmienečne udelené bez interakcie s používateľom, a to vrátane všetkých ďalších povolení vyžiadaných budúcimi verziami daných aplikácií alebo rozšírení. 
+<translation id="4008233182078913897">Umožňuje určiť zoznam aplikácií a rozšírení, ktoré sa inštalujú potichu bez interakcie s používateľom a používateľ ich nemôže odinštalovať ani zakázať. Všetky povolenia vyžadované aplikáciami alebo rozšíreniami sú bezpodmienečne udelené bez interakcie s používateľom, a to vrátane všetkých ďalších povolení vyžiadaných budúcimi verziami daných aplikácií alebo rozšírení. 
 Ďalej sa udeľujú povolenia pre rozhrania API rozšírení enterprise.deviceAttributes a enterprise.platformKeys. (Tieto dve rozhrania sú k dispozícii iba pre aplikácie alebo rozšírenia, ktorých inštalácia bola vynútená.)
 
           Toto pravidlo má prednosť v prípade potenciálneho konfliktu s pravidlom <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />. Ak je z tohto zoznamu odstránená aplikácia alebo rozšírenie, ktorého inštalácia bola v minulosti vynútená, <ph name="PRODUCT_NAME" /> ich automaticky odinštaluje.
@@ -1726,30 +1715,6 @@
       Toto pravidlo sa vzťahuje iba na používateľov, ktorí sa prihlásia pomocou SAML.</translation>
 <translation id="4105989332710272578">Zakázať vynucovanie pravidla transparentnosti certifikátov pre zoznam webových adries</translation>
 <translation id="4121350739760194865">Zabraňuje tomu, aby sa propagácie aplikácií zobrazovali na stránke Nová karta</translation>
-<translation id="4125606414556046117">Toto pravidlo umožňuje nakonfigurovať obrázok tapety, ktorá sa používateľovi zobrazuje na pracovnej ploche a na pozadí prihlasovacej obrazovky. Pravidlo nastavíte určením webovej adresy, z ktorej môže <ph name="PRODUCT_OS_NAME" /> stiahnuť daný obrázok tapety, a určením kryptografickej hodnoty hash, pomocou ktorej sa overí integrita stiahnutého súboru. Obrázok musí byť vo formáte JPEG a jeho veľkosť nesmie prekročiť 16 MB. Webová adresa musí byť prístupná bez overenia.
-
-      Obrázok tapety sa stiahne a uloží do vyrovnávacej pamäte. Pri každej zmene webovej adresy alebo hašovania sa znova stiahne.
-
-      Toto pravidlo je potrebné zadať ako reťazec, ktorý udáva webovú adresu a hašovanie vo formáte JSON, a to podľa nasledujúcej schémy:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Webová adresa, na ktorej je možné obrázok tapety stiahnuť.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hodnota hašovania SHA-256 obrázka tapety.",
-            "type": "string"
-          }
-        }
-      }
-
-      Keď je pravidlo nastavené, <ph name="PRODUCT_OS_NAME" /> obrázok tapety stiahne a použije.
-
-      Ak toto pravidlo nastavíte, používatelia ho nebudú môcť zmeniť ani prepísať.
-
-      Ak toto pravidlo nenastavíte, používatelia si budú môcť vybrať obrázok na pracovnej ploche a na pozadí prihlasovacej obrazovky.</translation>
 <translation id="412697421478384751">Povoliť používateľom nastaviť slabé kódy PIN na uzamknutej obrazovke</translation>
 <translation id="4138655880188755661">Časový limit</translation>
 <translation id="4144164749344898721">Toto pravidlo ovláda viaceré nastavenia pre stratégiu správy spotreby energie, keď je používateľ nečinný.
@@ -2522,7 +2487,7 @@
 <translation id="5630352020869108293">Obnoviť poslednú reláciu</translation>
 <translation id="5643906875497889108">Ovláda typy aplikácií a rozšírení, ktoré je možné nainštalovať. Tiež obmedzuje prístup k spúšťaniu.
 
-          Týmto nastavením pridáte do zoznamu povolených položiek povolené typy rozšírení a aplikácií, ktoré je možné nainštalovať v aplikácii <ph name="PRODUCT_NAME" />, a hostiteľov, s ktorými je možné interagovať. Daná hodnota je zoznam týchto reťazcov: extension, theme, user_script, hosted_app, legacy_packaged_app, platform_app. Ďalšie informácie o týchto typoch si môžete prečítať v dokumentácii k rozšíreniam prehliadača <ph name="PRODUCT_NAME" />.
+          Týmto nastavením pridáte do zoznamu povolených položiek povolené typy rozšírení a aplikácií, ktoré je možné nainštalovať v aplikácii <ph name="PRODUCT_NAME" />, a hostiteľov, s ktorými je možné interagovať. Hodnotou je napríklad zoznam týchto reťazcov: extension, theme, user_script, hosted_app, legacy_packaged_app, platform_app. Ďalšie informácie o týchto typoch si môžete prečítať v dokumentácii k rozšíreniam prehliadača <ph name="PRODUCT_NAME" />.
 
           Upozorňujeme, že toto pravidlo má vplyv aj na rozšírenia a aplikácie, ktorých inštalácia bude presadená prostredníctvom pravidla ExtensionInstallForcelist.
 
@@ -2694,53 +2659,6 @@
 
       Ak toto pravidlo nastavené nie je alebo je nastavené na hodnotu False, príkazy na tlač spustia obrazovku ukážky tlače.</translation>
 <translation id="6022948604095165524">Akcia pri spustení</translation>
-<translation id="6023030044732320798">Určuje skupinu pravidiel, ktoré budú postúpené na spustenie ARC. Hodnota musí mať platný formát JSON.
-
-      Pomocou tohto pravidla je možné konfigurovať, ktoré aplikácie pre Android sa automaticky nainštalujú do zariadenia:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identifikátor aplikácie pre Android, napr. „com.google.android.gm“ pre Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Určí spôsob inštalácie aplikácie. OPTIONAL (VOLITEĽNÁ): Aplikácia sa nenainštaluje automaticky, ale môže ju nainštalovať používateľ. Ide o predvolené nastavenie, ak pravidlo nie je určené. PRELOAD (PREDINŠTALOVANÁ): Aplikácia sa nainštaluje automaticky, ale používateľ ju môže odinštalovať. FORCE_INSTALLED (VYNÚTENE NAINŠTALOVANÁ): Aplikácia sa nainštaluje automaticky a používateľ ju nemôže odinštalovať. BLOCKED (BLOKOVANÁ): Aplikácia je blokovaná a nedá sa nainštalovať. Ak bola aplikácia nainštalovaná v rámci predchádzajúceho pravidla, odinštaluje sa.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Pravidlo na udeľovanie žiadostí o povolenie aplikáciám. PERMISSION_POLICY_UNSPECIFIED (PRAVIDLO POVOLENÍ NIE JE URČENÉ): Pravidlo nie je určené. Ak pre povolenie na akejkoľvek úrovni nie je určené žiadne pravidlo, predvolene sa použije nastavenie PROMPT (VYZVAŤ). PROMPT (VYZVAŤ): Používateľ bude vyzvaný udeliť povolenie. GRANT (UDELIŤ): Povolenie bude udelené automaticky. DENY (ZAMIETNUŤ): Povolenie bude automaticky zamietnuté.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Konfiguračný objekt JSON špecifický pre aplikáciu s nastavenými pármi kľúč-hodnota, napr. „"managedConfiguration": { "kľúč": hodnota, "kľúč": hodnota }“. Kľúče sú definované v manifeste aplikácie.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Ak chcete pripnúť aplikácie do spúšťača, pozrite si pravidlo PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Webová adresa dynamického vyhľadávania predvoleného poskytovateľa vyhľadávania</translation>
 <translation id="603410445099326293">Parametre pre webovú adresu návrhov, ktorá používa metódu POST</translation>
 <translation id="6034341625190551415">Ovláda typy účtov verejných relácií a verejných terminálov.</translation>
@@ -3088,37 +3006,6 @@
       Ak toto pravidlo nastavíte na hodnotu False, vstavaný klient DNS sa nepoužije nikdy.
 
       Ak toto pravidlo nenastavíte, v systémoch MacOS, Android (keď nie sú povolené súkromné DNS ani VPN) a ChromeOS bude predvolene povolený vstavaný klient DNS, a používatelia budú môcť ovládať používanie vstavaného klienta DNS pomocou úprav na chrome://flags alebo určením príznaku v príkazovom riadku.</translation>
-<translation id="6838056959556423778">Umožňuje prepísať pravidlá výberu predvolenej tlačiarne v prehliadači <ph name="PRODUCT_NAME" />.
-
-      Určuje pravidlá výberu predvolenej tlačiarne v prehliadači <ph name="PRODUCT_NAME" /> pri prvom použití funkcie tlače s určitým profilom.
-
-      Keď toto pravidlo nastavíte, <ph name="PRODUCT_NAME" /> sa pokúsi nájsť tlačiareň zodpovedajúcu všetkým špecifikovaným atribútom a vyberie ju ako predvolenú. Vyberie sa prvá tlačiareň zodpovedajúca tomuto pravidlu. Ak sa nájde tlačiareň, ktorá nie je jedinečná zhoda, môžete vybrať akúkoľvek zodpovedajúcu tlačiareň (v závislosti od poradia, v ktorom boli tlačiarne objavené).
-
-      Ak toto pravidlo nenastavíte alebo sa v rámci časového limitu nenájde zodpovedajúca tlačiareň, obnoví sa predvolené nastavenie vstavanej tlačiarne PDF alebo sa nevyberie žiadna tlačiareň (ak tlačiareň PDF nie je k dispozícii).
-
-      Hodnota sa analyzuje ako objekt JSON, a to podľa nasledujúcej schémy:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Či obmedziť vyhľadávanie zodpovedajúcej tlačiarne na konkrétnu skupinu tlačiarní.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regulárny výraz na priradenie identifikátora tlačiarne.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regulárny výraz na priradenie zobrazovaného názvu tlačiarne.",
-            "type": "string"
-          }
-        }
-      }
-
-      Tlačiarne pripojené do služby <ph name="CLOUD_PRINT_NAME" /> sa považujú za <ph name="PRINTER_TYPE_CLOUD" />, ostatné tlačiarne sú označené ako <ph name="PRINTER_TYPE_LOCAL" />.
-      Ak vynecháte určité pole, budú mu zodpovedať všetky príslušné hodnoty. Ak napríklad nešpecifikujete pripojenie, nástroj Print Preview spustí hľadanie všetkých druhov tlačiarní – miestnych aj v cloude.
-      Vzory bežných výrazov musia zodpovedať syntaxi JavaScript RegExp a vo všetkých zodpovedajúcich výrazoch sa rozlišujú veľké a malé písmená.</translation>
 <translation id="6843296367238757293">Podpora tohto pravidla bola ukončená. Neodporúča sa používať. Ďalšie informácie nájdete na https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Toto pravidlo bolo odstránené v systéme <ph name="PRODUCT_NAME" /> verzie 68 a nahradené pravidlom <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Toto pravidlo je vo verzii M66 deaktivované a odstránené, pretože sa používalo iba na interné testovanie a predstavuje bezpečnostné riziko.
@@ -4274,30 +4161,6 @@
       Toto pravidlo sa vzťahuje iba na používateľov, ktorých totožnosť bola overená pomocou štandardu SAML.
 
       Hodnota tohto pravidla by mala byť určená v sekundách.</translation>
-<translation id="9027787254195333560">Toto pravidlo umožňuje konfigurovať obrázok avatara, ktorý na prihlasovacej obrazovke predstavuje používateľa. Pravidlo vytvoríte zadaním webovej adresy, z ktorej môže <ph name="PRODUCT_OS_NAME" /> stiahnuť obrázok avatara a kryptografické hašovanie, ktoré slúži na overenie integrity stiahnutého obsahu. Obrázok musí byť vo formáte JPEG a jeho veľkosť nesmie prekročiť 512 kB. Webová adresa musí byť prístupná bez overenia.
-
-      Obrázok avatara sa stiahne a uloží do vyrovnávacej pamäte. Pri každej zmene webovej adresy alebo hašovania sa znova stiahne.
-
-      Toto pravidlo je potrebné zadať ako reťazec, ktorý udáva webovú adresu a hašovanie vo formáte JSON, a to podľa nasledujúcej schémy:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Webová adresa, z ktorej je možné obrázok avatara stiahnuť.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hašovanie SHA-256 obrázka avatara.",
-            "type": "string"
-          }
-        }
-      }
-
-      Keď je pravidlo nastavené, <ph name="PRODUCT_OS_NAME" /> obrázok avatara stiahne a použije.
-
-      Ak toto pravidlo nastavíte, používatelia ho nebudú môcť zmeniť ani prepísať.
-
-      Ak pravidlo nenastavíte, používatelia si budú môcť zvoliť obrázok avatara, ktorý ich bude predstavovať na prihlasovacej obrazovke.</translation>
 <translation id="9035964157729712237">ID rozšírení, ktoré majú byť zo zoznamu zakázaných rozšírení vyňaté</translation>
 <translation id="9038058011835642205">Umožňuje špecifikovať zoznam webov, ktoré sa inštalujú potichu bez interakcie s používateľom a ktoré používateľ nemôže odinštalovať ani deaktivovať.
 
@@ -4310,7 +4173,6 @@
       Ak toto pravidlo nastavíte, používatelia ho nebudú môcť zmeniť ani prepísať.
 
       Hodnota tohto pravidla sa udáva v milisekundách. Namiesto hodnôt mimo rozsahu od 30 sekúnd do 24 hodín sa použijú príslušné krajné hodnoty tohto rozsahu.</translation>
-<translation id="9042911395677044526">Umožňuje preniesť konfiguráciu siete, ktorá sa použije pre jednotlivých používateľov v zariadení so systémom <ph name="PRODUCT_OS_NAME" />. Konfigurácia siete je reťazec vo formáte JSON, ktorý sa riadi definíciou formátu Open Network Configuration uvedenou na adrese <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Toto pravidlo ovláda, či bude zariadenie aktualizované na zostavu s rýchlou opravou.
 
       Ak nastavíte hodnotu pravidla na token, ktorý mapuje na zostavu s rýchlou opravou, zariadenie bude aktualizované na zodpovedajúcu zostavu s rýchlou opravou (ak danú aktualizáciu neblokuje iné pravidlo).
@@ -4390,17 +4252,6 @@
       Ak toto pravidlo nastavíte na hodnotu false, položka Hlavičky a päty nebude vybraná v dialógovom okne ukážky tlače a používateľ to nemôže zmeniť.
 
       Ak ho nastavíte na hodnotu true, položka Hlavičky a päty je vybraná v dialógovom okne ukážky tlače a používateľ to nemôže zmeniť.</translation>
-<translation id="9213347477683611358">Slúži na konfiguráciu obrázku tapety na úrovni zariadenia, ktorý sa bude zobrazovať na obrazovke prihlásenia, ak sa do zariadenia zatiaľ neprihlásil žiadny používateľ. Pravidlo nastavíte určením webovej adresy, z ktorej môže zariadenie so systémom Chrome OS stiahnuť daný obrázok tapety, a určením kryptografickej hodnoty hash, pomocou ktorej sa overí integrita stiahnutého súboru. Obrázok musí byť vo formáte JPEG a jeho veľkosť nesmie prekročiť 16 MB. Webová adresa musí byť prístupná bez overenia totožnosti. Obrázok tapety sa stiahne a uloží do vyrovnávacej pamäte. Obrázok sa stiahne znova v prípade, že sa zmení webová adresa alebo hodnota hash.
-
-      Toto pravidlo je potrebné zadať ako reťazec, ktorý udáva webovú adresu a hodnotu hash vo formáte JSON. Príklad:
-      {
-        "url": "https://example.com/tapeta_zariadenia.jpg",
-        "hash": "hashukazkovejtapety"
-      }
-
-      Ak je pravidlo tapety zariadenia nastavené, zariadenie so systémom Chrome OS stiahne obrázok tapety a použije ho na obrazovke prihlásenia, ak sa do zariadenia zatiaľ neprihlásil žiadny používateľ. Po prihlásení sa použije pravidlo pre tapetu príslušného používateľa.
-
-      Ak pravidlo tapety zariadenia nie je nastavené, zobrazený obrázok závisí od pravidla tapety používateľa (ak je nastavené).</translation>
 <translation id="9217154963008402249">Frekvencia odosielania sledovacích sieťových paketov</translation>
 <translation id="922540222991413931">Konfigurácia zdrojov inštalácie rozšírenia, aplikácie a skriptov používateľa</translation>
 <translation id="924557436754151212">Import uložených hesiel z predvoleného prehliadača pri prvom spustení</translation>
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index 5931f620..5027295 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -417,7 +417,6 @@
 
       Opozorilo: ni priporočljivo, da nadzor nad različico sistema <ph name="PRODUCT_OS_NAME" /> dodelite aplikaciji za kiosk, saj tako naprava morda ne bo prejemala posodobitev programske opreme in nujnih varnostnih popravkov. Če dodelite nadzor nad različico sistema <ph name="PRODUCT_OS_NAME" />, so uporabniki morda ogroženi.</translation>
 <translation id="1675002386741412210">Na voljo podpora za:</translation>
-<translation id="1689963000958717134">Omogoča pošiljanje omrežne konfiguracije, ki se uporablja za vse uporabnike, v napravo s sistemom <ph name="PRODUCT_OS_NAME" />. Omrežna konfiguracija je niz v obliki zapisa JSON, kot je določeno z obliko konfiguracije odprtega omrežja, opisano na <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Konfigurira razpoložljivost in delovanje funkcije posodobitve vdelane programske opreme modula <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Posamezne nastavitve je mogoče določiti v lastnostih datoteke JSON:
@@ -978,16 +977,6 @@
       Če je ta nastavitev onemogočena, spletne strani ne morejo uporabljati JavaScripta in uporabnik te vrednosti ne more spremeniti.
 
       Če je ta nastavitev omogočena ali ni nastavljena, lahko spletne strani uporabljajo JavaScript, toda uporabnik lahko to nastavitev spremeni.</translation>
-<translation id="2747157663401642394">Konfigurira nastavitve upravljanja razširitev za <ph name="PRODUCT_NAME" />.
-
-          Ta pravilnik nadzira več nastavitev, vključno z nastavitvami, ki jih nadzirajo kateri koli obstoječi pravilniki, povezani z razširitvami. Ta pravilnik preglasi vse morebitne starejše pravilnike, če so nastavljeni oboji.
-
-          Ta pravilnik preslika ID razširitve ali URL za posodobitev v svojo konfiguracijo. Konfiguracija z ID-jem razširitve bo uporabljena samo za določeno razširitev. Za posebni ID <ph name="DEFAULT_SCOPE" /> je mogoče nastaviti privzeto konfiguracijo, ki se bo uporabila za vse razširitve, ki v tem pravilniku nimajo nastavljene konfiguracije po meri. Konfiguracija z URL-jem za posodobitev bo uporabljena za vse razširitve s točno določenim URL-jem za posodobitev, navedenim v manifestu te razširitve, kot je opisano na <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Za primerke sistema Windows, ki niso pridruženi v domeno <ph name="MS_AD_NAME" />, je vsiljeno nameščanje omejeno na aplikacije in razširitve, navedene v Spletni trgovini Chrome.
-
-          Celoten opis mogočih nastavitev in struktura tega pravilnika sta na voljo na https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Omejitev obsega lokalnih vrat UDP, ki jih uporablja tehnologija WebRTC</translation>
 <translation id="2757054304033424106">Vrste razširitev/aplikacij, katerih namestitev je dovoljena</translation>
 <translation id="2758084448533744848">Določa uveljavljen časovni pas, ki se uporablja za napravo. Če je ta pravilnik nastavljen, uporabniki v napravi ne morejo preglasiti določenega časovnega pasu. Če je vnesena neveljavna vrednost, je pravilnik kljub temu aktiviran s časovnim pasom »GMT«. Če je naveden prazen niz, je pravilnik prezrt.
@@ -1760,30 +1749,6 @@
       Ta pravilnik vpliva samo na uporabnike, katerih pristnost se preverja z uporabo SAML-ja.</translation>
 <translation id="4105989332710272578">Onemogočanje uveljavljanja pravilnika o preglednosti potrdila za seznam URL-jev</translation>
 <translation id="4121350739760194865">Onemogoči prikaz oglasov za aplikacije na novem zavihku s povezavami.</translation>
-<translation id="4125606414556046117">S tem pravilnikom lahko nastavite sliko za ozadje, prikazano na namizju in na prijavni strani za uporabnika. Pravilnik se nastavi tako, da navedete URL, s katerega lahko <ph name="PRODUCT_OS_NAME" /> prenese sliko za ozadje, in kriptografsko zgoščeno vrednost, ki se uporabi za preverjanje celovitosti prenosa. Slika mora biti v obliki JPEG in njena velikost ne sme presegati 16 MB. URL mora biti dostopen brez preverjanja pristnosti.
-
-      Slika za ozadje se prenese in predpomni. Če se spremeni URL ali zgoščena vrednost, se znova prenese.
-
-      Pravilnik mora biti naveden kot niz, ki izraža URL in zgoščeno vrednost v obliki JSON, skladno s to shemo:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL, s katerega se lahko prenese slika za ozadje.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Zgoščena vrednost SHA-256 slike za ozadje.",
-            "type": "string"
-          }
-        }
-      }
-
-      Če je ta pravilnik nastavljen, <ph name="PRODUCT_OS_NAME" /> prenese in uporabi sliko za ozadje.
-
-      Če nastavite ta pravilnik, ga uporabniki ne morejo spremeniti ali preglasiti.
-
-      Če tega pravilnika ne nastavite, lahko uporabnik izbere sliko, ki bo prikazana na namizju in v ozadju zaslona za prijavo.</translation>
 <translation id="412697421478384751">Omogoči uporabnikom nastavitev šibkih kod PIN za kodo PIN za zaklenjen zaslon.</translation>
 <translation id="4138655880188755661">Časovna omejitev</translation>
 <translation id="4144164749344898721">Ta pravilnik nadzira različne nastavitve za strategijo upravljanja energije, ko uporabnik postane nedejaven.
@@ -2745,53 +2710,6 @@
 
       Če ta pravilnik ni nastavljen ali je nastavljen na »false«, ukazi za tiskanje sprožijo zaslon za predogled tiskanja.</translation>
 <translation id="6022948604095165524">Dejanje ob zagonu</translation>
-<translation id="6023030044732320798">Določa nabor pravilnikov, ki bodo posredovani izvajalniku ARC. Vrednost mora biti veljavna datoteka JSON.
-
-      S tem pravilnikom je mogoče konfigurirati, katere aplikacije za Android so samodejno nameščene v tej napravi:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Identifikator aplikacij za Android, npr. "com.google.android.gm" za Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Določa način namestitve aplikacije. OPTIONAL: aplikacija ni samodejno nameščena, vendar jo uporabnik lahko namesti. Če ta pravilnik ni določen, je to privzeta vrednost. PRELOAD: aplikacija je samodejno nameščena, vendar jo uporabnik lahko odstrani. FORCE_INSTALLED: aplikacija je samodejno nameščena in uporabnik je ne more odstraniti. BLOCKED: aplikacija je blokirana in je ni mogoče namestiti. Če je bila aplikacija nameščena s prejšnjim pravilnikom, bo odstranjena.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Pravilnik za odobritev dovoljenja za aplikacije. PERMISSION_POLICY_UNSPECIFIED: pravilnik ni določen. Če za dovoljenje na kateri koli ravni ni določen noben pravilnik, potem je privzeto uporabljeno vedenje »PROMPT«. PROMPT: poziv za uporabnika, da odobri dovoljenje. GRANT: samodejno odobreno dovoljenje. DENY: samodejno zavrnjeno dovoljenje.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Konfiguracijski objekt JSON za posamezno aplikacijo z naborom parov ključa (key) in vrednosti (value), npr. '"managedConfiguration": »{ "key1": value1, "key2": value2 }«. Ključi so definirani v manifestu aplikacije.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Če želite pripeti aplikacije v zaganjalnik, si oglejte PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Privzeti URL iskalnika za dinamično iskanje</translation>
 <translation id="603410445099326293">Parametri za URL predloga, ki uporablja POST</translation>
 <translation id="6034341625190551415">Nadzira vrste računov za javne seje in kiosk.</translation>
@@ -3145,37 +3063,6 @@
       Če je ta pravilnik nastavljen na »false«, vgrajeni odjemalec DNS ne bo uporabljen.
 
       Če ta pravilnik ni nastavljen, bo vgrajeni odjemalec DNS privzeto omogočen v sistemih macOS, Android (če nista omogočena zasebni strežnik DNS in VPN) in OS Chrome, uporabniki pa bodo lahko spreminjali, ali naj se uporablja vgrajeni odjemalec DNS tako, da bodo uredili stran chrome://flags ali določili zastavico v ukazni vrstici.</translation>
-<translation id="6838056959556423778">Preglasi pravila za izbiro privzetega tiskalnika za <ph name="PRODUCT_NAME" />.
-
-      Ta pravilnik določa pravila za izbiro privzetega tiskalnika v brskalniku <ph name="PRODUCT_NAME" />, do česar pride, ko je funkcija tiskanja prvič uporabljena s profilom.
-
-      Če je ta pravilnik nastavljen, <ph name="PRODUCT_NAME" /> poskusi poiskati tiskalnik, ki se ujema z vsemi določenimi atributi, in ga izbere kot privzetega. Izbran je prvi tiskalnik, ki se ujema s pravilnikom. V primeru neenoličnega ujemanja je lahko izbran kateri koli tiskalnik, ki se ujema, odvisno od vrstnega reda odkrivanja tiskalnikov.
-
-      Če ta pravilnik ni nastavljen ali v časovni omejitvi ni najden tiskalnik, ki se ujema, je privzeti tiskalnik vgrajeni tiskalnik PDF. Če ta ni na voljo, ni izbran noben tiskalnik.
-
-      Vrednost je razčlenjena kot predmet JSON skladno s to shemo:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Ali naj se iskanje tiskalnika, ki se ujema, omeji na določeno skupino tiskalnikov.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regularni izraz, ki se ujema z ID-jem tiskalnika.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regularni izraz, ki se ujema s prikaznim imenom tiskalnika.",
-            "type": "string"
-          }
-        }
-      }
-
-      Tiskalniki, povezani v storitev <ph name="CLOUD_PRINT_NAME" />, se obravnavajo kot »<ph name="PRINTER_TYPE_CLOUD" />«, drugi tiskalniki pa so razvrščeni kot »<ph name="PRINTER_TYPE_LOCAL" />«.
-      Če izpustite polje, se ujemajo vse vrednosti. Če na primer ne določite povezave, predogled tiskanja začne odkrivanje vseh vrst tiskalnikov – lokalnih in v oblaku.
-      Vzorci regularnega izraza morajo upoštevati sintakso JavaScript RegExp in pri ujemanjih se razlikuje med malimi in velikimi črkami.</translation>
 <translation id="6843296367238757293">Ta pravilnik je zastarel. Njegovo uporabo odsvetujemo. Preberite več na https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Ta pravilnik je bil odstranjen v izdelku <ph name="PRODUCT_NAME" /> in ga je zamenjal pravilnik <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Ta pravilnik je zastarel in smo ga v M66 odstranili, ker se je uporabljal samo za interno preskušanje in predstavlja varnostno tveganje.
@@ -4348,30 +4235,6 @@
       Ta pravilnik vpliva samo na uporabnike, katerih pristnost je bila preverjena s SAML-jem.
 
       Vrednost za pravilnik mora biti izražena v sekundah.</translation>
-<translation id="9027787254195333560">S tem pravilnikom lahko nastavite sliko avatarja, ki na zaslonu za prijavo predstavlja uporabnika. Pravilnik se nastavi z določitvijo URL-ja, s katerega lahko operacijski sistem <ph name="PRODUCT_OS_NAME" />prenese sliko za avatar in kriptografsko zgoščeno vrednost za preverjanje celovitosti prenosa. Slika mora biti v obliki JPEG in njena velikost ne sme presegati 512 KB. URL mora biti dostopen brez preverjanja pristnosti.
-
-      Slika za avatar se prenese in shrani v predpomnilnik. Če se spremeni URL ali zgoščena vrednost, se znova prenese.
-
-      Pravilnik mora biti naveden kot niz, ki izraža URL in zgoščeno vrednost v obliki JSON, skladno s to shemo:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL, s katerega se lahko prenese slika za avatar.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Zgoščena vrednost SHA-256 slike za avatar.",
-            "type": "string"
-          }
-        }
-      }
-
-      Če je ta pravilnik nastavljen, <ph name="PRODUCT_OS_NAME" /> prenese in uporabi sliko za avatar.
-
-      Če nastavite ta pravilnik, ga uporabniki ne morejo spremeniti ali preglasiti.
-
-      Če tega pravilnika ne nastavite, lahko uporabnik izbere sliko za avatar, ki ga predstavlja na zaslonu za prijavo.</translation>
 <translation id="9035964157729712237">ID-ji razširitev, ki naj bodo izvzete s seznama prepovedanih</translation>
 <translation id="9038058011835642205">Določa seznam spletnih mest, ki so nameščene brez obveščanja in poseganja uporabnika ter jih uporabnik ne more odmestiti ali onemogočiti.
 
@@ -4384,7 +4247,6 @@
       Če nastavite ta pravilnik, ga uporabniki ne morejo spremeniti ali preglasiti.
 
       Vrednost pravilnika mora biti navedena v milisekundah. Vrednosti so v obsegu od 30 sekund do 24 ur.</translation>
-<translation id="9042911395677044526">Omogoča pošiljanje omrežne konfiguracije, ki se uporablja glede na uporabnika, v napravo s sistemom <ph name="PRODUCT_OS_NAME" />. Omrežna konfiguracija je niz v obliki zapisa JSON, kot je določeno z obliko konfiguracije odprtega omrežja, opisane na <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Ta pravilnik nadzira, ali naj bo naprava posodobljena na delovno različico Quick Fixa.
 
       Če je vrednost pravilnika nastavljena na žeton, ki preslika v delovno različico Quick Fixa, bo naprava posodobljena na ustrezno delovno različico Quick Fixa, če posodobitve ne blokira drug pravilnik.
@@ -4464,17 +4326,6 @@
       Če je pravilnik onemogočen, možnost za glave in noge v pogovornem oknu za predogled tiskanja ni izbrana in uporabnik tega ne more spremeniti.
 
       Če je pravilnik omogočen, je možnost za glave in noge v pogovornem oknu za predogled tiskanja izbrana in uporabnik tega ne more spremeniti.</translation>
-<translation id="9213347477683611358">Konfiguriranje slike za ozadje na ravni naprave, ki je prikazana na zaslonu za prijavo, če ni v napravi prijavljen še noben uporabnik. Pravilnik se nastavi z določanjem URL-ja, s katerega lahko naprava OS Chrome prenese sliko za ozadje, in kriptografske razpršilne vrednosti za preverjanje celovitosti prenosa. Slika mora biti v obliki JPEG in njena velikost ne sme presegati 16 MB. URL mora biti dostopen brez preverjanja pristnosti. Slika za ozadje se prenese in shrani v predpomnilnik. Ob vsaki spremembi URL-ja ali razpršilne vrednosti se znova prenese.
-
-      Pravilnik mora biti določen kot niz, ki izraža URL in razpršilno vrednost v obliki JSON, npr.
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Če je pravilnik za ozadje v napravi nastavljen, naprava OS Chrome prenese in uporabi sliko za ozadje na zaslonu za prijavo, kadar ni v napravi prijavljen še noben uporabnik. Ko se prijavi uporabnik, se aktivira pravilnik za ozadje uporabnika.
-
-      Če pravilnik za ozadje v napravi ni nastavljen, se odločitev, kaj prikazati, določi na podlagi pravilnika za ozadje uporabnika, kadar je tak pravilnik nastavljen.</translation>
 <translation id="9217154963008402249">Pogostost omrežnih paketov za spremljanje</translation>
 <translation id="922540222991413931">Konfiguriranje virov za namestitev razširitev, aplikacij in uporabniških skriptov</translation>
 <translation id="924557436754151212">Uvoz shranjenih gesel privzetega brskalnika pri prvem zagonu</translation>
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index abf43ff9..f15ec55 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -408,7 +408,6 @@
 
       Упозорење: делегирање контроле над верзијом <ph name="PRODUCT_OS_NAME" />-а киоск апликацији се не препоручује пошто би то могло да онемогући да уређај добија ажурирања софтвера и критичне безбедносне исправке грешака. Делегирање контроле над верзијом <ph name="PRODUCT_OS_NAME" />-а може кориснике да изложи ризику.</translation>
 <translation id="1675002386741412210">Подржано на:</translation>
-<translation id="1689963000958717134">Омогућава да се конфигурација мреже примени за све кориснике уређаја <ph name="PRODUCT_OS_NAME" />. Конфигурација мреже је стринг са JSON форматирањем као што је дефинисано форматом Open Network Configuration описаним на <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Конфигурише доступност и понашање функције ажурирања <ph name="TPM_FIRMWARE_UPDATE_TPM" /> фирмвера.
 
       Појединачна подешавања могу да се наведу у JSON својствима:
@@ -952,14 +951,6 @@
       Ако је ово подешавање онемогућено, веб-странице не могу да користе JavaScript и корисник не може да промени то подешавање.
 
       Ако је ово подешавање омогућено или није подешено, веб-странице могу да користе JavaScript, али корисник може да промени то подешавање.</translation>
-<translation id="2747157663401642394">Конфигуришу подешавања управљања додацима за <ph name="PRODUCT_NAME" />.
-Ове смернице контролишу више подешавања, укључујући подешавања која контролишу било које постојеће смернице у вези са додацима. Ове смернице замењују било које застареле смернице ако су и једне и друге подешене.
-
-          Ове смернице упоређују ИД додатка или URL ажурирања са његовом конфигурацијом. Када користите ИД додатка, конфигурација ће бити примењена само на наведени додатак. За посебни ИД <ph name="DEFAULT_SCOPE" /> може да се подеси подразумевана конфигурација, која ће се примењивати на све додатке за које у овим смерницама није подешена прилагођена конфигурација. Када користите URL за ажурирање, конфигурација ће бити примењена на све додатке који имају идентичан URL за ажурирање попут оног који је наведен у манифесту овог додатка, као што је описано на <ph name="LINK_TO_EXTENSION_DOC1" />.
-Када су у питању инстанце Windows-а које нису придружене неком <ph name="MS_AD_NAME" /> домену, принудна инсталација је ограничена на додатке наведене у Chrome веб-продавници.
-
-          Потпун опис могућих подешавања и структурe ових смерница потражите на https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Ограничава опсег локалних UDP портова које користи WebRTC</translation>
 <translation id="2757054304033424106">Типови додатака/апликација који могу да се инсталирају</translation>
 <translation id="2758084448533744848">Наводе примењену временску зону која ће се користити на уређају. Када су ове смернице подешене, корисници на уређају не могу да замене одређену временску зону. Ако је наведена неважећа вредност, смернице се ипак активирају, али уместо тога користе „средње време по Гриничу“. Ако је наведен празан стринг, смернице се игноришу.
@@ -1725,30 +1716,6 @@
       Ове смернице утичу само на кориснике који потврду идентитета обављају помоћу SAML-а.</translation>
 <translation id="4105989332710272578">Онемогућавају примену Транспарентности сертификата за листу URL-ова</translation>
 <translation id="4121350739760194865">Спречи приказивање промоција апликација на страници Нова картица</translation>
-<translation id="4125606414556046117">Ове смернице вам омогућавају да конфигуришете слику позадине која се приказује на радној површини и у позадини екрана за пријављивање за корисника. Смернице се подешавају навођењем URL-а са ког <ph name="PRODUCT_OS_NAME" /> може да преузме слику позадине и криптографског хеша који се користи за верификацију интегритета преузимања. Слика мора да буде у JPEG формату, а величина не сме да буде већа од 16 MB. URL мора да буде доступан без икакве потврде идентитета.
-
-      Слика позадине се преузима и кешира. Поново се преузима сваки пут када се URL или хеш промени.
-
-      Смернице треба да буду наведене као стринг који приказује URL и хеш у JSON формату, у складу са следећом шемом:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL са ког слика позадине може да се преузме.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Хеш SHA-256 слике позадине.",
-            "type": "string"
-          }
-        }
-      }
-
-      Ако подесите ове смернице, <ph name="PRODUCT_OS_NAME" /> ће преузети и користити слику позадине.
-
-      Ако подесите ове смернице, корисници не могу да их промене нити замене.
-
-      Ако не подесите смернице, корисник може да изабере слику која ће се приказивати на радној површини и у позадини екрана за пријављивање.</translation>
 <translation id="412697421478384751">Омогућавају корисницима да за PIN за закључавање екрана подешавају слабе PIN-ове</translation>
 <translation id="4138655880188755661">Временско ограничење</translation>
 <translation id="4144164749344898721">Ове смернице контролишу више подешавања за стратегију управљања напајањем која се примењује када је корисник неактиван.
@@ -2698,53 +2665,6 @@
 
       Ако ове смернице нису подешене или је вредност подешена на нетачно, команде штампања отварају екран прегледа за штампу.</translation>
 <translation id="6022948604095165524">Радња при покретању</translation>
-<translation id="6023030044732320798">Наводе скуп смерница које ће бити пренесене у време извршавања за ARC. Вредност мора да буде важећа JSON датотека.
-
-      Помоћу ових смерница могу да се конфигуришу Android апликације које ће аутоматски бити инсталиране на уређају:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "идентификатор Android апликације, нпр. „com.google.android.gm“ за Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Одређују како ће апликација бити инсталирана. OPTIONAL: Апликација се не инсталира аутоматски, али корисник може да је инсталира. Ово је подразумевано подешавање ако смернице нису наведене. PRELOAD: Апликација се инсталира аутоматски, али корисник може да је деинсталира. FORCE_INSTALLED: Апликација се инсталира аутоматски и корисник не може да је деинсталира. BLOCKED: Апликација је блокирана и не може да се инсталира. Ако је апликација инсталирана у складу са претходним смерницама, биће деинсталирана.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Смернице за одобравање захтева за дозволе апликацијама. PERMISSION_POLICY_UNSPECIFIED: Смернице нису наведене. Ако никакве смернице нису наведене за дозволу ни на једном нивоу, подразумевано се користи понашање „PROMPT“. PROMPT: Питаћемо кориснике да ли желе да дају дозволе. GRANT: Дозвола се аутоматски даје. DENY: Дозвола се аутоматски одбија.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Посебан JSON објекат за конфигурацију апликације са скупом парова кључ-вредност, нпр. „managedConfiguration“: { "key1": value1, "key2": value2 }'. Кључеви су дефинисани у манифесту апликације.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Да бисте закачили апликације на покретач, погледајте PinnedLauncherApps.</translation>
 <translation id="602728333950205286">Инстант URL адреса подразумеваног добављача претраге</translation>
 <translation id="603410445099326293">Параметри за URL предлога који користи POST</translation>
 <translation id="6034341625190551415">Контролишу типове налога јавне сесије и киоска.</translation>
@@ -3094,37 +3014,6 @@
       Ако су ове смернице подешене на вредност Нетачно, уграђени DNS клијент се никада неће користити.
 
       Ако ове смернице нису подешене, уграђени DNS ће бити подразумевано омогућен у MacOS-у, Android-у (када ни приватни DNS нити VPN нису омогућени) и Chrome ОС-у и корисници ће моћи да мењају да ли се користи уграђени DNS клијент изменом вредности на chrome://flags или навођењем обележја командне линије.</translation>
-<translation id="6838056959556423778">Замењују <ph name="PRODUCT_NAME" /> правила за избор подразумеваног штампача.
-
-      Ове смернице одређују правила за избор подразумеваног штампача у <ph name="PRODUCT_NAME" />-у при првом коришћењу функције штампања за профил.
-
-      Када подесите ове смернице, <ph name="PRODUCT_NAME" /> покушава да пронађе штампач који се подудара са свим наведеним атрибутима и да га изабере као подразумевани. Бира се први пронађени штампач који се подудара са смерницама, док се у случају више подударања бира било који одговарајући штампач, у зависности од редоследа којим су пронађени.
-
-      Ако не подесите ове смернице или се не пронађе одговарајући штампач пре истека временског ограничења, као подразумевани штампач бира се уграђени PDF штампач или се не бира ниједан у случају да PDF штампач није доступан.
-
-      Вредност се рашчлањује као JSON објекат у складу са следећом шемом:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Да ли да се претрага одговарајућих штампача ограничи на одређену групу штампача.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Регуларни израз за подударање са ИД-ом штампача.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Регуларни израз за подударање са именом за приказ штампача.",
-            "type": "string"
-          }
-        }
-      }
-
-      Штампачи повезани са <ph name="CLOUD_PRINT_NAME" />-ом се сматрају <ph name="PRINTER_TYPE_CLOUD" /> штампачима, док се остали класификују као <ph name="PRINTER_TYPE_LOCAL" />.
-      Ако прескочите поље, значи да се све вредности подударају. На пример, ако не наведете начин повезивања, Преглед пре штампања ће покренути откривање свих врста штампача, локалних и оних у клауду.
-      Обрасци регуларних израза морају да прате JavaScript RegExp синтаксу, а при тражењу подударања разликују се велика и мала слова.</translation>
 <translation id="6843296367238757293">Ове смернице су застареле. Не препоручује се њихова употреба. Прочитајте више на https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Ове смернице су уклоњене у <ph name="PRODUCT_NAME" />-у 68 и замениле су их смернице <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Ове смернице су застареле и уклоњене у M66 зато што су коришћене само за интерно тестирање и представљају претњу по безбедност.
@@ -4304,30 +4193,6 @@
       Ове смернице се односе само на кориснике који су потврдили идентитет помоћу SAML-а.
 
       Вредност смерница треба да буде наведена у секундама.</translation>
-<translation id="9027787254195333560">Ове смернице вам омогућавају да конфигуришете слику аватара који представља корисника на екрану за пријављивање. Смернице се подешавају навођењем URL-а са ког <ph name="PRODUCT_OS_NAME" /> може да преузме слику аватара и криптографског хеша који се користи за верификацију интегритета преузимања. Слика мора да буде у JPEG формату и не сме да буде већа од 512 kB. URL мора да буде доступан без икакве потврде идентитета.
-
-      Слика аватара се преузима и кешира. Поново се преузима сваки пут када се URL или хеш промени.
-
-      Смернице треба да буду наведене као стринг који приказује URL и хеш у JSON формату, у складу са следећом шемом:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL са ког слика аватара може да се преузме.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Хеш SHA-256 слике аватара.",
-            "type": "string"
-          }
-        }
-      }
-
-Ако подесите ове смернице, <ph name="PRODUCT_OS_NAME" /> ће преузети и користити слику аватара.
-
-      Ако подесите ове смернице, корисници не могу да их промене нити замене.
-
-      Ако не подесите смернице, корисник може да одабере слику аватара који ће га представљати на екрану за пријављивање.</translation>
 <translation id="9035964157729712237">ИД-ови додатака које треба изузети са црне листе</translation>
 <translation id="9038058011835642205">Наводе листу веб-сајтова који су неприметно инсталирани, без интеракције корисника, и које корисник не може да деинсталира нити онемогући.
 
@@ -4340,7 +4205,6 @@
       Ако подесите ове смернице, корисници не могу да их промене нити замене.
 
       Вредност за ове смернице треба да се наведе у милисекундама. Вредности се прилагођавају да би се уклопиле у опсег од 30 секунди до 24 сата.</translation>
-<translation id="9042911395677044526">Омогућава да се конфигурација мреже примени по кориснику уређаја <ph name="PRODUCT_OS_NAME" />. Конфигурација мреже је стринг са JSON форматирањем као што је дефинисано форматом Open Network Configuration описаним на адреси <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Ове смернице контролишу да ли уређај треба да се ажурира на верзију за брзо решавање проблема.
 
       Ако подесите вредност смерница на токен који се мапира у верзији за брзо решавање проблема, уређај се ажурира на одговарајућу верзију за брзо решавање проблема ако друге смернице не блокирају ажурирање.
@@ -4420,17 +4284,6 @@
       Ако подесите смернице на Нетачно, „Заглавља и подножја“ нису изабрана у дијалогу прегледа за штампу и корисник то не може да промени.
 
       Ако подесите смернице на Тачно, Заглавља и подножја“ су изабрана у дијалогу прегледа за штампу и корисник то не може да промени.</translation>
-<translation id="9213347477683611358">Конфигуришите слику позадине на нивоу уређаја која се приказује на екрану за пријављивање ако се ниједан корисник још није пријавио на уређај. Смернице се подешавају тако што се наведе URL са кога уређај са Chrome ОС-ом може да преузме слику позадине и криптографски хеш који се користи за верификовање интегритета преузимања. Слика мора да буде у формату JPEG, а њена величина не сме да премаши 16 MB. URL мора да буде приступачан без потврде аутентичности. Слика позадине се преузима и кешира и поново се преузима сваки пут када се промене URL или хеш.
-
-      Смернице треба да се наведу у виду стринга који исказује URL и хеш у формату JSON, нпр.
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Ако су подешене смернице за позадину уређаја, уређај са Chrome ОС-ом ће преузети и користити слику позадине на екрану за пријављивање ако се ниједан корисник још није пријавио на уређај. Када се неки корисник пријави, његове смернице за позадину добијају предност.
-
-      Ако се смернице за позадину уређаја оставе неподешене, смернице за позадину корисника одређују шта ће се приказати, ако су подешене.</translation>
 <translation id="9217154963008402249">Учесталост мрежних пакета за надгледање</translation>
 <translation id="922540222991413931">Конфигурисање извора за инсталирање додатака, апликација и скрипти корисника</translation>
 <translation id="924557436754151212">Увоз сачуваних лозинки из подразумеваног прегледача при првом покретању</translation>
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index cac25ed..b2f49944 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -417,7 +417,6 @@
 
       Obs! Att delegera kontrollen över vilken version av <ph name="PRODUCT_OS_NAME" /> som används till en kioskapp rekommenderas inte, eftersom det kan leda till att uppdateringar av programvaran och viktiga säkerhetskorrigeringar inte längre görs på enheten. Om du delegerar valet av <ph name="PRODUCT_OS_NAME" />-version kan användarnas säkerhet äventyras.</translation>
 <translation id="1675002386741412210">Stöds av:</translation>
-<translation id="1689963000958717134">Tillåter att en pushad nätverkskonfiguration används för alla användare på en <ph name="PRODUCT_OS_NAME" />-enhet. Nätverkskonfigurationen är en JSON-formaterad sträng som definieras av formatet för öppen nätverkskonfiguration som beskrivs på <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Konfigurerar tillgängligheten och beteendet för uppdateringar av firmware för <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Enskilda inställningar kan anges som JSON-egenskaper:
@@ -978,16 +977,6 @@
       Om den här inställningen är inaktiverad kan inte JavaScript användas på webbsidor och inställningen kan inte ändras av användaren.
 
       Om inställningen är aktiverad eller inte inställd kan JavaScript användas på webbsidor, men inställningen kan inte ändras av användaren.</translation>
-<translation id="2747157663401642394">Konfigurerar inställningar för hantering av tillägg i <ph name="PRODUCT_NAME" />.
-
-          Principen styr flera inställningar – även inställningar som styrs av redan befintliga principer som gäller tillägg. Den här principen åsidosätter äldre principer om båda har angetts.
-
-          Principen kopplar samman ett tilläggs-id eller en uppdateringsadress med motsvarande konfiguration. Med ett tilläggs-id tillämpas konfigurationen endast på det angivna tillägget. Det särskilda id:t <ph name="DEFAULT_SCOPE" /> kan tilldelas en standardkonfiguration, som tillämpas på alla tillägg som det inte finns någon anpassad konfiguration för i principen. Med en uppdateringsadress tillämpas konfigurationen på alla tillägg som har exakt denna uppdateringsadress angiven i sitt manifest, så som beskrivs på <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          På Windows-domäner som inte har anslutits till en <ph name="MS_AD_NAME" />-domän kan bara appar och tillägg som finns på Chrome Web Store tvångsinstalleras.
-
-          Du hittar en fullständig beskrivning av möjliga inställningar och principens struktur på https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Låt WebRTC endast använda UDP-portar inom ett begränsat intervall</translation>
 <translation id="2757054304033424106">Typer av tillägg/appar som får installeras</translation>
 <translation id="2758084448533744848">Anger vilken tidszon som måste användas på enheten. När principen har angetts kan användarna inte åsidosätta den angivna tidszonen. Om ett ogiltigt värde har angetts för principen aktiveras den fortfarande, men får värdet GMT. Om en tom sträng har angetts ignoreras principen.
@@ -1750,30 +1739,6 @@
       Principen påverkar bara användare som autentiseras med SAML.</translation>
 <translation id="4105989332710272578">Inaktivera tillämpning av Certifikattransparens för en lista med webbadresser</translation>
 <translation id="4121350739760194865">Förhindra att appkampanjer visas på den nya fliksidan</translation>
-<translation id="4125606414556046117">Med den här principen kan du konfigurera bakgrundsbilden som visas på skrivbordet och på inloggningsskärmen för användaren. Principen anges genom att webbadressen som <ph name="PRODUCT_OS_NAME" /> kan ladda ned bakgrundsbilden från anges och att en kryptografisk hash används för att verifiera nedladdningens integritet. Bilden måste vara i JPEG-format och filstorleken får inte överskrida 16 MB. Det måste gå att komma åt webbadressen utan autentisering.
-
-      Bakgrundsbilden laddas ned och lagras i cacheminnet. Den laddas ned på nytt när webbadressen eller hashen ändras.
-
-      Principen ska anges som en sträng som anger webbadressen och hashen i JSON-format, enligt följande schema:
-      {
-        "typ": "objekt",
-        "egenskaper": {
-          "webbadress": {
-            "beskrivning": "Webbadressen som bakgrundsbilden kan laddas ned från.",
-            "typ": "sträng"
-          },
-          "hash": {
-            "beskrivning": "SHA-256-hashen för bakgrundsbilden.",
-            "typ": "sträng"
-          }
-        }
-      }
-
-      Om principen ställs in laddar <ph name="PRODUCT_OS_NAME" /> ned och använder bakgrundsbilden.
-
-      Om du ställer in den här principen kan användare inte ändra eller åsidosätta den.
-
-      Om principen inte anges kan användaren välja en bild som ska visas på skrivbordet och på inloggningsskärmen.</translation>
 <translation id="412697421478384751">Tillåt att användare anger en osäker pinkod till låsskärmen</translation>
 <translation id="4138655880188755661">Tidsgräns</translation>
 <translation id="4144164749344898721">Den här principen styr flera energisparinställningar när användaren är inaktiv.
@@ -2736,53 +2701,6 @@
 
       Om policyn inte tillämpas eller tillämpas felaktigt visas skärmen med förhandsgranskning av utskriften vid utskrifter.</translation>
 <translation id="6022948604095165524">Åtgärd vid start</translation>
-<translation id="6023030044732320798">Anger en uppsättning principer som överlämnas till ARC-körning. Värdet måste vara en giltig JSON.
-
-      Principen används för att konfigurera vilka Android-appar som installeras automatiskt på enheten:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "beskrivning": "Identifierare för Android-app, t.ex. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "beskrivning": "Anger hur en app installeras. OPTIONAL: Appen installeras inte automatiskt men användaren kan installera den. Detta är standardprincipen om annat inte anges. PRELOAD: Appen installeras automatiskt men användaren kan avinstallera den. FORCE_INSTALLED: Appen installeras automatiskt och användaren kan inte avinstallera den. BLOCKED: Appen blockeras och användaren kan inte installera den. Om appen installerades när en tidigare princip gällde så avinstalleras den.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "beskrivning": "Princip för att godkänna begäranden om behörighet till appar. PERMISSION_POLICY_UNSPECIFIED: Ingen princip är angiven. PROMPT är standard om ingen annan princip anges på någon nivå. PROMPT: Låt användaren ge behörighet. GRANT: Ge behörighet automatiskt. DENY: Neka behörighet automatiskt.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "beskrivning": "Appspecifikt konfigurationsobjekt för JSON med en uppsättning nyckel-värden, t.ex. '"managedConfiguration": { "key1": value1, "key2": value2 }'. Nycklarna definieras i appens manifest.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Läs mer om PinnedLauncherApps om du vill fästa appar i översikten.</translation>
 <translation id="602728333950205286">Dynamisk webbadress för standardsökleverantör</translation>
 <translation id="603410445099326293">Parametrar för föreslagen webbadress som använder POST</translation>
 <translation id="6034341625190551415">Styr offentliga sessioner och konton för offentlig miljö.</translation>
@@ -3136,37 +3054,6 @@
       Om den här principen är inställd på Falskt används aldrig den inbyggda DNS-klienten.
 
       Om den här principen inte anges, aktiveras den inbyggda DNS-klienten som standard i MacOS, Android (om varken Privat DNS eller VPN är aktiverad) och ChromeOS, och användarna kan ändra om den inbyggda DNS-klienten används genom att ändra chrome://flags eller ange en flagga på kommandoraden.</translation>
-<translation id="6838056959556423778">Åsidosätter skrivarens standardurvalsregler för <ph name="PRODUCT_NAME" />.
-
-      Genom denna princip fastställs reglerna för valet av standardskrivare i <ph name="PRODUCT_NAME" />, vilket sker första gången som utskriftsfunktionen används av en profil.
-
-      När den här principen har ställts in försöker <ph name="PRODUCT_NAME" /> att hitta en skrivare som uppfyller alla de angivna attributen och välja denna som standardskrivare. Den första skrivare som hittas och överensstämmer med principen är den som väljs. Om matchningen inte är unik väljs en skrivare ut som uppfyller attributen efter den ordning i vilken skrivarna hittades.
-
-      Om denna princip inte har ställts in eller om ingen skrivare som uppfyller attributen hittas innan tidsfristen löper ut ställs den inbyggda PDF-skrivaren in som standardskrivare. Om ingen PDF-skrivare finns tillgänglig väljs ingen skrivare.
-
-      Värdet analyseras som ett JSON-objekt enligt följande schema:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Huruvida sökningen efter en skrivare som uppfyller attributen ska begränsas till en specifik uppsättning av skrivare.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Reguljärt uttryck som ska matcha skrivar-id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Reguljärt uttryck som ska matcha skrivarens visningsnamn.",
-            "type": "string"
-          }
-        }
-      }
-
-      Skrivare som är anslutna till <ph name="CLOUD_PRINT_NAME" /> betraktas som <ph name="PRINTER_TYPE_CLOUD" /> medan övriga skrivare klassificeras som <ph name="PRINTER_TYPE_LOCAL" />.
-      Om ett fält utelämnas innebär det att alla värden anses matcha. Om till exempel anslutningen inte anges hittar förhandsgranskningen alla typer av skrivare, såväl lokala skrivare som molnskrivare.
-      Reguljära uttryck måste följa syntaxen för reguljära uttryck i JavaScript. Matchningarna är skiftlägeskänsliga.</translation>
 <translation id="6843296367238757293">Den här principen är föråldrad. Den bör inte användas. Läs mer på https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Den här principen togs bort i <ph name="PRODUCT_NAME" /> 68 och ersattes av <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Principen har fasats ut och togs bort i M66 eftersom den endast användes för interna tester och utgör en säkerhetsrisk.
@@ -4339,30 +4226,6 @@
       Den här principen påverkar endast användare som verifieras via SAML.
 
       Principens värde ska anges i sekunder.</translation>
-<translation id="9027787254195333560">Med den här principen kan du konfigurera den avatarbild som representerar användaren på inloggningsskärmen. Du kan ställa in principen genom att ange en webbadress från vilken <ph name="PRODUCT_OS_NAME" /> kan ladda ned avatarbilden och en kryptografisk hash som används för att verifiera nedladdningens integritet. Bilden måste vara i JPEG-format och får inte vara större än 512 kB. Det måste gå att komma åt webbadressen utan autentisering.
-
-      Avatarbilden laddas ned och cachelagras. Den laddas ned på nytt när webbadressen eller hashen ändras.
-
-      Principen ska anges som en sträng som anger webbadressen och hashen i JSON-format, enligt följande schema:
-      {
-        "typ": "objekt",
-        "egenskaper": {
-          "webbadress": {
-            "beskrivning": "Webbadressen som avatarbilden kan laddas ned från.",
-            "typ": "sträng"
-          },
-          "hash": {
-            "beskrivning": "SHA-256-hashen för avatarbilden.",
-            "typ": "sträng"
-          }
-        }
-      }
-
-      Om principen ställs in laddar <ph name="PRODUCT_OS_NAME" /> ned och använder avatarbilden.
-
-      Om du ställer in den här principen kan användare inte ändra eller åsidosätta den.
-
-      Om principen inte anges kan användaren välja en avatarbild som representerar honom eller henne på inloggningsskärmen.</translation>
 <translation id="9035964157729712237">Tilläggs-ID:n att undanta från svartlistan</translation>
 <translation id="9038058011835642205">Anger en lista med webbplatser som installeras obemärkt utan att användaren gör något, och som inte kan avinstalleras eller inaktiveras av användaren.
 
@@ -4375,7 +4238,6 @@
       Om du ställer in den här principen kan användare inte ändra eller åsidosätta den.
 
       Principens värde ska anges i millisekunder. Värden ska anges inom ett intervall från 30 sekunder till 24 timmar.</translation>
-<translation id="9042911395677044526">Tillåter att en pushad nätverkskonfiguration används per användare på en <ph name="PRODUCT_OS_NAME" />-enhet. Nätverkskonfigurationen är en JSON-formaterad sträng som definieras av formatet för öppen nätverkskonfiguration som beskrivs på <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Principen styr om enheten ska uppdateras till en Quick Fix Build.
 
       Om principens värde är inställt på en token som är mappad till en Quick Fix Build uppdateras enheten till motsvarande Quick Fix Build så länge uppdateringen inte blockeras av en annan princip.
@@ -4455,17 +4317,6 @@
       Om principen är inställd på falskt är alternativet Sidhuvud och sidfot avmarkerat i dialogrutan för förhandsgranskning av utskrift och användaren kan inte ändra detta.
 
       Om principen är inställd på sant är alternativet Sidhuvud och sidfot markerat i dialogrutan för förhandsgranskning av utskrift och användaren kan inte ändra detta.</translation>
-<translation id="9213347477683611358">Konfigurera den bakgrundsbild på enhetsnivå som visas på inloggningsskärmen om ingen användare har loggat in på enheten. Ange policyn genom att ange webbadressen som Chrome OS-enheten kan ladda ned bakgrundsbilden från och en kryptografisk hash som används för att verifiera nedladdningens integritet. Bilden måste vara i JPEG-format och dess filstorlek får inte överskrida 16 MB. Webbadressen måste vara tillgänglig utan autentisering. Bakgrundsbilden laddas ned och lagras i cacheminnet. Den laddas ned igen varje gång webbadressen eller hashen ändras.
-
-      Policyn ska anges som en sträng som uttrycker webbadressen och hashen i JSON-format, till exempel
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Om enhetens bakgrundspolicy anges laddar Chrome OS-enheten ned och använder bakgrundsbilden på inloggningsskärmen om ingen användare har loggat in på enheten. Användarens bakgrundspolicy börjar gälla när användaren har loggat in.
-
-      Om enhetens bakgrundspolicy inte har angetts bestämmer användarens angivna bakgrundspolicy vad som ska visas.</translation>
 <translation id="9217154963008402249">Frekvens för nätverkspaket för övervakning</translation>
 <translation id="922540222991413931">Konfigurera installationskällor för tillägg, appar och användarskript</translation>
 <translation id="924557436754151212">Importera sparade lösenord från standardwebbläsaren första gången den körs</translation>
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index 555700e..af57ee0 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -393,7 +393,6 @@
 
       Onyo: Unashauriwa kutohawilisha udhibiti wa toleo la <ph name="PRODUCT_OS_NAME" /> kwenye programu ya skrini nzima kwa sababu inaweza kuzuia kifaa kupokea masasisho ya programu na marekebisho muhimu ya usalama. Kuhawilisha udhibiti wa toleo la <ph name="PRODUCT_OS_NAME" /> kunaweza kuhatarisha hali ya watumiaji.</translation>
 <translation id="1675002386741412210">Imehimiliwa kwenye:</translation>
-<translation id="1689963000958717134">Inaruhusu kusukuma usanidi wa mtandao ili kutumika kwa watumiaji wote wa kifaa cha <ph name="PRODUCT_OS_NAME" />. Usanidi wa mtandao ni mtungo wa JSON ulioumbizwa kama ilivyofafanuliwa na umbizo la Usanidi Huru wa Mtandao ulioelezwa kwenye <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Huweka mipangilio ya upatikanaji na utendaji wa kipengele cha kusasisha programu dhibiti ya <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Mipangilio mahususi inaweza kubainishwa katika sifa za JSON:
@@ -950,13 +949,6 @@
       Iwapo mpangilio huu umelemazwa, kurasa za wavuti haziwezi kutumia JavaScript na mtumiaji hawezi kubadilisha mpangilio huo.
 
       Iwapo mpangilio huu umezimwa au la, kurasa za wavuti zinaweza kutumia JavaScript lakini mtumiaji anaweza kubadilisha mpangilio huo.</translation>
-<translation id="2747157663401642394">Huweka mipangilio ya usimamizi wa viendelezi katika <ph name="PRODUCT_NAME" />. Sera hii hudhibiti mipangilio mingi, ikiwa ni pamoja na mipangilio inayodhibitiwa na sera zozote zilizopo zinazohusiana na viendelezi. Sera hii itabatilisha sera zozote zilizopitwa na wakati ikiwa zote mbili zimewekwa.
-
-          Sera hii inaambatisha kitambulisho cha kiendelezi au URL ya sasisho kwenye mipangilio yake. Ikiwa na kitambulisho cha kiendelezi, mipangilio itawekwa kwenye kiendelezi kilichobainishwa pekee. Mipangilio chaguomsingi inaweza kuwekwa kwenye kitambulisho maalum cha <ph name="DEFAULT_SCOPE" />, ambayo itatumika kwenye viendelezi vyote visivyo na mipangilio maalum katika sera hii. Ikiwa na URL ya sasisho, mipangilio itawekwa kwenye viendelezi vyote vyenye URL mahususi ya sasisho iliyobainishwa katika faili ya maelezo ya kiendelezi hiki, kama ilivyoelezwa katika <ph name="LINK_TO_EXTENSION_DOC1" />.
-Kwa matukio ya Windows ambayo hayajaunganishwa kwenye kikoa cha <ph name="MS_AD_NAME" />, usakinishaji wa lazima unafanywa tu kwenye programu na viendelezi vilivyoorodheshwa katika Duka la Chrome kwenye Wavuti.
-
-          Ili upate maelezo kamili kuhusu mipangilio inayoweza kutumika na muundo wa sera hii, tafadhali tembelea https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Dhibiti masafa ya milango ya ndani ya UDP inayotumiwa na WebRTC</translation>
 <translation id="2757054304033424106">Aina za viendelezi/programu zinazoruhusiwa kusakinishwa</translation>
 <translation id="2758084448533744848">Hubainisha saa za eneo zitakazotumika katika kifaa. Sera hii ikiwekwa, watumiaji wa kifaa hawawezi kubatilisha saa za eneo zilizobainishwa. Thamani isiyo sahihi ikiwekwa, bado sera itatumika katika "GMT" badala yake. Ikiwa mfuatano usio na kitu unawekwa, sera hii haitatumika.
@@ -1681,7 +1673,7 @@
 
           Ikiwa sera hii haijawekwa, hakuna programu au viendelezi vitakavyosakinishwa kiotomatiki na mtumiaji anaweza kuondoa programu au kiendelezi chochote katika <ph name="PRODUCT_NAME" />.
 
-          Kumbukakwamba sera hii haitumiki katika hali fiche.</translation>
+          Kumbuka kwamba sera hii haitumiki katika hali fiche.</translation>
 <translation id="4008507541867797979">Sera hii ikiwekwa kuwa ndivyo au mipangilio isipowekwa, <ph name="PRODUCT_OS_NAME" /> itaonyesha watumiaji waliopo kwenye skrini ya kuingia katika akaunti na kukuruhusu uteue mmoja.
 
       Sera hii ikiwekwa kuwa sivyo, <ph name="PRODUCT_OS_NAME" /> haitaonyesha watumiaji waliopo kwenye skrini ya kuingia katika akaunti. Skrini ya kawaida ya kuingia katika akaunti (inayomdokezea mtumiaji kuweka anwani yake ya barua pepe na nenosiri au simu) au skrini ya ukurasa wenye maelezo yanayomwelekeza mtumiaji kuendelea na uthibitishaji kupitia SAML (kama imewashwa kupitia sera ya <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" />) itaonyeshwa, isipokuwa katika hali ambapo mipangilio ya Kipindi Kilichodhibitiwa imewashwa. Wakati mipangllio ya Kipindi kilichodhibitiwa imewekwa, ni akaunti za kipindi kilichodhibitiwa pekee zitakazoonyeshwa, hali inayokuruhusu kuteua moja.
@@ -1730,30 +1722,6 @@
       Sera hii inaathiri tu watumiaji ambao wanathibitisha kupitia SAML.</translation>
 <translation id="4105989332710272578">Zima utekelezaji wa Uwazi wa Cheti kwa orodha ya URL</translation>
 <translation id="4121350739760194865">Zuia utambulishaji dhidi ya kuonekana kwenye ukurasa mpya wa kichupo</translation>
-<translation id="4125606414556046117">Sera hii inakuruhusu kuweka mipangilio ya picha ya mandhari ambayo inaonyeshwa kwenye eneo-kazi na kwenye mandhari ya skrini ya kuingia katika akaunti ya mtumiaji. Sera inawekwa kwa kubainisha URL ambayo <ph name="PRODUCT_OS_NAME" /> inaweza kupakua picha ya mandhari na alama ya reli ya kriptografia iliyotumiwa kuthibitisha uaminifu wa kipakuliwa. Picha lazima iwe katika muundo wa JPEG, ukubwa wa faili yake usizidi MB 16. Ni sharti URL ifikiwe bila uthibitishaji wowote.
-
-      Picha ya mandhari inapakuliwa na kuwekwa katika akiba. Itapakuliwa upya wakati URL au alama ya reli inabadilika.
-
-      Sera sharti ibainishwe kuwa mfuatano ambao unaeleza URL na alama ya reli katika muundo wa JSON, kwa kutii utaratibu ufuatao:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "The URL from which the wallpaper image can be downloaded.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "The SHA-256 hash of the wallpaper image.",
-            "type": "string"
-          }
-        }
-      }
-
-      Sera hii ikiwekwa, <ph name="PRODUCT_OS_NAME" /> itapakua na kutumia picha ya mandhari.
-
-      Ukiweka sera hii, watumiaji hawawezi kuibadilisha au kuibatilisha.
-
-      Sera ikiachwa bila kuwekwa, mtumiaji anaweza kuchagua picha itakayoonyeshwa kwenye eneo-kazi na kwenye mandhari ya skrini ya kuingia katika akaunti.</translation>
 <translation id="412697421478384751">Ruhusu watumiaji waweke PIN ambazo si thabiti zitumike kama PIN ya skrini iliyofungwa</translation>
 <translation id="4138655880188755661">Kikomo cha Muda</translation>
 <translation id="4144164749344898721">Sera hii hudhibiti mipangilio mingi ya mikakati ya kusimamia nishati mtumiaji anapokosa kufanya kitu.
@@ -2528,7 +2496,7 @@
 <translation id="5630352020869108293">Rejesha kipindi kilichopita</translation>
 <translation id="5643906875497889108">Hudhibiti aina ya programu au viendelezi ambavyo vinaruhusiwa kusakinishwa na hupunguza ufikiaji wa programu inapotumika.
 
-          Mipangilio hii inaidhinisha aina ya viendelezi au programu zinazoruhusiwa ambazo zinaweza kusakinishwa katika <ph name="PRODUCT_NAME" /> na seva pangishi ambazo zinanaweza kuwasiliana nazo. Thamani ni orodha ya mifuatano ambayo inapaswa kuwa mojawapo ya zifuatazo: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". Angalia hati za viendelezi vya <ph name="PRODUCT_NAME" /> ili upate maelezo zaidi kuhusu aina hizi.
+          Mipangilio hii inaidhinisha aina ya viendelezi au programu zinazoruhusiwa ambazo zinaweza kusakinishwa katika <ph name="PRODUCT_NAME" /> na seva pangishi ambazo zinaweza kuwasiliana nazo. Thamani ni orodha ya mifuatano ambayo inapaswa kuwa mojawapo ya zifuatazo: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". Angalia hati za viendelezi vya <ph name="PRODUCT_NAME" /> ili upate maelezo zaidi kuhusu aina hizi.
 
           Kumbuka kwamba sera hii pia huathiri hali ya viendelezi na programu kusakinishwa kwa lazima kupitia ExtensionInstallForcelist.
 
@@ -2699,53 +2667,6 @@
 
     Iwapo sera hii haitawekwamu itawekwa kuwa uongo, amri za kuchapisha zitachochea skrini ya ukakiki ya kuchapisha.</translation>
 <translation id="6022948604095165524">Kitendo kwa kuanza</translation>
-<translation id="6023030044732320798">Hubainisha kikundi cha sera zitakazotolewa wakati ARC inatumika. Lazima thamani iwe JSON sahihi.
-
-      Sera hii inaweza kutumika kuweka mipangilio ya kubainisha programu za Android ambazo zinasakinishwa kiotomatiki kwenye kifaa:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android app identifier, e.g. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Specifies how an app is installed. OPTIONAL: The app is not installed automatically, but the user can install it. This is the default if this policy is not specified. PRELOAD: The app is installed automatically, but the user can uninstall it. FORCE_INSTALLED: The app is installed automatically and the user cannot uninstall it. BLOCKED: The app is blocked and cannot be installed. If the app was installed under a previous policy it will be uninstalled.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Policy for granting permission requests to apps. PERMISSION_POLICY_UNSPECIFIED: Policy not specified. If no policy is specified for a permission at any level, then the `PROMPT` behavior is used by default. PROMPT: Prompt the user to grant a permission. GRANT: Automatically grant a permission. DENY: Automatically deny a permission.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "App-specific JSON configuration object with a set of key-value pairs, e.g. '"managedConfiguration": { "key1": value1, "key2": value2 }'. The keys are defined in the app manifest.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Ili kubandika programu kwenye kifungua programu, angalia PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL ya papo hapo ya kitoaji chaguomsingi cha utafutaji</translation>
 <translation id="603410445099326293">Vigezo vya URL ya kupendekeza inayotumia POST</translation>
 <translation id="6034341625190551415">Hudhibiti kipindi cha umma na aina za akaunti zinazotumia skrini nzima.</translation>
@@ -2786,7 +2707,7 @@
 
       Sera hii ikiwekwa kuwa <ph name="GLS_ENABLED" />, Huduma za Mahali za Google huwashwa kwanza.
 
-      Sera hii ikiwekwa kuwa <ph name="GLS_UNDER_USER_CONTROL" />, mtumiaii huulizwa ikiwa atatumia Huduma za Mahali za Google. Hali hii itaruhusu programu za Android kutumia huduma kubaini mahali kifaa kilipo. Pia itaruhusu hali ya kuwasilisha data ya mahali uliko kwa Google bila kufichua maelezo yanayoweza kukutambulisha.
+      Sera hii ikiwekwa kuwa <ph name="GLS_UNDER_USER_CONTROL" />, mtumiaji huulizwa ikiwa atatumia Huduma za Mahali za Google. Hali hii itaruhusu programu za Android kutumia huduma kubaini mahali kifaa kilipo. Pia itaruhusu hali ya kuwasilisha data ya mahali uliko kwa Google bila kufichua maelezo yanayoweza kukutambulisha.
 
       Kumbuka kwamba sera hii hudhibiti hali ya Huduma za Mahali za Google wakati wa kuweka mipangilio ya kwanza pekee. Mtumiaji anaweza kufungua mipangilio ya Android baadaye na kuwasha au kuzima Huduma za Mahali za Google.
 
@@ -3096,37 +3017,6 @@
       Iwapo sera hii imewekwa kuwa sivyo, kiteja cha DNS kilichojumuishwa hakitawahi kutumiwa.
 
       Iwapo sera hii itaachwa bila kuwekwa, kiteja cha DNS kilichojumuishwa kitawashwa kwa chaguomsingi kwenye MacOS, Android (wakati DNS ya Faragha au VPN zimewashwa) na ChromeOS na watumiaji wataweza kubadilisha iwapo kiteja cha DNS kilichojumuishwa kitatumika kwa kuhariri chrome://flags au kubainisha alama ya mstari wa amri.</translation>
-<translation id="6838056959556423778">Hubatilisha mipangilio ya uteuzi wa printa chaguomsingi ya <ph name="PRODUCT_NAME" />.
-
-      Sera hii hubaini masharti ya kuchagua printa chaguomsingi katika <ph name="PRODUCT_NAME" />, tendo ambalo hufanyika mara ya kwanza ambapo kipengele cha printa kinatumika katika wasifu.
-
-      Sera hii ikiwekwa, <ph name="PRODUCT_NAME" /> itajaribu kutafuta printa inayolingana na sifa zote zilizobainishwa na kuichagua ili iwe printa chaguomsingi. Itachagua printa ya kwanza itakayopata ambayo italingana na sera. Iwapo kuna ulinganifu usio maalum, inaweza kuchagua printa yoyote inayolingana. Hali hii itategemea utaratibu ambao printa zinatambuliwa.
-
-      Ikiwa sera hii haijawekwa au haipati printa inayolingana katika muda uliyowekwa, itatumia printa ya PDF iliyotengenezewa ndani ya mfumo kwa chaguomsingi au haitachagua printa yoyote iwapo printa ya PDF haitapatikana.
-
-      Thamani inachanganuliwa kama kipengee cha JSON, kwa kutii utaratibu ufuatao:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Whether to limit the search of the matching printer to a specific set of printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regular expression to match printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regular expression to match printer display name.",
-            "type": "string"
-          }
-        }
-      }
-
-      Printa zilizounganishwa kwenye <ph name="CLOUD_PRINT_NAME" /> zinachukuliwa kuwa <ph name="PRINTER_TYPE_CLOUD" />, na printa nyinginezo zinaainishwa kama <ph name="PRINTER_TYPE_LOCAL" />.
-      Hatua ya kuacha sehemu inamaanisha kuwa thamani zote zinalingana, kwa mfano, kutobainisha uunganishaji kutasababisha Onyesho la Kuchungulia Printa lianzishe utambuzi wa aina zote za printa za mfumo na za wingu.
-      Ni lazima miundo ya maonyesho ya kawaida ifuate sintaksia ya JavaScript RegExp na viwango vinavyolingana huathiriwa na ukubwa au udogo wa fonti.</translation>
 <translation id="6843296367238757293">Sera hii imeacha kuendesha huduma. Unakatazwa kuitumia. Soma zaidi katika https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Sera hii iliondolewa katika <ph name="PRODUCT_NAME" /> 68, nafasi yake imechukuliwa na <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Sera hii iliacha kuendesha huduma na imeondolewa katika M66, kwa sababu ilitumika kwa jaribio la ndani pekee na ina athari za usalama.
@@ -3297,11 +3187,11 @@
 
           Mfumo unapotumika, mlango wa USB utatoa nishati kila wakati.
 
-          Mfumo ukiwa katika hali tuli, ikiwa sera hii imewekwa kuwa 'ndivyo', basi nishati itatolewa kwenye mlango wa USB wakati kifaa kitachomekwa katika chaja iliyo ukatani au ikiwa kiwango cha betri ni &gt; 50%. Vingenevyo, hakuna nishati itakayotolewa.
+          Mfumo ukiwa katika hali tuli, ikiwa sera hii imewekwa kuwa 'ndivyo', basi nishati itatolewa kwenye mlango wa USB wakati kifaa kitachomekwa katika chaja iliyo ukatani au ikiwa kiwango cha betri ni &gt; 50%. Vinginevyo, hakuna nishati itakayotolewa.
 
-          Mfumo ukiwa umezimwa, ikiwa sera hii imewekwa kuwa 'ndivyo', basi nishati itatolewa kwenye mlango wa USB wakati kifaa kimechomekwa katika chaja iliyo ukutani. Vingenevyo, hakuna nishati itakayotolewa.
+          Mfumo ukiwa umezimwa, ikiwa sera hii imewekwa kuwa 'ndivyo', basi nishati itatolewa kwenye mlango wa USB wakati kifaa kimechomekwa katika chaja iliyo ukutani. Vinginevyo, hakuna nishati itakayotolewa.
 
-          Sera hii ikiachwa bila kuweka, sera inawashwa na haiwezi kuzima na mtumiaji.</translation>
+          Sera hii ikiachwa bila kuweka, sera inawashwa na haiwezi kuzimwa na mtumiaji.</translation>
 <translation id="7115494316187648452">Huamua ikiwa machakato wa <ph name="PRODUCT_NAME" /> utaanza wakati wa kuingia katika Mfumo wa Uendeshaji na kuendelea kutekeleza dirisha la mwisho la kivinjari linapofungwa, hivyo kuruhusu programu za chini chini na kipindi cha kuvinjari cha sasa kuendelea, ikiwa ni pamoja na vidakuzi vya kipindi. Mchakato wa chini chini huonyesha aikoni katika treya ya mfumo na unaweza kufungwa kutoka huko wakati wowote.
 
      Sera hii ikiwekwa kuwa Ndivyo, kipengee cha hali ya chinichini huwashwa na hakiwezi kudhibitiwa na mtumiaji katika mipangilio ya kivinjari.
@@ -3658,7 +3548,7 @@
 
           Kumbuka: Ni lazima <ph name="CHARGE_START_TIME_FIELD_NAME" /> isipite <ph name="CHARGE_END_TIME_FIELD_NAME" />.
 
-          Kumbuka: thamani zinazoruhiswa za sehemu ya <ph name="MINUTE_FIELD_NAME" /> ya <ph name="CHARGE_START_TIME_FIELD_NAME" /> na<ph name="CHARGE_END_TIME_FIELD_NAME" /> ni 0, 15, 30, 45.</translation>
+          Kumbuka: thamani zinazoruhusiwa za sehemu ya <ph name="MINUTE_FIELD_NAME" /> ya <ph name="CHARGE_START_TIME_FIELD_NAME" /> na<ph name="CHARGE_END_TIME_FIELD_NAME" /> ni 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">Sanidi vipengele vya ufikiaji vya <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7724994675283793633">Sera hii huwasha HTTP/0.9 kwenye milango mbali na 80 ya HTTP na 443 ya HTTPS.
 
@@ -4264,30 +4154,6 @@
       Sera hii huathiri watumiaji waliothibitisha kwa kutumia SAML pekee.
 
       Thamani ya sera lazima ibainishwe katika sekunde.</translation>
-<translation id="9027787254195333560">Sera hii inakuruhusu kuweka mipangilio ya picha ya ishara inayowakilisha mtumiaji kwenye skrini ya kuingia katika akaunti. Sera inawekwa kwa kubainisha URL ambayo <ph name="PRODUCT_OS_NAME" /> inaweza kupakua picha ya ishara na alama ya reli ya kriptografia inayotumika kuthibitisha kuaminika kwa kipakuliwa. Picha sharti iwe katika muundo wa JPEG, ukubwa wake usizidi kB 512. Ni sharti URL ifikiwe bila uthibitishaji wowote.
-
-      Picha ya ishara inapakuliwa na kuwekwa katika akiba. Itapakuliwa upya wakati URL au alama ya reli inabadilika.
-
-      Sera sharti ibainishwe kuwa mfuatano ambao unaeleza URL na alama ya reli katika muundo wa JSON, kwa kutii utaratibu ufuatao:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "The URL from which the avatar image can be downloaded.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "The SHA-256 hash of the avatar image.",
-            "type": "string"
-          }
-        }
-      }
-
-      Sera hii ikiwekwa, <ph name="PRODUCT_OS_NAME" /> itapakua na kutumia picha ya ishara.
-
-      Ukiweka sera hii, watumiaji hawawezi kuibadilisha au kuibatilisha.
-
-      Iwapo sera haijawekwa, watumiaji wataweza kuchagua picha ya ishara inayowawakilisha kwenye skrini ya kuingia katika akaunti.</translation>
 <translation id="9035964157729712237">Vitambulisho vya viendelezi vya kuondolewa kenye orodha isiyokubalika</translation>
 <translation id="9038058011835642205">Hubainisha orodha ya tovuti zinazosakinishwa chinichini bila kumhusisha mtumiaji na ambazo haziwezi kuondolewa wala kuzimwa na mtumiaji.
 
@@ -4300,7 +4166,6 @@
       Ukiweka sera hii, watumiaji hawawezi kuibadilisha au kuibatilisha.
 
       Thamani ya sera sharti ibainishwe katika milisekunde. Thamani huwekwa pamoja katika masafa ya sekunde 30 hadi saa 24.</translation>
-<translation id="9042911395677044526">Inaruhusu kusukuma kwa usanidi wa mtandao kutekelezwa kwa kila mtumiaji katika kifaa cha <ph name="PRODUCT_OS_NAME" />. Usanidi wa mtandao ni mtungo ulioumbizwa wa JSON kama ilivyofasiliwa kwa umbizo la Fungua Usanidi wa Mtandao ilivyofafanuliwa katika <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Sera hii hudhibiti ikiwa kifaa kinahitaji au hakihitaji kusasishwa kwenye Muundo wa Urekebishaji wa Haraka.
 
       Thamani ikiwekwa kuwa tokeni inayoambatishwa kwenye Muundo wa Urekebishaji wa Haraka, kifaa kitasasishwa kwenye Muundo wa Urekebishaji wa Haraka unaohusika, ikiwa sasisho halijazuiwa na sera nyingine.
@@ -4381,17 +4246,6 @@
       Ikiwa mipangilio ya sera imwekwa kuwa ya sivyo, 'Vichwa na vijachini' havitachaguliwa kwenye kidirisha cha onyesho la kukagua uchapishaji, na mtumiaji hawezi kuibadilisha.
 
       Ikiwa mipangilio ya sera imewekwa kuwa ya ndivyo, 'Vichwa na vijachini' vitachaguliwa kwenye kidirisha cha onyesho la kukagua uchapishaji, na mtumiaji hawezi kuibadilisha.</translation>
-<translation id="9213347477683611358">Weka mipangilio ya picha ya mandhari ya kiwango cha kifaa ambayo inaonyeshwa kwenye skrini ya kuingia katika akaunti ikiwa hakuna mtumiaji aliyeingia katika kifaa. Sera inawekwa kwa kubainisha URL ambayo kifaa cha Mfumo wa Uendeshaji wa Chrome kinaweza kupakua picha ya mandhari na hash ya kriptografia inayotumiwa kuthibitisha kwamba kipakuliwa hakina virusi. Lazima picha iwe ya aina ya faili ya JPEG, ukubwa wake usizidi MB 16. Lazima URL ifikiwe bila uthibitishaji wowote. Picha ya mandhari hupakuliwa na kuakibishwa. Itapakuliwa tena wakati URL au hash inabadilika.
-
-      Sera inapaswa kubainishwa kama mfuatano unaoeleza URL na hash katika aina ya faili ya JSON, kwa mfano,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Ikiwa sera ya mandhari ya kifaa itawekwa, kifaa cha Mfumo wa Uendeshaji wa Chrome kitapakua na kutumia picha ya mandhari kwenye skrini ya kuingia katika akaunti ikiwa hakuna mtumiaji ambaye ameingia katika kifaa. Pindi tu mtumiaji anapoingia katika akaunti, sera ya mandhari ya mtumiaji itaanza kutumika.
-
-      Ikiwa sera ya mandhari ya kifaa itaachwa bila kuwekwa, ni sera ya mandhari ya mtumiaji itakayoamua kitu cha kuonyesha ikiwa sera ya mandhari ya mtumiaji itawekwa.</translation>
 <translation id="9217154963008402249">Idadi ya kufuatilia vifurushi vya mtandao</translation>
 <translation id="922540222991413931">Sanidi viendelezi, programu, na vyanzo vya kusakinisha hati</translation>
 <translation id="924557436754151212">Leta manenosiri yaliyohifadhiwa kutoka kwenye kivinjari chaguomsingi kwenye uendeshaji wa kwanza</translation>
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index dfdf00c..50b3755 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -205,7 +205,7 @@
       இந்தக் கொள்கை இயக்கப்பட்டிருந்தால், திரையில் உள்ளதை அணுக Google அசிஸ்டண்ட் அனுமதிக்கப்படும்.
       இந்தக் கொள்கை முடக்கப்பட்டிருந்தால், திரையில் உள்ளதை அணுக Google அசிஸ்டண்ட் அனுமதிக்கப்படாது.
       இது அமைக்கப்படவில்லை என்றால், திரையில் உள்ளதை அணுக Google அசிஸ்டண்ட்டை அனுமதிப்பதா என்பதைப் பயனர் தீர்மானிக்கலாம்.</translation>
-<translation id="1376119291123231789">மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறையை இயக்கும்</translation>
+<translation id="1376119291123231789">'மேம்பட்ட பேட்டரி சார்ஜ்' பயன்முறையை இயக்கும்</translation>
 <translation id="1383493480903114193">இந்தக் கொள்கையானது உலாவிச் செயலாக்கத்தில் இயங்க நெட்வொர்க்கிங் குறியீட்டை வலியுறுத்தும்.
 
       இந்தக் கொள்கையானது இயல்பாகவே முடக்கப்பட்டு இருக்கும். இது இயக்கத்தில் இருந்தால், நெட்வொர்க்கிங் செயலாக்கம் சாண்ட்பாக்ஸ் செய்யப்பட்டதும், பயனர்களுக்குப் பாதுகாப்புச் சிக்கல்களை ஏற்படுத்த வழிவகுக்கும்.
@@ -338,7 +338,7 @@
       இந்தக் கொள்கை ‘தவறு’ என அமைக்கப்பட்டால், நீட்டிப்புகள் மற்றும் செருகு நிரல்கள் குறித்த தரவு சேகரிக்கப்படாது.
 
       <ph name="CHROME_REPORTING_EXTENSION_NAME" /> இயக்கப்பட்டிருக்கும்போதும் <ph name="MACHINE_LEVEL_USER_CLOUD_POLICY_ENROLLMENT_TOKEN_POLICY_NAME" /> இல் சாதனம் பதிவுசெய்யப்பட்டிருந்தாலும் மட்டுமே இந்தக் கொள்கை செல்லுபடியாகும்.</translation>
-<translation id="1560205870554624777">Kerberos செயல்பாடு இயக்கப்பட்டுள்ளதா என்பதை நிர்வகிக்கும். Kerberos என்பது இணைய ஆப்ஸையும் கோப்புப் பகிர்வையும் அங்கீகரிக்கப் பயன்படுத்தப்படும் அடையாள நெறிமுறையாகும்.
+<translation id="1560205870554624777">Kerberos செயல்பாடு இயக்கப்பட்டுள்ளதா என்பதை நிர்வகிக்கும். Kerberos என்பது இணைய ஆப்ஸையும் கோப்புப் பகிர்வையும் அங்கீகரிக்கப் பயன்படுத்தக்கூடிய அடையாள நெறிமுறையாகும்.
 
           இந்தக் கொள்கை இயக்கப்பட்டிருந்தால் Kerberos செயல்பாடு இயங்கும். 'Kerberos கணக்குகளை உள்ளமைத்தல்' கொள்கையின் மூலமோ 'பயனர் அமைப்புகள்’ பக்கத்திலுள்ள 'Kerberos கணக்கு அமைப்புகளுக்கு' சென்றோ கணக்குகளைச் சேர்க்கலாம்.
 
@@ -385,7 +385,6 @@
 
       எச்சரிக்கை: <ph name="PRODUCT_OS_NAME" /> பதிப்பின் கட்டுப்பாட்டை கியோஸ்க் ஆப்ஸுக்கு வழங்க வேண்டாம் எனப் பரிந்துரைக்கிறோம். இது மென்பொருள் புதுப்பிப்புகளையும் முக்கியமான பாதுகாப்புத் திருத்தங்களையும் பெறுவதிலிருந்து சாதனத்தைத் தடுக்கக்கூடும். <ph name="PRODUCT_OS_NAME" /> பதிப்பின் கட்டுப்பாட்டை வேறு ஆப்ஸிற்கு வழங்கினால், பயனர்களுக்கு சிக்கல்கள் ஏற்படலாம்.</translation>
 <translation id="1675002386741412210">இவற்றில் ஆதரிக்கப்படுகிறது:</translation>
-<translation id="1689963000958717134"><ph name="PRODUCT_OS_NAME" /> சாதனத்தைப் பயன்படுத்தும் அனைவருக்கும் நெட்வொர்க் உள்ளமைவைக் கொடுக்க அனுமதிக்கிறது. இந்த நெட்வொர்க் உள்ளமைவு <ph name="ONC_SPEC_URL" /> இல் விளக்கப்பட்டுள்ளபடி திறந்த நெட்வொர்க் உள்ளமைவு வடிவத்தால் வரையறுக்கப்பட்ட JSON-வடிவமைப்புத் தொடராகும்</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> நிலைபொருள் புதுப்பிப்புச் செயல்பாட்டின் இருப்புநிலையையும் செயல்படும் விதத்தையும் உள்ளமைக்கும்.
 
       தனிப்பட்ட அமைப்புகளை JSON பண்புகளில் குறிப்பிடலாம்:
@@ -735,15 +734,15 @@
 <translation id="2303795211377219696">கிரெடிட் கார்டுகளுக்குத் தன்னிரப்பியை இயக்கு</translation>
 <translation id="2309390639296060546">இயல்புநிலை புவிஇருப்பிட அமைப்பு</translation>
 <translation id="2327252517317514801">G Suiteடை அணுகுவதற்கு அனுமதிக்கப்படும் டொமைன்களைக் குறிப்பிடவும்</translation>
-<translation id="2356878440219553005">பேட்டரி சார்ஜ் பயன்முறை மின்சக்தி உபயோகக் கொள்கையைக் குறிப்பிடும்.
+<translation id="2356878440219553005">'பேட்டரி சார்ஜ்' பயன்முறை மின்சக்தி உபயோகக் கொள்கையைக் குறிப்பிடும்.
 
           பேட்டரி அழுத்தத்தின் காரணமாக சார்ஜ் காலியாவதைக் குறைக்கவும் பேட்டரி ஆயுளை நீட்டிக்கவும் அதன் சார்ஜிங்கை தொடர்ந்து மாறும்படி கட்டுப்படுத்தும்.
 
-          பிரத்தியேகமான பேட்டரி சார்ஜ் பயன்முறை தேர்ந்தெடுக்கப்பட்டால் DeviceBatteryChargeCustomStartCharging, DeviceBatteryChargeCustomStopCharging ஆகியவை குறிப்பிடப்பட வேண்டும்.
+          பிரத்தியேகமான 'பேட்டரி சார்ஜ்' பயன்முறை தேர்ந்தெடுக்கப்பட்டால் DeviceBatteryChargeCustomStartCharging, DeviceBatteryChargeCustomStopCharging ஆகியவை குறிப்பிடப்பட வேண்டும்.
 
-          இந்தக் கொள்கை அமைக்கப்பட்டால் பேட்டரி சார்ஜ் பயன்முறை சாதனத்தில் ஆதரிக்கப்பட்டால் பயன்படுத்தப்படும்.
+          இந்தக் கொள்கை அமைக்கப்பட்டால் 'பேட்டரி சார்ஜ்' பயன்முறை சாதனத்தில் ஆதரிக்கப்பட்டால் பயன்படுத்தப்படும்.
 
-          இந்தக் கொள்கை அமைக்கப்படாமல், சாதனத்தில் ஆதரிக்கப்பட்டால் வழக்கமான பேட்டரி சார்ஜ் பயன்முறை பயன்படுத்தப்படும், இதைப் பயனரால் மாற்ற முடியாது.
+          இந்தக் கொள்கை அமைக்கப்படாமல், சாதனத்தில் ஆதரிக்கப்பட்டால் 'வழக்கமான பேட்டரி சார்ஜ்' பயன்முறை பயன்படுத்தப்படும், இதைப் பயனரால் மாற்ற முடியாது.
 
           கவனத்திற்கு: முதலில் கூறியது குறிப்பிடப்பட்டால் <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> இந்தக் கொள்கையை மீறும்.</translation>
 <translation id="237494535617297575">அறிவிப்புகளைக் காண்பிக்க அனுமதிக்கும் தளங்களைக் குறிக்கும் url வகைகளின் பட்டியலை அமைக்க, உங்களை அனுமதிக்கிறது.ஒட்டுமொத்தமாக அமைக்காமல் இந்தக் கொள்கை விடப்பட்டிருந்தால் இயல்புநிலை மதிப்பானது, அமைக்கப்பட்டிருந்தால் 'DefaultNotificationsSetting' கொள்கை அல்லது பயனரின் தனிப்பட்ட உள்ளமைவிலிருந்து அனைத்து தளங்களுக்கும் பயன்படுத்தப்படும்.</translation>
@@ -923,16 +922,6 @@
       இந்த அமைப்பு முடக்கப்பட்டிருந்தால், இணையப் பக்கங்கள் JavaScript ஐப் பயன்படுத்த முடியாது. மேலும் பயனர் இந்த அமைப்பை மாற்ற முடியாது.
 
       இந்த அமைப்பு இயக்கப்பட்டிருந்தால் அல்லது அமைக்கப்படவில்லை எனில், இணையப் பக்கங்கள் JavaScript ஐப் பயன்படுத்த முடியும். ஆனால் பயனர் இந்த அமைப்பை மாற்ற முடியும்.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" />க்கான நீட்டிப்பு நிர்வாக அமைப்புகளை உள்ளமைக்கும்.
-
-          ஏற்கனவே இருக்கும் நீட்டிப்பு தொடர்பான கொள்கைகளால் நிர்வகிக்கப்படும் அமைப்புகள் உள்ளிட்ட நிறைய அமைப்புகளை இந்தக் கொள்கையானது கட்டுப்படுத்தும். இரண்டுமே அமைக்கப்பட்டால் லெகஸி கொள்கைகள் ஏதேனும் இருந்தால் அவற்றை மாற்றிவிடும்.
-
-          இதன் உள்ளமைவுடன் ஒரு நீட்டிப்பு ஐடியையோ புதுப்பிப்பு URLலையோ இணைக்கும். நீட்டிப்பு ஐடியின் மூலம் குறிப்பிட்டவற்றுக்கு மட்டுமே உள்ளமைவு பயன்படுத்தப்படும். இந்தக் கொள்கையில் பிரத்தியேக உள்ளமைவு தொகுப்பைக் கொண்டிருக்காத அனைத்து நீட்டிப்புகளுக்கும் பயன்படுமாறு <ph name="DEFAULT_SCOPE" /> எனும் சிறப்பு ஐடிக்கு இயல்பு உள்ளமைவை அமைக்கலாம். <ph name="LINK_TO_EXTENSION_DOC1" /> என்ற இணைப்பில் விவரிக்கப்பட்டுள்ளது போலப் புதுப்பிப்பு URLலை இணைப்பதன் மூலம் இந்த நீட்டிப்பின் மெனிஃபெஸ்ட்டில் உள்ள அதே புதுப்பிப்பு URLலைக் கொண்டுள்ள அனைத்து நீட்டிப்புகளுக்கும் உள்ளமைவு பயன்படுத்தப்படும்.
-
-          <ph name="MS_AD_NAME" /> டொமைனில் சேராத Windows நேர்வுகளுக்கு Chrome இணைய அங்காடியில் பட்டியலிடப்பட்டிருக்கும் ஆப்ஸிற்கும் நீட்டிப்புகளுக்கும் மட்டுமே கட்டாய நிறுவல் மேற்கொள்ளப்படும்.
-
-          இந்தக் கொள்கையின் சாத்தியமான அமைப்புகள் மற்றும் கட்டமைப்பிற்கு முழு விளக்கம் காண https://www.chromium.org/administrators/policy-list-3/extension-settings-full என்ற இணைப்பைப் பார்வையிடவும்
-          </translation>
 <translation id="2753637905605932878">WebRTC பயன்படுத்தும் அக UDP போர்ட்களின் வரம்பைக் கட்டுப்படுத்து</translation>
 <translation id="2757054304033424106">நிறுவப்பட அனுமதிக்கப்படும் நீட்டிப்புகள்/பயன்பாடுகளின் வகைகள்</translation>
 <translation id="2758084448533744848">சாதனத்திற்குப் பயன்படுத்த வேண்டிய அமலாக்கப்பட்ட நேர மண்டலத்தைக் குறிப்பிடுகிறது. இந்தக் கொள்கை அமைக்கப்பட்டால், குறிப்பிடப்பட்டுள்ள நேர மண்டலத்தைச் சாதனத்தின் பயனர்களால் மீற முடியாது. செல்லுபடியாகாத மதிப்பு வழங்கப்பட்டிருந்தால், அந்த மதிப்புக்குப் பதிலாக "GMT" என்பதைப் பயன்படுத்தி கொள்கை செயல்படுத்தப்படும். வெறுமையான வார்த்தை உள்ளிடப்பட்டிருந்தால் கொள்கை புறக்கணிக்கப்படும்.
@@ -1026,7 +1015,7 @@
       இந்த அமைப்பை முடக்கினால் அல்லது மதிப்பை அமைக்காமல் இருந்தால், அச்சு மாதிரிக்காட்சியானது இயல்பான இலக்கிடத் தேர்வாக, மிகச் சமீபத்தில் பயன்படுத்திய பிரிண்டரைப் பயன்படுத்தும்.
 
       இந்த அமைப்பை இயக்கினால், அச்சு மாதிரிக்காட்சியானது இயல்பு இலக்கிடத் தேர்வாக, OS அமைப்பின் இயல்புப் பிரிண்டரைப் பயன்படுத்தும்.</translation>
-<translation id="285627849510728211">மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறை நாள் உள்ளமைவை அமைக்கும்</translation>
+<translation id="285627849510728211">'மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறை நாள்' உள்ளமைவை அமைக்கும்</translation>
 <translation id="2856674246949497058">OS பதிப்பானது இலக்குப் பதிப்பை விடப் புதியதாக இருந்தால், இலக்குப் பதிப்புக்கு மீட்டமைத்து, அதைப் பயன்படுத்தவும். செயலாக்கத்தின்போது, பவர்வாஷ் செய்யவும்.</translation>
 <translation id="2872961005593481000">நிறுத்து</translation>
 <translation id="2873651257716068683">இயல்புநிலையில் அச்சிடும் பக்க அளவுகளை மேலெழுதும். பக்க அளவு இல்லாவிட்டால், இந்தக் கொள்கை புறக்கணிக்கப்படும்.</translation>
@@ -1466,15 +1455,15 @@
 <translation id="382476126209906314">தொலைநிலை அணுகல் ஹோஸ்ட்களுக்கான TalkGadget முன்னொட்டை உள்ளமை</translation>
 <translation id="3824972131618513497">மின்சக்தி நிர்வாகம் மற்றும் சாதன மறுதொடக்கம் தொடர்பான அமைப்புகளைக் கட்டுப்படுத்தும்.</translation>
 <translation id="3826475866868158882">Google இருப்பிடச் சேவைகள் இயக்கப்பட்டது</translation>
-<translation id="3831054243924627613">இந்தக் கொள்கை Android காப்புப் பிரதி மற்றும் மீட்டெடுப்பின் துவக்க நிலையைக் கட்டுப்படுத்தும்.
+<translation id="3831054243924627613">இந்தக் கொள்கை Android காப்புப் பிரதி மற்றும் மீட்டமைப்பின் துவக்க நிலையைக் கட்டுப்படுத்தும்.
 
-      இந்தக் கொள்கை உள்ளமைக்கப்படாதபோதோ <ph name="BR_DISABLED" /> என அமைக்கப்படும்போதோ துவக்கத்திலேயே Android காப்புப் பிரதி மற்றும் மீட்டெடுப்பு முடக்கப்படும்.
+      இந்தக் கொள்கை உள்ளமைக்கப்படாதபோதோ <ph name="BR_DISABLED" /> என அமைக்கப்படும்போதோ துவக்கத்திலேயே Android காப்புப் பிரதி மற்றும் மீட்டமைப்பு முடக்கப்படும்.
 
-      இந்தக் கொள்கை <ph name="BR_ENABLED" /> என அமைக்கப்படும் போது துவக்கத்திலேயே Android காப்புப் பிரதி மற்றும் மீட்டெடுப்பு இயக்கப்படும்.
+      இந்தக் கொள்கை <ph name="BR_ENABLED" /> என அமைக்கப்படும் போது துவக்கத்திலேயே Android காப்புப் பிரதி மற்றும் மீட்டமைப்பு இயக்கப்படும்.
 
-      இந்தக் கொள்கை <ph name="BR_UNDER_USER_CONTROL" /> என அமைக்கப்படும் போது Android காப்புப் பிரதி மற்றும் மீட்டெடுப்பைப் பயன்படுத்த வேண்டுமா என பயனரிடம் கேட்கப்படும். பயனர் காப்புப் பிரதி மற்றும் மீட்டெடுப்பை இயக்கினால் Android ஆப்ஸ் தரவு Android காப்புப் பிரதிச் சேவையகங்களில் பதிவேற்றப்பட்டு, இணக்கமான ஆப்ஸை மீண்டும் நிறுவும் போது அவற்றிலிருந்து மீட்டெடுக்கப்படும்.
+      இந்தக் கொள்கை <ph name="BR_UNDER_USER_CONTROL" /> என அமைக்கப்படும் போது Android காப்புப் பிரதி மற்றும் மீட்டமைப்பைப் பயன்படுத்த வேண்டுமா என பயனரிடம் கேட்கப்படும். பயனர் காப்புப் பிரதி மற்றும் மீட்டமைப்பை இயக்கினால் Android ஆப்ஸ் தரவு Android காப்புப் பிரதிச் சேவையகங்களில் பதிவேற்றப்பட்டு, இணக்கமான ஆப்ஸை மீண்டும் நிறுவும் போது அவற்றிலிருந்து மீட்டமைக்கப்படும்.
 
-      இந்தக் கொள்கை துவக்க அமைவின்போது மட்டுமே காப்புப் பிரதி மற்றும் மீட்டெடுப்பின் நிலையைக் கட்டுப்படுத்தும் என்பதை நினைவில் கொள்ளவும். அதன்பிறகு பயனர் Android அமைப்புகளைத் திறந்து Android காப்புப் பிரதி மற்றும் மீட்டெடுப்பை இயக்கலாம்/முடக்கலாம்.</translation>
+      இந்தக் கொள்கை துவக்க அமைவின்போது மட்டுமே காப்புப் பிரதி மற்றும் மீட்டமைப்பின் நிலையைக் கட்டுப்படுத்தும் என்பதை நினைவில் கொள்ளவும். அதன்பிறகு பயனர் Android அமைப்புகளைத் திறந்து Android காப்புப் பிரதி மற்றும் மீட்டமைப்பை இயக்கலாம்/முடக்கலாம்.</translation>
 <translation id="3831376478177535007">இந்த அமைப்பு இயக்கப்பட்டிருக்கும் போது, Symantec Corporation இன் Legacy PKI செயல்பாடுகள் வழங்கிய சான்றிதழ்கள் வெற்றிகரமாகச் சரிபார்க்கப்பட்டு அங்கீகரிக்கப்பட்ட CA சான்றிதழுடன் இணைக்கப்பட்டிருந்தால் மட்டுமே, அவை நம்பத்தகுந்தவை என <ph name="PRODUCT_NAME" /> அனுமதிக்கும்.
 
       இந்தக் கொள்கையானது, Symantec இன் legacy infrastructure வழங்கும் சான்றிதழ்களை இப்போதும் அங்கீகரிக்கும் ஆப்ரேட்டிங் சிஸ்டத்தைச் சார்ந்துள்ளது என்பதைக் கவனத்தில் கொள்ளவும். OS புதுப்பிப்பு காரணமாக, இத்தகைய சான்றிதழ்களை OS கையாளும் விதத்தில் மாற்றம் ஏற்பட்டால், இந்தக் கொள்கை விளைவை ஏற்படுத்தாது.  மேலும், legacy Symantec சான்றிதழ்களிடமிருந்து விலகுவதற்காக நிறுவனங்களுக்கு அதிக கால அவகாசத்தை அளிப்பதற்கான தற்காலிகத் தீர்வாகவும் இந்தக் கொள்கை பயன்படுத்தப்படுகிறது. இந்தக் கொள்கையானது ஜனவரி 1, 2019 அன்று அல்லது அதற்கு முன் பின் தேதிகளில் அகற்றப்படும்.
@@ -1654,30 +1643,6 @@
       SAMLலைப் பயன்படுத்தி அங்கீகரிக்கும் பயனர்களுக்கு மட்டுமே இந்தக் கொள்கை பொருந்தும்.</translation>
 <translation id="4105989332710272578">URLகளின் பட்டியலுக்குச் சான்றிதழ் வெளிப்படைத்தன்மை செயலாக்கத்தை முடக்கு</translation>
 <translation id="4121350739760194865">புதிய தாவல் பக்கத்தில் தோன்றுவதிலிருந்து பயன்பாட்டு விளம்பரங்களைத் தடு</translation>
-<translation id="4125606414556046117">This policy allows you to configure the wallpaper image that is shown on the desktop and on the login screen background for the user. The policy is set by specifying the URL from which <ph name="PRODUCT_OS_NAME" /> can download the wallpaper image and a cryptographic hash used to verify the integrity of the download. The image must be in JPEG format, its file size must not exceed 16MB. The URL must be accessible without any authentication.
-
-      The wallpaper image is downloaded and cached. It will be re-downloaded whenever the URL or the hash changes.
-
-      The policy should be specified as a string that expresses the URL and hash in JSON format, conforming to the following schema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "The URL from which the wallpaper image can be downloaded.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "The SHA-256 hash of the wallpaper image.",
-            "type": "string"
-          }
-        }
-      }
-
-      If this policy is set, <ph name="PRODUCT_OS_NAME" /> will download and use the wallpaper image.
-
-      If you set this policy, users cannot change or override it.
-
-      If the policy is left not set, the user can choose an image to be shown on the desktop and on the login screen background.</translation>
 <translation id="412697421478384751">பூட்டுத் திரை PINக்கு வலிமை குறைந்த PINகளை அமைப்பதற்கு, பயனர்களை அனுமதிக்கும்</translation>
 <translation id="4138655880188755661">நேர வரம்பு</translation>
 <translation id="4144164749344898721">இந்தக் கொள்கை பயனர் செயலற்ற நிலையில் இருக்கும் போது மின்சக்தி உபயோக நிர்வாகத்திற்காகப் பல்வேறு அமைப்புகளைக் கட்டுப்படுத்தும்.
@@ -2196,7 +2161,7 @@
       கொள்கையானது 'லெகஸி' என்பதற்கு அமைக்கப்பட்டால், RC4 என்க்ரிப்ஷன் வகை மட்டுமே அனுமதிக்கப்படும். இந்த விருப்பம் பாதுகாப்பற்றது என்பதோடு, மிகவும் குறிப்பிட்ட சூழ்நிலைகளில் மட்டுமே தேவைப்படும்.
 
       https://wiki.samba.org/index.php/Samba_4.6_Features_added/changed#Kerberos_client_encryption_types என்ற இணைப்பையும் பார்க்கவும்.</translation>
-<translation id="5249453807420671499">Kerberos கணக்குகளைப் பயனர்கள் சேர்க்கலாம்</translation>
+<translation id="5249453807420671499">Kerberos கணக்குகளைப் பயனர்கள் சேர்க்க முடியும்</translation>
 <translation id="5255162913209987122">பரிந்துரைக்கப்படும்</translation>
 <translation id="527237119693897329">எந்த நேட்டிவ் செய்தியிடல் ஹோஸ்ட்களை, ஏற்றக்கூடாது என்பதைக் குறிப்பிடுவதற்கு உங்களை அனுமதிக்கிறது.
 
@@ -2436,7 +2401,7 @@
 
           இந்த அமைப்பு உள்ளமைக்கப்படவில்லை எனில் ஏற்றுக்கொள்ளக்கூடிய நீட்டிப்புகள்/ஆப்ஸ் வகைகளில் எந்தக் கட்டுப்பாடுகளும் விதிக்கப்படாது.
 
-          காற்புள்ளியால் பிரிக்கப்பட்ட பல நீட்டிப்பு ஐடிகளைப் பயன்படுத்தும் 75வது பதிப்பிற்கு முந்தைய நீட்டிப்புகள்/ஆப்ஸ் ஆதரிக்கப்படாமல், தவிர்க்கப்படும். மீதமுள்ள கொள்கை தொடர்ந்து பயன்படுத்தப்படும்.</translation>
+          காற்புள்ளியால் பிரிக்கப்பட்ட பல நீட்டிப்பு ஐடிகளைப் பயன்படுத்தும் 75வது பதிப்பிற்கு முந்தைய நீட்டிப்புகள்/ஆப்ஸ் ஆதரிக்கப்படாமல் தவிர்க்கப்படும். மீதமுள்ள கொள்கை தொடர்ந்து பயன்படுத்தப்படும்.</translation>
 <translation id="5645779841392247734">இந்த தளங்களில் குக்கீகளை அனுமதி</translation>
 <translation id="5689430183304951538">இயல்புநிலையில் அச்சிடும் பக்க அளவு</translation>
 <translation id="5693469654327063861">தரவு நகர்த்துதலை அனுமதி</translation>
@@ -2594,54 +2559,6 @@
 
       இந்தக் கொள்கை அமைக்கப்படவில்லை எனில் அல்லது தவறானது என்பதாக அமைக்கப்பட்டால் அச்சு மாதிரிக் காட்சித் திரையை அச்சு கட்டளைகள் செயலாக்கும்.</translation>
 <translation id="6022948604095165524">தொடக்கத்தின்போதான செயல்</translation>
-<translation id="6023030044732320798">ARC இயங்கும் நேரத்திடம் ஒப்படைக்கப்படும் கொள்கைகளைக் குறிப்பிடும். மதிப்பானது சரியான JSON ஆக இருக்க வேண்டும்.
-
-      எந்ததெந்த Android ஆப்ஸ் சாதனத்தில் தானாக நிறுவப்பட வேண்டும் என்பதை உள்ளமைக்க, இந்தக் கொள்கையைப் பயன்படுத்தலாம்:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android ஆப்ஸ் அடையாளங்காட்டி, எ.கா. Gmailலுக்கு "com.google.android.gm",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "ஆப்ஸ் எவ்வாறு நிறுவப்படுகிறது என்பதைக் குறிப்பிடுகிறது. OPTIONAL: ஆப்ஸ் தானாக நிறுவப்படாது, பயனர் அதனை நிறுவலாம். இந்தக் கொள்கை குறிப்பிடப்படவில்லை எனில், இதுதான் இயல்பாகப் பயன்படுத்தப்படும். PRELOAD: ஆப்ஸ் தானாக நிறுவப்படும். ஆனால், பயனர் அதை நிறுவல் நீக்கலாம். FORCE_INSTALLED: ஆப்ஸ் தானாக நிறுவப்படும், பயனரால் அதை நிறுவல் நீக்க முடியாது. BLOCKED: ஆப்ஸ் முடக்கப்பட்டிருக்கும், அதை நிறுவ முடியாது. முந்தைய கொள்கையின் கீழ் ஆப்ஸ் நிறுவப்பட்டிருந்தால், அது நிறுவல் நீக்கப்படும்.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "ஆப்ஸுக்கு அனுமதிக் கோரிக்கைகளை வழங்குவதற்கான கொள்கை.
-PERMISSION_POLICY_UNSPECIFIED: கொள்கை குறிப்பிடப்படவில்லை. எந்த நிலையிலும் அனுமதிக்காக கொள்கை எதுவும் குறிப்பிடப்படவில்லை எனில், `PROMPT` செயல்பாடு இயல்பாகப் பயன்படுத்தப்படும். PROMPT: அனுமதியை வழங்கும்படி பயனரை அறிவுறுத்தும். GRANT: தானாக அனுமதியை வழங்கும். DENY: தானாக அனுமதியை மறுக்கும்.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "விசை மதிப்பு இணைகளைக் கொண்ட குறிப்பிட்ட ஆப்ஸ் சார்ந்த JSON உள்ளமைவு ஆப்ஜெக்ட். எ.கா. '"managedConfiguration": { "key1": value1, "key2": value2 }'.  ஆப்ஸ் மெனிஃபெஸ்ட்டில் விசைகள் வரையறுக்கப்பட்டுள்ளன.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-     தொடக்கியில் ஆப்ஸைப் பொருத்த, PinnedLauncherApps என்பதைப் பார்க்கவும்.</translation>
 <translation id="602728333950205286">இயல்புநிலை தேடல் வழங்குநர் உடனடி URL</translation>
 <translation id="603410445099326293">POST ஐப் பயன்படுத்தும் பரிந்துரை URL க்கான அளவுருக்கள்</translation>
 <translation id="6034341625190551415">பொது அமர்வு மற்றும் கியாஸ்க் கணக்கு வகைகளைக் கட்டுப்படுத்தும்.</translation>
@@ -2762,7 +2679,7 @@
 
         பட்டியலில் ஒரு கொள்கை இருந்து, இரண்டு ஆதாரங்களுக்கு இடையே வேறுபாடு இருக்கும் பட்சத்தில் அவை ஒரே நோக்கங்களையும் நிலையையும் கொண்டிருந்தால், அந்த மதிப்புகள் புதிய கொள்கைப் பட்டியலாக ஒன்றிணைக்கப்படும்.
 
-        பட்டியலில் ஒரு கொள்கை இருந்து, இரண்டு ஆதாரங்களுக்கு இடையே வேறுபாடு இருப்பதோடு வெவ்வேறு நோக்கங்கள் மற்றும்/அல்லது நிலையையும் கொண்டிருந்தால், அதிகப்படியான முன்னுரிமையுடன் கூடிய கொள்கை பயன்படுத்தப்படும்.
+        பட்டியலில் ஒரு கொள்கை இருந்து, இரண்டு ஆதாரங்களுக்கு இடையே வேறுபாடு இருப்பதோடு வெவ்வேறு நோக்கங்களையோ நிலையையோ கொண்டிருந்தால், அதிகப்படியான முன்னுரிமையுடன் கூடிய கொள்கை பயன்படுத்தப்படும்.
 
         பட்டியலில் கொள்கை இல்லாமல் ஆதாரங்கள், நோக்கங்கள் மற்றும்/அல்லது நிலை ஆகியவற்றுக்கு இடையே வேறுபாடு ஏதேனும் இருந்தால், அதிகப்படியான முன்னுரிமையுடன் கூடிய கொள்கை பயன்படுத்தப்படும்.</translation>
 <translation id="6258193603492867656">உருவாக்கப்பட்ட Kerberos SPN இல் இயல்புக்கு மாறான போர்ட் சேர்க்கப்பட வேண்டுமா என்று குறிப்பிடுகிறது. இந்த அமைப்பை செயலாக்கி, இயல்புக்கு மாறான (அதாவது, 80 அல்லது 443 ஐ விட வேறுபட்ட) போர்ட்டையும் உள்ளிட்டால், அது உருவாக்கப்பட்ட Kerberos SPN இல் சேர்க்கப்படும். இந்த அமைப்பை முடக்கினால் அல்லது அமைக்கப்படாமல் விட்டால், உருவாக்கப்பட்ட Kerberos SPN இல் எந்த நிலையிலும் எந்தவொரு போர்ட்டும் சேர்க்கப்படாது.</translation>
@@ -2952,7 +2869,7 @@
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> செருகுநிரலை இயங்க அனுமதிக்கும் தளங்களைக் குறிப்பிடும் url பட்டியலை அமைக்க உங்களை அனுமதிக்கும்.
 
           இந்தக் கொள்கையை அமைக்கவில்லை எனில், இயல்புநிலை மதிப்பு எல்லாத் தளங்களுக்கும் பயன்படுத்தப்படும். அப்படி அமைக்கப்படும் மதிப்பு, 'DefaultPluginsSetting' கொள்கையாகவோ (ஏற்கனவே அமைக்கப்பட்டிருந்தால்) அல்லது பயனரின் தனிப்பட்ட உள்ளமைவாகவோ இருக்கும்.</translation>
-<translation id="6757613329154374267">காப்புப் பிரதி மற்றும் மீட்டெடுப்பு இயக்கப்பட்டது</translation>
+<translation id="6757613329154374267">காப்புப் பிரதி மற்றும் மீட்டமைப்பு இயக்கப்பட்டது</translation>
 <translation id="6762235610019366960">இது <ph name="PRODUCT_NAME" /> இல் முழுத் தாவலில் விளம்பரம் மற்றும்/அல்லது விழிப்புணர்வு உள்ளடக்கத்தைக் காண்பிப்பதை நீங்கள் கட்டுப்படுத்த அனுமதிக்கும்.
 
       இது அமைக்கப்படவில்லை அல்லது இயக்கப்பட்டிருந்தால் (சரி என்று அமைக்கப்பட்டிருந்தால்), தயாரிப்புக் குறித்த தகவல்களைப் பயனர்களுக்கு வழங்குவதற்காக, <ph name="PRODUCT_NAME" /> முழுத்தாவலில் உள்ளடக்கத்தைக் காண்பிக்கக்கூடும்.
@@ -2975,7 +2892,7 @@
       ஹோஸ்ட்பெயராகப் பயன்படுத்துவதற்கு முன்னர், சாதனத்தில் மதிப்புகளாக மாற்றப்படும் ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME} மாறிகளை வார்த்தை கொண்டிருக்கலாம். மாற்றப்படும் மதிப்பானது சரியான ஹோஸ்ட்பெயராக (RFC 1035, பிரிவு 3.1ன் படி) இருக்க வேண்டும்.
 
       இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ மாற்றப்பட்ட மதிப்பானது சரியான ஹோஸ்ட்பெயராக இல்லை என்றாலோ, DHCP கோரிக்கையில் எந்த ஹோஸ்ட்பெயரும் அமைக்கப்படாது. </translation>
-<translation id="6833988859168635883">Startup, முகப்புப்பக்கம் மற்றும் புதிய தாவல் பக்கம்</translation>
+<translation id="6833988859168635883">தொடக்கம், முகப்புப்பக்கம் மற்றும் புதிய தாவல் பக்கம்</translation>
 <translation id="6835883744948188639">மீண்டும் தொடங்குவது பரிந்துரைக்கப்படுகிறது என்பதைக் குறிக்கும், தொடர்ச்சியாகத் தெரியும் அறிவிப்பைப் பயனருக்குக் காட்டு</translation>
 <translation id="6837480141980366278"><ph name="PRODUCT_NAME" /> இல் உள்ளமைந்த DNS கிளையண்ட் பயன்படுத்தப்படுகிறதா என்பதைக் கட்டுப்படுத்துகிறது.
 
@@ -2984,37 +2901,6 @@
       இந்தக் கொள்கையை ‘தவறு’ என அமைத்தால், உள்ளமைந்த DNS கிளையண்ட் ஒருபோதும் பயன்படுத்தப்படாது.
 
       இந்தக் கொள்கையை அமைக்காமல் விட்டால், MacOS, Android (தனிப்பட்ட DNS அல்லது VPN இயக்கப்படாமல் இருந்தால்) மற்றும் ChromeOSஸில் இயல்புநிலையாக உள்ளமைந்த DNS கிளையண்ட் இயக்கப்படும், உள்ளமைந்த DNS கிளையண்ட்டைப் பயன்படுத்துவதா என்பதைப் பயனர்கள் chrome://flags இணைப்பில் திருத்தம் செய்வதன் மூலமோ ஒரு கட்டளை வரிக் கொடியில் குறிப்பிடுவதன் மூலமோ மாற்றலாம்.</translation>
-<translation id="6838056959556423778">இது <ph name="PRODUCT_NAME" /> இயல்புநிலைப் பிரிண்டரைத் தேர்ந்தெடுப்பதற்கான விதிகளை மேலெழுதும்.
-
-      இந்தக் கொள்கை, <ph name="PRODUCT_NAME" /> இல் இயல்புநிலைப் பிரிண்டரைத் தேர்ந்தெடுப்பதற்கான விதிகளைத் தீர்மானிக்கும், இது ஒரு சுயவிவரத்தில் அச்சிடல் செயல்பாடு முதல்முறையாகப் பயன்படுத்தப்படும்போது நிகழும்.
-
-      இந்தக் கொள்கை அமைக்கப்படும்போது, குறிப்பிடப்பட்டுள்ள அனைத்துப் பண்புக்கூறுகளும் உள்ள பொருத்தமான ஒரு பிரிண்டரைக் கண்டுபிடிக்க <ph name="PRODUCT_NAME" /> முயற்சி செய்யும், கண்டறிந்த பின் அதை இயல்புநிலைப் பிரிண்டராகத் தேர்ந்தெடுக்கும். கொள்கைக்குப் பொருத்தமான முதல் பிரிண்டர் தேர்ந்தெடுக்கப்படும், பல பிரிண்டர்கள் பொருந்தினால், பிரிண்டர்கள் கண்டறியப்பட்ட வரிசையின்படி ஏதேனும் ஒரு பொருத்தமான பிரிண்டர் தேர்ந்தெடுக்கப்படலாம்.
-
-      இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ குறிப்பிட்ட நேரத்திற்குள் பொருத்தமான பிரிண்டர் கண்டறியப்படவில்லை என்றாலோ, உள்ளமைந்த PDF பிரிண்டர் இயல்புநிலைப் பிரிண்டராக அமைக்கப்படும் அல்லது PDF பிரிண்டர் இல்லை என்றால், பிரிண்டர் எதுவும் தேர்ந்தெடுக்கப்படாது.
-
-      பின்வரும் திட்டப்பணித் தரவிற்கு உட்பட்டு, மதிப்பானது JSON கூறாகப் பாகுபடுத்தப்படும்:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "பொருந்தும் பிரிண்டரைத் தேடுவதை குறிப்பிட்ட பிரிண்டர்களின் தொகுப்பில் தேடும்படி வரம்பிடுவதா.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "பிரிண்டர் ஐடியுடன் பொருந்தும் ரெகுலர் எக்ஸ்ப்ரெஷன்.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "பிரிண்டரின் காட்சிப் பெயருடன் பொருந்தும் ரெகுலர் எக்ஸ்ப்ரெஷன்.",
-            "type": "string"
-          }
-        }
-      }
-
-      <ph name="CLOUD_PRINT_NAME" /> உடன் இணைக்கப்பட்டுள்ள பிரிண்டர்கள் <ph name="PRINTER_TYPE_CLOUD" /> பிரிண்டராகக் கருதப்படும், பிற பிரிண்டர்கள் <ph name="PRINTER_TYPE_LOCAL" /> என வகைப்படுத்தப்படும்.
-      ஒரு புலத்தில் மதிப்பை உள்ளிடாமல் தவிர்த்தால், அது அந்தப் புலத்திற்கு எல்லா மதிப்புகளும் பொருந்தும் எனப் புரிந்துகொள்ளப்படும், எடுத்துக்காட்டாக, இணைப்புநிலையைக் குறிப்பிடாமல் விட்டிருந்தால், அச்சு முன்னோட்டத்திற்காக உள்ளக மற்றும் கிளவுட் பிரிண்டர்கள் உள்ளிட்ட அனைத்து வகையான பிரிண்டர்களையும் தேடும் செயல்பாடு தொடங்கப்படும்.
-      ரெகுலர் எக்ஸ்ப்ரெஷன் வடிவங்கள் JavaScript RegExp சின்டாக்ஸைப் பின்பற்ற வேண்டும், பொருத்தங்கள் பேரெழுத்து சிற்றெழுத்து வேறுபாடு கொண்டவையாக இருக்கும்.</translation>
 <translation id="6843296367238757293">இந்தக் கொள்கை தடுக்கப்பட்டுள்ளது. இதைப் பயன்படுத்துவது பரிந்துரைக்கப்படவில்லை. மேலும் படிக்க: https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">இந்தக் கொள்கையானது <ph name="PRODUCT_NAME" /> 68டில் அகற்றப்பட்டு, <ph name="ARC_GLS_POLICY_NAME" /> ஆல் மாற்றியமைக்கப்படும்.</translation>
 <translation id="6856743875250214792">இந்தக் கொள்கையானது, அகச் சோதனைக்கு மட்டும் பயன்படுத்தப்பட்டதாலும் இது பாதுகாப்புப் பொறுப்பு என்பதாலும், இது M66 இல் தடுக்கப்பட்டு, அகற்றப்பட்டது.
@@ -3085,17 +2971,17 @@
 
       திரை மங்கலாகப்போகும் சமயத்தில், திரை மங்குவதை ஒத்திவைக்க வேண்டுமா என் ஸ்மார்ட் மங்கல் மாதிரி மதிப்பீடு செய்யும். ஸ்மார்ட் மங்கல் மாதிரியானது திரை மங்குவதை ஒத்திவைத்தால், திரை மங்கலாகும் வரையான நேரத்தை அது பயனுள்ள முறையில் நீட்டிக்கும். இச்சந்தர்ப்பத்தில், திரை அணைவு, திரைப் பூட்டு, ஐடில் தாமதங்கள் ஆகியவை, உண்மையில் உள்ளமைத்தவாறு திரை மங்கல் தாமதத்திலிருந்து அதேயளவு நேரங்களைப் பேணுமாறு சரிசெய்யப்படும்.
       இந்தக் கொள்கையைச் சரி என அமைத்தால் அல்லது அதை அமைக்காமல் விட்டால், ஸ்மார்ட் மங்கல் மாதிரி இயக்கப்பட்டு, திரை மங்கலாகும் வரையான நேரத்தை நீட்டிக்க அனுமதிக்கப்படும். இந்தக் கொள்கையைத் தவறு என அமைத்தால், ஸ்மார்ட் மங்கல் மாதிரியானது திரையை மங்கலாக்காது.</translation>
-<translation id="6967394885063085697">மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறை மின்சக்தி உபயோகக் கொள்கையை இயக்கும்.
+<translation id="6967394885063085697">'மேம்பட்ட பேட்டரி சார்ஜ்’ பயன்முறை மின்சக்தி உபயோகக் கொள்கையை இயக்கும்.
 
-          மேம்பட்ட பேட்டரி சார்ஜிங் பயன்முறை பயனரை பேட்டரியின் ஆயுளை அதிகப்படுத்த அனுமதிக்கிறது. மேம்பட்ட சார்ஜிங் பயன்முறையில் சிஸ்டம் வழக்கமான சார்ஜிங் அல்காரிதத்தையும் பணிபுரியாத செயல்படாத நேரத்தில் பிற தொழில்நுட்பங்களையும் பயன்படுத்தி பேட்டரியின் ஆயுளை அதிகப்படுத்துகிறது. வேலை நேரத்தில் எக்ஸ்பிரஸ் சார்ஜ் பயன்படுத்தப்படும். இந்த எக்ஸ்பிரஸ் சார்ஜ் பேட்டரியை வேகமாகச் சார்ஜ் செய்ய அனுமதிக்கிறது; இதனால் பேட்டரி விரைவில் முழுமையாகச் சார்ஜ் செய்யப்படும். ஒவ்வொரு நாளும் மிகவும் அதிகமாகப் பயன்படுத்தப்படும் சிஸ்டத்தின் நேரமானது தொடக்க நேரம் மற்றும் கால அளவின் மூலம் குறிப்பிடப்படும்.
+          'மேம்பட்ட பேட்டரி சார்ஜிங்’ பயன்முறை பயனரை பேட்டரியின் ஆயுளை அதிகப்படுத்த அனுமதிக்கிறது. 'மேம்பட்ட சார்ஜிங்’ பயன்முறையில் சிஸ்டம் வழக்கமான சார்ஜிங் அல்காரிதத்தையும் பயன்பாட்டில் இல்லாத நேரத்தில் பிற தொழில்நுட்பங்களையும் பயன்படுத்தி பேட்டரியின் ஆயுளை அதிகப்படுத்துகிறது. பயன்பாட்டில் உள்ள நேரத்தில் எக்ஸ்பிரஸ் சார்ஜ் பயன்படுத்தப்படும். இந்த எக்ஸ்பிரஸ் சார்ஜ் பேட்டரியை வேகமாகச் சார்ஜ் செய்ய அனுமதிக்கிறது; இதனால் பேட்டரி விரைவில் முழுமையாகச் சார்ஜ் செய்யப்படும். ஒவ்வொரு நாளும் மிகவும் அதிகமாகப் பயன்படுத்தப்படும் சிஸ்டத்தின் நேரமானது தொடக்க நேரம் மற்றும் கால அளவின் மூலம் குறிப்பிடப்படும்.
 
-          இந்தக் கொள்கை 'சரி' என அமைக்கப்பட்டு, DeviceAdvancedBatteryChargeModeDayConfig அமைக்கப்பட்டால் (சாதனத்தில் ஆதரிக்கப்பட்டால்) மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறை எப்போதும் இயக்கப்படும்.
+          இந்தக் கொள்கை 'சரி' என அமைக்கப்பட்டு, DeviceAdvancedBatteryChargeModeDayConfig அமைக்கப்பட்டால் (சாதனத்தில் ஆதரிக்கப்பட்டால்) 'மேம்பட்ட பேட்டரி சார்ஜ்’ பயன்முறை எப்போதும் இயக்கப்படும்.
 
-          இந்தக் கொள்கை 'தவறு' என அமைக்கப்பட்டால் மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறை எப்போதும் முடக்கப்படும்.
+          இந்தக் கொள்கை 'தவறு' என அமைக்கப்பட்டால் 'மேம்பட்ட பேட்டரி சார்ஜ்’ பயன்முறை எப்போதும் முடக்கப்படும்.
 
           இந்தக் கொள்கையை அமைத்தால் பயனர்களால் இதை மாற்றவோ மீறவோ முடியாது.
 
-          இந்தக் கொள்கையை அமைக்கவில்லை எனில் மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறை முடக்கப்படும், அதைப் பயனர்களால் இயக்க முடியாது.</translation>
+          இந்தக் கொள்கையை அமைக்கவில்லை எனில் 'மேம்பட்ட பேட்டரி சார்ஜ்' பயன்முறை முடக்கப்படும், அதைப் பயனர்களால் இயக்க முடியாது.</translation>
 <translation id="6972540544240464302">டாஸ்க் ஷெட்யூலர் உள்ளமைவைத் தேர்ந்தெடுத்தல்</translation>
 <translation id="6979158407327259162">Google இயக்ககம்</translation>
 <translation id="6994082778848658360">இந்த அம்சத்துடன் இணங்கினால், ஆன்-போர்டு பாதுகாப்பு உறுப்பு வன்பொருள் மூலம் இருபடி அங்கீகாரம் வழங்குவது எப்படி என்று குறிப்பிடும். பயனரின் இருப்பைக் கண்டறிய சாதனத்தின் பவர் பட்டன் பயன்படுத்தப்படும்.
@@ -3163,7 +3049,7 @@
       இந்தக் கொள்கை அமைக்கப்படவில்லை எனில், சாதனத்தை திறக்கக் கடவுச்சொல்லை உள்ளிடக் கேட்க வேண்டுமா அல்லது வேண்டாமா என்பதைப் பயனர்கள் தேர்வுசெய்யலாம்.</translation>
 <translation id="7107148737865880402">'USB மின்சக்தி பகிர்வு' மின்சக்தி உபயோகக் கொள்கையை இயக்கும்.
 
-          சில சாதனங்களில் மின்னல் அல்லது பேட்டரி ஐகானுடன் கூடிய குறிப்பிட்ட USB போர்ட் இருக்கும். சிஸ்டம் பேட்டரியைப் பயன்படுத்தி மொபைல் ஃபோன் போன்ற சாதனங்களைச் சார்ஜ் செய்ய இதைப் பயன்படுத்தலாம். இந்தக் கொள்கையானது சிஸ்டம் 'உறக்கம்' மற்றும் 'ஷட் டவுன்' பயன்முறைகளில் இருக்கும் போது இந்தப் போர்ட்டின் சார்ஜாகும் நடத்தையைப் பாதிக்கும். இந்தக் கொள்கையானது சிஸ்டம் செயலில் இருக்கும் போது மற்ற USB போர்ட்களையும் சார்ஜாகும் நடத்தையையும் பாதிக்காது.
+          சில சாதனங்களில் மின்னல் அல்லது பேட்டரி ஐகானுடன் கூடிய குறிப்பிட்ட USB போர்ட் இருக்கும். சிஸ்டம் பேட்டரியைப் பயன்படுத்தி மொபைல் ஃபோன் போன்ற சாதனங்களைச் சார்ஜ் செய்ய இதைப் பயன்படுத்தலாம். இந்தக் கொள்கையானது சிஸ்டம் 'உறக்கம்' மற்றும் 'ஷட் டவுன்' பயன்முறைகளில் இருக்கும் போது இந்தப் போர்ட்டின் மூலம் சார்ஜாவதைப் பாதிக்கும். இந்தக் கொள்கையானது சிஸ்டம் செயலில் இருக்கும் போது மற்ற USB போர்ட்களையும் சார்ஜாவதையும் பாதிக்காது.
 
           செயலில் இருக்கும் போது USB போர்ட் எப்போதும் மின்சக்தி வழங்கும்.
 
@@ -3360,7 +3246,7 @@
 
           இந்தக் கொள்கை இயக்கப்பட்டிருந்தால் அதில் வரையறுக்கப்பட்டுள்ள கணக்குகள் 'Kerberos கணக்கு அமைப்புகளில்' சேர்க்கப்படும்.
 
-          இந்தக் கொள்கை முடக்கப்பட்டு இருந்தாலோ அமைக்கப்படவில்லை என்றாலோ 'Kerberos கணக்கு அமைப்புகளில்' கணக்குகள் சேர்க்கப்படாது. 'Kerberos கணக்கைப் பயனர்கள் சேர்க்கலாம்' என்ற கொள்கை இயக்கப்பட்டிருந்தால் பயனர்கள் நேரடியாகக் கணக்குகளைச் சேர்க்க முடியும்.</translation>
+          இந்தக் கொள்கை முடக்கப்பட்டு இருந்தாலோ அமைக்கப்படவில்லை என்றாலோ 'Kerberos கணக்கு அமைப்புகளில்' கணக்குகள் சேர்க்கப்படாது. இந்தக் கொள்கை மூலம் முன்பு சேர்க்கப்பட்ட எல்லாக் கணக்குகளும் நீக்கப்படும். 'Kerberos கணக்கைப் பயனர்கள் சேர்க்க முடியும்' என்ற கொள்கை இயக்கப்பட்டிருந்தால் பயனர்கள் நேரடியாகவும் கணக்குகளைச் சேர்க்கலாம்.</translation>
 <translation id="7458437477941640506">OS பதிப்பு இலக்கை விடப் புதியதாக இருந்தால், இலக்குப் பதிப்புக்கு மீட்டமைக்க வேண்டாம். புதுப்பிப்புகளும் முடக்கப்பட்டுள்ளன.</translation>
 <translation id="7464991223784276288">நடப்பு அமர்வில் URLகளைப் பொருத்துவதிலிருந்து குக்கீகளை வரம்பிடும்</translation>
 <translation id="7469554574977894907">தேடல் பரிந்துரைகளை இயக்கு</translation>
@@ -3426,9 +3312,9 @@
       இந்தக் கொள்கையின் மதிப்பு 0 ஆக இருந்தால், இயல்பு தற்காலிகச் சேமிப்பின் அளவு பயன்படுத்தப்படும், ஆனால் பயனரால் இதை மாற்ற முடியாது.
 
       இந்தக் கொள்கையானது அமைக்கப்படவில்லை எனில், இயல்பு தற்காலிகச் சேமிப்பின் அளவைப் பயன்படுத்தப்படும், மேலும் --disk-cache-size கொடி மூலம் பயனரால் இதை மேலெழுத முடியும்.</translation>
-<translation id="759389052790680884">'பேட்டரி சார்ஜாவதை நிறுத்தும் பிரத்யேகமான மதிப்பை' சதவீதத்தில் அமைக்கும்.
+<translation id="759389052790680884">'பேட்டரி சார்ஜாவதை நிறுத்தும் பிரத்தியேகமான மதிப்பை' சதவீதத்தில் அமைக்கும்.
 
-          'பேட்டரி சார்ஜாவதை நிறுத்தும் மதிப்பை' அடைந்ததும், பேட்டரி சார்ஜாவதை நிறுத்தும்.
+          'பேட்டரி சார்ஜாவதை நிறுத்தும் பிரத்தியேகமான மதிப்பை' அடைந்ததும் பேட்டரி சார்ஜாவதை நிறுத்தும்.
 
           DeviceBatteryChargeCustomStartCharging மதிப்பு DeviceBatteryChargeCustomStopCharging மதிப்பை விடக் குறைவாக இருக்க வேண்டும்.
 
@@ -3513,7 +3399,7 @@
 <translation id="7712109699186360774">கேமரா மற்றும்/அல்லது மைக்ரோஃபோனை ஒரு தளம் அணுக விரும்பும் ஒவ்வொரு முறையும் கேள்</translation>
 <translation id="7713608076604149344">பதிவிறக்கக் கட்டுப்பாடுகள்</translation>
 <translation id="7715711044277116530">விளக்கக்காட்சி பயன்முறையில் திரை மங்குதல் தாமதத்தை அளவிடுவதற்கான சதவீதம்</translation>
-<translation id="7716781462866245042">மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறை நாள் உள்ளமைவை அமைக்கும்
+<translation id="7716781462866245042">’மேம்பட்ட பேட்டரி சார்ஜ் பயன்முறை நாள்’ உள்ளமைவை அமைக்கும்
 
           DeviceAdvancedBatteryChargeModeEnabled 'சரி' என அமைக்கப்பட்டால் மட்டுமே இந்தக் கொள்கை பயன்படுத்தப்படும்.
 
@@ -3606,7 +3492,7 @@
 <translation id="7882890448959833986">ஆதரிக்கப்படாத OS எச்சரிக்கையை முடக்கு</translation>
 <translation id="7889788745439330797">Kerberos கணக்குகளைப் பயனர்கள் சேர்ப்பதை நிர்வகிக்கும்.
 
-          இந்தக் கொள்கை இயக்கப்பட்டிருந்தாலோ அமைக்கப்படவில்லை என்றாலோ 'பயனர் அமைப்புகள்' பக்கத்திலுள்ள 'Kerberos கணக்கு அமைப்புகளுக்கு' சென்று கணக்குகளைப் பயனர்கள் சேர்க்கலாம். பயனர்கள் சேர்த்த கணக்குகளை மாற்றவோ நீக்கவோ அவர்களுக்கு முழு அதிகாரம் உண்டு.
+          இந்தக் கொள்கை இயக்கப்பட்டிருந்தாலோ அமைக்கப்படவில்லை என்றாலோ 'பயனர் அமைப்புகள்' பக்கத்திலுள்ள 'Kerberos கணக்கு அமைப்புகளுக்கு' சென்று கணக்குகளைப் பயனர்கள் சேர்க்கலாம். பயனர்கள் சேர்த்த கணக்குகளின் மீது அவர்களுக்கு முழு அதிகாரம் உண்டு, அவற்றை மாற்றலாம், நீக்கலாம்.
 
           இந்தக் கொள்கையை முடக்கினால் Kerberos கணக்குகளைப் பயனர்களால் சேர்க்க முடியாமல் போகலாம். 'Kerberos கணக்குகளை உள்ளமைத்தல்' கொள்கையின் மூலம் மட்டுமே கணக்குகளைச் சேர்க்க முடியும். கணக்குகளின் செயல்பாட்டை நிர்வகிக்க இது சிறந்த வழியாகும்.</translation>
 <translation id="7895553628261067384">தொலைநிலை அணுகல்</translation>
@@ -3623,7 +3509,7 @@
 <translation id="7941975817681987555">எந்த நெட்வொர்க் இணைப்பிலும் நெட்வொர்க் செயல்பாடுகளை யூகிக்க வேண்டாம்</translation>
 <translation id="7952007677054834789"><ph name="PRODUCT_NAME" />ல் தொடக்கம், இயல்புநிலை முகப்புப் பக்கம், இயல்புநிலை புதிய தாவல் பக்கம் ஆகியவற்றில் ஏற்றும்படி பக்கங்களை உள்ளமைக்கும், பயனர்கள் அவற்றை மாற்றுவதைத் தடுக்கும்.
 
-      நீங்கள் முகப்புப் பக்கத்தை புதிய தாவல் பக்கமாகத் தேர்ந்தெடுத்தாலோ அதை URL ஆக அமைத்து முகப்புப் பக்க URLலைக் குறிப்பிட்டாலோ மட்டுமே பயனரின் முகப்புப் பக்க அமைப்புகள் முழுவதுமாகச் செயலிழக்கப்படும். முகப்புப் பக்க URLலைக் குறிப்பிடவில்லை எனில் 'chrome://newtab' என்பதைக் குறிப்பிட்டு பயனரால் அப்போதும் புதிய தாவல் பக்கத்தில் முகப்புப் பக்கத்தை அமைக்க முடியும்.
+      நீங்கள் முகப்புப் பக்கத்தை புதிய தாவல் பக்கமாகத் தேர்ந்தெடுத்தாலோ அதை URLலாக அமைத்து முகப்புப் பக்க URLலைக் குறிப்பிட்டாலோ மட்டுமே பயனரின் முகப்புப் பக்க அமைப்புகள் முழுவதுமாகச் செயலிழக்கும். முகப்புப் பக்க URLலைக் குறிப்பிடவில்லை எனில் 'chrome://newtab' என்பதைக் குறிப்பிட்டு பயனரால் அப்போதும் புதிய தாவல் பக்கத்தில் முகப்புப் பக்கத்தை அமைக்க முடியும்.
 
       'தொடக்கச் செயல்பாடு' என்பதில் 'URLகளின் பட்டியலைத் திற' என்பதைத் தேர்ந்தெடுக்கவில்லை எனில் 'தொடக்கத்தில் திறக்க வேண்டிய URLகள்' கொள்கை புறக்கணிக்கப்படும்.</translation>
 <translation id="7952958573604504839">இந்தக் கொள்கை <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />க்குச் சாதகமாக M48ல் தடுக்கப்பட்டுள்ளது, M54ல் அகற்றப்பட்டுள்ளது.
@@ -4116,30 +4002,6 @@
       This policy affects only users who authenticated using SAML.
 
       The policy value should be specified in seconds.</translation>
-<translation id="9027787254195333560">This policy allows you to configure the avatar image representing the user on the login screen. The policy is set by specifying the URL from which <ph name="PRODUCT_OS_NAME" /> can download the avatar image and a cryptographic hash used to verify the integrity of the download. The image must be in JPEG format, its size must not exceed 512kB. The URL must be accessible without any authentication.
-
-      The avatar image is downloaded and cached. It will be re-downloaded whenever the URL or the hash changes.
-
-      The policy should be specified as a string that expresses the URL and hash in JSON format, conforming to the following schema:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "The URL from which the avatar image can be downloaded.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "The SHA-256 hash of the avatar image.",
-            "type": "string"
-          }
-        }
-      }
-
-      If this policy is set, <ph name="PRODUCT_OS_NAME" /> will download and use the avatar image.
-
-      If you set this policy, users cannot change or override it.
-
-      If the policy is left not set, the user can choose the avatar image representing them on the login screen.</translation>
 <translation id="9035964157729712237">தடுப்புப் பட்டியலில் இருந்து, விலக்குவதற்கான நீட்டிப்பு IDகள்</translation>
 <translation id="9038058011835642205">பயனருக்கு அறிவிக்காமல் நிறுவப்படும் இணையதளங்களின் பட்டியலைத் தானாகவே குறிக்கும். இவற்றைப் பயனரால் நிறுவல் நீக்கவோ முடக்கவோ முடியாது.
 
@@ -4152,7 +4014,6 @@
       இந்தக் கொள்கையை அமைத்தால் பயனரால் இதை மாற்றவோ மீறிச் செயல்படவோ முடியாது.
 
       கொள்கையின் மதிப்பை மில்லி வினாடிகளில் குறிப்பிட வேண்டும். மதிப்புகள் 30 வினாடிகளில் இருந்து 24 மணிநேரம் வரையிலான வரம்பிற்கு மாற்றியமைக்கப்படும்.</translation>
-<translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> சாதனத்தில் பயன்படுத்துவதற்கு ஒவ்வொரு பயனருக்குமாக நெட்வொர்க் உள்ளமைவை வழங்க அனுமதிக்கிறது. நெட்வொர்க் உள்ளமைவு என்பது <ph name="ONC_SPEC_URL" /> இல் விளக்கப்பட்டுள்ளபடி திறந்த நெட்வொர்க் உள்ளமைவு வடிவத்தால் வரையறுக்கப்பட்ட JSON-வடிவமைப்புத் தொடர் ஆகும்.</translation>
 <translation id="9050853837490399534">சாதனம் Quick Fix Buildக்குப் புதுப்பிக்கப்பட்டாலும் இல்லையென்றாலும் இந்தக் கொள்கை அதைக் கட்டுப்படுத்தும்.
 
       Quick Fix Buildக்கு மேப் செய்யும் டோக்கனுக்கு கொள்கையின் மதிப்பு வழங்கப்பட்டு, புதுப்பிப்பு மற்றொரு கொள்கையின் மூலம் தடுக்கப்படாமல் இருந்தால், தொடர்புடைய Quick Fix Buildக்குச் சாதனம் புதுப்பிக்கப்படும்.
@@ -4223,18 +4084,6 @@
       கொள்கையை 'தவறு' என அமைத்தால், அச்சு மாதிரிக்காட்சி உரையாடலில் 'தலைப்புகள் மற்றும் அடிக்குறிப்புகள்' தேர்வுசெய்யப்படாது, மேலும் பயனரால் இதை மாற்ற முடியாது.
 
       கொள்கையை ‘சரி’ என அமைத்தால், அச்சு மாதிரிக்காட்சி உரையாடலில் 'தலைப்புகள் மற்றும் அடிக்குறிப்புகள்' தேர்வுசெய்யப்படும், மேலும் பயனரால் இதை மாற்ற முடியாது.</translation>
-<translation id="9213347477683611358">சாதனத்தில் இதுவரை எந்தப் பயனரும் உள்நுழையவில்லை எனில், உள்நுழைவுத் திரையில் தோன்றும் சாதன நிலை வால்பேப்பர் படத்தை உள்ளமைக்கும். URL (வால்பேப்பர் படத்தைப் பதிவிறக்க Chrome OS சாதனம் பயன்படுத்தும் இணைப்பு) மற்றும் கிரிப்ஃடோகிராஃபிக் ஹேஷ் (பதிவிறக்கத்தின் நம்பகத்தன்மையைச் சரிபார்ப்பதற்குப் பயன்படுத்தப்படுவது) ஆகியவற்றைக் குறிப்பிடுவதன் மூலம், இந்தக் கொள்கை அமைக்கப்படுகிறது. படம் JPEG வடிவத்தில் இருக்க வேண்டும், அதன் அளவு 16மெ.பை. விட அதிகமாக இருக்கக்கூடாது. URL  எந்தவித அங்கீகரிப்பும் இல்லாமல் அணுகக்கூடியதாக இருக்க வேண்டும். வால்பேப்பர் படம் பதிவிறக்கப்பட்டு, தற்காலிகமாகச் சேமிக்கப்படும். URL அல்லது ஹேஷ் மாறும் போது, அது மீண்டும் பதிவிறக்கப்படும்.
-
-      
-கொள்கையானது URLலையும் ஹேஷையும் JSON வடிவத்தில் குறிப்பிடும் வார்த்தையாகக் குறிப்பிடப்பட்டிருக்க வேண்டும், எ.கா:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      சாதன வால்பேப்பர் கொள்கை அமைக்கப்பட்டால், சாதனத்தில் இதுவரை எந்தப் பயனரும் உள்நுழையவில்லை எனில் உள்நுழைவுத் திரையில் தோன்றும் வால்பேப்பர் படத்தை Chrome OS சாதனம் பதிவிறக்கிப் பயன்படுத்தும். பயனர் உள்நுழைந்ததும், பயனரின் வால்பேப்பர் கொள்கை செயல்படத் தொடங்கும்.
-
-      சாதன வால்பேப்பர் கொள்கை அமைக்கப்படவில்லை எனில், பயனரின் வால்பேப்பர் கொள்கை அமைக்கப்பட்டிருந்தால் எதைக் காட்ட வேண்டும் என்பதை அதுவே தீர்மானிக்கும்.</translation>
 <translation id="9217154963008402249">கண்காணிக்கப்படும் நெட்வொர்க் பாக்கெட்டுகள் அனுப்பப்படும் கால இடைவெளி</translation>
 <translation id="922540222991413931">நீட்டிப்பு, ஆப்ஸ், பயனர் ஸ்கிரிப்ட் நிறுவல் ஆதாரங்களை உள்ளமை</translation>
 <translation id="924557436754151212">முதல் இயக்கத்தின்போதே இயல்புநிலை உலாவலிருந்து சேமித்த கடவுச்சொற்களை இறக்குமதி செய்</translation>
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index d91b0600..b6e6af1 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -405,7 +405,6 @@
 
       హెచ్చరిక: సాఫ్ట్‌వేర్ అప్‌డేట్‌లు మరియు కీలకమైన భద్రతా పరిష్కారాలను పొందనివ్వకుండా పరికరాన్ని నిరోధిస్తుంది, కనుక <ph name="PRODUCT_OS_NAME" /> వెర్షన్ యొక్క నియంత్రణ అధికారాన్ని కియోస్క్ యాప్‌నకు కేటాయించడం సమర్థనీయం కాదు. <ph name="PRODUCT_OS_NAME" /> వెర్షన్‌కు నియంత్రణ అధికారాన్ని కేటాయించడం వినియోగదారులను ఇబ్బందులకు గురిచేయవచ్చు.</translation>
 <translation id="1675002386741412210">లో మద్దతిస్తుంది:</translation>
-<translation id="1689963000958717134"><ph name="PRODUCT_OS_NAME" /> పరికరం యొక్క వినియోగదారులందరికీ వర్తించేలా నెట్‌వర్క్ కాన్ఫిగరేషన్‌ను అందించడానికి అనుమతిస్తుంది. నెట్‌వర్క్ కాన్ఫిగరేషన్ అనేది <ph name="ONC_SPEC_URL" />లో వివరించిన విధంగా ఓపెన్ నెట్‌వర్క్ కాన్ఫిగరేషన్ ఫార్మాట్ ద్వారా నిర్వచించిన JSON-ఫర్మాటింగ్ స్ట్రింగ్</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> ఫర్మ్‌వేర్ అప్‌డేట్ కార్యశీలత యొక్క లభ్యతను, ప్రవర్తనను కాన్ఫిగర్ చేస్తుంది.
 
       JSON లక్షణాలలో సెట్టింగ్‌లను విడివిడిగా పేర్కొనవచ్చు:
@@ -455,7 +454,7 @@
       ఈ విధానాన్ని ప్రారంభించినట్లయితే, ప్రతి సైట్ దాని స్వంత ప్రక్రియను అమలు చేసే డిఫాల్ట్ ప్రవర్తనను వినియోగదారులు నిలిపివేయలేరు.
       ఈ విధానాన్ని కన్ఫిగర్ చేయకుంటే లేదా నిలిపివేస్తే, వినియోగదారు ఈ సెట్టింగ్‌ను మార్చగలుగుతారు (ఉదా. chrome://flagsలో "సైట్ ఐసోలేషన్‌ను నిలిపివేయి" నమోదును ఉపయోగించడం).
       </translation>
-<translation id="1767673020408652620">శోధన పెట్టె యొక్క జీరో స్టేట్‌లో యాప్ సిఫార్సులను ప్రారంభించండి</translation>
+<translation id="1767673020408652620">శోధన బాక్స్ యొక్క జీరో స్టేట్‌లో యాప్ సిఫార్సులను ప్రారంభించండి</translation>
 <translation id="1781356041596378058">అలాగే, ఈ విధానం Android డెవలపర్ ఎంపికలకు కూడా యాక్సెస్‌ను నియంత్రిస్తుంది. మీరు ఈ విధానాన్ని 'ఒప్పు'గా సెట్ చేస్తే, వినియోగదారులు డెవలపర్ ఎంపికలను యాక్సెస్ చేయలేరు. మీరు ఈ విధానాన్ని 'తప్పు'గా సెట్ చేసినా లేదా ఏదీ సెట్ చేయకపోయినా, Android సెట్టింగ్‌ల యాప్‌లో బిల్డ్ సంఖ్యపై ఏడుసార్లు నొక్కడం ద్వారా వినియోగదారులు డెవలపర్ ఎంపికలను యాక్సెస్ చేయగలరు.</translation>
 <translation id="1793346220873697538">డిఫాల్ట్ పిన్ ముద్రణను నిలిపివేయండి</translation>
 <translation id="1797233582739332495">పునఃప్రారంభం అవసరమని సూచించే పునరావృత ప్రాంప్ట్‌ను వినియోగదారుకు చూపండి</translation>
@@ -939,16 +938,6 @@
       ఈ సెట్టింగ్ నిలిపివేయబడితే, వెబ్ పేజీలు JavaScriptను ఉపయోగించలేవు మరియు వినియోగదారు ఆ సెట్టింగ్‌ను మార్చలేరు.
 
       ఈ సెట్టింగ్ ప్రారంభించబడితే లేదా సెట్ చేయబడకుంటే, వెబ్ పేజీలు JavaScriptను ఉపయోగించవచ్చు కానీ వినియోగదారు ఆ సెట్టింగ్‌ను మార్చవచ్చు.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> ఎక్స్‌టెన్షన్ నిర్వహణ సెట్టింగ్‌లను కాన్ఫిగర్ చేస్తుంది.
-
-          ఈ విధానం ప్రకారం, ఇప్పటికే ఉన్న ఎక్స్‌టెన్షన్ సంబంధిత విధానాల ద్వారా నియంత్రించబడే సెట్టింగ్‌లతో సహా బహుళ సెట్టింగ్‌లు నియంత్రించబడతాయి. ఈ విధానంతో పాటు ఏవైనా లెగసీ విధానాలు కూడా సెట్ చేసి ఉంటే, అవి దీనితో భర్తీ చేయబడతాయి.
-
-          ఈ విధానం వలన ఒక ఎక్స్‌టెన్షన్ ID లేదా అప్‌డేట్ URL వాటి కాన్ఫిగరేషన్‌లకు మ్యాప్ చేయబడతాయి. ఎక్స్‌టెన్షన్ IDతో, కాన్ఫిగరేషన్ కేవలం పేర్కొన్న ఎక్స్‌టెన్షన్‌కు మాత్రమే వర్తింపజేయబడుతుంది. ప్రత్యేక ID <ph name="DEFAULT_SCOPE" /> కోసం ఒక డిఫాల్ట్ కాన్ఫిగరేషన్‌ను సెట్ చేయవచ్చు, ఇది ఈ విధానంలో అనుకూల కాన్ఫిగరేషన్ లేని అన్ని ఎక్స్‌టెన్షన్‌లకు వర్తింపజేయబడుతుంది. అప్‌డేట్ URL సహాయంతో, ఈ ఎక్స్‌టెన్షన్ మానిఫెస్ట్‌లో పేర్కొన్న ఖచ్చితమైన అప్‌డేట్ URL కలిగి ఉండే అన్ని ఎక్స్‌టెన్షన్‌లకు <ph name="LINK_TO_EXTENSION_DOC1" />లో వివరించినట్లుగా కాన్ఫిగరేషన్ వర్తింపజేయబడుతుంది.
-
-          <ph name="MS_AD_NAME" /> డొమైన్‌కు అనుబంధించని Windows సందర్భాల విషయంలో, నిర్బంధిత ఇన్‌స్టాలేషన్ అనేది, Chrome వెబ్ స్టోర్‌లో జాబితా చేసిన యాప్‌లు, ఎక్స్‌టెన్షన్‌లకు పరిమితం చేయబడుతుంది.
-
-          ఈ విధానానికి సంబంధించిన వీలుపడే సెట్టింగ్‌లు, వ్యవస్థీకృత విధానం గురించి పూర్తి వివరణ కోసం, దయచేసి https://www.chromium.org/administrators/policy-list-3/extension-settings-full సందర్శించండి
-          </translation>
 <translation id="2753637905605932878">WebRTC ఉపయోగించే స్థానిక UDP పోర్ట్‌ల పరిధిని పరిమితం చేయండి</translation>
 <translation id="2757054304033424106">ఇన్‌స్టాల్ చేయడానికి అనుమతించబడిన పొడిగింపులు/అనువర్తనాల రకాలు</translation>
 <translation id="2758084448533744848">పరికరం కోసం ఉపయోగించాల్సిన అమలు చేయదగిన సమయ మండలిని పేర్కొంటుంది. ఈ విధానాన్ని సెట్ చేసినప్పుడు, ఈ పరికరం ఉపయోగించే వినియోగదారులు పేర్కొన్న సమయ మండలిని వేరే వాటికి మార్చలేరు. చెల్లని విలువను అందిస్తే, విధానం ఇప్పటికీ బదులుగా "GMT"ను ఉపయోగించి యాక్టివేట్‌ చేయబడుతుంది. ఒకవేళ ఖాళీ వాక్యం అందిస్తే, విధానం విస్మరించబడుతుంది.
@@ -966,7 +955,7 @@
 
       ప్రతి జాబితా నమోదు విభిన్న పరికర-స్థానిక ఖాతాలను వేరుగా చెప్పడానికి అంతర్గతంగా ఉపయోగించబడే ఐడెంటిఫైయర్‌ను పేర్కొంటుంది.</translation>
 <translation id="2769952903507981510">రిమోట్ యాక్సెస్ హోస్ట్‌ల కోసం అవసరమైన డొమైన్ పేరును కాన్ఫిగర్ చేస్తుంది</translation>
-<translation id="2783078941107212091">లాంచర్‌లోని శోధన పెట్టె యొక్క జీరో స్టేట్‌లో యాప్ సిఫార్సును ప్రారంభించండి.
+<translation id="2783078941107212091">లాంచర్‌లోని శోధన బాక్స్ యొక్క జీరో స్టేట్‌లో యాప్ సిఫార్సును ప్రారంభించండి.
 
           ఈ విధానాన్ని ఒప్పునకు సెట్ చేస్తే, జీరో స్టేట్ శోధనలో యాప్ సిఫార్సులు కనిపించవచ్చు.
 
@@ -1169,22 +1158,22 @@
       ఈ విధానం సెట్ చేయబడిందా లేదా లేదంటే సెట్ చేయబడిన పక్షంలో ఎలా సెట్ చేయబడింది అనే వాటితో సంబంధం లేకుండా, వినియోగదారులు WPAD ఆప్టిమైజేషన్ సెట్టింగ్‌ను మార్చలేరు.</translation>
 <translation id="3071839057966069710">ప్రింటర్‌ల జాబితాను కాన్ఫిగర్ చేస్తుంది.
 
-      నిర్వాహకులు తమ వినియోగదారుల కోసం ప్రింటర్ కాన్ఫిగరేషన్‌లను అందించడానికి వారిని
+      తమ వినియోగదారుల కోసం ప్రింటర్ కాన్ఫిగరేషన్‌లను అందించడానికి నిర్వాహకులను
       ఈ విధానం అనుమతిస్తుంది.
 
-      <ph name="PRINTER_DISPLAY_NAME" />, <ph name="PRINTER_DESCRIPTION" /> ప్రింటర్ ఎంపికను సులభతరం చేయడం కోసం అనుకూల విధంగా మార్చుకోగలిగే స్వతంత్ర రూపంలోని స్ట్రింగ్‌లు. <ph name="PRINTER_MANUFACTURER" />, <ph name="PRINTER_MODEL" /> అన్నవి తుది వినియోగదారులకు ప్రింటర్ గుర్తింపును సులభతరం చేస్తాయి. అవి ప్రింటర్ తయారీదారు బ్రాండ్ పేరు, మోడల్‌ను సూచిస్తాయి. <ph name="PRINTER_URI" /> అనేది <ph name="URI_SCHEME" />, <ph name="URI_PORT" />,<ph name="URI_QUEUE" />తో సహా క్లయింట్ కంప్యూటర్ నుండి చేరుకోగలిగే చిరునామా అయి ఉండాలి. <ph name="PRINTER_UUID" /> అనేది ఐచ్ఛికం. ఒకవేళ అందిస్తే, అది <ph name="ZEROCONF_DISCOVERY" /> ప్రింటర్‌ల నకిలీలను తీసివేయడంలో సహాయపడడానికి ఉపయోగించబడుతుంది.
+      <ph name="PRINTER_DISPLAY_NAME" />, <ph name="PRINTER_DESCRIPTION" /> అన్నవి ప్రింటర్ ఎంపికను సులభతరం చేయడం కోసం అనుకూల విధంగా మార్చుకోగలిగే స్వతంత్ర రూపంలోని స్ట్రింగ్‌లు. <ph name="PRINTER_MANUFACTURER" />, <ph name="PRINTER_MODEL" /> అన్నవి తుది వినియోగదారులకు ప్రింటర్ గుర్తింపును సులభతరం చేస్తాయి. అవి ప్రింటర్ తయారీదారు బ్రాండ్ పేరు, మోడల్‌ను సూచిస్తాయి. <ph name="PRINTER_URI" /> అనేది <ph name="URI_SCHEME" />, <ph name="URI_PORT" />,<ph name="URI_QUEUE" />తో సహా క్లయింట్ కంప్యూటర్ నుండి చేరుకోగలిగే చిరునామా అయి ఉండాలి. <ph name="PRINTER_UUID" /> అనేది ఐచ్ఛికం. ఒకవేళ అందిస్తే, అది <ph name="ZEROCONF_DISCOVERY" /> ప్రింటర్‌ల నకిలీలను తీసివేయడంలో సహాయపడడానికి ఉపయోగించబడుతుంది.
 
-      <ph name="PRODUCT_NAME" /> మద్దతు గల ప్రింటర్‌ను సూచించే స్ట్రింగ్‌లలో ఒక దానితో <ph name="PRINTER_EFFECTIVE_MODEL" /> తప్పనిసరిరగా సరిపోలాలి. ప్రింటర్ కోసం సరైన PPDని గుర్తించి, ఇన్‌స్టాల్ చేయడానికి స్ట్రింగ్ ఉపయోగించబడుతుంది. https://support.google.com/chrome?p=noncloudprintలో మరింత సమచారం పొందవచ్చు.
+      <ph name="PRODUCT_NAME" /> మద్దతు గల ప్రింటర్‌ను సూచించే స్ట్రింగ్‌లలో ఒక దానితో <ph name="PRINTER_EFFECTIVE_MODEL" /> తప్పనిసరిగా సరిపోలాలి. ప్రింటర్ కోసం సరైన PPDని గుర్తించి, ఇన్‌స్టాల్ చేయడానికి ఈ స్ట్రింగ్ ఉపయోగించబడుతుంది. https://support.google.com/chrome?p=noncloudprintలో మరింత సమచారం పొందవచ్చు.
 
-      <ph name="PRINTER_AUTOCONF" /> అన్నది ప్రింటర్‌ను సెటప్ చేయడానికి IPP ప్రతిచోటా ఉపయోగించాలి అనేది సూచించే బులియన్ ఫ్లాగ్. ఈ ఫ్లాగ్ <ph name="PRODUCT_OS_NAME" /> వెర్షన్ 76, అంతకంటే తర్వాతి వెర్షన్‌లకు మద్దతు ఇస్తుంది.
+      <ph name="PRINTER_AUTOCONF" /> అన్నది ప్రింటర్‌ను సెటప్ చేయడానికి IPPని ప్రతిచోటా ఉపయోగించాలా వద్దా అనేది సూచించే బూలియన్ ఫ్లాగ్. ఈ ఫ్లాగ్ <ph name="PRODUCT_OS_NAME" /> వెర్షన్ 76, అంతకంటే తర్వాతి వెర్షన్‌లకు మద్దతు ఇస్తుంది.
 
-      <ph name="PRINTER_EFFECTIVE_MODEL" />లో ప్రింటర్ పేరును కలిగి ఉండాలి లేదా <ph name="PRINTER_AUTOCONF" />ను ఒప్పునకు సెట్ చేయాలి. రెండు ఉన్న లేదా ఏ లక్షణాలు లేని ప్రింటర్‌లు విస్మరించబడతాయి.
+      <ph name="PRINTER_EFFECTIVE_MODEL" />లో ప్రింటర్ పేరు ఉండాలి లేదా <ph name="PRINTER_AUTOCONF" />ను ఒప్పునకు సెట్ చేయాలి. రెండు లక్షణాలు ఉన్నవి లేదా ఏ లక్షణమూ లేని ప్రింటర్‌లు విస్మరించబడతాయి.
 
       ప్రింటర్ మొదటి వినియోగం తర్వాత ప్రింటర్ సెటప్‌ పూర్తవుతుంది.  ప్రింటర్ ఉపయోగించే వరకు PPDలు డౌన్‌లోడ్ చేయబడవు.  ఆ సమయం తర్వాత, తరచూ ఉపయోగించే PPDలు కాష్ చేయబడతాయి.
 
       వినియోగదారులు వేర్వేరు పరికరాల్లో ప్రింటర్‌లను కాన్ఫిగర్ చేసే విషయంలో ఈ విధానం ఎలాంటి ప్రభావం చూపదు.  ఇది వేర్వేరు వినియోగదారులు ప్రింటర్‌ల కాన్ఫిగరేషన్‌కు అనుబంధంగా ఉండేలా ఉద్దేశించినది.
 
-      Active Directory నిర్వాహిత పరికరాల కోసం, ఈ విధానం Active Directory మెషిన్ పేరు లేదా దాని సబ్‌స్ట్రింగ్‌కు ఉండేలా<ph name="MACHINE_NAME_VARIABLE" /> విస్తరణకు మద్దతిస్తుంది. ఉదాహరణకు, మెషిన్ పేరు <ph name="MACHINE_NAME_EXAMPLE" /> అయితే, ఆపై <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> అనేది 6వ స్థానం తర్వాతి నుండి ప్రారంభమై 4 అక్షరాలు ఉంటుంది, అంటే<ph name="MACHINE_NAME_PART_EXAMPLE" />. స్థానం శూన్య-ఆధారితమని గుర్తుంచుకోండి.
+      Active Directory నిర్వాహిత పరికరాలకు సంబంధించి, <ph name="MACHINE_NAME_VARIABLE" />ను Active Directory మెషిన్ పేరుకు లేదా దాని సబ్‌స్ట్రింగ్‌కు విస్తరించగలిగేలా ఈ విధానం మద్దతిస్తుంది. ఉదాహరణకు, మెషిన్ పేరు <ph name="MACHINE_NAME_EXAMPLE" /> అయితే, ఆపై <ph name="MACHINE_NAME_VARIABLE_EXAMPLE" /> అనేది 6వ స్థానం తర్వాతి 4 అక్షరాలు, అంటే <ph name="MACHINE_NAME_PART_EXAMPLE" />తో.భర్తీ చేయబడుతుంది. స్థానం శూన్య-ఆధారితమని గుర్తుంచుకోండి.
       </translation>
 <translation id="3072045631333522102">రిటైల్ మోడ్‌లో సైన్-ఇన్ స్క్రీన్‌లో ఉపయోగించాల్సిన స్క్రీన్ సేవర్</translation>
 <translation id="3072847235228302527">పరికరం-స్థానిక ఖాతా కోసం సేవా నిబంధనలను సెట్ చేయడం</translation>
@@ -1636,8 +1625,8 @@
       ఈ విధానాన్ని 'తప్పు'గా సెట్ చేస్తే, వినియోగదారు ఆఫర్‌లను రిడీమ్ చేయలేరు.</translation>
 <translation id="4008233182078913897">వినియోగదారు ప్రమేయం లేకుండా నిశ్శబ్దంగా ఇన్‌స్టాల్ చేయబడే యాప్‌లు,
           ఎక్స్‌టెన్షన్‌ల జాబితాను పేర్కొంటుంది, వీటిని వినియోగదారు అన్‌ఇన్‌స్టాల్ చేయలేరు
-          లేదా నిలిపివేయలేరు. యాప్‌లు/ఎక్స్‌టెన్షన్‌ల ద్వారా
-          అభ్యర్థించిన అన్ని అనుమతులు వినియోగదారు ప్రమేయం లేకుండానే పరిపూర్ణముగా మంజూరు చేయబడతాయి,
+          లేదా నిలిపివేయలేరు. యాప్‌లు/ఎక్స్‌టెన్షన్‌లు
+          అభ్యర్థించే అన్ని అనుమతులు వినియోగదారు ప్రమేయం లేకుండానే ఆటోమేటిక్‌గా మంజూరు చేయబడతాయి,
           అలాగే యాప్/ఎక్స్‌టెన్షన్ యొక్క భవిష్యత్ వెర్షన్‌లు అభ్యర్థించే
           ఏవైనా అదనపు అనుమతులు ఇవ్వబడతాయి. ఇంకా, enterprise.deviceAttributes మరియు
           enterprise.platformKeys ఎక్స్‌టెన్షన్ APIల కోసం అనుమతులు
@@ -1646,9 +1635,9 @@
 
           ఒకవేళ ఈ విధానానికి విరుద్ధంగా <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> విధానం ఉన్నా, ఇదే ప్రాధాన్యమైనదిగా పరిగణించబడుతుంది. మునుపు నిర్బంధంగా ఇన్‌స్టాల్ చేయబడిన యాప్‌ లేదా ఎక్స్‌టెన్షన్‌ ఈ జాబితా నుండి తీసివేయబడితే, అది <ph name="PRODUCT_NAME" /> ద్వారా ఆటోమేటిక్‌గా అన్ఇన్‌స్టాల్ చేయబడుతుంది.
 
-          <ph name="MS_AD_NAME" /> డొమైన్‌కు చేర్చని Windows సందర్భాల కోసం, నిర్బంధ ఇన్‌స్టాలేషన్ Chrome వెబ్ స్టోర్‌లో జాబితా చేయబడిన యాప్‌లు, ఎక్స్‌టెన్షన్‌లకు పరిమితం చేయబడుతుంది.
+          <ph name="MS_AD_NAME" /> డొమైన్‌కు చేర్చని Windows సందర్భాల కోసం, నిర్బంధ ఇన్‌స్టాలేషన్ అనేది, Chrome వెబ్ స్టోర్‌లో జాబితా చేయబడిన యాప్‌లు, ఎక్స్‌టెన్షన్‌లకు పరిమితం చేయబడుతుంది.
 
-          ఏదైనా ఎక్స్‌టెన్షన్‌ యొక్క సోర్స్ కోడ్‌ను డెవలపర్ సాధనాల ద్వారా వినియోగదారులు మార్చవచ్చని గుర్తుంచుకోండి (ఎక్స్‌టెన్షన్‌ను పని చేయకుండా మార్చడం లాంటి అవకాశం ఉంటుంది). ఇదే సమస్య అయితే, <ph name="DEVELOPER_TOOLS_POLICY_NAME" /> విధానాన్ని సెట్ చేయాలి.
+          ఏదైనా ఎక్స్‌టెన్షన్‌ యొక్క సోర్స్ కోడ్‌ను డెవలపర్ సాధనాల ద్వారా వినియోగదారులు మార్చవచ్చని గుర్తుంచుకోండి (ఎక్స్‌టెన్షన్‌ను పని చేయకుండా మార్చడం లాంటివి చేయడానికి అవకాశం ఉంటుంది). ఇదే సమస్య అయితే, <ph name="DEVELOPER_TOOLS_POLICY_NAME" /> విధానాన్ని సెట్ చేయాలి.
 
           విధానంలోని ప్రతి జాబితా అంశం సెమీకోలన్ (<ph name="SEMICOLON" />) ద్వారా వేరు చేయబడిన ఎక్స్‌టెన్షన్‌ ID, "అప్‌డేట్" URLను కలిగి ఉండే స్ట్రింగ్. ఉదాహరణకు, డెవలపర్ మోడ్‌లో ఉన్నప్పుడు <ph name="CHROME_EXTENSIONS_LINK" />లో కనుగొనబడే 32-అక్షరాల స్ట్రింగ్‌ను ఎక్స్‌టెన్షన్ ID అంటారు. "అప్‌డేట్" URL పేర్కొన్నట్లయితే, అది<ph name="LINK_TO_EXTENSION_DOC1" />లో వివరించినట్లుగా అప్‌డేట్ మానిఫెస్ట్ XML పత్రాన్ని సూచించేలా ఉండాలి. డిఫాల్ట్‌గా, Chrome వెబ్ స్టోర్ యొక్క అప్‌డేట్ URL ఉపయోగించబడుతుంది (ప్రస్తుతం ఉన్నది, "https://clients2.google.com/service/update2/crx"). ఈ విధానంలో సెట్ చేసిన "అప్‌డేట్" URL ప్రాథమిక ఇన్‌స్టాలేషన్ కోసం మాత్రమే ఉపయోగించబడుతుందని; ఎక్స్‌టెన్షన్ యొక్క తర్వాతి అప్‌డేట్‌ల కోసం ఎక్స్‌టెన్షన్ మానిఫెస్ట్‌లో సూచించిన అప్‌డేట్ URL ఉపయోగించబడుతుందని గుర్తుంచుకోండి. అలాగే, వెర్షన్ 67తో పాటుగా అప్పటి వరకు ఉన్న <ph name="PRODUCT_NAME" /> వెర్షన్‌లలో "అప్‌డేట్" URLను ప్రత్యేకంగా పేర్కొనడం తప్పనిసరి అని గుర్తుంచుకోండి.
 
@@ -1704,31 +1693,6 @@
       SAMLని ఉపయోగించి అధికార మంజూరు చేయబడే వినియోగదారులపై మాత్రమే ఈ విధానం ప్రభావం చూపుతుంది.</translation>
 <translation id="4105989332710272578">జాబితాలోని URLల కోసం ప్రమాణపత్రం పారదర్శకత అమలును నిలిపివేయండి</translation>
 <translation id="4121350739760194865">యాప్ ప్రచారాలు కొత్త ట్యాబ్ పేజీలో కనిపించడాన్ని నిరోధించండి</translation>
-<translation id="4125606414556046117">ఈ విధానం వినియోగదారు కోసం డెస్క్‌టాప్‌పై మరియు లాగిన్ స్క్రీన్ నేపథ్యంలో చూపబడే వాల్‌పేపర్ చిత్రాన్ని కాన్ఫిగర్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. <ph name="PRODUCT_OS_NAME" /> వాల్‌పేపర్ చిత్రాన్ని డౌన్‌లోడ్ చేసుకోగల URLను పేర్కొనడం ద్వారా విధానం సెట్ చేయబడుతుంది, డౌన్‌లోడ్‌ను ధృవీకరించడానికి క్రిప్టోగ్రాఫిక్ హాష్ ఉపయోగించబడుతుంది. చిత్రం తప్పనిసరిగా JPEG ఫార్మాట్‌లో ఉండాలి, దీని పరిమాణం 16MB మించకూడదు. URL తప్పనిసరిగా ఎటువంటి ప్రమాణీకరణ లేకుండా యాక్సెస్ చేసే విధంగా ఉండాలి.
-
-వాల్‌పేపర్ చిత్రం డౌన్‌లోడ్ చేయబడి కాష్ చేయబడుతుంది. URL లేదా హాష్ మారినప్పుడల్లా అది మళ్లీ డౌన్‌లోడ్ చేయబడుతుంది.
-
-విధానాన్ని కింది స్కీమాకు కట్టుబడి ఉండే విధంగా JSON ఫార్మాట్‌లో URL మరియు హాష్‌ను వ్యక్తపరిచే స్ట్రింగ్ రూపంలో పేర్కొనాలి:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "వాల్‌పేపర్‌ చిత్రాన్ని డౌన్‌లోడ్ చేయగల URL.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "వాల్‌పేపర్‌ చిత్రం యొక్క SHA-256 హాష్.",
-            "type": "string"
-          }
-        }
-      }
-
-ఈ విధానాన్ని సెట్ చేస్తే, <ph name="PRODUCT_OS_NAME" /> వాల్‌పేపర్‌ చిత్రాన్ని డౌన్‌లోడ్ చేసి ఉపయోగిస్తుంది.
-
-      
-మీరు ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారులు దీనిని మార్చలేరు లేదా భర్తీ చేయలేరు.
-
-విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, వినియోగదారు డెస్క్‌టాప్‌పై మరియు లాగిన్ స్క్రీన్ నేపథ్యంలో ప్రదర్శించడం కోసం చిత్రాన్ని ఎంచుకోవచ్చు.</translation>
 <translation id="412697421478384751">లాక్ స్క్రీన్‌ పిన్‌కు వినియోగదారులు బలహీనమైన పిన్‌లను సెట్ చేయగలిగేలా అనుమతించండి</translation>
 <translation id="4138655880188755661">సమయ పరిమితి</translation>
 <translation id="4144164749344898721">ఈ విధానం వినియోగదారు ఇన్‌యాక్టివ్‌గా ఉన్నప్పుడు అమలు చేయాల్సిన పవర్ నిర్వహణ వ్యూహ రచనకు సంబంధించిన బహుళ సెట్టింగ్‌లను నియంత్రిస్తుంది.
@@ -2649,53 +2613,6 @@
 
       ఈ విధానాన్ని సెట్ చేయకపోతే లేదా 'తప్పు'గా సెట్ చేస్తే, ముద్రణ ఆదేశాలు ముద్రణ ప్రివ్యూ స్క్రీన్‌ను ప్రారంభిస్తాయి.</translation>
 <translation id="6022948604095165524">స్టార్ట‌ప్‌లో చర్య</translation>
-<translation id="6023030044732320798">ARC అమలు సమయానికి సంకలనం చేయబడే విధానాల సెట్‌ను పేర్కొంటుంది. విలువ అనేది, తప్పకుండా చెల్లుబాటయ్యే JSON రకం అయ్యి ఉండాలి.
-
-      ఈ విధానాన్ని ఉపయోగించడం ద్వారా పరికరంలో ఏయే Android యాప్‌లు ఆటోమేటిక్‌గా ఇన్‌స్టాల్ కావాలో కాన్ఫిగర్ చేయవచ్చు:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android app identifier, e.g. "com.google.android.gm" for Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Specifies how an app is installed. OPTIONAL: The app is not installed automatically, but the user can install it. This is the default if this policy is not specified. PRELOAD: The app is installed automatically, but the user can uninstall it. FORCE_INSTALLED: The app is installed automatically and the user cannot uninstall it. BLOCKED: The app is blocked and cannot be installed. If the app was installed under a previous policy it will be uninstalled.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Policy for granting permission requests to apps. PERMISSION_POLICY_UNSPECIFIED: Policy not specified. If no policy is specified for a permission at any level, then the `PROMPT` behavior is used by default. PROMPT: Prompt the user to grant a permission. GRANT: Automatically grant a permission. DENY: Automatically deny a permission.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "App-specific JSON configuration object with a set of key-value pairs, e.g. '"managedConfiguration": { "key1": value1, "key2": value2 }'. The keys are defined in the app manifest.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      యాప్‌లను లాంచర్‌కు పిన్ చేసేందుకు, PinnedLauncherApps చూడండి.</translation>
 <translation id="602728333950205286">డిఫాల్ట్ శోధన ప్రదాత తక్షణ URL</translation>
 <translation id="603410445099326293">POSTని ఉపయోగించే సూచన URL కోసం పరామితులు</translation>
 <translation id="6034341625190551415">పబ్లిక్ సెషన్, కియోస్క్ ఖాతా రకాలను నియంత్రిస్తుంది.</translation>
@@ -3039,37 +2956,6 @@
       ఈ విధానాన్ని తప్పుకు సెట్ చేస్తే, అంతర్నిర్మిత DNS క్లయింట్ ఎన్నడూ ఉపయోగించబడదు.
 
       ఈ విధానాన్ని సెట్ చేయకుండా వదిలిపెడితే, అంతర్నిర్మిత DNS క్లయింట్ MacOS, Android (ప్రైవేట్ DNS లేదా VPN ఏదీ ప్రారంభించనప్పుడు), ChromeOSలో డిఫాల్ట్‌గా ప్రారంభించబడుతుంది, అలాగే వినియోగాదరులు chrome://flags సవరించడం లేదా ఆదేశ-పంక్తి ఫ్లాగ్‌ను పేర్కొనడం ద్వారా వినియోగదారులు అంతర్నిర్మిత DNS క్లయింట్‌ను ఉపయోగించాలో లేదో మార్చగలరు.</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> డిఫాల్ట్ ప్రింటర్ ఎంపిక నియమాలను భర్తీ చేస్తుంది.
-
-      ఈ విధానం <ph name="PRODUCT_NAME" />లో డిఫాల్ట్ ప్రింటర్‌ను ఎంచుకోవడం కోసం నియమాలను నిశ్చయిస్తుంది, ప్రొఫైల్‌తో ముద్రణ విధిని ఉపయోగించే మొదటిసారి ఇది జరుగుతుంది.
-
-      ఈ విధానాన్ని సెట్ చేసినప్పుడు, <ph name="PRODUCT_NAME" /> పేర్కొన్న అన్ని లక్షణాలకు సరిపోలే ప్రింటర్‌ను కనుగొనడానికి ప్రయత్నిస్తుంది మరియు దాన్ని డిఫాల్ట్ ప్రింటర్‌గా ఎంచుకుంటుంది. విధానానికి సరిపోలుతున్నట్లు కనుగొనబడిన మొదటి ప్రింటర్ ఎంచుకోబడుతుంది, విశిష్ఠంగా ఏదీ సరిపోలనప్పుడు ప్రింటర్‌లు కనుగొనబడిన క్రమం ఆధారంగా ఏ సరిపోలే ప్రింటర్ అయినా ఎంచుకోబడుతుంది.
-
-      ఈ విధానాన్ని సెట్ చేయకుంటే లేదా గడువు సమయంలోపు సరిపోలే ప్రింటర్ ఏదీ కనుగొనబడకపోతే, అంతర్నిర్మిత PDF ప్రింటర్ డిఫాల్ట్ ప్రింటర్‌గా చేయబడుతుంది లేదా PDF ప్రింటర్ కూడా అందుబాటులో లేకుంటే, ప్రింటర్ ఏదీ ఎంచుకోబడదు.
-
-      విలువ కింది స్కీమాకు అనుగుణంగా JSON ఆబ్జెక్ట్‌గా అన్వయించబడుతుంది:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "సరిపోలే ప్రింటర్ శోధనను నిర్దిష్ట ప్రింటర్‌ల సెట్‌కు పరిమితం చేయాలో లేదో నిశ్చయిస్తుంది.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "ప్రింటర్ idకి సరిపోలే రెగ్యులర్ ఎక్స్‌ప్రెషన్.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "ప్రింటర్ ప్రదర్శన పేరుకు సరిపోలే రెగ్యులర్ ఎక్స్‌ప్రెషన్.",
-            "type": "string"
-          }
-        }
-      }
-
-      <ph name="CLOUD_PRINT_NAME" />కి కనెక్ట్ చేసిన ప్రింటర్‌లు <ph name="PRINTER_TYPE_CLOUD" />గా పరిగణించబడతాయి, మిగిలిన ప్రింటర్‌లు <ph name="PRINTER_TYPE_LOCAL" />గా వర్గీకరించబడతాయి.
-      ఒక ఫీల్డ్‌ను తీసివేస్తే అన్ని విలువలు సరిపోలతాయి, ఉదాహరణకు, కనెక్టివిటీని పేర్కొనకపోతే తత్ఫలితంగా ముద్రణ ప్రివ్యూలో స్థానికంగా మరియు క్లౌడ్‌గా పరిగణించే అన్ని రకాల ప్రింటర్‌లు కనుగొనబడేలా చేయబడుతుంది.
-      రెగ్యులర్ ఎక్స్‌ప్రెషన్ ఆకృతులు తప్పనిసరిగా JavaScript RegExp సింటాక్స్‌ను అనుసరించాలి మరియు సరిపోలికలు కేస్ సెన్సిటివ్‌గా ఉంటాయి.</translation>
 <translation id="6843296367238757293">ఈ విధానం నిలిపివేయబడింది. దీని వినియోగానికి ప్రోత్సాహం అందించబడదు. https://support.google.com/chrome/a/answer/7643500లో మరింత చదవండి</translation>
 <translation id="684856667300805181">ఈ విధానం <ph name="PRODUCT_NAME" /> 68లో తీసివేయబడింది మరియు <ph name="ARC_GLS_POLICY_NAME" /> ద్వారా భర్తీ చేయబడింది.</translation>
 <translation id="6856743875250214792">ఈ విధానం M66లో విస్మరించబడి తీసివేయబడుతుంది, ఎందుకంటే అది కేవలం అంతర్గత పరీక్షకు మాత్రమే ఉపయోగించబడుతుంది మరియు అది భద్రతా సంబంధిత అంశం.
@@ -4214,30 +4100,6 @@
 ఈ విధానం SAMLను ఉపయోగించి ప్రామాణీకరించబడిన వినియోగదారులను మాత్రమే ప్రభావితం చేస్తుంది.
 
 విధానం విలువను సెకన్లలో పేర్కొనాలి.</translation>
-<translation id="9027787254195333560">ఈ విధానం లాగిన్ స్క్రీన్‌లో వినియోగదారును సూచించే అవతార్ చిత్రాన్ని కాన్ఫిగర్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. <ph name="PRODUCT_OS_NAME" /> అవతార్ చిత్రాన్ని ఏ URL నుండి డౌన్‌లోడ్ చేయాలో పేర్కొనడం ద్వారా విధానం సెట్ చేయబడుతుంది మరియు డౌన్‌లోడ్ సమగ్రతను ధృవీకరించడానికి క్రిప్టోగ్రాఫిక్ హాష్ ఉపయోగించబడుతుంది. చిత్రం తప్పనిసరిగా JPEG ఫార్మాట్‌లో ఉండాలి, దీని పరిమాణం 512kB మించకూడదు. URL తప్పనిసరిగా ఎటువంటి ప్రమాణీకరణ లేకుండానే యాక్సెస్ చేయగలిగేలా ఉండాలి.
-
-అవతార్ చిత్రం డౌన్‌లోడ్ చేయబడి, కాష్ చేయబడుతుంది. URL లేదా హాష్ మారిన ప్రతిసారి ఇది మళ్లీ డౌన్‌లోడ్ చేయబడుతుంది.
-
-విధానం కింది స్కీమాకు అనుగుణంగా ఉంటూ URL మరియు హాష్‌ను JSON ఫార్మాట్‌లో వ్యక్తపరిచే స్ట్రింగ్ రూపంలో పేర్కొనాలి:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "అవతార్ చిత్రాన్ని డౌన్‌లోడ్ చేయాల్సిన URL.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "అవతార్ చిత్రం యొక్క SHA-256 హాష్.",
-            "type": "string"
-          }
-        }
-      }
-
-ఈ విధానాన్ని సెట్ చేస్తే, <ph name="PRODUCT_OS_NAME" /> అవతార్ చిత్రాన్ని డౌన్‌లోడ్ చేసి, ఉపయోగిస్తుంది.
-
-మీరు ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారులు దీనిని మార్చలేరు లేదా భర్తీ చేయలేరు.
-
-విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, వినియోగదారు లాగిన్ స్క్రీన్‌పై వారిని సూచించే అవతార్ చిత్రాన్ని ఎంచుకోవచ్చు.</translation>
 <translation id="9035964157729712237">ఆమోదంకానిజాబితా నుండి మినహాయింపుకి పొడిగింపు IDలు</translation>
 <translation id="9038058011835642205">వినియోగదారుని ప్రమేయం లేకుండా నిశ్శబ్దంగా ఇన్‌స్టాల్ అయిన వెబ్‌సైట్‌ల జాబితాను పేర్కొంటుంది, అలాగే వీటిని వినియోగదారు అన్‌ఇన్‌స్టాల్ చేయలేరు లేదా నిలిపివేయలేరు.
 
@@ -4250,7 +4112,6 @@
 మీరు ఈ విధానాన్ని సెట్ చేస్తే, వినియోగదారులు దీన్ని మార్చలేరు లేదా అధిగ‌మించ‌లేరు.
 
 విధానం విలువను మిల్లీసెకన్లలో పేర్కొనాలి. విలువలు 30 సెకన్ల నుండి 24 గంటల పరిధికి పరిమితి చేయబడ్డాయి.</translation>
-<translation id="9042911395677044526"><ph name="PRODUCT_OS_NAME" /> పరికరానికి ఒక్కో వినియోగదారుకు వర్తించడానికి నెట్‌వర్క్ కాన్ఫిగరేషన్‌ను సెట్ చేయడానికి అనుమతిస్తుంది. నెట్‌వర్క్ కాన్ఫిగరేషన్ అనేది <ph name="ONC_SPEC_URL" />లో వివరించిన విధంగా తెరిచిన నెట్‌వర్క్ కాన్ఫిగరేషన్ ఫార్మాట్‌ ద్వారా నిర్వించిన JSON-ఫార్మాటింగ్ స్ట్రింగ్</translation>
 <translation id="9050853837490399534">పరికరాన్ని క్విక్ ఫిక్స్ బిల్డ్‌కు అప్‌డేట్ చేయాలో లేదో ఈ విధానం నియంత్రిస్తుంది.
 
       ఒకవేళ విధాన విలువను క్విక్ ఫిక్స్ బిల్డ్‌కు మ్యాప్ చేసే టోకెన్‌కు సెట్ చేస్తే, మరొక విధానం ద్వారా అప్‌డేట్ బ్లాక్ కాకుండా ఉన్న పక్షంలో పరికరం సంబంధిత క్విక్ ఫిక్స్ బిల్డ్‌కు అప్‌డేట్ చేయబడుతుంది.
@@ -4323,17 +4184,6 @@
 విధానాన్ని తప్పుకు సెట్ చేస్తే, 'శీర్షికలు మరియు ఫుటర్లు' ముద్రణ ప్రివ్యూ డైలాగ్‌లో ఎంచుకోబడదు మరియు వినియోగదారు దీన్ని మార్చలేరు.
 
 విధానాన్ని ఒప్పుకు సెట్ చేస్తే, 'శీర్షికలు మరియు ఫుటర్లు' ముద్రణ ప్రివ్యూ డైలాగ్‌లో ఎంపిక చేయబడుతుంది మరియు వినియోగదారు దీన్ని మార్చలేరు.</translation>
-<translation id="9213347477683611358">పరికరంలోకి ఏ వినియోగదారూ ఇంకా సైన్ ఇన్ చేయనట్లయితే, లాగిన్ స్క్రీన్‌పై చూపబడే పరికర-స్థాయి వాల్‌పేపర్ చిత్రాన్ని కాన్ఫిగర్ చేస్తుంది. విధానం Chrome OS పరికరం వాల్‌పేపర్‌ చిత్రాన్ని డౌన్‌లోడ్ చేయగల URLను మరియు డౌన్‌లోడ్ సమగ్రతను ధృవీకరించడానికి క్రిప్టోగ్రాఫిక్ హ్యాష్‌ను పేర్కొనడం ద్వారా సెట్ చేయబడుతుంది. చిత్రం తప్పనిసరిగా JPEG ఫార్మాట్‌లో ఉండాలి, దీని పరిమాణం 16MB మించకూడదు. URL తప్పనిసరిగా ఎటువంటి ప్రామాణీకరణ లేకుండానే యాక్సెస్ చేయగలిగేలా ఉండాలి. వాల్‌పేపర్ చిత్రం డౌన్‌లోడ్ చేయబడి, కాష్ చేయబడుతుంది. URL లేదా హ్యాష్ మారినప్పుడల్లా మళ్లీ డౌన్‌లోడ్ చేయబడుతుంది.
-
-      విధానాన్ని URL మరియు హ్యాష్‌ను JSON ఫార్మాట్‌లో వ్యక్తపరిచే స్ట్రింగ్ లాగా పేర్కొనాలి, ఉదా.,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      పరికరం వాల్‌పేపర్ విధానాన్ని సెట్ చేస్తే, పరికరంలోకి ఏ వినియోగదారు ఇంకా సైన్ ఇన్ చేయనప్పుడు Chrome OS పరికరం లాగిన్ స్క్రీన్‌పై ఉండే వాల్‌పేపర్ చిత్రాన్ని డౌన్‌లోడ్ చేసి, ఉపయోగిస్తుంది. వినియోగదారు లాగిన్ అయిన తర్వాత, వినియోగదారు వాల్‌పేపర్ విధానం అమలులోకి వస్తుంది.
-
-      పరికరం వాల్‌పేపర్ విధానం సెట్ చేయకుంటే, వినియోగదారు యొక్క వాల్‌పేపర్ విధానం సెట్ చేయబడినప్పుడు ఏమి చూపాలి అనేది వినియోగదారు యొక్క వాల్‌పేపర్ విధానంపై ఆధారపడి ఉంటుంది.</translation>
 <translation id="9217154963008402249">పర్యవేక్షిత నెట్‌వర్క్ ప్యాకెట్‌ల సమయ వ్యవధి</translation>
 <translation id="922540222991413931">ఎక్స్‌టెన్ష‌న్‌ను, యాప్‌ను మరియు వినియోగదారు స్క్రిప్ట్ ఇన్‌స్టాల్ సోర్స్‌లను కాన్ఫిగర్ చేయండి</translation>
 <translation id="924557436754151212">మొదటి అమలులోనే డిఫాల్ట్ బ్రౌజర్ నుండి సేవ్ చేయబడిన పాస్‌వర్డ్‌లను దిగుమతి చేయి</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index c972edb..ba8a93e 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -407,7 +407,6 @@
 
       คำเตือน: เราไม่แนะนำให้มอบสิทธิ์การควบคุมเวอร์ชันของ <ph name="PRODUCT_OS_NAME" /> ให้แก่แอปคีออสก์เพราะอาจทำให้อุปกรณ์ไม่สามารถรับการอัปเดตซอฟต์แวร์และการปรับปรุงความปลอดภัยที่สำคัญได้ การมอบสิทธิ์การควบคุมเวอร์ชันของ <ph name="PRODUCT_OS_NAME" /> อาจทำให้ผู้ใช้มีความเสี่ยง</translation>
 <translation id="1675002386741412210">ได้รับการสนับสนุนบน:</translation>
-<translation id="1689963000958717134">อนุญาตให้ใช้การกำหนดค่าเครือข่ายแบบพุชสำหรับผู้ใช้ทั้งหมดของอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> การกำหนดค่าเครือข่ายจะเป็นสตริงรูปแบบ JSON ตามที่กำหนดโดยรูปแบบการกำหนดค่าเครือข่ายแบบเปิดซึ่งอธิบายไว้ที่ <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">กำหนดค่าความพร้อมใช้งานและลักษณะการทำงานของฟังก์ชันอัปเดตเฟิร์มแวร์ <ph name="TPM_FIRMWARE_UPDATE_TPM" />
 
       ระบุการตั้งค่าแต่ละรายการในคุณสมบัติ JSON ได้ดังนี้
@@ -943,16 +942,6 @@
       หากปิดใช้งานการตั้งค่านี้ หน้าเว็บจะไม่สามารถใช้ JavaScript และผู้ใช้จะไม่สามารถเปลี่ยนการตั้งค่านั้นได้
 
       หากเปิดใช้งานการตั้งค่านี้หรือไม่ได้ตั้งค่า หน้าเว็บจะสามารถใช้ JavaScript แต่ผู้ใช้สามารถเปลี่ยนการตั้งค่านั้นได้</translation>
-<translation id="2747157663401642394">กำหนดการตั้งค่าการจัดการส่วนขยายของ <ph name="PRODUCT_NAME" />
-
-          นโยบายนี้จะควบคุมการตั้งค่าหลายรายการ รวมถึงการตั้งค่าที่ควบคุมโดยนโยบายปัจจุบันที่เกี่ยวข้องกับส่วนขยาย นโยบายนี้จะลบล้างนโยบายเดิมหากมีการตั้งค่าทั้ง 2 นโยบาย
-
-          นโยบายนี้จะจับคู่รหัสส่วนขยายหรือ URL การอัปเดตกับการกำหนดค่าของรายการนั้นๆ เมื่อใช้รหัสส่วนขยาย ระบบจะใช้การกำหนดค่ากับส่วนขยายที่ระบุไว้เท่านั้น คุณกำหนดค่าเริ่มต้นสำหรับรหัสพิเศษ <ph name="DEFAULT_SCOPE" /> ได้ ซึ่งระบบจะใช้กับส่วนขยายทั้งหมดที่คุณไม่ได้กำหนดค่าเองในนโยบายนี้ เมื่อใช้ URL การอัปเดต ระบบจะใช้การกำหนดค่ากับส่วนขยายทั้งหมดที่มี URL การอัปเดตตรงกับที่ระบุไว้ในไฟล์ Manifest ของส่วนขยายนี้ ตามที่อธิบายไว้ใน <ph name="LINK_TO_EXTENSION_DOC1" />
-
-          สำหรับอินสแตนซ์ Windows ที่ไม่ได้เข้าร่วมในโดเมน <ph name="MS_AD_NAME" /> การติดตั้งที่บังคับจะจำกัดอยู่ที่แอปและส่วนขยายที่แสดงอยู่ใน Chrome เว็บสโตร์เท่านั้น
-
-          หากต้องการดูคำอธิบายแบบเต็มของการตั้งค่าที่เป็นไปได้และโครงสร้างของนโยบายนี้ โปรดไปที่ https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">จำกัดช่วงของพอร์ต UDP ในเครื่องที่ WebRTC ใช้งาน</translation>
 <translation id="2757054304033424106">ประเภทของส่วนขยาย/แอปพลิเคชันที่ได้รับอนุญาตให้ติดตั้ง</translation>
 <translation id="2758084448533744848">ระบุเขตเวลาที่กำหนดให้ใช้กับอุปกรณ์ เมื่อตั้งค่านโยบายนี้ ผู้ใช้อุปกรณ์จะลบล้างเขตเวลาที่ระบุไว้ไม่ได้ หากระบุค่าไม่ถูกต้อง ระบบจะยังคงเปิดใช้นโยบายแต่ใช้เขตเวลา "GMT" แทน หากค่าเป็นสตริงว่าง ระบบจะเพิกเฉยนโยบายนี้
@@ -1699,30 +1688,6 @@
       นโยบายนี้ส่งผลกับผู้ใช้ที่ยืนยันตัวตนโดยใช้ SAML เท่านั้น</translation>
 <translation id="4105989332710272578">ปิดการบังคับใช้ความโปร่งใสของใบรับรองสำหรับรายการ URL</translation>
 <translation id="4121350739760194865">ป้องกันไม่ให้การส่งเสริมของแอปพลิเคชันไปปรากฏบนหน้าแท็บใหม่</translation>
-<translation id="4125606414556046117">นโยบายนี้ให้คุณกำหนดค่ารูปภาพวอลเปเปอร์ที่แสดงในเดสก์ท็อปและในพื้นหลังของหน้าจอเข้าสู่ระบบของผู้ใช้ นโยบายนี้กำหนดได้ด้วยการระบุ URL ที่ <ph name="PRODUCT_OS_NAME" /> สามารถดาวน์โหลดรูปภาพวอลเปเปอร์และการแฮชแบบเข้ารหัสที่ใช้ในการยืนยันความสมบูรณ์ของการดาวน์โหลด รูปภาพต้องอยู่ในรูปแบบ JPEG และมีขนาดไม่เกิน 16 MB ส่วน URL ก็ต้องเข้าถึงได้โดยไม่ต้องตรวจสอบสิทธิ์
-
-      ระบบจะดาวน์โหลดและแคชรูปภาพวอลเปเปอร์ แล้วจะดาวน์โหลดอีกครั้งเมื่อ URL หรือแฮชมีการเปลี่ยนแปลง
-
-      นโยบายนี้ควรกำหนดเป็นสตริงที่แสดง URL และแฮชในรูปแบบ JSON ที่สอดคล้องกับรูปแบบต่อไปนี้
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL ที่ระบบไปดาวน์โหลดรูปภาพวอลเปเปอร์ได้",
-            "type": "string"
-          },
-          "hash": {
-            "description": "แฮช SHA-256 ของรูปภาพวอลเปเปอร์",
-            "type": "string"
-          }
-        }
-      }
-
-      หากตั้งค่านโยบายนี้ไว้ <ph name="PRODUCT_OS_NAME" /> จะดาวน์โหลดและใช้รูปภาพวอลเปเปอร์
-
-      หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะแก้ไขหรือลบล้างนโยบายไม่ได้
-
-      หากไม่ได้ตั้งค่านโยบาย ผู้ใช้จะเลือกรูปภาพที่จะให้ปรากฏในเดสก์ท็อปและในพื้นหลังของหน้าจอเข้าสู่ระบบได้</translation>
 <translation id="412697421478384751">ยอมให้ผู้ใช้ตั้ง PIN ที่คาดเดาง่ายเป็น PIN หน้าจอล็อก</translation>
 <translation id="4138655880188755661">การจำกัดเวลา</translation>
 <translation id="4144164749344898721">นโยบายนี้ควบคุมการตั้งค่าหลายอย่างสำหรับกลยุทธ์การจัดการพลังงานเมื่อผู้ใช้ไม่ใช้งาน
@@ -2638,53 +2603,6 @@
 
       หากไม่ได้ตั้งค่านโยบายนี้หรือตั้งค่าเป็นเท็จ คำสั่งพิมพ์จะเรียกหน้าตัวอย่างการพิมพ์ขึ้นมา</translation>
 <translation id="6022948604095165524">การดำเนินการเมื่อเริ่มต้นใช้งาน</translation>
-<translation id="6023030044732320798">ระบุชุดนโยบายที่จะส่งไปยังรันไทม์ของ ARC โดยค่าต้องเป็น JSON ที่ถูกต้อง
-
-      นโยบายนี้ใช้กำหนดแอป Android ที่อนุญาตให้ติดตั้งในอุปกรณ์โดยอัตโนมัติ:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "ตัวระบุแอป Android เช่น "com.google.android.gm" สำหรับ Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "ระบุวิธีติดตั้งแอป  OPTIONAL: หากไม่มีการระบุนโยบาย ค่าเริ่มต้นคือระบบจะไม่ติดตั้งแอปโดยอัตโนมัติ แต่ผู้ใช้ติดตั้งเองได้ PRELOAD: ระบบติดตั้งแอปโดยอัตโนมัติ แต่ผู้ใช้ถอนการติดตั้งได้ FORCE_INSTALLED: ระบบติดตั้งแอปโดยอัตโนมัติและผู้ใช้ถอนการติดตั้งไม่ได้ BLOCKED: แอปถูกบล็อกและติดตั้งไม่ได้ แอปที่ติดตั้งมาตั้งแต่นโยบายก่อนหน้านี้จะถูกถอนการติดตั้ง",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "นโยบายสำหรับการอนุมัติคำขอสิทธิ์เข้าถึงแอป PERMISSION_POLICY_UNSPECIFIED: ไม่มีการระบุนโยบายสำหรับสิทธิ์ในทุกระดับ จึงใช้การทำงาน `PROMPT` โดยค่าเริ่มต้น PROMPT: แจ้งให้ผู้ใช้ให้สิทธิ์ GRANT: ให้สิทธิ์โดยอัตโนมัติ DENY: ปฏิเสธสิทธิ์โดยอัตโนมัติ",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "อ็อบเจกต์การกำหนดค่า JSON เฉพาะแอปที่มีชุดของคู่คีย์-ค่า เช่น "'managedConfiguration": { "key1": value1, "key2": value2 }' คียต่างๆ มีการกำหนดไว้ในไฟล์ Manifest ของแอป",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      หากต้องการตรึงแอปไว้ที่ Launcher โปรดดู PinnedLauncherApps</translation>
 <translation id="602728333950205286">URL ค้นหาทันใจของผู้ให้บริการการค้นหาเริ่มต้น</translation>
 <translation id="603410445099326293">พารามิเตอร์สำหรับการแนะนำ URL ที่ใช้ POST</translation>
 <translation id="6034341625190551415">ควบคุมเซสชันสาธารณะและประเภทบัญชีคีออสก์</translation>
@@ -3032,37 +2950,6 @@
       หากตั้งค่านโยบายนี้เป็น "เท็จ" จะไม่มีการใช้ไคลเอ็นต์ DNS ในตัว
 
       หากไม่มีการตั้งค่านโยบายนี้ ไคลเอ็นต์ DNS ในตัวจะเปิดใช้โดยค่าเริ่มต้นใน MacOS, Android (เมื่อปิดใช้ทั้ง DNS ส่วนตัวและ VPN) และ ChromeOS และผู้ใช้จะเปลี่ยนได้ว่าจะใช้ไคลเอ็นต์ DNS ในตัวหรือไม่ ด้วยการแก้ไข chrome://flags หรือระบุการตั้งค่าสถานะบรรทัดคำสั่ง</translation>
-<translation id="6838056959556423778">ลบล้างกฎการเลือกเครื่องพิมพ์เริ่มต้นของ <ph name="PRODUCT_NAME" />
-
-      นโยบายนี้กำหนดกฎในการเลือกเครื่องพิมพ์เริ่มต้นใน <ph name="PRODUCT_NAME" /> ซึ่งเกิดขึ้นในครั้งแรกที่มีการใช้ฟังก์ชันการพิมพ์กับโปรไฟล์ใดโปรไฟล์หนึ่ง
-
-      เมื่อตั้งค่านโยบายนี้ <ph name="PRODUCT_NAME" /> จะพยายามหาเครื่องพิมพ์ที่ตรงกับแอตทริบิวต์ทั้งหมดที่ระบุไว้ และเลือกเครื่องพิมพ์นั้นเป็นค่าเริ่มต้น ระบบจะเลือกเครื่องพิมพ์แรกที่พบว่าตรงกับนโยบายในกรณีที่มีเครื่องพิมพ์ตรงกันที่สามารถเลือกได้หลายเครื่อง โดยขึ้นอยู่กับลำดับของเครื่องพิมพ์ที่พบ
-
-      หากไม่ได้ตั้งค่านโยบายนี้หรือไม่พบเครื่องพิมพ์ที่ตรงกันก่อนหมดเวลา ระบบจะตั้งค่าเครื่องพิมพ์เริ่มต้นเป็นเครื่องพิมพ์ PDF ในตัว หรือหากไม่มีเครื่องพิมพ์ PDF ก็จะไม่เลือกเครื่องพิมพ์ใดๆ
-
-      จะมีการแยกวิเคราะห์ค่าเป็นออบเจ็กต์ JSON โดยเป็นไปตามสคีมาต่อไปนี้
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "ต้องการจำกัดการค้นหาเครื่องพิมพ์ที่ตรงกันเป็นชุดเครื่องพิมพ์ที่เฉพาะเจาะจงหรือไม่",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "นิพจน์ทั่วไปที่ใช้จับคู่ id เครื่องพิมพ์",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "นิพจน์ทั่วไปที่ใช้จับคู่ชื่อที่แสดงของเครื่องพิมพ์",
-            "type": "string"
-          }
-        }
-      }
-
-      เครื่องพิมพ์ต่างๆ ที่เชื่อมต่อกับ <ph name="CLOUD_PRINT_NAME" /> จะถือว่าเป็น <ph name="PRINTER_TYPE_CLOUD" /> เครื่องพิมพ์ที่เหลือจะจัดประเภทเป็น <ph name="PRINTER_TYPE_LOCAL" />
-      การข้ามช่องใดช่องหนึ่งไปแสดงว่าค่าทั้งหมดตรง ตัวอย่างเช่น การไม่ระบุการเชื่อมต่อจะทำให้การแสดงตัวอย่างก่อนพิมพ์เริ่มการค้นหาเครื่องพิมพ์ทุกประเภท ทั้งเครื่องพิมพ์ที่ต่อกับระบบและในระบบคลาวด์
-      รูปแบบนิพจน์ทั่วไปต้องเป็นไปตามไวยากรณ์ JavaScript RegExp และการจับคู่จะคำนึงถึงอักษรตัวพิมพ์เล็กและใหญ่</translation>
 <translation id="6843296367238757293">นโยบายนี้เลิกใช้งานแล้ว เราไม่แนะนำให้ใช้นโยบายนี้ อ่านเพิ่มเติมที่ https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">เราได้นำนโยบายนี้ออกจาก <ph name="PRODUCT_NAME" /> 68 และใช้ <ph name="ARC_GLS_POLICY_NAME" /> แทน</translation>
 <translation id="6856743875250214792">เราเลิกใช้นโยบายนี้และนำออกแล้วใน M66 เพราะมีไว้เพื่อใช้ทดสอบภายในเท่านั้นและไม่เหมาะสำหรับการรักษาความปลอดภัย
@@ -4201,30 +4088,6 @@
       นโยบายนี้จะมีผลเฉพาะกับผู้ใช้ที่ตรวจสอบสิทธิ์โดยใช้ SAML
 
       ค่านโยบายต้องมีหน่วยเป็นวินาที</translation>
-<translation id="9027787254195333560">นโยบายนี้ให้คุณกำหนดค่ารูปโปรไฟล์ที่ใช้แสดงแทนผู้ใช้ในหน้าจอเข้าสู่ระบบ นโยบายนี้กำหนดได้ด้วยการระบุ URL ที่ <ph name="PRODUCT_OS_NAME" /> สามารถดาวน์โหลดรูปโปรไฟล์และการแฮชแบบเข้ารหัสที่ใช้ในการยืนยันความสมบูรณ์ของการดาวน์โหลด รูปภาพต้องอยู่ในรูปแบบ JPEG และมีขนาดไม่เกิน 512 KB ส่วน URL ก็ต้องเข้าถึงได้โดยไม่ต้องตรวจสอบสิทธิ์
-
-      ระบบจะดาวน์โหลดและแคชรูปโปรไฟล์ แล้วจะดาวน์โหลดอีกครั้งเมื่อ URL หรือแฮชมีการเปลี่ยนแปลง
-
-      นโยบายนี้ควรกำหนดเป็นสตริงที่แสดง URL และแฮชในรูปแบบ JSON ที่สอดคล้องกับรูปแบบต่อไปนี้
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL ที่ระบบไปดาวน์โหลดรูปโปรไฟล์ได้",
-            "type": "string"
-          },
-          "hash": {
-            "description": "แฮช SHA-256 ของรูปโปรไฟล์"
-            "type": "string"
-          }
-        }
-      }
-
-      หากตั้งค่านโยบายนี้ไว้ <ph name="PRODUCT_OS_NAME" /> จะดาวน์โหลดและใช้รูปโปรไฟล์
-
-      หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะแก้ไขหรือลบล้างนโยบายไม่ได้
-
-      หากไม่ได้ตั้งค่านโยบายนี้ ผู้ใช้จะเลือกรูปโปรไฟล์ของตนเองในหน้าจอเข้าสู่ระบบได้</translation>
 <translation id="9035964157729712237">รหัสส่วนขยายที่ได้รับการยกเว้นจากรายการที่ไม่อนุญาต</translation>
 <translation id="9038058011835642205">ระบุรายชื่อเว็บไซต์ที่ติดตั้งแบบเงียบ (ผู้ใช้ไม่ต้องดำเนินการ) ซึ่งผู้ใช้ถอนการติดตั้งหรือปิดใช้ไม่ได้
 
@@ -4237,7 +4100,6 @@
       หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะแก้ไขหรือลบล้างนโยบายไม่ได้
 
       ควรระบุค่าของนโยบายเป็นมิลลิวินาที โดยจำกัดช่วงของค่าให้อยู่ระหว่าง 30 วินาทีถึง 24 ชั่วโมง</translation>
-<translation id="9042911395677044526">อนุญาตให้ใช้การกำหนดค่าเครือข่ายแบบพุชสำหรับผู้ใช้แต่ละคนของอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> การกำหนดค่าอุปกรณ์จะเป็นสตริงรูปแบบ JSON ตามที่กำหนดโดยรูปแบบการกำหนดค่าเครือข่ายแบบเปิดซึ่งอธิบายไว้ที่ <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">นโยบายนี้จะควบคุมว่าอุปกรณ์ควรอัปเดตเป็นบิวด์ Quick Fix หรือไม่
 
       หากกำหนดค่านโยบายเป็นโทเค็นที่แมปไปยังบิวด์ Quick Fix อุปกรณ์จะได้รับการอัปเดตเป็นบิวด์ Quick Fix ที่เกี่ยวข้องหากการอัปเดตไม่ได้ถูกบล็อกโดยนโยบายอื่น
@@ -4310,17 +4172,6 @@
       หากตั้งค่านโยบายเป็น "เท็จ" ระบบจะไม่เลือก "ส่วนหัวและส่วนท้าย" ในกล่องโต้ตอบตัวอย่างการพิมพ์ และผู้ใช้จะเปลี่ยนค่าไม่ได้
 
       หากตั้งค่านโยบายเป็น "จริง" ระบบจะเลือก "ส่วนหัวและส่วนท้าย" ในกล่องโต้ตอบตัวอย่างการพิมพ์ และผู้ใช้จะเปลี่ยนค่าไม่ได้</translation>
-<translation id="9213347477683611358">กำหนดค่ารูปภาพวอลเปเปอร์ระดับอุปกรณ์ที่แสดงในหน้าจอเข้าสู่ระบบหากยังไม่มีผู้ใช้ลงชื่อเข้าใช้อุปกรณ์ นโยบายตั้งค่าโดยการระบุ URL ที่อุปกรณ์ Chrome OS สามารถดาวน์โหลดรูปภาพวอลเปเปอร์และแฮชแบบเข้ารหัสซึ่งใช้เพื่อยืนยันความสมบูรณ์ของการดาวน์โหลด รูปภาพต้องมีรูปแบบเป็น JPEG ขนาดไฟล์ต้องไม่เกิน 16 MB และ URL ต้องเข้าถึงได้โดยไม่ต้องตรวจสอบสิทธิ์ รูปภาพวอลเปเปอร์จะได้รับการดาวน์โหลดและแคช และจะมีการดาวน์โหลดอีกครั้งเมื่อใดก็ตามที่ URL หรือแฮชมีการเปลี่ยนแปลง
-
-      ควรระบุนโยบายนี้เป็นสตริงที่แสดง URL และแฮชในรูปแบบ JSON เช่น
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      หากมีการตั้งค่านโยบายวอลเปเปอร์ของอุปกรณ์ไว้ อุปกรณ์ Chrome OS จะดาวน์โหลดและใช้รูปภาพวอลเปเปอร์บนหน้าจอเข้าสู่ระบบหากยังไม่มีผู้ใช้ลงชื่อเข้าใช้อุปกรณ์ เมื่อผู้ใช้เข้าสู่ระบบ นโยบายวอลเปเปอร์ของผู้ใช้จะทำงาน
-
-      หากไม่มีการตั้งค่านโยบายวอลเปเปอร์ของอุปกรณ์ นโยบายวอลเปเปอร์ของผู้ใช้จะเป็นตัวกำหนดว่าจะแสดงสิ่งใดหากมีการตั้งค่านโยบายวอลเปเปอร์ของผู้ใช้</translation>
 <translation id="9217154963008402249">ความถี่ในการติดตามดูแพ็กเก็ตเครือข่าย</translation>
 <translation id="922540222991413931">กำหนดค่าส่วนขยาย แอปพลิเคชัน และแหล่งติดตั้งสคริปต์ของผู้ใช้</translation>
 <translation id="924557436754151212">นำเข้ารหัสผ่านที่บันทึกไว้จากเบราว์เซอร์เริ่มต้นในการเรียกใช้งานครั้งแรก</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index e59434c..67bd16d0 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -320,7 +320,7 @@
 <translation id="1502843533062797703">Üçüncü taraf yazılımı yerleştirme engellemesini etkinleştirin</translation>
 <translation id="1504431521196476721">Uzaktan Doğrulama</translation>
 <translation id="1507382822467487898">
-          Cihaza bir yerleştirme yuvası bağlandığında MAC (medya erişim denetimi) adresi kullanılır.
+          Cihaza bir yerleştirme yuvası bağlandığında hangi MAC (medya erişim denetimi) adresinin kullanılacağını yapılandırır.
 
           Bazı cihaz modellerine bir yerleştirme yuvası bağlandığında, varsayılan olarak cihazı Ethernet ağında tanımlamak için cihazın atanmış yuvasına ait MAC adresi kullanılır. Bu politika, cihaz yuvaya yerleştirilmiş durumdayken MAC adresi kaynağının yönetici tarafından değiştirilmesine izin verir.
 
@@ -406,7 +406,6 @@
 
       Uyarı: Cihazın yazılım güncellemelerini ve kritik güvenlik düzeltmelerini almasını engelleyebileceği için <ph name="PRODUCT_OS_NAME" /> sürümünün kontrol yetkisinin bir kiosk uygulamasına verilmesi önerilmez. <ph name="PRODUCT_OS_NAME" /> sürümü kontrol yetkisinin devredilmesi, kullanıcıları risk altında bırakabilir.</translation>
 <translation id="1675002386741412210">Desteklendiği yerler:</translation>
-<translation id="1689963000958717134">Bir <ph name="PRODUCT_OS_NAME" /> cihazının tüm kullanıcıları için uygulanacak ağ yapılandırmasını iletmeye olanak sağlar. Ağ yapılandırması, Açık Ağ Yapılandırma biçimi tarafından <ph name="ONC_SPEC_URL" /> adresinde tanımlandığı gibi, JSON biçimli bir dizedir.</translation>
 <translation id="1704516734140344991"><ph name="TPM_FIRMWARE_UPDATE_TPM" /> donanım yazılımını güncelleme işlevinin kullanılabilirliğini ve davranışını yapılandırır.
 
       Bağımsız ayarlar JSON özelliklerinde belirtilebilir:
@@ -768,7 +767,7 @@
 <translation id="2327252517317514801">G Suite'e erişmesine izin verilen alan adlarını tanımla</translation>
 <translation id="2356878440219553005">Pil şarj modu güç yönetimi politikasını belirtir.
 
-          Pil stresi nedeniyle pilin aşınmasını en aza indirmek ve pil ömrünü uzatmak için pil şarjını dinamik olarak denetleyin.
+          Pil stresi nedeniyle pilin aşınmasını en aza indirmek ve pil ömrünü uzatmak için pil şarjını dinamik olarak denetler.
 
           Özel pil şarj modu seçiliyse, DeviceBatteryChargeCustomStartCharging ve DeviceBatteryChargeCustomStopCharging belirtilmelidir.
 
@@ -966,16 +965,6 @@
       Bu ayar devre dışı bırakılırsa, Web sayfaları JavaScript'i kullanamaz ve kullanıcı bu ayarı değiştiremez.
 
       Bu ayar etkinleştirilir veya ayarlanmazsa, Web sayfaları JavaScript'i kullanabilir ancak kullanıcı ilgili ayarı değiştirebilir.</translation>
-<translation id="2747157663401642394"><ph name="PRODUCT_NAME" /> için uzantı yönetimi ayarlarını yapılandırır.
-
-          Bu politika birden fazla ayarı kontrol eder. Buna, uzantılarla ilgili mevcut politikaların kontrolündeki ayarlar da dahildir. Bu politika, birlikte ayarlanmış tüm eski politikaları geçersiz kılar.
-
-          Bu politika, uzantı kimliklerini veya güncelleme URL'lerini yapılandırmalarıyla eşler. Uzantı kimliği olduğunda, yapılandırma yalnızca belirtilen uzantıya uygulanır. Özel kimlik (<ph name="DEFAULT_SCOPE" />) için varsayılan bir yapılandırma ayarlanabilir. Varsayılan yapılandırma, bu politikada ayarlanmış özel yapılandırması bulunmayan tüm uzantılara uygulanır. Güncelleme URL'si olduğunda, yapılandırma, <ph name="LINK_TO_EXTENSION_DOC1" /> sayfasında açıklandığı şekilde bu uzantının manfest'inde belirtilenle tam olarak aynı güncelleme URL'sine sahip tüm uzantılara uygulanır.
-
-          <ph name="MS_AD_NAME" /> alanına katılmamış Windows örneklerinde zorunlu yükleme, Chrome Web Mağazası'nda listelenen uygulama ve uzantılarla sınırlıdır.
-
-          Bu politikanın olası ayarları ve yapısıyla ilgili tam açıklama için https://www.chromium.org/administrators/policy-list-3/extension-settings-full sayfasını ziyaret edin.
-          </translation>
 <translation id="2753637905605932878">WebRTC tarafından kullanılan yerel UDP bağlantı noktaları aralığını kısıtlama</translation>
 <translation id="2757054304033424106">Yüklenmesine izin verilen uzantı/uygulama türleri</translation>
 <translation id="2758084448533744848">Cihazda kullanılması zorunlu tutulan saat dilimini belirtir. Bu politika ayarlandığında cihazdaki kullanıcılar belirtilen saat dilimini geçersiz kılamazlar. Geçersiz bir değer sağlanırsa, politika yine etkinleştirilir ve bu durumda saat dilimi olarak "GMT" kullanılır. Boş dize sağlanırsa politika yoksayılır.
@@ -1302,9 +1291,9 @@
       Bu ayar etkinleştirilirse veya yapılandırılmazsa, kullanıcılar kendi Google hesaplarından kimlik doğrulama ile bulut (cloud) yazdırma proxy'sini etkinleştirebilirler.
 
       Bu ayar devre dışı bırakılırsa, kullanıcılar proxy'yi etkinleştiremezler ve makinenin, yazıcılarını <ph name="CLOUD_PRINT_NAME" /> ile paylaşmasına izin verilmez.</translation>
-<translation id="3312206664202507568">chrome://password-change konumunda, SAML kullanıcılarının oturum açmış durumdayken SAML şifrelerini değiştirmelerine izin veren ve SAML şifresi ile cihaz kilitli ekran şifresinin senkronize durumda tutulmasını sağlayan bir sayfayı etkinleştirir.
+<translation id="3312206664202507568">chrome://password-change konumunda, SAML kullanıcılarının oturum açmış durumdayken SAML şifrelerini değiştirmelerine izin veren ve SAML şifresi ile cihaz ekran kilidi şifresinin senkronize durumda tutulmasını sağlayan bir sayfayı etkinleştirir.
 
-      Bu politika ayrıca SAML kullanıcılarını SAML şifrelerinin süresinin biteceği konusunda uyaran bildirimleri etkinleştirir, böylece kullanıcılar hemen oturum içi şifre değiştirme işlemini yapabilirler.
+      Bu politika ayrıca SAML kullanıcılarını SAML şifrelerinin süresinin biteceği konusunda uyaran bildirimleri etkinleştirir, böylece kullanıcılar oturum içi şifre değiştirme işlemini hemen yapabilirler.
       Ancak bu bildirimler sadece şifre geçerliliği bitiş bilgileri cihaza SAML kimlik sağlayıcısı tarafından SAML oturum açma akışı sırasında gönderilirse gösterilir.
 
       Bu politika ayarlanırsa, kullanıcı tarafından değiştirilemez veya geçersiz kılınamaz.</translation>
@@ -1391,7 +1380,7 @@
 
          Bu politika Yanlış seçeneğine ayarlanır veya ayarlanmadan bırakılırsa güç yönetimi gecikmeleri ve oturum süresi sınırı oturumun başında hemen çalışmaya başlar.</translation>
 <translation id="3478024346823118645">Çıkışta kullanıcı verilerini sil</translation>
-<translation id="3480961938508521469">Pili standart bir hızda tam olarak şarj edin.</translation>
+<translation id="3480961938508521469">Pili standart bir hızda tam olarak şarj et.</translation>
 <translation id="348495353354674884">Sanal klavyeyi etkinleştir</translation>
 <translation id="3487623755010328395">
         Bu politika ayarlanırsa <ph name="PRODUCT_NAME" /> kendisini kaydetmeye çalışır ve tüm profiller için ilişkili bulut politikasını uygular.
@@ -1741,30 +1730,6 @@
       Bu politika sadece SAML kullanarak kimlik doğrulaması yapan kullanıcıları etkiler.</translation>
 <translation id="4105989332710272578">Bir URL listesi için Sertifika Şeffaflığı uygulamasını devre dışı bırak</translation>
 <translation id="4121350739760194865">Uygulama tanıtımlarının yeni sekme sayfasında görünmesini önle</translation>
-<translation id="4125606414556046117">Bu politika, masaüstünde ve kullanıcı için giriş ekranı arka planında görüntülenecek duvar kağıdı resmini yapılandırmanıza olanak tanır. Politika, <ph name="PRODUCT_OS_NAME" /> sisteminin duvar kağıdı resmini indirebileceği URL ve indirme işleminin bütünlüğünü doğrulamak için kullanılacak şifreli bir karma belirtilerek ayarlanır. Resim JPEG biçiminde olmalı, dosya boyutu 16 MB'tan fazla olmamalıdır. URL'ye kimlik doğrulaması yapmadan erişilebilmelidir.
-
-      Duvar kağıdı resmi indirilir ve önbelleğe alınır. URL veya karma her değiştiğinde resim tekrar indirilir.
-
-      Politika, aşağıdaki şemaya uygun şekilde, URL'yi ve karmayı JSON biçiminde ifade eden bir dize olarak belirtilmelidir:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Duvar kağıdı resminin indirilebileceği URL.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Duvar kağıdı resminin SHA-256 karması.",
-            "type": "string"
-          }
-        }
-      }
-
-      Bu politika ayarlanırsa <ph name="PRODUCT_OS_NAME" /> duvar kağıdı resmini indirir ve kullanır.
-
-      Bu politikayı ayarlarsanız kullanıcılar bunu değiştiremez veya geçersiz kılamazlar.
-
-      Bu politika ayarlanmadan bırakılırsa kullanıcı, masaüstünde ve giriş ekranı arka planında görüntülenmek üzere bir resim seçebilir.</translation>
 <translation id="412697421478384751">Kullanıcıların kilit ekranı PIN'i için zayıf PIN'ler ayarlamasına izin ver</translation>
 <translation id="4138655880188755661">Zaman Limiti</translation>
 <translation id="4144164749344898721">Bu politika, kullanıcı işlem yapmadığında güç yönetimi stratejisiyle ilgili birden fazla ayarı kontrol eder.
@@ -2324,7 +2289,7 @@
 
       Politika ayarlanmazsa veya boş dize değerine ya da geçersiz bir bağlantı noktası aralığına ayarlanırsa, WebRTC'nin kullanılabilir herhangi bir yerel UDP bağlantı noktasını kullanmasına izin verilir.</translation>
 <translation id="5290940294294002042">Kullanıcının etkinleştirebileceği veya devre dışı bırakabileceği eklentilerin listesini belirt</translation>
-<translation id="5306186200045823863">Symantec Corporation'ın Eski PKI Altyapısında güveni etkinleştir</translation>
+<translation id="5306186200045823863">Symantec Corporation'ın Eski PKI Altyapısına güveni etkinleştir</translation>
 <translation id="5307432759655324440">Gizli modun kullanılabilirliği</translation>
 <translation id="5318185076587284965">Uzaktan erişen ana makine tarafından geçiş sunucuları kullanılmasını etkinleştir</translation>
 <translation id="5323128137188992869"><ph name="PRODUCT_NAME" /> kullanarak içeriğin cihaza yayınlanmasına izin verin.
@@ -2606,7 +2571,7 @@
 <translation id="5765780083710877561">Açıklama:</translation>
 <translation id="5770738360657678870">Yeni geliştirilenler kanalı (kararsız olabilir)</translation>
 <translation id="5774856474228476867">Varsayılan arama sağlayıcı arama URL'si</translation>
-<translation id="5775235485119094648">Pili belirlenmiş bir aralıktayken şarj edin.</translation>
+<translation id="5775235485119094648">Pili belirlenmiş bir aralıktayken şarj et.</translation>
 <translation id="5776485039795852974">Bir site, masaüstü bildirimlerini her göstermek istediğinde sor.</translation>
 <translation id="5781412041848781654">HTTP kimlik doğrulaması için hangi GSSAPI kitaplığının kullanılacağını belirtir. Sadece bir kitaplık adı ya da tam yol ayarlayabilirsiniz.
 
@@ -2674,7 +2639,7 @@
 <translation id="5893553533827140852">Bu ayar etkinleştirilirse gnubby kimlik doğrulama isteklerinde uzaktan ana bilgisayar bağlantısı üzerinden proxy kullanılır.
 
           Bu ayar devre dışı bırakılır veya yapılandırılmazsa gnubby kimlik doğrulama isteklerinde proxy kullanılmaz.</translation>
-<translation id="5897913798715600338">Pili hızlı şarj teknolojisiyle şarj edin.</translation>
+<translation id="5897913798715600338">Pili hızlı şarj teknolojisiyle şarj et.</translation>
 <translation id="5898486742390981550">Birden fazla kullanıcı giriş yaptığında, yalnızca birincil kullanıcı Android uygulamalarını kullanabilir.</translation>
 <translation id="5901427587865226597">Yalnızca dupleks yazdır</translation>
 <translation id="5903898512448364160">
@@ -2723,53 +2688,6 @@
 
       Bu politika ayarlanmazsa veya yanlış seçeneğine ayarlanırsa, yazdırma komutları yazdırma önizleme ekranını tetikler.</translation>
 <translation id="6022948604095165524">Başlangıçtaki işlem</translation>
-<translation id="6023030044732320798">ARC çalışma zamanına devredilecek politika grubunu belirtir. Değer, geçerli JSON olmalıdır.
-
-      Bu politika, cihaza hangi Android uygulamalarının otomatik olarak yükleneceğini yapılandırmak için kullanılabilir:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android uygulama tanımlayıcısı, ör. Gmail için "com.google.android.gm"",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Bir uygulamanın nasıl yüklendiğini belirtir. İSTEĞE BAĞLI: Uygulama otomatik olarak yüklenmez ancak kullanıcı uygulamayı yükleyebilir. Bu ayar, bu politika belirtilmemişse varsayılan değer olur. PRELOAD: Uygulama otomatik olarak yüklenir ancak kullanıcı yüklemesini kaldırabilir. FORCE_INSTALLED: Uygulama otomatik olarak yüklenir ve kullanıcı yüklemesini kaldıramaz. BLOCKED: Uygulama engellenir ve yüklenemez. Uygulama, önceki bir politika kapsamında yüklenmişse yüklemesi kaldırılır.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Uygulamalara izin istekleri veren politika. PERMISSION_POLICY_UNSPECIFIED: Politika belirtilmemiştir. Herhangi bir düzeyde bir izin için herhangi bir politika belirtilmemişse varsayılan olarak 'PROMPT' davranışı kullanılır. PROMPT: Kullanıcıdan izin vermesi istenir. GRANT: Bir izni otomatik olarak verir. DENY: Bir izni otomatik olarak reddeder.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Bir anahtar/değer çifti grubuna sahip uygulamaya özel JSON yapılandırma nesnesi; ör. '"managedConfiguration": { "key1": value1, "key2": value2 }'. Anahtarlar, uygulama manifest dosyasında tanımlanır.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Uygulamaları Launcher'a sabitlemek için PinnedLauncherApps politikasına bakın.</translation>
 <translation id="602728333950205286">Varsayılan arama sağlayıcı anında arama URL'si</translation>
 <translation id="603410445099326293">POST kullanan öneri URL'si parametreleri</translation>
 <translation id="6034341625190551415">Herkese açık oturum ve kiosk hesap türlerini kontrol eder.</translation>
@@ -3109,38 +3027,6 @@
       Bu politika false (yanlış) değerine ayarlanırsa, dahili DNS istemcisi hiçbir zaman kullanılmaz.
 
       Bu politika ayarlanmadan bırakılırsa, dahili DNS istemcisi; MacOS, Android (Gizli DNS veya VPN etkinleştirilmediğinde) ve ChromeOS'de varsayılan olarak etkinleştirilir ve kullanıcılar, dahili DNS istemcisini chrome://flags sayfasını düzenleyerek mi yoksa bir komut satırı işareti belirterek mi kullanacaklarını değiştirebilirler.</translation>
-<translation id="6838056959556423778"><ph name="PRODUCT_NAME" /> varsayılan yazıcı seçim kurallarını geçersiz kılar.
-
-      Bu politika, <ph name="PRODUCT_NAME" /> cihazında varsayılan yazıcıyı seçmeye ilişkin kuralları belirler. Bu seçim, yazdırma işlevi bir profilde ilk kez kullanıldığında yapılır.
-
-      Bu politika ayarlandığında, <ph name="PRODUCT_NAME" /> belirtilen tüm özelliklerle eşleşen bir yazıcı bulmaya ve onu varsayılan yazıcı olarak seçmeye çalışır. Politikayla eşleştiği belirlenen ilk yazıcı seçilir; benzersiz olmayan eşleme olması durumunda, yazıcıların bulunma sırasına göre eşleşen herhangi bir yazıcı seçilebilir.
-
-      Bu politika ayarlanmazsa veya zaman aşımı süresi içinde eşleşen bir yazıcı bulunamazsa, yazıcı varsayılan olarak dahili PDF yazıcısını kullanır veya PDF yazıcısı yoksa hiçbir yazıcı seçilmez.
-
-      Değer, aşağıdaki düzene uygun şekilde JSON nesnesi olarak ayrıştırılır:
-      {
-
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description":  "Eşleşen yazıcı arama işleminin belirli bir yazıcı grubuyla sınırlı olup olmayacağını belirler.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Yazıcı kimliğiyle eşleşecek normal ifade.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Yazıcı görünen adıyla eşleşecek normal ifade.",
-            "type": "string"
-          }
-        }
-      }
-
-      <ph name="CLOUD_PRINT_NAME" /> bağlantılı yazıcılar "<ph name="PRINTER_TYPE_CLOUD" />" yazıcı sayılır, geri kalan yazıcılar "<ph name="PRINTER_TYPE_LOCAL" />" olarak sınıflandırılır.
-      Bir alanın atlanması, tüm değerlerin eşleneceği anlamına gelir. Örneğin, bağlantı belirtilmezse Baskı Önizleme'nin yerel veya buluttaki her tür yazıcının bulunması işlemini başlatmasına neden olur.
-      Normal ifade kalıpları JavaScript RegExp söz dizimine uygun olmalıdır. Eşleşmeler büyük/küçük harfe duyarlıdır.</translation>
 <translation id="6843296367238757293">Bu politika kullanımdan kaldırılmıştır. Kullanılması önerilmez. Daha fazla bilgiyi https://support.google.com/chrome/a/answer/7643500 adresinde bulabilirsiniz</translation>
 <translation id="684856667300805181">Bu politika <ph name="PRODUCT_NAME" /> 68 sürümünde kaldırılmış ve yerine <ph name="ARC_GLS_POLICY_NAME" /> kullanılmaya başlanmıştır.</translation>
 <translation id="6856743875250214792">Bu politika, yalnızca dahili test amacıyla kullanıldığı ve güvenlik engeli teşkil ettiği için M66'da kullanımdan kaldırılmıştır.
@@ -3214,7 +3100,7 @@
 
       Ekran karartılmak üzereyken akıllı karartma modeli, ekranı karartmanın geciktirilmesinin gerekip gerekmediğini değerlendirir. Akıllı karartma modeli ekranın karartılmasını geciktirirse, ekranın karartılması için gereken süre etkili şekilde uzar. Bu durumda, ekran kapatma, ekran kilidi ve işlem yapılmadan geçen süre gecikmeleri, ekran karartma gecikmesinin başlangıçta yapılandırıldığı değerle aynı süreyi koruyacak şekilde ayarlanır. 
       Bu politika True (Doğru) değerine ayarlanır veya ayarlanmadan bırakılırsa akıllı karartma modeli etkinleşir ve ekranı karartma süresini uzatmasına izin verilir. Bu politika False (Yanlış) değerine ayarlanırsa akıllı karartma modeli, ekran karartmayı etkilemez.</translation>
-<translation id="6967394885063085697">Gelişmiş pil şarj modu güç yönetim politikasını etkinleştirin.
+<translation id="6967394885063085697">Gelişmiş pil şarj modu güç yönetim politikasını etkinleştir.
 
           Gelişmiş Pil Şarj Modu, kullanıcının pil sağlığını maksimuma çıkarmasına olanak verir. Gelişmiş Şarj Modu'nda, sistem pil sağlığını maksimuma çıkarmak için mesai saatleri dışında standart şarj algoritmasını ve diğer teknikleri kullanır. Mesai saatlerinde ise bir hızlı şarj yöntemi kullanılır. Bu hızlı şarj, pilin daha hızlı şarj edilmesini sağlar; dolayısıyla pil kısa sürede tam şarj kapasitesine ulaşır. Her gün için, sistemin en yoğun şekilde kullanılacağı zaman başlangıç saati ve süre ile belirtilir.
 
@@ -3664,7 +3550,7 @@
 <translation id="7712109699186360774">Bir site kamera ve/veya mikrofona erişmek istediğinde her zaman sor</translation>
 <translation id="7713608076604149344">İndirme kısıtlamaları</translation>
 <translation id="7715711044277116530">Sunum modunda ekranın kararma gecikmesinin ölçekleneceği yüzde</translation>
-<translation id="7716781462866245042">Gelişmiş pil şarj modu gün yapılandırmasını ayarlayın.
+<translation id="7716781462866245042">Gelişmiş pil şarj modu gün yapılandırmasını ayarla.
 
           Bu politika sadece DeviceAdvancedBatteryChargeModeEnabled ayarı true (doğru) seçeneğine ayarlanmışsa kullanılır.
 
@@ -4280,30 +4166,6 @@
       Bu politika sadece SAML kullanarak kimlik doğrulaması yapan kullanıcıları etkiler.
 
       Politika değeri saniye olarak belirtilmelidir.</translation>
-<translation id="9027787254195333560">Bu politika, giriş ekranında kullanıcıyı temsil eden avatar resmini yapılandırmanıza olanak tanır. Politika, avatar resminin <ph name="PRODUCT_OS_NAME" /> tarafından indirilebileceği URL'nin belirtilmesi ve indirme işleminin bütünlüğünü doğrulamak için kullanılacak şifreleme karmasının tanımlanmasıyla ayarlanır. Resim JPEG biçiminde olmalı, boyutu 512 kB'tan fazla olmamalıdır. URL'ye kimlik doğrulaması yapmadan erişilebilmelidir.
-
-      Avatar resmi indirilir ve önbelleğe alınır. URL veya karma her değiştiğinde resim tekrar indirilir.
-
-      Politika, aşağıdaki şemaya uygun şekilde, URL'yi ve karmayı JSON biçiminde ifade eden bir dize olarak belirtilmelidir:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "Avatar resminin indirilebileceği URL.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Avatar resminin SHA-256 karması.",
-            "type": "string"
-          }
-        }
-      }
-
-      Bu politika ayarlanırsa, <ph name="PRODUCT_OS_NAME" /> avatar resmini indirir ve kullanır.
-
-      Bu politikayı ayarlarsanız kullanıcılar bunu değiştiremez veya geçersiz kılamazlar.
-
-      Bu politika ayarlanmadan bırakılırsa kullanıcı giriş ekranında kendisini temsil edecek avatar resmini seçebilir.</translation>
 <translation id="9035964157729712237">Kara listeden muaf tutulacak uzantı kimlikleri</translation>
 <translation id="9038058011835642205">Kullanıcı etkileşimi olmadan sessizce yüklenen ve yüklemesi kaldırılamayan uygulamaların bir listesini belirtir.
 
@@ -4316,7 +4178,6 @@
       Bu politikayı ayarlarsanız kullanıcılar bunu değiştiremez veya geçersiz kılamazlar.
 
       Politika değeri milisaniye olarak belirtilmelidir. Değerler 30 saniye ile 24 saat arasında olabilir.</translation>
-<translation id="9042911395677044526">Kullanıcılara ayrı ayrı uygulanacak ağ yapılandırmasını bir <ph name="PRODUCT_OS_NAME" /> cihazına iletmeye olanak verir. Ağ yapılandırması, Açık Ağ Yapılandırma biçimi tarafından <ph name="ONC_SPEC_URL" /> adresinde tanımlandığı gibi, JSON biçimli bir dizedir.</translation>
 <translation id="9050853837490399534">Bu politika, cihazın bir Hızlı Düzeltme Derlemesi'ne güncellenmesinin gerekip gerekmediğini kontrol eder.
 
       Politika değeri bir Hızlı Düzeltme Derlemesi'ne eşlenen bir belirtece ayarlanırsa ve güncelleme başka bir politika tarafından engellenmemişse cihaz, ilgili Hızlı Düzeltme Derlemesi'ne güncellenir.
@@ -4397,17 +4258,6 @@
       Politika false (yanlış) değerine ayarlanırsa "Üst bilgiler ve alt bilgiler" baskı önizleme iletişim kutusunda seçilmez ve kullanıcı bu değerleri değiştiremez.
 
       Politika true (doğru) değerine ayarlanırsa "Üst bilgiler ve alt bilgiler", baskı önizleme iletişim kutusunda seçilir ve kullanıcı bu değerleri değiştiremez.</translation>
-<translation id="9213347477683611358">Cihazda henüz hiçbir kullanıcı oturum açmadığında giriş ekranında gösterilen cihaz düzeyindeki duvar kağıdı resmini yapılandırın. Politikayı ayarlamak için Chrome OS cihazın, duvar kağıdı resmini hangi URL'den indireceği ve indirilen dosyanın bütünlüğünü doğrulamak için kullanılacak bir şifreleme karması belirtilmelidir. Resim JPEG biçiminde olmalı, dosya boyutu 16 MB'yi aşmamalıdır. URL'ye kimlik doğrulaması yapılmadan erişilebilmelidir. Duvar kağıdı resmi indirilip önbelleğe alınır. URL veya karma değiştiğinde yeniden indirilir.
-
-      Politika, URL'yi ve karmayı JSON biçiminde ifade eden bir dizi olarak belirtilmelidir. Örneğin:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Cihaz duvar kağıdı politikası ayarlanırsa Chrome OS cihaz, duvar kağıdı resmini indirir ve cihazda henüz hiçbir kullanıcı oturum açmamışken giriş ekranında bu resmi kullanır. Kullanıcı giriş yaptıktan sonra, kullanıcının duvar kağıdı politikası devreye girer.
-
-      Cihaz duvar kağıdı politikası ayarlanmamış ve kullanıcının duvar kağıdı politikası ayarlanmışsa neyin gösterileceğini kullanıcının duvar kağıdı politikası belirler.</translation>
 <translation id="9217154963008402249">İzleme amaçlı ağ paketlerinin sıklığı</translation>
 <translation id="922540222991413931">Uzantı, uygulama ve kullanıcı komut dosyası yükleme kaynaklarını yapılandır</translation>
 <translation id="924557436754151212">İlk çalıştırmada kayıtlı şifreleri varsayılan tarayıcıdan içe aktar</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 43ff62e..45619090 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -418,7 +418,6 @@
 
       Застереження: не радимо передавати контроль над версією <ph name="PRODUCT_OS_NAME" /> додатку-терміналу, оскільки це може перешкодити пристрою отримувати оновлення програмного забезпечення та системи безпеки. Передавши контроль над версією <ph name="PRODUCT_OS_NAME" /> додатку-терміналу, ви можете наразити користувачів на небезпеку.</translation>
 <translation id="1675002386741412210">Підтримується в:</translation>
-<translation id="1689963000958717134">Дозволяє надсилати конфігурацію мережі для застосування всіма користувачами пристрою з <ph name="PRODUCT_OS_NAME" />. Конфігурація мережі – це рядок у форматі JSON, визначений форматом Open Network Configuration, який описано на сторінці <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Налаштовує доступність і поведінку функції оновлення мікропрограми <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       У форматі JSON можна вказувати окремі налаштування.
@@ -960,16 +959,6 @@
       Якщо вимкнути це налаштування, веб-сторінки не зможуть використовувати JavaScript, і користувач не зможе змінити це налаштування.
 
       Якщо це налаштування ввімкнено чи не встановлено, веб-сторінки зможуть використовувати сценарій JavaScript, але користувач зможе змінити це налаштування.</translation>
-<translation id="2747157663401642394">Налаштовує параметри керування розширеннями для <ph name="PRODUCT_NAME" />.
-
-          Це правило керує різними налаштуваннями, зокрема тими, які контролюються наявними правилами для розширень. Воно заміняє всі застарілі правила.
-
-          Це правило зіставляє ідентифікатор розширення або URL-адресу оновлення з його конфігурацією. Завдяки ідентифікатору конфігурація застосовується лише до вказаного розширення. Для спеціального ідентифікатора <ph name="DEFAULT_SCOPE" /> можна налаштувати конфігурацію за умовчанням, що застосовуватиметься до всіх розширень, для яких у цьому правилі не вказано власну конфігурацію. Конфігурація застосовується до всіх розширень із конкретною URL-адресою оновлення, указаною в маніфесті цього розширення, як описано на сторінці <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          У версіях Windows, не зареєстрованих у <ph name="MS_AD_NAME" />, примусово встановлюються лише додатки й розширення з Веб-магазину Chrome.
-
-          Повний опис можливих налаштувань і структури цього правила можна переглянути на сторінці https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Обмежити діапазон локальних портів UDP, які використовуються у WebRTC</translation>
 <translation id="2757054304033424106">Типи розширень або програм, які дозволено встановлювати</translation>
 <translation id="2758084448533744848">Указує примусово встановлений часовий пояс для пристрою. Якщо це правило налаштовано, користувачі не можуть змінити вибраний на пристрої часовий пояс. Якщо вказано недійсне значення, правило все одно діє, але використовується час за Гринвічем (GMT). Якщо рядок порожній, правило ігнорується.
@@ -1730,30 +1719,6 @@
       Це правило стосується лише користувачів, які автентифікуються через SAML.</translation>
 <translation id="4105989332710272578">Вимкнути застосування перевірки сертифіката для списку URL-адрес</translation>
 <translation id="4121350739760194865">Запобігання появи реклами програм на сторінці нової вкладки</translation>
-<translation id="4125606414556046117">Це правило дає змогу налаштовувати фоновий малюнок на робочому столі й екрані входу. Для цього потрібно вказати URL-адресу, з якої <ph name="PRODUCT_OS_NAME" /> може завантажити фоновий малюнок і криптографічний хеш для перевірки цілісності завантаження. Зображення має бути у форматі JPEG, а його розмір не може перевищувати 16 МБ. URL-адреса має бути доступною без автентифікації.
-
-      Фоновий малюнок завантажується й додається в кеш. Якщо URL-адреса або хеш змінюються, малюнок завантажується повторно.
-
-      Це правило потрібно вказати як рядок із URL-адресою й хешом у форматі JSON за наведеною нижче схемою.
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL-адреса, з якої можна завантажити фоновий малюнок.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Хеш SHA-256 для фонового малюнка.",
-            "type": "string"
-          }
-        }
-      }
-
-      Якщо це правило налаштовано, <ph name="PRODUCT_OS_NAME" /> завантажує й застосовує фоновий малюнок.
-
-      Якщо це правило налаштовано, користувачі не можуть змінювати або замінювати його.
-
-      Якщо це правило не налаштовано, користувач може вибирати фоновий малюнок для робочого стола й екрана входу.</translation>
 <translation id="412697421478384751">Дозволяти користувачам установлювати слабкі PIN-коди для блокування екрана</translation>
 <translation id="4138655880188755661">Ліміт часу</translation>
 <translation id="4144164749344898721">Це правило контролює кілька налаштувань стратегії керування живленням, коли користувач неактивний.
@@ -2676,53 +2641,6 @@
 
       Якщо цю політику не налаштовано чи для неї встановлено значення "false", команди друку викликають вікно попереднього перегляду.</translation>
 <translation id="6022948604095165524">Дія під час запуску</translation>
-<translation id="6023030044732320798">Визначає набір правил, які буде передано середовищу виконання ARC. Значення має бути дійсним файлом JSON.
-
-      За допомогою цього правила можна налаштувати, які додатки Android автоматично встановлюватимуться на пристрої:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "ідентифікатор додатка Android, наприклад "com.google.android.gm" для Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "визначає, як установлюється додаток. НЕОБОВ’ЯЗКОВО: додаток не встановлюватиметься автоматично, однак користувач може встановити його. Цей параметр установлюється за умовчанням, якщо правило не вказано. ПОПЕРЕДНЄ ЗАВАНТАЖЕННЯ: додаток установлюється автоматично, однак користувач може видалити його. ПРИМУСОВЕ ВСТАНОВЛЕННЯ: додаток установлюється автоматично, а користувач не може видалити його. ЗАБЛОКОВАНО: додаток заблокований і не встановлюється. Якщо додаток було встановлено згідно з попереднім правилом, його буде видалено.",
-                  "type": "string",
-                  "enum": [
-                    "НЕОБОВ’ЯЗКОВО",
-                    "ПОПЕРЕДНЄ ЗАВАНТАЖЕННЯ",
-                    "ПРИМУСОВЕ ВСТАНОВЛЕННЯ",
-                    "ЗАБЛОКОВАНО"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "правило для надання додатку дозволів. ПРАВИЛО ДЛЯ НАДАННЯ ДОЗВОЛІВ НЕ ВКАЗАНО: правило не вказано. Якщо правило для надання дозволів не вказано на жодному рівні, за умовчанням використовується поведінка "ЗАПИТУВАТИ". ЗАПИТУВАТИ: запитувати дозвіл у користувача. НАДАТИ: автоматично надавати дозвіл. ЗАБОРОНИТИ: автоматично відмовляти в дозволі.",
-                  "type": "string",
-                  "enum": [
-                    "ПРАВИЛО ДЛЯ НАДАННЯ ДОЗВОЛІВ НЕ ВКАЗАНО",
-                    "ЗАПИТУВАТИ",
-                    "НАДАТИ",
-                    "ЗАБОРОНИТИ"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "об’єкт налаштування додатка у файлі JSON із набором пари ключ-значення, наприклад "managedConfiguration": { "key1": value1, "key2": value2 }'. Ключі вказано в маніфесті додатка.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Щоб закріпити додатки на панелі запуску, перегляньте правило PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL-адреса для миттєвого пошуку пошукової служби за умовчанням</translation>
 <translation id="603410445099326293">Параметри URL-адреси пропозицій, яка використовує метод POST</translation>
 <translation id="6034341625190551415">Керує загальнодоступним сеансом і типами облікових записів термінала.</translation>
@@ -3070,37 +2988,6 @@
       Якщо для нього встановлено значення false, вбудований клієнт DNS ніколи не використовується.
 
       Якщо це правило не налаштовано, вбудований клієнт DNS буде ввімкнено за умовчанням у MacOS, Android (якщо приватну DNS або VPN вимкнено) і ChromeOS, а користувачі зможуть вибирати, чи використовувати вбудований клієнт DNS. Для цього потрібно змінити chrome://flags або вказати позначку командного рядка.</translation>
-<translation id="6838056959556423778">Замінює правила вибору принтера за умовчанням у продукті <ph name="PRODUCT_NAME" />.
-
-      Це правило визначає правила вибору принтера за умовчанням у продукті <ph name="PRODUCT_NAME" />, коли функція друку вперше використовується за допомогою профілю.
-
-      Якщо це правило налаштовано, продукт <ph name="PRODUCT_NAME" /> намагатиметься знайти принтер, який відповідає всім указаним атрибутам і встановити його як принтер за умовчанням. Вибирається перший принтер, який відповідає правилу. Якщо виявлено кілька відповідних принтерів, вибирається будь-який із них залежно від порядку їх виявлення.
-
-      Якщо це правило не налаштовано або принтер не знайдено протягом часу очікування, принтером за умовчанням стає вбудований PDF-принтер. Якщо PDF-принтер недоступний, принтер не буде вибрано.
-
-      Здійснюється синтаксичний аналіз значення як об’єкта JSON за такою схемою:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Чи обмежувати пошук відповідного принтера певним набором принтерів.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Регулярний вираз має відповідати ідентифікатору принтера.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Регулярний вираз має відповідати відображуваній назві принтера.",
-            "type": "string"
-          }
-        }
-      }
-
-      Принтери, під’єднані до хмари <ph name="CLOUD_PRINT_NAME" />, визначаються як <ph name="PRINTER_TYPE_CLOUD" />, а всі інші – <ph name="PRINTER_TYPE_LOCAL" />.
-      Пропущене поле означає, що враховуються будь-які значення. Наприклад, якщо не вказати значення для під’єднання, під час попереднього перегляду для друку виявлятимуться всі типи принтерів: локальні та веб-доступні.
-      Шаблони регулярних виразів мають відповідати синтаксису JavaScript RegExp. Збіги чутливі до регістру.</translation>
 <translation id="6843296367238757293">Це правило не підтримується. Радимо не застосовувати його. Докладніше читайте на сторінці https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Це правило видалено в <ph name="PRODUCT_NAME" /> 68 і замінено правилом <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Це правило не підтримується та видалене у версії M66, оскільки воно використовувалося в цілях безпеки та лише для внутрішнього тестування.
@@ -4238,30 +4125,6 @@
       Це правило стосується лише користувачів, які пройшли автентифікацію через SAML.
 
       Значення правила вказується в секундах.</translation>
-<translation id="9027787254195333560">Це правило дає змогу налаштовувати зображення аватару, яке представляє користувача на екрані входу. Для цього потрібно вказати URL-адресу, з якої <ph name="PRODUCT_OS_NAME" /> може завантажити зображення та криптографічний хеш для перевірки цілісності завантаження. Зображення має бути у форматі JPEG, а його розмір не може перевищувати 512 КБ. URL-адреса має бути доступною без автентифікації.
-
-      Зображення аватару завантажується й додається в кеш. Якщо URL-адреса або хеш змінюються, зображення завантажується повторно.
-
-      Це правило потрібно вказати як рядок із URL-адресою й хешом у форматі JSON за наведеною нижче схемою.
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL-адреса, за якою можна завантажити зображення аватару.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Хеш SHA-256 для зображення аватару.",
-            "type": "string"
-          }
-        }
-      }
-
-      Якщо це правило налаштовано, <ph name="PRODUCT_OS_NAME" /> завантажує й застосовує зображення аватару.
-
-      Якщо це правило налаштовано, користувачі не можуть змінювати або замінювати його.
-
-      Якщо це правило не налаштовано, користувач може вибирати зображення аватару, яке представлятиме його на екрані входу.</translation>
 <translation id="9035964157729712237">Ідентифікатори розширень для виключення з "чорного списку"</translation>
 <translation id="9038058011835642205">Визначає список веб-сайтів, які автоматично встановлюються без взаємодії з користувачем і які не можна видалити чи вимкнути.
 
@@ -4274,7 +4137,6 @@
       Якщо це правило налаштовано, користувачі не можуть змінювати або замінювати його.
 
       Значення правила вказується в мілісекундах. Діапазон значень – від 30 секунд до 24 годин.</translation>
-<translation id="9042911395677044526">Дозволяє надсилати конфігурацію мережі для застосування кожним окремим користувачем на пристрої з <ph name="PRODUCT_OS_NAME" />. Конфігурація мережі – це рядок у форматі JSON, визначений форматом Open Network Configuration, який описано на сторінці <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Це правило дає змогу вказати, чи оновлювати пристрій до складання Quick Fix.
 
       Якщо для правила вказано маркер, який зіставляється зі складанням Quick Fix, пристрій буде оновлено до відповідного складання Quick Fix за умови, що це оновлення не блокується іншим правилом.
@@ -4347,17 +4209,6 @@
       Якщо це правило має значення false, опцію "Верхні й нижні колонтитули" не вибрано у вікні попереднього перегляду друку, і користувачі не можуть змінити цей параметр.
 
       Якщо це правило має значення true, опцію "Верхні й нижні колонтитули" вибрано у вікні попереднього перегляду друку, і користувачі не можуть змінити цей параметр.</translation>
-<translation id="9213347477683611358">Можна налаштувати фоновий малюнок пристрою, який відображається на екрані входу на пристрій. Щоб налаштувати це правило, потрібно вказати URL-адресу, з якої пристрій з ОС Chrome може завантажити фоновий малюнок і криптографічний хеш, який використовується для перевірки цілісності завантаження. Зображення має бути у форматі JPEG, а його розмір не може перевищувати 16 МБ. URL-адреса має бути доступною без автентифікації. Фоновий малюнок завантажується на пристрій і додається в кеш. Якщо URL-адреса або хеш зміниться, фоновий малюнок буде завантажено повторно.
-
-      Правило потрібно визначати як рядок, що містить URL-адресу та хеш у форматі JSON, наприклад,
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Якщо це правило налаштовано, пристрій з ОС Chrome завантажить і показуватиме фоновий малюнок на екрані входу, коли користувач ще не ввійшов на пристрої. Щойно користувач увійде, почне діяти правило фонового малюнка користувача.
-
-     Якщо це правило не налаштовано, діятиме правило фонового малюнка користувача, якщо воно налаштовано.</translation>
 <translation id="9217154963008402249">Частота надсилання мережевих пакетів для відстеження</translation>
 <translation id="922540222991413931">Налаштувати джерела встановлення розширень, програм і сценаріїв користувача</translation>
 <translation id="924557436754151212">Імпорт збережених паролів із веб-переглядача за умовчанням під час першого запуску</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index edcf2d1a..52c4c0f 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -417,7 +417,6 @@
 
       Cảnh báo: Không nên ủy quyền kiểm soát phiên bản <ph name="PRODUCT_OS_NAME" /> cho ứng dụng kiosk vì điều này có thể khiến thiết bị không thể nhận được các bản cập nhật phần mềm và các bản vá bảo mật tối quan trọng. Việc ủy quyền kiểm soát phiên bản <ph name="PRODUCT_OS_NAME" /> có thể khiến người dùng gặp rủi ro.</translation>
 <translation id="1675002386741412210">Hỗ trợ trên:</translation>
-<translation id="1689963000958717134">Cho phép áp dụng cấu hình mạng cho tất cả người dùng thiết bị <ph name="PRODUCT_OS_NAME" />. Cấu hình mạng là chuỗi có định dạng JSON như được định nghĩa theo định dạng Cấu hình mạng mở được mô tả tại <ph name="ONC_SPEC_URL" /></translation>
 <translation id="1704516734140344991">Định cấu hình tính sẵn sàng và hành vi của chức năng cập nhật chương trình cơ sở <ph name="TPM_FIRMWARE_UPDATE_TPM" />.
 
       Bạn chỉ có thể chỉ định từng tùy chọn cài đặt trong thuộc tính JSON:
@@ -971,16 +970,6 @@
       Nếu cài đặt này tắt, các trang web không thể sử dụng JavaScript và người dùng không thể thay đổi cài đặt đó.
 
       Nếu cài đặt này bật hoặc không được thiết lập, các trang web có thể sử dụng JavaScript nhưng người dùng có thể thay đổi cài đặt đó.</translation>
-<translation id="2747157663401642394">Định cấu hình các tùy chọn cài đặt quản lý tiện ích cho <ph name="PRODUCT_NAME" />.
-
-          Chính sách này kiểm soát nhiều tùy chọn cài đặt, bao gồm cả những tùy chọn cài đặt chịu sự kiểm soát của các chính sách hiện có liên quan đến tiện ích. Chính sách này sẽ ghi đè bất cứ chính sách cũ nào nếu bạn đặt cả hai.
-
-          Chính sách này liên kết một mã tiện ích hoặc một URL cập nhật với cấu hình tương ứng. Với mã tiện ích, cấu hình sẽ chỉ áp dụng cho tiện ích đã chỉ định. Bạn có thể đặt cấu hình mặc định cho mã đặc biệt <ph name="DEFAULT_SCOPE" />. Cấu hình này sẽ được áp dụng cho tất cả tiện ích chưa đặt cấu hình tùy chỉnh trong chính sách này. Với URL cập nhật, cấu hình sẽ được áp dụng cho tất cả tiện ích có URL cập nhật chính xác nêu trong tệp kê khai của tiện ích này, như mô tả tại <ph name="LINK_TO_EXTENSION_DOC1" />.
-
-          Đối với các phiên bản Windows không liên kết với miền <ph name="MS_AD_NAME" />, việc cài đặt bắt buộc chỉ giới hạn ở các ứng dụng và tiện ích có trong Cửa hàng Chrome trực tuyến.
-
-          Để xem phần mô tả đầy đủ về các tùy chọn cài đặt có thể có và cấu trúc của chính sách này, vui lòng truy cập vào https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">Hạn chế phạm vi của cổng UDP cục bộ do WebRTC sử dụng</translation>
 <translation id="2757054304033424106">Các loại tiện ích/ứng dụng được phép cài đặt</translation>
 <translation id="2758084448533744848">Chỉ định múi giờ bắt buộc để sử dụng cho thiết bị. Khi bạn đặt chính sách này, thì người dùng không thể ghi đè múi giờ đã chỉ định trên thiết bị. Nếu bạn chỉ định một giá trị không hợp lệ, thì chính sách này vẫn sẽ được kích hoạt bằng "GMT". Nếu bạn chỉ định một chuỗi trống, thì chính sách này sẽ bị bỏ qua.
@@ -1752,30 +1741,6 @@
       Chính sách này chỉ ảnh hưởng đến người dùng xác thực bằng cách sử dụng SAML.</translation>
 <translation id="4105989332710272578">Tắt buộc thực thi Tính minh bạch của chứng chỉ cho danh sách URL</translation>
 <translation id="4121350739760194865">Chặn các quảng cáo ứng dụng xuất hiện trên trang tab mới</translation>
-<translation id="4125606414556046117">Chính sách này cho phép bạn định cấu hình hình nền hiển thị trên màn hình và trên nền màn hình đăng nhập cho người dùng. Bạn đặt chính sách này bằng cách chỉ định URL mà từ đó <ph name="PRODUCT_OS_NAME" /> có thể tải hình nền xuống và dùng hàm băm mật mã để xác minh tính toàn vẹn của hình nền tải xuống. Hình ảnh phải ở định dạng JPEG, kích thước tệp không được vượt quá 16 MB. URL phải truy cập được mà không cần xác thực.
-
-      Hình nền được tải xuống và lưu vào bộ nhớ đệm. Hình nền sẽ được tải xuống lại bất cứ khi nào URL hoặc hàm băm thay đổi.
-
-      Bạn nên chỉ định chính sách này dưới dạng một chuỗi biểu thị URL và hàm băm ở định dạng JSON, tuân theo giản đồ sau:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL mà từ đó có thể tải hình nền xuống.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hàm băm SHA-256 của hình nền.",
-            "type": "string"
-          }
-        }
-      }
-
-      Nếu bạn đặt chính sách này, <ph name="PRODUCT_OS_NAME" /> sẽ tải xuống và sử dụng hình nền.
-
-      Nếu bạn đặt chính sách này, người dùng sẽ không thể thay đổi hay ghi đè chính sách.
-
-      Nếu bạn không đặt chính sách này, người dùng có thể chọn hình ảnh để hiển thị trên màn hình và trên nền màn hình đăng nhập.</translation>
 <translation id="412697421478384751">Cho phép người dùng đặt mã PIN yếu cho mã PIN màn hình khóa.</translation>
 <translation id="4138655880188755661">Giới hạn thời gian</translation>
 <translation id="4144164749344898721">Chính sách này kiểm soát nhiều tùy chọn cài đặt cho chiến lược quản lý nguồn khi người dùng ở chế độ không sử dụng.
@@ -2098,7 +2063,7 @@
 <translation id="487460824085252184">Tự động di chuyển, không cần yêu cầu sự chấp thuận của người dùng.</translation>
 <translation id="4874982543810021567">Chặn WebUSB trên các trang web này</translation>
 <translation id="4876805738539874299">Đã bật phiên bản SSL tối đa</translation>
-<translation id="4887274746092315609">Cho phép người dùng SAML đổi mật khẩu của một trang ngay trong phiên đăng nhập</translation>
+<translation id="4887274746092315609">Cho phép một trang để người dùng SAML có thể đổi mật khẩu ngay trong phiên đăng nhập</translation>
 <translation id="4897928009230106190">Chỉ định tham số được dùng khi thực hiện tìm kiếm theo đề xuất với POST. Tham số này bao gồm các cặp tên/giá trị phân tách bằng dấu phẩy. Nếu một giá trị là tham số mẫu như {searchTerms} trong ví dụ trên, tham số đó sẽ được thay thế bằng dữ liệu cụm từ tìm kiếm thực.
 
           Chính sách này là tùy chọn. Nếu không đặt, yêu cầu tìm kiếm theo đề xuất sẽ được gửi bằng phương thức GET.
@@ -2731,53 +2696,6 @@
 
        Nếu chính sách này không được đặt hoặc bị đặt thành sai, lệnh in sẽ chạy màn hình chế độ xem trước bản in.</translation>
 <translation id="6022948604095165524">Tác vụ khi khởi động</translation>
-<translation id="6023030044732320798">Chỉ định một nhóm chính sách sẽ được chuyển giao cho thư viện thời gian chạy ARC. Giá trị phải là định dạng JSON hợp lệ.
-
-      Chính sách này có thể dùng để định cấu hình ứng dụng Android nào sẽ được tự động cài đặt trên thiết bị:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Giá trị nhận dạng ứng dụng Android, ví dụ: "com.google.android.gm" cho Gmail",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "Chỉ định cách cài đặt ứng dụng. OPTIONAL: Ứng dụng không được cài đặt tự động, nhưng người dùng có thể tự cài đặt. Đây là cài đặt mặc định nếu không chỉ định chính sách này. PRELOAD: Ứng dụng được cài đặt tự động, nhưng người dùng có thể gỡ cài đặt. FORCE_INSTALLED: Ứng dụng được cài đặt tự động và người dùng không thể gỡ cài đặt. BLOCKED: Ứng dụng bị chặn và không thể cài đặt. Nếu ứng dụng đã được cài đặt theo một chính sách trước đây thì nó sẽ bị gỡ cài đặt.",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "Chính sách yêu cầu cấp quyền cho ứng dụng. PERMISSION_POLICY_UNSPECIFIED: Không chỉ định chính sách. Nếu không có chính sách cấp quyền ở cấp nào, hành vi `PROMPT` sẽ được áp dụng theo mặc định. PROMPT: Nhắc người dùng cấp quyền. GRANT: Tự động cấp quyền. DENY: Tự động từ chối quyền.",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "Đối tượng cấu hình JSON riêng cho ứng dụng, chứa một tập hợp các cặp khóa-giá trị, ví dụ: '"managedConfiguration": { "key1": value1, "key2": value2 }'. Các khóa được định nghĩa trong trong tệp kê khai của ứng dụng.",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      Để ghim ứng dụng vào trình khởi chạy, hãy xem PinnedLauncherApps.</translation>
 <translation id="602728333950205286">URL instant của nhà cung cấp dịch vụ tìm kiếm mặc định</translation>
 <translation id="603410445099326293">Tham số cho URL đề xuất sử dụng POST</translation>
 <translation id="6034341625190551415">Kiểm soát phiên công khai và loại tài khoản kiosk.</translation>
@@ -3130,37 +3048,6 @@
       Nếu bạn đặt chính sách này thành false, thì ứng dụng DNS tích hợp sẽ không bao giờ được sử dụng.
 
       Nếu bạn không đặt chính sách này, thì ứng dụng DNS tích hợp sẽ được bật theo mặc định trên MacOS, Android (khi cả VPN lẫn DNS riêng đều không được bật) và ChromeOS, đồng thời người dùng sẽ có thể thay đổi tùy chọn có sử dụng ứng dụng DNS tích hợp hay không bằng cách chỉnh sửa chrome://flags hoặc chỉ định một cờ dòng lệnh.</translation>
-<translation id="6838056959556423778">Ghi đè các quy tắc chọn máy in mặc định trong <ph name="PRODUCT_NAME" />.
-
-      Chính sách này xác định quy tắc chọn máy in mặc định trong <ph name="PRODUCT_NAME" />. Điều này xảy ra vào lần đầu chức năng in được sử dụng với một cấu hình.
-
-      Khi bạn đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ cố tìm một máy in khớp với tất cả các thuộc tính đã chỉ định và chọn thiết bị đó làm máy in mặc định. Máy in đầu tiên được tìm thấy phù hợp với chính sách sẽ được chọn, trong trường hợp kết quả trùng khớp không phải duy nhất, thì có thể chọn bất kỳ máy in trùng khớp nào tùy thuộc vào thứ tự mà máy in được tìm thấy.
-
-      Nếu bạn chưa đặt chính sách này hoặc không tìm thấy máy in trùng khớp trong khoảng thời gian chờ thì máy in sẽ được đặt mặc định thành máy in PDF tích hợp hoặc không có máy in nào được chọn khi không có máy in PDF.
-
-      Giá trị này được phân tích cú pháp dưới dạng đối tượng JSON, tuân theo giản đồ sau đây:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "Whether to limit the search of the matching printer to a specific set of printers.",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "Regular expression to match printer id.",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "Regular expression to match printer display name.",
-            "type": "string"
-          }
-        }
-      }
-
-      Máy in đã kết nối với <ph name="CLOUD_PRINT_NAME" /> được coi là <ph name="PRINTER_TYPE_CLOUD" />, các máy in còn lại được phân loại là <ph name="PRINTER_TYPE_LOCAL" />.
-      Bỏ qua một trường nghĩa là tất cả các giá trị trùng khớp, chẳng hạn như không chỉ rõ hoạt động kết nối, sẽ làm cho chế độ Xem trước bản in bắt đầu tìm tất cả các loại máy in, cục bộ và trên đám mây.
-      Mẫu biểu thức thông thường phải tuân thủ cú pháp JavaScript RegExp và kết quả trùng khớp có phân biệt chữ hoa-thường.</translation>
 <translation id="6843296367238757293">Chính sách này không còn dùng nữa. Bạn không nên sử dụng chính sách này. Đọc thêm tại https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">Chính sách này đã bị xóa trong <ph name="PRODUCT_NAME" /> 68 và thay thế bằng <ph name="ARC_GLS_POLICY_NAME" />.</translation>
 <translation id="6856743875250214792">Chính sách này không được dùng nữa và đã bị xóa trong M66, vì chính sách này trước đây chỉ dùng để kiểm tra nội bộ và tiềm ẩn nguy cơ bảo mật.
@@ -4323,30 +4210,6 @@
       Chính sách này chỉ ảnh hưởng đến người dùng đã xác thực bằng Ngôn ngữ đánh dấu xác nhận bảo mật (SAML).
 
       Bạn nên chỉ định giá trị tính bằng giây cho chính sách này.</translation>
-<translation id="9027787254195333560">Chính sách này cho phép bạn định cấu hình hình đại diện cho người dùng trên màn hình đăng nhập. Bạn đặt chính sách này bằng cách chỉ định URL mà từ đó <ph name="PRODUCT_OS_NAME" /> có thể tải xuống hình đại diện và một hàm băm mật mã dùng để xác minh tính toàn vẹn của tài nguyên đã tải xuống. Ảnh phải ở định dạng JPEG, kích thước ảnh không được vượt quá 512 kB. URL phải truy cập được mà không cần xác thực.
-
-      Hình đại diện được tải xuống và lưu vào bộ nhớ đệm. Hình nền sẽ được tải xuống lại bất cứ khi nào URL hoặc hàm băm thay đổi.
-
-      Bạn nên chỉ định chính sách này dưới dạng một chuỗi biểu thị URL và hàm băm ở định dạng JSON, tuân theo giản đồ sau:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "URL mà từ đó có thể tải hình đại diện xuống.",
-            "type": "string"
-          },
-          "hash": {
-            "description": "Hàm băm SHA-256 của hình đại diện.",
-            "type": "string"
-          }
-        }
-      }
-
-      Nếu bạn đặt chính sách này, <ph name="PRODUCT_OS_NAME" /> sẽ tải xuống và sử dụng hình đại diện.
-
-      Nếu bạn đặt chính sách này, người dùng sẽ không thể thay đổi hay ghi đè chính sách.
-
-      Nếu bạn không đặt chính sách này, người dùng có thể chọn hình đại diện cho họ trên màn hình đăng nhập.</translation>
 <translation id="9035964157729712237">Các ID tiện ích được miễn khỏi danh sách đen</translation>
 <translation id="9038058011835642205">Chỉ định danh sách các trang web được cài đặt tự động mà không có sự tương tác của người dùng và người dùng không thể gỡ cài đặt cũng như tắt.
 
@@ -4359,7 +4222,6 @@
       Nếu bạn đặt chính sách này, người dùng sẽ không thể thay đổi hay ghi đè chính sách.
 
       Bạn nên chỉ định giá trị tính bằng mili giây cho chính sách. Giá trị được giới hạn trong khoảng từ 30 giây đến 24 giờ.</translation>
-<translation id="9042911395677044526">Cho phép áp dụng cấu hình mạng cho mỗi người dùng thiết bị <ph name="PRODUCT_OS_NAME" />. Cấu hình mạng là chuỗi có định dạng JSON như được định nghĩa theo định dạng Cấu hình mạng mở được mô tả tại <ph name="ONC_SPEC_URL" /></translation>
 <translation id="9050853837490399534">Chính sách này kiểm soát việc có cập nhật thiết bị lên Bản dựng Quick Fix hay không.
 
       Nếu bạn đặt giá trị của chính sách thành một mã thông báo tương ứng với Bản dựng Quick Fix, thì thiết bị sẽ được cập nhật lên Bản dựng Quick Fix tương ứng nếu không có chính sách nào khác chặn quá trình cập nhật này.
@@ -4439,17 +4301,6 @@
       Nếu đặt chính sách này thành false, thì tùy chọn 'Đầu trang và chân trang' sẽ không được chọn trong hộp thoại xem trước bản in và người dùng không thể thay đổi điều này.
 
       Nếu đặt chính sách này thành true, thì tùy chọn 'Đầu trang và chân trang' sẽ được chọn trong hộp thoại xem trước bản in và người dùng không thể thay đổi điều này.</translation>
-<translation id="9213347477683611358">Định cấu hình hình nền cấp thiết bị được hiển thị trên màn hình đăng nhập nếu chưa có người dùng nào đăng nhập vào thiết bị. Bạn có thể đặt chính sách bằng cách chỉ định URL mà từ đó thiết bị Chrome OS có thể tải xuống hình nền và sử dụng một hàm băm mật mã hóa để xác minh tính toàn vẹn của nội dung tải xuống. Hình ảnh phải ở định dạng JPEG với kích thước tệp hình ảnh không được vượt quá 16MB. URL phải truy cập được mà không cần bất kỳ hình thức xác thực nào. Hình nền được tải xuống và lưu vào bộ nhớ đệm. Hình ảnh sẽ được tải xuống lại mỗi khi URL hoặc hàm băm thay đổi.
-
-      Chính sách phải được chỉ định dưới dạng một chuỗi biểu thị URL và hàm băm ở định dạng JSON, ví dụ:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      Nếu đã đặt chính sách hình nền thiết bị, thiết bị Chrome OS sẽ tải xuống và sử dụng hình nền trên màn hình đăng nhập nếu chưa có người dùng nào đăng nhập vào thiết bị. Sau khi người dùng đăng nhập, chính sách hình nền của người dùng sẽ kích hoạt.
-
-      Nếu chưa đặt chính sách hình nền thiết bị thì chính sách hình nền của người dùng sẽ quyết định nội dung hiển thị nếu đã đặt chính sách hình nền của người dùng.</translation>
 <translation id="9217154963008402249">Tần suất theo dõi gói mạng</translation>
 <translation id="922540222991413931">Định cấu hình nguồn cài đặt tiện ích, ứng dụng và tập lệnh người dùng</translation>
 <translation id="924557436754151212">Nhập mật khẩu đã lưu từ trình duyệt mặc định trong lần chạy đầu tiên</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 83f75fb2..170f30d 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -381,7 +381,6 @@
 
       警告:建议您不要委托自助服务终端应用控制 <ph name="PRODUCT_OS_NAME" />版本,因为这可能会阻止相应设备接收软件更新和重要的安全修补程序。委托 <ph name="PRODUCT_OS_NAME" />版本控制可能会将用户置于风险之中。</translation>
 <translation id="1675002386741412210">支持的环境:</translation>
-<translation id="1689963000958717134">允许将推送网络配置应用于安装了 <ph name="PRODUCT_OS_NAME" />的设备的所有用户。网络配置为 JSON 格式的字符串,具体定义如 <ph name="ONC_SPEC_URL" /> 中的开放网络配置格式所述。</translation>
 <translation id="1704516734140344991">配置 <ph name="TPM_FIRMWARE_UPDATE_TPM" /> 固件更新功能的可用性和行为。
 
       各项具体设置可在 JSON 属性中进行指定:
@@ -905,16 +904,6 @@
       如果停用此设置,网页就无法使用 JavaScript,用户也无法更改该设置。
 
       如果启用或不设定此设置,网页就可以使用 JavaScript,但用户可以更改该设置。</translation>
-<translation id="2747157663401642394">为 <ph name="PRODUCT_NAME" /> 配置扩展程序管理设置。
-
-          此政策可控制多项设置,其中包括由任何与扩展程序相关的现有政策控制的设置。此政策会覆盖所有旧版政策(如果同时设置了此政策和旧版政策)。
-
-          此政策可将某个扩展程序 ID 或某个更新网址映射至相应配置。对于扩展程序 ID,相应配置只会应用于所指定的扩展程序。您可为特殊 ID<ph name="DEFAULT_SCOPE" />设定默认配置,该配置将会应用于未在此政策中设定自定义配置的所有扩展程序。对于更新网址,相应配置将会应用于具有在此扩展程序的清单中注明的确切更新网址的所有扩展程序(如 <ph name="LINK_TO_EXTENSION_DOC1" /> 中所述)。
-
-          对于未加入 <ph name="MS_AD_NAME" /> 网域的 Windows 实例,强制安装仅限于 Chrome 网上应用店中列出的应用和扩展程序。
-
-          若想全面了解此政策的可能设置和结构,请访问 https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">限制 WebRTC 使用的本地 UDP 端口的范围</translation>
 <translation id="2757054304033424106">允许安装的扩展程序/应用的类型</translation>
 <translation id="2758084448533744848">指定要强制该设备采用的时区。如果设置了此政策,该设备的用户将无法覆盖指定的时区。如果提供了无效值,系统仍会启用此政策,但会改用“GMT”时区。如果提供了空字符串,系统将忽略此政策。
@@ -1135,9 +1124,9 @@
       无论是否设置此政策或如何设置此政策,用户都无法更改 WPAD 优化设置。</translation>
 <translation id="3071839057966069710">配置打印机列表。
 
-      通过此政策,管理员可为他们的用户提供打印机配置。
+      通过此政策,管理员可为用户提供打印机配置。
 
-      “<ph name="PRINTER_DISPLAY_NAME" />”和“<ph name="PRINTER_DESCRIPTION" />”均为自由格式的字符串,且均可被自定义以便于选择打印机。“<ph name="PRINTER_MANUFACTURER" />”和“<ph name="PRINTER_MODEL" />”则可以帮助最终用户轻松识别打印机。它们分别代表打印机的制造商和型号。“<ph name="PRINTER_URI" />”应是可通过客户的计算机访问的地址,包括“<ph name="URI_SCHEME" />”、“<ph name="URI_PORT" />”和“<ph name="URI_QUEUE" />”。“<ph name="PRINTER_UUID" />”是可选项。如果提供的话,该项可用于帮助删除重复的“<ph name="ZEROCONF_DISCOVERY" />”打印机。
+      “<ph name="PRINTER_DISPLAY_NAME" />”和“<ph name="PRINTER_DESCRIPTION" />”均为自由格式的字符串,且均可被自定义以便于选择打印机。“<ph name="PRINTER_MANUFACTURER" />”和“<ph name="PRINTER_MODEL" />”则可以帮助最终用户轻松识别打印机。它们分别代表打印机的制造商和型号。“<ph name="PRINTER_URI" />”应是可通过客户端计算机访问的地址,包括“<ph name="URI_SCHEME" />”、“<ph name="URI_PORT" />”和“<ph name="URI_QUEUE" />”。“<ph name="PRINTER_UUID" />”是可选项。如果提供的话,该项可用于帮助删除重复的“<ph name="ZEROCONF_DISCOVERY" />”打印机。
 
       “<ph name="PRINTER_EFFECTIVE_MODEL" />”必须与代表 <ph name="PRODUCT_NAME" />支持的打印机的某个字符串匹配。该字符串将用于识别和为打印机安装相应的 PPD。如需了解详情,请访问:https://support.google.com/chrome?p=noncloudprint。
 
@@ -1145,7 +1134,7 @@
 
       要么 <ph name="PRINTER_EFFECTIVE_MODEL" /> 应该包含打印机的名称,要么 <ph name="PRINTER_AUTOCONF" /> 应该设置为 true。具有这两种属性或者不具有任一属性的打印机将会被忽略。
 
-      打印机设置会在用户首次使用打印机时完成。在用户开始使用打印机之前,系统不会下载 PPD。在用户开始使用打印机之后,系统则会缓存经常使用的 PPD。
+      打印机设置会在用户首次使用打印机时完成。在用户开始使用打印机之前,系统不会下载 PPD。在用户开始使用打印机之后,系统会缓存经常使用的 PPD。
 
       此政策对用户能否在某设备上配置打印机没有影响。它旨在对各个用户的打印机配置起到补充作用。
 
@@ -1655,30 +1644,6 @@
       此政策仅会影响那些使用 SAML 验证身份的用户。</translation>
 <translation id="4105989332710272578">对于指定的一系列网址,不强制要求必须符合证书透明度政策</translation>
 <translation id="4121350739760194865">阻止在新标签页上显示应用宣传信息</translation>
-<translation id="4125606414556046117">通过此政策,您可以指定要在用户的桌面和登录屏幕背景中显示的壁纸图片。要设置此政策,请指定可供 <ph name="PRODUCT_OS_NAME" />下载相应壁纸图片的网址,并指定用于验证下载内容是否完整的加密哈希值。图片必须是 JPEG 格式,且大小不得超过 16MB。网址必须可直接访问,而无需进行任何身份验证。
-
-      系统会下载并缓存相应的壁纸图片。只要网址或哈希值有任何变化,系统都会重新下载相应的壁纸图片。
-
-      在设置此政策时,应按照以下范本,采用以 JSON 格式表示网址和哈希值的字符串形式来指定:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "可供下载相应壁纸图片的网址。",
-            "type": "string"
-          },
-          "hash": {
-            "description": "相应壁纸图片的 SHA-256 哈希值。",
-            "type": "string"
-          }
-        }
-      }
-
-      如果设置了此政策,<ph name="PRODUCT_OS_NAME" />将下载并使用相应的壁纸图片。
-
-      如果您设置了此政策,用户将无法更改或替换此政策。
-
-      如果未设置此政策,用户将可以自行选择要在桌面和登录屏幕背景中显示的图片。</translation>
 <translation id="412697421478384751">允许用户设置安全性较低的锁定屏幕 PIN 码</translation>
 <translation id="4138655880188755661">时限</translation>
 <translation id="4144164749344898721">此政策用于控制设备闲置时电源管理策略中的多项相关设置。
@@ -2585,53 +2550,6 @@
 
       如果此策略未设置或设置为 False,打印命令将触发打印预览屏幕。</translation>
 <translation id="6022948604095165524">启动时的操作</translation>
-<translation id="6023030044732320798">指定要向 ARC 运行时传递的一系列政策。相应值必须是有效的 JSON。
-
-      此政策可用于配置哪些 Android 应用会在设备上自动安装:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android 应用标识符,例如“com.google.android.gm”是 Gmail 的标识符",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "指定相应应用的安装方式。OPTIONAL:系统不会自动安装该应用,但用户可以安装它。如果未指定此政策,这即是默认设置。PRELOAD:系统会自动安装该应用,但用户可以卸载它。FORCE_INSTALLED:系统会自动安装该应用,且用户无法卸载它。BLOCKED:该应用已被屏蔽且无法安装。如果系统已根据之前的政策安装了该应用,则会将其卸载。",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "此政策用于向应用授予所请求的权限。PERMISSION_POLICY_UNSPECIFIED:未指定此政策。如果在任何等级都未针对相应权限指定政策,系统便会默认使用“PROMPT”行为。PROMPT:提示用户授予相应权限。GRANT:自动授予相应权限。DENY:自动拒绝授予相应权限。",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "包含一系列键值对的应用专用型 JSON 配置对象,例如“"managedConfiguration": { "key1": value1, "key2": value2 }”。这些键是在应用清单中定义的。",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      要将应用固定到启动器上,请参阅 PinnedLauncherApps。</translation>
 <translation id="602728333950205286">默认搜索服务提供商的即搜即得网址</translation>
 <translation id="603410445099326293">在使用 POST 的建议网址中所需的参数</translation>
 <translation id="6034341625190551415">控制公用自助终端和自助服务终端帐号类型。</translation>
@@ -2967,36 +2885,6 @@
       如果此政策设为 False,系统将永远不会使用内置 DNS 客户端。
 
       如果此政策未设置,那么在 MacOS、Android(当私人 DNS 和 VPN 均未启用时)和 ChromeOS 中,内置 DNS 客户端将会默认处于启用状态,并且用户将能够通过修改 chrome://flags 或指定命令行标记来更改是否使用内置 DNS 客户端。</translation>
-<translation id="6838056959556423778">替换 <ph name="PRODUCT_NAME" /> 默认打印机选择规则。
-      此政策用于确定:当用户以相应个人资料首次在 <ph name="PRODUCT_NAME" /> 中使用打印功能时,系统会遵循什么样的规则来选择默认打印机。
-
-      如果此政策已设置,<ph name="PRODUCT_NAME" /> 会尝试找到一台与所有指定属性都相符的打印机,并会将其选为默认打印机。系统会选择所找到的第一台与此政策相符的打印机(如果找到了多台相符的打印机,则可能会选择其中任一台,具体取决于找到这些打印机的顺序)。
-
-      如果此政策未设置,或在规定的时限内未找到相符的打印机,系统便会选择内置的 PDF 打印机作为默认打印机;如果没有 PDF 打印机,则不会选择任何打印机。
-
-      系统会按照以下范本将此政策的值作为 JSON 对象进行解析:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "是否要将相符打印机的搜索范围限定为一组特定的打印机。",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "用于匹配打印机 ID 的正则表达式。",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "用于匹配打印机显示名的正则表达式。",
-            "type": "string"
-          }
-        }
-      }
-
-      连接到 <ph name="CLOUD_PRINT_NAME" />的打印机会被视为<ph name="PRINTER_TYPE_CLOUD" />打印机,其余打印机则会归类为<ph name="PRINTER_TYPE_LOCAL" />打印机。
-      如果未在某个字段中输入值,则意味着所有打印机都符合此项属性。例如,如果不指定网络连接状态,那么当进行打印预览时,系统将会查找所有类型的打印机(本地打印机和云端打印机)。
-      正则表达式的格式必须遵循 JavaScript RegExp 语法,并在匹配时区分大小写。</translation>
 <translation id="6843296367238757293">此政策已被弃用。建议您改用其他政策。如需了解详情,请访问 https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">此政策已在 <ph name="PRODUCT_NAME" /> 68 中移除,并已由 <ph name="ARC_GLS_POLICY_NAME" /> 取代。</translation>
 <translation id="6856743875250214792">我们已在 M66 中弃用并移除了此政策,因为它仅用于内部测试且存在安全隐患。
@@ -4085,30 +3973,6 @@
       此政策仅影响使用 SAML 验证身份的用户。
 
       此政策的值应以秒为单位。</translation>
-<translation id="9027787254195333560">通过此政策,您可以配置用于在登录屏幕上代表用户的头像图片。要设置此政策,请指定一个可供 <ph name="PRODUCT_OS_NAME" />下载头像图片的网址,并指定一个用于验证下载内容是否完整的加密哈希值。图片必须是 JPEG 格式,且大小不得超过 512KB。网址必须可直接访问,而无需进行任何身份验证。
-
-      系统会下载并缓存相应的头像图片。只要网址或哈希值有任何变化,系统都会重新下载相应的头像图片。
-
-      在设置此政策时,应按照以下范本,采用以 JSON 格式表示网址和哈希值的字符串形式来指定:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "可供下载相应头像图片的网址。",
-            "type": "string"
-          },
-          "hash": {
-            "description": "相应头像图片的 SHA-256 哈希值。",
-            "type": "string"
-          }
-        }
-      }
-
-      如果设置了此政策,<ph name="PRODUCT_OS_NAME" />将下载并使用相应的头像图片。
-
-      如果您设置了此政策,用户将无法更改或替换此政策。
-
-      如果未设置此政策,则用户可以自行选择在登录屏幕上代表自己的头像图片。</translation>
 <translation id="9035964157729712237">要从黑名单中排除的扩展程序 ID</translation>
 <translation id="9038058011835642205">以列表形式指定一系列无需用户干预即会静默安装且无法由用户卸载或停用的网站。
 
@@ -4121,7 +3985,6 @@
       如果您设置了此政策,用户将无法更改或替换此政策。
 
       该政策值应该以毫秒为单位。值的范围限定在 30 秒到 24 小时之间。</translation>
-<translation id="9042911395677044526">允许将要按用户应用的网络配置推送到 <ph name="PRODUCT_OS_NAME" />设备。网络配置是 JSON 格式的字符串,具体定义如 <ph name="ONC_SPEC_URL" /> 中的开放网络配置格式所述。</translation>
 <translation id="9050853837490399534">此政策用于控制相应设备是否应该更新至 Quick Fix Build。
 
       如果此政策的值设为与 Quick Fix Build 对应的令牌,那么只要更新未被其他政策阻止,该设备就会更新至相应的 Quick Fix Build。
@@ -4192,17 +4055,6 @@
       如果此政策设为 false,系统将不会在打印预览对话框内选中“页眉和页脚”,并且用户将无法更改此设置。
 
       如果此政策设为 true,系统会在打印预览对话框内选中“页眉和页脚”,并且用户将无法更改此设置。</translation>
-<translation id="9213347477683611358">配置在无任何用户登录设备的情况下显示在登录屏幕上的设备级壁纸图片。要设置此政策,请指定可供 Chrome 操作系统设备下载相应壁纸图片的网址,并指定用于验证下载内容是否完整的加密哈希值。图片必须是 JPEG 格式,且大小不得超过 16MB。网址必须可供直接访问,而无需进行任何身份验证。系统会下载并缓存相应的壁纸图片。网址或哈希值只要有任何变化,系统即会重新下载壁纸图片。
-
-      指定此政策时,请使用 JSON 格式的字符串来表示网址和哈希值,例如:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      设置该设备壁纸政策后,如果还没有任何用户登录设备,Chrome 操作系统设备将下载并使用显示在登录屏幕上的壁纸图片。一旦用户登录设备,用户的壁纸政策就会生效。
-
-      如果该设备壁纸政策未设置,则由用户的壁纸政策(如果已设置用户的壁纸政策)来决定要显示的图片。</translation>
 <translation id="9217154963008402249">发送监控网络数据包的频率</translation>
 <translation id="922540222991413931">配置扩展程序、应用和用户脚本安装源</translation>
 <translation id="924557436754151212">首次运行时,从默认浏览器导入保存的密码</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index d7ebc69..cedebe9 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -403,7 +403,6 @@
 
       警告:我們不建議將對 <ph name="PRODUCT_OS_NAME" /> 版本的控制權委派給資訊站應用程式,因為這可能導致裝置無法接收軟體更新,且無法修正重大的安全性問題。委派 <ph name="PRODUCT_OS_NAME" /> 版本的控制權可能讓使用者面臨風險。</translation>
 <translation id="1675002386741412210">支援環境:</translation>
-<translation id="1689963000958717134">允許將網路設定按照使用者套用至已安裝 <ph name="PRODUCT_OS_NAME" /> 的裝置。該網路設定是由「開放網路設定」格式 (請參閱:<ph name="ONC_SPEC_URL" />) 所定義的 JSON 格式字串。</translation>
 <translation id="1704516734140344991">設定 <ph name="TPM_FIRMWARE_UPDATE_TPM" /> 韌體更新功能的可用性和行為。
 
       你可以在 JSON 屬性中指定個別設定:
@@ -946,16 +945,6 @@
       如果這項設定已停用,所有的網頁都無法使用 JavaScript,使用者也無法變更這項設定。
 
       如果這項設定已啟用或並未指定,網頁就能使用 JavaScript,但使用者可以變更這項設定。</translation>
-<translation id="2747157663401642394">配置 <ph name="PRODUCT_NAME" /> 的擴充功能管理設定。
-
-          這項政策可控管多項設定,包括由任何現有擴充功能相關政策控管的設定。這項政策將覆寫任何舊版政策的設定 (如果兩個都有設定的話)。
-
-          這項政策可將擴充功能 ID 或更新網址對應到其設定中。如果你指定了擴充功能 ID,系統就只會將設定套用到指定的擴充功能。你可以指定特殊 ID <ph name="DEFAULT_SCOPE" /> 的預設設定,所有未透過這項政策自訂設定的擴充功能一律會套用預設設定。如果你指定了更新網址,系統會根據這個擴充功能資訊清單提供的確切更新網址 (如 <ph name="LINK_TO_EXTENSION_DOC1" /> 所述),將設定套用至所有擴充功能。
-
-          如果是尚未加入 <ph name="MS_AD_NAME" /> 網域的 Windows 執行個體,系統只會針對 Chrome 線上應用程式商店中的應用程式和擴充功能執行強制安裝作業。
-
-          如需本政策可用設定和結構的完整說明,請造訪 https://www.chromium.org/administrators/policy-list-3/extension-settings-full
-          </translation>
 <translation id="2753637905605932878">限制 WebRTC 所使用的本機 UDP 通訊埠範圍</translation>
 <translation id="2757054304033424106">允許安裝的擴充功能/應用程式類型</translation>
 <translation id="2758084448533744848">指定這部裝置要使用的強制時區。設定這項政策後,裝置上的使用者將無法覆寫指定時區。如果提供了無效值,這項政策仍會啟用,但改採「GMT」時區。如果提供了空白字串,系統會忽略這項政策。
@@ -982,7 +971,7 @@
           如果未設定這項政策,受管理裝置上的預設值為 False。</translation>
 <translation id="2787173078141616821">回報 Android 狀態的相關資訊</translation>
 <translation id="2799297758492717491">允許符合網址模式許可清單的網頁自動播放媒體</translation>
-<translation id="2801155097555584385">自訂電池開始充電的值 (以百分比為單位)</translation>
+<translation id="2801155097555584385">自訂電池開始充電值 (以百分比表示)</translation>
 <translation id="2801230735743888564">允許使用者在裝置處於離線狀態時玩恐龍復活節彩蛋遊戲。
 
       如果將這項政策設為 False,使用者將無法在裝置處於離線狀態時玩恐龍復活節彩蛋遊戲。如果將這項政策設為 True,使用者就可以玩這個遊戲。如果未設定這項政策,使用者將無法在已註冊的 Chrome 作業系統中玩恐龍復活節彩蛋遊戲,但可以在其他環境下玩這個遊戲。</translation>
@@ -1175,7 +1164,7 @@
 
       這項政策可讓管理員為使用者提供印表機設定。
 
-      「<ph name="PRINTER_DISPLAY_NAME" />」和「<ph name="PRINTER_DESCRIPTION" />」可填入形式不拘的自訂字串,方便使用者選取印表機。「<ph name="PRINTER_MANUFACTURER" />」和「<ph name="PRINTER_MODEL" />」可讓使用者輕鬆識別印表機,兩者分別代表印表機的製造商和型號。<ph name="PRINTER_URI" /> 必須是可透過用戶端電腦連接的位址,包括 <ph name="URI_SCHEME" />、<ph name="URI_PORT" /> 和 <ph name="URI_QUEUE" />。<ph name="PRINTER_UUID" /> 為選填欄位。如有提供這項資訊,系統會用來刪除重複的 <ph name="ZEROCONF_DISCOVERY" /> 部印表機。
+      「<ph name="PRINTER_DISPLAY_NAME" />」和「<ph name="PRINTER_DESCRIPTION" />」可填入形式不拘的自訂字串,方便使用者選取印表機。「<ph name="PRINTER_MANUFACTURER" />」和「<ph name="PRINTER_MODEL" />」可讓使用者輕鬆識別印表機,兩者分別代表印表機的製造商和型號。<ph name="PRINTER_URI" /> 必須是可透過用戶端電腦連線的位址,包括 <ph name="URI_SCHEME" />、<ph name="URI_PORT" /> 和 <ph name="URI_QUEUE" />。<ph name="PRINTER_UUID" /> 為選填欄位。如有提供這項資訊,系統會用來刪除重複的 <ph name="ZEROCONF_DISCOVERY" /> 印表機。
 
       <ph name="PRINTER_EFFECTIVE_MODEL" /> 必須與其中一個代表 <ph name="PRODUCT_NAME" />支援的印表機字串相符。系統會利用這個字串找出並安裝印表機適用的 PPD。詳情請參閱 https://support.google.com/chrome?p=noncloudprint。
 
@@ -1597,7 +1586,7 @@
 
           如果你設為 False 或未設定,使用者即可將檔案傳輸至 Google 雲端硬碟。</translation>
 <translation id="3915395663995367577">Proxy .pac 檔案的網址</translation>
-<translation id="3920892052017026701">自訂開始充電的值 (以百分比為單位)。
+<translation id="3920892052017026701">自訂開始充電的值 (以百分比表示)。
 
           電池電量耗用到自訂的開始充電值時,就會開始充電。
 
@@ -1628,7 +1617,7 @@
       如果將這項政策設為 True 或未設定這項政策,使用者將可透過註冊 Chrome 作業系統來兌換優惠。
 
       如果將這項政策設為 False,使用者將無法兌換優惠。</translation>
-<translation id="4008233182078913897">指定要以無訊息方式 (使用者無需操作) 安裝的應用程式和擴充功能清單;使用者無法解除安裝或停用這些應用程式和擴充功能。系統會直接授予這些應用程式/擴充功能要求的所有權限 (使用者無需操作),包括日後新版應用程式/擴充功能要求的任何其他權限。系統會直接授予這些應用程式/擴充功能要求的所有權限 (使用者無需操作),包括日後新版應用程式/擴充功能要求的任何其他權限(這兩個 API 不適用於非強制安裝的應用程式/擴充功能)。
+<translation id="4008233182078913897">指定要以無訊息方式 (使用者無需操作) 安裝的應用程式和擴充功能清單;使用者無法解除安裝或停用這些應用程式和擴充功能。系統會直接授予這些應用程式/擴充功能要求的所有權限 (使用者無需操作),包括日後新版應用程式/擴充功能要求的任何其他權限。此外,系統會授予 enterprise.deviceAttributes 和 enterprise.platformKeys 擴充功能 API 的權限。(這兩個 API 不適用於非強制安裝的應用程式/擴充功能)。
 
           這項政策的優先順序高於可能發生衝突的 <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> 政策。如果從這份清單移除先前強制安裝的應用程式或擴充功能,<ph name="PRODUCT_NAME" /> 就會自動將其解除安裝。
 
@@ -1690,30 +1679,6 @@
       這項政策只會影響透過 SAML 進行驗證的使用者。</translation>
 <translation id="4105989332710272578">不針對列出的網址強制執行憑證透明化政策</translation>
 <translation id="4121350739760194865">阻止應用程式宣傳資訊在新分頁上顯示</translation>
-<translation id="4125606414556046117">這項政策可讓你為使用者設定桌面和登入畫面背景所顯示的桌布圖片。如要設定這項政策,請指定可供 <ph name="PRODUCT_OS_NAME" />下載桌布圖片的網址,以及用於驗證下載內容完整性的加密編譯雜湊碼。圖片必須為 JPEG 格式,且大小不得超過 16MB。網址必須未設定任何驗證機制,可直接存取。
-
-      系統會下載並快取桌布圖片。只要網址或雜湊碼一有變更,系統就會重新下載圖片。
-
-      這項政策的值應為一組字串,以 JSON 格式指定網址和雜湊碼,並遵循下方結構:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "可下載桌布圖片的網址。",
-            "type": "string"
-          },
-          "hash": {
-            "description": "桌布圖片的 SHA-256 雜湊值。",
-            "type": "string"
-          }
-        }
-      }
-
-      如果設定這項政策,<ph name="PRODUCT_OS_NAME" />將下載並使用桌布圖片。
-
-      設定這項政策後,使用者將無法變更或覆寫政策。
-
-      如果不設定這項政策,使用者可自行選擇桌面和登入畫面背景的顯示圖片。</translation>
 <translation id="412697421478384751">允許使用者設定強度不足的螢幕鎖定 PIN 碼</translation>
 <translation id="4138655880188755661">時間限制</translation>
 <translation id="4144164749344898721">當使用者處於閒置狀態時,系統可根據這項政策來控管電源管理策略的各項相關設定。
@@ -2626,53 +2591,6 @@
 
       如果你停用這項政策或將其設為 False,列印指令就會啟動列印預覽畫面。</translation>
 <translation id="6022948604095165524">起始動作</translation>
-<translation id="6023030044732320798">指定要遞交至 ARC 執行階段的一系列政策。政策值必須是有效的 JSON。
-
-      這項政策可用於指定要自動在裝置上安裝哪些 Android 應用程式:
-
-      {
-        "type": "object",
-        "properties": {
-          "applications": {
-            "type": "array",
-            "items": {
-              "type": "object",
-              "properties": {
-                "packageName": {
-                  "description": "Android 應用程式 ID,例如:Gmail 的應用程式 ID 為「com.google.android.gm」",
-                  "type": "string"
-                },
-                "installType": {
-                  "description": "指定應用程式的安裝方式。OPTIONAL:系統不會自動安裝應用程式,但使用者可以自行安裝。如果未指定這項政策,則此為預設安裝方式。PRELOAD:系統會自動安裝應用程式,但使用者可以解除安裝。FORCE_INSTALLED:系統會自動安裝應用程式,且使用者無法解除安裝。BLOCKED:應用程式遭到封鎖且無法安裝。如果應用程式是依據先前政策所安裝,系統將解除安裝該應用程式。",
-                  "type": "string",
-                  "enum": [
-                    "OPTIONAL",
-                    "PRELOAD",
-                    "FORCE_INSTALLED",
-                    "BLOCKED"
-                  ]
-                },
-                "defaultPermissionPolicy": {
-                  "description": "設定政策來授予應用程式所要求的權限。PERMISSION_POLICY_UNSPECIFIED:未指定政策。如果未針對任何層級的權限指定政策,則將使用「PROMPT」做為預設行為。PROMPT:提示使用者授予權限。GRANT:自動授予權限。DENY:自動拒絕授予權限。",
-                  "type": "string",
-                  "enum": [
-                    "PERMISSION_POLICY_UNSPECIFIED",
-                    "PROMPT",
-                    "GRANT",
-                    "DENY"
-                  ]
-                },
-                "managedConfiguration": {
-                  "description": "應用程式專屬的 JSON 設定物件及一個鍵/值組合,例如「"managedConfiguration": { "key1": value1, "key2": value2 }」。應用程式的資訊清單中會定義這些鍵。",
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-
-      如要將應用程式固定在啟動器中,請參閱 PinnedLauncherApps。</translation>
 <translation id="602728333950205286">預設搜尋引擎互動智慧搜尋網址</translation>
 <translation id="603410445099326293">使用 POST 的建議網址參數</translation>
 <translation id="6034341625190551415">控管公開工作階段和資訊站帳戶類型。</translation>
@@ -3007,37 +2925,6 @@
       如果你將這項政策設為 False,系統就一律不會使用內建 DNS 用戶端。
 
       如未設定這項政策,根據預設,系統會為 MacOS、Android (當私人 DNS 和 VPN 皆未啟用) 和 Chrome 作業系統啟用內建 DNS 用戶端;使用者可以透過編輯 chrome://flags 或指定命令列標記,自行決定是否要使用內建 DNS 用戶端。</translation>
-<translation id="6838056959556423778">覆寫 <ph name="PRODUCT_NAME" /> 預設印表機選取規則。
-
-      這項政策可讓你決定在 <ph name="PRODUCT_NAME" /> 中首次透過設定檔使用列印功能時,選取預設印表機的規則。
-
-      如果設定這項政策,<ph name="PRODUCT_NAME" /> 會嘗試尋找符合所有指定屬性的印表機,並選取該印表機做為預設印表機。採用非唯一比對機制時,凡是相符的印表機皆可供選取 (取決於找到的順序),因此一旦找到符合政策的印表機,系統就會直接選取。
-
-      如果未設定這項政策,或是在逾時期間找不到相符的印表機,系統會以內建的 PDF 印表機做為預設印表機,或者不選取任何印表機 (如果沒有 PDF 印表機的話)。
-
-      系統會以 JSON 物件形式剖析政策值,架構如下:
-      {
-        "type": "object",
-        "properties": {
-          "kind": {
-            "description": "是否僅限在特定的印表機範圍內搜尋相符的印表機。",
-            "type": "string",
-            "enum": [ "local", "cloud" ]
-          },
-          "idPattern": {
-            "description": "用於比對印表機 ID 的規則運算式。",
-            "type": "string"
-          },
-          "namePattern": {
-            "description": "用於比對印表機顯示名稱的規則運算式。",
-            "type": "string"
-          }
-        }
-      }
-
-      已連上 <ph name="CLOUD_PRINT_NAME" /> 的印表機屬於「<ph name="PRINTER_TYPE_CLOUD" />」類型,其他印表機則是「<ph name="PRINTER_TYPE_LOCAL" />」類型。
-      省略欄位表示不對值設限。舉例來說,如果未指定連線,系統會在執行列印預覽作業時尋找所有類型的印表機 (包括 local 和 cloud)。
-      規則運算式模式必須符合 JavaScript RegExp 語法,且比對機制需區分大小寫。</translation>
 <translation id="6843296367238757293">這項政策已遭到淘汰,因此不建議你使用此政策。詳情請參閱 https://support.google.com/chrome/a/answer/7643500</translation>
 <translation id="684856667300805181">這項政策已在 <ph name="PRODUCT_NAME" /> 68 中遭到移除,並已由 <ph name="ARC_GLS_POLICY_NAME" /> 取代。</translation>
 <translation id="6856743875250214792">這項政策僅供內部測試,而且有安全性方面的問題,因此 M66 已淘汰並移除這項政策。
@@ -4017,7 +3904,7 @@
       如果停用這項設定或不予設定,則密碼保護服務會將使用者傳送到 https://myaccounts.google.com 以變更密碼。
       這項政策僅適用於已加入 <ph name="MS_AD_NAME" /> 網域的 Windows 執行個體,或是已註冊裝置管理服務的 Windows 10 專業版或企業版執行個體。</translation>
 <translation id="8798099450830957504">預設</translation>
-<translation id="8800453707696044281">自訂電池停止充電的值 (以百分比為單位)</translation>
+<translation id="8800453707696044281">自訂電池停止充電值 (以百分比表示)</translation>
 <translation id="8801680448782904838">透過通知建議或要求使用者重新啟動瀏覽器或裝置</translation>
 <translation id="8818173863808665831">回報裝置的地理位置。
 
@@ -4131,30 +4018,6 @@
       這項政策只會影響採用 SAML 進行驗證的使用者。
 
       指定政策值時,請以秒為單位進行設定。</translation>
-<translation id="9027787254195333560">這項政策可讓你設定使用者的登入畫面顯示圖片。如要設定這項政策,請指定顯示圖片網址讓 <ph name="PRODUCT_OS_NAME" />進行下載,並指定用於驗證下載內容完整性的加密編譯雜湊值。圖片必須是 JPEG 格式,且大小不得超過 512kB。網址必須未設定任何驗證機制,可直接存取。
-
-      系統會下載並快取顯示圖片。只要網址或雜湊碼一有變更,系統就會重新下載圖片。
-      
-這項政策的值應為一組字串,以 JSON 格式指定網址和雜湊碼,並遵循下方結構:
-      {
-        "type": "object",
-        "properties": {
-          "url": {
-            "description": "可下載顯示圖片的網址",
-            "type": "string"
-          },
-          "hash": {
-            "description": "顯示圖片的 SHA-256 雜湊值",
-            "type": "string"
-          }
-        }
-      }
-
-      如果設定這項政策,<ph name="PRODUCT_OS_NAME" />將下載並使用顯示圖片。
-
-      設定這項政策後,使用者將無法變更或覆寫政策。
-
-      如果不設定這項政策,使用者可以選擇登入畫面的使用者顯示圖片。</translation>
 <translation id="9035964157729712237">要從黑名單上移除的擴充功能 ID</translation>
 <translation id="9038058011835642205">指定要以無訊息方式 (使用者無需操作) 安裝的網站清單;使用者無法解除安裝或停用這些網站。
 
@@ -4167,7 +4030,6 @@
       設定這項政策後,使用者將無法變更或覆寫政策。
 
       指定政策值時需以毫秒為單位。該值必須介於 30 秒至 24 小時之間。</translation>
-<translation id="9042911395677044526">允許將網路設定按照使用者套用至安裝了 <ph name="PRODUCT_OS_NAME" /> 的裝置。本網路設定是由開放網路設定格式 (網址為:<ph name="ONC_SPEC_URL" />) 所定義的 JSON 格式字串。</translation>
 <translation id="9050853837490399534">這項政策可控管是否要將裝置更新為「快速修復版本」。
 
       如果將政策值設為對應至快速修復版本的符記,且其他政策未封鎖更新,則裝置會更新為相應的快速修復版本。
@@ -4240,17 +4102,6 @@
       如果將這項政策設為 false,列印對話方塊中的「頁首及頁尾」選項會預設為停用,且使用者無法變更這項設定。
 
       如果將這項政策設為 true,列印對話方塊中的「頁首及頁尾」選項會預設為啟用,且使用者無法變更這項設定。</translation>
-<translation id="9213347477683611358">設定還沒有任何使用者登入裝置時,登入畫面顯示的裝置層級桌布圖片。如要設定這項政策,請指定 Chrome 作業系統裝置可下載桌布圖片的網址,以及用於驗證下載完整性的加密編譯雜湊值。圖片必須為 JPEG 格式,且大小不得超過 16MB。網址則必須可供直接存取,不必經過任何驗證。系統會下載並快取桌布圖片,每當網址或雜湊值有所變更即重新下載。
-
-      指定政策時,請使用 JSON 格式的字串來表示網址和雜湊值。範例如下:
-      {
-        "url": "https://example.com/device_wallpaper.jpg",
-        "hash": "examplewallpaperhash"
-      }
-
-      設定這項裝置桌布政策後,如果還沒有任何使用者登入裝置,Chrome 作業系統裝置將下載並使用桌布圖片 (顯示在登入畫面)。一旦使用者登入裝置,使用者的桌布政策就會生效。
-
-      如果未設定這項裝置桌布政策,則會由使用者的桌布政策 (如有設定) 決定要顯示的圖片。</translation>
 <translation id="9217154963008402249">監控網路封包的傳送頻率</translation>
 <translation id="922540222991413931">設定擴充功能、應用程式和使用者指令碼安裝來源</translation>
 <translation id="924557436754151212">第一次執行時從預設瀏覽器匯入已儲存的密碼</translation>
diff --git a/components/previews/content/previews_decider_impl.cc b/components/previews/content/previews_decider_impl.cc
index 75f07f3..9b9f9d1 100644
--- a/components/previews/content/previews_decider_impl.cc
+++ b/components/previews/content/previews_decider_impl.cc
@@ -89,11 +89,6 @@
   return false;
 }
 
-bool IsPreviewsBlacklistIgnoredViaFlag() {
-  return base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kIgnorePreviewsBlacklist);
-}
-
 // We don't care if the ECT is unknown if the slow page threshold is set to 4G
 // (i.e.: all pages).
 bool ShouldCheckForUnknownECT(net::EffectiveConnectionType ect) {
@@ -105,9 +100,8 @@
 
 }  // namespace
 
-PreviewsDeciderImpl::PreviewsDeciderImpl(
-    base::Clock* clock)
-    : blacklist_ignored_(IsPreviewsBlacklistIgnoredViaFlag()),
+PreviewsDeciderImpl::PreviewsDeciderImpl(base::Clock* clock)
+    : blacklist_ignored_(switches::ShouldIgnorePreviewsBlacklist()),
       clock_(clock),
       page_id_(1u),
       weak_factory_(this) {}
diff --git a/components/previews/content/previews_decider_impl_unittest.cc b/components/previews/content/previews_decider_impl_unittest.cc
index 7baa15c..b0b5ef8 100644
--- a/components/previews/content/previews_decider_impl_unittest.cc
+++ b/components/previews/content/previews_decider_impl_unittest.cc
@@ -1922,8 +1922,7 @@
   base::test::ScopedCommandLine scoped_command_line;
   base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
   command_line->AppendSwitch(switches::kIgnorePreviewsBlacklist);
-  ASSERT_TRUE(base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kIgnorePreviewsBlacklist));
+  ASSERT_TRUE(switches::ShouldIgnorePreviewsBlacklist());
 
   InitializeUIService();
 
diff --git a/components/previews/core/previews_logger.cc b/components/previews/core/previews_logger.cc
index c512920..a28a1e1 100644
--- a/components/previews/core/previews_logger.cc
+++ b/components/previews/core/previews_logger.cc
@@ -132,8 +132,7 @@
       page_id(other.page_id) {}
 
 PreviewsLogger::PreviewsLogger()
-    : blacklist_ignored_(base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kIgnorePreviewsBlacklist)) {}
+    : blacklist_ignored_(switches::ShouldIgnorePreviewsBlacklist()) {}
 
 PreviewsLogger::~PreviewsLogger() {}
 
diff --git a/components/previews/core/previews_logger_unittest.cc b/components/previews/core/previews_logger_unittest.cc
index 4fe3cfd..18d322d 100644
--- a/components/previews/core/previews_logger_unittest.cc
+++ b/components/previews/core/previews_logger_unittest.cc
@@ -769,8 +769,7 @@
   base::test::ScopedCommandLine scoped_command_line;
   base::CommandLine* command_line = scoped_command_line.GetProcessCommandLine();
   command_line->AppendSwitch(switches::kIgnorePreviewsBlacklist);
-  ASSERT_TRUE(base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kIgnorePreviewsBlacklist));
+  ASSERT_TRUE(switches::ShouldIgnorePreviewsBlacklist());
 
   TestPreviewsLoggerObserver observer;
   PreviewsLogger logger;
diff --git a/components/previews/core/previews_switches.cc b/components/previews/core/previews_switches.cc
index de80525b..61f5164c 100644
--- a/components/previews/core/previews_switches.cc
+++ b/components/previews/core/previews_switches.cc
@@ -4,9 +4,16 @@
 
 #include "components/previews/core/previews_switches.h"
 
+#include "base/command_line.h"
+
 namespace previews {
 namespace switches {
 
+bool ShouldIgnorePreviewsBlacklist() {
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      kIgnorePreviewsBlacklist);
+}
+
 // Do not require the user notification InfoBar to be shown before triggering a
 // Lite Page Redirect preview.
 const char kDoNotRequireLitePageRedirectInfoBar[] =
diff --git a/components/previews/core/previews_switches.h b/components/previews/core/previews_switches.h
index ffb8bbe..f3e3143 100644
--- a/components/previews/core/previews_switches.h
+++ b/components/previews/core/previews_switches.h
@@ -8,6 +8,10 @@
 namespace previews {
 namespace switches {
 
+// Whether the previews blacklist should be ignored, according to command line
+// switches.
+bool ShouldIgnorePreviewsBlacklist();
+
 extern const char kDoNotRequireLitePageRedirectInfoBar[];
 extern const char kIgnorePreviewsBlacklist[];
 extern const char kLitePageServerPreviewHost[];
diff --git a/components/strings/components_chromium_strings_hi.xtb b/components/strings/components_chromium_strings_hi.xtb
index d965dfc5..4368ae8 100644
--- a/components/strings/components_chromium_strings_hi.xtb
+++ b/components/strings/components_chromium_strings_hi.xtb
@@ -5,7 +5,7 @@
 <translation id="1838412507805038478">क्रोमियम ने सत्‍यापित किया है कि इस वेबसाइट का प्रमाणपत्र <ph name="ISSUER" /> ने जारी किया है.</translation>
 <translation id="275588974610408078">क्रोमियम में खराबी रिपोर्ट नहीं कर सकते.</translation>
 <translation id="3064346599913645280">आप एक सुरक्षित Chromium पेज देख रहे हैं</translation>
-<translation id="3550966579244642892">Chromium OS ने अपना आरंभिक सेटअप पूर्ण नहीं किया है.</translation>
+<translation id="3550966579244642892">Chromium OS ने अपना शुरुआती सेटअप पूरा नहीं किया है.</translation>
 <translation id="4365115785552740256">क्रोमियम <ph name="BEGIN_LINK_CHROMIUM" />क्रोमियम<ph name="END_LINK_CHROMIUM" /> खुला स्रोत प्रोजेक्ट और अन्‍य <ph name="BEGIN_LINK_OSS" />खुले स्रोत प्रोजेक्ट<ph name="END_LINK_OSS" /> द्वारा संभव बनाया गया है.</translation>
 <translation id="4559775032954821361">यहां
           क्रोमियम मेन्यू &gt;
diff --git a/components/strings/components_google_chrome_strings_hi.xtb b/components/strings/components_google_chrome_strings_hi.xtb
index c708f42..6e75078 100644
--- a/components/strings/components_google_chrome_strings_hi.xtb
+++ b/components/strings/components_google_chrome_strings_hi.xtb
@@ -9,7 +9,7 @@
 <translation id="3444832043240812445">अगर आप <ph name="BEGIN_LINK" />क्रैश रिपोर्ट करना चालू<ph name="END_LINK" /> करते हैं तो यह पेज सिर्फ़ आपके हाल ही के क्रैश की जानकारी दिखाएगा.</translation>
 <translation id="3875312571075912821">Chrome को अपनी फ़ायरवॉल और एंटीवायरस सेटिंग में
           नेटवर्क एक्सेस करने दें.</translation>
-<translation id="4010643444566880169">Chrome OS ने अपना आरंभिक सेटअप पूर्ण नहीं किया है.</translation>
+<translation id="4010643444566880169">Chrome OS ने अपना शुरुआती सेटअप पूरा नहीं किया है.</translation>
 <translation id="4853578032408195113">आप एक सुरक्षि‍त Google Chrome पेज देख रहे हैं</translation>
 <translation id="6011049234605203654">यहां जाएं
           क्रोमियम मेन्यू &gt;
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index bf382b5..863d13d 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -409,7 +409,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> በ<ph name="SERVER_NAME" /> ላይ</translation>
 <translation id="320323717674993345">ክፍያን ሰርዝ</translation>
 <translation id="3207960819495026254">ዕልባት ተደርጎበታል</translation>
-<translation id="321912867715453276">ማስጠንቀቂያ፦ ለመመሪያው ከአንድ በላይ ምንጭ ይገኛል፣ ነገር ግን እሴቶቹ ተመሳሳይ ናቸው።</translation>
 <translation id="3225919329040284222">አገልጋዩ አብረው የተሰሩ የሚጠበቁ ማሟያዎችን የማያሟላ የእውቅና ማረጋገጫ ነው ያቀረበው። እነዚህ የሚጠበቁ ማሟያዎች እርስዎን ለመጠበቅ ለተረጋገጡ ከፍተኛ ደህንነት ላላቸው ድር ጣቢያዎች ተካትተዋል።</translation>
 <translation id="3226128629678568754">ገጹን ለመጫን የሚያስፈልገው ውሂብ ዳግም ለማስገባት የዳግም ጫን አዝራሩን ይጫኑ።</translation>
 <translation id="3227137524299004712">ማይክሮፎን</translation>
@@ -549,7 +548,6 @@
 <translation id="397105322502079400">በማስላት ላይ...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ታግዷል</translation>
 <translation id="3987940399970879459">ከ1 ሜባ ያነሰ</translation>
-<translation id="4008849406247176967">ማስጠንቀቂያ፦ ለዚህ መመሪያ የሚጋጩ እሴቶች ያላቸው ከአንድ በላይ ምንጮች አሉ!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 ድረ-ገጽ በአቅራቢያ}one{# ድረ-ገጾች በአቅራቢያ}other{# ድረ-ገጾች በአቅራቢያ}}</translation>
 <translation id="4030383055268325496">&amp;አክልን ቀልብስ</translation>
 <translation id="4032320456957708163">የእርስዎ አሳሽ በ<ph name="ENROLLMENT_DOMAIN" /> የሚተዳደር ነው</translation>
@@ -686,7 +684,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> የፍለጋ አስተያየት ጥቆማ</translation>
 <translation id="4742407542027196863">የይለፍ ቃላትን ያስተዳድሩ...</translation>
 <translation id="4744603770635761495">የሚፈጸም ዱካ</translation>
-<translation id="4746351372139058112">መልዕክቶች</translation>
 <translation id="4750917950439032686">የእርስዎ መረጃ (ለምሳሌ፦ የይለፍ ቃሎች ወይም የክሬዲት ካርድ ቁጥሮች) ወደዚህ ጣቢያ በሚላክበት ጊዜ የግል ነው።</translation>
 <translation id="4756388243121344051">&amp;ታሪክ</translation>
 <translation id="4758311279753947758">የእውቂያ መረጃን ያክሉ</translation>
@@ -1113,7 +1110,6 @@
 <translation id="7220786058474068424">በማስሄድ ላይ</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />፤ <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">ፊት ያለው ጣቢያ ተንኮል-አዘል ዌር አለው</translation>
-<translation id="724766306220616965">ማስጠንቀቂያዎች፣ ግጭት</translation>
 <translation id="724975217298816891">የካርድ ዝርዝሮችዎን ለማዘመን የ<ph name="CREDIT_CARD" /> ጊዜ ማለፊያ ቀን እና ሲቪሲ ያስገቡ። አንዴ ካረጋገጡ በኋላ የካርድ ዝርዝሮችዎ ለዚህ ጣቢያ ይጋራሉ።</translation>
 <translation id="7251437084390964440">የአውታረ መረብ ውቅረቱ የኦኤንሲ መስፈርቱን አያሟላም። አንዳንድ የውቅረቱ ክፍሎች ላይመጡ ይችላሉ።
 ተጨማሪ ዝርዝሮች፦
@@ -1412,6 +1408,7 @@
 <translation id="8891727572606052622">ልክ ያልሆነ የተኪ ሁነታ።</translation>
 <translation id="8903921497873541725">አጉላ</translation>
 <translation id="890485472659500557">ምሕንድስና-C</translation>
+<translation id="8912362522468806198">የGoogle መለያ</translation>
 <translation id="8931333241327730545">ይህን ካርድ በእርስዎ የGoogle መለያ ላይ ማስቀመጥ ይፈልጋሉ?</translation>
 <translation id="8932102934695377596">የእርስዎ ሰዓት ወደ ኋላ ቀርቷል</translation>
 <translation id="893332455753468063">ስም ያክሉ</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 7ae12ee36..9422bcd 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> على <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">إلغاء الدفع</translation>
 <translation id="3207960819495026254">تمت إضافتها إلى الإشارات المرجعية.</translation>
-<translation id="321912867715453276">تحذير: يتوفَّر أكثر من مصدر للسياسة، لكن القيم هي نفسها.</translation>
 <translation id="3225919329040284222">قدم الخادم شهادة لا تتطابق مع التوقعات المضمّنة. تم تضمين هذه التوقعات للحصول على مواقع ويب موثوقة وآمنة جدًا لتوفير الحماية لك.</translation>
 <translation id="3226128629678568754">اضغط على زر إعادة التحميل لإعادة إرسال البيانات المطلوبة لتحميل الصفحة.</translation>
 <translation id="3227137524299004712">الميكروفون</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">جارٍ الحساب...</translation>
 <translation id="3973234410852337861">تم حظر <ph name="HOST_NAME" /></translation>
 <translation id="3987940399970879459">أقل من ميغابايت واحد</translation>
-<translation id="4008849406247176967">تحذير: يتوفَّر أكثر من مصدر واحد يتضمّن قيمًا متضاربة لهذه السياسة.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{صفحة ويب واحدة مجاورة}zero{# صفحات ويب مجاورة}two{صفحتا ويب (#) مجاورتان}few{# صفحات ويب مجاورة}many{# صفحة ويب مجاورة}other{# صفحة ويب مجاورة}}</translation>
 <translation id="4030383055268325496">تراجع عن الإ&amp;ضافة</translation>
 <translation id="4032320456957708163">إدارة متصفِّحك من خلال <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> اقتراحات البحث</translation>
 <translation id="4742407542027196863">إدارة كلمات المرور…</translation>
 <translation id="4744603770635761495">المسار التنفيذي</translation>
-<translation id="4746351372139058112">الرسائل</translation>
 <translation id="4750917950439032686">ستكون معلوماتك (مثل كلمات المرور أو أرقام بطاقة الائتمان) خاصة عند إرسالها إلى هذا الموقع.</translation>
 <translation id="4756388243121344051">ال&amp;سجل</translation>
 <translation id="4758311279753947758">إضافة معلومات الاتصال</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">جارٍ المعالجة</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />، <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">يحتوي موقع الويب المقصود على برامج ضارة</translation>
-<translation id="724766306220616965">التحذيرات والتعارضات</translation>
 <translation id="724975217298816891">‏أدخل تاريخ انتهاء الصلاحية ورمز التحقق من البطاقة (CVC) لـ <ph name="CREDIT_CARD" /> لتحديث تفاصيل بطاقتك. بعد تأكيدك، ستتم مشاركة تفاصيل بطاقتك مع هذا الموقع.</translation>
 <translation id="7251437084390964440">‏لا تتوافق تهيئة الشبكة مع معيار ONC. وقد لا تُستورَد أجزاء من التهيئة.
 التفاصيل الإضافية:
@@ -1422,6 +1418,7 @@
 <translation id="8891727572606052622">وضع الخادم الوكيل غير صالح.</translation>
 <translation id="8903921497873541725">تكبير</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">‏حساب Google‏</translation>
 <translation id="8931333241327730545">‏هل تريد حفظ هذه البطاقة إلى حسابك في Google؟</translation>
 <translation id="8932102934695377596">توقيت ساعتك متأخر عن الوقت الحالي</translation>
 <translation id="893332455753468063">إضافة اسم</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index ee2813059..a4f76e6 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> на <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Анулиране на плащането</translation>
 <translation id="3207960819495026254">С отметка</translation>
-<translation id="321912867715453276">Предупреждение: Съществува повече от един източник за правилото, но стойностите са едни и същи.</translation>
 <translation id="3225919329040284222">Сървърът предостави сертификат, който не съответства на вградените очаквания. Те са включени за определени уебсайтове с голяма степен на сигурност, за да ви предпазим.</translation>
 <translation id="3226128629678568754">Натиснете бутона за презареждане, за да изпратите отново данните, необходими за отварянето на страницата.</translation>
 <translation id="3227137524299004712">Микрофон</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Изчислява се...</translation>
 <translation id="3973234410852337861">Хостът <ph name="HOST_NAME" /> е блокиран</translation>
 <translation id="3987940399970879459">По-малко от 1 МБ</translation>
-<translation id="4008849406247176967">Предупреждение: Съществува повече от един източник с несъвместими стойности за това правило!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 уеб страница в близост}other{# уеб страници в близост}}</translation>
 <translation id="4030383055268325496">&amp;Отмяна на добавянето</translation>
 <translation id="4032320456957708163">Браузърът ви се управлява от <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Предложение за търсене на „<ph name="TEXT" />“</translation>
 <translation id="4742407542027196863">Управление на паролите…</translation>
 <translation id="4744603770635761495">Път към изпълнимия файл</translation>
-<translation id="4746351372139058112">Messages</translation>
 <translation id="4750917950439032686">Информацията ви (например пароли или номера на кредитни карти) е частна, когато се изпраща до този сайт.</translation>
 <translation id="4756388243121344051">&amp;История</translation>
 <translation id="4758311279753947758">Добавяне на информация за връзка</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Обработва се</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">На хоризонта се задава сайт със злонамерен софтуер</translation>
-<translation id="724766306220616965">Предупреждения, несъвместимост</translation>
 <translation id="724975217298816891">Въведете датата на валидност и кода за проверка за <ph name="CREDIT_CARD" />, за да актуализирате данните за картата си. След като я потвърдите, те ще бъдат споделени с този сайт.</translation>
 <translation id="7251437084390964440">Конфигурацията на мрежата не спазва стандарта на ONC. Възможно е части от нея да не са импортирани.
 Допълнителни подробности:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Невалиден режим на прокси сървъра.</translation>
 <translation id="8903921497873541725">Увеличаване на мащаба</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Профил в Google</translation>
 <translation id="8931333241327730545">Искате ли да запазите тази карта в профила си в Google?</translation>
 <translation id="8932102934695377596">Часовникът ви е назад</translation>
 <translation id="893332455753468063">Добавяне на име</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index f806dc3..d22e84c 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -417,7 +417,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> এ <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">পেমেন্ট বাতিল করুন</translation>
 <translation id="3207960819495026254">বুকমার্ক করা হয়েছে</translation>
-<translation id="321912867715453276">সতর্কতা: এই নীতির জন্য একই মান সহ একাধিক উৎস রয়েছে।</translation>
 <translation id="3225919329040284222">সার্ভারটি এমন একটি সার্টিফিকেট উপস্থাপনা করেছে যা বিল্ট-ইন প্রত্যাশাগুলির সাথে মেলে না৷ এই প্রত্যাশাগুলি আপনাকে সুরক্ষিত করতে কিছু নিশ্চিত, উচ্চ সুরক্ষার ওয়েবসাইটের জন্য অন্তর্ভুক্ত৷</translation>
 <translation id="3226128629678568754">পৃষ্ঠা লোড করার জন্য প্রয়োজনীয় ডেটা আবার জমা দিতে রিলোড বোতামটি টিপুন৷</translation>
 <translation id="3227137524299004712">মাইক্রোফোন</translation>
@@ -557,7 +556,6 @@
 <translation id="397105322502079400">গণনা করা হচ্ছে...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> অবরুদ্ধ হয়ে রয়েছে</translation>
 <translation id="3987940399970879459">১ এমবির কম</translation>
-<translation id="4008849406247176967">সতর্কতা: এই নীতির জন্য পরস্পরবিরোধী মান সহ একাধিক উৎস রয়েছে!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{আশেপাশের ১টি ওয়েবপৃষ্ঠা}one{আশেপাশের #টি ওয়েবপৃষ্ঠা}other{আশেপাশের #টি ওয়েবপৃষ্ঠা}}</translation>
 <translation id="4030383055268325496">&amp;যোগ করাকে পূর্বাবস্থায় ফেরান</translation>
 <translation id="4032320456957708163"><ph name="ENROLLMENT_DOMAIN" /> আপনার ব্রাউজার ম্যানেজ করে</translation>
@@ -694,7 +692,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> সার্চ সাজেশন</translation>
 <translation id="4742407542027196863">পাসওয়ার্ডগুলি পরিচালনা করুন…</translation>
 <translation id="4744603770635761495">সম্পাদনযোগ্য পাথ</translation>
-<translation id="4746351372139058112">বার্তাগুলি</translation>
 <translation id="4750917950439032686">আপনার তথ্য (উদাহরণস্বরূপ, পাসওয়ার্ড বা ক্রেডিট কার্ড নম্বর) যখন এই সাইটে পাঠানো হয় তখন সেটি ব্যক্তিগত থাকে।</translation>
 <translation id="4756388243121344051">&amp;ইতিহাস</translation>
 <translation id="4758311279753947758">পরিচিতির তথ্য জুড়ুন</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">প্রক্রিয়ায় রয়েছে</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">এই সাইটটিতে ম্যালওয়্যার আছে</translation>
-<translation id="724766306220616965">সতর্কতা, দ্বন্দ্ব</translation>
 <translation id="724975217298816891">Enter the expiration date and CVC for <ph name="CREDIT_CARD" /> to update your card details. Once you confirm, your card details will be shared with this site.</translation>
 <translation id="7251437084390964440">নেটওয়ার্ক কনফিগারেশন ONC মানদণ্ড মেনে চলছে না। কনফিগারেশনের কিছু অংশ ইমপোর্ট করা নাও হতে পারে৷
 অতিরিক্ত বিবরণ:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">ভুল প্রক্সি মোড৷</translation>
 <translation id="8903921497873541725">জুম বাড়ান</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google অ্যাকাউন্ট</translation>
 <translation id="8931333241327730545">আপনি কি আপনার Google অ্যাকাউন্টে এই কার্ড সেভ করতে চান?</translation>
 <translation id="8932102934695377596">আপনার ঘড়ির সময় পিছিয়ে রয়েছে</translation>
 <translation id="893332455753468063">নাম যোগ করুন</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index c8a81a94..17f8b22b 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -408,7 +408,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> a <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Cancel·la el pagament</translation>
 <translation id="3207960819495026254">S'ha afegit a les adreces d'interès.</translation>
-<translation id="321912867715453276">Advertiment: hi ha més d'un origen en aquesta política, però els valors són els mateixos.</translation>
 <translation id="3225919329040284222">El servidor ha presentat un certificat que no coincideix amb les expectatives integrades. Les expectatives s'inclouen perquè determinats llocs web d'alta seguretat us protegeixin.</translation>
 <translation id="3226128629678568754">Premeu el botó de tornar a carregar per tornar a enviar les dades necessàries per carregar la pàgina.</translation>
 <translation id="3227137524299004712">Micròfon</translation>
@@ -548,7 +547,6 @@
 <translation id="397105322502079400">S’està calculant...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> està bloquejat</translation>
 <translation id="3987940399970879459">Menys d'1 MB</translation>
-<translation id="4008849406247176967">Advertiment: hi ha més d'un origen amb valors conflictius en aquesta política.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{Hi ha 1 pàgina web a prop}other{Hi ha # pàgines web a prop}}</translation>
 <translation id="4030383055268325496">&amp;Desfés l'addició</translation>
 <translation id="4032320456957708163"><ph name="ENROLLMENT_DOMAIN" /> gestiona el teu navegador</translation>
@@ -685,7 +683,6 @@
 <translation id="4738601419177586157">Suggeriment de cerca de <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gestiona les contrasenyes…</translation>
 <translation id="4744603770635761495">Camí executable</translation>
-<translation id="4746351372139058112">Missatges</translation>
 <translation id="4750917950439032686">La teva informació (com ara les contrasenyes o els números de targeta de crèdit) es considera privada quan s'envia a aquest lloc.</translation>
 <translation id="4756388243121344051">&amp;Historial</translation>
 <translation id="4758311279753947758">Afegiu informació de contacte</translation>
@@ -1112,7 +1109,6 @@
 <translation id="7220786058474068424">S'està processant</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Aquest lloc web conté programari maliciós</translation>
-<translation id="724766306220616965">Advertiments i conflictes</translation>
 <translation id="724975217298816891">Introdueix la data de caducitat i el CVC de la targeta <ph name="CREDIT_CARD" /> per actualitzar-ne els detalls. Un cop confirmada, els detalls de la targeta es compartiran amb aquest lloc.</translation>
 <translation id="7251437084390964440">La configuració de la xarxa no compleix l'estàndard ONC. Pot ser que algunes opcions de configuració no s'hagin importat.
 Detalls addicionals:
@@ -1410,6 +1406,7 @@
 <translation id="8891727572606052622">El mode de servidor intermediari no és vàlid.</translation>
 <translation id="8903921497873541725">Amplia</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Compte de Google</translation>
 <translation id="8931333241327730545">Voleu desar aquesta targeta al vostre compte de Google?</translation>
 <translation id="8932102934695377596">El rellotge està endarrerit</translation>
 <translation id="893332455753468063">Afegeix un nom</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 02b5bbe..cf1b3b9 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -405,7 +405,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> na serveru <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Zrušit platbu</translation>
 <translation id="3207960819495026254">Přidáno do záložek</translation>
-<translation id="321912867715453276">Upozornění: Pro zásadu je k dispozici několik zdrojů, ale hodnoty jsou stejné.</translation>
 <translation id="3225919329040284222">Server se prokázal certifikátem, který neodpovídá integrovaným očekáváním. Tato očekávaní jsou zahrnuta u určitých webových stránek s vysokou úrovní zabezpečení kvůli vaší ochraně.</translation>
 <translation id="3226128629678568754">Klikněte na tlačítko Načíst znovu. Tím znovu odešlete údaje potřebné k načtení stránky.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -544,7 +543,6 @@
 <translation id="397105322502079400">Probíhá výpočet…</translation>
 <translation id="3973234410852337861">Web <ph name="HOST_NAME" /> je blokován</translation>
 <translation id="3987940399970879459">Méně než 1 MB</translation>
-<translation id="4008849406247176967">Upozornění: Pro tuto zásadu je přítomno několik zdrojů s konfliktními hodnotami.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 webová stránka v okolí}few{# webové stránky v okolí}many{# webové stránky v okolí}other{# webových stránek v okolí}}</translation>
 <translation id="4030383055268325496">&amp;Vrátit přidání zpět</translation>
 <translation id="4032320456957708163">Prohlížeč je spravován doménou <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -681,7 +679,6 @@
 <translation id="4738601419177586157">Návrh vyhledávacího dotazu <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Spravovat hesla…</translation>
 <translation id="4744603770635761495">Spustitelná cesta</translation>
-<translation id="4746351372139058112">Zprávy</translation>
 <translation id="4750917950439032686">Vaše údaje (například hesla nebo čísla platebních karet) jsou při odesílání na tento web soukromé.</translation>
 <translation id="4756388243121344051">Historie</translation>
 <translation id="4758311279753947758">Přidat kontaktní údaje</translation>
@@ -1107,7 +1104,6 @@
 <translation id="7220786058474068424">Zpracovávání</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />, <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Webové stránky, které chcete otevřít, obsahují malware</translation>
-<translation id="724766306220616965">Upozornění, konflikt</translation>
 <translation id="724975217298816891">Chcete-li aktualizovat údaje o kartě, zadejte datum vypršení platnosti a kód CVC karty <ph name="CREDIT_CARD" />. Po ověření budou údaje o kartě sdíleny s tímto webem.</translation>
 <translation id="7251437084390964440">Konfigurace sítě neodpovídá standardu ONC. Může se stát, že některé části konfigurace nebudou importovány. Další podrobnosti:
 <ph name="DEBUG_INFO" /></translation>
@@ -1405,6 +1401,7 @@
 <translation id="8891727572606052622">Neplatný režim proxy serveru.</translation>
 <translation id="8903921497873541725">Přiblížit</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Účet Google</translation>
 <translation id="8931333241327730545">Chcete tuto kartu uložit do účtu Google?</translation>
 <translation id="8932102934695377596">Vaše hodiny se zpožďují</translation>
 <translation id="893332455753468063">Přidání jména</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index f506fe0e..ff315be 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> på <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Annuller betaling</translation>
 <translation id="3207960819495026254">Gemt som bogmærke</translation>
-<translation id="321912867715453276">Advarsel! Der er mere end én kilde for politikken, men værdierne er de samme.</translation>
 <translation id="3225919329040284222">Serveren præsenterede et certifikat, der ikke svarer til de indbyggede forventninger. Disse forventninger medtages for bestemte websites med høj sikkerhed for at beskytte dig.</translation>
 <translation id="3226128629678568754">Tryk på genindlæsningsknappen for at genindsende de data, der er nødvendige for at indlæse siden.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Beregner...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> er blokeret</translation>
 <translation id="3987940399970879459">Mindre end 1 MB</translation>
-<translation id="4008849406247176967">Advarsel! Der er mere end én kilde med modstridende værdier for denne politik.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 webside tæt på}one{# webside tæt på}other{# websider tæt på}}</translation>
 <translation id="4030383055268325496">&amp;Fortryd tilføjelse</translation>
 <translation id="4032320456957708163">Din browser administreres af <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" />-søgeforslag</translation>
 <translation id="4742407542027196863">Administrer adgangskoder…</translation>
 <translation id="4744603770635761495">Eksekverbar sti</translation>
-<translation id="4746351372139058112">Beskeder</translation>
 <translation id="4750917950439032686">Dine oplysninger (f.eks. adgangskoder eller kreditkortnumre) er private, når de sendes til dette website.</translation>
 <translation id="4756388243121344051">&amp;Historik</translation>
 <translation id="4758311279753947758">Tilføj kontaktoplysninger</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Behandler</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Det site, du er på vej til, indeholder malware</translation>
-<translation id="724766306220616965">Advarsler, konflikt</translation>
 <translation id="724975217298816891">Opdater dine kortoplysninger ved at indtaste udløbsdatoen og kontrolkoden for <ph name="CREDIT_CARD" />. Når du bekræfter, deles dine kortoplysninger med dette website.</translation>
 <translation id="7251437084390964440">Netværkskonfigurationen overholder ikke ONC-standarden. Dele af konfiguration kan muligvis ikke importeres.
 Yderligere oplysninger:
@@ -1422,6 +1418,7 @@
 <translation id="8891727572606052622">Ugyldig proxytilstand.</translation>
 <translation id="8903921497873541725">Zoom ind</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google-konto</translation>
 <translation id="8931333241327730545">Vil du gemme dette kort på din Google-konto?</translation>
 <translation id="8932102934695377596">Dit ur er bagud</translation>
 <translation id="893332455753468063">Tilføj navn</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index b3eb66d..548f307 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -365,7 +365,7 @@
 <translation id="2948083400971632585">Sie können alle für eine Verbindung konfigurierten Proxys auf der Seite "Einstellungen" deaktivieren.</translation>
 <translation id="2955913368246107853">Suchleiste schließen</translation>
 <translation id="2969319727213777354">Zum Herstellen einer sicheren Verbindung muss die Uhrzeit richtig eingestellt sein. Der Grund hierfür ist, dass Websites sich mithilfe von Zertifikaten identifizieren, die nur für einen bestimmten Zeitraum gelten. Da die Uhrzeit Ihres Geräts falsch ist, kann Google Chrome diese Zertifikate nicht bestätigen.</translation>
-<translation id="2970515157925768593">Kann Ihre Geräte- und Kontoeinrichtung remote ändern.</translation>
+<translation id="2970515157925768593">Ihre Geräte- und Kontoeinrichtung remote ändern.</translation>
 <translation id="2972581237482394796">&amp;Wiederholen</translation>
 <translation id="2977665033722899841"><ph name="ROW_NAME" />, aktuell ausgewählt. <ph name="ROW_CONTENT" /></translation>
 <translation id="2982481275546140226">Daten löschen</translation>
@@ -408,7 +408,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> auf <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Zahlung abbrechen</translation>
 <translation id="3207960819495026254">Mit einem Lesezeichen versehen</translation>
-<translation id="321912867715453276">Warnung: Für die Richtlinie sind mehrere Quelle vorhanden, aber die Werte sind dieselben.</translation>
 <translation id="3225919329040284222">Der Server hat ein Zertifikat übermittelt, das nicht mit den integrierten Erwartungen übereinstimmt. Diese Erwartungen sind zu Ihrem Schutz in bestimmten Websites mit hohen Sicherheitsstandards enthalten.</translation>
 <translation id="3226128629678568754">Klicken Sie auf die Schaltfläche zum erneuten Laden, um die für das Laden der Seite erforderlichen Daten noch einmal zu senden.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -546,7 +545,6 @@
 <translation id="397105322502079400">Wird berechnet...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ist gesperrt</translation>
 <translation id="3987940399970879459">Weniger als 1 MB</translation>
-<translation id="4008849406247176967">Warnung: Für diese Richtlinie sind mehrere Quellen mit in Konflikt stehenden Werten vorhanden.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 Webseite in der Nähe}other{# Webseiten in der Nähe}}</translation>
 <translation id="4030383055268325496">&amp;Hinzufügen rückgängig machen</translation>
 <translation id="4032320456957708163">Ihr Browser wird von <ph name="ENROLLMENT_DOMAIN" /> verwaltet</translation>
@@ -683,7 +681,6 @@
 <translation id="4738601419177586157">Suchvorschlag: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Passwörter verwalten…</translation>
 <translation id="4744603770635761495">Ausführbarer Pfad</translation>
-<translation id="4746351372139058112">Nachrichten</translation>
 <translation id="4750917950439032686">Ihre Daten wie Passwörter oder Kreditkartennummern sind privat, wenn Sie sie an diese Website senden.</translation>
 <translation id="4756388243121344051">&amp;Verlauf</translation>
 <translation id="4758311279753947758">Kontaktdaten hinzufügen</translation>
@@ -715,7 +712,7 @@
 <translation id="4926159001844873046">Auf <ph name="SITE" /> wird Folgendes angezeigt:</translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">Keine Ergebnisse</translation>
-<translation id="4945672369594656571">Legt fest, wie mit Ihren Geräte- und Kontodaten verfahren wird. Google verarbeitet Ihre Geräte- und Kontodaten ausschließlich nach Vorgabe durch Ihren Geräte- und Kontomanager und allein zu dem von Ihrem Geräte- und Kontomanager festgelegten Zweck.</translation>
+<translation id="4945672369594656571">Festlegen, wie mit Ihren Geräte- und Kontodaten verfahren wird. Google verarbeitet Ihre Geräte- und Kontodaten ausschließlich nach Vorgabe durch Ihren Geräte- und Kontomanager und allein zu dem von Ihrem Geräte- und Kontomanager festgelegten Zweck.</translation>
 <translation id="4950898438188848926">Schaltfläche zum Wechseln von Tabs, Eingabetaste drücken, um zum offenen Tab "<ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" />" zu wechseln</translation>
 <translation id="495170559598752135">Aktionen</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
@@ -729,7 +726,7 @@
 <translation id="5017554619425969104">Von Ihnen kopierter Text</translation>
 <translation id="5018422839182700155">Diese Seite kann nicht geöffnet werden</translation>
 <translation id="5019198164206649151">Sicherungsspeicher ist fehlerhaft.</translation>
-<translation id="5020154601324912079">Legt fest, wie mit Ihren Gerätedaten verfahren wird. Google verarbeitet Ihre Gerätedaten ausschließlich nach Vorgabe durch Ihren Gerätemanager und allein zu dem von Ihrem Gerätemanager festgelegten Zweck.</translation>
+<translation id="5020154601324912079">Festlegen, wie mit Ihren Gerätedaten verfahren wird. Google verarbeitet Ihre Gerätedaten ausschließlich nach Vorgabe durch Ihren Gerätemanager und allein zu dem von Ihrem Gerätemanager festgelegten Zweck.</translation>
 <translation id="5023310440958281426">Informieren Sie sich über die von Ihrem Administrator festgelegten Richtlinien.</translation>
 <translation id="5029568752722684782">Kopie löschen</translation>
 <translation id="503069730517007720">Für "<ph name="SOFTWARE_NAME" />" ist ein Stammzertifikat erforderlich, das nicht installiert ist. Ihr IT-Administrator sollte die Konfigurationsanweisungen für "<ph name="SOFTWARE_NAME" />" lesen, um das Problem zu beheben. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -888,7 +885,7 @@
 <translation id="5838278095973806738">Sie sollten keine vertraulichen Informationen wie Passwörter oder Kreditkartennummern auf dieser Website eingeben, da sie von Angreifern gestohlen werden könnten.</translation>
 <translation id="5860033963881614850">Aus</translation>
 <translation id="5863847714970149516">Auf der nächsten Seite wird möglicherweise versucht, Ihnen etwas in Rechnung zu stellen</translation>
-<translation id="5865951947699094510">Kann Ihre Kontoeinrichtung remote ändern.</translation>
+<translation id="5865951947699094510">Ihre Kontoeinrichtung remote ändern.</translation>
 <translation id="5866257070973731571">Telefonnummer hinzufügen</translation>
 <translation id="5869405914158311789">Die Website ist nicht erreichbar</translation>
 <translation id="5869522115854928033">Gespeicherte Passwörter</translation>
@@ -1110,7 +1107,6 @@
 <translation id="7220786058474068424">Verarbeitung läuft</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Malware auf nachfolgender Website</translation>
-<translation id="724766306220616965">Warnmeldungen, Konflikte</translation>
 <translation id="724975217298816891">Geben Sie das Gültigkeitsdatum und den CVC für <ph name="CREDIT_CARD" /> ein, um Ihre Kartendetails zu aktualisieren. Nach erfolgter Bestätigung werden die Kartendetails an diese Website weitergegeben.</translation>
 <translation id="7251437084390964440">Die Netzwerkkonfiguration entspricht nicht dem ONC-Standard. Die Konfiguration wird unter Umständen nicht vollständig importiert.
 Weitere Details:
@@ -1151,7 +1147,7 @@
 <translation id="741007362987735528">Wide-Format</translation>
 <translation id="7416351320495623771">Passwörter verwalten…</translation>
 <translation id="7419106976560586862">Profilpfad</translation>
-<translation id="7424427397225027541">Legt fest, wie mit Ihren Kontodaten verfahren wird. Google verarbeitet Ihre Kontodaten ausschließlich nach Vorgabe durch Ihren Kontomanager und allein zu dem von Ihrem Kontomanager festgelegten Zweck.</translation>
+<translation id="7424427397225027541">Festlegen, wie mit Ihren Kontodaten verfahren wird. Google verarbeitet Ihre Kontodaten ausschließlich nach Vorgabe durch Ihren Kontomanager und allein zu dem von Ihrem Kontomanager festgelegten Zweck.</translation>
 <translation id="7437289804838430631">Kontaktdaten hinzufügen</translation>
 <translation id="7440140511386898319">Verfügbare Offline-Inhalte</translation>
 <translation id="7441627299479586546">Falsche(r) Nutzername/Domain der Richtlinie</translation>
@@ -1409,6 +1405,7 @@
 <translation id="8891727572606052622">Ungültiger Proxymodus</translation>
 <translation id="8903921497873541725">Vergrößern</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google-Konto</translation>
 <translation id="8931333241327730545">Möchten Sie diese Karte in Ihrem Google-Konto speichern?</translation>
 <translation id="8932102934695377596">Ihre Uhr geht nach</translation>
 <translation id="893332455753468063">Namen hinzufügen</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index 8a710da..ee2382e1 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> στο <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Ακύρωση πληρωμής</translation>
 <translation id="3207960819495026254">Προστέθηκε στους σελιδοδείκτες</translation>
-<translation id="321912867715453276">Προειδοποίηση: Υπάρχουν πάνω από μία πηγές για την πολιτική, αλλά οι τιμές είναι ίδιες.</translation>
 <translation id="3225919329040284222">Ο διακομιστής παρουσίασε ένα πιστοποιητικό που δεν αντιστοιχεί στις ενσωματωμένες προϋποθέσεις. Αυτές οι προϋποθέσεις συμπεριλαμβάνονται σε συγκεκριμένους ιστότοπους υψηλής ασφάλειας για την προστασία σας.</translation>
 <translation id="3226128629678568754">Πατήστε το κουμπί της επανάληψης φόρτωσης για να υποβάλετε ξανά τα δεδομένα που απαιτούνται για τη φόρτωση της σελίδας.</translation>
 <translation id="3227137524299004712">Μικρόφωνο</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Υπολογισμός…</translation>
 <translation id="3973234410852337861">Ο κεντρικός υπολογιστής <ph name="HOST_NAME" /> είναι αποκλεισμένος</translation>
 <translation id="3987940399970879459">Λιγότερα από 1 MB</translation>
-<translation id="4008849406247176967">Προειδοποίηση: Υπάρχουν πάνω από μία πηγές με τιμές σε διένεξη για αυτήν την πολιτική!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 ιστοσελίδα σε κοντινή απόσταση}other{# ιστοσελίδες σε κοντινή απόσταση}}</translation>
 <translation id="4030383055268325496">&amp;Αναίρεση προσθήκης</translation>
 <translation id="4032320456957708163">Το πρόγραμμα περιήγησής σας είναι διαχειριζόμενο από τον τομέα <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -694,7 +692,6 @@
 <translation id="4738601419177586157">Πρόταση αναζήτησης <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Διαχείριση κωδικών πρόσβασης…</translation>
 <translation id="4744603770635761495">Διαδρομή εκτελέσιμου</translation>
-<translation id="4746351372139058112">Μηνύματα</translation>
 <translation id="4750917950439032686">Οι πληροφορίες σας (για παράδειγμα, οι κωδικοί πρόσβασης ή οι αριθμοί πιστωτικών καρτών) είναι ιδιωτικές κατά την αποστολή σε αυτόν τον ιστότοπο.</translation>
 <translation id="4756388243121344051">&amp;Ιστορικό</translation>
 <translation id="4758311279753947758">Προσθήκη στοιχείων επικοινωνίας</translation>
@@ -1124,7 +1121,6 @@
 <translation id="7220786058474068424">Επεξεργασία</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />, <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Ο ιστότοπος μετάβασης περιέχει κακόβουλο λογισμικό</translation>
-<translation id="724766306220616965">Προειδοποιήσεις, διένεξη</translation>
 <translation id="724975217298816891">Εισαγάγετε την ημερομηνία λήξης και τον κωδικό CVC για την πιστωτική κάρτα <ph name="CREDIT_CARD" />, προκειμένου να ενημερώσετε τα στοιχεία της κάρτας σας. Μετά την επιβεβαίωση, θα κοινοποιηθούν τα στοιχεία της κάρτας σας με αυτόν τον ιστότοπο.</translation>
 <translation id="7251437084390964440">Η διαμόρφωση δικτύου δεν συμμορφώνεται με το πρότυπο ONC. Ορισμένα τμήματα αυτής της διαμόρφωσης μπορεί να μην εισαχθούν
 Πρόσθετες λεπτομέρειες:
@@ -1423,6 +1419,7 @@
 <translation id="8891727572606052622">Μη έγκυρη λειτουργία διακομιστή μεσολάβησης.</translation>
 <translation id="8903921497873541725">Μεγέθυνση</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Λογαριασμός Google</translation>
 <translation id="8931333241327730545">Θέλετε να αποθηκεύσετε αυτήν την κάρτα στο Λογαριασμό σας Google;</translation>
 <translation id="8932102934695377596">Το ρολόι σας πάει πίσω</translation>
 <translation id="893332455753468063">Προσθήκη ονόματος</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 2ec3a70..1d35b04 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -408,7 +408,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> on <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Cancel payment</translation>
 <translation id="3207960819495026254">Bookmarked</translation>
-<translation id="321912867715453276">Warning: More than one source is present for the policy, but the values are the same.</translation>
 <translation id="3225919329040284222">The server presented a certificate that doesn't match built-in expectations. These expectations are included for certain, high-security websites in order to protect you.</translation>
 <translation id="3226128629678568754">Press the reload button to resubmit the data needed to load the page.</translation>
 <translation id="3227137524299004712">Microphone</translation>
@@ -548,7 +547,6 @@
 <translation id="397105322502079400">Calculating...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> is blocked</translation>
 <translation id="3987940399970879459">Less than 1 MB</translation>
-<translation id="4008849406247176967">Warning: More than one source with conflicting values is present for this policy.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 web page nearby}other{# web pages nearby}}</translation>
 <translation id="4030383055268325496">&amp;Undo add</translation>
 <translation id="4032320456957708163">Your browser is managed by <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -685,7 +683,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> search suggestion</translation>
 <translation id="4742407542027196863">Manage passwords…</translation>
 <translation id="4744603770635761495">Executable Path</translation>
-<translation id="4746351372139058112">Messages</translation>
 <translation id="4750917950439032686">Your information (for example, passwords or credit card numbers) is private when it is sent to this site.</translation>
 <translation id="4756388243121344051">&amp;History</translation>
 <translation id="4758311279753947758">Add contact info</translation>
@@ -1112,7 +1109,6 @@
 <translation id="7220786058474068424">Processing</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">The site ahead contains malware</translation>
-<translation id="724766306220616965">Warnings, Conflict</translation>
 <translation id="724975217298816891">Enter the expiry date and CVC for <ph name="CREDIT_CARD" /> to update your card details. Once you've confirmed, your card details will be shared with this site.</translation>
 <translation id="7251437084390964440">The network configuration doesn't comply to the ONC standard. Parts of the configuration may not be imported.
 Additional details:
@@ -1410,6 +1406,7 @@
 <translation id="8891727572606052622">Invalid proxy mode.</translation>
 <translation id="8903921497873541725">Zoom in</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google Account</translation>
 <translation id="8931333241327730545">Do you want to save this card to your Google Account?</translation>
 <translation id="8932102934695377596">Your clock is behind</translation>
 <translation id="893332455753468063">Add Name</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index e32a6e4c..343f4c0b 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -373,7 +373,7 @@
 <translation id="2948083400971632585">Puedes inhabilitar los servidores proxy configurados para una conexión desde la página de configuración.</translation>
 <translation id="2955913368246107853">Cerrar la barra de búsqueda</translation>
 <translation id="2969319727213777354">Para establecer una conexión segura, el reloj se debe configurar correctamente. Esto se debe a que los certificados que usan los sitios web para su identificación solo son válidos por períodos de tiempo específicos. Debido a que la configuración del reloj del dispositivo es incorrecta, Google Chrome no puede verificar estos certificados.</translation>
-<translation id="2970515157925768593">Puedes cambiar la configuración de tu cuenta y dispositivo de forma remota</translation>
+<translation id="2970515157925768593">Puedes cambiar la configuración de tu cuenta y dispositivo de forma remota.</translation>
 <translation id="2972581237482394796">&amp;Rehacer</translation>
 <translation id="2977665033722899841">Fila <ph name="ROW_NAME" /> seleccionada. <ph name="ROW_CONTENT" /></translation>
 <translation id="2982481275546140226">Borrar datos</translation>
@@ -417,7 +417,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> en <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Cancelar pago</translation>
 <translation id="3207960819495026254">Agregada a favoritos</translation>
-<translation id="321912867715453276">Advertencia: Hay más de una fuente para esta política, pero los valores son los mismos.</translation>
 <translation id="3225919329040284222">El servidor mostró un certificado que no coincide con lo esperado. Estas expectativas se incluyen en determinados sitios web con un alto nivel de seguridad para garantizar tu protección.</translation>
 <translation id="3226128629678568754">Presiona el botón para volver a cargar y, de ese modo, enviar nuevamente los datos necesarios para cargar la página.</translation>
 <translation id="3227137524299004712">Micrófono</translation>
@@ -557,7 +556,6 @@
 <translation id="397105322502079400">Calculando...</translation>
 <translation id="3973234410852337861">Se bloqueó <ph name="HOST_NAME" /></translation>
 <translation id="3987940399970879459">Menos de 1 MB</translation>
-<translation id="4008849406247176967">Advertencia: Hay más de una fuente con valores en conflicto para esta política.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 página web cercana}other{# páginas web cercanas}}</translation>
 <translation id="4030383055268325496">&amp;Deshacer Agregar</translation>
 <translation id="4032320456957708163"><ph name="ENROLLMENT_DOMAIN" /> administra tu navegador</translation>
@@ -694,7 +692,6 @@
 <translation id="4738601419177586157">Sugerencia de búsqueda: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Administrar contraseñas…</translation>
 <translation id="4744603770635761495">Ruta ejecutable</translation>
-<translation id="4746351372139058112">Mensajes</translation>
 <translation id="4750917950439032686">Tu información (p. ej., contraseñas o números de tarjetas de crédito) es privada cuando se envía a este sitio.</translation>
 <translation id="4756388243121344051">&amp;Historial</translation>
 <translation id="4758311279753947758">Agregar información de contacto</translation>
@@ -740,7 +737,7 @@
 <translation id="5017554619425969104">Texto que copiaste</translation>
 <translation id="5018422839182700155">No se puede abrir esta página</translation>
 <translation id="5019198164206649151">La memoria auxiliar se encuentra en mal estado.</translation>
-<translation id="5020154601324912079">Controla la forma en que administran los datos de tu dispositivo. Google procesa estos datos exclusivamente según las indicaciones del administrador de tu dispositivo y solo para los fines que se indiquen.</translation>
+<translation id="5020154601324912079">Controla la forma en que se administran los datos de tu dispositivo. Google procesa estos datos exclusivamente según las indicaciones del administrador de tu dispositivo y solo para los fines que se indiquen.</translation>
 <translation id="5023310440958281426">Revisa las políticas del administrador.</translation>
 <translation id="5029568752722684782">Borrar la copia</translation>
 <translation id="503069730517007720">Se requiere un certificado raíz para "<ph name="SOFTWARE_NAME" />", pero no está instalado. Tu administrador de IT debe analizar las instrucciones de configuración de "<ph name="SOFTWARE_NAME" />" para corregir este problema. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -1124,7 +1121,6 @@
 <translation id="7220786058474068424">Procesando</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Este sitio web contiene software malicioso</translation>
-<translation id="724766306220616965">Advertencias, Conflicto</translation>
 <translation id="724975217298816891">Ingresa la fecha de vencimiento y el CVC de la tarjeta <ph name="CREDIT_CARD" /> para actualizar sus datos. Después de confirmarla, los datos de tu tarjeta se compartirán con este sitio.</translation>
 <translation id="7251437084390964440">La configuración de red no cumple con el estándar ONC. Es posible que no se importen algunas partes de la configuración.
 Detalles adicionales:
@@ -1423,6 +1419,7 @@
 <translation id="8891727572606052622">Modo proxy no válido</translation>
 <translation id="8903921497873541725">Acercar</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Cuenta de Google</translation>
 <translation id="8931333241327730545">¿Quieres guardar esta tarjeta en tu cuenta de Google?</translation>
 <translation id="8932102934695377596">El reloj está atrasado</translation>
 <translation id="893332455753468063">Agregar nombre</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index a3cdb10..1b441a01 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -408,7 +408,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> de <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Cancelar pago</translation>
 <translation id="3207960819495026254">Añadido a marcadores</translation>
-<translation id="321912867715453276">Advertencia: Esta política tiene más de una fuente, pero los valores son los mismos.</translation>
 <translation id="3225919329040284222">El servidor ha mostrado un certificado que no coincide con lo que se esperaba. Algunos sitios web tienen un alto nivel de seguridad para garantizar tu protección y esperan ciertas características de los certificados.</translation>
 <translation id="3226128629678568754">Pulsa el botón de actualización de página para que se vuelvan a enviar los datos necesarios para cargar la página.</translation>
 <translation id="3227137524299004712">Micrófono</translation>
@@ -548,7 +547,6 @@
 <translation id="397105322502079400">Calculando...</translation>
 <translation id="3973234410852337861">La página <ph name="HOST_NAME" /> está bloqueada</translation>
 <translation id="3987940399970879459">Menos de 1 MB</translation>
-<translation id="4008849406247176967">Advertencia: Esta política tiene más de una fuente con valores en conflicto.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{ 1 página web cercana}other{ # páginas web cercanas}}</translation>
 <translation id="4030383055268325496">&amp;Deshacer acción de añadir</translation>
 <translation id="4032320456957708163">El navegador lo administra <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -685,7 +683,6 @@
 <translation id="4738601419177586157">Sugerencia de búsqueda de <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gestionar contraseñas…</translation>
 <translation id="4744603770635761495">Ruta del ejecutable</translation>
-<translation id="4746351372139058112">Mensajes</translation>
 <translation id="4750917950439032686">Tu información (por ejemplo, las contraseñas o los números de las tarjetas de crédito) es privada cuando se envía a este sitio web.</translation>
 <translation id="4756388243121344051">&amp;Historial</translation>
 <translation id="4758311279753947758">Añadir información de contacto</translation>
@@ -1112,7 +1109,6 @@
 <translation id="7220786058474068424">Procesando pago</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">El sitio web al que vas a acceder contiene software malicioso</translation>
-<translation id="724766306220616965">Advertencias, conflicto</translation>
 <translation id="724975217298816891">Introduce la fecha de caducidad y el código CVC de la tarjeta <ph name="CREDIT_CARD" /> para actualizar sus detalles. Cuando la confirmes, su información se compartirá con este sitio web.</translation>
 <translation id="7251437084390964440">La configuración de red no cumple el estándar ONC. Es posible que no se importen algunas partes de la configuración.
 Más información:
@@ -1410,6 +1406,7 @@
 <translation id="8891727572606052622">El modo de proxy no es válido.</translation>
 <translation id="8903921497873541725">Acercar</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">cuenta de Google</translation>
 <translation id="8931333241327730545">¿Quieres guardar esta tarjeta en tu cuenta de Google?</translation>
 <translation id="8932102934695377596">Tu reloj está atrasado</translation>
 <translation id="893332455753468063">Añade un nombre</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index d25fc5d..4f22962d 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956">Printer <ph name="PRINTER_NAME" /> serveris <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Tühista makse</translation>
 <translation id="3207960819495026254">Järjehoidjatesse lisatud</translation>
-<translation id="321912867715453276">Hoiatus. Reeglil on rohkem kui üks allikas, aga väärtused on kõik samad.</translation>
 <translation id="3225919329040284222">Serveri esitatud sertifikaat ei vasta sisseehitatud ootustele. Ootused on teie kaitsmiseks kaasatud kindlate kõrge turvalisusega veebisaitide jaoks.</translation>
 <translation id="3226128629678568754">Lehe laadimiseks vajalike andmete uuesti esitamiseks vajutage uuesti laadimise nuppu.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Arvutamine ...</translation>
 <translation id="3973234410852337861">Host <ph name="HOST_NAME" /> on blokeeritud</translation>
 <translation id="3987940399970879459">Alla 1 MB</translation>
-<translation id="4008849406247176967">Hoiatus. Selle reegli puhul on leitud rohkem kui üks vastuoluliste väärtustega allikas.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{Läheduses on 1 veebileht}other{Läheduses on # veebilehte}}</translation>
 <translation id="4030383055268325496">&amp;Võta lisamine tagasi</translation>
 <translation id="4032320456957708163">Teie brauserit haldab <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Otsingusoovitus: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Halda paroole …</translation>
 <translation id="4744603770635761495">Täitmistee</translation>
-<translation id="4746351372139058112">Sõnumid</translation>
 <translation id="4750917950439032686">Teie teave (nt paroolid või krediitkaardi numbrid) on sellele saidile saates privaatne.</translation>
 <translation id="4756388243121344051">&amp;Ajalugu</translation>
 <translation id="4758311279753947758">Lisage kontaktteave</translation>
@@ -918,7 +915,7 @@
 <translation id="5975083100439434680">Suumib välja</translation>
 <translation id="5980920751713728343">Index-3x5</translation>
 <translation id="598637245381783098">Makserakendust ei saa avada</translation>
-<translation id="5988826871883769516">Teie seadet haldab rakendus <ph name="ENROLLMENT_DOMAIN" />.</translation>
+<translation id="5988826871883769516">Teie seadet haldab <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="5989320800837274978">Määratud ei ole fikseeritud puhverservereid ega pac-skriptiga URL-i.</translation>
 <translation id="5990559369517809815">Laiendus blokeeris serverisse saadetavad päringud.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Töötlemine</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Avatav veebisait sisaldab pahavara</translation>
-<translation id="724766306220616965">Hoiatused, konflikt</translation>
 <translation id="724975217298816891">Kaardi üksikasjade värskendamiseks sisestage krediitkaardi <ph name="CREDIT_CARD" /> aegumiskuupäev ja CVC. Kui selle kinnitate, jagatakse teie kaardi üksikasju selle saidiga.</translation>
 <translation id="7251437084390964440">Võrgu seadistus ei vasta ONC standardile. On võimalik, et seadistuse mõnd osa ei saa importida.
 Lisateave:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Kehtetu puhverserveri režiim.</translation>
 <translation id="8903921497873541725">Suurendab</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google'i konto</translation>
 <translation id="8931333241327730545">Kas soovite selle kaardi salvestada oma Google'i kontole?</translation>
 <translation id="8932102934695377596">Teie kell on taga</translation>
 <translation id="893332455753468063">Nime lisamine</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index ff7b5d93..3a6d9bbe 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> در <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">لغو پرداخت</translation>
 <translation id="3207960819495026254">نشانک‌گذاری شده</translation>
-<translation id="321912867715453276">اخطار: برای این خط‌مشی، بیش از یک منبع وجود دارد، اما مقادیر آن‌ها یکسان‌ است.</translation>
 <translation id="3225919329040284222">سرور گواهی را نشان می‌دهد که با موارد پیش‌بینی‌شده داخلی مطابقت ندارد. این پیش‌بینی‌ها به‌طور حتم وب‌سایتهای دارای امنیت بالا را جهت محافظت از شما در بر می‌گیرند.</translation>
 <translation id="3226128629678568754">دکمه تازه‌سازی را فشار دهید تا داده‌های مورد نیاز برای بارگیری صفحه مجدداً ارسال شود.</translation>
 <translation id="3227137524299004712">میکروفن</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">در حال محاسبه…</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> مسدود است</translation>
 <translation id="3987940399970879459">کمتر از ۱ مگابایت</translation>
-<translation id="4008849406247176967">اخطار: برای این خط‌مشی، بیش از یک منبع حاوی مقادیر مغایر موجود است!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{ ۱ صفحه وب در این نزدیکی است}one{ # صفحه وب در این نزدیکی است}other{ # صفحه وب در این نزدیکی است}}</translation>
 <translation id="4030383055268325496">&amp;واگرد افزودن</translation>
 <translation id="4032320456957708163">مرورگرتان توسط <ph name="ENROLLMENT_DOMAIN" /> مدیریت می‌شود</translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">پیشنهاد جستجوی <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">مدیریت گذرواژه‌ها…</translation>
 <translation id="4744603770635761495">مسیر قابل اجرا</translation>
-<translation id="4746351372139058112">پیام‌ها</translation>
 <translation id="4750917950439032686">اطلاعات شما (به‌عنوان مثال، گذرواژه‌ها یا شماره‌ کارت‌های اعتباری) وقتی به این سایت ارسال می‌شوند، خصوصی هستند.</translation>
 <translation id="4756388243121344051">&amp;سابقه</translation>
 <translation id="4758311279753947758">افزودن اطلاعات تماس</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">درحال پردازش</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />؛ <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">این وب‌سایت بدافزار دارد</translation>
-<translation id="724766306220616965">هشدارها، تداخل</translation>
 <translation id="724975217298816891">‏برای به‌روزرسانی جزئیات کارتتان، تاریخ انقضا و CVC کارت <ph name="CREDIT_CARD" /> را وارد کنید. بعد از تأیید شدن، جزئیات کارتتان با این سایت به اشتراک گذاشته می‌شود.</translation>
 <translation id="7251437084390964440">‏پیکربندی شبکه با استاندارد ONC مطابقت ندارد. ممکن است بعضی از قسمت‌های پیکربندی وارد نشود.
 توضیحات بیشتر:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">حالت پروکسی نامعتبر است.</translation>
 <translation id="8903921497873541725">بزرگ‌نمایی</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">‏حساب Google</translation>
 <translation id="8931333241327730545">‏می‌خواهید این کارت را در حساب Google خود ذخیره کنید؟</translation>
 <translation id="8932102934695377596">ساعت شما عقب است</translation>
 <translation id="893332455753468063">افزودن نام</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index b2fda0b..6a1e543 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -417,7 +417,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" />, palvelin: <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Peruuta maksu</translation>
 <translation id="3207960819495026254">Kirjanmerkeissä</translation>
-<translation id="321912867715453276">Varoitus: Käytännölle on useita lähteitä, mutta arvot ovat samat.</translation>
 <translation id="3225919329040284222">Palvelin esitti varmenteen, joka ei vastaa sisäänrakennettuja odotuksia. Tietyillä tehokkaasti suojatuilla sivustoilla on odotuksia, joilla suojataan käyttäjiä.</translation>
 <translation id="3226128629678568754">Paina päivityspainiketta, niin sivun lataukseen tarvittavat tiedot lähetetään uudelleen.</translation>
 <translation id="3227137524299004712">Mikrofoni</translation>
@@ -557,7 +556,6 @@
 <translation id="397105322502079400">Lasketaan...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> on estetty</translation>
 <translation id="3987940399970879459">Alle 1 Mt</translation>
-<translation id="4008849406247176967">Varoitus: Käytännölle on useita lähteitä, joiden arvot ovat ristiriidassa.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 verkkosivu lähistöllä}other{# verkkosivua lähistöllä}}</translation>
 <translation id="4030383055268325496">K&amp;umoa lisäys</translation>
 <translation id="4032320456957708163">Selaimen ylläpitäjä on <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -694,7 +692,6 @@
 <translation id="4738601419177586157">Hakuehdotus <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Ylläpidä salasanoja…</translation>
 <translation id="4744603770635761495">Suoritettavan tiedoston polku</translation>
-<translation id="4746351372139058112">Viestit</translation>
 <translation id="4750917950439032686">Salasanat, luottokorttinumerot ja muut tietosi pysyvät yksityisinä, kun ne lähetetään tälle sivustolle.</translation>
 <translation id="4756388243121344051">&amp;Historia</translation>
 <translation id="4758311279753947758">Lisää yhteystiedot</translation>
@@ -1124,7 +1121,6 @@
 <translation id="7220786058474068424">Käsitellään.</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />, <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Seuraava verkkosivusto sisältää haittaohjelmia</translation>
-<translation id="724766306220616965">Varoituksia, ristiriita</translation>
 <translation id="724975217298816891">Päivitä kortin <ph name="CREDIT_CARD" /> tiedot antamalla sen CVC ja vanhenemispäivämäärä. Vahvistamisen jälkeen korttisi tiedot jaetaan sivuston kanssa.</translation>
 <translation id="7251437084390964440">Verkkoasetukset eivät noudata ONC-standardia. Kaikkia asetuksia ei välttämättä tuoda.
 Lisätietoja:
@@ -1423,6 +1419,7 @@
 <translation id="8891727572606052622">Virheellinen välityspalvelimen tila.</translation>
 <translation id="8903921497873541725">Lähennä</translation>
 <translation id="890485472659500557">Insinööri-C</translation>
+<translation id="8912362522468806198">Google-tilisi avulla</translation>
 <translation id="8931333241327730545">Haluatko tallentaa tämän kortin Google-tilillesi?</translation>
 <translation id="8932102934695377596">Kellosi jätättää</translation>
 <translation id="893332455753468063">Lisää nimi</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 869dd97..5d478a5b 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> sa <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Kanselahin ang Pagbabayad</translation>
 <translation id="3207960819495026254">Naka-bookmark</translation>
-<translation id="321912867715453276">Babala: May umiiral na mahigit sa isang source para sa patakaran, ngunit pareho ang mga value.</translation>
 <translation id="3225919329040284222">Nagpakita ang server ng certificate na hindi tumutugma sa mga built-in na inaasahan. Ang mga inaasahang ito ay isinama para sa ilang partikular na website na may mataas na antas ng seguridad upang maprotektahan ka.</translation>
 <translation id="3226128629678568754">Pindutin ang button na i-reload upang isumiteng muli ang data na kailangan upang ma-load ang pahina.</translation>
 <translation id="3227137524299004712">Mikropono</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Kinakalkula...</translation>
 <translation id="3973234410852337861">Naka-block ang <ph name="HOST_NAME" /></translation>
 <translation id="3987940399970879459">Wala pang 1 MB</translation>
-<translation id="4008849406247176967">Babala: May umiiral na mahigit sa isang source na may mga hindi tumutugmang value para sa patakarang ito!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 web page ang malapit}one{# web page ang malapit}other{# na web page ang malapit}}</translation>
 <translation id="4030383055268325496">&amp;I-undo ang pagdagdag</translation>
 <translation id="4032320456957708163">Pinapamahalaan ng <ph name="ENROLLMENT_DOMAIN" /> ang iyong browser</translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Suhestyon sa paghahanap para sa <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Pamahalaan ang mga password...</translation>
 <translation id="4744603770635761495">Naipapatupad na Path</translation>
-<translation id="4746351372139058112">Mga Mensahe</translation>
 <translation id="4750917950439032686">Pribado ang iyong impormasyon (halimbawa, mga password o credit card number) kapag ipinadala ito sa site na ito.</translation>
 <translation id="4756388243121344051">&amp;History</translation>
 <translation id="4758311279753947758">Magdagdag ng impormasyon sa pakikipag-ugnayan</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Pinoproseso</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Naglalaman ng malware ang site</translation>
-<translation id="724766306220616965">Mga Babala, Pagsasalungat</translation>
 <translation id="724975217298816891">Ilagay ang petsa ng expiration at CVC para sa <ph name="CREDIT_CARD" /> upang i-update ang mga detalye ng iyong card. Kapag nagkumpirma ka na, ibabahagi ang mga detalye ng iyong card sa site na ito.</translation>
 <translation id="7251437084390964440">Hindi sumusunod ang configuration ng network sa pamantayan ng ONC. Hindi maaaring i-import ang mga bahagi ng configuration.
 Mga karagdagang detalye:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Di-wastong mode ng proxy.</translation>
 <translation id="8903921497873541725">Mag-zoom in</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google Account</translation>
 <translation id="8931333241327730545">Gusto mo bang i-save ang card na ito sa iyong Google Account?</translation>
 <translation id="8932102934695377596">Nahuhuli ang iyong orasan</translation>
 <translation id="893332455753468063">Magdagdag ng Pangalan</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 4e26c81..e872241 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -408,7 +408,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> sur <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Annuler le paiement</translation>
 <translation id="3207960819495026254">Favori</translation>
-<translation id="321912867715453276">Avertissement : Il existe plusieurs sources pour cette règle, mais les valeurs sont identiques.</translation>
 <translation id="3225919329040284222">Le serveur dispose d'un certificat qui ne répond pas aux exigences intégrées. Celles-ci sont incluses dans certains sites Web très sécurisés afin de vous protéger.</translation>
 <translation id="3226128629678568754">Veuillez appuyer sur le bouton d'actualisation pour renvoyer les données nécessaires au chargement de la page.</translation>
 <translation id="3227137524299004712">Micro</translation>
@@ -548,7 +547,6 @@
 <translation id="397105322502079400">Calcul en cours…</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> est bloqué</translation>
 <translation id="3987940399970879459">Moins de 1 Mo</translation>
-<translation id="4008849406247176967">Avertissement : Il existe plusieurs sources avec des valeurs en conflit pour cette règle.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 page Web à proximité}one{# page Web à proximité}other{# pages Web à proximité}}</translation>
 <translation id="4030383055268325496">&amp;Annuler l'ajout</translation>
 <translation id="4032320456957708163">Votre navigateur est géré par <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -685,7 +683,6 @@
 <translation id="4738601419177586157">Suggestion de recherche sur "<ph name="TEXT" />"</translation>
 <translation id="4742407542027196863">Gérer les mots de passe…</translation>
 <translation id="4744603770635761495">Chemin d'accès exécutable</translation>
-<translation id="4746351372139058112">Messages</translation>
 <translation id="4750917950439032686">Vos informations, comme vos mots de passe ou vos numéros de carte de paiement, sont privées lorsqu'elles sont transmises à ce site.</translation>
 <translation id="4756388243121344051">&amp;Historique</translation>
 <translation id="4758311279753947758">Ajouter des coordonnées</translation>
@@ -1112,7 +1109,6 @@
 <translation id="7220786058474068424">Traitement en cours</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" /> ; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Le site que vous allez ouvrir contient des logiciels malveillants</translation>
-<translation id="724766306220616965">Avertissements, conflit</translation>
 <translation id="724975217298816891">Saisissez la date d'expiration et le code CVC de la carte <ph name="CREDIT_CARD" /> pour mettre à jour les informations relatives à celle-ci. Une fois la validation effectuée, les informations seront partagées avec ce site.</translation>
 <translation id="7251437084390964440">La configuration du réseau ne respecte pas les normes de l'ONC. Il est possible que des parties de la configuration ne soient pas importées.
 Informations supplémentaires :
@@ -1410,6 +1406,7 @@
 <translation id="8891727572606052622">Mode proxy non valide.</translation>
 <translation id="8903921497873541725">Zoom avant</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Compte Google</translation>
 <translation id="8931333241327730545">Voulez-vous enregistrer cette carte dans votre compte Google ?</translation>
 <translation id="8932102934695377596">Votre horloge est en retard</translation>
 <translation id="893332455753468063">Ajouter un nom</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index 435d0e7..0bc17a46 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> પર <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">ચુકવણી રદ કરો</translation>
 <translation id="3207960819495026254">બુકમાર્ક કરેલ</translation>
-<translation id="321912867715453276">ચેતવણી: આ પૉલિસી માટે એકથી વધુ સૉર્સ ઉપલબ્ધ છે, પણ મૂલ્ય સમાન છે.</translation>
 <translation id="3225919329040284222">સર્વર એક પ્રમાણપત્ર પ્રસ્તુત કરે છે જે બિલ્ટ-ઇન અપેક્ષાઓ સાથે મેળ ખાતું નથી. આ અપેક્ષાઓમાં તમને સુરક્ષિત રાખવા માટે અમુક ચોક્કસ, ઉચ્ચ-સુરક્ષા વેબસાઇટ્સનો સમાવેશ થાય છે.</translation>
 <translation id="3226128629678568754">પૃષ્ઠને લોડ કરવા માટે જરૂરી ડેટા ફરીથી સબમિટ કરવા માટે ફરીથી લોડ કરો બટન દબાવો.</translation>
 <translation id="3227137524299004712">માઇક્રોફોન</translation>
@@ -555,7 +554,6 @@
 <translation id="397105322502079400">ગણના કરી રહ્યું છે...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> અવરોધિત છે</translation>
 <translation id="3987940399970879459">1 MB કરતાં ઓછું</translation>
-<translation id="4008849406247176967">ચેતવણી: આ પૉલિસી માટે વિરોધાભાસ મૂલ્ય ધરાવતા એકથી વધુ સૉર્સ ઉપલબ્ધ છે!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{નજીકમાં 1 વેબ પેજ}one{નજીકમાં # વેબ પેજ}other{નજીકમાં # વેબ પેજ}}</translation>
 <translation id="4030383055268325496">&amp;ઉમેરવું પૂર્વવત્ કરો</translation>
 <translation id="4032320456957708163">તમારું બ્રાઉઝર <ph name="ENROLLMENT_DOMAIN" /> દ્વારા મેનેજ કરવામાં આવે છે</translation>
@@ -692,7 +690,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> શોધ સૂચન</translation>
 <translation id="4742407542027196863">પાસવર્ડ મેનેજ કરો…</translation>
 <translation id="4744603770635761495">અમલ કરવાયોગ્ય પાથ</translation>
-<translation id="4746351372139058112">સંદેશા</translation>
 <translation id="4750917950439032686">તમારી માહિતી (ઉદાહરણ તરીકે, પાસવર્ડ્સ અથવા ક્રેડિટ કાર્ડ નંબર્સ) ખાનગી હોય છે જ્યારે તે આ સાઇટ પર મોકલવામાં આવે.</translation>
 <translation id="4756388243121344051">&amp;ઇતિહાસ</translation>
 <translation id="4758311279753947758">સંપર્ક માહિતી ઉમેરો</translation>
@@ -1122,7 +1119,6 @@
 <translation id="7220786058474068424">પ્રક્રિયા કરી રહ્યું છે</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">સાઇટ આગળ મૉલવેર ધરાવે છે</translation>
-<translation id="724766306220616965">ચેતવણીઓ, વિરોધાભાસ</translation>
 <translation id="724975217298816891">તમારા કાર્ડની વિગતોને અપડેટ કરવા <ph name="CREDIT_CARD" /> માટે સમાપ્તિ તારીખ અને CVC દાખલ કરો. એકવાર તમે ખાતરી કરી લો, તે પછી આ સાઇટ સાથે તમારા કાર્ડની વિગતો શેર કરવામાં આવશે.</translation>
 <translation id="7251437084390964440">નેટવર્ક ગોઠવણી ONC માનકનું પાલન કરતી નથી. કદાચ ગોઠવણીના ભાગોને આયાત કરાશે નહીં.
 વધારાની વિગતો:
@@ -1420,6 +1416,7 @@
 <translation id="8891727572606052622">અમાન્ય પ્રૉક્સી મોડ.</translation>
 <translation id="8903921497873541725">ઝૂમ વધારો</translation>
 <translation id="890485472659500557">એન્જિનિયરિંગ-C</translation>
+<translation id="8912362522468806198">Google એકાઉન્ટ</translation>
 <translation id="8931333241327730545">શું તમે આ કાર્ડને તમારા Google એકાઉન્ટમાં સાચવવા માગો છો?</translation>
 <translation id="8932102934695377596">તમારી ઘડિયાળ પાછળ છે</translation>
 <translation id="893332455753468063">નામ ઉમેરો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 37b433ee..abc2cd9 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -414,7 +414,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> पर <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">भुगतान रद्द करें</translation>
 <translation id="3207960819495026254">बुकमार्क किया गया</translation>
-<translation id="321912867715453276">चेतावनीः इस नीति के लिए, एक से ज़्यादा स्रोत मौजूद हैं, लेकिन इनके मान एक जैसे हैं.</translation>
 <translation id="3225919329040284222">सर्वर द्वारा कोई प्रमाणपत्र प्रस्‍तुत किया गया, जो बिल्‍ट-इन अपेक्षाओं से मिलान नहीं करता. इन अपेक्षाओं को आपकी सुरक्षा करने के लिए कुछ, उच्‍च-सुरक्षा वेबसाइटों के लिए शामिल किया गया है.</translation>
 <translation id="3226128629678568754">पेज को लोड करने के लिए ज़रूरी डेटा फिर सबमिट करने के लिए 'फिर लोड करें' बटन दबाएं.</translation>
 <translation id="3227137524299004712">माइक्रोफ़ोन</translation>
@@ -554,7 +553,6 @@
 <translation id="397105322502079400">गणना की जा रही है...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> को ब्लॉक किया गया है</translation>
 <translation id="3987940399970879459">एक एमबी से कम</translation>
-<translation id="4008849406247176967">चेतावनीः इस नीति के लिए एक-दूसरे से अलग मानों वाले एक से ज़्यादा स्रोत मौजूद हैं!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{आस-पास 1 वेब पेज है}one{आस-पास # वेब पेज हैं}other{आस-पास # वेब पेज हैं}}</translation>
 <translation id="4030383055268325496">&amp;जोड़ना वापस लाएं</translation>
 <translation id="4032320456957708163">आपके ब्राउज़र को <ph name="ENROLLMENT_DOMAIN" /> प्रबंधित करता है</translation>
@@ -691,7 +689,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> खोज सुझाव</translation>
 <translation id="4742407542027196863">पासवर्ड प्रबंधित करें…</translation>
 <translation id="4744603770635761495">निष्पादित किए जाने वाले पाथ</translation>
-<translation id="4746351372139058112">संदेश</translation>
 <translation id="4750917950439032686">आपकी जानकारी (जैसे- पासवर्ड या क्रेडिट कार्ड नंबर वगैरह) जब इस साइट पर भेजी जाती है, तब वह निजी होती है.</translation>
 <translation id="4756388243121344051">&amp;इतिहास</translation>
 <translation id="4758311279753947758">संपर्क जानकारी जोड़ें</translation>
@@ -880,7 +877,7 @@
 <translation id="5737183892635480227">{NUM_CARDS,plural, =1{अपने Google खाते में कार्ड सेव करें}one{अपने Google खाते में कार्ड सेव करें}other{अपने Google खाते में कार्ड सेव करें}}</translation>
 <translation id="5763042198335101085">मान्य ईमेल पता डालें</translation>
 <translation id="5765072501007116331">वितरण के तरीके और ज़रूरतें देखने के लिए, कोई पता चुनें</translation>
-<translation id="5778550464785688721">MIDI डिवाइस पूर्ण नियंत्रण</translation>
+<translation id="5778550464785688721">MIDI डिवाइस पूरा नियंत्रण</translation>
 <translation id="578305955206182703">ऐंबर</translation>
 <translation id="57838592816432529">म्यूट करें</translation>
 <translation id="5784606427469807560">आपके कार्ड की पुष्टि करते समय समस्‍या हुई. अपना इंटरनेट कनेक्‍शन जांचें और फिर से कोशिश करें.</translation>
@@ -918,7 +915,7 @@
 <translation id="598637245381783098">भुगतान ऐप्लिकेशन नहीं खुल सका</translation>
 <translation id="5988826871883769516">आपके डिवाइस का प्रबंधन <ph name="ENROLLMENT_DOMAIN" /> करता है.</translation>
 <translation id="5989320800837274978">न तो कोई फ़िक्‍स्‍ड प्रॉक्‍सी सर्वर और न ही कोई .pac स्क्रिप्ट URL साफ़ तौर पर बताया गया है.</translation>
-<translation id="5990559369517809815">सर्वर से किए गए अनुरोधों को एक्‍सटेंशन द्वारा अवरुद्ध कर दिया गया है.</translation>
+<translation id="5990559369517809815">सर्वर से किए गए अनुरोधों को एक्‍सटेंशन द्वारा ब्लॉक कर दिया गया है.</translation>
 <translation id="6008256403891681546">JCB</translation>
 <translation id="6015796118275082299">वर्ष</translation>
 <translation id="6016158022840135739">{COUNT,plural, =1{पेज 1}one{पेज #}other{पेज #}}</translation>
@@ -1121,7 +1118,6 @@
 <translation id="7220786058474068424">संसाधित हो रहा है</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">साइट में आगे मैलवेयर हैं</translation>
-<translation id="724766306220616965">चेतावनियां, विरोध</translation>
 <translation id="724975217298816891">अपने कार्ड विवरण अपडेट करने के लिए <ph name="CREDIT_CARD" /> के खत्म होने की तारीख और कार्ड वेरीफ़िकेशन कोड (सीवीसी) डालें. आपकी ओर से पुष्टि हो जाने पर, आपके कार्ड के विवरण इस साइट के साथ शेयर किए जाएंगे.</translation>
 <translation id="7251437084390964440">नेटवर्क कॉन्फ़िगरेशन ONC मानक के मुताबिक नहीं है. हो सकता है कि कॉन्फ़िगरेशन के कुछ हिस्से नहीं लाए गए हों.
 ज़्यादा जानकारी:
@@ -1420,6 +1416,7 @@
 <translation id="8891727572606052622">अमान्य प्रॉक्सी मोड.</translation>
 <translation id="8903921497873541725">ज़ूम इन करें</translation>
 <translation id="890485472659500557">इंजीनियरिंग-सी</translation>
+<translation id="8912362522468806198">Google खाता</translation>
 <translation id="8931333241327730545">क्या आप इस कार्ड को अपने Google खाते में सेव करना चाहते हैं?</translation>
 <translation id="8932102934695377596">आपकी घड़ी पीछे है</translation>
 <translation id="893332455753468063">नाम जोड़ें</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 839dc0368..bba6e9a 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> na poslužitelju <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Otkaži plaćanje</translation>
 <translation id="3207960819495026254">Označeno</translation>
-<translation id="321912867715453276">Upozorenje: za to je pravilo prisutno više izvora, ali vrijednosti su iste.</translation>
 <translation id="3225919329040284222">Poslužitelj je pokazao certifikat koji ne odgovara ugrađenim očekivanjima. Ta su očekivanja uključena za određene web-lokacije s visokim stupnjem sigurnosti radi vaše zaštite.</translation>
 <translation id="3226128629678568754">Pritisnite gumb za ponovno učitavanje da biste ponovo poslali podatke koji su potrebni za učitavanje stranice.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -555,7 +554,6 @@
 <translation id="397105322502079400">Izračun u tijeku…</translation>
 <translation id="3973234410852337861">Host <ph name="HOST_NAME" /> je blokiran</translation>
 <translation id="3987940399970879459">Manje od 1 MB</translation>
-<translation id="4008849406247176967">Upozorenje: za to je pravilo prisutno više izvora sa sukobljenim vrijednostima!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 web-stranica u blizini}one{# web-stranica u blizini}few{# web-stranice u blizini}other{# web-stranica u blizini}}</translation>
 <translation id="4030383055268325496">&amp;Poništi dodavanje</translation>
 <translation id="4032320456957708163">Vašim preglednikom upravlja <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -692,7 +690,6 @@
 <translation id="4738601419177586157">Prijedlog za pretraživanje <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Upravljaj zaporkama…</translation>
 <translation id="4744603770635761495">Izvršna putanja</translation>
-<translation id="4746351372139058112">Poruke</translation>
 <translation id="4750917950439032686">Vaši podaci (na primjer, zaporke i brojevi kreditnih kartica) privatni su kada se šalju na tu web-lokaciju.</translation>
 <translation id="4756388243121344051">&amp;Povijest</translation>
 <translation id="4758311279753947758">Dodaj pod. za kontakt</translation>
@@ -1122,7 +1119,6 @@
 <translation id="7220786058474068424">Obrada</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Web-lokacija pred vama sadrži zlonamjerni softver</translation>
-<translation id="724766306220616965">Upozorenja, sukob</translation>
 <translation id="724975217298816891">Unesite datum isteka i CVC za karticu <ph name="CREDIT_CARD" /> da biste ažurirali podatke o kartici. Nakon što ih potvrdite, podaci o kartici dijelit će se s ovom web-lokacijom.</translation>
 <translation id="7251437084390964440">Konfiguracija mreže nije u skladu sa standardom ONC. Dijelovi konfiguracije možda se neće uvesti.
 Dodatne pojedinosti:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Nevažeći način proxy poslužitelja.</translation>
 <translation id="8903921497873541725">Povećaj</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google Račun</translation>
 <translation id="8931333241327730545">Želite li spremiti tu karticu na Google račun?</translation>
 <translation id="8932102934695377596">Sat kasni</translation>
 <translation id="893332455753468063">Dodajte ime</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 9f72163..ae29d4e 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -414,7 +414,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> nyomtató a(z) <ph name="SERVER_NAME" /> nevű szerveren</translation>
 <translation id="320323717674993345">Fizetés visszavonása</translation>
 <translation id="3207960819495026254">Könyvjelző rögzítve</translation>
-<translation id="321912867715453276">Figyelem: Egynél több forrás van megadva a házirendnél, de az értékeik ugyanazok.</translation>
 <translation id="3225919329040284222">A szerver tanúsítványa nem felel meg a beépített elvárásoknak. Ezek a beépített elvárások bizonyos nagy biztonságú webhelyekre vonatkoznak az Ön védelme érdekében.</translation>
 <translation id="3226128629678568754">Nyomja meg a frissítés gombot az oldal betöltéséhez szükséges adatok újraküldéséhez.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -554,7 +553,6 @@
 <translation id="397105322502079400">Számítás…</translation>
 <translation id="3973234410852337861">A(z) <ph name="HOST_NAME" /> le van tiltva</translation>
 <translation id="3987940399970879459">Kevesebb mint 1 MB</translation>
-<translation id="4008849406247176967">Figyelem: Több, egymással ütköző értékekkel rendelkező forrás található ennél a házirendnél.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 közeli weboldal}other{# közeli weboldal}}</translation>
 <translation id="4030383055268325496">&amp;Hozzáadás visszavonása</translation>
 <translation id="4032320456957708163">Böngészőjét a(z) <ph name="ENROLLMENT_DOMAIN" /> felügyeli</translation>
@@ -691,7 +689,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> keresési javaslat</translation>
 <translation id="4742407542027196863">Jelszavak kezelése…</translation>
 <translation id="4744603770635761495">Végrehajtható fájl útvonala</translation>
-<translation id="4746351372139058112">Üzenetek</translation>
 <translation id="4750917950439032686">Adatai (például jelszava vagy hitelkártyaszáma) nem láthatók más számára, amikor a rendszer elküldi őket a webhelynek.</translation>
 <translation id="4756388243121344051">&amp;Előzmények</translation>
 <translation id="4758311279753947758">Névjegyadatok hozzáadása</translation>
@@ -1121,7 +1118,6 @@
 <translation id="7220786058474068424">Feldolgozás alatt</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">A megnyíló oldal rosszindulatú programot tartalmaz</translation>
-<translation id="724766306220616965">Figyelmeztetések, ütközés</translation>
 <translation id="724975217298816891">Adja meg a(z) <ph name="CREDIT_CARD" /> kártya lejárati dátumát és CVC-kódját. Az ellenőrzést követően a böngésző megosztja kártyaadatait ezzel a webhellyel.</translation>
 <translation id="7251437084390964440">A hálózati konfiguráció nem felel meg az ONC szabványnak. A konfiguráció egyes részeit nem lehet importálni.
 További részletek:
@@ -1420,6 +1416,7 @@
 <translation id="8891727572606052622">Érvénytelen proxymód.</translation>
 <translation id="8903921497873541725">Nagyítás</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google Fiókjába</translation>
 <translation id="8931333241327730545">Menti ezt a kártyát a Google-fiókjába?</translation>
 <translation id="8932102934695377596">Késik az órája</translation>
 <translation id="893332455753468063">Név hozzáadása</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index f32ebe41..ac48e42 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> di <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Batalkan Pembayaran</translation>
 <translation id="3207960819495026254">Diberi bookmark</translation>
-<translation id="321912867715453276">Peringatan: Ada beberapa sumber yang nilainya sama untuk kebijakan ini.</translation>
 <translation id="3225919329040284222">Server menunjukkan sertifikat yang tidak sesuai dengan harapan terpasang. Harapan ini disertakan untuk situs web tertentu dengan keamanan tinggi guna melindungi Anda.</translation>
 <translation id="3226128629678568754">Tekan tombol muat ulang untuk mengirimkan lagi data yang dibutuhkan untuk memuat halaman ini.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -555,7 +554,6 @@
 <translation id="397105322502079400">Menghitung...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> diblokir.</translation>
 <translation id="3987940399970879459">Kurang dari 1 MB</translation>
-<translation id="4008849406247176967">Peringatan: Ada beberapa sumber dengan nilai yang bertentangan untuk kebijakan ini!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 halaman web di sekitar}other{# halaman web di sekitar}}</translation>
 <translation id="4030383055268325496">&amp;Urungkan penambahan</translation>
 <translation id="4032320456957708163">Browser Anda dikelola oleh <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -692,7 +690,6 @@
 <translation id="4738601419177586157">Saran penelusuran <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Kelola sandi...</translation>
 <translation id="4744603770635761495">Jalur Yang Dapat Dijalankan</translation>
-<translation id="4746351372139058112">Pesan</translation>
 <translation id="4750917950439032686">Informasi Anda (misalnya, sandi atau nomor kartu kredit) bersifat pribadi saat dikirimkan ke situs ini.</translation>
 <translation id="4756388243121344051">&amp;Riwayat</translation>
 <translation id="4758311279753947758">Tambahkan info kontak</translation>
@@ -1122,7 +1119,6 @@
 <translation id="7220786058474068424">Dalam proses</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Situs yang akan dibuka berisi software perusak</translation>
-<translation id="724766306220616965">Peringatan, Bentrok</translation>
 <translation id="724975217298816891">Masukkan tanggal habis masa berlaku dan CVC untuk <ph name="CREDIT_CARD" /> guna memperbarui detail kartu. Setelah mengonfirmasi, detail kartu Anda akan dibagikan dengan situs ini.</translation>
 <translation id="7251437084390964440">Konfigurasi jaringan tidak mematuhi standar ONC. Sebagian konfigurasi mungkin tidak diimpor. Detail tambahan: <ph name="DEBUG_INFO" /></translation>
 <translation id="725866823122871198">Sambungan pribadi ke <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> tidak dapat dibuat karena tanggal dan waktu (<ph name="DATE_AND_TIME" />) komputer Anda tidak benar.</translation>
@@ -1416,6 +1412,7 @@
 <translation id="8891727572606052622">Mode proxy tidak valid.</translation>
 <translation id="8903921497873541725">Perbesar</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Akun Google</translation>
 <translation id="8931333241327730545">Ingin menyimpan kartu ini ke Akun Google Anda?</translation>
 <translation id="8932102934695377596">Setelan waktu Anda terlalu lambat</translation>
 <translation id="893332455753468063">Tambahkan Nama</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 816b31a..248785b9 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -385,7 +385,7 @@
 <translation id="3005723025932146533">Mostra copia salvata</translation>
 <translation id="3008447029300691911">Inserisci il codice CVC della carta <ph name="CREDIT_CARD" />. Dopo essere stati confermati, i dettagli della carta saranno condivisi con questo sito.</translation>
 <translation id="3010559122411665027">Voce "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
-<translation id="3014389611820813634">In qualità di gestore del tuo dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation>
+<translation id="3014389611820813634">In qualità di gestore di questo dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="301521992641321250">Bloccata automaticamente</translation>
 <translation id="3023071826883856138">You4 (Envelope)</translation>
 <translation id="3024663005179499861">Tipo di criterio errato</translation>
@@ -413,7 +413,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> su <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Annulla pagamento</translation>
 <translation id="3207960819495026254">Aggiunto ai preferiti</translation>
-<translation id="321912867715453276">Avviso: è presente più di una fonte per questa norma, ma i valori sono gli stessi.</translation>
 <translation id="3225919329040284222">Il server ha presentato un certificato che non corrisponde alle previsioni integrate. Queste previsioni sono incluse per determinati siti web con protezione elevata allo scopo di proteggerti.</translation>
 <translation id="3226128629678568754">Premi il pulsante Ricarica per inviare di nuovo i dati necessari per caricare la pagina.</translation>
 <translation id="3227137524299004712">Microfono</translation>
@@ -472,7 +471,7 @@
 <translation id="3495081129428749620">Trova nella pagina
     <ph name="PAGE_TITLE" /></translation>
 <translation id="3498215018399854026">In questo momento, non è possibile raggiungere il tuo genitore. Riprova.</translation>
-<translation id="3512163584740124171">Questa norma viene ignorata perché un'altra norma dello stesso gruppo di norme ha una priorità più elevata.</translation>
+<translation id="3512163584740124171">Questo criterio viene ignorato perché un altro criterio dello stesso gruppo ha una priorità più elevata.</translation>
 <translation id="3528171143076753409">Il certificato del server non è affidabile.</translation>
 <translation id="3528485271872257980">Marrone scuro</translation>
 <translation id="3530944546672790857">{COUNT,plural, =0{Almeno 1 elemento sui dispositivi sincronizzati}=1{1 elemento (e altri sui dispositivi sincronizzati)}other{# elementi (e altri sui dispositivi sincronizzati)}}</translation>
@@ -553,7 +552,6 @@
 <translation id="397105322502079400">Calcolo in corso...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> è bloccato</translation>
 <translation id="3987940399970879459">Meno di 1 MB</translation>
-<translation id="4008849406247176967">Avviso: è presente più di una fonte con valori in conflitto per questa norma.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{Una pagina web nelle vicinanze}other{# pagine web nelle vicinanze}}</translation>
 <translation id="4030383055268325496">&amp;Annulla aggiunta</translation>
 <translation id="4032320456957708163">Il browser in uso è gestito da <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -690,7 +688,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> suggerimento di ricerca</translation>
 <translation id="4742407542027196863">Gestisci password…</translation>
 <translation id="4744603770635761495">Percorso eseguibile</translation>
-<translation id="4746351372139058112">Messaggi</translation>
 <translation id="4750917950439032686">Le tue informazioni (ad esempio password o numeri di carte di credito) restano private quando vengono inviate a questo sito.</translation>
 <translation id="4756388243121344051">&amp;Cronologia</translation>
 <translation id="4758311279753947758">Aggiungi informazioni di contatto</translation>
@@ -722,7 +719,7 @@
 <translation id="4926159001844873046"><ph name="SITE" /> dice</translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">Nessun risultato</translation>
-<translation id="4945672369594656571">Controlla in che modo vengono gestiti i dati del tuo dispositivo e del tuo account. Google elabora i dati del tuo dispositivo e del tuo account esclusivamente sotto la direzione del gestore dei tuoi dispositivi e account, e unicamente per le finalità specificate dal gestore dei tuoi dispositivi e account.</translation>
+<translation id="4945672369594656571">Controlla in che modo vengono gestiti i dati del tuo dispositivo e del tuo account. Google elabora i dati del tuo dispositivo e del tuo account esclusivamente sotto la direzione del gestore dei tuoi dispositivi e account e unicamente per le finalità specificate dal gestore dei tuoi dispositivi e account.</translation>
 <translation id="4950898438188848926">Pulsante per cambiare scheda, premi INVIO per passare alla scheda aperta, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation>
 <translation id="495170559598752135">Azioni</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
@@ -1119,7 +1116,6 @@
 <translation id="7220786058474068424">Elaborazione in corso</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Il sito che stai per visitare contiene malware</translation>
-<translation id="724766306220616965">Avvisi, conflitto</translation>
 <translation id="724975217298816891">Inserisci la data di scadenza e il codice CVC della carta <ph name="CREDIT_CARD" /> per aggiornare i relativi dettagli. Dopo essere stati confermati, i dettagli della carta saranno condivisi con questo sito.</translation>
 <translation id="7251437084390964440">La configurazione di rete non è conforme allo standard ONC. Parti della configurazione potrebbero non essere importate.
 Ulteriori dettagli:
@@ -1417,6 +1413,7 @@
 <translation id="8891727572606052622">Modalità proxy non valida.</translation>
 <translation id="8903921497873541725">Aumenta lo zoom</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google Account</translation>
 <translation id="8931333241327730545">Vuoi salvare la scheda nel tuo Account Google?</translation>
 <translation id="8932102934695377596">L'orologio è indietro</translation>
 <translation id="893332455753468063">Aggiungi nome</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index aa93a7c..82e4f007 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -408,7 +408,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> בשרת <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">בטל תשלום</translation>
 <translation id="3207960819495026254">מסומן בסימניה</translation>
-<translation id="321912867715453276">אזהרה: במדיניות הזו קיים יותר ממקור אחד, אבל הערכים זהים.</translation>
 <translation id="3225919329040284222">השרת הציג אישור שאינו תואם את הציפיות המובנות. ציפיות אלה נכללות עבור אתרי אינטרנט מסוימים בעלי אבטחה גבוהה כדי להגן עליך.</translation>
 <translation id="3226128629678568754">לחץ על לחצן הטעינה מחדש כדי לשלוח מחדש את הנתונים הדרושים לטעינת הדף.</translation>
 <translation id="3227137524299004712">מיקרופון</translation>
@@ -548,7 +547,6 @@
 <translation id="397105322502079400">מחשב...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> חסום</translation>
 <translation id="3987940399970879459">‏פחות מ-‎1 MB</translation>
-<translation id="4008849406247176967">אזהרה: קיים יותר ממקור אחד עם ערכים סותרים עבור המדיניות הזו!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{דף אינטרנט קרוב אחד}two{# דפי אינטרנט קרובים}many{# דפי אינטרנט קרובים}other{# דפי אינטרנט קרובים}}</translation>
 <translation id="4030383055268325496">&amp;ביטול הוספה</translation>
 <translation id="4032320456957708163">הדפדפן שלך מנוהל על ידי <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -685,7 +683,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> – הצעת חיפוש</translation>
 <translation id="4742407542027196863">ניהול סיסמאות…</translation>
 <translation id="4744603770635761495">נתיב להפעלה</translation>
-<translation id="4746351372139058112">הודעות</translation>
 <translation id="4750917950439032686">הפרטים שלך (כמו סיסמאות או מספרי כרטיסי אשראי) נשלחים לאתר הזה במצב פרטי.</translation>
 <translation id="4756388243121344051">&amp;היסטוריה</translation>
 <translation id="4758311279753947758">הוסף פרטים ליצירת קשר</translation>
@@ -1117,7 +1114,6 @@
 <translation id="7220786058474068424">מעבד</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">האתר שלפניך מכיל תוכנה זדונית</translation>
-<translation id="724766306220616965">אזהרות, סתירה</translation>
 <translation id="724975217298816891">הזן את תאריך התפוגה ואת קוד האימות של <ph name="CREDIT_CARD" /> כדי לעדכן את פרטי הכרטיס. ברגע שתאשר, פרטי הכרטיס שלך ישותפו עם האתר הזה.</translation>
 <translation id="7251437084390964440">‏תצורת הרשת אינה תואמת לתקן ONC. ייתכן שחלקים מהתצורה לא ייכללו בייבוא.
 פרטים נוספים:
@@ -1416,6 +1412,7 @@
 <translation id="8891727572606052622">‏מצב שרת Proxy לא חוקי.</translation>
 <translation id="8903921497873541725">התקרב</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">‏חשבון Google</translation>
 <translation id="8931333241327730545">‏האם ברצונך לשמור את הכרטיס הזה בחשבון Google שלך?</translation>
 <translation id="8932102934695377596">השעון שלך מאחר</translation>
 <translation id="893332455753468063">הוספת שם</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index bb289bf..afe501f 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -408,7 +408,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" />(<ph name="SERVER_NAME" /> 上)</translation>
 <translation id="320323717674993345">支払いをキャンセル</translation>
 <translation id="3207960819495026254">ブックマークしました</translation>
-<translation id="321912867715453276">警告: ポリシーに複数のソースがありますが、値は同一です。</translation>
 <translation id="3225919329040284222">サーバーの提示した証明書が、組み込まれている想定の証明書と一致しません。これらの想定の証明書は、ユーザー保護のため、特定の安全性の高いウェブサイトについて用意されています。</translation>
 <translation id="3226128629678568754">ページの読み込みに必要なデータを再送信するには、再読み込みボタンを押してください。</translation>
 <translation id="3227137524299004712">マイク</translation>
@@ -548,7 +547,6 @@
 <translation id="397105322502079400">計算しています...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> はブロックされています</translation>
 <translation id="3987940399970879459">1 MB 未満</translation>
-<translation id="4008849406247176967">警告: このポリシーには、値が競合する複数のソースがあります。</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 件の近くのウェブページ}other{# 件の近くのウェブページ}}</translation>
 <translation id="4030383055268325496">追加の取り消し(&amp;U)</translation>
 <translation id="4032320456957708163">ご使用のブラウザは <ph name="ENROLLMENT_DOMAIN" /> によって管理されています</translation>
@@ -685,7 +683,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> の検索候補</translation>
 <translation id="4742407542027196863">パスワードを管理…</translation>
 <translation id="4744603770635761495">実行ファイルのパス</translation>
-<translation id="4746351372139058112">メッセージ</translation>
 <translation id="4750917950439032686">お客様がこのサイトに送信した情報(パスワード、クレジット カード番号など)が第三者に見られることはありません。</translation>
 <translation id="4756388243121344051">履歴(&amp;H)</translation>
 <translation id="4758311279753947758">連絡先情報を追加</translation>
@@ -1112,7 +1109,6 @@
 <translation id="7220786058474068424">処理しています</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />、<ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">アクセス先のサイトで不正なソフトウェアを検出しました</translation>
-<translation id="724766306220616965">警告、競合</translation>
 <translation id="724975217298816891">カードの詳細を更新するには <ph name="CREDIT_CARD" /> の有効期限と CVC を入力します。確認を行うと、カードの詳細がこのサイトと共有されます。</translation>
 <translation id="7251437084390964440">ネットワーク設定が ONC 標準に準拠していません。設定の一部がインポートされない可能性があります。
 詳細:
@@ -1411,6 +1407,7 @@
 <translation id="8891727572606052622">プロキシ モードが無効です。</translation>
 <translation id="8903921497873541725">拡大する</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google アカウントを使用</translation>
 <translation id="8931333241327730545">このカードを Google アカウントに保存しますか?</translation>
 <translation id="8932102934695377596">時計が遅れています</translation>
 <translation id="893332455753468063">名前の追加</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index f1fa0dd..2d31072 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -412,7 +412,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> ನಲ್ಲಿ <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">ಪಾವತಿಯನ್ನು ರದ್ದುಮಾಡಿ</translation>
 <translation id="3207960819495026254">ಬುಕ್‌ಮಾರ್ಕ್‌ ಮಾಡಲಾಗಿದೆ</translation>
-<translation id="321912867715453276">ಎಚ್ಚರಿಕೆ: ಕಾರ್ಯನೀತಿಗಾಗಿ ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಮೂಲಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿವೆ, ಆದರೆ ಮೌಲ್ಯಗಳು ಒಂದೇ ಆಗಿವೆ.</translation>
 <translation id="3225919329040284222">ಆಂತರಿಕ ಮಾನದಂಡಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗದ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಸರ್ವರ್ ಹಾಜರಿಪಡಿಸಿದೆ. ನಿಮ್ಮ ಸುರಕ್ಷತೆಯ ಸಲುವಾಗಿ ಕೆಲವು ಹೆಚ್ಚು ಸುರಕ್ಷಿತ ವೆಬ್ ಸೈಟ್‌ಗಳಲ್ಲಿ ಈ ಮಾನದಂಡಗಳನ್ನು ಸೇರ್ಪಡೆಗೊಳಿಸಲಾಗಿದೆ.</translation>
 <translation id="3226128629678568754">ಪುಟವನ್ನು ಲೋಡ್ ಮಾಡುವುದಕ್ಕೆ ಅಗತ್ಯವಿರುವ ಡೇಟಾವನ್ನು ಮರುಸಲ್ಲಿಸಲು ಮರುಲೋಡ್ ಬಟನ್ ಒತ್ತಿರಿ.</translation>
 <translation id="3227137524299004712">ಮೈಕ್ರೋಫೋನ್</translation>
@@ -551,7 +550,6 @@
 <translation id="397105322502079400">ಎಣಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
 <translation id="3987940399970879459">1 MB ಗಿಂತ ಕಡಿಮೆ</translation>
-<translation id="4008849406247176967">ಎಚ್ಚರಿಕೆ: ಸಂಘರ್ಷವನ್ನು ಉಂಟುಮಾಡುವ ಮೌಲ್ಯಗಳನ್ನು ಹೊಂದಿರುವ ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಮೂಲಗಳು ಈ ಕಾರ್ಯನೀತಿಗಾಗಿ ಅಸ್ತಿತ್ವದಲ್ಲಿವೆ!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{ಹತ್ತಿರದ 1 ವೆಬ್ ಪುಟ}one{ಹತ್ತಿರದ # ವೆಬ್ ಪುಟಗಳು}other{ಹತ್ತಿರದ # ವೆಬ್ ಪುಟಗಳು}}</translation>
 <translation id="4030383055268325496">&amp;ಸೇರಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸಿ</translation>
 <translation id="4032320456957708163">ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು <ph name="ENROLLMENT_DOMAIN" /> ನಿರ್ವಹಿಸುತ್ತಿದೆ</translation>
@@ -688,7 +686,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> ಹುಡುಕಾಟ ಸಲಹೆ</translation>
 <translation id="4742407542027196863">ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ…</translation>
 <translation id="4744603770635761495">ಪ್ರದರ್ಶನಗೊಳ್ಳುವಂತಹ ಹಾದಿ</translation>
-<translation id="4746351372139058112">ಸಂದೇಶಗಳು</translation>
 <translation id="4750917950439032686">ಈ ಸೈಟ್‌ಗೆ ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಕಳುಹಿಸಿದಾಗ ಅದು (ಉದಾಹರಣೆಗೆ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಅಥವಾ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಗಳು) ಖಾಸಗಿಯಾಗಿರುತ್ತದೆ.</translation>
 <translation id="4756388243121344051">&amp;ಇತಿಹಾಸ</translation>
 <translation id="4758311279753947758">ಸಂಪರ್ಕ ಮಾಹಿತಿಯನ್ನು ಸೇರಿಸಿ</translation>
@@ -1117,7 +1114,6 @@
 <translation id="7220786058474068424">ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">ಮುಂದಿರುವ ಸೈಟ್‌ನಲ್ಲಿ ಮಾಲ್‌ವೇರ್ ಇದೆ</translation>
-<translation id="724766306220616965">ಎಚ್ಚರಿಕೆಗಳು, ಸಂಘರ್ಷ</translation>
 <translation id="724975217298816891">ನಿಮ್ಮ ಕಾರ್ಡ್‌ ವಿವರಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲು <ph name="CREDIT_CARD" /> ಗೆ ಮುಕ್ತಾಯ ದಿನಾಂಕ ಮತ್ತು CVC ಅನ್ನು ನಮೂದಿಸಿ. ನೀವು ಒಮ್ಮೆ ಖಚಿತಪಡಿಸಿದರೆ, ನಿಮ್ಮ ಕಾರ್ಡ್ ವಿವರಗಳನ್ನು ಈ ಸೈಟ್ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.</translation>
 <translation id="7251437084390964440">ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರೇಶನ್, ONC ಮಾನದಂಡಕ್ಕೆ ಅನುಗುಣವಾಗಿಲ್ಲ. ಕಾನ್ಫಿಗರೇಶನ್‌ನಲ್ಲಿನ ಕೆಲವು ಭಾಗಗಳನ್ನು ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಾಗದಿರಬಹುದು.
 ಹೆಚ್ಚುವರಿ ವಿವರಗಳು:
@@ -1415,6 +1411,7 @@
 <translation id="8891727572606052622">ಅಮಾನ್ಯವಾದ ಪ್ರಾಕ್ಸಿ ಮೋಡ್.</translation>
 <translation id="8903921497873541725">ಝೂಮ್ ಇನ್</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google ಖಾತೆ</translation>
 <translation id="8931333241327730545">ಈ ಕಾರ್ಡನ್ನು ನಿಮ್ಮ Google ಖಾತೆನಲ್ಲಿ ಉಳಿಸಲು ಬಯಸುವಿರಾ?</translation>
 <translation id="8932102934695377596">ನಿಮ್ಮ ಗಡಿಯಾರ ಹಿಂದೆ ಇದೆ</translation>
 <translation id="893332455753468063">ಹೆಸರು ಸೇರಿಸಿ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 5b9317f17..7864c39 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" />의 <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">결제 취소</translation>
 <translation id="3207960819495026254">북마크에 추가됨</translation>
-<translation id="321912867715453276">경고: 정책에 대한 소스가 두 개 이상 있으나 값이 동일합니다.</translation>
 <translation id="3225919329040284222">서버가 내장된 기대치와 일치하지 않는 인증서를 전달했습니다. 이러한 기대치는 사용자를 보호하기 위해 보안이 엄격한 특정 웹사이트에 포함됩니다.</translation>
 <translation id="3226128629678568754">페이지 로드에 필요한 데이터를 다시 제출하려면 새로고침 버튼을 누릅니다.</translation>
 <translation id="3227137524299004712">마이크</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">계산 중...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" />이(가) 차단됨</translation>
 <translation id="3987940399970879459">1MB 미만</translation>
-<translation id="4008849406247176967">경고: 이 정책에 충돌하는 값을 가진 소스가 두 개 이상 있습니다.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{주변 웹페이지 1개}other{주변 웹페이지 #개}}</translation>
 <translation id="4030383055268325496">추가 실행 취소(&amp;U)</translation>
 <translation id="4032320456957708163"><ph name="ENROLLMENT_DOMAIN" />에서 관리하는 브라우저입니다</translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> 추천 검색어</translation>
 <translation id="4742407542027196863">비밀번호 관리...</translation>
 <translation id="4744603770635761495">실행 가능 경로</translation>
-<translation id="4746351372139058112">메시지</translation>
 <translation id="4750917950439032686">비밀번호나 신용카드 번호 등의 정보는 비공개 상태로 이 사이트에 전송됩니다.</translation>
 <translation id="4756388243121344051">방문 기록(&amp;H)</translation>
 <translation id="4758311279753947758">연락처 정보 추가</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">처리 중</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">다음 사이트에 멀웨어가 있습니다.</translation>
-<translation id="724766306220616965">경고, 충돌</translation>
 <translation id="724975217298816891">카드 세부정보를 업데이트하려면 <ph name="CREDIT_CARD" /> 카드의 만료일과 CVC를 입력하세요. 카드를 확인하면 카드 세부정보가 이 사이트와 공유됩니다.</translation>
 <translation id="7251437084390964440">네트워크 설정이 ONC 표준을 준수하지 않습니다. 일부 설정을 가져오지 못했을 수도 있습니다.
 추가 세부정보:
@@ -1420,6 +1416,7 @@
 <translation id="8891727572606052622">프록시 모드가 잘못되었습니다.</translation>
 <translation id="8903921497873541725">확대</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google 계정</translation>
 <translation id="8931333241327730545">이 카드를 Google 계정에 저장하시겠습니까?</translation>
 <translation id="8932102934695377596">시간이 너무 먼 과거로 설정되어 있습니다.</translation>
 <translation id="893332455753468063">이름 추가</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index 238b41a43..ac122289 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -417,7 +417,6 @@
 <translation id="3195213714973468956">„<ph name="PRINTER_NAME" />“ serveryje „<ph name="SERVER_NAME" />“</translation>
 <translation id="320323717674993345">Atšaukti mokėjimą</translation>
 <translation id="3207960819495026254">Pažymėta</translation>
-<translation id="321912867715453276">Įspėjimas: pateiktas daugiau nei vienas politikos šaltinis, bet vertės vienodos.</translation>
 <translation id="3225919329040284222">Serveris pateikė sertifikatą, kuris neatitinka numatytų reikalavimų. Šie reikalavimai taikomi tam tikrose itin saugiose svetainėse, kad jūs būtumėte saugūs.</translation>
 <translation id="3226128629678568754">Spustelėkite įkėlimo iš naujo mygtuką, kad iš naujo pateiktumėte duomenis, reikalingus puslapiui įkelti.</translation>
 <translation id="3227137524299004712">Mikrofonas</translation>
@@ -557,7 +556,6 @@
 <translation id="397105322502079400">Skaičiuojama...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> užblokuota.</translation>
 <translation id="3987940399970879459">Mažiau nei 1 MB</translation>
-<translation id="4008849406247176967">Įspėjimas: pateiktas daugiau nei vienas šios politikos šaltinis su nesuderinamomis vertėmis!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 tinklalapis netoliese}one{# tinklalapis netoliese}few{# tinklalapiai netoliese}many{# tinklalapio netoliese}other{# tinklalapių netoliese}}</translation>
 <translation id="4030383055268325496">&amp;Anuliuoti pridėjimą</translation>
 <translation id="4032320456957708163">Jūsų naršyklę tvarko <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -694,7 +692,6 @@
 <translation id="4738601419177586157">„<ph name="TEXT" />“ paieškos pasiūlymas</translation>
 <translation id="4742407542027196863">Tvarkyti slaptažodžius…</translation>
 <translation id="4744603770635761495">Vykdomasis kelias</translation>
-<translation id="4746351372139058112">Pranešimai</translation>
 <translation id="4750917950439032686">Į šią svetainę siunčiama informacija (pvz., slaptažodžiai arba kredito kortelių numeriai) yra privati.</translation>
 <translation id="4756388243121344051">&amp;Istorija</translation>
 <translation id="4758311279753947758">Pridėti kontaktinę informaciją</translation>
@@ -1124,7 +1121,6 @@
 <translation id="7220786058474068424">Apdorojama</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Svetainėje, kurioje ketinate apsilankyti, yra kenkėjiškų programų</translation>
-<translation id="724766306220616965">Įspėjimai, prieštaravimas</translation>
 <translation id="724975217298816891">Jei norite atnaujinti išsamią kortelės informaciją, įveskite „<ph name="CREDIT_CARD" />“ galiojimo pabaigos datą ir kortelės saugos kodą (CVC). Kai patvirtinsite, išsami kortelės informacija bus bendrinama su šia svetaine.</translation>
 <translation id="7251437084390964440">Tinklo konfigūracija neatitinka ONC standarto. Kai kurių konfigūracijos dalių negalima importuoti.
 Papildoma išsami informacija:
@@ -1423,6 +1419,7 @@
 <translation id="8891727572606052622">Netinkamas įgaliotojo serverio režimas.</translation>
 <translation id="8903921497873541725">Artinti</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">„Google“ paskyra</translation>
 <translation id="8931333241327730545">Ar norite išsaugoti šios kortelės informaciją „Google“ paskyroje?</translation>
 <translation id="8932102934695377596">Jūsų laikrodis atsilieka</translation>
 <translation id="893332455753468063">Vardo ir pavardės pridėjimas</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 93cb70e8..13d6ff1 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -409,7 +409,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> serverī <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Atcelt maksājumu</translation>
 <translation id="3207960819495026254">Atzīmēts kā grāmatzīme</translation>
-<translation id="321912867715453276">Brīdinājums! Šai politikai ir vairāk nekā viens avots, bet vērtības ir vienādas.</translation>
 <translation id="3225919329040284222">Serveris uzrādīja sertifikātu, kas neatbilst iebūvētajām cerībām. Šīs cerības ir ietvertas konkrētām, augstas drošības vietnēm, lai aizsargātu jūs.</translation>
 <translation id="3226128629678568754">Nospiediet atkārtotas ielādes pogu, lai atkārtoti iesniegtu datus, kas nepieciešami lapas ielādei.</translation>
 <translation id="3227137524299004712">Mikrofons</translation>
@@ -548,7 +547,6 @@
 <translation id="397105322502079400">Aprēķina...</translation>
 <translation id="3973234410852337861">Vietne <ph name="HOST_NAME" /> ir bloķēta</translation>
 <translation id="3987940399970879459">Mazāk nekā 1 MB</translation>
-<translation id="4008849406247176967">Brīdinājums! Šai politikai pastāv vairāk nekā viens avots ar pretrunīgām vērtībām!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{Tuvumā ir 1 tīmekļa lapa}zero{Tuvumā ir # tīmekļa lapas}one{Tuvumā ir # tīmekļa lapa}other{Tuvumā ir # tīmekļa lapas}}</translation>
 <translation id="4030383055268325496">&amp;Atsaukt pievienošanu</translation>
 <translation id="4032320456957708163">Jūsu pārlūku pārvalda <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -685,7 +683,6 @@
 <translation id="4738601419177586157">Meklēšanas ieteikums vaicājumam “<ph name="TEXT" />”</translation>
 <translation id="4742407542027196863">Pārvaldīt paroles…</translation>
 <translation id="4744603770635761495">Izpildāms ceļš</translation>
-<translation id="4746351372139058112">Messages</translation>
 <translation id="4750917950439032686">Jūsu informācija (piemēram, paroles vai kredītkaršu numuri) ir privāta, kad tā tiek nosūtīta uz šo vietni.</translation>
 <translation id="4756388243121344051">Vēsture</translation>
 <translation id="4758311279753947758">Pievienot kontaktinformāciju</translation>
@@ -1112,7 +1109,6 @@
 <translation id="7220786058474068424">Notiek apstrāde</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Vietnē ir ļaunprātīga programmatūra</translation>
-<translation id="724766306220616965">Brīdinājumi, sarežģījumi</translation>
 <translation id="724975217298816891">Lai atjauninātu kartes informāciju, ievadiet kredītkartes <ph name="CREDIT_CARD" /> derīguma termiņu un CVC. Pēc apstiprināšanas kartes informācija tiks kopīgota ar šo vietni.</translation>
 <translation id="7251437084390964440">Tīkla konfigurācija neatbilst standartam ONC. Iespējams, konfigurācijas daļas netiks importētas.
 Papildu informācija:
@@ -1411,6 +1407,7 @@
 <translation id="8891727572606052622">Nederīgs starpniekservera režīms.</translation>
 <translation id="8903921497873541725">Tuvināt</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google konts</translation>
 <translation id="8931333241327730545">Vai vēlaties saglabāt šo karti savā Google kontā?</translation>
 <translation id="8932102934695377596">Norādītais laiks ir pārāk tālu pagātnē</translation>
 <translation id="893332455753468063">Vārda pievienošana</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index cfd8232e..c291341 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
-<translation id="1001338328714563407">നിങ്ങളുടെ ഉപകരണത്തിന്റെയും അക്കൗണ്ടിന്റെയും മാനേജരെന്ന നിലയിൽ, <ph name="ENROLLMENT_DOMAIN" />:</translation>
+<translation id="1001338328714563407">നിങ്ങളുടെ ഉപകരണത്തിൻ്റെയും അക്കൗണ്ടിൻ്റെയും മാനേജരെന്ന നിലയിൽ, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="1008557486741366299">ഇപ്പോഴല്ല</translation>
 <translation id="1010200102790553230">പേജ് പിന്നീട് ലോഡ് ചെയ്യുക</translation>
 <translation id="1015730422737071372">കൂടുതൽ വിശദാംശങ്ങൾ നൽകുക</translation>
@@ -218,6 +218,7 @@
 <translation id="2111256659903765347">സൂപ്പർ-A</translation>
 <translation id="2113977810652731515">കാർഡ്</translation>
 <translation id="2114841414352855701"> <ph name="POLICY_NAME" /> എന്നതിനാൽ മറികടന്നതിനാൽ ഇത് അവഗണിച്ചു.</translation>
+<translation id="2129079103035905234">ചലന സെൻസറുകൾ</translation>
 <translation id="213826338245044447">മൊബൈൽ ബുക്ക്‌മാർക്കുകൾ</translation>
 <translation id="214556005048008348">പേയ്‌മെന്‍റ് റദ്ദാക്കുക</translation>
 <translation id="2147827593068025794">പശ്ചാത്തലം സമന്വയിപ്പിക്കൽ</translation>
@@ -301,7 +302,7 @@
 <translation id="2586657967955657006">ക്ലിപ്പ്ബോർഡ്</translation>
 <translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> എന്നയാളുടെ ലേഖനം. ഇതും മറ്റ് <ph name="OTHER_ARTICLE_COUNT" /> ലേഖനങ്ങളും വായിക്കുക.</translation>
 <translation id="2587841377698384444">ഡയറക്‌റ്ററി API ഐഡി:</translation>
-<translation id="2595719060046994702">ഏതെങ്കിലും കമ്പനിയോ മറ്റ് സ്ഥാപനങ്ങളോ മാനേജ് ചെയ്യുന്നതല്ല ഈ ഉപകരണവും അക്കൗണ്ടും.</translation>
+<translation id="2595719060046994702">ഏതെങ്കിലും കമ്പനിയോ മറ്റ് സ്ഥാപനമോ മാനേജ് ചെയ്യുന്നതല്ല ഈ ഉപകരണവും അക്കൗണ്ടും.</translation>
 <translation id="2597378329261239068">ഈ പ്രമാണം പാസ്‌വേഡ് പരിരക്ഷിതമാണ്. പാസ്‌വേഡ് നല്‍‌കുക.</translation>
 <translation id="2609632851001447353">വേരിയേഷനുകൾ</translation>
 <translation id="2618023639789766142">C10 (എൻവലപ്പ്)</translation>
@@ -336,7 +337,7 @@
 <translation id="2781692009645368755">Google Pay</translation>
 <translation id="2784949926578158345">കണക്ഷന്‍ പുനഃസജ്ജമാക്കിയതാണ്.</translation>
 <translation id="2788784517760473862">ക്രെഡിറ്റ് കാർഡുകൾ സ്വീകരിക്കുന്നു</translation>
-<translation id="2792012897584536778">ഈ ഉപകരണത്തിന്റെ അഡ്‌മിന്മാർ സുരക്ഷാ സർട്ടിഫിക്കറ്റുകൾ സജ്ജീകരിച്ചിട്ടുണ്ട്, നിങ്ങൾ സന്ദർശിക്കുന്ന വെബ്‌സൈറ്റുകളുടെ ഉള്ളടക്കം കാണാൻ അവ അവരെ അനുവദിച്ചേക്കാം.</translation>
+<translation id="2792012897584536778">ഈ ഉപകരണത്തിന്റെ അഡ്‌മിൻമാർ സുരക്ഷാ സർട്ടിഫിക്കറ്റുകൾ സജ്ജീകരിച്ചിട്ടുണ്ട്, നിങ്ങൾ സന്ദർശിക്കുന്ന വെബ്‌സൈറ്റുകളുടെ ഉള്ളടക്കം കാണാൻ അവ അവരെ അനുവദിച്ചേക്കാം.</translation>
 <translation id="2794233252405721443">സൈറ്റ് ബ്ലോക്ക് ചെയ്‌തു</translation>
 <translation id="2799020568854403057">നിങ്ങൾ പോകുന്ന സൈറ്റിൽ ദോഷകരമായ ആപ്പുകളുണ്ട്</translation>
 <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation>
@@ -376,7 +377,7 @@
 <translation id="3005723025932146533">സംരക്ഷിച്ച പകർപ്പ് കാണിക്കുക</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" />-ന്‍റെ CVC നൽകുക. സ്ഥിരീകരിച്ച് കഴിഞ്ഞാൽ, നിങ്ങളുടെ കാർഡ് വിശദാംശങ്ങൾ ഈ സൈറ്റുമായി പങ്കിടും.</translation>
 <translation id="3010559122411665027">ലിസ്റ്റ് എൻട്രി "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
-<translation id="3014389611820813634">ഈ ഉപകരണത്തിന്റെ മാനേജരെന്ന നിലയിൽ, <ph name="ENROLLMENT_DOMAIN" />:</translation>
+<translation id="3014389611820813634">ഈ ഉപകരണത്തിൻ്റെ മാനേജരെന്ന നിലയിൽ, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="301521992641321250">സ്വയമേവ ബ്ലോക്കുചെയ്‌തു</translation>
 <translation id="3023071826883856138">You4 (എൻവലപ്പ്)</translation>
 <translation id="3024663005179499861">തെറ്റായ നയ തരം</translation>
@@ -406,7 +407,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> എന്നതിലെ <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">പേയ്‌മെന്റ് റദ്ദാക്കുക</translation>
 <translation id="3207960819495026254">ബുക്ക്‌മാർക്കുചെയ്‌തു</translation>
-<translation id="321912867715453276">മുന്നറിയിപ്പ്: ഈ നയത്തിന് ഒന്നിലധികം ഉറവിടങ്ങളുണ്ടെങ്കിലും മൂല്യങ്ങൾ സമാനമാണ്.</translation>
 <translation id="3225919329040284222">ബിൽട്ട്-ഇൻ പ്രതീക്ഷകള്‍ക്ക് പൊരുത്തപ്പെടാത്ത സര്‍ട്ടിഫിക്കറ്റാണ് സെര്‍വര്‍ അവതരിപ്പിച്ചത്. നിങ്ങളെ സംരക്ഷിക്കുന്നതിലേക്കായുള്ള നിശ്ചിത, ഉന്നത-സുരക്ഷാ വെബ്‌സൈറ്റുകൾക്കായാണ് ഈ പ്രതീക്ഷകൾ ഉൾപ്പെടുത്തിയിരിക്കുന്നത്.</translation>
 <translation id="3226128629678568754">പേജ് ലോഡ് ചെയ്യുന്നതിനാവശ്യമായ ഡാറ്റ വീണ്ടും സമർപ്പിക്കാൻ വീണ്ടും ലോഡ് ചെയ്യുക ബട്ടൺ അമർത്തുക.</translation>
 <translation id="3227137524299004712">മൈക്രോഫോൺ</translation>
@@ -546,7 +546,6 @@
 <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ബ്ലോക്കുചെയ്‌തിരിക്കുന്നു</translation>
 <translation id="3987940399970879459">ഒരു MB-യിൽ കുറവാണ്</translation>
-<translation id="4008849406247176967">മുന്നറിയിപ്പ്: ഈ നയത്തിന് വിരുദ്ധ മൂല്യങ്ങളുള്ള ഒന്നിലധികം ഉറവിടങ്ങളുണ്ട്!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{സമീപത്ത് ഒരു വെബ്‌ പേജുണ്ട്}other{സമീപത്ത് # വെബ്‌ പേജുകളുണ്ട്}}</translation>
 <translation id="4030383055268325496">&amp;ചേർത്തത് പഴയപടിയാക്കുക</translation>
 <translation id="4032320456957708163">നിങ്ങളുടെ ബ്രൗസർ മാനേജ് ചെയ്യുന്നത് <ph name="ENROLLMENT_DOMAIN" /> ആണ്</translation>
@@ -557,7 +556,7 @@
 <translation id="4072486802667267160">നിങ്ങളുടെ ഓർഡർ പ്രോസസ് ചെയ്യുന്നതിൽ ഒരു പിശകുണ്ടായി. വീണ്ടും ശ്രമിച്ചുനോക്കൂ.</translation>
 <translation id="4075732493274867456">ഒരു സാധാരണ SSL പ്രോട്ടോക്കോൾ പതിപ്പിനെയോ സൈഫർ സ്യൂട്ടിനെയോ ക്ലയന്റും സെർവറും പിന്തുണയ്‌ക്കില്ല.</translation>
 <translation id="4079302484614802869">പ്രോക്‌സി കോൺഫിഗറേഷൻ .pac സ്‌ക്രിപ്റ്റ് URL ഉപയോഗിക്കുന്നതിനായി സജ്ജീകരിച്ചിരിക്കുന്നു, സ്ഥിരമായ പ്രോക്‌സി സെർവറുകൾ ഉപയോഗിക്കുന്നതിനായല്ല.</translation>
-<translation id="4082393374666368382">ക്രമീകരണം - മാനേജ്‌മെന്റ്</translation>
+<translation id="4082393374666368382">ക്രമീകരണം - മാനേജ്‌മെൻ്റ്</translation>
 <translation id="4092411512356034591"><ph name="DOMAIN" /> എന്നതിലേക്ക് പോകണോ?</translation>
 <translation id="4098354747657067197">വഞ്ചനാപരമായ സൈറ്റ് ഉണ്ട്</translation>
 <translation id="4103249731201008433">ഉപകരണ സീരിയൽ നമ്പർ അസാധുവാണ്</translation>
@@ -683,7 +682,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> തിരയൽ നിർദ്ദേശം</translation>
 <translation id="4742407542027196863">പാസ്‌വേഡുകൾ മാനേജ് ചെയ്യുക…</translation>
 <translation id="4744603770635761495">നിര്‍വ്വഹിക്കാവുന്ന പാത</translation>
-<translation id="4746351372139058112">സന്ദേശങ്ങൾ</translation>
 <translation id="4750917950439032686">നിങ്ങളുടെ വിവരങ്ങൾ (ഉദാഹരണത്തിന്, പാസ്‌വേഡുകളോ ക്രെഡിറ്റ് കാർഡ് നമ്പറുകളോ) ഈ സൈറ്റിലേക്ക് അയച്ച് കഴിഞ്ഞാൽ പിന്നെയത് സ്വകാര്യമായിരിക്കും.</translation>
 <translation id="4756388243121344051">&amp;ചരിത്രം</translation>
 <translation id="4758311279753947758">കോൺടാക്റ്റ് വിവരങ്ങൾ ചേർക്കുക</translation>
@@ -729,7 +727,7 @@
 <translation id="5017554619425969104">നിങ്ങൾ പകർത്തിയ ടെക്‌സ്‌റ്റ്</translation>
 <translation id="5018422839182700155">ഈ പേജ് തുറക്കാനായില്ല</translation>
 <translation id="5019198164206649151">ബാക്കിംഗ് സംഭരണം മോശം അവസ്ഥയിലാണ്</translation>
-<translation id="5020154601324912079">നിങ്ങളുടെ ഉപകരണ ഡാറ്റ എങ്ങനെ കൈകാര്യം ചെയ്യുന്നു എന്നതിനെ നിയന്തിക്കുന്നു. നിങ്ങളുടെ ഉപകരണ മാനേജർ നൽകിയ നിർദ്ദേശങ്ങളുടെ മാത്രം അടിസ്ഥാനത്തിലും ഉപകരണ മാനേജർ വ്യക്തമാക്കിയ ഉദ്ദേശ്യത്തിന് വേണ്ടി മാത്രവും Google നിങ്ങളുടെ ഉപകരണ ഡാറ്റ പ്രോസസ് ചെയ്യുന്നു.</translation>
+<translation id="5020154601324912079">നിങ്ങളുടെ ഉപകരണ ഡാറ്റ എങ്ങനെ കൈകാര്യം ചെയ്യുന്നു എന്നതിനെ നിയന്ത്രിക്കുന്നു. നിങ്ങളുടെ ഉപകരണ മാനേജർ നൽകിയ നിർദ്ദേശങ്ങളുടെ മാത്രം അടിസ്ഥാനത്തിലും ഉപകരണ മാനേജർ വ്യക്തമാക്കിയ ഉദ്ദേശ്യത്തിന് വേണ്ടി മാത്രവും Google നിങ്ങളുടെ ഉപകരണ ഡാറ്റ പ്രോസസ് ചെയ്യുന്നു.</translation>
 <translation id="5023310440958281426">നിങ്ങളുടെ അഡ്‌മിനിസ്ട്രേറ്ററുടെ നയങ്ങൾ പരിശോധിക്കുക.</translation>
 <translation id="5029568752722684782">പകർപ്പ് മായ്‌ക്കുക</translation>
 <translation id="503069730517007720">"<ph name="SOFTWARE_NAME" />" സോഫ്റ്റ്‌വെയറിന് ഒരു റൂട്ട് സർട്ടിഫിക്കറ്റ് ആവശ്യമാണ്, എന്നാൽ അത് ഇൻസ്‌റ്റാൾ ചെയ്‌‌തിട്ടില്ല. ഈ പ്രശ്‌നം പരിഹരിക്കാൻ, "<ph name="SOFTWARE_NAME" />" സോഫ്റ്റ്‌വെയറിനുള്ള കോൺഫിഗറേഷൻ നിർദ്ദേശങ്ങൾ ഐടി അഡ്‌മിനിസ്‌ട്രേറ്റർ പരിശോധിക്കേണ്ടതുണ്ട്. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -1110,7 +1108,6 @@
 <translation id="7220786058474068424">പ്രോസസ്സുചെയ്യുന്നു</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">സൈറ്റിൽ മാൽവെയർ അടങ്ങിയിരിക്കുന്നു</translation>
-<translation id="724766306220616965">മുന്നറിയിപ്പുകൾ, പൊരുത്തക്കേട്</translation>
 <translation id="724975217298816891">നിങ്ങളുടെ കാർഡ് വിശദാംശങ്ങൾ അപ്‌ഡേറ്റ് ചെയ്യാൻ <ph name="CREDIT_CARD" />-ന്റെ കാലാവധി തീരുന്ന തീയതിയും CVC-യും നൽകുക. സ്ഥിരീകരിച്ച് കഴിഞ്ഞാൽ, ഈ സൈറ്റുമായി കാർഡ് വിശദാംശങ്ങൾ പങ്കിടും.</translation>
 <translation id="7251437084390964440">നെറ്റ്‌വർക്ക് കോൺഫിഗറേഷൻ, ONC നിലവാരത്തിന് അനുസരിച്ചുള്ളതല്ല. കോൺഫിഗറേഷൻ ഭാഗങ്ങൾ ഇമ്പോർട്ട് ചെയ്‌തേക്കില്ല.
 കൂടുതൽ വിശദാംശങ്ങൾ:
@@ -1236,7 +1233,7 @@
 <translation id="780301667611848630">വേണ്ട നന്ദി</translation>
 <translation id="7805768142964895445">നില</translation>
 <translation id="7806344367022510803">Chrome-ൽ തിരയല്‍ യന്ത്ര ക്രമീകരണം മാറ്റുക</translation>
-<translation id="7810209002420871817">നിങ്ങളുടെ അക്കൗണ്ടിന്റെ മാനേജരെന്ന നിലയിൽ, <ph name="ACCOUNT_DOMAIN" />:</translation>
+<translation id="7810209002420871817">നിങ്ങളുടെ അക്കൗണ്ടിൻ്റെ മാനേജരെന്ന നിലയിൽ, <ph name="ACCOUNT_DOMAIN" />:</translation>
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">Chrome-ൽ നിന്നുള്ള നിർദ്ദേശം നീക്കംചെയ്യണോ?</translation>
 <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' എന്നതിന്റെ <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> കണ്ടു</translation>
@@ -1406,6 +1403,7 @@
 <translation id="8891727572606052622">അസാധുവായ പ്രോക്സി മോഡ്</translation>
 <translation id="8903921497873541725">സൂം ഇന്‍</translation>
 <translation id="890485472659500557">എഞ്ചിനീയറിംഗ്-C</translation>
+<translation id="8912362522468806198">Google അക്കൗണ്ട്</translation>
 <translation id="8931333241327730545">ഈ കാർഡ് നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കണോ?</translation>
 <translation id="8932102934695377596">നിങ്ങളുടെ ക്ലോക്ക് വളരെ പിന്നിലാണ്</translation>
 <translation id="893332455753468063">പേര് ചേർക്കുക</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index b4e846c..db48dfb8 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> वर <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">पेमेंट रद्द करा</translation>
 <translation id="3207960819495026254">बुकमार्क केलेली</translation>
-<translation id="321912867715453276">चेतावणी: धोरणासाठी एकापेक्षा जास्त स्रोत आहेत, परंतु मूल्ये सारखी आहेत.</translation>
 <translation id="3225919329040284222">सर्व्हरने असे सर्टिफिकेट सादर केले आहे जे अंगभूत अपेक्षांशी जुळत नाही. या अपेक्षा तुम्हाला संरक्षित करण्यासाठी विशिष्ट, उच्च सुरक्षिततेच्या वेबसाइटसाठी समाविष्ट केल्या आहेत.</translation>
 <translation id="3226128629678568754">पृष्ठ लोड करण्यास आवश्यक असलेला डेटा पुन्हा सबमिट करण्यासाठी रीलोड बटण दाबा.</translation>
 <translation id="3227137524299004712">मायक्रोफोन</translation>
@@ -555,7 +554,6 @@
 <translation id="397105322502079400">गणना करत आहे...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> अवरोधित केले आहे</translation>
 <translation id="3987940399970879459">1 MB पेक्षा कमी</translation>
-<translation id="4008849406247176967">चेतावणी: या धोरणासाठी परस्परविरोधी मूल्ये असलेले एकापेक्षा जास्त स्रोत आहेत!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{जवळपास १ वेब पेज}other{जवळपास # वेब पेज}}</translation>
 <translation id="4030383055268325496">&amp;जोडा पूर्ववत करा</translation>
 <translation id="4032320456957708163">तुमचा ब्राउझर <ph name="ENROLLMENT_DOMAIN" /> द्वारे व्यवस्थापित केला आहे</translation>
@@ -692,7 +690,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> शोध सूचना</translation>
 <translation id="4742407542027196863">पासवर्ड व्यवस्थापित करा…</translation>
 <translation id="4744603770635761495">कार्यवाहीयोग्य पथ</translation>
-<translation id="4746351372139058112">संदेश</translation>
 <translation id="4750917950439032686">तुमची माहिती (उदाहरणार्थ, पासवर्ड किंवा क्रेडिट कार्ड क्रमांक) या साइटवर पाठविली जाते तेव्हा ती खाजगी राहते.</translation>
 <translation id="4756388243121344051">&amp;इतिहास</translation>
 <translation id="4758311279753947758">संपर्क माहिती जोडा</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">प्रक्रिया करत आहे</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">साइटमध्ये पुढे मालवेअर आहे</translation>
-<translation id="724766306220616965">चेतावण्या, विरोध</translation>
 <translation id="724975217298816891">तुमचे कार्ड तपशील अपडेट करण्‍यासाठी <ph name="CREDIT_CARD" /> करिता एक्स्पायरी तारीख आणि CVC एंटर करा. तुम्ही पुष्टी केल्यावर, तुमचे कार्ड तपशील या साइटवर शेअर केले जातील.</translation>
 <translation id="7251437084390964440">नेटवर्क कॉन्फिगरेशन ONC स्टँडर्डचे पालन करत नाही. कॉन्फिगरेशनचे भाग कदाचित इंपोर्ट करता येणार नाहीत.
 अतिरिक्त तपशील:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">चुकीचे प्रॉक्सी मोड.</translation>
 <translation id="8903921497873541725">झूम इन करा</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google खाते</translation>
 <translation id="8931333241327730545">तुम्ही तुमच्या Google खात्यात हे कार्ड सेव्ह करू इच्छिता?</translation>
 <translation id="8932102934695377596">तुमचे घड्याळ मागे आहे</translation>
 <translation id="893332455753468063">नाव जोडा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index fa8fe579..9cf202ec 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -409,7 +409,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> pada <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Batal Pembayaran</translation>
 <translation id="3207960819495026254">Ditandai halaman</translation>
-<translation id="321912867715453276">Amaran: Lebih daripada satu sumber terdapat dalam dasar ini, tetapi nilainya sama.</translation>
 <translation id="3225919329040284222">Pelayan memberikan sijil yang tidak sepadan dengan jangkaan terbina dalam. Jangkaan ini disertakan untuk tapak web dengan keselamatan tinggi tertentu untuk melindungi anda.</translation>
 <translation id="3226128629678568754">Tekan butang muat semula untuk menyerahkan kembali data yang diperlukan untuk memuatkan halaman.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -550,7 +549,6 @@
 <translation id="397105322502079400">Mengira...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> disekat</translation>
 <translation id="3987940399970879459">Kurang daripada 1 MB</translation>
-<translation id="4008849406247176967">Amaran: Lebih daripada satu sumber yang mempunyai nilai yang bercanggah terdapat dalam dasar ini!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 halaman web berdekatan}other{# halaman web berdekatan}}</translation>
 <translation id="4030383055268325496">&amp;Buat asal tambahkan</translation>
 <translation id="4032320456957708163">Penyemak imbas anda diurus oleh <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -687,7 +685,6 @@
 <translation id="4738601419177586157">Cadangan carian <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Urus kata laluan…</translation>
 <translation id="4744603770635761495">Laluan Boleh Laku</translation>
-<translation id="4746351372139058112">Mesej</translation>
 <translation id="4750917950439032686">Maklumat anda (contohnya, kata laluan atau nombor kad kredit) adalah berciri peribadi apabila dihantar ke tapak ini.</translation>
 <translation id="4756388243121344051">&amp;Sejarah</translation>
 <translation id="4758311279753947758">Tambahkan maklumat hubungan</translation>
@@ -1114,7 +1111,6 @@
 <translation id="7220786058474068424">Memproses</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Tapak di hadapan mengandungi perisian hasad</translation>
-<translation id="724766306220616965">Amaran, Konflik</translation>
 <translation id="724975217298816891">Masukkan tarikh tamat tempoh dan CVC untuk <ph name="CREDIT_CARD" /> bagi mengemas kini butiran kad anda. Setelah anda mengesahkan, butiran kad anda akan dikongsi dengan tapak ini.</translation>
 <translation id="7251437084390964440">Konfigurasi rangkaian tidak mematuhi standard ONC. Sebahagian konfigurasi tidak boleh diimport.
 Butiran tambahan:
@@ -1413,6 +1409,7 @@
 <translation id="8891727572606052622">Mod proksi tidak sah.</translation>
 <translation id="8903921497873541725">Zum masuk</translation>
 <translation id="890485472659500557">Kejuruteraan-C</translation>
+<translation id="8912362522468806198">Akaun Google</translation>
 <translation id="8931333241327730545">Adakah anda mahu menyimpan kad ini ke Akaun Google anda?</translation>
 <translation id="8932102934695377596">Jam anda di belakang</translation>
 <translation id="893332455753468063">Tambahkan Nama</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 6eb8781..8eec3743 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -405,7 +405,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> op <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Betaling annuleren</translation>
 <translation id="3207960819495026254">Toegevoegd aan 'Bladwijzers'</translation>
-<translation id="321912867715453276">Waarschuwing: Er zijn meerdere bronnen aanwezig voor het beleid, maar de waarden zijn gelijk.</translation>
 <translation id="3225919329040284222">De server heeft een certificaat gepresenteerd dat niet overeenkomt met de ingebouwde verwachtingen. Deze verwachtingen zijn opgenomen voor bepaalde websites om je te beschermen.</translation>
 <translation id="3226128629678568754">Klik op de knop 'Opnieuw laden' om de gegevens opnieuw te verzenden die nodig zijn om de pagina te laden.</translation>
 <translation id="3227137524299004712">Microfoon</translation>
@@ -543,7 +542,6 @@
 <translation id="397105322502079400">Berekenen...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> wordt geblokkeerd</translation>
 <translation id="3987940399970879459">Minder dan 1 MB</translation>
-<translation id="4008849406247176967">Waarschuwing: Er zijn meerdere bronnen met conflicterende waarden aanwezig voor dit beleid.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 webpagina in de buurt}other{# webpagina's in de buurt}}</translation>
 <translation id="4030383055268325496">&amp;Toevoegen ongedaan maken</translation>
 <translation id="4032320456957708163">Je browser wordt beheerd door <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -680,7 +678,6 @@
 <translation id="4738601419177586157">Zoeksuggestie: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Wachtwoorden beheren…</translation>
 <translation id="4744603770635761495">Uitvoerbaar pad</translation>
-<translation id="4746351372139058112">Berichten</translation>
 <translation id="4750917950439032686">Je gegevens (zoals wachtwoorden of creditcardnummers) zijn privé wanneer ze worden verzonden naar deze site.</translation>
 <translation id="4756388243121344051">Gesc&amp;hiedenis</translation>
 <translation id="4758311279753947758">Contactgegevens toevoegen</translation>
@@ -1106,7 +1103,6 @@
 <translation id="7220786058474068424">Verwerken</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">De volgende website bevat malware</translation>
-<translation id="724766306220616965">Waarschuwingen, conflict</translation>
 <translation id="724975217298816891">Geef de vervaldatum en CVC-code voor <ph name="CREDIT_CARD" /> op om je creditcardgegevens te updaten. Zodra je bevestigt, worden je creditcardgegevens gedeeld met deze site.</translation>
 <translation id="7251437084390964440">De netwerkconfiguratie voldoet niet aan de ONC-standaard. Delen van de configuratie worden mogelijk niet geïmporteerd.
 Aanvullende informatie:
@@ -1404,6 +1400,7 @@
 <translation id="8891727572606052622">Ongeldige proxymodus.</translation>
 <translation id="8903921497873541725">Inzoomen</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google-account</translation>
 <translation id="8931333241327730545">Wil je deze pas opslaan in je Google-account?</translation>
 <translation id="8932102934695377596">Je klok loopt achter</translation>
 <translation id="893332455753468063">Naam toevoegen</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 87bcbb2e..702be0f 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> på <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Avbryt betalingen</translation>
 <translation id="3207960819495026254">Bokmerket</translation>
-<translation id="321912867715453276">Advarsel: Regelen har mer enn én kilde, men verdiene er like.</translation>
 <translation id="3225919329040284222">Tjeneren oppga et sertifikat som ikke samsvarte med innebygde forventninger. Disse forventningene benyttes for visse nettsteder med høy sikkerhet, og brukes for å beskytte deg.</translation>
 <translation id="3226128629678568754">Trykk på knappen for å laste inn på nytt, for å sende inn dataene som trengs for å laste inn siden på nytt.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Beregner …</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> er blokkert</translation>
 <translation id="3987940399970879459">Under 1 MB</translation>
-<translation id="4008849406247176967">Advarsel: Denne regelen har mer enn én kilde med motstridende verdier.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 Like ved-nettside}other{# Like ved-nettsider}}</translation>
 <translation id="4030383055268325496">&amp;Angre tilleggingen</translation>
 <translation id="4032320456957708163">Nettleseren din administreres av <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Søkeforslag for <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Administrer passord…</translation>
 <translation id="4744603770635761495">Kjørbar sti</translation>
-<translation id="4746351372139058112">Meldinger</translation>
 <translation id="4750917950439032686">Informasjonen din (for eksempel passord eller kredittkortnumre) er privat når den sendes til dette nettstedet.</translation>
 <translation id="4756388243121344051">&amp;Logg</translation>
 <translation id="4758311279753947758">Legg til kontaktinformasjon</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Behandler</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Nettstedet du er på vei til, inneholder skadelig programvare</translation>
-<translation id="724766306220616965">Advarsler, konflikt</translation>
 <translation id="724975217298816891">Skriv inn utløpsdatoen og verifiseringskoden for <ph name="CREDIT_CARD" /> for å oppdatere kortinformasjonen din. Når du bekrefter, deles denne informasjonen med dette nettstedet.</translation>
 <translation id="7251437084390964440">Nettverkskonfigurasjonen overholder ikke ONC-standarden. Deler av konfigurasjonen kan muligens ikke importeres. Mer informasjon:
 <ph name="DEBUG_INFO" /></translation>
@@ -1420,6 +1416,7 @@
 <translation id="8891727572606052622">Ugyldig modus for mellomtjener.</translation>
 <translation id="8903921497873541725">Zoom inn</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google-konto</translation>
 <translation id="8931333241327730545">Vil du lagre dette kortet i Google-kontoen din?</translation>
 <translation id="8932102934695377596">Klokken går for sent</translation>
 <translation id="893332455753468063">Legg til navn</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index 9ac5d844..274ca023 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> na serwerze <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Anuluj płatność</translation>
 <translation id="3207960819495026254">Dodano do zakładek</translation>
-<translation id="321912867715453276">Ostrzeżenie: dla tej zasady określono więcej niż jedno źródło, ale wartości tych źródeł są jednakowe.</translation>
 <translation id="3225919329040284222">Serwer przedstawił certyfikat, który nie pasuje do zaprogramowanych oczekiwań. Oczekiwania mają chronić Cię w określonych witrynach o wysokim poziomie zabezpieczeń.</translation>
 <translation id="3226128629678568754">Naciśnij przycisk ponownego załadowania, by przesłać dane wymagane do wczytania strony.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Obliczanie...</translation>
 <translation id="3973234410852337861">Strona <ph name="HOST_NAME" /> jest zablokowana</translation>
 <translation id="3987940399970879459">Mniej niż 1 MB</translation>
-<translation id="4008849406247176967">Ostrzeżenie: dla tej zasady określono więcej niż jedno źródło, a wartości tych źródeł są sprzeczne.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 strona w pobliżu}few{# strony w pobliżu}many{# stron w pobliżu}other{# strony w pobliżu}}</translation>
 <translation id="4030383055268325496">&amp;Cofnij dodanie</translation>
 <translation id="4032320456957708163">Twoją przeglądarką zarządza <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Propozycja wyszukiwania: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Zarządzaj hasłami…</translation>
 <translation id="4744603770635761495">Ścieżka pliku wykonywalnego</translation>
-<translation id="4746351372139058112">Wiadomość tekstowa</translation>
 <translation id="4750917950439032686">Informacje, które wysyłasz tej witrynie (na przykład hasła lub numery kart kredytowych), pozostają prywatne.</translation>
 <translation id="4756388243121344051">&amp;Historia</translation>
 <translation id="4758311279753947758">Dodaj dane kontaktowe</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Przetwarzanie</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Strona, którą chcesz otworzyć, zawiera złośliwe oprogramowanie</translation>
-<translation id="724766306220616965">Ostrzeżenia, konflikt</translation>
 <translation id="724975217298816891">Wpisz datę ważności i kod CVC karty <ph name="CREDIT_CARD" />, by zaktualizować jej szczegółowe dane. Po potwierdzeniu zostaną one udostępnione tej stronie.</translation>
 <translation id="7251437084390964440">Konfiguracja sieci jest niezgodna ze standardem ONC. Jej część mogła nie zostać zaimportowana.
 Dodatkowe informacje:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Nieprawidłowy tryb proxy</translation>
 <translation id="8903921497873541725">Powiększ</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Konta Google</translation>
 <translation id="8931333241327730545">Chcesz zapisać tę kartę na swoim koncie Google?</translation>
 <translation id="8932102934695377596">Twój zegar się spóźnia</translation>
 <translation id="893332455753468063">Dodaj imię i nazwisko lub nazwę firmy</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index 09d40bc..74a4e3d 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> em <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Cancelar pagamento</translation>
 <translation id="3207960819495026254">Adicionado aos favoritos</translation>
-<translation id="321912867715453276">Aviso: há mais de uma fonte para esta política, mas os valores são os mesmos.</translation>
 <translation id="3225919329040284222">O servidor apresentou um certificado que não coincide com as expectativas incorporadas. Estas expectativas são incluídas para determinados websites de alta segurança com a finalidade de oferecer proteção a você.</translation>
 <translation id="3226128629678568754">Pressione o botão "Atualizar" para reenviar os dados necessários para carregar a página.</translation>
 <translation id="3227137524299004712">Microfone</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Calculando...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> está bloqueado</translation>
 <translation id="3987940399970879459">Menos de 1 MB</translation>
-<translation id="4008849406247176967">Aviso: há mais de uma fonte com valores conflitantes para esta política.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 página da Web por perto}one{# página da Web por perto}other{# páginas da Web por perto}}</translation>
 <translation id="4030383055268325496">&amp;Desfazer adicionar</translation>
 <translation id="4032320456957708163">Seu navegador é gerenciado por <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Sugestão de pesquisa: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gerenciar senhas…</translation>
 <translation id="4744603770635761495">Caminho do executável</translation>
-<translation id="4746351372139058112">Mensagens</translation>
 <translation id="4750917950439032686">Suas informações (por exemplo, senhas ou números de cartão de crédito) permanecem privadas quando são enviadas para esse site.</translation>
 <translation id="4756388243121344051">&amp;Histórico</translation>
 <translation id="4758311279753947758">Adicionar dados de contato</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Processando</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />, <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">O site a seguir contém malware</translation>
-<translation id="724766306220616965">Avisos, conflito</translation>
 <translation id="724975217298816891">Digite a data de validade e o CVC do <ph name="CREDIT_CARD" /> para atualizar os detalhes do cartão. Depois da confirmação, os detalhes do cartão serão compartilhados com esse site.</translation>
 <translation id="7251437084390964440">A configuração de rede não está de acordo com o padrão ONC. É possível que partes da configuração não sejam importadas.
 Mais detalhes:
@@ -1422,6 +1418,7 @@
 <translation id="8891727572606052622">Modo de proxy inválido.</translation>
 <translation id="8903921497873541725">Aumentar zoom</translation>
 <translation id="890485472659500557">Engineering C</translation>
+<translation id="8912362522468806198">Conta do Google</translation>
 <translation id="8931333241327730545">Quer salvar este cartão na sua Conta do Google?</translation>
 <translation id="8932102934695377596">Seu relógio está atrasado</translation>
 <translation id="893332455753468063">Adicione um Nome</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 0e17652..a5a2653 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> no servidor <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Cancelar pagamento</translation>
 <translation id="3207960819495026254">Adicionado aos marcadores</translation>
-<translation id="321912867715453276">Aviso: existe mais de uma origem para a política, mas os valores são iguais.</translation>
 <translation id="3225919329040284222">O servidor apresentou um certificado que não corresponde às expectativas existentes. Estas expectativas são incluídas para determinados Web sites de alta segurança para sua proteção.</translation>
 <translation id="3226128629678568754">Prima o botão de atualização para enviar novamente os dados necessários para carregar a página.</translation>
 <translation id="3227137524299004712">Microfone</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">A calcular...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> está bloqueado</translation>
 <translation id="3987940399970879459">Menos de 1 MB</translation>
-<translation id="4008849406247176967">Aviso: existe mais de uma origem com valores em conflito para esta política!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 página Web próxima}other{# páginas Web próximas}}</translation>
 <translation id="4030383055268325496">&amp;Anular adição</translation>
 <translation id="4032320456957708163">O navegador é gerido por <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Sugestão de pesquisa de <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gerir palavras-passe…</translation>
 <translation id="4744603770635761495">Caminho do Executável</translation>
-<translation id="4746351372139058112">Mensagens</translation>
 <translation id="4750917950439032686">As suas informações (por exemplo, palavras-passe ou números de cartões de crédito) são privadas quando são enviadas para este site.</translation>
 <translation id="4756388243121344051">&amp;Histórico</translation>
 <translation id="4758311279753947758">Adicionar informações de contacto</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">A processar</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">O site que pretende visitar contém software malicioso</translation>
-<translation id="724766306220616965">Avisos, conflito</translation>
 <translation id="724975217298816891">Introduza a data de validade e o Código de Segurança/CVC de <ph name="CREDIT_CARD" /> para atualizar os detalhes do cartão. Ao confirmar, os detalhes do cartão são partilhados com este site.</translation>
 <translation id="7251437084390964440">A configuração de rede não cumpre a norma ONC. Partes da configuração podem não ser importadas.
 Detalhes adicionais:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Modo de proxy inválido.</translation>
 <translation id="8903921497873541725">Ampliar</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Conta Google</translation>
 <translation id="8931333241327730545">Pretende guardar este cartão na sua Conta Google?</translation>
 <translation id="8932102934695377596">O seu relógio está atrasado</translation>
 <translation id="893332455753468063">Adicionar nome</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index fbff801..344e5b1 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> pe <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Anulează plata</translation>
 <translation id="3207960819495026254">Marcată</translation>
-<translation id="321912867715453276">Avertisment: Este prezentă mai mult de o sursă pentru politică, dar valorile sunt identice.</translation>
 <translation id="3225919329040284222">Serverul a prezentat un certificat care nu se potrivește cu așteptările încorporate. Aceste așteptări sunt incluse pentru anumite site-uri web, cu un grad sporit de securitate, pentru a vă proteja.</translation>
 <translation id="3226128629678568754">Apăsați butonul de reîncărcare pentru a retrimite datele necesare pentru încărcarea paginii.</translation>
 <translation id="3227137524299004712">Microfon</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Se calculează...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> este blocat</translation>
 <translation id="3987940399970879459">Mai puțin de 1 MB</translation>
-<translation id="4008849406247176967">Avertisment: Pentru această politică este prezentă mai mult de o sursă cu valori în conflict!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 pagină web în apropiere}few{# pagini web în apropiere}other{# de pagini web în apropiere}}</translation>
 <translation id="4030383055268325496">&amp;Anulați adăugarea</translation>
 <translation id="4032320456957708163">Browserul este gestionat de <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -567,7 +565,7 @@
 <translation id="4072486802667267160">A apărut o eroare la procesarea comenzii. Încearcă din nou.</translation>
 <translation id="4075732493274867456">Clientul și serverul nu acceptă o versiune a protocolului SSL sau o suită de codificare obișnuită.</translation>
 <translation id="4079302484614802869">Configurația pentru proxy este setată să utilizeze o adresă URL pentru scripturi .pac, și nu servere proxy fixe.</translation>
-<translation id="4082393374666368382">Setări - Administrator</translation>
+<translation id="4082393374666368382">Setări – Administrator</translation>
 <translation id="4092411512356034591">Accesezi <ph name="DOMAIN" />?</translation>
 <translation id="4098354747657067197">Urmează un site înșelător</translation>
 <translation id="4103249731201008433">Numărul de serie al gadgetului este nevalid</translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Sugestie de căutare <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gestionează parolele…</translation>
 <translation id="4744603770635761495">Cale executabilă</translation>
-<translation id="4746351372139058112">Mesaje</translation>
 <translation id="4750917950439032686">Informațiile tale (de exemplu, parolele și numerele cardurilor de credit) sunt private când sunt trimise la acest site.</translation>
 <translation id="4756388243121344051">&amp;Istoric</translation>
 <translation id="4758311279753947758">Adaugă informații de contact</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Se procesează</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Site-ul pe care urmează să îl accesezi conține programe malware</translation>
-<translation id="724766306220616965">Avertismente, Conflict</translation>
 <translation id="724975217298816891">Introdu data de expirare și codul CVC pentru <ph name="CREDIT_CARD" />, pentru a actualiza detaliile cardului. După ce confirmi, acest site va avea acces la detaliile cardului tău.</translation>
 <translation id="7251437084390964440">Configurația rețelei nu respectă standardul ONC. Este posibil ca anumite părți ale configurației să nu fie importate.
 Detalii suplimentare:
@@ -1422,6 +1418,7 @@
 <translation id="8891727572606052622">Mod proxy nevalid.</translation>
 <translation id="8903921497873541725">Mărește</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Contul Google</translation>
 <translation id="8931333241327730545">Dorești să salvezi acest card în Contul Google?</translation>
 <translation id="8932102934695377596">Ora este setată în trecut</translation>
 <translation id="893332455753468063">Adaugă un nume</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 7c22b5888..39d802d 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -407,7 +407,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> на <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Отменить оплату</translation>
 <translation id="3207960819495026254">Добавлено в закладки.</translation>
-<translation id="321912867715453276">Внимание! Для этого правила существует более одного источника с одинаковыми значениями.</translation>
 <translation id="3225919329040284222">Сертификат не соответствует встроенным параметрам определенных сайтов с высоким уровнем безопасности.</translation>
 <translation id="3226128629678568754">Чтобы повторно ввести данные, необходимые для загрузки страницы, нажмите "Обновить".</translation>
 <translation id="3227137524299004712">Микрофон</translation>
@@ -547,7 +546,6 @@
 <translation id="397105322502079400">Вычисление…</translation>
 <translation id="3973234410852337861">Сайт <ph name="HOST_NAME" /> заблокирован</translation>
 <translation id="3987940399970879459">Менее 1 МБ</translation>
-<translation id="4008849406247176967">Внимание! Для этого правила существует более одного источника с конфликтующими значениями.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 веб-страница поблизости}one{# веб-страница поблизости}few{# веб-страницы поблизости}many{# веб-страниц поблизости}other{# веб-страницы поблизости}}</translation>
 <translation id="4030383055268325496">&amp;Отменить добавление</translation>
 <translation id="4032320456957708163">Этим браузером управляет администратор <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -684,7 +682,6 @@
 <translation id="4738601419177586157">Подсказка при поиске "<ph name="TEXT" />"</translation>
 <translation id="4742407542027196863">Управление паролями</translation>
 <translation id="4744603770635761495">Путь к исполняемому файлу</translation>
-<translation id="4746351372139058112">Сообщения</translation>
 <translation id="4750917950439032686">Информация, которую вы сообщаете этому сайту (например, пароли и номера банковских карт), защищена.</translation>
 <translation id="4756388243121344051">&amp;История</translation>
 <translation id="4758311279753947758">Добавить контактные данные</translation>
@@ -1111,7 +1108,6 @@
 <translation id="7220786058474068424">Подождите…</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Осторожно, вредоносное ПО!</translation>
-<translation id="724766306220616965">Предупреждения, конфликт</translation>
 <translation id="724975217298816891">Введите срок действия и CVC-код карты <ph name="CREDIT_CARD" />. После этого ее данные будут переданы сайту.</translation>
 <translation id="7251437084390964440">Некоторые элементы сетевой конфигурации невозможно импортировать, поскольку она не соответствует стандарту ONC.
 Подробнее:
@@ -1409,6 +1405,7 @@
 <translation id="8891727572606052622">Недопустимый режим работы прокси-сервера.</translation>
 <translation id="8903921497873541725">Увеличить</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Аккаунт Google</translation>
 <translation id="8931333241327730545">Сохранить эту карту в аккаунте Google?</translation>
 <translation id="8932102934695377596">Часы отстают</translation>
 <translation id="893332455753468063">Добавьте имя</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 57c2237..2f2b1109 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -405,7 +405,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> na serveri <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Zrušiť platbu</translation>
 <translation id="3207960819495026254">Pridané medzi záložky</translation>
-<translation id="321912867715453276">Upozornenie: V rámci tohto pravidla je k dispozícii viacero zdrojov, ale ich hodnoty sú rovnaké.</translation>
 <translation id="3225919329040284222">Server sa preukázal certifikátom, ktorý nezodpovedá integrovaným očakávaniam. Tieto očakávania sú kvôli vašej ochrane zahrnuté pri určitých webových stránkach s vysokou úrovňou zabezpečenia.</translation>
 <translation id="3226128629678568754">Stlačením tlačidla opakovaného spustenia znova odošlete údaje potrebné na načítanie stránky.</translation>
 <translation id="3227137524299004712">Mikrofón</translation>
@@ -544,7 +543,6 @@
 <translation id="397105322502079400">Prebieha výpočet...</translation>
 <translation id="3973234410852337861">Web <ph name="HOST_NAME" /> je zablokovaný</translation>
 <translation id="3987940399970879459">Menej ako 1 MB</translation>
-<translation id="4008849406247176967">Upozornenie: V rámci tohto pravidla je k dispozícii viacero zdrojov s konfliktnými hodnotami!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 webová stránka v okolí}few{# webové stránky v okolí}many{# webovej stránky v okolí}other{# webových stránok v okolí}}</translation>
 <translation id="4030383055268325496">&amp;Vrátiť späť pridanie</translation>
 <translation id="4032320456957708163">Váš prehliadač spravuje doména <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -681,7 +679,6 @@
 <translation id="4738601419177586157">Návrh vyhľadávania <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Spravovať heslá…</translation>
 <translation id="4744603770635761495">Spustiteľná cesta</translation>
-<translation id="4746351372139058112">Správy</translation>
 <translation id="4750917950439032686">Vaše údaje, napríklad heslá alebo čísla kreditných kariet, sú pri odosielaní na tento web utajené.</translation>
 <translation id="4756388243121344051">&amp;História</translation>
 <translation id="4758311279753947758">Pridať kontaktné údaje</translation>
@@ -1107,7 +1104,6 @@
 <translation id="7220786058474068424">Spracováva sa</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Webové stránky, ktoré chcete otvoriť, obsahujú malvér</translation>
-<translation id="724766306220616965">Upozornenia, konflikt</translation>
 <translation id="724975217298816891">Ak chcete aktualizovať podrobnosti o karte <ph name="CREDIT_CARD" />, zadajte dátum vypršania platnosti a kód CVC. Po potvrdení budú podrobnosti o karte zdieľané s týmto webom.</translation>
 <translation id="7251437084390964440">Konfigurácia siete nie je v súlade so štandardom ONC. Niektoré časti konfigurácie sa nemusia importovať.
 Ďalšie podrobnosti:
@@ -1406,6 +1402,7 @@
 <translation id="8891727572606052622">Neplatný režim proxy.</translation>
 <translation id="8903921497873541725">Priblížiť</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">účtu Google</translation>
 <translation id="8931333241327730545">Chcete túto kartu uložiť do svojho účtu Google?</translation>
 <translation id="8932102934695377596">Vaše hodiny idú pozadu</translation>
 <translation id="893332455753468063">Pridanie mena</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 72755e4..e652aa87 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> v strežniku <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Prekliči plačilo</translation>
 <translation id="3207960819495026254">Dodano med zaznamke</translation>
-<translation id="321912867715453276">Opozorilo: Za pravilnik je več virov, vendar so vrednosti enake.</translation>
 <translation id="3225919329040284222">Strežnik je poslal potrdilo, ki se ne ujema z vgrajenimi pričakovanji. Ta pričakovanja so zaradi vaše varnosti vključena za nekatera strogo zavarovana spletna mesta.</translation>
 <translation id="3226128629678568754">Pritisnite gumb za vnovično nalaganje, da znova pošljete podatke za nalaganje strani.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Izračunavanje …</translation>
 <translation id="3973234410852337861">Spletno mesto <ph name="HOST_NAME" /> je blokirano</translation>
 <translation id="3987940399970879459">Manj kot 1 MB</translation>
-<translation id="4008849406247176967">Opozorilo: Za ta pravilnik je več virov z navzkrižnimi vrednostmi.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 spletna stran v bližini}one{# spletna stran v bližini}two{# spletni strani v bližini}few{# spletne strani v bližini}other{# spletnih strani v bližini}}</translation>
 <translation id="4030383055268325496">&amp;Razveljavi dodajanje</translation>
 <translation id="4032320456957708163">Brskalnik upravlja domena <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Predlog za iskanje poizvedbe <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Upravljaj gesla …</translation>
 <translation id="4744603770635761495">Pot do izvedljive datoteke</translation>
-<translation id="4746351372139058112">Sporočila</translation>
 <translation id="4750917950439032686">Vaši podatki (npr. gesla ali številke kreditnih kartic) so zasebni, kadar so poslani temu spletnemu mestu.</translation>
 <translation id="4756388243121344051">&amp;Zgodovina</translation>
 <translation id="4758311279753947758">Dodaj podatke za stik</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Obdelovanje</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Spletno mesto z zlonamerno programsko opremo</translation>
-<translation id="724766306220616965">Opozorila, navzkrižje</translation>
 <translation id="724975217298816891">Vnesite datum poteka in CVC za <ph name="CREDIT_CARD" />, da posodobite podatke o kartici. Ko potrdite, bodo temu spletnemu mestu razkriti podatki o kartici.</translation>
 <translation id="7251437084390964440">Omrežna konfiguracija ne ustreza standardu ONC. Deli konfiguracije morda niso bili uvoženi.
 Dodatne podrobnosti:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Neveljaven način strežnika proxy.</translation>
 <translation id="8903921497873541725">Povečaj</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google Račun</translation>
 <translation id="8931333241327730545">Ali želite to kartico shraniti v Google Račun?</translation>
 <translation id="8932102934695377596">Ura zaostaja</translation>
 <translation id="893332455753468063">Dodajanje imena</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index 403c6b1..764e94e9 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> на: <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Откажи плаћање</translation>
 <translation id="3207960819495026254">Обележено</translation>
-<translation id="321912867715453276">Упозорење: Присутно је више извора са истим вредностима за ове смернице.</translation>
 <translation id="3225919329040284222">Сервер је приказао сертификат који се не подудара са уграђеним очекивањима. Та очекивања су обухваћена за одређене веб-сајтове са јаким безбедносним мерама како би вас заштитила.</translation>
 <translation id="3226128629678568754">Притисните дугме Поново учитај да бисте поново послали податке потребне за учитавање странице.</translation>
 <translation id="3227137524299004712">Микрофон</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Израчунавање...</translation>
 <translation id="3973234410852337861">Хост <ph name="HOST_NAME" /> је блокиран</translation>
 <translation id="3987940399970879459">Мање од 1 MB</translation>
-<translation id="4008849406247176967">Упозорење: Присутно је више извора са неусаглашеним вредностима за ове смернице!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 веб-страница у околини}one{# веб-страница у околини}few{# веб-странице у околини}other{# веб-страница у околини}}</translation>
 <translation id="4030383055268325496">&amp;Опозови додавање</translation>
 <translation id="4032320456957708163">Прегледачем управља <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Предлог за претрагу <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Управљај лозинкама...</translation>
 <translation id="4744603770635761495">Путања извршне датотеке</translation>
-<translation id="4746351372139058112">Поруке</translation>
 <translation id="4750917950439032686">Информације (на пример, лозинке или бројеви кредитних картица) су приватне када се шаљу овом сајту.</translation>
 <translation id="4756388243121344051">&amp;Историја</translation>
 <translation id="4758311279753947758">Додај контакт информације</translation>
@@ -1122,7 +1119,6 @@
 <translation id="7220786058474068424">Обрада</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Сајт који ћете посетити садржи малвер</translation>
-<translation id="724766306220616965">Упозорења, неусаглашеност</translation>
 <translation id="724975217298816891">Унесите рок трајања и CVC за картицу <ph name="CREDIT_CARD" /> да бисте ажурирали податке о картици. Када будете потврдили, подаци о картици ће бити послати овом сајту.</translation>
 <translation id="7251437084390964440">Конфигурација мреже није у складу са ONC стандардом. Делови конфигурације можда нису увезени.
 Додатни детаљи:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Неважећи режим проксија.</translation>
 <translation id="8903921497873541725">Увећавање</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google налога</translation>
 <translation id="8931333241327730545">Да ли желите да сачувате ову картицу на Google налог?</translation>
 <translation id="8932102934695377596">Сат вам касни</translation>
 <translation id="893332455753468063">Додајте име</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 8b3f4fe3..d5c28c3 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> på <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Avbryt betalningen</translation>
 <translation id="3207960819495026254">Bokmärkt</translation>
-<translation id="321912867715453276">Varning! Principen har fler än en källa, men med samma värden.</translation>
 <translation id="3225919329040284222">Ett certifikat som inte överensstämmer med inbyggda förväntningar presenterades på servern. Förväntningarna gäller för webbplatser med hög säkerhet för att skydda dig.</translation>
 <translation id="3226128629678568754">Om du på nytt vill skicka datan som behövs för att läsa in sidan trycker du på knappen Läs in igen.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Beräknar ...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> har blockerats</translation>
 <translation id="3987940399970879459">Mindre än 1 MB</translation>
-<translation id="4008849406247176967">Varning! Den här principen har flera källor med olika värden.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 webbsida i närheten}other{# webbsidor i närheten}}</translation>
 <translation id="4030383055268325496">&amp;Ångra Lägg till</translation>
 <translation id="4032320456957708163">Din webbläsare hanteras av <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Sökförslag för <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Hantera lösenord …</translation>
 <translation id="4744603770635761495">Sökväg till körbar fil</translation>
-<translation id="4746351372139058112">Meddelanden</translation>
 <translation id="4750917950439032686">Dina uppgifter (till exempel lösenord eller kreditkortsnummer) är privata när de skickas till den här webbplatsen.</translation>
 <translation id="4756388243121344051">&amp;Historik</translation>
 <translation id="4758311279753947758">Lägg till kontaktuppgifter</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Bearbetning pågår</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Det förekommer skadlig programvara på följande sida</translation>
-<translation id="724766306220616965">Varningar, konflikt</translation>
 <translation id="724975217298816891">Ange utgångsdatum och CVC-kod för <ph name="CREDIT_CARD" /> om du vill uppdatera kortinformationen. När du bekräftar delas kortinformationen med den här webbplatsen.</translation>
 <translation id="7251437084390964440">Nätverkskonfigurationen uppfyller inte ONC-standarden. Det kan hända att delar av konfigurationen inte kan importeras.
 Mer information.
@@ -1422,6 +1418,7 @@
 <translation id="8891727572606052622">Ogiltigt proxyläge.</translation>
 <translation id="8903921497873541725">Zooma in</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google-konto</translation>
 <translation id="8931333241327730545">Vill du spara det här kortet i ditt Google-konto?</translation>
 <translation id="8932102934695377596">Klockan går efter</translation>
 <translation id="893332455753468063">Lägg till namn</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index 3c0fab47..c3908f02 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> kwenye <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Ghairi Malipo</translation>
 <translation id="3207960819495026254">Imealamishwa</translation>
-<translation id="321912867715453276">Onyo: Sera hii ina zaidi ya chanzo kimoja, lakini thamani zinafanana.</translation>
 <translation id="3225919329040284222">Seva imewasilisha cheti kisicholingana na matarajio ya kijenzi cha ndani. Matarajio haya yanajumlishwa kwa baadhi ya tovuti za usalama wa juu ili kukulinda.</translation>
 <translation id="3226128629678568754">Bonyeza kitufe cha kupakia upya ili kuwasilisha upya data inayohitajika kupakia ukurasa.</translation>
 <translation id="3227137524299004712">Maikrofoni</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Inakokotoa...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> imezuiwa.</translation>
 <translation id="3987940399970879459">Chini ya MB 1</translation>
-<translation id="4008849406247176967">Onyo: Sera hii ina zaidi ya chanzo kimoja chenye thamani zinazokinzana!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{ukurasa 1 wa wavuti ulio karibu}other{kurasa # za wavuti zilizo karibu}}</translation>
 <translation id="4030383055268325496">Tendua kuongeza</translation>
 <translation id="4032320456957708163">Kivinjari chako kinadhibitiwa na <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Pendekezo la utafutajI la <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Dhibiti manenosiri…</translation>
 <translation id="4744603770635761495">Njia Tekelezi</translation>
-<translation id="4746351372139058112">Ujumbe</translation>
 <translation id="4750917950439032686">Maelezo yako (kwa mfano, manenosiri, au nambari za kadi za mikopo) ni ya faragha yanapotumwa kwenye tovuti hii.</translation>
 <translation id="4756388243121344051">&amp;Historia</translation>
 <translation id="4758311279753947758">Ongeza maelezo ya mawasiliano</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Malipo yanashughulikiwa</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Tovuti unayoelekea kufungua ina programu hasidi</translation>
-<translation id="724766306220616965">Maonyo, Mgogoro</translation>
 <translation id="724975217298816891">Weka tarehe ya kuisha kwa muda wa matumizi na CVC ya <ph name="CREDIT_CARD" /> ili usasishe maelezo ya kadi yako. Baada ya kuthibitisha, maelezo ya kadi yako yatashirikiwa na tovuti hii.</translation>
 <translation id="7251437084390964440">Mipangilio ya mtandao haitii kiwango cha ONC. Huenda baadhi ya mipangilio haitapakiwa. Maelezo ya ziada: <ph name="DEBUG_INFO" /></translation>
 <translation id="725866823122871198">Muunganisho wa faragha kwenye <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> hauwezi kutambuliwa kwa sababu tarehe na wakati wa kompyuta yako (<ph name="DATE_AND_TIME" />) si sahihi.</translation>
@@ -1418,6 +1414,7 @@
 <translation id="8891727572606052622">Modi batili ya proksi.</translation>
 <translation id="8903921497873541725">Kuza karibu</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Akaunti ya Google</translation>
 <translation id="8931333241327730545">Je, ungependa kuhifadhi kadi hii katika Akaunti yako ya Google?</translation>
 <translation id="8932102934695377596">Saa yako iko nyuma</translation>
 <translation id="893332455753468063">Ongeza Jina</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index b6f6c58..073afef 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -310,7 +310,7 @@
 <translation id="2586657967955657006">கிளிப்போர்டு</translation>
 <translation id="2587730715158995865">வெளியீட்டாளர்: <ph name="ARTICLE_PUBLISHER" />. இதையும் பிற வெளியீட்டாளர்கள் வழங்கும் <ph name="OTHER_ARTICLE_COUNT" /> கட்டுரைகளையும் படிக்கவும்.</translation>
 <translation id="2587841377698384444">கோப்பக API ஐடி:</translation>
-<translation id="2595719060046994702">இந்தச் சாதனமும் கணக்கும் ஒரு கம்பெனி அல்லது பிற நிறுவனத்தின் மூலம் நிர்வகிக்கப்படவில்லை.</translation>
+<translation id="2595719060046994702">இந்தச் சாதனமும் கணக்கும் ஒரு நிறுவனம் அல்லது பிற அமைப்பின் மூலம் நிர்வகிக்கப்படவில்லை.</translation>
 <translation id="2597378329261239068">இந்த ஆவணம் கடவுச்சொல் பாதுகாக்கப்பட்ட ஒன்று. தயவுசெய்து ஒரு கடவுச்சொல்லை உள்ளிடுக.</translation>
 <translation id="2609632851001447353">வேறுபாடுகள்</translation>
 <translation id="2618023639789766142">C10 (என்வலப்)</translation>
@@ -413,7 +413,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> இல் <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">கட்டணம் செலுத்துவதை ரத்துசெய்</translation>
 <translation id="3207960819495026254">புக்மார்க் செய்யப்பட்டது</translation>
-<translation id="321912867715453276">எச்சரிக்கை: ஒன்றுக்கும் மேற்பட்ட மூலங்கள் கொள்கையில் உள்ளன. ஆனால், மதிப்புகளில் மாற்றம் இல்லை.</translation>
 <translation id="3225919329040284222">உள்ளமைந்த எதிர்பார்ப்புகளுடன் பொருந்தாத சான்றிதழை சேவையகம் வழங்கியது. சில உயர்-பாதுகாப்பு வலைத்தளங்களில் உங்களைப் பாதுகாக்கவே இந்த எதிர்பார்ப்புகள் சேர்க்கப்படுகின்றன.</translation>
 <translation id="3226128629678568754">பக்கத்தை ஏற்ற தேவைப்படும் தரவை மறுமுறைச் சமர்ப்பிப்பதற்கு மீண்டும் ஏற்று என்ற பட்டனை அழுத்துக.</translation>
 <translation id="3227137524299004712">மைக்ரோஃபோன்</translation>
@@ -522,7 +521,7 @@
 <translation id="3761718714832595332">நிலையை மறை</translation>
 <translation id="3765032636089507299">பாதுகாப்பு உலாவல் பக்கம் உருவாக்கப்படுகிறது.</translation>
 <translation id="3778403066972421603">கார்டை உங்கள் Google கணக்கிலும் இந்தச் சாதனத்திலும் சேமிக்க விரும்புகிறீர்களா?</translation>
-<translation id="3779973883630527594">இந்தக் கணக்கை நிர்வகிக்கும் கம்பெனி, பள்ளி அல்லது பிற நிறுவனங்கள்:</translation>
+<translation id="3779973883630527594">இந்தக் கணக்கை நிர்வகிக்கும் நிறுவனம், பள்ளி அல்லது பிற அமைப்புகள்:</translation>
 <translation id="3781428340399460090">ஹாட் பிங்க்</translation>
 <translation id="3783418713923659662">Mastercard</translation>
 <translation id="3787705759683870569">காலாவதி: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
@@ -551,7 +550,6 @@
 <translation id="397105322502079400">கணக்கிடுகிறது...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> தடுக்கப்பட்டுள்ளது</translation>
 <translation id="3987940399970879459">1 மெ.பை. அளவை விடக் குறைவாக உள்ளது</translation>
-<translation id="4008849406247176967">எச்சரிக்கை: பொருந்தாத மதிப்புகளைக் கொண்ட ஒன்றுக்கும் மேற்பட்ட மூலங்கள் இந்தக் கொள்கையில் உள்ளன!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{அருகில் ஒரு இணையப் பக்கம் உள்ளது}other{அருகில் # இணையப் பக்கங்கள் உள்ளன}}</translation>
 <translation id="4030383055268325496">&amp;சேர்த்தலைச் செயல்தவிர்</translation>
 <translation id="4032320456957708163">உங்கள் உலாவியை <ph name="ENROLLMENT_DOMAIN" /> நிர்வகிக்கிறது</translation>
@@ -688,7 +686,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> தேடல் பரிந்துரை</translation>
 <translation id="4742407542027196863">கடவுச்சொற்களை நிர்வகி…</translation>
 <translation id="4744603770635761495">இயக்கநிரல் பாதை</translation>
-<translation id="4746351372139058112">செய்திகள்</translation>
 <translation id="4750917950439032686">உங்கள் தகவலை (எடுத்துக்காட்டு: கடவுச்சொற்கள் அல்லது கிரெடிட் கார்டு எண்கள்) இந்தத் தளத்திற்கு அனுப்பும் போது, தனிப்பட்டதாக இருக்கும்.</translation>
 <translation id="4756388243121344051">&amp;வரலாறு</translation>
 <translation id="4758311279753947758">தொடர்புத் தகவலைச் சேர்</translation>
@@ -1117,7 +1114,6 @@
 <translation id="7220786058474068424">செயல்படுத்துகிறது</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">தளத்தில் தீம்பொருள் உள்ளது</translation>
-<translation id="724766306220616965">எச்சரிக்கைகள், முரண்பாடு</translation>
 <translation id="724975217298816891">கார்டு விவரங்களைப் புதுப்பிக்க, <ph name="CREDIT_CARD" /> இன் காலாவதி தேதியையும் CVC எண்ணையும் உள்ளிடவும். உறுதிசெய்த பின்னர், உங்கள் கார்டு விவரங்கள் இந்தத் தளத்திற்குப் பகிரப்படும்.</translation>
 <translation id="7251437084390964440">நெட்வொர்க் உள்ளமைவானது ONC தரத்துடன் இணங்கவில்லை. உள்ளமைவின் பகுதிகள் இறக்குமதியாகாமல் போகக்கூடும்.
 கூடுதல் விவரங்கள்:
@@ -1415,6 +1411,7 @@
 <translation id="8891727572606052622">தவறான ப்ராக்ஸி முறை.</translation>
 <translation id="8903921497873541725">பெரிதாக்கு</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google கணக்கு</translation>
 <translation id="8931333241327730545">இந்தக் கார்டை உங்கள் Google கணக்கில் சேமிக்க வேண்டுமா?</translation>
 <translation id="8932102934695377596">உங்கள் கடிகாரம் மிகவும் பின்தங்கி இருக்கிறது</translation>
 <translation id="893332455753468063">பெயரைச் சேர்க்கவும்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 65d1490..5d7132dc 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -410,7 +410,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" />లో <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">చెల్లింపును రద్దు చేయండి</translation>
 <translation id="3207960819495026254">బుక్‌మార్క్ చేయబడింది</translation>
-<translation id="321912867715453276">హెచ్చరిక: ఈ విధానంలో ఒకటి కంటే ఎక్కువ మూలాలు ఉన్నాయి, కానీ విలువలు సమానంగా ఉన్నాయి.</translation>
 <translation id="3225919329040284222">అంతర్గత అంచనాలకు సరిపోలని ఒక ధృవీకరణ పత్రాన్ని సర్వర్ సమర్పించింది. మిమ్మల్ని సంరక్షించే దిశగా నిర్దిష్ట, ఉన్నత స్ధాయి భద్రతా వెబ్‌సైట్‌ల కోసం ఈ అంచనాలు చేర్చబడ్డాయి.</translation>
 <translation id="3226128629678568754">పేజీని లోడ్ చేయడానికి అవసరమైన డేటాను మళ్లీ సమర్పించడం కోసం 'మళ్లీ లోడ్ చేయి' బటన్ క్లిక్ చేయండి.</translation>
 <translation id="3227137524299004712">మైక్రోఫోన్</translation>
@@ -550,7 +549,6 @@
 <translation id="397105322502079400">గణిస్తోంది...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> బ్లాక్ చేయబడింది</translation>
 <translation id="3987940399970879459">1 MB కంటే తక్కువ</translation>
-<translation id="4008849406247176967">హెచ్చరిక: ఈ విధానంలో వైరుధ్య విలువలతో కూడిన ఒకటి కంటే ఎక్కువ మూలాలు ఉన్నాయి!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 వెబ్ పేజీ సమీపంలో ఉంది}other{# వెబ్ పేజీలు సమీపంలో ఉన్నాయి}}</translation>
 <translation id="4030383055268325496">&amp;జోడించడాన్ని రద్దు చేయి</translation>
 <translation id="4032320456957708163">మీ బ్రౌజర్ <ph name="ENROLLMENT_DOMAIN" /> ద్వారా నిర్వహించబడుతోంది</translation>
@@ -687,7 +685,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> శోధన సూచన</translation>
 <translation id="4742407542027196863">పాస్‌వర్డ్‌లను నిర్వహించు…</translation>
 <translation id="4744603770635761495">అమలు చేయగల పాథ్‌</translation>
-<translation id="4746351372139058112">సందేశాలు</translation>
 <translation id="4750917950439032686">మీ సమాచారాన్ని (ఉదాహరణకు, పాస్‌వర్డ్‌లు లేదా క్రెడిట్ కార్డ్ నంబర్‌లు) ఈ సైట్‌కు పంపినప్పుడు అది ప్రైవేట్‌గా ఉంచబడుతుంది.</translation>
 <translation id="4756388243121344051">&amp;చరిత్ర</translation>
 <translation id="4758311279753947758">సంప్రదింపు సమాచారాన్ని జోడించు</translation>
@@ -1114,7 +1111,6 @@
 <translation id="7220786058474068424">ప్రాసెస్ చేస్తోంది</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">ముందున్న సైట్‌లో మాల్వేర్ ఉంది</translation>
-<translation id="724766306220616965">హెచ్చరికలు, వైరుధ్యం</translation>
 <translation id="724975217298816891">మీ కార్డ్ వివరాలను అప్‌డేట్ చేయడానికి <ph name="CREDIT_CARD" /> కార్డ్ గడువు ముగింపు తేదీ మరియు CVCని నమోదు చేయండి. మీరు నిర్ధారించిన తర్వాత, మీ కార్డ్ వివరాలు ఈ సైట్‌తో షేర్ చేయబడతాయి.</translation>
 <translation id="7251437084390964440">నెట్‌వర్క్ కాన్ఫిగరేషన్ ONC ప్రమాణానికి అనుకూలంగా లేదు. కాన్ఫిగరేషన్‌లోని భాగాలు దిగుమతి కాకపోయి ఉండకపోవచ్చు.
 అదనపు వివరాలు:
@@ -1412,6 +1408,7 @@
 <translation id="8891727572606052622">చెల్లని ప్రాక్సీ మోడ్.</translation>
 <translation id="8903921497873541725">దగ్గరికి జూమ్ చెయ్యి</translation>
 <translation id="890485472659500557">ఇంజినీరింగ్-C</translation>
+<translation id="8912362522468806198">Google ఖాతా</translation>
 <translation id="8931333241327730545">మీరు ఈ కార్డ్‌ను మీ Google ఖాతాకు సేవ్ చేయాలనుకుంటున్నారా?</translation>
 <translation id="8932102934695377596">మీ గడియారం సమయం గతంలో ఉంది</translation>
 <translation id="893332455753468063">పేరుని జోడించండి</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index f2e9c72..99e9ffc7 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> ใน <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">ยกเลิกการชำระเงิน</translation>
 <translation id="3207960819495026254">บุ๊กมาร์กแล้ว</translation>
-<translation id="321912867715453276">คำเตือน: นโยบายนี้มีแหล่งที่มามากกว่า 1 แห่งแต่มีค่าต่างๆ เหมือนกัน</translation>
 <translation id="3225919329040284222">เซิร์ฟเวอร์แสดงใบรับรองที่ไม่ตรงกับการคาดการณ์ที่มีอยู่ การคาดการณ์เหล่านี้มีอยู่ในบางเว็บไซต์ที่มีการรักษาความปลอดภัยสูงเพื่อปกป้องคุณ</translation>
 <translation id="3226128629678568754">กดปุ่มโหลดซ้ำเพื่อส่งซ้ำข้อมูลที่จำเป็นในการโหลดหน้าเว็บ</translation>
 <translation id="3227137524299004712">ไมโครโฟน</translation>
@@ -555,7 +554,6 @@
 <translation id="397105322502079400">กำลังคำนวณ...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ถูกบล็อก</translation>
 <translation id="3987940399970879459">ไม่ถึง 1 MB</translation>
-<translation id="4008849406247176967">คำเตือน: นโยบายนี้มีแหล่งที่มามากกว่า 1 แห่งที่มีค่าขัดแย้งกัน</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{มีหน้าเว็บ 1 หน้าใกล้ๆ}other{มีหน้าเว็บ # หน้าใกล้ๆ}}</translation>
 <translation id="4030383055268325496">&amp;เลิกทำการเพิ่ม</translation>
 <translation id="4032320456957708163">เบราว์เซอร์ของคุณจัดการโดย <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -692,7 +690,6 @@
 <translation id="4738601419177586157">การแนะนำการค้นหา <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">จัดการรหัสผ่าน…</translation>
 <translation id="4744603770635761495">เส้นทางปฏิบัติการ</translation>
-<translation id="4746351372139058112">ข้อความ</translation>
 <translation id="4750917950439032686">ข้อมูลของคุณ (ตัวอย่างเช่น รหัสผ่านหรือหมายเลขบัตรเครดิต) จะเป็นส่วนตัวเมื่อส่งมายังเว็บไซต์นี้</translation>
 <translation id="4756388243121344051">&amp;ประวัติการเข้าชม</translation>
 <translation id="4758311279753947758">เพิ่มข้อมูลติดต่อ</translation>
@@ -1122,7 +1119,6 @@
 <translation id="7220786058474068424">กำลังดำเนินการ</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" /> <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">ไซต์ที่จะเปิดมีมัลแวร์</translation>
-<translation id="724766306220616965">คำเตือนและความขัดแย้ง</translation>
 <translation id="724975217298816891">ป้อนวันหมดอายุและ CVC สำหรับ <ph name="CREDIT_CARD" /> เพื่ออัปเดตรายละเอียดของบัตร เมื่อคุณยืนยันแล้ว รายละเอียดบัตรของคุณจะแชร์กับเว็บไซต์นี้</translation>
 <translation id="7251437084390964440">การกำหนดค่าเครือข่ายไม่เป็นไปตามมาตรฐาน ONC ระบบอาจไม่นำเข้าการกำหนดค่าบางส่วน
 รายละเอียดเพิ่มเติม:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">โหมดพร็อกซีไม่ถูกต้อง</translation>
 <translation id="8903921497873541725">ขยาย</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">บัญชี Google</translation>
 <translation id="8931333241327730545">คุณต้องการบันทึกบัตรนี้ในบัญชี Google ไหม</translation>
 <translation id="8932102934695377596">นาฬิกาช้าเกินไป</translation>
 <translation id="893332455753468063">เพิ่มชื่อ</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index 5e053cb..503047e 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -310,7 +310,7 @@
 <translation id="2586657967955657006">Pano</translation>
 <translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> adlı yayıncıdan. Bunu ve diğer <ph name="OTHER_ARTICLE_COUNT" /> haberi okuyun.</translation>
 <translation id="2587841377698384444">Dizin API'sı Kimliği:</translation>
-<translation id="2595719060046994702">Bu cihaz ve hesap bir şirket veya başka kuruluş tarafından yönetilmez.</translation>
+<translation id="2595719060046994702">Bu cihaz ve hesap bir şirket veya başka kuruluş tarafından yönetilmiyor.</translation>
 <translation id="2597378329261239068">Doküman şifre korumalı. Lütfen şifreyi girin.</translation>
 <translation id="2609632851001447353">Varyasyonlar</translation>
 <translation id="2618023639789766142">C10 (Zarf)</translation>
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> üzerinde <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">Ödemeyi iptal et</translation>
 <translation id="3207960819495026254">Yer işareti koyuldu</translation>
-<translation id="321912867715453276">Uyarı: Bu politikada birden fazla kaynak var, ancak değerler aynı.</translation>
 <translation id="3225919329040284222">Sunucu, yerleşik beklentilerle eşleşmeyen bir sertifika sundu. Bu beklentiler sizi korumak amacıyla bazı yüksek güvenlikli web sitelerinde bulunur.</translation>
 <translation id="3226128629678568754">Sayfayı yüklemek üzere gereken verileri tekrar göndermek için yeniden yükle düğmesine basın.</translation>
 <translation id="3227137524299004712">Mikrofon</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Hesaplanııyor...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> engellendi</translation>
 <translation id="3987940399970879459">1 MB'tan az</translation>
-<translation id="4008849406247176967">Uyarı: Bu politikada, birbiriyle çelişen değerler içeren birden fazla kaynak bulunuyor.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{Yakındaki 1 web sayfası}other{Yakındaki # web sayfası}}</translation>
 <translation id="4030383055268325496">Eklemeyi &amp;geri al</translation>
 <translation id="4032320456957708163">Tarayıcınız <ph name="ENROLLMENT_DOMAIN" /> tarafından yönetilmektedir</translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" /> arama önerisi</translation>
 <translation id="4742407542027196863">Şifreleri yönet…</translation>
 <translation id="4744603770635761495">Çalıştırılabilir Yol</translation>
-<translation id="4746351372139058112">Mesajlar</translation>
 <translation id="4750917950439032686">Bilgileriniz (örneğin şifreler veya kredi kartı numaraları), bu siteye gönderilirken gizli olur.</translation>
 <translation id="4756388243121344051">&amp;Geçmiş</translation>
 <translation id="4758311279753947758">İletişim bilgilerinizi ekleyin</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">İşleme koyuluyor</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Gideceğiniz site kötü amaçlı yazılım içeriyor</translation>
-<translation id="724766306220616965">Uyarılar, Çakışma</translation>
 <translation id="724975217298816891">Kart ayrıntılarınızı güncellemek için <ph name="CREDIT_CARD" /> numaralı karta ilişkin son kullanma tarihini ve CVC kodunu girin. Onayladığınızda kart ayrıntılarınız bu siteyle paylaşılacaktır.</translation>
 <translation id="7251437084390964440">Ağ yapılandırması ONC standardına uymuyor. Yapılandırmanın bazı bölümleri içe aktarılamaz.
 Ek ayrıntılar:
@@ -1422,6 +1418,7 @@
 <translation id="8891727572606052622">Geçersiz proxy modu.</translation>
 <translation id="8903921497873541725">Yakınlaştır</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google Hesabı</translation>
 <translation id="8931333241327730545">Bu kartı Google Hesabınıza kaydetmek istiyor musunuz?</translation>
 <translation id="8932102934695377596">Saatiniz geri</translation>
 <translation id="893332455753468063">Ad Ekleyin</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index adaf8ec..8503fa8 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> на сервері <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Скасувати оплату</translation>
 <translation id="3207960819495026254">Створено закладку</translation>
-<translation id="321912867715453276">Застереження. У правилі є кілька джерел з однаковими значеннями.</translation>
 <translation id="3225919329040284222">Сервер надав сертифікат, який не відповідає очікуваним вбудованим параметрам. Ці очікувані параметри встановлено для певних веб-сайтів із високим рівнем безпеки, щоб захистити вас.</translation>
 <translation id="3226128629678568754">Натисніть кнопку перезавантаження, щоб повторно надіслати дані, потрібні для завантаження сторінки.</translation>
 <translation id="3227137524299004712">Мікрофон</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Обчислення...</translation>
 <translation id="3973234410852337861">Хост <ph name="HOST_NAME" /> заблокований</translation>
 <translation id="3987940399970879459">Менше 1 МБ</translation>
-<translation id="4008849406247176967">Застереження. У цьому правилі є кілька джерел із конфліктними значеннями.</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 веб-сторінка поруч}one{# веб-сторінка поруч}few{# веб-сторінки поруч}many{# веб-сторінок поруч}other{# веб-сторінки поруч}}</translation>
 <translation id="4030383055268325496">&amp;Відмінити додавання</translation>
 <translation id="4032320456957708163">Вашим веб-переглядачем керує домен <ph name="ENROLLMENT_DOMAIN" /></translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Пропозиція пошуку за запитом "<ph name="TEXT" />"</translation>
 <translation id="4742407542027196863">Керувати паролями…</translation>
 <translation id="4744603770635761495">Виконуваний шлях</translation>
-<translation id="4746351372139058112">Повідомлення</translation>
 <translation id="4750917950439032686">Ваша інформація (як-от паролі та номери кредитних карток) залишається конфіденційною, коли надсилається на цей сайт.</translation>
 <translation id="4756388243121344051">&amp;Історія</translation>
 <translation id="4758311279753947758">Додати контактну інформацію</translation>
@@ -918,7 +915,7 @@
 <translation id="5975083100439434680">Зменшити масштаб</translation>
 <translation id="5980920751713728343">Index-3x5</translation>
 <translation id="598637245381783098">Неможливо відкрити додаток для платежів</translation>
-<translation id="5988826871883769516">Вашим пристроєм керує<ph name="ENROLLMENT_DOMAIN" />.</translation>
+<translation id="5988826871883769516">Вашим пристроєм керує <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="5989320800837274978">Не вказано ні фіксованих проксі-серверів, ні URL-адрес сценарію .pac.</translation>
 <translation id="5990559369517809815">Надсилання запитів на сервер заблоковано розширенням.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Обробка</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Сайт містить зловмисне програмне забезпечення</translation>
-<translation id="724766306220616965">Застереження, конфлікт</translation>
 <translation id="724975217298816891">Введіть термін дії та код CVC картки <ph name="CREDIT_CARD" />, щоб оновити її дані. Щойно ви підтвердите дані картки, цей сайт отримає доступ до них.</translation>
 <translation id="7251437084390964440">Конфігурація мережі не відповідає стандарту ONC. Вона може імпортуватися частково.
 Додаткові відомості:
@@ -1422,6 +1418,7 @@
 <translation id="8891727572606052622">Недійсний режим проксі-сервера.</translation>
 <translation id="8903921497873541725">Збільшити масштаб</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Обліковий запис Google</translation>
 <translation id="8931333241327730545">Зберегти цю картку у вашому обліковому записі Google?</translation>
 <translation id="8932102934695377596">Ваш годинник запізнюється</translation>
 <translation id="893332455753468063">Додайте ім’я</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index 3c6fb3d..68655770 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> trên <ph name="SERVER_NAME" /></translation>
 <translation id="320323717674993345">Hủy thanh toán</translation>
 <translation id="3207960819495026254">Đã đánh dấu trang</translation>
-<translation id="321912867715453276">Cảnh báo: Chính sách này hiện có nhiều nguồn nhưng các giá trị giống nhau.</translation>
 <translation id="3225919329040284222">Máy chủ đưa ra chứng chỉ không khớp với kỳ vọng được tích hợp sẵn. Các kỳ vọng này có trong một số trang web nhất định, có tính bảo mật cao với mục đích bảo vệ bạn.</translation>
 <translation id="3226128629678568754">Nhấn nút tải lại để gửi lại các dữ liệu cần thiết để tải trang.</translation>
 <translation id="3227137524299004712">Micrô</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">Đang tính...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> bị chặn</translation>
 <translation id="3987940399970879459">Dưới 1 MB</translation>
-<translation id="4008849406247176967">Cảnh báo: Chính sách này hiện có nhiều nguồn và các giá trị nguồn xung đột với nhau!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{1 trang web lân cận}other{# trang web lân cận}}</translation>
 <translation id="4030383055268325496">&amp;Hoàn tác thêm</translation>
 <translation id="4032320456957708163"><ph name="ENROLLMENT_DOMAIN" /> quản lý trình duyệt của bạn</translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">Đề xuất tìm kiếm <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Quản lý mật khẩu…</translation>
 <translation id="4744603770635761495">Đường dẫn thực thi</translation>
-<translation id="4746351372139058112">Tin nhắn</translation>
 <translation id="4750917950439032686">Thông tin của bạn (ví dụ: mật khẩu hoặc số thẻ tín dụng) sẽ được bảo mật khi được gửi tới trang web này.</translation>
 <translation id="4756388243121344051">&amp;Lịch sử</translation>
 <translation id="4758311279753947758">Thêm thông tin liên hệ</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">Đang xử lý</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />; <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">Trang web bạn sắp truy cập chứa phần mềm độc hại</translation>
-<translation id="724766306220616965">Cảnh báo, xung đột</translation>
 <translation id="724975217298816891">Nhập ngày hết hạn và CVC cho <ph name="CREDIT_CARD" /> để cập nhật chi tiết thẻ của bạn. Sau khi bạn xác nhận, chi tiết thẻ của bạn sẽ được chia sẻ với trang web này.</translation>
 <translation id="7251437084390964440">Cấu hình mạng này không tuân thủ tiêu chuẩn ONC. Một số phần của cấu hình có thể không nhập được.
 Thông tin chi tiết bổ sung:
@@ -1422,6 +1418,7 @@
 <translation id="8891727572606052622">Chế độ proxy không hợp lệ.</translation>
 <translation id="8903921497873541725">Phóng to</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Tài khoản Google</translation>
 <translation id="8931333241327730545">Bạn có muốn lưu thẻ này vào Tài khoản Google của mình không?</translation>
 <translation id="8932102934695377596">Đồng hồ của bạn chạy chậm</translation>
 <translation id="893332455753468063">Thêm tên</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index 6bec7f0..fcd656b 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -406,7 +406,6 @@
 <translation id="3195213714973468956">“<ph name="SERVER_NAME" />”上的“<ph name="PRINTER_NAME" />”</translation>
 <translation id="320323717674993345">取消付款</translation>
 <translation id="3207960819495026254">已加书签</translation>
-<translation id="321912867715453276">警告:此政策存在多个来源,但它们具有相同的值。</translation>
 <translation id="3225919329040284222">服务器提供的证书与内置预期证书不匹配。这些预期证书是针对某些高安全性网站提供的,以便为您提供保护。</translation>
 <translation id="3226128629678568754">按“重新加载”按钮,重新提交加载该网页所需的数据。</translation>
 <translation id="3227137524299004712">麦克风</translation>
@@ -464,7 +463,7 @@
 <translation id="3484560055331845446">您可能会无法再访问自己的 Google 帐号。Chrome 建议您立即更改密码。系统会要求您登录。</translation>
 <translation id="3495081129428749620">在网页“<ph name="PAGE_TITLE" />”中查找</translation>
 <translation id="3498215018399854026">我们暂时无法与您父母取得联系,请重试。</translation>
-<translation id="3512163584740124171">此政策会被忽略,因为同一政策组中的其他政策具有更高的优先级。</translation>
+<translation id="3512163584740124171">此政策会被忽略,因为同一政策组中的另一个政策具有更高的优先级。</translation>
 <translation id="3528171143076753409">服务器的证书不受信任。</translation>
 <translation id="3528485271872257980">深棕色</translation>
 <translation id="3530944546672790857">{COUNT,plural, =0{在已同步的设备上至少有 1 项内容}=1{1 项内容(在已同步的设备上还有更多内容)}other{# 项内容(在已同步的设备上还有更多内容)}}</translation>
@@ -544,7 +543,6 @@
 <translation id="397105322502079400">正在计算...</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> 已被屏蔽</translation>
 <translation id="3987940399970879459">小于 1 MB</translation>
-<translation id="4008849406247176967">警告:此政策存在多个具有冲突值的来源!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{附近有 1 个网页}other{附近有 # 个网页}}</translation>
 <translation id="4030383055268325496">撤消添加(&amp;U)</translation>
 <translation id="4032320456957708163">您的浏览器由 <ph name="ENROLLMENT_DOMAIN" /> 管理</translation>
@@ -681,7 +679,6 @@
 <translation id="4738601419177586157"><ph name="TEXT" />搜索建议</translation>
 <translation id="4742407542027196863">管理密码…</translation>
 <translation id="4744603770635761495">可执行文件路径</translation>
-<translation id="4746351372139058112">信息</translation>
 <translation id="4750917950439032686">您发送给这个网站的信息(例如密码或信用卡号)不会外泄。</translation>
 <translation id="4756388243121344051">历史记录(&amp;H)</translation>
 <translation id="4758311279753947758">添加联系信息</translation>
@@ -1107,7 +1104,6 @@
 <translation id="7220786058474068424">正在处理</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />;<ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">您要访问的网站包含恶意软件</translation>
-<translation id="724766306220616965">警告、冲突</translation>
 <translation id="724975217298816891">输入“<ph name="CREDIT_CARD" />”的过期日期和银行卡验证码 (CVC) 以更新您的信用卡详情。在您确认后,您的信用卡详情将与此网站共享。</translation>
 <translation id="7251437084390964440">网络配置不符合 ONC 标准,因此它的某些部分可能会无法导入。
 更多详情:
@@ -1406,6 +1402,7 @@
 <translation id="8891727572606052622">代理模式无效。</translation>
 <translation id="8903921497873541725">放大</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google 帐号</translation>
 <translation id="8931333241327730545">要将此卡的信息保存到您的 Google 帐号吗?</translation>
 <translation id="8932102934695377596">您的时钟慢了</translation>
 <translation id="893332455753468063">添加名称</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index b3fcaa71..1b523200 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -416,7 +416,6 @@
 <translation id="3195213714973468956"><ph name="SERVER_NAME" /> 上的 <ph name="PRINTER_NAME" /></translation>
 <translation id="320323717674993345">取消付款</translation>
 <translation id="3207960819495026254">已加入書籤</translation>
-<translation id="321912867715453276">警告:這項政策有多個來源,但來源的值都相同。</translation>
 <translation id="3225919329040284222">伺服器呈現的憑證與內建的預期條件不符。我們在系統中針對特定高安全性的網站內建了這些預期條件,目的在於保護你的資料安全無虞。</translation>
 <translation id="3226128629678568754">按下重新載入按鈕,重新提交載入網頁所需的資料。</translation>
 <translation id="3227137524299004712">麥克風</translation>
@@ -556,7 +555,6 @@
 <translation id="397105322502079400">計算中…</translation>
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> 遭到封鎖</translation>
 <translation id="3987940399970879459">不到 1 MB</translation>
-<translation id="4008849406247176967">警告:這項政策有多個來源,且來源的值相衝突!</translation>
 <translation id="40103911065039147">{URL_count,plural, =1{附近有 1 個網頁}other{附近有 # 個網頁}}</translation>
 <translation id="4030383055268325496">復原新增(&amp;U)</translation>
 <translation id="4032320456957708163">你的瀏覽器受到 <ph name="ENROLLMENT_DOMAIN" /> 管理</translation>
@@ -693,7 +691,6 @@
 <translation id="4738601419177586157">「<ph name="TEXT" />」搜尋建議</translation>
 <translation id="4742407542027196863">管理密碼…</translation>
 <translation id="4744603770635761495">可執行檔的路徑</translation>
-<translation id="4746351372139058112">Messages</translation>
 <translation id="4750917950439032686">你傳送給這個網站的資訊 (例如密碼或信用卡號碼) 不會外洩。</translation>
 <translation id="4756388243121344051">記錄(&amp;H)</translation>
 <translation id="4758311279753947758">新增聯絡資訊</translation>
@@ -1123,7 +1120,6 @@
 <translation id="7220786058474068424">處理中</translation>
 <translation id="7243010569062352439"><ph name="PASSWORDS" />,<ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">你要造訪的網站含有惡意軟體</translation>
-<translation id="724766306220616965">警告和衝突</translation>
 <translation id="724975217298816891">請輸入 <ph name="CREDIT_CARD" /> 的有效日期和信用卡安全碼,更新您的信用卡詳細資訊。完成驗證後,這個網站就會取得您的信用卡詳細資訊。</translation>
 <translation id="7251437084390964440">網路設定未遵循 ONC 標準,系統可能無法匯入部分設定。
 其他詳細資料:
@@ -1421,6 +1417,7 @@
 <translation id="8891727572606052622">Proxy 模式無效。</translation>
 <translation id="8903921497873541725">放大</translation>
 <translation id="890485472659500557">Engineering-C</translation>
+<translation id="8912362522468806198">Google 帳戶</translation>
 <translation id="8931333241327730545">您要將這張卡片的資訊儲存到您的 Google 帳戶嗎?</translation>
 <translation id="8932102934695377596">你的時鐘時間過慢</translation>
 <translation id="893332455753468063">新增名稱</translation>
diff --git a/components/sync/driver/sync_auth_manager.cc b/components/sync/driver/sync_auth_manager.cc
index 82f23e57..66cb8be 100644
--- a/components/sync/driver/sync_auth_manager.cc
+++ b/components/sync/driver/sync_auth_manager.cc
@@ -342,7 +342,7 @@
 }
 
 void SyncAuthManager::OnRefreshTokenRemovedForAccount(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   // If we're syncing to a different account, then this doesn't affect us.
   if (account_id != sync_account_.account_info.account_id) {
     return;
diff --git a/components/sync/driver/sync_auth_manager.h b/components/sync/driver/sync_auth_manager.h
index 3764af60..684fe15fd 100644
--- a/components/sync/driver/sync_auth_manager.h
+++ b/components/sync/driver/sync_auth_manager.h
@@ -104,7 +104,8 @@
       const CoreAccountInfo& previous_primary_account_info) override;
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override;
   void OnAccountsInCookieUpdated(
       const identity::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
       const GoogleServiceAuthError& error) override;
diff --git a/components/sync/driver/sync_driver_switches.cc b/components/sync/driver/sync_driver_switches.cc
index 0963588..ea61999 100644
--- a/components/sync/driver/sync_driver_switches.cc
+++ b/components/sync/driver/sync_driver_switches.cc
@@ -73,7 +73,7 @@
 
 // Enable USS implementation of autofill profile datatype.
 const base::Feature kSyncUSSAutofillProfile{"SyncUSSAutofillProfile",
-                                            base::FEATURE_DISABLED_BY_DEFAULT};
+                                            base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable USS implementation of autofill wallet metadata datatype.
 const base::Feature kSyncUSSAutofillWalletMetadata{
diff --git a/components/sync/driver/sync_session_durations_metrics_recorder.cc b/components/sync/driver/sync_session_durations_metrics_recorder.cc
index d81c2bae..9a96e99 100644
--- a/components/sync/driver/sync_session_durations_metrics_recorder.cc
+++ b/components/sync/driver/sync_session_durations_metrics_recorder.cc
@@ -136,7 +136,7 @@
 }
 
 void SyncSessionDurationsMetricsRecorder::OnRefreshTokenRemovedForAccount(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   DVLOG(1) << __func__;
   HandleSyncAndAccountChange();
 }
diff --git a/components/sync/driver/sync_session_durations_metrics_recorder.h b/components/sync/driver/sync_session_durations_metrics_recorder.h
index 815a9d3..f4860817 100644
--- a/components/sync/driver/sync_session_durations_metrics_recorder.h
+++ b/components/sync/driver/sync_session_durations_metrics_recorder.h
@@ -40,7 +40,8 @@
   // IdentityManager::Observer:
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override;
   void OnRefreshTokensLoaded() override;
   void OnErrorStateOfRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info,
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc
index a9cf47e1..c7bf4d7 100644
--- a/components/sync_bookmarks/bookmark_model_type_processor.cc
+++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -36,6 +36,47 @@
 
 namespace {
 
+// Metrics: "Sync.MissingBookmarkPermanentNodes"
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class MissingPermanentNodes {
+  kBookmarkBar = 0,
+  kOtherBookmarks = 1,
+  kMobileBookmarks = 2,
+  kBookmarkBarAndOtherBookmarks = 3,
+  kBookmarkBarAndMobileBookmarks = 4,
+  kOtherBookmarksAndMobileBookmarks = 5,
+  kBookmarkBarAndOtherBookmarksAndMobileBookmarks = 6,
+
+  kMaxValue = kBookmarkBarAndOtherBookmarksAndMobileBookmarks,
+};
+
+void LogMissingPermanentNodes(
+    const SyncedBookmarkTracker::Entity* bookmark_bar,
+    const SyncedBookmarkTracker::Entity* other_bookmarks,
+    const SyncedBookmarkTracker::Entity* mobile_bookmarks) {
+  MissingPermanentNodes missing_nodes;
+  if (!bookmark_bar && other_bookmarks && mobile_bookmarks) {
+    missing_nodes = MissingPermanentNodes::kBookmarkBar;
+  } else if (bookmark_bar && !other_bookmarks && mobile_bookmarks) {
+    missing_nodes = MissingPermanentNodes::kOtherBookmarks;
+  } else if (bookmark_bar && other_bookmarks && !mobile_bookmarks) {
+    missing_nodes = MissingPermanentNodes::kMobileBookmarks;
+  } else if (!bookmark_bar && !other_bookmarks && mobile_bookmarks) {
+    missing_nodes = MissingPermanentNodes::kBookmarkBarAndOtherBookmarks;
+  } else if (!bookmark_bar && other_bookmarks && !mobile_bookmarks) {
+    missing_nodes = MissingPermanentNodes::kBookmarkBarAndMobileBookmarks;
+  } else if (bookmark_bar && !other_bookmarks && !mobile_bookmarks) {
+    missing_nodes = MissingPermanentNodes::kOtherBookmarksAndMobileBookmarks;
+  } else {
+    // All must be missing.
+    missing_nodes =
+        MissingPermanentNodes::kBookmarkBarAndOtherBookmarksAndMobileBookmarks;
+  }
+  UMA_HISTOGRAM_ENUMERATION("Sync.MissingBookmarkPermanentNodes",
+                            missing_nodes);
+}
+
 // Enables scheduling bookmark model saving only upon changes in entity sync
 // metadata. This would stop persisting changes to the model type state that
 // doesn't involve changes to the entity metadata as well.
@@ -203,6 +244,12 @@
             bookmark_model_->other_node()) ||
         !bookmark_tracker_->GetEntityForBookmarkNode(
             bookmark_model_->mobile_node())) {
+      LogMissingPermanentNodes(bookmark_tracker_->GetEntityForBookmarkNode(
+                                   bookmark_model_->bookmark_bar_node()),
+                               bookmark_tracker_->GetEntityForBookmarkNode(
+                                   bookmark_model_->other_node()),
+                               bookmark_tracker_->GetEntityForBookmarkNode(
+                                   bookmark_model_->mobile_node()));
       StopTrackingMetadata();
       bookmark_tracker_.reset();
       error_handler_.Run(
diff --git a/components/url_formatter/idn_spoof_checker.cc b/components/url_formatter/idn_spoof_checker.cc
index 644c1f23..3979bf1 100644
--- a/components/url_formatter/idn_spoof_checker.cc
+++ b/components/url_formatter/idn_spoof_checker.cc
@@ -490,6 +490,9 @@
   // Block modifier letter voicing.
   allowed_set.remove(0x2ecu);
 
+  // Block historic character Latin Kra (also blocked by Mozilla).
+  allowed_set.remove(0x0138);
+
   // No need to block U+144A (Canadian Syllabics West-Cree P) separately
   // because it's blocked from mixing with other scripts including Latin.
 
diff --git a/components/url_formatter/url_formatter_unittest.cc b/components/url_formatter/url_formatter_unittest.cc
index f68f06cf..383d2ec2 100644
--- a/components/url_formatter/url_formatter_unittest.cc
+++ b/components/url_formatter/url_formatter_unittest.cc
@@ -1030,6 +1030,9 @@
 
     // Modifier-letter-voicing should be blocked (wwwˬtest.com).
     {"xn--wwwtest-2be.com", L"www\x02ectest.com", false},
+
+    // oĸ.com: Not a top domain, should be blocked because of Kra.
+    {"xn--o-tka.com", L"o\x0138.com", false},
 };
 
 struct AdjustOffsetCase {
diff --git a/components/user_manager/fake_user_manager.cc b/components/user_manager/fake_user_manager.cc
index 54270c1..40fe9af7 100644
--- a/components/user_manager/fake_user_manager.cc
+++ b/components/user_manager/fake_user_manager.cc
@@ -86,6 +86,18 @@
   return result;
 }
 
+void FakeUserManager::UpdateUserAccountData(
+    const AccountId& account_id,
+    const UserAccountData& account_data) {
+  for (user_manager::User* user : users_) {
+    if (user->GetAccountId() == account_id) {
+      user->set_display_name(account_data.display_name());
+      user->set_given_name(account_data.given_name());
+      return;
+    }
+  }
+}
+
 void FakeUserManager::UserLoggedIn(const AccountId& account_id,
                                    const std::string& username_hash,
                                    bool browser_restart,
diff --git a/components/user_manager/fake_user_manager.h b/components/user_manager/fake_user_manager.h
index 0f124f68..bb157ce 100644
--- a/components/user_manager/fake_user_manager.h
+++ b/components/user_manager/fake_user_manager.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_USER_MANAGER_FAKE_USER_MANAGER_H_
 
 #include <map>
+#include <set>
 #include <string>
 
 #include "base/macros.h"
@@ -37,6 +38,8 @@
   // UserManager overrides.
   const user_manager::UserList& GetUsers() const override;
   user_manager::UserList GetUsersAllowedForMultiProfile() const override;
+  void UpdateUserAccountData(const AccountId& account_id,
+                             const UserAccountData& account_data) override;
 
   // Set the user as logged in.
   void UserLoggedIn(const AccountId& account_id,
@@ -56,8 +59,6 @@
   bool HasBrowserRestarted() const override;
 
   // Not implemented.
-  void UpdateUserAccountData(const AccountId& account_id,
-                             const UserAccountData& account_data) override {}
   void Shutdown() override {}
   const user_manager::UserList& GetLRULoggedInUsers() const override;
   user_manager::UserList GetUnlockUsers() const override;
diff --git a/content/app/strings/translations/content_strings_am.xtb b/content/app/strings/translations/content_strings_am.xtb
index dfc8020..d642b45 100644
--- a/content/app/strings/translations/content_strings_am.xtb
+++ b/content/app/strings/translations/content_strings_am.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">እባክዎ በኮማ የተለዩ የኢሜይል አድራሻዎች ዝርዝር ያስገቡ።</translation>
 <translation id="2940813599313844715">ነገር</translation>
 <translation id="2942448076852699108">የደመቀ ይዘት</translation>
-<translation id="2983835398644161987">ከስዕል-ውስጥ-ስዕል ውጣ</translation>
 <translation id="3040011195152428237">አገናኝ</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> ሜባ</translation>
 <translation id="3075154866155599887">እባክዎ የሚሰራ ዋጋ ያስገቡ። መስኩ ያልተጠናቀቀ ነው ወይም ልክ ያልሆነ ቀን አለው።</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">እባክዎ ይህን ጽሑፍ ወደ <ph name="MIN_CHARACTERS" /> ቁምፊዎች ወይም ከዚያ በላይ ያራዝሙት (አሁን እየተጠቀሙ ያሉት <ph name="CURRENT_LENGTH" />ቁምፊዎችን ነው)።</translation>
 <translation id="383465348367842624">ከ«<ph name="ATSIGN" />» በፊት የሚመጣ ክፍል የ«<ph name="INVALIDCHARACTER" />» ምልክት መያዝ የለበትም።</translation>
 <translation id="3846214748874656680">ከሙሉ ማያገጽ ውጣ</translation>
-<translation id="3904511540324382638">ከስዕል-ውስጥ-ስዕል ውጣ</translation>
 <translation id="3920932319529768807">ድምዳሜ</translation>
 <translation id="3924558731517983934">መተግበሪያ</translation>
 <translation id="3944740393230681990">ቅድመ-ታሪክ</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">ድሕረ ቃል</translation>
 <translation id="6209276755895393898">ይህ ይመስላል፦ <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">ሙዳየ ቃላት</translation>
-<translation id="628938136236500310">በስዕል-ውስጥ-ስዕል ሁነታ ላይ በማጫወት ላይ</translation>
+<translation id="6310801910862476708">ከስዕል-ውስጥ-ስዕል ውጣ</translation>
 <translation id="6398862346408813489">የወር መምረጫ ፓነል አሳይ</translation>
 <translation id="6404546809543547843">የኦዲዮ ሰዓት አንፏቃቂ</translation>
 <translation id="6443871981718447451">የተዘጉ የመግለጫ ጽሁፎችን ምናሌ አሳይ</translation>
diff --git a/content/app/strings/translations/content_strings_ar.xtb b/content/app/strings/translations/content_strings_ar.xtb
index 0831afa..8032189f 100644
--- a/content/app/strings/translations/content_strings_ar.xtb
+++ b/content/app/strings/translations/content_strings_ar.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">يُرجى إدخال قائمة مفصولة بفواصل لعناوين البريد الإلكتروني.</translation>
 <translation id="2940813599313844715">كائن</translation>
 <translation id="2942448076852699108">المحتوى المميز</translation>
-<translation id="2983835398644161987">الخروج من وضع "نافذة ضمن نافذة"</translation>
 <translation id="3040011195152428237">رابط</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> ميغابايت</translation>
 <translation id="3075154866155599887">يرجى إدخال قيمة صالحة. الحقل غير مكتمل أو أن التاريخ غير صالح.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">يُرجى إطالة هذا النص إلى <ph name="MIN_CHARACTERS" /> من الحروف أو أكثر (أنت تستخدم حاليًا <ph name="CURRENT_LENGTH" /> من الحروف).</translation>
 <translation id="383465348367842624">الجزء المتبوع بالعلامة "<ph name="ATSIGN" />" يجب ألا يشتمل على الرمز "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">خروج من عرض ملء الشاشة</translation>
-<translation id="3904511540324382638">الخروج من وضع "نافذة ضمن نافذة"</translation>
 <translation id="3920932319529768807">خاتمة</translation>
 <translation id="3924558731517983934">التطبيق</translation>
 <translation id="3944740393230681990">فاتحة</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">كلمة ختامية</translation>
 <translation id="6209276755895393898">يبدو أن: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">مسرد مصطلحات</translation>
-<translation id="628938136236500310">التشغيل في وضع "نافذة ضمن النافذة"</translation>
+<translation id="6310801910862476708">الخروج من وضع "نافذة ضمن نافذة"</translation>
 <translation id="6398862346408813489">عرض لوحة تحديد الشهر</translation>
 <translation id="6404546809543547843">شريط تمرير وقت الصوت</translation>
 <translation id="6443871981718447451">عرض قائمة مقاطع الترجمة والشرح</translation>
diff --git a/content/app/strings/translations/content_strings_bg.xtb b/content/app/strings/translations/content_strings_bg.xtb
index 27c5eb9..76409f4 100644
--- a/content/app/strings/translations/content_strings_bg.xtb
+++ b/content/app/strings/translations/content_strings_bg.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Моля, въведете списък с имейл адреси, разделени със запетаи.</translation>
 <translation id="2940813599313844715">обект</translation>
 <translation id="2942448076852699108">откроено съдържание</translation>
-<translation id="2983835398644161987">Изход от „Картина в картината“</translation>
 <translation id="3040011195152428237">връзка</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> МБ</translation>
 <translation id="3075154866155599887">Моля, въведете валидна стойност. Данните в полето са непълни или датата е невалидна.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Моля, удължете този текст поне до <ph name="MIN_CHARACTERS" /> знака (понастоящем използвате <ph name="CURRENT_LENGTH" />).</translation>
 <translation id="383465348367842624">Текстът преди „<ph name="ATSIGN" />“ не бива да съдържа символа „<ph name="INVALIDCHARACTER" />“.</translation>
 <translation id="3846214748874656680">Изход от цял екран</translation>
-<translation id="3904511540324382638">Изход от „Картина в картината“</translation>
 <translation id="3920932319529768807">заключение</translation>
 <translation id="3924558731517983934">приложение</translation>
 <translation id="3944740393230681990">пролог</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">послеслов</translation>
 <translation id="6209276755895393898">Изглежда, че това е: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">терминологичен речник</translation>
-<translation id="628938136236500310">Възпроизвежда се в режим „Картина в картината“</translation>
+<translation id="6310801910862476708">Изход от „Картина в картината“</translation>
 <translation id="6398862346408813489">Показване на панела за избиране на месец</translation>
 <translation id="6404546809543547843">времеви плъзгач за аудиозаписа</translation>
 <translation id="6443871981718447451">показване на менюто за надписи</translation>
diff --git a/content/app/strings/translations/content_strings_bn.xtb b/content/app/strings/translations/content_strings_bn.xtb
index 5b4f9069..db01844 100644
--- a/content/app/strings/translations/content_strings_bn.xtb
+++ b/content/app/strings/translations/content_strings_bn.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">অনুগ্রহ করে কমা দিয়ে আলাদা করা ইমেল আইডির তালিকা লিখুন৷</translation>
 <translation id="2940813599313844715">অবজেক্ট</translation>
 <translation id="2942448076852699108">হাইলাইট করা কন্টেন্ট</translation>
-<translation id="2983835398644161987">ছবির-মধ্যে-ছবি মোড থেকে বেরিয়ে আসুন</translation>
 <translation id="3040011195152428237">লিঙ্ক</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> এমবি</translation>
 <translation id="3075154866155599887">অনুগ্রহ করে একটি সঠিক মান লিখুন৷ ফিল্ডটি অসম্পূর্ণ অথবা একটি ভুল তারিখ আছে৷</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">দয়া করে এই পাঠ্যকে ন্যূনতম <ph name="MIN_CHARACTERS" /> অক্ষরের বা তার বেশি (আপনি বর্তমানে <ph name="CURRENT_LENGTH" />টি অক্ষর ব্যবহার করেছেন) দৈর্ঘের করুন।</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />' অনুসরণ করে এমন একটি অংশে '<ph name="INVALIDCHARACTER" />' চিহ্ন থাকা উচিত নয়৷</translation>
 <translation id="3846214748874656680">পূর্ণস্ক্রীন থেকে প্রস্থান করুন</translation>
-<translation id="3904511540324382638">ছবির-মধ্যে-ছবি মোড থেকে বেরিয়ে আসুন</translation>
 <translation id="3920932319529768807">সিদ্ধান্ত</translation>
 <translation id="3924558731517983934">অ্যাপ্লিকেশান</translation>
 <translation id="3944740393230681990">ভূমিকা</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">পরিশিষ্ট</translation>
 <translation id="6209276755895393898">মনে হচ্ছে: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">শব্দকোষ</translation>
-<translation id="628938136236500310">ছবির-মধ্যে-ছবি মোডে চালানো হচ্ছে</translation>
+<translation id="6310801910862476708">ছবির-মধ্যে-ছবি মোড থেকে বেরিয়ে আসুন</translation>
 <translation id="6398862346408813489">মাস নির্বাচনের প্যানেল দেখান</translation>
 <translation id="6404546809543547843">অডিও সময় স্ক্রাবার</translation>
 <translation id="6443871981718447451">ক্লোজড ক্যাপশনের মেনু দেখান</translation>
diff --git a/content/app/strings/translations/content_strings_ca.xtb b/content/app/strings/translations/content_strings_ca.xtb
index 949011d..9e0fe41 100644
--- a/content/app/strings/translations/content_strings_ca.xtb
+++ b/content/app/strings/translations/content_strings_ca.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Introduïu una llista d'adreces electròniques separades per comes.</translation>
 <translation id="2940813599313844715">objecte</translation>
 <translation id="2942448076852699108">contingut realçat</translation>
-<translation id="2983835398644161987">Surt del mode de pantalla en pantalla</translation>
 <translation id="3040011195152428237">enllaç</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Introduïu un valor vàlid. El camp està incomplet o conté una data no vàlida.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Allargueu aquest text fins a un mínim de <ph name="MIN_CHARACTERS" /> caràcters (ara n'utilitzeu <ph name="CURRENT_LENGTH" />).</translation>
 <translation id="383465348367842624">Un nom d'usuari seguit de "<ph name="ATSIGN" />" no pot contenir el símbol "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Surt de la pantalla completa</translation>
-<translation id="3904511540324382638">Surt del mode de pantalla en pantalla</translation>
 <translation id="3920932319529768807">conclusió</translation>
 <translation id="3924558731517983934">aplicació</translation>
 <translation id="3944740393230681990">pròleg</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">cloenda</translation>
 <translation id="6209276755895393898">Sembla el següent: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glossari</translation>
-<translation id="628938136236500310">El vídeo s'està reproduint en mode de pantalla en pantalla</translation>
+<translation id="6310801910862476708">Surt del mode de pantalla en pantalla</translation>
 <translation id="6398862346408813489">Mostra el tauler de la selecció de mes</translation>
 <translation id="6404546809543547843">barra de moment de l'àudio</translation>
 <translation id="6443871981718447451">mostra el menú de subtítols</translation>
diff --git a/content/app/strings/translations/content_strings_cs.xtb b/content/app/strings/translations/content_strings_cs.xtb
index b33a052..4c5e31f9 100644
--- a/content/app/strings/translations/content_strings_cs.xtb
+++ b/content/app/strings/translations/content_strings_cs.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Zadejte seznam e-mailových adres oddělených čárkami.</translation>
 <translation id="2940813599313844715">objekt</translation>
 <translation id="2942448076852699108">zvýrazněný obsah</translation>
-<translation id="2983835398644161987">Ukončit režim obrazu v obraze</translation>
 <translation id="3040011195152428237">odkaz</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Zadejte prosím platnou hodnotu. Pole obsahuje neúplnou hodnotu nebo neplatné datum.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Prodlužte prosím tento text na <ph name="MIN_CHARACTERS" /> či více znaků. (Aktuálně má <ph name="CURRENT_LENGTH" /> znaků.)</translation>
 <translation id="383465348367842624">Část před znakem <ph name="ATSIGN" /> nesmí obsahovat znak <ph name="INVALIDCHARACTER" />.</translation>
 <translation id="3846214748874656680">Ukončit režim na celou obrazovku</translation>
-<translation id="3904511540324382638">Ukončit režim obrazu v obraze</translation>
 <translation id="3920932319529768807">závěr</translation>
 <translation id="3924558731517983934">aplikace</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">doslov</translation>
 <translation id="6209276755895393898">Vypadá jako: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosář</translation>
-<translation id="628938136236500310">Přehrávání v režimu obraz v obraze</translation>
+<translation id="6310801910862476708">Ukončit režim obrazu v obraze</translation>
 <translation id="6398862346408813489">Zobrazit panel pro výběr měsíců</translation>
 <translation id="6404546809543547843">posuvník času zvuku</translation>
 <translation id="6443871981718447451">zobrazit nabídku skrytých titulků</translation>
diff --git a/content/app/strings/translations/content_strings_da.xtb b/content/app/strings/translations/content_strings_da.xtb
index 6579a3d..e0f75022 100644
--- a/content/app/strings/translations/content_strings_da.xtb
+++ b/content/app/strings/translations/content_strings_da.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Angiv en kommasepareret liste over mailadresser.</translation>
 <translation id="2940813599313844715">objekt</translation>
 <translation id="2942448076852699108">fremhævet indhold</translation>
-<translation id="2983835398644161987">Afslut integreret billede</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Angiv en gyldig værdi. Feltet er ufuldstændigt eller har en ugyldig dato.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Forlæng denne tekst til <ph name="MIN_CHARACTERS" /> eller flere tegn (du bruger i øjeblikket <ph name="CURRENT_LENGTH" /> tegn).</translation>
 <translation id="383465348367842624">Den del, der kommer før "<ph name="ATSIGN" />", må ikke indeholde "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Afslut fuld skærm</translation>
-<translation id="3904511540324382638">Afslut integreret billede</translation>
 <translation id="3920932319529768807">konklusion</translation>
 <translation id="3924558731517983934">applikation</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">efterskrift</translation>
 <translation id="6209276755895393898">Det lader til at være: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">ordliste</translation>
-<translation id="628938136236500310">Afspiller i tilstanden med integreret billede</translation>
+<translation id="6310801910862476708">Afslut integreret billede</translation>
 <translation id="6398862346408813489">Vis panel til valg af måned</translation>
 <translation id="6404546809543547843">afspilningsbjælke for lyd</translation>
 <translation id="6443871981718447451">vis menuen for undertekster</translation>
diff --git a/content/app/strings/translations/content_strings_de.xtb b/content/app/strings/translations/content_strings_de.xtb
index 385ded9..2f82be38 100644
--- a/content/app/strings/translations/content_strings_de.xtb
+++ b/content/app/strings/translations/content_strings_de.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Geben Sie eine durch Kommas getrennte Liste der E-Mail-Adressen ein.</translation>
 <translation id="2940813599313844715">Objekt</translation>
 <translation id="2942448076852699108">markierte Inhalte</translation>
-<translation id="2983835398644161987">Bild-in-Bild-Modus beenden</translation>
 <translation id="3040011195152428237">Link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Geben Sie einen gültigen Wert ein. Das Feld ist nicht vollständig oder enthält ein ungültiges Datum.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Verlängern Sie diesen Text auf mindestens <ph name="MIN_CHARACTERS" /> Zeichen. Derzeit verwenden Sie <ph name="CURRENT_LENGTH" /> Zeichen.</translation>
 <translation id="383465348367842624">Vor dem <ph name="ATSIGN" />-Zeichen darf das Zeichen "<ph name="INVALIDCHARACTER" />" nicht verwendet werden.</translation>
 <translation id="3846214748874656680">Vollbildmodus beenden</translation>
-<translation id="3904511540324382638">Bild-in-Bild-Modus beenden</translation>
 <translation id="3920932319529768807">Fazit</translation>
 <translation id="3924558731517983934">Anwendung</translation>
 <translation id="3944740393230681990">Prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">Nachwort</translation>
 <translation id="6209276755895393898">Anscheinend ist es: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">Glossar</translation>
-<translation id="628938136236500310">Bild-im-Bild-Modus aktiv</translation>
+<translation id="6310801910862476708">Bild-im-Bild-Modus beenden</translation>
 <translation id="6398862346408813489">Auswahlbereich für Monatsanzeige</translation>
 <translation id="6404546809543547843">Audio-Zeitachse</translation>
 <translation id="6443871981718447451">Untertitelmenü einblenden</translation>
diff --git a/content/app/strings/translations/content_strings_el.xtb b/content/app/strings/translations/content_strings_el.xtb
index 778268f..047c354 100644
--- a/content/app/strings/translations/content_strings_el.xtb
+++ b/content/app/strings/translations/content_strings_el.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Εισαγάγετε μια λίστα διευθύνσεων ηλεκτρονικού ταχυδρομείου διαχωρισμένη με κόμματα.</translation>
 <translation id="2940813599313844715">αντικείμενο</translation>
 <translation id="2942448076852699108">επισημασμένο περιεχόμενο</translation>
-<translation id="2983835398644161987">Έξοδος από τη λειτουργία picture-in-picture</translation>
 <translation id="3040011195152428237">σύνδεσμος</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Καταχωρίστε μια έγκυρη τιμή. Το πεδίο είναι ελλιπές ή περιέχει μη έγκυρη ημερομηνία.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Αυξήστε την έκταση αυτού του κειμένου στους <ph name="MIN_CHARACTERS" /> χαρακτήρες ή περισσότερο (αυτήν τη στιγμή χρησιμοποιείτε <ph name="CURRENT_LENGTH" /> χαρακτήρες).</translation>
 <translation id="383465348367842624">Το τμήμα της διεύθυνσης πριν το σύμβολο "<ph name="ATSIGN" />" δεν πρέπει να περιέχει το σύμβολο "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Έξοδος από πλήρη οθόνη</translation>
-<translation id="3904511540324382638">Έξοδος από τη λειτουργία picture-in-picture</translation>
 <translation id="3920932319529768807">συμπέρασμα</translation>
 <translation id="3924558731517983934">εφαρμογή</translation>
 <translation id="3944740393230681990">πρόλογος</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">επίλογος</translation>
 <translation id="6209276755895393898">Φαίνεται πως είναι: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">γλωσσάρι</translation>
-<translation id="628938136236500310">Αναπαραγωγή στη λειτουργία picture-in-picture</translation>
+<translation id="6310801910862476708">Έξοδος από τη λειτουργία Picture-in-Picture</translation>
 <translation id="6398862346408813489">Εμφάνιση παραθύρου επιλογής μήνα</translation>
 <translation id="6404546809543547843">δείκτης χρόνου ήχου</translation>
 <translation id="6443871981718447451">εμφάνιση μενού υποτίτλων</translation>
diff --git a/content/app/strings/translations/content_strings_en-GB.xtb b/content/app/strings/translations/content_strings_en-GB.xtb
index 98b03b0..f0e1babf1 100644
--- a/content/app/strings/translations/content_strings_en-GB.xtb
+++ b/content/app/strings/translations/content_strings_en-GB.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Please enter a comma-separated list of email addresses.</translation>
 <translation id="2940813599313844715">object</translation>
 <translation id="2942448076852699108">highlighted content</translation>
-<translation id="2983835398644161987">Exit Picture in Picture</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Please enter a valid value. The field is incomplete or has an invalid date.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Please lengthen this text to <ph name="MIN_CHARACTERS" /> characters or more (you are currently using <ph name="CURRENT_LENGTH" /> characters).</translation>
 <translation id="383465348367842624">A part followed by '<ph name="ATSIGN" />' should not contain the symbol '<ph name="INVALIDCHARACTER" />'.</translation>
 <translation id="3846214748874656680">Exit full screen</translation>
-<translation id="3904511540324382638">Exit picture in picture</translation>
 <translation id="3920932319529768807">conclusion</translation>
 <translation id="3924558731517983934">application</translation>
 <translation id="3944740393230681990">prologue</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">afterword</translation>
 <translation id="6209276755895393898">Appears to be: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glossary</translation>
-<translation id="628938136236500310">Playing in picture-in-picture mode</translation>
+<translation id="6310801910862476708">Exit picture-in-picture</translation>
 <translation id="6398862346408813489">Show month selection panel</translation>
 <translation id="6404546809543547843">audio time scrubber</translation>
 <translation id="6443871981718447451">show closed captions menu</translation>
diff --git a/content/app/strings/translations/content_strings_es-419.xtb b/content/app/strings/translations/content_strings_es-419.xtb
index a81d2a3..8c8faf12 100644
--- a/content/app/strings/translations/content_strings_es-419.xtb
+++ b/content/app/strings/translations/content_strings_es-419.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Ingresa una lista de direcciones de correo electrónico separadas por coma</translation>
 <translation id="2940813599313844715">objeto</translation>
 <translation id="2942448076852699108">contenido destacado</translation>
-<translation id="2983835398644161987">Salir del modo de pantalla en pantalla</translation>
 <translation id="3040011195152428237">enlace</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Debes ingresar un valor válido. El campo está incompleto o contiene una fecha no válida.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Alarga el texto a <ph name="MIN_CHARACTERS" /> o más caracteres (actualmente, usas <ph name="CURRENT_LENGTH" /> caracteres).</translation>
 <translation id="383465348367842624">El texto antes del signo "<ph name="ATSIGN" />" no debe incluir el símbolo "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Salir de pantalla completa</translation>
-<translation id="3904511540324382638">Salir del modo de pantalla en pantalla</translation>
 <translation id="3920932319529768807">conclusión</translation>
 <translation id="3924558731517983934">aplicación</translation>
 <translation id="3944740393230681990">prólogo</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">posfacio</translation>
 <translation id="6209276755895393898">Parece ser: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosario</translation>
-<translation id="628938136236500310">Reproduciendo en modo pantalla en pantalla</translation>
+<translation id="6310801910862476708">Salir del modo de pantalla en pantalla</translation>
 <translation id="6398862346408813489">Mostrar el panel de selección de meses</translation>
 <translation id="6404546809543547843">control deslizante de duración del audio</translation>
 <translation id="6443871981718447451">muestra el menú de subtítulos opcionales</translation>
diff --git a/content/app/strings/translations/content_strings_es.xtb b/content/app/strings/translations/content_strings_es.xtb
index 2f316ea..1260fa2 100644
--- a/content/app/strings/translations/content_strings_es.xtb
+++ b/content/app/strings/translations/content_strings_es.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Introduce una lista de direcciones de correo electrónico separada por comas</translation>
 <translation id="2940813599313844715">objeto</translation>
 <translation id="2942448076852699108">contenido resaltado</translation>
-<translation id="2983835398644161987">Salir del modo imagen en imagen</translation>
 <translation id="3040011195152428237">enlace</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Debes introducir un valor válido. El campo está incompleto o incluye una fecha no válida.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Aumenta la longitud del texto a <ph name="MIN_CHARACTERS" /> caracteres como mínimo (actualmente, el texto tiene <ph name="CURRENT_LENGTH" /> caracteres).</translation>
 <translation id="383465348367842624">El texto seguido del signo "<ph name="ATSIGN" />" no debe incluir el símbolo "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Salir de pantalla completa</translation>
-<translation id="3904511540324382638">Salir del modo imagen en imagen</translation>
 <translation id="3920932319529768807">conclusión</translation>
 <translation id="3924558731517983934">aplicación</translation>
 <translation id="3944740393230681990">prólogo</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">epílogo</translation>
 <translation id="6209276755895393898">Parece que es: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosario</translation>
-<translation id="628938136236500310">Reproduciendo en modo imagen en imagen</translation>
+<translation id="6310801910862476708">Salir del modo imagen en imagen</translation>
 <translation id="6398862346408813489">Mostrar panel para seleccionar el mes</translation>
 <translation id="6404546809543547843">control deslizante de duración de audio</translation>
 <translation id="6443871981718447451">mostrar menú de subtítulos</translation>
diff --git a/content/app/strings/translations/content_strings_et.xtb b/content/app/strings/translations/content_strings_et.xtb
index 56499ab2..f34d4f2 100644
--- a/content/app/strings/translations/content_strings_et.xtb
+++ b/content/app/strings/translations/content_strings_et.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Sisestage meiliaadresside loend komadega eraldatult.</translation>
 <translation id="2940813599313844715">objekt</translation>
 <translation id="2942448076852699108">esiletõstetud sisu</translation>
-<translation id="2983835398644161987">Välju režiimist Pilt pildis</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Sisestage kehtiv väärtus. Väli on täitmata või sisaldab sobimatut kuupäeva.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Pikendage teksti vähemalt <ph name="MIN_CHARACTERS" /> tähemärgini (kasutate praegu <ph name="CURRENT_LENGTH" /> tähemärki).</translation>
 <translation id="383465348367842624">Märgile „<ph name="ATSIGN" />” eelnev osa ei tohi sisaldada sümbolit „<ph name="INVALIDCHARACTER" />”.</translation>
 <translation id="3846214748874656680">Täisekraanilt väljumine</translation>
-<translation id="3904511540324382638">Välju režiimist Pilt pildis</translation>
 <translation id="3920932319529768807">kokkuvõte</translation>
 <translation id="3924558731517983934">rakendus</translation>
 <translation id="3944740393230681990">proloog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">järelsõna</translation>
 <translation id="6209276755895393898">Näib olevat: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">sõnastik</translation>
-<translation id="628938136236500310">Esitatakse režiimis Pilt pildis</translation>
+<translation id="6310801910862476708">Välju režiimist Pilt pildis</translation>
 <translation id="6398862346408813489">Kuu valikupaneeli kuvamine</translation>
 <translation id="6404546809543547843">heli ajamõõdik</translation>
 <translation id="6443871981718447451">kuva subtiitrite menüü</translation>
diff --git a/content/app/strings/translations/content_strings_fa.xtb b/content/app/strings/translations/content_strings_fa.xtb
index 9bc8f758..5a594bfe 100644
--- a/content/app/strings/translations/content_strings_fa.xtb
+++ b/content/app/strings/translations/content_strings_fa.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">لطفاً لیستی از آدرس‌های ایمیل که با کاما از هم جدا شده‌اند را وارد کنید.</translation>
 <translation id="2940813599313844715">شیء</translation>
 <translation id="2942448076852699108">محتوای برجسته شده</translation>
-<translation id="2983835398644161987">خروج از تصویردرتصویر</translation>
 <translation id="3040011195152428237">پیوند</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> مگابایت</translation>
 <translation id="3075154866155599887">لطفاً یک مقدار معتبر وارد کنید. این قسمت کامل نیست و یا تاریخ نامعتبر است.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">لطفاً این نوشتار را به <ph name="MIN_CHARACTERS" /> نویسه یا بیشتر افزایش دهید (درحال حاضر از <ph name="CURRENT_LENGTH" /> نویسه استفاده می‌کنید).</translation>
 <translation id="383465348367842624">قسمت قبل از «<ph name="ATSIGN" />» نباید حاوی نماد «<ph name="INVALIDCHARACTER" />» باشد.</translation>
 <translation id="3846214748874656680">خروج از حالت تمام صفحه</translation>
-<translation id="3904511540324382638">خروج از تصویردرتصویر</translation>
 <translation id="3920932319529768807">نتیجه‌گیری</translation>
 <translation id="3924558731517983934">برنامه</translation>
 <translation id="3944740393230681990">گفتار آغازین</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">سخن پایانی</translation>
 <translation id="6209276755895393898">به‌نظر می‌رسد <ph name="DESCRIPTION" /> باشد</translation>
 <translation id="6213469881011901533">واژه‌نامه</translation>
-<translation id="628938136236500310">پخش درحالت تصویردرتصویر</translation>
+<translation id="6310801910862476708">خروج از تصویر در تصویر</translation>
 <translation id="6398862346408813489">نمایش پانل انتخاب ماه</translation>
 <translation id="6404546809543547843">انتخابگر زمان صدا</translation>
 <translation id="6443871981718447451">نمایش منوی زیرنویس ناشنوایان</translation>
diff --git a/content/app/strings/translations/content_strings_fi.xtb b/content/app/strings/translations/content_strings_fi.xtb
index f9fbc7bf..aad6326 100644
--- a/content/app/strings/translations/content_strings_fi.xtb
+++ b/content/app/strings/translations/content_strings_fi.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Anna pilkuilla erotettu sähköpostiosoitteiden luettelo.</translation>
 <translation id="2940813599313844715">kohde</translation>
 <translation id="2942448076852699108">korostettu sisältö</translation>
-<translation id="2983835398644161987">Sulje kuva kuvassa ‑tila</translation>
 <translation id="3040011195152428237">linkki</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> Mt</translation>
 <translation id="3075154866155599887">Anna kelvollinen arvo. Kentän arvo on puutteellinen tai annettu päivä on virheellinen.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Pidennä tämä teksti yli <ph name="MIN_CHARACTERS" /> merkkiin (tällä hetkellä käytössä <ph name="CURRENT_LENGTH" /> merkkiä).</translation>
 <translation id="383465348367842624"><ph name="ATSIGN" />-osaa ennen tulevassa osassa ei pitäisi olla merkkiä <ph name="INVALIDCHARACTER" />.</translation>
 <translation id="3846214748874656680">Sulje koko näytön tila.</translation>
-<translation id="3904511540324382638">Sulje kuva kuvassa ‑tila</translation>
 <translation id="3920932319529768807">johtopäätös</translation>
 <translation id="3924558731517983934">sovellus</translation>
 <translation id="3944740393230681990">prologi</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">jälkipuhe</translation>
 <translation id="6209276755895393898">Näkyy olevan: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">sanasto</translation>
-<translation id="628938136236500310">Toistetaan kuva kuvassa ‑tilassa</translation>
+<translation id="6310801910862476708">Sulje kuva kuvassa ‑tila</translation>
 <translation id="6398862346408813489">Näytä kuukaudenvalintapaneeli</translation>
 <translation id="6404546809543547843">äänen ajan liukusäädin</translation>
 <translation id="6443871981718447451">näytä tekstitysvalikko</translation>
diff --git a/content/app/strings/translations/content_strings_fil.xtb b/content/app/strings/translations/content_strings_fil.xtb
index 07ddeed9..8808c6a9 100644
--- a/content/app/strings/translations/content_strings_fil.xtb
+++ b/content/app/strings/translations/content_strings_fil.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Mangyaring magpasok ng listahan ng email address na pinaghihiwalay ng kuwit.</translation>
 <translation id="2940813599313844715">object</translation>
 <translation id="2942448076852699108">naka-highlight na content</translation>
-<translation id="2983835398644161987">Lumabas sa Picture in Picture</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> (na) MB</translation>
 <translation id="3075154866155599887">Mangyaring maglagay ng wastong halaga. Hindi kumpleto ang field o may isang di-wastong petsa.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Pakihabaan ang text na ito hanggang <ph name="MIN_CHARACTERS" /> (na) character o higit pa (kasalukuyan kang gumagamit ng <ph name="CURRENT_LENGTH" /> (na) character).</translation>
 <translation id="383465348367842624">Hindi dapat naglalaman ng simbolong '<ph name="INVALIDCHARACTER" />' ang bahagi bago ang '<ph name="ATSIGN" />.'</translation>
 <translation id="3846214748874656680">Lumabas sa fullscreen</translation>
-<translation id="3904511540324382638">Lumabas sa picture in picture</translation>
 <translation id="3920932319529768807">konklusyon</translation>
 <translation id="3924558731517983934">application</translation>
 <translation id="3944740393230681990">prologue</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">afterword</translation>
 <translation id="6209276755895393898">Mukhang: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosaryo</translation>
-<translation id="628938136236500310">Nagpe-play sa picture-in-picture mode</translation>
+<translation id="6310801910862476708">Lumabas sa Picture-in-Picture</translation>
 <translation id="6398862346408813489">Ipakita ang panel ng pagpipilian ng buwan</translation>
 <translation id="6404546809543547843">scrubber ng oras ng audio</translation>
 <translation id="6443871981718447451">Ipakita ang menu ng mga nakasarang caption</translation>
diff --git a/content/app/strings/translations/content_strings_fr.xtb b/content/app/strings/translations/content_strings_fr.xtb
index 6b3b7c27..38117ec5 100644
--- a/content/app/strings/translations/content_strings_fr.xtb
+++ b/content/app/strings/translations/content_strings_fr.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Veuillez saisir une liste d'adresses e-mail séparées par une virgule.</translation>
 <translation id="2940813599313844715">objet</translation>
 <translation id="2942448076852699108">contenu en surbrillance</translation>
-<translation id="2983835398644161987">Quitter le mode PIP (Picture-in-Picture)</translation>
 <translation id="3040011195152428237">Lien</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> Mo</translation>
 <translation id="3075154866155599887">Veuillez saisir une valeur valide. Le champ n'est pas complet ou contient une date non valide.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Veuillez allonger ce texte pour qu'il comporte au moins <ph name="MIN_CHARACTERS" /> caractères. Il en compte actuellement <ph name="CURRENT_LENGTH" />.</translation>
 <translation id="383465348367842624">La partie suivie du symbole "<ph name="ATSIGN" />" ne doit pas contenir le caractère "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Quitter le mode plein écran</translation>
-<translation id="3904511540324382638">Quitter le mode PIP (Picture-in-Picture)</translation>
 <translation id="3920932319529768807">conclusion</translation>
 <translation id="3924558731517983934">application</translation>
 <translation id="3944740393230681990">prologue</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">postface</translation>
 <translation id="6209276755895393898">L'image représente probablement : <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glossaire</translation>
-<translation id="628938136236500310">Lecture en mode Picture-in-picture</translation>
+<translation id="6310801910862476708">Quitter le mode PIP (Picture-in-picture)</translation>
 <translation id="6398862346408813489">Afficher le panneau de sélection du mois</translation>
 <translation id="6404546809543547843">curseur durée audio</translation>
 <translation id="6443871981718447451">afficher le menu des sous-titres</translation>
diff --git a/content/app/strings/translations/content_strings_gu.xtb b/content/app/strings/translations/content_strings_gu.xtb
index 3fcd26e..30efa6f 100644
--- a/content/app/strings/translations/content_strings_gu.xtb
+++ b/content/app/strings/translations/content_strings_gu.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">કૃપા કરીને અલ્પવિરામથી વિભાજિત ઇમેઇલ સરનામાંઓની સૂચિ દાખલ કરો.</translation>
 <translation id="2940813599313844715">ઑબ્જેક્ટ</translation>
 <translation id="2942448076852699108">હાઇલાઇટ કરેલું કન્ટેન્ટ</translation>
-<translation id="2983835398644161987">ચિત્રમાં ચિત્રમાંથી બહાર નીકળો</translation>
 <translation id="3040011195152428237">લિંક</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" />MB</translation>
 <translation id="3075154866155599887">કૃપા કરીને માન્ય કિંમત દાખલ કરો. ફીલ્ડ અપૂર્ણ છે અથવા અમાન્ય તારીખ ધરાવે છે.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">કૃપા કરીને આ ટેક્સ્ટને <ph name="MIN_CHARACTERS" /> અક્ષર અથવા તેથી વધુ સુધી લંબાવો (તમે હાલમાં <ph name="CURRENT_LENGTH" /> અક્ષરોનો ઉપયોગ કરી રહ્યાં છો).</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />' દ્વારા અનુસરાઈ રહેલા ભાગમાં '<ph name="INVALIDCHARACTER" />' પ્રતીક શામેલ હોવું જોઈએ નહીં.</translation>
 <translation id="3846214748874656680">પૂર્ણસ્ક્રીનથી બહાર નીકળો</translation>
-<translation id="3904511540324382638">ચિત્રમાં ચિત્રમાંથી બહાર નીકળો</translation>
 <translation id="3920932319529768807">સારાંશ</translation>
 <translation id="3924558731517983934">ઍપ્લિકેશન</translation>
 <translation id="3944740393230681990">પ્રસ્તાવના</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">સમાપન ભાષણ</translation>
 <translation id="6209276755895393898">આના જેવું જણાય છે: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">શબ્દાવલી</translation>
-<translation id="628938136236500310">વીડિયો ચિત્ર-માં-ચિત્ર મોડમાં ચાલી રહ્યો છે</translation>
+<translation id="6310801910862476708">ચિત્ર-માં-ચિત્રમાંથી બહાર નીકળો</translation>
 <translation id="6398862346408813489">મહિના પસંદગી પેનલ દર્શાવો</translation>
 <translation id="6404546809543547843">ઑડિઓ સમય સ્ક્રબર</translation>
 <translation id="6443871981718447451">બંધ કરેલું ઉપશીર્ષક મેનૂ દર્શાવો</translation>
diff --git a/content/app/strings/translations/content_strings_hi.xtb b/content/app/strings/translations/content_strings_hi.xtb
index f3f7e5db..c7b94da 100644
--- a/content/app/strings/translations/content_strings_hi.xtb
+++ b/content/app/strings/translations/content_strings_hi.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">कृपया ईमेल पतों की अल्पविराम द्वारा विभाजित सूची दर्ज करें.</translation>
 <translation id="2940813599313844715">ऑब्जेक्ट</translation>
 <translation id="2942448076852699108">हाइलाइट की गई सामग्री</translation>
-<translation id="2983835398644161987">'पिक्चर में पिक्चर' सुविधा से बाहर निकलें</translation>
 <translation id="3040011195152428237">संपर्क</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> एमबी</translation>
 <translation id="3075154866155599887">कृपया सही मान डालें. फ़ील्ड अधूरी है या उसमें डाली गई तारीख गलत है.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">कृपया इस लेख को <ph name="MIN_CHARACTERS" /> वर्णों या ज़्यादा तक बढ़ाएं (वर्तमान में आप <ph name="CURRENT_LENGTH" /> वर्णों का उपयोग कर रहे हैं).</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />' के बाद आने वाले भाग में '<ph name="INVALIDCHARACTER" />' प्रतीक शामिल नहीं होना चाहिए.</translation>
 <translation id="3846214748874656680">पूर्णस्क्रीन से बाहर निकलें</translation>
-<translation id="3904511540324382638">'पिक्चर में पिक्चर' सुविधा से बाहर निकलें</translation>
 <translation id="3920932319529768807">निष्कर्ष</translation>
 <translation id="3924558731517983934">ऐप्लिकेशन</translation>
 <translation id="3944740393230681990">प्रस्तावना</translation>
@@ -126,7 +124,7 @@
 <translation id="5406322316791861025">आकृति</translation>
 <translation id="5453733299334684579">ट्री आइटम</translation>
 <translation id="5466621249238537318">कृपया एक या ज़्यादा फ़ाइल को चुनें.</translation>
-<translation id="5468998798572797635">पूर्ण स्क्रीन से बाहर निकलें</translation>
+<translation id="5468998798572797635">फ़ुल स्क्रीन से बाहर निकलें</translation>
 <translation id="5516424706154626233">तारीख पिकर</translation>
 <translation id="5537725057119320332">कास्‍ट करें</translation>
 <translation id="5546461542133609677">अनम्यूट करें</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">उपसंहार</translation>
 <translation id="6209276755895393898">यह इमेज इस बारे में लगती है: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">शब्दावली</translation>
-<translation id="628938136236500310">'पिक्चर में पिक्चर' मोड में चल रहा है</translation>
+<translation id="6310801910862476708">'पिक्चर में पिक्चर से बाहर निकलें'</translation>
 <translation id="6398862346408813489">महीना चुनने का पैनल दिखाएं</translation>
 <translation id="6404546809543547843">ऑडियो समय स्क्रबर</translation>
 <translation id="6443871981718447451">बंद कैप्‍शन मेन्यू दिखाएं</translation>
@@ -159,7 +157,7 @@
 <translation id="648732519525291180">समय पिकर</translation>
 <translation id="6550675742724504774">विकल्प</translation>
 <translation id="6572309429103589720">गलत व्याकरण</translation>
-<translation id="658823671542763450">पूर्ण स्क्रीन में प्रवेश करें</translation>
+<translation id="658823671542763450">फ़ुल स्क्रीन में प्रवेश करें</translation>
 <translation id="663493177488814956">फ़ीड</translation>
 <translation id="6637586476836377253">लॉग</translation>
 <translation id="6643016212128521049">साफ़ करें</translation>
diff --git a/content/app/strings/translations/content_strings_hr.xtb b/content/app/strings/translations/content_strings_hr.xtb
index a83f211..837e5b6 100644
--- a/content/app/strings/translations/content_strings_hr.xtb
+++ b/content/app/strings/translations/content_strings_hr.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Unesite popis adresa e-pošte odijeljen zarezima.</translation>
 <translation id="2940813599313844715">objekt</translation>
 <translation id="2942448076852699108">istaknuti sadržaj</translation>
-<translation id="2983835398644161987">Izlaz iz načina slika u slici</translation>
 <translation id="3040011195152428237">veza</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Unesite važeću vrijednost. Ovo je polje nepotpuno ili sadrži nevažeći datum.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Produljite broj znakova u tekstu na minimalno <ph name="MIN_CHARACTERS" />. Trenutačno imate premalo znakova (<ph name="CURRENT_LENGTH" />).</translation>
 <translation id="383465348367842624">Dio adrese ispred znaka "<ph name="ATSIGN" />" ne smije sadržavati simbol "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Izlaz iz punog zaslona</translation>
-<translation id="3904511540324382638">Izlaz iz načina slika u slici</translation>
 <translation id="3920932319529768807">zaključak</translation>
 <translation id="3924558731517983934">aplikacija</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">pogovor</translation>
 <translation id="6209276755895393898">Čini se da je to: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">pojmovnik</translation>
-<translation id="628938136236500310">Reproducira se u načinu slika u slici</translation>
+<translation id="6310801910862476708">Izlaz iz načina slika u slici</translation>
 <translation id="6398862346408813489">Prikaži ploču za odabir mjeseca</translation>
 <translation id="6404546809543547843">klizač vremena audiozapisa</translation>
 <translation id="6443871981718447451">prikaži izbornik titlova</translation>
diff --git a/content/app/strings/translations/content_strings_hu.xtb b/content/app/strings/translations/content_strings_hu.xtb
index 045de3b..ed5a6d15 100644
--- a/content/app/strings/translations/content_strings_hu.xtb
+++ b/content/app/strings/translations/content_strings_hu.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Kérjük, adjon meg egy vesszőkkel elválasztott e-mail címlistát.</translation>
 <translation id="2940813599313844715">objektum</translation>
 <translation id="2942448076852699108">kijelölt tartalom</translation>
-<translation id="2983835398644161987">Kilépés a kép a képben módból</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Kérjük, adjon meg érvényes értéket. A mező hiányos, vagy érvénytelen dátum van megadva.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Kérjük, <ph name="MIN_CHARACTERS" /> karakter hosszú vagy annál hosszabb szöveget adjon meg (jelenleg <ph name="CURRENT_LENGTH" /> karaktert használ).</translation>
 <translation id="383465348367842624">A „<ph name="ATSIGN" />” előtti rész nem tartalmazhat „<ph name="INVALIDCHARACTER" />” karaktert.</translation>
 <translation id="3846214748874656680">Teljes képernyő – ki</translation>
-<translation id="3904511540324382638">Kilépés a kép a képben módból</translation>
 <translation id="3920932319529768807">összefoglalás</translation>
 <translation id="3924558731517983934">alkalmazás</translation>
 <translation id="3944740393230681990">prológus</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">utószó</translation>
 <translation id="6209276755895393898">Úgy tűnik, hogy a következőről van szó: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">szószedet</translation>
-<translation id="628938136236500310">Lejátszás kép a képben módban</translation>
+<translation id="6310801910862476708">Kilépés a kép a képben funkcióból</translation>
 <translation id="6398862346408813489">A hónapválasztási panel megjelenítése</translation>
 <translation id="6404546809543547843">hang idővonalának vezérlője</translation>
 <translation id="6443871981718447451">a feliratok menü mutatása</translation>
diff --git a/content/app/strings/translations/content_strings_id.xtb b/content/app/strings/translations/content_strings_id.xtb
index 98360fe8..2756f60 100644
--- a/content/app/strings/translations/content_strings_id.xtb
+++ b/content/app/strings/translations/content_strings_id.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Masukkan daftar alamat email yang dipisahkan dengan koma.</translation>
 <translation id="2940813599313844715">objek</translation>
 <translation id="2942448076852699108">konten yang disorot</translation>
-<translation id="2983835398644161987">Keluar dari Mode Picture-in-Picture</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Masukkan nilai yang valid. Bidang tersebut tidak lengkap atau memiliki tanggal yang tidak valid.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Perpanjang teks ini hingga <ph name="MIN_CHARACTERS" /> karakter atau lebih (saat ini Anda menggunakan <ph name="CURRENT_LENGTH" /> karakter).</translation>
 <translation id="383465348367842624">Bagian sebelum '<ph name="ATSIGN" />' tidak boleh berisi simbol '<ph name="INVALIDCHARACTER" />'.</translation>
 <translation id="3846214748874656680">Keluar dari layar penuh</translation>
-<translation id="3904511540324382638">Keluar dari mode picture-in-picture</translation>
 <translation id="3920932319529768807">kesimpulan</translation>
 <translation id="3924558731517983934">aplikasi</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">penutup</translation>
 <translation id="6209276755895393898">Muncul sebagai: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosarium</translation>
-<translation id="628938136236500310">Memutar dalam mode picture-in-picture</translation>
+<translation id="6310801910862476708">Keluar dari Mode Picture-in-Picture</translation>
 <translation id="6398862346408813489">Tampilkan panel pilihan bulan</translation>
 <translation id="6404546809543547843">scrubber waktu audio</translation>
 <translation id="6443871981718447451">tampilkan menu subtitel</translation>
diff --git a/content/app/strings/translations/content_strings_it.xtb b/content/app/strings/translations/content_strings_it.xtb
index daac211..a960296 100644
--- a/content/app/strings/translations/content_strings_it.xtb
+++ b/content/app/strings/translations/content_strings_it.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Inserisci un elenco di indirizzi email separati da virgola.</translation>
 <translation id="2940813599313844715">oggetto</translation>
 <translation id="2942448076852699108">contenuti evidenziati</translation>
-<translation id="2983835398644161987">Esci da Picture in picture</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Inserisci un valore valido. Il campo è incompleto o presenta una data non valida.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Prolunga questo testo a <ph name="MIN_CHARACTERS" /> o più caratteri (al momento stai utilizzando <ph name="CURRENT_LENGTH" /> caratteri).</translation>
 <translation id="383465348367842624">Una parte seguita da "<ph name="ATSIGN" />" non deve contenere il simbolo "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Esci da schermo intero</translation>
-<translation id="3904511540324382638">Esci da Picture in picture</translation>
 <translation id="3920932319529768807">conclusioni</translation>
 <translation id="3924558731517983934">applicazione</translation>
 <translation id="3944740393230681990">prologo</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">postfazione</translation>
 <translation id="6209276755895393898">Sembra che sia: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glossario</translation>
-<translation id="628938136236500310">Riprodotto in modalità Picture in picture</translation>
+<translation id="6310801910862476708">Esci da Picture in picture</translation>
 <translation id="6398862346408813489">Mostra il riquadro di selezione del mese</translation>
 <translation id="6404546809543547843">dispositivo di scorrimento durata audio</translation>
 <translation id="6443871981718447451">mostra menu sottotitoli</translation>
diff --git a/content/app/strings/translations/content_strings_iw.xtb b/content/app/strings/translations/content_strings_iw.xtb
index 9cb3b47..c17a27c61 100644
--- a/content/app/strings/translations/content_strings_iw.xtb
+++ b/content/app/strings/translations/content_strings_iw.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">הזן רשימה של כתובות אימייל המופרדות באמצעות פסיקים.</translation>
 <translation id="2940813599313844715">אובייקט</translation>
 <translation id="2942448076852699108">תוכן מודגש</translation>
-<translation id="2983835398644161987">יציאה ממצב 'תמונה בתוך תמונה'</translation>
 <translation id="3040011195152428237">קישור</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">הזן ערך חוקי. השדה ריק או שהוא מכיל תאריך לא חוקי.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">הארך טקסט זה ל-<ph name="MIN_CHARACTERS" /> תווים או יותר (אתה משתמש כרגע ב-<ph name="CURRENT_LENGTH" /> תווים).</translation>
 <translation id="383465348367842624">חלק ולאחריו '<ph name="ATSIGN" />' לא אמור לכלול את הסמל '<ph name="INVALIDCHARACTER" />'.</translation>
 <translation id="3846214748874656680">צא ממסך מלא</translation>
-<translation id="3904511540324382638">יציאה ממצב 'תמונה בתוך תמונה'</translation>
 <translation id="3920932319529768807">סיכום</translation>
 <translation id="3924558731517983934">יישום</translation>
 <translation id="3944740393230681990">פרולוג</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">אחרית דבר</translation>
 <translation id="6209276755895393898">נראה כמו: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">מילון מונחים</translation>
-<translation id="628938136236500310">פועל במצב תמונה בתוך תמונה</translation>
+<translation id="6310801910862476708">יציאה ממצב 'תמונה בתוך תמונה'</translation>
 <translation id="6398862346408813489">הצג חלונית לבחירת חודש</translation>
 <translation id="6404546809543547843">מסתיר משך אודיו</translation>
 <translation id="6443871981718447451">הצגת תפריט כתוביות</translation>
diff --git a/content/app/strings/translations/content_strings_ja.xtb b/content/app/strings/translations/content_strings_ja.xtb
index 2eacb834..af9ce7e 100644
--- a/content/app/strings/translations/content_strings_ja.xtb
+++ b/content/app/strings/translations/content_strings_ja.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">メール アドレスのカンマ区切りリストを入力してください。</translation>
 <translation id="2940813599313844715">オブジェクト</translation>
 <translation id="2942448076852699108">ハイライト表示されたコンテンツ</translation>
-<translation id="2983835398644161987">ピクチャー イン ピクチャーを終了</translation>
 <translation id="3040011195152428237">リンク</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">有効な値を入力してください。フィールドの入力が不完全か、日付が無効です。</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">このテキストは <ph name="MIN_CHARACTERS" /> 文字以上で指定してください(現在は <ph name="CURRENT_LENGTH" /> 文字です)。</translation>
 <translation id="383465348367842624">「<ph name="ATSIGN" />」の前の文字列に記号「<ph name="INVALIDCHARACTER" />」を使用しないでください。</translation>
 <translation id="3846214748874656680">全画面表示を終了</translation>
-<translation id="3904511540324382638">ピクチャー イン ピクチャーを終了</translation>
 <translation id="3920932319529768807">まとめ</translation>
 <translation id="3924558731517983934">アプリケーション</translation>
 <translation id="3944740393230681990">プロローグ</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">後書き</translation>
 <translation id="6209276755895393898"><ph name="DESCRIPTION" /> の画像のようです</translation>
 <translation id="6213469881011901533">用語集</translation>
-<translation id="628938136236500310">ピクチャー イン ピクチャー モードで再生しています</translation>
+<translation id="6310801910862476708">ピクチャー イン ピクチャーを終了</translation>
 <translation id="6398862346408813489">月選択パネルを表示</translation>
 <translation id="6404546809543547843">オーディオ再生バー</translation>
 <translation id="6443871981718447451">字幕メニューを表示</translation>
diff --git a/content/app/strings/translations/content_strings_kn.xtb b/content/app/strings/translations/content_strings_kn.xtb
index bdf0b5c..58a4256 100644
--- a/content/app/strings/translations/content_strings_kn.xtb
+++ b/content/app/strings/translations/content_strings_kn.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">ದಯವಿಟ್ಟು ಅಲ್ಪ ವಿರಾಮದಿಂದ ಬೇರ್ಪಡಿಸಿದ ಇಮೇಲ್ ವಿಳಾಸಗಳ ಪಟ್ಟಿಯನ್ನು ನಮೂದಿಸಿ.</translation>
 <translation id="2940813599313844715">ವಸ್ತು</translation>
 <translation id="2942448076852699108">ಹೈಲೈಟ್ ಮಾಡಲಾದ ವಿಷಯ</translation>
-<translation id="2983835398644161987">ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೋಡ್‌ನಿಂದ ನಿರ್ಗಮಿಸಿ</translation>
 <translation id="3040011195152428237">ಲಿಂಕ್</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">ದಯವಿಟ್ಟು ಮಾನ್ಯ ಮೌಲ್ಯವನ್ನು ನಮೂದಿಸಿ. ಕ್ಷೇತ್ರವು ಅಪೂರ್ಣವಾಗಿದೆ ಅಥವಾ ಅಮಾನ್ಯ ದಿನಾಂಕವನ್ನು ಹೊಂದಿದೆ.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">ಈ ಪಠ್ಯವನ್ನು <ph name="MIN_CHARACTERS" /> ಅಕ್ಷರಗಳಿಗೆ ಅಥವಾ ಅದಕ್ಕಿಂತಲೂ ಹೆಚ್ಚಿಗೆ ಸೀಮಿತಗೊಳಿಸಿ (ನೀವು ಪ್ರಸ್ತುತವಾಗಿ <ph name="CURRENT_LENGTH" /> ಅಕ್ಷರಗಳನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ).</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />' ನಂತರದ ಭಾಗವು '<ph name="INVALIDCHARACTER" />' ಚಿಹ್ನೆಯನ್ನು ಒಳಗೊಂಡಿರಬಾರದು.</translation>
 <translation id="3846214748874656680">ಪೂರ್ಣಪರದೆಯಿಂದ ನಿರ್ಗಮಿಸಿ</translation>
-<translation id="3904511540324382638">ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೋಡ್‌ನಿಂದ ನಿರ್ಗಮಿಸಿ</translation>
 <translation id="3920932319529768807">ತೀರ್ಮಾನ</translation>
 <translation id="3924558731517983934">ಅಪ್ಲಿಕೇಶನ್</translation>
 <translation id="3944740393230681990">ಪೀಠಿಕೆ</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">ನಂತರದ</translation>
 <translation id="6209276755895393898">ಹೀಗೆ ಕಾಣಿಸುತ್ತಿದೆ: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">ಪದಕೋಶ</translation>
-<translation id="628938136236500310">ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೋಡ್‌ನಲ್ಲಿ ಪ್ಲೇ ಆಗುತ್ತಿದೆ</translation>
+<translation id="6310801910862476708">ಚಿತ್ರದಲ್ಲಿನ ಚಿತ್ರದಿಂದ ನಿರ್ಗಮಿಸಿ</translation>
 <translation id="6398862346408813489">ತಿಂಗಳ ಆಯ್ಕೆ ಪ್ಯಾನಲ್ ತೋರಿಸಿ</translation>
 <translation id="6404546809543547843">ಆಡಿಯೊ ಸಮಯ ಸ್ಕ್ರಬ್ಬರ್</translation>
 <translation id="6443871981718447451">ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಗಳ ಮೆನುವನ್ನು ತೋರಿಸಿ</translation>
diff --git a/content/app/strings/translations/content_strings_ko.xtb b/content/app/strings/translations/content_strings_ko.xtb
index 8935e3e..0df93146 100644
--- a/content/app/strings/translations/content_strings_ko.xtb
+++ b/content/app/strings/translations/content_strings_ko.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">이메일 주소를 쉼표로 구분하여 입력하세요.</translation>
 <translation id="2940813599313844715">객체</translation>
 <translation id="2942448076852699108">강조표시된 콘텐츠</translation>
-<translation id="2983835398644161987">PIP 모드 종료</translation>
 <translation id="3040011195152428237">링크</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" />MB</translation>
 <translation id="3075154866155599887">유효한 값을 입력하세요. 입력을 완료하지 않았거나 날짜가 잘못되었습니다.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">이 텍스트를 <ph name="MIN_CHARACTERS" />자 이상으로 늘리세요(현재 <ph name="CURRENT_LENGTH" />자 사용 중).</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />' 앞 부분에 '<ph name="INVALIDCHARACTER" />' 기호가 포함되면 안됩니다.</translation>
 <translation id="3846214748874656680">전체화면 종료</translation>
-<translation id="3904511540324382638">PIP 모드 종료</translation>
 <translation id="3920932319529768807">결론</translation>
 <translation id="3924558731517983934">애플리케이션</translation>
 <translation id="3944740393230681990">프롤로그</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">후기</translation>
 <translation id="6209276755895393898"><ph name="DESCRIPTION" /> 같습니다</translation>
 <translation id="6213469881011901533">용어설명</translation>
-<translation id="628938136236500310">PIP 모드로 재생 중</translation>
+<translation id="6310801910862476708">PIP 모드 종료</translation>
 <translation id="6398862346408813489">월 선택 패널 표시</translation>
 <translation id="6404546809543547843">오디오 시간 스크러버</translation>
 <translation id="6443871981718447451">자막 메뉴 표시</translation>
diff --git a/content/app/strings/translations/content_strings_lt.xtb b/content/app/strings/translations/content_strings_lt.xtb
index 2139685..22a95b3 100644
--- a/content/app/strings/translations/content_strings_lt.xtb
+++ b/content/app/strings/translations/content_strings_lt.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Įveskite kableliais atskirtą el. pašto adresų sąrašą.</translation>
 <translation id="2940813599313844715">objektas</translation>
 <translation id="2942448076852699108">paryškintas turinys</translation>
-<translation id="2983835398644161987">Išeiti iš vaizdo vaizde</translation>
 <translation id="3040011195152428237">nuoroda</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Įveskite tinkamą vertę. Laukas užpildytas nevisiškai arba įvesta netinkama data.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Pailginkite šį tekstą iki <ph name="MIN_CHARACTERS" /> simb. ar daugiau (šiuo metu naudojate <ph name="CURRENT_LENGTH" /> simb.).</translation>
 <translation id="383465348367842624">Prieš „<ph name="ATSIGN" />“ esančioje dalyje neturėtų būti simbolio „<ph name="INVALIDCHARACTER" />“.</translation>
 <translation id="3846214748874656680">Išjungti viso ekrano režimą</translation>
-<translation id="3904511540324382638">Išeiti iš vaizdo vaizde</translation>
 <translation id="3920932319529768807">išvada</translation>
 <translation id="3924558731517983934">programa</translation>
 <translation id="3944740393230681990">prologas</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">baigiamasis žodis</translation>
 <translation id="6209276755895393898">Tai tikriausiai yra: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">aiškinamasis terminų žodynas</translation>
-<translation id="628938136236500310">Leidžiama vaizdo vaizde režimu</translation>
+<translation id="6310801910862476708">Išeiti iš vaizdo vaizde</translation>
 <translation id="6398862346408813489">Rodyti mėnesio pasirinkimo skydelį</translation>
 <translation id="6404546809543547843">garso laiko valdiklis</translation>
 <translation id="6443871981718447451">rodyti subtitrų meniu</translation>
diff --git a/content/app/strings/translations/content_strings_lv.xtb b/content/app/strings/translations/content_strings_lv.xtb
index c0a619283..b1f6308 100644
--- a/content/app/strings/translations/content_strings_lv.xtb
+++ b/content/app/strings/translations/content_strings_lv.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Lūdzu, ievadiet ar komatu atdalītu e-pasta adrešu sarakstu.</translation>
 <translation id="2940813599313844715">objekts</translation>
 <translation id="2942448076852699108">iezīmētais saturs</translation>
-<translation id="2983835398644161987">Iziet no režīma “Attēls attēlā”</translation>
 <translation id="3040011195152428237">saite</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Lūdzu, ievadiet derīgu vērtību. Šis lauks nav pabeigts, vai tajā ir norādīts nederīgs datums.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Lūdzu, papildiniet šo tekstu līdz vismaz <ph name="MIN_CHARACTERS" /> rakstzīmēm (pašlaik tas ietver <ph name="CURRENT_LENGTH" /> rakstzīmes).</translation>
 <translation id="383465348367842624">Daļā, kas atrodas pirms zīmes <ph name="ATSIGN" />, nedrīkst būt ietverts simbols <ph name="INVALIDCHARACTER" />.</translation>
 <translation id="3846214748874656680">Aizvērt pilnekrāna režīmu</translation>
-<translation id="3904511540324382638">Iziet no režīma “Attēls attēlā”</translation>
 <translation id="3920932319529768807">nobeigums</translation>
 <translation id="3924558731517983934">lietojumprogramma</translation>
 <translation id="3944740393230681990">prologs</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">pēcvārds</translation>
 <translation id="6209276755895393898">Šķiet, ka tas ir: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosārijs</translation>
-<translation id="628938136236500310">Tiek atskaņots režīmā “Attēls attēlā”</translation>
+<translation id="6310801910862476708">Aizvērt režīmu “Attēls attēlā”</translation>
 <translation id="6398862346408813489">Rādīt mēneša atlases paneli</translation>
 <translation id="6404546809543547843">audio laika skalas slīdnis</translation>
 <translation id="6443871981718447451">rādīt slēgto parakstu izvēlni</translation>
diff --git a/content/app/strings/translations/content_strings_ml.xtb b/content/app/strings/translations/content_strings_ml.xtb
index 22acee1..15810bca 100644
--- a/content/app/strings/translations/content_strings_ml.xtb
+++ b/content/app/strings/translations/content_strings_ml.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">ഇമെയില്‍ വിലാസങ്ങളുടെ കോമയാല്‍ വേര്‍തിരിച്ച ഒരു പട്ടിക ദയവായി നല്‍കുക.</translation>
 <translation id="2940813599313844715">ഒബ്‌ജക്‌റ്റ്</translation>
 <translation id="2942448076852699108">ഹൈലൈറ്റുചെയ്‌തിരിക്കുന്ന ഉള്ളടക്കം</translation>
-<translation id="2983835398644161987">ചിത്രത്തിനുള്ളിലെ ചിത്രത്തിൽ നിന്ന് പുറത്ത് കടക്കുക</translation>
 <translation id="3040011195152428237">ലിങ്ക്</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">ഒരു സാധുതയുള്ള മൂല്യം നൽകുക. ഫീൽഡ് പൂർണ്ണമല്ല അല്ലെങ്കിൽ അസാധുവായ തീയതിയിലുള്ളതാണ്.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">ഈ ടെക്‌സ്റ്റിന്‍റെ ദൈർഘ്യം <ph name="MIN_CHARACTERS" /> അല്ലെങ്കിൽ അതിൽക്കൂടുതൽ പ്രതീകങ്ങൾ നൽകി കൂട്ടുക. (നിങ്ങൾ നിലവിൽ <ph name="CURRENT_LENGTH" /> പ്രതീകങ്ങളാണ് ഉപയോഗിക്കുന്നത്).</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />' എന്നതിനുശേഷം വരുന്ന ഒരു ഭാഗത്തിൽ '<ph name="INVALIDCHARACTER" />' ചിഹ്നം ഉണ്ടാകരുത്.</translation>
 <translation id="3846214748874656680">പൂർണ്ണ സ്‌ക്രീനിൽ നിന്ന് പുറത്തുകടക്കുക</translation>
-<translation id="3904511540324382638">ചിത്രത്തിനുള്ളിലെ ചിത്രത്തിൽ നിന്ന് പുറത്ത് കടക്കുക</translation>
 <translation id="3920932319529768807">ഉപസംഹാരം</translation>
 <translation id="3924558731517983934">അപ്ലിക്കേഷൻ</translation>
 <translation id="3944740393230681990">ആമുഖം</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">പിൻ കുറിപ്പ്</translation>
 <translation id="6209276755895393898">ഇങ്ങനെ ദൃശ്യമാകും: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">പദസഞ്ചയം</translation>
-<translation id="628938136236500310">ചിത്രത്തിനുള്ളിലെ ചിത്രം മോഡിൽ പ്ലേ ചെയ്യുന്നു</translation>
+<translation id="6310801910862476708">ചിത്രത്തിനുള്ളിലെ ചിത്രത്തിന് പുറത്ത് കടക്കുക</translation>
 <translation id="6398862346408813489">മാസം തിരഞ്ഞെടുക്കുന്ന പാനൽ കാണിക്കുക</translation>
 <translation id="6404546809543547843">ഓഡിയോ സമയ സ്‌ക്രബർ</translation>
 <translation id="6443871981718447451">സബ്‌ടൈറ്റിൽ മെനു കാണിക്കുക</translation>
diff --git a/content/app/strings/translations/content_strings_mr.xtb b/content/app/strings/translations/content_strings_mr.xtb
index 27965b3..616b8cb4 100644
--- a/content/app/strings/translations/content_strings_mr.xtb
+++ b/content/app/strings/translations/content_strings_mr.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">कृपया ईमेल पत्त्यांची स्वल्पविरामाद्वारे विभक्त सूची एंटर करा.</translation>
 <translation id="2940813599313844715">ऑब्जेक्ट</translation>
 <translation id="2942448076852699108">हायलाइट केलेला आशय</translation>
-<translation id="2983835398644161987">चित्रात-चित्र मधून बाहेर पडा</translation>
 <translation id="3040011195152428237">लिंक</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">कृपया एक वैध मूल्य एंटर करा. फील्ड अपूर्ण आहे किंवा चुकीची तारीख आहे.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">कृपया हा मजकूर <ph name="MIN_CHARACTERS" /> वर्ण किंवा त्यापेक्षा अधिक मोठा करा (तुम्ही सध्‍या <ph name="CURRENT_LENGTH" /> वर्ण वापरत आहात).</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />' मागुन येणार्‍या भागामध्ये '<ph name="INVALIDCHARACTER" />' चिन्ह नसावे.</translation>
 <translation id="3846214748874656680">क्षेत्रेमधून बाहेर पडा</translation>
-<translation id="3904511540324382638">चित्रात-चित्र मधून बाहेर पडा</translation>
 <translation id="3920932319529768807">निष्कर्ष</translation>
 <translation id="3924558731517983934">ॲप्लिकेशन</translation>
 <translation id="3944740393230681990">उपोद्घात</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">अंतिम शब्द</translation>
 <translation id="6209276755895393898">असे असल्याचे दिसत आहे: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">शब्दावली</translation>
-<translation id="628938136236500310">चित्रात-चित्र मोडमध्ये प्ले करत आहे</translation>
+<translation id="6310801910862476708">चित्रात-चित्र मधून बाहेर पडा</translation>
 <translation id="6398862346408813489">महिना निवड पॅनेल दाखवा</translation>
 <translation id="6404546809543547843">ऑडिओ वेळ स्क्रबर</translation>
 <translation id="6443871981718447451">सबटायटल मेनू दाखवा</translation>
diff --git a/content/app/strings/translations/content_strings_ms.xtb b/content/app/strings/translations/content_strings_ms.xtb
index a321ba8..7b87f58 100644
--- a/content/app/strings/translations/content_strings_ms.xtb
+++ b/content/app/strings/translations/content_strings_ms.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Sila masukkan senarai alamat e-mel yang dipisahkan dengan koma.</translation>
 <translation id="2940813599313844715">objek</translation>
 <translation id="2942448076852699108">kandungan yang diserlahkan</translation>
-<translation id="2983835398644161987">Keluar daripada Gambar dalam Gambar</translation>
 <translation id="3040011195152428237">pautan</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Sila masukkan nilai yang sah. Medan tidak lengkap atau mengandungi tarikh yang tidak sah.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Sila panjangkan teks ini kepada <ph name="MIN_CHARACTERS" /> aksara atau lebih (anda sedang menggunakan <ph name="CURRENT_LENGTH" /> aksara).</translation>
 <translation id="383465348367842624">Bahagian yang diikuti oleh '<ph name="ATSIGN" />' tidak boleh mengandungi simbol '<ph name="INVALIDCHARACTER" />'.</translation>
 <translation id="3846214748874656680">Keluar dari skrin penuh</translation>
-<translation id="3904511540324382638">Keluar daripada gambar dalam gambar</translation>
 <translation id="3920932319529768807">kesimpulan</translation>
 <translation id="3924558731517983934">aplikasi</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">kata hujungan</translation>
 <translation id="6209276755895393898">Nampak seperti: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosari</translation>
-<translation id="628938136236500310">Memainkan dalam mod gambar dalam gambar</translation>
+<translation id="6310801910862476708">Keluar daripada Gambar dalam Gambar</translation>
 <translation id="6398862346408813489">Tunjukkan panel pilihan bulan</translation>
 <translation id="6404546809543547843">pembersih masa audio</translation>
 <translation id="6443871981718447451">tunjukkan menu sari kata</translation>
diff --git a/content/app/strings/translations/content_strings_nl.xtb b/content/app/strings/translations/content_strings_nl.xtb
index d5e1b93..3cb23f9 100644
--- a/content/app/strings/translations/content_strings_nl.xtb
+++ b/content/app/strings/translations/content_strings_nl.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Voer een door komma's gescheiden lijst met e-mailadressen in.</translation>
 <translation id="2940813599313844715">object</translation>
 <translation id="2942448076852699108">gemarkeerde content</translation>
-<translation id="2983835398644161987">Scherm-in-scherm afsluiten</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Voer een geldige waarde in. Het veld is onvolledig of bevat een ongeldige datum.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Breid deze tekst uit tot <ph name="MIN_CHARACTERS" /> tekens of meer (je gebruikt momenteel <ph name="CURRENT_LENGTH" /> tekens).</translation>
 <translation id="383465348367842624">Het naamgedeelte vóór '<ph name="ATSIGN" />' mag niet het teken '<ph name="INVALIDCHARACTER" />' bevatten.</translation>
 <translation id="3846214748874656680">Volledig scherm sluiten</translation>
-<translation id="3904511540324382638">Scherm-in-scherm afsluiten</translation>
 <translation id="3920932319529768807">conclusie</translation>
 <translation id="3924558731517983934">app</translation>
 <translation id="3944740393230681990">proloog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">nawoord</translation>
 <translation id="6209276755895393898">Lijkt het volgende te zijn: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">woordenlijst</translation>
-<translation id="628938136236500310">Afspelen in scherm-in-scherm-modus</translation>
+<translation id="6310801910862476708">Scherm-in-scherm afsluiten</translation>
 <translation id="6398862346408813489">Deelvenster voor maandselectie weergeven</translation>
 <translation id="6404546809543547843">scrollbar met audiotijd</translation>
 <translation id="6443871981718447451">ondertitelingsmenu weergeven</translation>
diff --git a/content/app/strings/translations/content_strings_no.xtb b/content/app/strings/translations/content_strings_no.xtb
index 49967bf5..a9ccd34 100644
--- a/content/app/strings/translations/content_strings_no.xtb
+++ b/content/app/strings/translations/content_strings_no.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Skriv inn en liste over e-postadresser atskilt med komma.</translation>
 <translation id="2940813599313844715">objekt</translation>
 <translation id="2942448076852699108">merket innhold</translation>
-<translation id="2983835398644161987">Avslutt bilde-i-bilde</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Skriv inn en gyldig verdi. Feltet er ufullstendig, eller har en ugyldig dato.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Du må forlenge denne teksten til <ph name="MIN_CHARACTERS" /> tegn eller mer (for øyeblikket bruker du <ph name="CURRENT_LENGTH" /> tegn).</translation>
 <translation id="383465348367842624">En del etterfulgt av «<ph name="ATSIGN" />» kan ikke inneholde symbolet «<ph name="INVALIDCHARACTER" />».</translation>
 <translation id="3846214748874656680">Avslutt fullskjermmodus</translation>
-<translation id="3904511540324382638">Avslutt bilde-i-bilde</translation>
 <translation id="3920932319529768807">konklusjon</translation>
 <translation id="3924558731517983934">program</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">etterord</translation>
 <translation id="6209276755895393898">Dette ser ut til å være <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">ordliste</translation>
-<translation id="628938136236500310">Spilles av i bilde-i-bilde-modus</translation>
+<translation id="6310801910862476708">Avslutt bilde-i-bilde</translation>
 <translation id="6398862346408813489">Se panelet for valg av måned</translation>
 <translation id="6404546809543547843">lydtidslinje</translation>
 <translation id="6443871981718447451">vis menyen for teksting for hørselshemmede</translation>
diff --git a/content/app/strings/translations/content_strings_pl.xtb b/content/app/strings/translations/content_strings_pl.xtb
index 7f01b697..e0d3c16 100644
--- a/content/app/strings/translations/content_strings_pl.xtb
+++ b/content/app/strings/translations/content_strings_pl.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Podaj listę adresów e-mail rozdzielonych przecinkami.</translation>
 <translation id="2940813599313844715">obiekt</translation>
 <translation id="2942448076852699108">wyróżniona treść</translation>
-<translation id="2983835398644161987">Wyłącz tryb obrazu w obrazie</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Wpisz prawidłową wartość. Pole jest niekompletne lub zawiera nieprawidłową datę.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Wydłuż ten tekst przynajmniej do <ph name="MIN_CHARACTERS" /> znaków (teraz używasz <ph name="CURRENT_LENGTH" /> znaków).</translation>
 <translation id="383465348367842624">Część przed znakiem „<ph name="ATSIGN" />” nie może zawierać symbolu „<ph name="INVALIDCHARACTER" />”.</translation>
 <translation id="3846214748874656680">Zamknij pełny ekran</translation>
-<translation id="3904511540324382638">Wyłącz tryb obrazu w obrazie</translation>
 <translation id="3920932319529768807">podsumowanie</translation>
 <translation id="3924558731517983934">aplikacja</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">posłowie</translation>
 <translation id="6209276755895393898">Wygląda jak: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">słownik</translation>
-<translation id="628938136236500310">Odtwarzanie w trybie obrazu w obrazie</translation>
+<translation id="6310801910862476708">Wyłącz tryb obrazu w obrazie</translation>
 <translation id="6398862346408813489">Pokaż panel wyboru miesiąca</translation>
 <translation id="6404546809543547843">pasek czasu odtwarzania dźwięku</translation>
 <translation id="6443871981718447451">wyświetlanie menu napisów</translation>
diff --git a/content/app/strings/translations/content_strings_pt-BR.xtb b/content/app/strings/translations/content_strings_pt-BR.xtb
index 465d8df..eb62d15e 100644
--- a/content/app/strings/translations/content_strings_pt-BR.xtb
+++ b/content/app/strings/translations/content_strings_pt-BR.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Insira uma lista de endereços de e-mail separados por vírgula.</translation>
 <translation id="2940813599313844715">objeto</translation>
 <translation id="2942448076852699108">conteúdo destacado</translation>
-<translation id="2983835398644161987">Sair de "picture in picture"</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Insira um valor válido. O campo está incompleto ou tem uma data inválida.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Aumente este texto para <ph name="MIN_CHARACTERS" /> caracteres ou mais. No momento, você está usando <ph name="CURRENT_LENGTH" /> caracteres).</translation>
 <translation id="383465348367842624">Uma parte seguida por "<ph name="ATSIGN" />" não deve conter o símbolo "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Sair da tela cheia</translation>
-<translation id="3904511540324382638">Sair de "picture in picture"</translation>
 <translation id="3920932319529768807">conclusão</translation>
 <translation id="3924558731517983934">app</translation>
 <translation id="3944740393230681990">prólogo</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">posfácio</translation>
 <translation id="6209276755895393898">Parece ser: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glossário</translation>
-<translation id="628938136236500310">Vídeo aberto no modo picture-in-picture</translation>
+<translation id="6310801910862476708">Sair de picture-in-picture</translation>
 <translation id="6398862346408813489">Mostrar painel de seleção de mês</translation>
 <translation id="6404546809543547843">barra de progressão do áudio</translation>
 <translation id="6443871981718447451">mostrar menu de closed captions</translation>
diff --git a/content/app/strings/translations/content_strings_pt-PT.xtb b/content/app/strings/translations/content_strings_pt-PT.xtb
index 3a19661f..7a8f240 100644
--- a/content/app/strings/translations/content_strings_pt-PT.xtb
+++ b/content/app/strings/translations/content_strings_pt-PT.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Introduza uma lista de endereços de email separados por vírgula.</translation>
 <translation id="2940813599313844715">objeto</translation>
 <translation id="2942448076852699108">conteúdo realçado</translation>
-<translation id="2983835398644161987">Sair de imagem na imagem</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Introduza um valor válido. O campo está incompleto ou tem uma data inválida.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Aumente este texto para <ph name="MIN_CHARACTERS" /> carateres ou mais (está atualmente a utilizar <ph name="CURRENT_LENGTH" /> carateres).</translation>
 <translation id="383465348367842624">Uma parte seguida de "<ph name="ATSIGN" />" não deve conter o símbolo "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Sair do modo de ecrã inteiro</translation>
-<translation id="3904511540324382638">Sair de imagem na imagem</translation>
 <translation id="3920932319529768807">conclusão</translation>
 <translation id="3924558731517983934">aplicação</translation>
 <translation id="3944740393230681990">prólogo</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">posfácio</translation>
 <translation id="6209276755895393898">Parece ser: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glossário</translation>
-<translation id="628938136236500310">Em reprodução no modo ecrã no ecrã</translation>
+<translation id="6310801910862476708">Sair do modo ecrã no ecrã</translation>
 <translation id="6398862346408813489">Mostrar painel de seleção do mês</translation>
 <translation id="6404546809543547843">controlo de arrasto do tempo do áudio</translation>
 <translation id="6443871981718447451">mostrar menu de legendas ocultas</translation>
diff --git a/content/app/strings/translations/content_strings_ro.xtb b/content/app/strings/translations/content_strings_ro.xtb
index fa036c26..a3016a1 100644
--- a/content/app/strings/translations/content_strings_ro.xtb
+++ b/content/app/strings/translations/content_strings_ro.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Introdu o listă de adrese de e-mail separate prin virgulă.</translation>
 <translation id="2940813599313844715">obiect</translation>
 <translation id="2942448076852699108">conținut evidențiat</translation>
-<translation id="2983835398644161987">Ieși din modul Imagine în imagine</translation>
 <translation id="3040011195152428237">link</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Introduceți o valoare validă. Câmpul este incomplet sau conține o dată nevalidă.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Mărește acest text la cel puțin <ph name="MIN_CHARACTERS" /> caractere (în prezent folosești <ph name="CURRENT_LENGTH" /> caractere).</translation>
 <translation id="383465348367842624">Valoarea urmată de semnul „<ph name="ATSIGN" />” nu trebuie să conțină simbolul „<ph name="INVALIDCHARACTER" />”.</translation>
 <translation id="3846214748874656680">Ieși din ecranul complet</translation>
-<translation id="3904511540324382638">Ieși din modul Imagine în imagine</translation>
 <translation id="3920932319529768807">concluzie</translation>
 <translation id="3924558731517983934">aplicație</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">postfață</translation>
 <translation id="6209276755895393898">Pare a fi: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosar</translation>
-<translation id="628938136236500310">Se redă în modul picture-in-picture</translation>
+<translation id="6310801910862476708">Ieși din modul Picture-in-Picture</translation>
 <translation id="6398862346408813489">Afișează panoul de selectare a lunii</translation>
 <translation id="6404546809543547843">glisor redare audio</translation>
 <translation id="6443871981718447451">afișează meniul de subtitrări</translation>
diff --git a/content/app/strings/translations/content_strings_ru.xtb b/content/app/strings/translations/content_strings_ru.xtb
index 92ef93f..81b4bb2 100644
--- a/content/app/strings/translations/content_strings_ru.xtb
+++ b/content/app/strings/translations/content_strings_ru.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Введите адреса электронной почты через запятую.</translation>
 <translation id="2940813599313844715">объект</translation>
 <translation id="2942448076852699108">выделенный контент</translation>
-<translation id="2983835398644161987">Выйти из режима "Картинка в картинке"</translation>
 <translation id="3040011195152428237">ссылка</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> МБ</translation>
 <translation id="3075154866155599887">Введите верное значение. Поле не заполнено или введена недействительная дата.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Минимально допустимое количество символов: <ph name="MIN_CHARACTERS" />. Длина текста сейчас: <ph name="CURRENT_LENGTH" />.</translation>
 <translation id="383465348367842624">Часть адреса до символа "<ph name="ATSIGN" />" не должна содержать символ "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Обычный режим</translation>
-<translation id="3904511540324382638">Выйти из режима "Картинка в картинке"</translation>
 <translation id="3920932319529768807">заключение</translation>
 <translation id="3924558731517983934">приложение</translation>
 <translation id="3944740393230681990">пролог</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">послесловие</translation>
 <translation id="6209276755895393898">Кажется, это "<ph name="DESCRIPTION" />"</translation>
 <translation id="6213469881011901533">словарь</translation>
-<translation id="628938136236500310">Воспроизведение в режиме "Картинка в картинке"</translation>
+<translation id="6310801910862476708">Выйти из режима "Картинка в картинке"</translation>
 <translation id="6398862346408813489">Показать панель выбора месяца</translation>
 <translation id="6404546809543547843">полоса воспроизведения</translation>
 <translation id="6443871981718447451">показать меню субтитров</translation>
diff --git a/content/app/strings/translations/content_strings_sk.xtb b/content/app/strings/translations/content_strings_sk.xtb
index 684a03f..33a5bc95 100644
--- a/content/app/strings/translations/content_strings_sk.xtb
+++ b/content/app/strings/translations/content_strings_sk.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Zadajte zoznam e-mailových adries oddelených čiarkou.</translation>
 <translation id="2940813599313844715">objekt</translation>
 <translation id="2942448076852699108">zvýraznený obsah</translation>
-<translation id="2983835398644161987">Ukončiť obraz v obraze</translation>
 <translation id="3040011195152428237">odkaz</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Zadajte platnú hodnotu. Pole obsahuje neúplnú hodnotu alebo neplatný dátum.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Predĺžte tento text aspoň na <ph name="MIN_CHARACTERS" /> alebo viac znakov (momentálny počet znakov je <ph name="CURRENT_LENGTH" />).</translation>
 <translation id="383465348367842624">Časť pred znakom <ph name="ATSIGN" /> by nemala obsahovať symbol <ph name="INVALIDCHARACTER" />.</translation>
 <translation id="3846214748874656680">Ukončiť režim celej obrazovky</translation>
-<translation id="3904511540324382638">Ukončiť obraz v obraze</translation>
 <translation id="3920932319529768807">záver</translation>
 <translation id="3924558731517983934">aplikácia</translation>
 <translation id="3944740393230681990">prológ</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">doslov</translation>
 <translation id="6209276755895393898">Zrejme to bude: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosár</translation>
-<translation id="628938136236500310">Prehráva sa v režime obraz v obraze</translation>
+<translation id="6310801910862476708">Ukončiť obraz v obraze</translation>
 <translation id="6398862346408813489">Zobraziť panel na výber mesiaca</translation>
 <translation id="6404546809543547843">posúvač časovej osi zvuku</translation>
 <translation id="6443871981718447451">zobraziť ponuku skrytých titulkov</translation>
diff --git a/content/app/strings/translations/content_strings_sl.xtb b/content/app/strings/translations/content_strings_sl.xtb
index 9cb11b4c..f9ce0952 100644
--- a/content/app/strings/translations/content_strings_sl.xtb
+++ b/content/app/strings/translations/content_strings_sl.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Vnesite seznam e-poštnih naslovov, ločenih z vejicami</translation>
 <translation id="2940813599313844715">predmet</translation>
 <translation id="2942448076852699108">označena vsebina</translation>
-<translation id="2983835398644161987">Zapri način slike v sliki</translation>
 <translation id="3040011195152428237">povezava</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Vnesite veljavno vrednost. Vnos v polje je nepopoln ali vsebuje neveljaven datum.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Podaljšajte to besedilo na toliko znakov ali več: <ph name="MIN_CHARACTERS" /> (trenutno uporabljate toliko znakov: <ph name="CURRENT_LENGTH" />).</translation>
 <translation id="383465348367842624">Del pred »<ph name="ATSIGN" />« ne sme vsebovati znaka »<ph name="INVALIDCHARACTER" />«.</translation>
 <translation id="3846214748874656680">Zapri celozaslonski način</translation>
-<translation id="3904511540324382638">Zapri način slike v sliki</translation>
 <translation id="3920932319529768807">sklep</translation>
 <translation id="3924558731517983934">aplikacija</translation>
 <translation id="3944740393230681990">uvod</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">spremna beseda</translation>
 <translation id="6209276755895393898">Videti je kot: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">glosar</translation>
-<translation id="628938136236500310">Predvajanje v načinu slike v sliki</translation>
+<translation id="6310801910862476708">Zapri način slike v sliki</translation>
 <translation id="6398862346408813489">Prikaz podokna za izbiro meseca</translation>
 <translation id="6404546809543547843">časovni krmilnik za predvajanje zvoka</translation>
 <translation id="6443871981718447451">pokaži meni s podnapisi</translation>
diff --git a/content/app/strings/translations/content_strings_sr.xtb b/content/app/strings/translations/content_strings_sr.xtb
index 4d4a4593..bb26095 100644
--- a/content/app/strings/translations/content_strings_sr.xtb
+++ b/content/app/strings/translations/content_strings_sr.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Унесите листу имејл адреса раздвојених зарезима.</translation>
 <translation id="2940813599313844715">објекат</translation>
 <translation id="2942448076852699108">истакнути садржај</translation>
-<translation id="2983835398644161987">Изађи из режима слике у слици</translation>
 <translation id="3040011195152428237">веза</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Унесите важећу вредност. Поље није попуњено или садржи неважећи датум.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Продужите овај текст на <ph name="MIN_CHARACTERS" /> знак(ов)а или више (тренутно користите <ph name="CURRENT_LENGTH" /> знак(ов)а).</translation>
 <translation id="383465348367842624">Део пре „<ph name="ATSIGN" />“ не треба да садржи симбол „<ph name="INVALIDCHARACTER" />“.</translation>
 <translation id="3846214748874656680">Изађи из целог екрана</translation>
-<translation id="3904511540324382638">Изађи из режима слике у слици</translation>
 <translation id="3920932319529768807">закључак</translation>
 <translation id="3924558731517983934">апликација</translation>
 <translation id="3944740393230681990">пролог</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">поговор</translation>
 <translation id="6209276755895393898">Изгледа да је ово: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">речник термина</translation>
-<translation id="628938136236500310">Пуштање у режиму Слика у слици</translation>
+<translation id="6310801910862476708">Изађи из режима слике у слици</translation>
 <translation id="6398862346408813489">Прикажи таблу за избор месеца</translation>
 <translation id="6404546809543547843">клизач за трајање аудио-садржаја</translation>
 <translation id="6443871981718447451">прикажите мени опционалног титла</translation>
diff --git a/content/app/strings/translations/content_strings_sv.xtb b/content/app/strings/translations/content_strings_sv.xtb
index a4123e4..01eb6912 100644
--- a/content/app/strings/translations/content_strings_sv.xtb
+++ b/content/app/strings/translations/content_strings_sv.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Ange en kommaavgränsad lista med e-postadresser.</translation>
 <translation id="2940813599313844715">objekt</translation>
 <translation id="2942448076852699108">markerat innehåll</translation>
-<translation id="2983835398644161987">Avsluta bild-i-bild-läge</translation>
 <translation id="3040011195152428237">länk</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Ange ett giltigt värde. Fältet är ofullständigt eller innehåller ett ogiltigt datum.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Lägg till minst <ph name="MIN_CHARACTERS" /> tecken (för närvarande har du angett <ph name="CURRENT_LENGTH" /> tecken).</translation>
 <translation id="383465348367842624">En del följt av <ph name="ATSIGN" /> får inte innehålla symbolen <ph name="INVALIDCHARACTER" />.</translation>
 <translation id="3846214748874656680">Avsluta helskärmsläge</translation>
-<translation id="3904511540324382638">Avsluta bild-i-bild-läge</translation>
 <translation id="3920932319529768807">resultat</translation>
 <translation id="3924558731517983934">program</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">efterord</translation>
 <translation id="6209276755895393898">Det verkar vara: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">ordlista</translation>
-<translation id="628938136236500310">Spelar upp i bild-i-bild-läge</translation>
+<translation id="6310801910862476708">Avsluta bild-i-bild-läge</translation>
 <translation id="6398862346408813489">Visa panelen för val av månad</translation>
 <translation id="6404546809543547843">tidsreglage för ljud</translation>
 <translation id="6443871981718447451">visa textningsmenyn</translation>
diff --git a/content/app/strings/translations/content_strings_sw.xtb b/content/app/strings/translations/content_strings_sw.xtb
index a1927dc6..641f052 100644
--- a/content/app/strings/translations/content_strings_sw.xtb
+++ b/content/app/strings/translations/content_strings_sw.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Tafadhali weka orodha ya anwani za barua pepe zilizotenganishwa kwa vikomo.</translation>
 <translation id="2940813599313844715">kitu</translation>
 <translation id="2942448076852699108">maudhui yaliyoangaziwa</translation>
-<translation id="2983835398644161987">Funga hali ya Picha ndani ya Picha</translation>
 <translation id="3040011195152428237">kiungo</translation>
 <translation id="3049748772180311791">MB <ph name="QUANTITY" /></translation>
 <translation id="3075154866155599887">Tafadhali ingiza thamani halali. Uga umekamilika au una tarehe batili.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Tafadhali refusha maandishi haya hadi herufi <ph name="MIN_CHARACTERS" /> au zaidi (kwa sasa unatumia herufi <ph name="CURRENT_LENGTH" />).</translation>
 <translation id="383465348367842624">Sehemu inayofuatwa na '<ph name="ATSIGN" />' haipaswi kuwa na alama ya '<ph name="INVALIDCHARACTER" />'.</translation>
 <translation id="3846214748874656680">Ondoka kwenye skrini nzima</translation>
-<translation id="3904511540324382638">Funga hali ya picha ndani ya picha</translation>
 <translation id="3920932319529768807">hitimisho</translation>
 <translation id="3924558731517983934">programu</translation>
 <translation id="3944740393230681990">shairi la utangulizi</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">maelezo kuhusu kitabu</translation>
 <translation id="6209276755895393898">Inaonekana kuwa: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">faharasa</translation>
-<translation id="628938136236500310">Video inacheza katika hali ya picha ndani ya picha</translation>
+<translation id="6310801910862476708">Funga hali ya Picha ndani ya Picha</translation>
 <translation id="6398862346408813489">Onyesha kisanduku cha uchaguzi wa mwezi</translation>
 <translation id="6404546809543547843">kitelezi cha muda cha sauti</translation>
 <translation id="6443871981718447451">kuonyesha menyu ya manukuu</translation>
diff --git a/content/app/strings/translations/content_strings_ta.xtb b/content/app/strings/translations/content_strings_ta.xtb
index f83b9e87..deef0846 100644
--- a/content/app/strings/translations/content_strings_ta.xtb
+++ b/content/app/strings/translations/content_strings_ta.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">காற்புள்ளியால் பிரிக்கப்பட்ட மின்னஞ்சல் முகவரிகளின் பட்டியலை உள்ளிடுக.</translation>
 <translation id="2940813599313844715">பொருள்</translation>
 <translation id="2942448076852699108">தனிப்படுத்தப்பட்ட உள்ளடக்கம்</translation>
-<translation id="2983835398644161987">’பிக்ச்சர்-இன்-பிக்ச்சர்' சாளரத்திலிருந்து வெளியேறு</translation>
 <translation id="3040011195152428237">இணைப்பு</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> மெ.பை</translation>
 <translation id="3075154866155599887">சரியான மதிப்பை உள்ளிடவும். இந்தப் புலம் முழுமையற்றதாக உள்ளது அல்லது தவறான தேதியைக் கொண்டுள்ளது.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">இந்த உரையை <ph name="MIN_CHARACTERS" /> எழுத்துக்குறிகள் அல்லது அதற்கும் அதிகமாக (தற்போது <ph name="CURRENT_LENGTH" /> எழுத்துக்குறிகளைப் பயன்படுத்துகிறீர்கள்) நீட்டிக்கவும்.</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />' ஐத் தொடர்ந்து வரும் பகுதியில் '<ph name="INVALIDCHARACTER" />' சின்னம் இருக்கக்கூடாது.</translation>
 <translation id="3846214748874656680">முழுத்திரை வேண்டாம்</translation>
-<translation id="3904511540324382638">’பிக்ச்சர்-இன்-பிக்ச்சர்' சாளரத்திலிருந்து வெளியேறு</translation>
 <translation id="3920932319529768807">முடிவு</translation>
 <translation id="3924558731517983934">ஆப்ஸ்</translation>
 <translation id="3944740393230681990">முன்னுரை</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">பின்னுரை</translation>
 <translation id="6209276755895393898"><ph name="DESCRIPTION" /> போலத் தோன்றுகிறது.</translation>
 <translation id="6213469881011901533">அருஞ்சொல் திரட்டு</translation>
-<translation id="628938136236500310">பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறையில் இயக்குகிறது</translation>
+<translation id="6310801910862476708">பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறையிலிருந்து வெளியேறு</translation>
 <translation id="6398862346408813489">மாதம் தேர்ந்தெடுப்புப் பலகத்தைக் காட்டு</translation>
 <translation id="6404546809543547843">ஆடியோ நேர ஸ்கிரப்பர்</translation>
 <translation id="6443871981718447451">விரிவான வசனங்கள் மெனுவைக் காட்டும்</translation>
diff --git a/content/app/strings/translations/content_strings_te.xtb b/content/app/strings/translations/content_strings_te.xtb
index 8d9a382..289e849 100644
--- a/content/app/strings/translations/content_strings_te.xtb
+++ b/content/app/strings/translations/content_strings_te.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">దయచేసి కామాతో వేరు చేసిన ఇమెయిల్ చిరునామాల జాబితాను నమోదు చేయండి.</translation>
 <translation id="2940813599313844715">ఆబ్జెక్ట్</translation>
 <translation id="2942448076852699108">హైలైట్ చేయబడిన కంటెంట్</translation>
-<translation id="2983835398644161987">చిత్రంలో చిత్రం మోడ్ నుండి నిష్క్రమించు</translation>
 <translation id="3040011195152428237">లింక్</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">దయచేసి చెల్లుబాటు అయ్యే విలువను నమోదు చేయండి. ఫీల్డ్ అసంపూర్ణంగా ఉంది లేదా ఇందులోని తేదీ చెల్లదు.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">దయచేసి ఈ వచనాన్ని <ph name="MIN_CHARACTERS" /> లేదా అంతకంటే ఎక్కువ అక్షరాలకు పొడిగించండి (ప్రస్తుతం మీరు <ph name="CURRENT_LENGTH" /> అక్షరాలను ఉపయోగిస్తున్నారు).</translation>
 <translation id="383465348367842624">'<ph name="ATSIGN" />'కి ముందు ఉన్న భాగంలో '<ph name="INVALIDCHARACTER" />' చిహ్నం ఉండకూడదు.</translation>
 <translation id="3846214748874656680">పూర్తి స్క్రీన్ నుండి నిష్క్రమించు</translation>
-<translation id="3904511540324382638">చిత్రంలో చిత్రం మోడ్ నుండి నిష్క్రమించు</translation>
 <translation id="3920932319529768807">ముగింపు</translation>
 <translation id="3924558731517983934">అప్లికేషన్‌</translation>
 <translation id="3944740393230681990">ప్రారంభం</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">చివరిమాట</translation>
 <translation id="6209276755895393898">వీరిలా కనిపిస్తున్నారు: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">పదకోశం</translation>
-<translation id="628938136236500310">చిత్రంలో చిత్రం మోడ్‌లో ప్లే చేస్తోంది</translation>
+<translation id="6310801910862476708">చిత్రంలో చిత్రం మోడ్ నుండి నిష్క్రమించు</translation>
 <translation id="6398862346408813489">నెల ఎంపిక ప్యానెల్‌ను చూపుతుంది</translation>
 <translation id="6404546809543547843">ఆడియో సమయ స్క్రబ్బర్</translation>
 <translation id="6443871981718447451">ఉపశీర్షికల మెనూని చూపు</translation>
diff --git a/content/app/strings/translations/content_strings_th.xtb b/content/app/strings/translations/content_strings_th.xtb
index 3c99d265..ea815d8 100644
--- a/content/app/strings/translations/content_strings_th.xtb
+++ b/content/app/strings/translations/content_strings_th.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">โปรดป้อนรายการที่อยู่อีเมลโดยคั่นด้วยเครื่องหมายจุลภาค</translation>
 <translation id="2940813599313844715">ออบเจ็กต์</translation>
 <translation id="2942448076852699108">เนื้อหาที่ไฮไลต์</translation>
-<translation id="2983835398644161987">ออกจากโหมดการแสดงภาพซ้อนภาพ</translation>
 <translation id="3040011195152428237">ลิงก์</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">โปรดป้อนค่าที่ถูกต้อง ฟิลด์นี้ไม่สมบูรณ์หรือมีวันที่ที่ไม่ถูกต้อง</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">โปรดกรอกข้อความนี้ให้มีอักขระอย่างน้อย <ph name="MIN_CHARACTERS" /> ตัว (ตอนนี้คุณมี <ph name="CURRENT_LENGTH" /> ตัว)</translation>
 <translation id="383465348367842624">ส่วนที่ตามด้วย "<ph name="ATSIGN" />" ต้องไม่มีสัญลักษณ์ "<ph name="INVALIDCHARACTER" />"</translation>
 <translation id="3846214748874656680">ออกจากการแสดงเต็มหน้าจอ</translation>
-<translation id="3904511540324382638">ออกจากโหมดการแสดงภาพซ้อนภาพ</translation>
 <translation id="3920932319529768807">บทสรุป</translation>
 <translation id="3924558731517983934">แอปพลิเคชัน</translation>
 <translation id="3944740393230681990">อารัมภบท</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">คำแถลงท้ายเล่ม</translation>
 <translation id="6209276755895393898">ดูเหมือนเป็น<ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">อภิธานศัพท์</translation>
-<translation id="628938136236500310">กำลังเล่นในโหมดการแสดงภาพซ้อนภาพ</translation>
+<translation id="6310801910862476708">ออกจากการแสดงภาพซ้อนภาพ</translation>
 <translation id="6398862346408813489">แสดงแผงการเลือกเดือน</translation>
 <translation id="6404546809543547843">ตัวควบคุมเวลาของเสียง</translation>
 <translation id="6443871981718447451">แสดงเมนูคำอธิบายภาพ</translation>
diff --git a/content/app/strings/translations/content_strings_tr.xtb b/content/app/strings/translations/content_strings_tr.xtb
index 1c9538d..9ff10669 100644
--- a/content/app/strings/translations/content_strings_tr.xtb
+++ b/content/app/strings/translations/content_strings_tr.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Lütfen e-posta adreslerinin virgülle ayrılmış listesini girin.</translation>
 <translation id="2940813599313844715">nesne</translation>
 <translation id="2942448076852699108">vurgulanan içerik</translation>
-<translation id="2983835398644161987">Ekran İçinde Ekran modundan çık</translation>
 <translation id="3040011195152428237">bağlantı</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Lütfen geçerli bir tarih girin. Alan tam doldurulmamış veya geçersiz bir tarih var.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Lütfen bu metni <ph name="MIN_CHARACTERS" /> karakter veya daha fazla olacak şekilde uzatın (şu anda <ph name="CURRENT_LENGTH" /> karakter kullanıyorsunuz).</translation>
 <translation id="383465348367842624">Başında "<ph name="ATSIGN" />" bulunan kısımda "<ph name="INVALIDCHARACTER" />" simgesi bulunmamalıdır.</translation>
 <translation id="3846214748874656680">Tam ekran modundan çık</translation>
-<translation id="3904511540324382638">Ekran içinde ekran modundan çık</translation>
 <translation id="3920932319529768807">sonuç</translation>
 <translation id="3924558731517983934">uygulama</translation>
 <translation id="3944740393230681990">prolog</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">sonsöz</translation>
 <translation id="6209276755895393898">Resimdeki şu olabilir: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">terimler sözlüğü</translation>
-<translation id="628938136236500310">Pencere içinde pencere modunda oynatılıyor</translation>
+<translation id="6310801910862476708">Pencere İçinde Pencereden Çık</translation>
 <translation id="6398862346408813489">Ay seçim panelini göster</translation>
 <translation id="6404546809543547843">ses zaman çizelgesi temizleyici</translation>
 <translation id="6443871981718447451">altyazı menüsünü göster</translation>
diff --git a/content/app/strings/translations/content_strings_uk.xtb b/content/app/strings/translations/content_strings_uk.xtb
index 32b89b6..e727e03 100644
--- a/content/app/strings/translations/content_strings_uk.xtb
+++ b/content/app/strings/translations/content_strings_uk.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Введіть список електронних адрес, розділених комою.</translation>
 <translation id="2940813599313844715">об’єкт</translation>
 <translation id="2942448076852699108">виділений вміст</translation>
-<translation id="2983835398644161987">Вийти з режиму "Картинка в картинці"</translation>
 <translation id="3040011195152428237">посилання</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> МБ</translation>
 <translation id="3075154866155599887">Введіть дійсне значення. Поле не заповнено або введено недійсну дату.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">У тексті має бути на менше <ph name="MIN_CHARACTERS" /> символів (ви ввели <ph name="CURRENT_LENGTH" /> символів).</translation>
 <translation id="383465348367842624">Частина перед знаком "<ph name="ATSIGN" />" не може містити символ "<ph name="INVALIDCHARACTER" />".</translation>
 <translation id="3846214748874656680">Вийти з повноекранного режиму</translation>
-<translation id="3904511540324382638">Вийти з режиму "Картинка в картинці"</translation>
 <translation id="3920932319529768807">висновок</translation>
 <translation id="3924558731517983934">додаток</translation>
 <translation id="3944740393230681990">пролог</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">післямова</translation>
 <translation id="6209276755895393898">Схоже, на цьому зображенні <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">глосарій</translation>
-<translation id="628938136236500310">Відтворення в режимі "картинка в картинці"</translation>
+<translation id="6310801910862476708">Вийти з режиму "Картинка в картинці"</translation>
 <translation id="6398862346408813489">Показати панель вибору місяців</translation>
 <translation id="6404546809543547843">повзунок часу відтворення аудіо</translation>
 <translation id="6443871981718447451">показати меню субтитрів</translation>
diff --git a/content/app/strings/translations/content_strings_vi.xtb b/content/app/strings/translations/content_strings_vi.xtb
index 922f6de..e689957 100644
--- a/content/app/strings/translations/content_strings_vi.xtb
+++ b/content/app/strings/translations/content_strings_vi.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">Vui lòng nhập danh sách địa chỉ email được phân cách bằng dấu phẩy.</translation>
 <translation id="2940813599313844715">đối tượng</translation>
 <translation id="2942448076852699108">nội dung được đánh dấu</translation>
-<translation id="2983835398644161987">Thoát chế độ hình trong hình</translation>
 <translation id="3040011195152428237">liên kết</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">Vui lòng nhập một giá trị hợp lệ. Trường không hoàn chỉnh hoặc có giá trị không hợp lệ.</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">Hãy kéo dài văn bản này thành <ph name="MIN_CHARACTERS" /> ký tự trở lên (bạn hiện đang sử dụng <ph name="CURRENT_LENGTH" /> ký tự).</translation>
 <translation id="383465348367842624">Phần đứng trước '<ph name="ATSIGN" />' không được chứa biểu tượng '<ph name="INVALIDCHARACTER" />'.</translation>
 <translation id="3846214748874656680">Thoát chế độ toàn màn hình</translation>
-<translation id="3904511540324382638">Thoát chế độ hình trong hình</translation>
 <translation id="3920932319529768807">kết luận</translation>
 <translation id="3924558731517983934">ứng dụng</translation>
 <translation id="3944740393230681990">phần mở đầu</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">lời bạt</translation>
 <translation id="6209276755895393898">Có vẻ như là: <ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">bảng thuật ngữ</translation>
-<translation id="628938136236500310">Đang phát ở chế độ hình trong hình</translation>
+<translation id="6310801910862476708">Thoát chế độ hình trong hình</translation>
 <translation id="6398862346408813489">Hiển thị bảng lựa chọn tháng</translation>
 <translation id="6404546809543547843">trình kiểm soát thời gian âm thanh</translation>
 <translation id="6443871981718447451">hiển thị menu phụ đề chi tiết</translation>
diff --git a/content/app/strings/translations/content_strings_zh-CN.xtb b/content/app/strings/translations/content_strings_zh-CN.xtb
index a1a1c49..d5729fd 100644
--- a/content/app/strings/translations/content_strings_zh-CN.xtb
+++ b/content/app/strings/translations/content_strings_zh-CN.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">请输入用逗号分隔的电子邮件地址的列表。</translation>
 <translation id="2940813599313844715">对象</translation>
 <translation id="2942448076852699108">突出显示的内容</translation>
-<translation id="2983835398644161987">退出“画中画”模式</translation>
 <translation id="3040011195152428237">链接</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">请输入一个有效值。该字段不完整或存在无效日期。</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">请将该文本增加为 <ph name="MIN_CHARACTERS" /> 个字符或更多(您当前使用的是 <ph name="CURRENT_LENGTH" /> 个字符)。</translation>
 <translation id="383465348367842624">“<ph name="ATSIGN" />”前面的内容不应包含符号“<ph name="INVALIDCHARACTER" />”。</translation>
 <translation id="3846214748874656680">退出全屏模式</translation>
-<translation id="3904511540324382638">退出“画中画”模式</translation>
 <translation id="3920932319529768807">总结</translation>
 <translation id="3924558731517983934">应用</translation>
 <translation id="3944740393230681990">序言</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">后记</translation>
 <translation id="6209276755895393898">似乎是:<ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">词汇表</translation>
-<translation id="628938136236500310">以“画中画”模式播放</translation>
+<translation id="6310801910862476708">退出“画中画”模式</translation>
 <translation id="6398862346408813489">显示月份选择面板</translation>
 <translation id="6404546809543547843">音频时间进度条</translation>
 <translation id="6443871981718447451">显示字幕菜单</translation>
diff --git a/content/app/strings/translations/content_strings_zh-TW.xtb b/content/app/strings/translations/content_strings_zh-TW.xtb
index cca39e9..72b7b42 100644
--- a/content/app/strings/translations/content_strings_zh-TW.xtb
+++ b/content/app/strings/translations/content_strings_zh-TW.xtb
@@ -60,7 +60,6 @@
 <translation id="2908441821576996758">請輸入以逗號分隔的電子郵件地址清單。</translation>
 <translation id="2940813599313844715">物件</translation>
 <translation id="2942448076852699108">醒目顯示的內容</translation>
-<translation id="2983835398644161987">離開子母畫面</translation>
 <translation id="3040011195152428237">連結</translation>
 <translation id="3049748772180311791"><ph name="QUANTITY" /> MB</translation>
 <translation id="3075154866155599887">欄位內容不完整或日期無效,請輸入有效的值。</translation>
@@ -80,7 +79,6 @@
 <translation id="3822383571486410024">請將這段文字加長到 <ph name="MIN_CHARACTERS" /> 個字元以上 (目前使用字元數:<ph name="CURRENT_LENGTH" />)。</translation>
 <translation id="383465348367842624">「<ph name="ATSIGN" />」後面的部分不應包含「<ph name="INVALIDCHARACTER" />」符號。</translation>
 <translation id="3846214748874656680">結束全螢幕</translation>
-<translation id="3904511540324382638">離開子母畫面</translation>
 <translation id="3920932319529768807">結論</translation>
 <translation id="3924558731517983934">應用程式</translation>
 <translation id="3944740393230681990">序言</translation>
@@ -151,7 +149,7 @@
 <translation id="6166809985690652833">後記</translation>
 <translation id="6209276755895393898">圖片內容似乎是:<ph name="DESCRIPTION" /></translation>
 <translation id="6213469881011901533">詞彙解釋</translation>
-<translation id="628938136236500310">正在以子母畫面模式播放影片</translation>
+<translation id="6310801910862476708">離開子母畫面</translation>
 <translation id="6398862346408813489">顯示月份選取面板</translation>
 <translation id="6404546809543547843">音訊時間點拖曳工具</translation>
 <translation id="6443871981718447451">顯示隱藏式輔助字幕選單</translation>
diff --git a/content/browser/accessibility/accessibility_ipc_error_browsertest.cc b/content/browser/accessibility/accessibility_ipc_error_browsertest.cc
index 2a8894d..2ff4266 100644
--- a/content/browser/accessibility/accessibility_ipc_error_browsertest.cc
+++ b/content/browser/accessibility/accessibility_ipc_error_browsertest.cc
@@ -117,16 +117,16 @@
   VLOG(1) << tree->ToString();
 
   EXPECT_EQ(ax::mojom::Role::kRootWebArea, root->data().role);
-  ASSERT_EQ(2, root->child_count());
+  ASSERT_EQ(2, root->GetUnignoredChildCount());
 
-  const ui::AXNode* live_region = root->ChildAtIndex(0);
-  ASSERT_EQ(1, live_region->child_count());
+  const ui::AXNode* live_region = root->GetUnignoredChildAtIndex(0);
+  ASSERT_EQ(1, live_region->GetUnignoredChildCount());
   EXPECT_EQ(ax::mojom::Role::kGenericContainer, live_region->data().role);
 
-  const ui::AXNode* para = live_region->ChildAtIndex(0);
+  const ui::AXNode* para = live_region->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kParagraph, para->data().role);
 
-  const ui::AXNode* button = root->ChildAtIndex(1);
+  const ui::AXNode* button = root->GetUnignoredChildAtIndex(1);
   EXPECT_EQ(ax::mojom::Role::kButton, button->data().role);
 }
 
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.cc b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
index 26dd7e32..eb98c7c 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_blink.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
@@ -181,6 +181,7 @@
   AddPropertyFilter(property_filters, "flowtoIds*");
   AddPropertyFilter(property_filters, "detailsIds*");
   AddPropertyFilter(property_filters, "invalidState=*");
+  AddPropertyFilter(property_filters, "ignored*");
   AddPropertyFilter(property_filters, "invalidState=false",
                     PropertyFilter::DENY);  // Don't show false value
   AddPropertyFilter(property_filters, "roleDescription=*");
@@ -202,8 +203,9 @@
     const BrowserAccessibility& node) const {
   if (node.HasStringAttribute(ax::mojom::StringAttribute::kChildTreeId))
     return node.PlatformChildCount();
-  else
-    return node.InternalChildCount();
+  // We don't want to use InternalGetChild as we want to include
+  // ignored nodes in the tree for tests.
+  return node.node()->child_count();
 }
 
 BrowserAccessibility* AccessibilityTreeFormatterBlink::GetChild(
@@ -211,8 +213,11 @@
     uint32_t i) const {
   if (node.HasStringAttribute(ax::mojom::StringAttribute::kChildTreeId))
     return node.PlatformGetChild(i);
-  else
-    return node.InternalGetChild(i);
+  // We don't want to use InternalGetChild as we want to include
+  // ignored nodes in the tree for tests.
+  ui::AXNode* child_node = node.node()->ChildAtIndex(i);
+  DCHECK(child_node);
+  return node.manager()->GetFromAXNode(child_node);
 }
 
 void AccessibilityTreeFormatterBlink::AddProperties(
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index ba4c6e54..3fe6a2b 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -101,7 +101,7 @@
   if (!instance_active())
     return nullptr;
 
-  ui::AXNode* parent = node_->parent();
+  ui::AXNode* parent = node_->GetUnignoredParent();
   if (parent)
     return manager_->GetFromAXNode(parent);
 
@@ -307,25 +307,26 @@
 uint32_t BrowserAccessibility::InternalChildCount() const {
   if (!node_ || !manager_)
     return 0;
-  return static_cast<uint32_t>(node_->child_count());
+  return node_->GetUnignoredChildCount();
 }
 
 BrowserAccessibility* BrowserAccessibility::InternalGetChild(
     uint32_t child_index) const {
-  if (!node_ || !manager_ || child_index >= InternalChildCount())
+  if (!node_ || !manager_)
     return nullptr;
+  auto* child_node = node_->GetUnignoredChildAtIndex(child_index);
+  if (child_node)
+    return manager_->GetFromAXNode(child_node);
 
-  auto* child_node = node_->ChildAtIndex(child_index);
-  DCHECK(child_node);
-  return manager_->GetFromAXNode(child_node);
+  return nullptr;
 }
 
 BrowserAccessibility* BrowserAccessibility::InternalGetParent() const {
   if (!node_ || !manager_)
     return nullptr;
-  ui::AXNode* parent = node_->parent();
-  if (parent)
-    return manager_->GetFromAXNode(parent);
+  auto* child_node = node_->GetUnignoredParent();
+  if (child_node)
+    return manager_->GetFromAXNode(child_node);
 
   return nullptr;
 }
@@ -1389,7 +1390,7 @@
 }
 
 int BrowserAccessibility::GetIndexInParent() const {
-  return node_ ? node_->index_in_parent() : -1;
+  return node_ ? node_->GetUnignoredIndexInParent() : -1;
 }
 
 gfx::AcceleratedWidget
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h
index 574447b..fbbb490a 100644
--- a/content/browser/accessibility/browser_accessibility.h
+++ b/content/browser/accessibility/browser_accessibility.h
@@ -244,9 +244,9 @@
   bool instance_active() const { return node_ && manager_; }
   ui::AXNode* node() const { return node_; }
 
-  // These access the internal accessibility tree, which doesn't necessarily
-  // reflect the accessibility tree that should be exposed on each platform.
-  // Use PlatformChildCount and PlatformGetChild to implement platform
+  // These access the internal unignored accessibility tree, which doesn't
+  // necessarily reflect the accessibility tree that should be exposed on each
+  // platform. Use PlatformChildCount and PlatformGetChild to implement platform
   // accessibility APIs.
   uint32_t InternalChildCount() const;
   BrowserAccessibility* InternalGetChild(uint32_t child_index) const;
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index 8c257b6..9fa9a025 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -1200,7 +1200,6 @@
   BrowserAccessibility* wrapper = factory_->Create();
   id_wrapper_map_[node->id()] = wrapper;
   wrapper->Init(this, node);
-  wrapper->OnDataChanged();
 }
 
 void BrowserAccessibilityManager::OnNodeReparented(ui::AXTree* tree,
@@ -1212,7 +1211,6 @@
     id_wrapper_map_[node->id()] = wrapper;
   }
   wrapper->Init(this, node);
-  wrapper->OnDataChanged();
 }
 
 void BrowserAccessibilityManager::OnNodeChanged(ui::AXTree* tree,
@@ -1246,6 +1244,25 @@
   // we're properly connected.
   if (ax_tree_id_changed || root_changed)
     connected_to_parent_tree_node_ = false;
+
+  // Calls OnDataChanged on newly created or reparented nodes.
+  for (const auto change : changes) {
+    ui::AXNode* node = change.node;
+    BrowserAccessibility* wrapper = GetFromAXNode(node);
+    if (wrapper) {
+      switch (change.type) {
+        case NODE_CREATED:
+        case NODE_REPARENTED:
+          wrapper->OnDataChanged();
+          break;
+          // Unhandled.
+        case NODE_CHANGED:
+        case SUBTREE_CREATED:
+        case SUBTREE_REPARENTED:
+          break;
+      }
+    }
+  }
 }
 
 ui::AXNode* BrowserAccessibilityManager::GetNodeFromTree(
diff --git a/content/browser/accessibility/browser_accessibility_unittest.cc b/content/browser/accessibility/browser_accessibility_unittest.cc
index 873b961a..f01e138 100644
--- a/content/browser/accessibility/browser_accessibility_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_unittest.cc
@@ -100,11 +100,11 @@
 TEST_F(BrowserAccessibilityTest, TestGetDescendants) {
   // Set up ax tree with the following structure:
   //
-  // root____________
-  // |               |
-  // para1___        text3
-  // |       |
-  // text1   text2
+  // root_____________________
+  // |               |       |
+  // para1____       text3   para2____ (hidden)
+  // |       |               |       |
+  // text1   text2           text4   text5 (visible)
   ui::AXNodeData text1;
   text1.id = 111;
   text1.role = ax::mojom::Role::kStaticText;
@@ -120,21 +120,41 @@
   text3.role = ax::mojom::Role::kStaticText;
   text3.SetName("Three four five.");
 
+  ui::AXNodeData text4;
+  text4.id = 114;
+  text4.role = ax::mojom::Role::kStaticText;
+  text4.SetName("four five six.");
+  text4.AddState(ax::mojom::State::kIgnored);
+
+  ui::AXNodeData text5;
+  text5.id = 115;
+  text5.role = ax::mojom::Role::kStaticText;
+  text5.SetName("five six seven.");
+
   ui::AXNodeData para1;
   para1.id = 11;
   para1.role = ax::mojom::Role::kParagraph;
   para1.child_ids.push_back(text1.id);
   para1.child_ids.push_back(text2.id);
 
+  ui::AXNodeData para2;
+  para2.id = 12;
+  para2.role = ax::mojom::Role::kParagraph;
+  para2.child_ids.push_back(text4.id);
+  para2.child_ids.push_back(text5.id);
+  para2.AddState(ax::mojom::State::kIgnored);
+
   ui::AXNodeData root;
   root.id = 1;
   root.role = ax::mojom::Role::kRootWebArea;
   root.child_ids.push_back(para1.id);
   root.child_ids.push_back(text3.id);
+  root.child_ids.push_back(para2.id);
 
   std::unique_ptr<BrowserAccessibilityManager> manager(
       BrowserAccessibilityManager::Create(
-          MakeAXTreeUpdate(root, para1, text1, text2, text3),
+          MakeAXTreeUpdate(root, para1, text1, text2, text3, para2, text4,
+                           text5),
           test_browser_accessibility_delegate_.get(),
           new BrowserAccessibilityFactory()));
 
@@ -143,6 +163,9 @@
   BrowserAccessibility* text1_obj = manager->GetFromID(111);
   BrowserAccessibility* text2_obj = manager->GetFromID(112);
   BrowserAccessibility* text3_obj = manager->GetFromID(113);
+  BrowserAccessibility* para2_obj = manager->GetFromID(12);
+  BrowserAccessibility* text4_obj = manager->GetFromID(114);
+  BrowserAccessibility* text5_obj = root_obj->PlatformGetChild(2);
 
   // Leaf nodes should have no children.
   std::vector<gfx::NativeViewAccessible> descendants =
@@ -156,6 +179,16 @@
   descendants = text3_obj->GetDescendants();
   EXPECT_NATIVE_VIEW_ACCESSIBLE_VECTOR_EQ(descendants, expected_descendants);
 
+  descendants = text4_obj->GetDescendants();
+  EXPECT_NATIVE_VIEW_ACCESSIBLE_VECTOR_EQ(descendants, expected_descendants);
+
+  descendants = text5_obj->GetDescendants();
+  EXPECT_NATIVE_VIEW_ACCESSIBLE_VECTOR_EQ(descendants, expected_descendants);
+
+  descendants = para2_obj->GetDescendants();
+  expected_descendants = {text5_obj->GetNativeViewAccessible()};
+  EXPECT_NATIVE_VIEW_ACCESSIBLE_VECTOR_EQ(descendants, expected_descendants);
+
   // Verify that para1 has two children (text1 and tex2).
   descendants = para_obj->GetDescendants();
   expected_descendants = {text1_obj->GetNativeViewAccessible(),
@@ -164,11 +197,13 @@
 
   // Calling GetChildNodeIds on the root should encompass the entire
   // right and left subtrees (para1, text1, text2, and text3).
+  // para2 and its subtree should be ignored, except for text5
   descendants = root_obj->GetDescendants();
   expected_descendants = {para_obj->GetNativeViewAccessible(),
                           text1_obj->GetNativeViewAccessible(),
                           text2_obj->GetNativeViewAccessible(),
-                          text3_obj->GetNativeViewAccessible()};
+                          text3_obj->GetNativeViewAccessible(),
+                          text5_obj->GetNativeViewAccessible()};
   EXPECT_NATIVE_VIEW_ACCESSIBLE_VECTOR_EQ(descendants, expected_descendants);
 
   manager.reset();
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
index a34d8ab9..bcabb28 100644
--- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
+++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -188,8 +188,8 @@
   EXPECT_EQ(ax::mojom::Role::kRootWebArea, root->data().role);
 
   // Check properties of the BODY element.
-  ASSERT_EQ(1, root->child_count());
-  const ui::AXNode* body = root->ChildAtIndex(0);
+  ASSERT_EQ(1, root->GetUnignoredChildCount());
+  const ui::AXNode* body = root->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kGenericContainer, body->data().role);
   EXPECT_STREQ("body",
                GetAttr(body, ax::mojom::StringAttribute::kHtmlTag).c_str());
@@ -197,9 +197,9 @@
                GetAttr(body, ax::mojom::StringAttribute::kDisplay).c_str());
 
   // Check properties of the two children of the BODY element.
-  ASSERT_EQ(2, body->child_count());
+  ASSERT_EQ(2, body->GetUnignoredChildCount());
 
-  const ui::AXNode* button = body->ChildAtIndex(0);
+  const ui::AXNode* button = body->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kButton, button->data().role);
   EXPECT_STREQ("input",
                GetAttr(button, ax::mojom::StringAttribute::kHtmlTag).c_str());
@@ -213,7 +213,7 @@
   EXPECT_STREQ("value", button->data().html_attributes[1].first.c_str());
   EXPECT_STREQ("push", button->data().html_attributes[1].second.c_str());
 
-  const ui::AXNode* checkbox = body->ChildAtIndex(1);
+  const ui::AXNode* checkbox = body->GetUnignoredChildAtIndex(1);
   EXPECT_EQ(ax::mojom::Role::kCheckBox, checkbox->data().role);
   EXPECT_STREQ("input",
                GetAttr(checkbox, ax::mojom::StringAttribute::kHtmlTag).c_str());
@@ -238,10 +238,10 @@
 
   const ui::AXTree& tree = GetAXTree();
   const ui::AXNode* root = tree.root();
-  ASSERT_EQ(1, root->child_count());
-  const ui::AXNode* body = root->ChildAtIndex(0);
-  ASSERT_EQ(1, body->child_count());
-  const ui::AXNode* text = body->ChildAtIndex(0);
+  ASSERT_EQ(1, root->GetUnignoredChildCount());
+  const ui::AXNode* body = root->GetUnignoredChildAtIndex(0);
+  ASSERT_EQ(1, body->GetUnignoredChildCount());
+  const ui::AXNode* text = body->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kTextField, text->data().role);
   EXPECT_STREQ("input",
                GetAttr(text, ax::mojom::StringAttribute::kHtmlTag).c_str());
@@ -269,10 +269,10 @@
 
   const ui::AXTree& tree = GetAXTree();
   const ui::AXNode* root = tree.root();
-  ASSERT_EQ(1, root->child_count());
-  const ui::AXNode* body = root->ChildAtIndex(0);
-  ASSERT_EQ(1, body->child_count());
-  const ui::AXNode* text = body->ChildAtIndex(0);
+  ASSERT_EQ(1, root->GetUnignoredChildCount());
+  const ui::AXNode* body = root->GetUnignoredChildAtIndex(0);
+  ASSERT_EQ(1, body->GetUnignoredChildCount());
+  const ui::AXNode* text = body->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kTextField, text->data().role);
   EXPECT_STREQ("input",
                GetAttr(text, ax::mojom::StringAttribute::kHtmlTag).c_str());
@@ -323,33 +323,33 @@
 
   const ui::AXTree& tree = GetAXTree();
   const ui::AXNode* root = tree.root();
-  ASSERT_EQ(1, root->child_count());
-  const ui::AXNode* body = root->ChildAtIndex(0);
-  ASSERT_EQ(3, body->child_count());
+  ASSERT_EQ(1, root->GetUnignoredChildCount());
+  const ui::AXNode* body = root->GetUnignoredChildAtIndex(0);
+  ASSERT_EQ(3, body->GetUnignoredChildCount());
 
-  const ui::AXNode* button1 = body->ChildAtIndex(0);
+  const ui::AXNode* button1 = body->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kButton, button1->data().role);
   EXPECT_STREQ("Button 1",
                GetAttr(button1, ax::mojom::StringAttribute::kName).c_str());
 
-  const ui::AXNode* iframe = body->ChildAtIndex(1);
+  const ui::AXNode* iframe = body->GetUnignoredChildAtIndex(1);
   EXPECT_STREQ("iframe",
                GetAttr(iframe, ax::mojom::StringAttribute::kHtmlTag).c_str());
-  ASSERT_EQ(1, iframe->child_count());
+  ASSERT_EQ(1, iframe->GetUnignoredChildCount());
 
-  const ui::AXNode* sub_document = iframe->ChildAtIndex(0);
+  const ui::AXNode* sub_document = iframe->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kWebArea, sub_document->data().role);
-  ASSERT_EQ(1, sub_document->child_count());
+  ASSERT_EQ(1, sub_document->GetUnignoredChildCount());
 
-  const ui::AXNode* sub_body = sub_document->ChildAtIndex(0);
-  ASSERT_EQ(1, sub_body->child_count());
+  const ui::AXNode* sub_body = sub_document->GetUnignoredChildAtIndex(0);
+  ASSERT_EQ(1, sub_body->GetUnignoredChildCount());
 
-  const ui::AXNode* button2 = sub_body->ChildAtIndex(0);
+  const ui::AXNode* button2 = sub_body->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kButton, button2->data().role);
   EXPECT_STREQ("Button 2",
                GetAttr(button2, ax::mojom::StringAttribute::kName).c_str());
 
-  const ui::AXNode* button3 = body->ChildAtIndex(2);
+  const ui::AXNode* button3 = body->GetUnignoredChildAtIndex(2);
   EXPECT_EQ(ax::mojom::Role::kButton, button3->data().role);
   EXPECT_STREQ("Button 3",
                GetAttr(button3, ax::mojom::StringAttribute::kName).c_str());
@@ -396,18 +396,24 @@
 
   const ui::AXTree& tree = GetAXTree();
   const ui::AXNode* root = tree.root();
-  const ui::AXNode* table = root->ChildAtIndex(0);
+  const ui::AXNode* table = root->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kTable, table->data().role);
-  ASSERT_GE(table->child_count(), 2);
-  EXPECT_EQ(ax::mojom::Role::kRow, table->ChildAtIndex(0)->data().role);
-  EXPECT_EQ(ax::mojom::Role::kRow, table->ChildAtIndex(1)->data().role);
+  ASSERT_GE(table->GetUnignoredChildCount(), 2);
+  EXPECT_EQ(ax::mojom::Role::kRow,
+            table->GetUnignoredChildAtIndex(0)->data().role);
+  EXPECT_EQ(ax::mojom::Role::kRow,
+            table->GetUnignoredChildAtIndex(1)->data().role);
   EXPECT_EQ(3, GetIntAttr(table, ax::mojom::IntAttribute::kTableColumnCount));
   EXPECT_EQ(2, GetIntAttr(table, ax::mojom::IntAttribute::kTableRowCount));
 
-  const ui::AXNode* cell1 = table->ChildAtIndex(0)->ChildAtIndex(0);
-  const ui::AXNode* cell2 = table->ChildAtIndex(0)->ChildAtIndex(1);
-  const ui::AXNode* cell3 = table->ChildAtIndex(1)->ChildAtIndex(0);
-  const ui::AXNode* cell4 = table->ChildAtIndex(1)->ChildAtIndex(1);
+  const ui::AXNode* cell1 =
+      table->GetUnignoredChildAtIndex(0)->GetUnignoredChildAtIndex(0);
+  const ui::AXNode* cell2 =
+      table->GetUnignoredChildAtIndex(0)->GetUnignoredChildAtIndex(1);
+  const ui::AXNode* cell3 =
+      table->GetUnignoredChildAtIndex(1)->GetUnignoredChildAtIndex(0);
+  const ui::AXNode* cell4 =
+      table->GetUnignoredChildAtIndex(1)->GetUnignoredChildAtIndex(1);
 
   EXPECT_EQ(0,
             GetIntAttr(cell1, ax::mojom::IntAttribute::kTableCellColumnIndex));
@@ -440,8 +446,8 @@
   NavigateToURL(shell(), url);
   const ui::AXTree& tree = GetAXTree();
   const ui::AXNode* root = tree.root();
-  ASSERT_EQ(1, root->child_count());
-  const ui::AXNode* textbox = root->ChildAtIndex(0);
+  ASSERT_EQ(1, root->GetUnignoredChildCount());
+  const ui::AXNode* textbox = root->GetUnignoredChildAtIndex(0);
   EXPECT_TRUE(textbox->data().HasAction(ax::mojom::Action::kSetValue));
 }
 
@@ -462,17 +468,17 @@
 
   const ui::AXTree& tree = GetAXTree();
   const ui::AXNode* root = tree.root();
-  const ui::AXNode* table = root->ChildAtIndex(0);
+  const ui::AXNode* table = root->GetUnignoredChildAtIndex(0);
   EXPECT_EQ(ax::mojom::Role::kTable, table->data().role);
-  EXPECT_EQ(1, table->child_count());
-  const ui::AXNode* row = table->ChildAtIndex(0);
-  EXPECT_EQ(5, row->child_count());
+  EXPECT_EQ(1, table->GetUnignoredChildCount());
+  const ui::AXNode* row = table->GetUnignoredChildAtIndex(0);
+  EXPECT_EQ(5, row->GetUnignoredChildCount());
 
-  const ui::AXNode* header1 = row->ChildAtIndex(0);
-  const ui::AXNode* header2 = row->ChildAtIndex(1);
-  const ui::AXNode* header3 = row->ChildAtIndex(2);
-  const ui::AXNode* header4 = row->ChildAtIndex(3);
-  const ui::AXNode* header5 = row->ChildAtIndex(4);
+  const ui::AXNode* header1 = row->GetUnignoredChildAtIndex(0);
+  const ui::AXNode* header2 = row->GetUnignoredChildAtIndex(1);
+  const ui::AXNode* header3 = row->GetUnignoredChildAtIndex(2);
+  const ui::AXNode* header4 = row->GetUnignoredChildAtIndex(3);
+  const ui::AXNode* header5 = row->GetUnignoredChildAtIndex(4);
 
   EXPECT_EQ(static_cast<int>(ax::mojom::SortDirection::kAscending),
             GetIntAttr(header1, ax::mojom::IntAttribute::kSortDirection));
diff --git a/content/browser/accessibility/snapshot_ax_tree_browsertest.cc b/content/browser/accessibility/snapshot_ax_tree_browsertest.cc
index 912294f..f32a8cf 100644
--- a/content/browser/accessibility/snapshot_ax_tree_browsertest.cc
+++ b/content/browser/accessibility/snapshot_ax_tree_browsertest.cc
@@ -52,7 +52,7 @@
             node->data().GetStringAttribute(ax::mojom::StringAttribute::kName) +
             "'";
   *dst += "\n";
-  for (int i = 0; i < node->child_count(); ++i)
+  for (int i = 0; i < node->GetUnignoredChildCount(); ++i)
     DumpRolesAndNamesAsText(node->children()[i], indent + 1, dst);
 }
 
@@ -87,9 +87,9 @@
   ui::AXNode* root = tree.root();
   ASSERT_NE(nullptr, root);
   ASSERT_EQ(ax::mojom::Role::kRootWebArea, root->data().role);
-  ui::AXNode* group = root->ChildAtIndex(0);
+  ui::AXNode* group = root->GetUnignoredChildAtIndex(0);
   ASSERT_EQ(ax::mojom::Role::kGenericContainer, group->data().role);
-  ui::AXNode* button = group->ChildAtIndex(0);
+  ui::AXNode* button = group->GetUnignoredChildAtIndex(0);
   ASSERT_EQ(ax::mojom::Role::kButton, button->data().role);
 }
 
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index dc54c096..6a24bdf8 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -1308,8 +1308,7 @@
   }
 
 #if defined(OS_WIN)
-  if (base::FeatureList::IsEnabled(display::features::kHighDynamicRange))
-    HDRProxy::Initialize();
+  HDRProxy::Initialize();
   system_message_window_.reset(new media::SystemMessageWindowWin);
 #elif defined(OS_LINUX) && defined(USE_UDEV)
   device_monitor_linux_ = std::make_unique<media::DeviceMonitorLinux>();
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
index 123a293..19967b3 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -171,14 +171,14 @@
   SiteInstance* owner_site_instance = delegate_->GetOwnerSiteInstance();
   if (!owner_site_instance)
     return MSG_ROUTING_NONE;
-  int proxy_routing_id = GetWebContents()
-                             ->GetFrameTree()
-                             ->root()
-                             ->render_manager()
-                             ->CreateRenderFrameProxy(owner_site_instance);
-  guest_proxy_routing_id_ = RenderFrameProxyHost::FromID(
-      owner_site_instance->GetProcess()->GetID(), proxy_routing_id)
-          ->GetRenderViewHost()->GetRoutingID();
+
+  RenderFrameHostManager* rfh_manager =
+      GetWebContents()->GetFrameTree()->root()->render_manager();
+  rfh_manager->CreateRenderFrameProxy(owner_site_instance);
+  guest_proxy_routing_id_ =
+      rfh_manager->GetRenderFrameProxyHost(owner_site_instance)
+          ->GetRenderViewHost()
+          ->GetRoutingID();
 
   return guest_proxy_routing_id_;
 }
diff --git a/content/browser/browsing_data/clear_site_data_handler_browsertest.cc b/content/browser/browsing_data/clear_site_data_handler_browsertest.cc
index 7eb6326..c7a7e45 100644
--- a/content/browser/browsing_data/clear_site_data_handler_browsertest.cc
+++ b/content/browser/browsing_data/clear_site_data_handler_browsertest.cc
@@ -14,6 +14,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
+#include "base/test/bind_test_util.h"
 #include "build/build_config.h"
 #include "components/network_session_configurator/common/network_switches.h"
 #include "content/browser/browsing_data/browsing_data_filter_builder_impl.h"
@@ -1007,18 +1008,23 @@
   // Update the service worker and send C-S-D during update.
   delegate()->ExpectClearSiteDataCall(url::Origin::Create(url), false, true,
                                       false);
+
+  base::RunLoop loop;
+  auto* remover = BrowserContext::GetBrowsingDataRemover(browser_context());
+  remover->SetWouldCompleteCallbackForTesting(
+      base::BindLambdaForTesting([&](const base::RepeatingClosure& callback) {
+        callback.Run();
+        loop.Quit();
+      }));
+
   SetClearSiteDataHeader("\"storage\"");
   // Expect the update to fail and the service worker to be removed.
   EXPECT_FALSE(RunScriptAndGetBool("updateServiceWorker()"));
   delegate()->VerifyAndClearExpectations();
-  // The service worker should be gone but a few tests are flaky and fail
-  // because it hasn't been removed. To find out if this is just a
-  // timing issue, add some delay if the first call returns true.
-  // TODO(crbug.com/912313): Check if this worked and find out why.
-  if (RunScriptAndGetBool("hasServiceWorker()")) {
-    LOG(ERROR) << "There was a service worker, checking again in a second";
-    EXPECT_FALSE(RunScriptAndGetBool("setTimeout(hasServiceWorker, 1000)"));
-  }
+  loop.Run();
+
+  // Notify crbug.com/912313 if the test fails here again.
+  EXPECT_FALSE(RunScriptAndGetBool("hasServiceWorker()"));
 }
 
 }  // namespace content
diff --git a/content/browser/dom_storage/session_storage_namespace_impl_mojo.cc b/content/browser/dom_storage/session_storage_namespace_impl_mojo.cc
index 25a4a2f5..7c93f6c 100644
--- a/content/browser/dom_storage/session_storage_namespace_impl_mojo.cc
+++ b/content/browser/dom_storage/session_storage_namespace_impl_mojo.cc
@@ -131,8 +131,10 @@
   }
   DCHECK(IsPopulated());
   auto it = origin_areas_.find(origin);
-  if (it == origin_areas_.end())
+  if (it == origin_areas_.end()) {
+    std::move(callback).Run();
     return;
+  }
   // Renderer process expects |source| to always be two newline separated
   // strings.
   it->second->DeleteAll(
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc
index 16c6ef5..0b40d95 100644
--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -424,15 +424,11 @@
                      std::string());
   EXPECT_EQ(url_2, controller.GetVisibleEntry()->GetURL());
 
-  // The DidFailProvsionalLoad IPC is received from the current RFH that is
-  // committing an error page. This should not reset the pending entry for the
-  // new ongoing navigation.
-  FrameHostMsg_DidFailProvisionalLoadWithError_Params error;
-  error.error_code = net::ERR_TIMED_OUT;
-  error.url = url_1;
-  main_test_rfh()->OnMessageReceived(
-      FrameHostMsg_DidFailProvisionalLoadWithError(
-          main_test_rfh()->GetRoutingID(), error));
+  // The DidFailProvsionalLoad mojo call is received from the current RFH that
+  // is committing an error page. This should not reset the pending entry for
+  // the new ongoing navigation.
+  main_test_rfh()->DidFailProvisionalLoadWithError(url_1, net::ERR_TIMED_OUT,
+                                                   base::string16(), false);
   EXPECT_EQ(url_2, controller.GetVisibleEntry()->GetURL());
 }
 
@@ -1118,14 +1114,8 @@
 
   // It may abort before committing, if it's a download or due to a stop or
   // a new navigation from the user.
-  FrameHostMsg_DidFailProvisionalLoadWithError_Params params;
-  params.error_code = net::ERR_ABORTED;
-  params.error_description = base::string16();
-  params.url = kNewURL;
-  params.showing_repost_interstitial = false;
-  main_test_rfh()->OnMessageReceived(
-      FrameHostMsg_DidFailProvisionalLoadWithError(0,  // routing_id
-                                                   params));
+  main_test_rfh()->DidFailProvisionalLoadWithError(kNewURL, net::ERR_ABORTED,
+                                                   base::string16(), false);
 
   // This should not clear the pending entry or notify of a navigation state
   // change, so that we keep displaying kNewURL (until the user clears it).
@@ -2549,7 +2539,6 @@
   // which causes the pending entry to be cleared.
   NavigationSimulator::NavigateAndFailFromDocument(url, net::ERR_ABORTED,
                                                    main_test_rfh());
-
   // Now the pending restored entry commits.
   restore_navigation->Commit();
 
@@ -3058,13 +3047,8 @@
 
   // Suppose it aborts before committing, if it's a 204 or download or due to a
   // stop or a new navigation from the user.  The URL should remain visible.
-  FrameHostMsg_DidFailProvisionalLoadWithError_Params params;
-  params.error_code = net::ERR_ABORTED;
-  params.error_description = base::string16();
-  params.url = url;
-  params.showing_repost_interstitial = false;
-  main_test_rfh()->OnMessageReceived(
-      FrameHostMsg_DidFailProvisionalLoadWithError(0, params));
+  main_test_rfh()->DidFailProvisionalLoadWithError(url, net::ERR_ABORTED,
+                                                   base::string16(), false);
   EXPECT_EQ(url, controller.GetVisibleEntry()->GetURL());
 
   // If something else later modifies the contents of the about:blank page, then
diff --git a/content/browser/frame_host/navigator.h b/content/browser/frame_host/navigator.h
index 9ae7978..f7f6fc2 100644
--- a/content/browser/frame_host/navigator.h
+++ b/content/browser/frame_host/navigator.h
@@ -18,7 +18,6 @@
 
 class GURL;
 struct FrameHostMsg_DidCommitProvisionalLoad_Params;
-struct FrameHostMsg_DidFailProvisionalLoadWithError_Params;
 
 namespace base {
 class TimeTicks;
@@ -56,7 +55,10 @@
   // The RenderFrameHostImpl has failed a provisional load.
   virtual void DidFailProvisionalLoadWithError(
       RenderFrameHostImpl* render_frame_host,
-      const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) {}
+      const GURL& url,
+      int error_code,
+      const base::string16& error_description,
+      bool showing_repost_interstitial) {}
 
   // The RenderFrameHostImpl has failed to load the document.
   virtual void DidFailLoadWithError(RenderFrameHostImpl* render_frame_host,
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc
index 242dacf..5eca1407 100644
--- a/content/browser/frame_host/navigator_impl.cc
+++ b/content/browser/frame_host/navigator_impl.cc
@@ -108,18 +108,20 @@
 
 void NavigatorImpl::DidFailProvisionalLoadWithError(
     RenderFrameHostImpl* render_frame_host,
-    const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) {
-  VLOG(1) << "Failed Provisional Load: " << params.url.possibly_invalid_spec()
-          << ", error_code: " << params.error_code
-          << ", error_description: " << params.error_description
-          << ", showing_repost_interstitial: "
-          << params.showing_repost_interstitial
+    const GURL& url,
+    int error_code,
+    const base::string16& error_description,
+    bool showing_repost_interstitial) {
+  VLOG(1) << "Failed Provisional Load: " << url.possibly_invalid_spec()
+          << ", error_code: " << error_code
+          << ", error_description: " << error_description
+          << ", showing_repost_interstitial: " << showing_repost_interstitial
           << ", frame_id: " << render_frame_host->GetRoutingID();
-  GURL validated_url(params.url);
+  GURL validated_url(url);
   RenderProcessHost* render_process_host = render_frame_host->GetProcess();
   render_process_host->FilterURL(false, &validated_url);
 
-  if (net::ERR_ABORTED == params.error_code) {
+  if (net::ERR_ABORTED == error_code) {
     // EVIL HACK ALERT! Ignore failed loads when we're showing interstitials.
     // This means that the interstitial won't be torn down properly, which is
     // bad. But if we have an interstitial, go back to another tab type, and
diff --git a/content/browser/frame_host/navigator_impl.h b/content/browser/frame_host/navigator_impl.h
index 9fe28532..b61f645 100644
--- a/content/browser/frame_host/navigator_impl.h
+++ b/content/browser/frame_host/navigator_impl.h
@@ -42,8 +42,10 @@
   NavigationController* GetController() override;
   void DidFailProvisionalLoadWithError(
       RenderFrameHostImpl* render_frame_host,
-      const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params)
-      override;
+      const GURL& url,
+      int error_code,
+      const base::string16& error_description,
+      bool showing_repost_interstitial) override;
   void DidFailLoadWithError(RenderFrameHostImpl* render_frame_host,
                             const GURL& url,
                             int error_code,
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 47e5d1da8..14bc2ffd 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1136,6 +1136,10 @@
   return frame_size_;
 }
 
+size_t RenderFrameHostImpl::GetFrameDepth() {
+  return frame_tree_node()->depth();
+}
+
 bool RenderFrameHostImpl::IsCrossProcessSubframe() {
   if (!parent_)
     return false;
@@ -1399,10 +1403,6 @@
   IPC_BEGIN_MESSAGE_MAP(RenderFrameHostImpl, msg)
     IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach)
     IPC_MESSAGE_HANDLER(FrameHostMsg_FrameFocused, OnFrameFocused)
-    IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailProvisionalLoadWithError,
-                        OnDidFailProvisionalLoadWithError)
-    IPC_MESSAGE_HANDLER(FrameHostMsg_DidFailLoadWithError,
-                        OnDidFailLoadWithError)
     IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateState, OnUpdateState)
     IPC_MESSAGE_HANDLER(FrameHostMsg_OpenURL, OnOpenURL)
     IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnload_ACK, OnBeforeUnloadACK)
@@ -2157,13 +2157,15 @@
     uint64_t features_mask) {
   scheduler_tracked_features_ = features_mask;
 }
-
-void RenderFrameHostImpl::OnDidFailProvisionalLoadWithError(
-    const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params) {
+void RenderFrameHostImpl::DidFailProvisionalLoadWithError(
+    const GURL& url,
+    int error_code,
+    const base::string16& error_description,
+    bool showing_repost_interstitial) {
   TRACE_EVENT2("navigation",
-               "RenderFrameHostImpl::OnDidFailProvisionalLoadWithError",
+               "RenderFrameHostImpl::DidFailProvisionalLoadWithError",
                "frame_tree_node", frame_tree_node_->frame_tree_node_id(),
-               "error", params.error_code);
+               "error", error_code);
   // TODO(clamy): Kill the renderer with RFH_FAIL_PROVISIONAL_LOAD_NO_HANDLE and
   // return early if navigation_handle_ is null, once we prevent that case from
   // happening in practice. See https://crbug.com/605289.
@@ -2171,18 +2173,19 @@
   // Update the error code in the NavigationHandle of the navigation.
   if (GetNavigationHandle()) {
     GetNavigationHandle()->set_net_error_code(
-        static_cast<net::Error>(params.error_code));
+        static_cast<net::Error>(error_code));
   }
 
-  frame_tree_node_->navigator()->DidFailProvisionalLoadWithError(this, params);
+  frame_tree_node_->navigator()->DidFailProvisionalLoadWithError(
+      this, url, error_code, error_description, showing_repost_interstitial);
 }
 
-void RenderFrameHostImpl::OnDidFailLoadWithError(
+void RenderFrameHostImpl::DidFailLoadWithError(
     const GURL& url,
     int error_code,
     const base::string16& error_description) {
   TRACE_EVENT2("navigation",
-               "RenderFrameHostImpl::OnDidFailProvisionalLoadWithError",
+               "RenderFrameHostImpl::DidFailProvisionalLoadWithError",
                "frame_tree_node", frame_tree_node_->frame_tree_node_id(),
                "error", error_code);
 
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 2c3a4ae..e89b40a 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -99,8 +99,6 @@
 struct AccessibilityHostMsg_EventBundleParams;
 struct AccessibilityHostMsg_FindInPageResultParams;
 struct AccessibilityHostMsg_LocationChangeParams;
-struct FrameHostMsg_DidCommitProvisionalLoad_Params;
-struct FrameHostMsg_DidFailProvisionalLoadWithError_Params;
 struct FrameHostMsg_OpenURL_Params;
 struct FrameMsg_TextTrackSettings_Params;
 #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU)
@@ -221,6 +219,7 @@
   const std::string& GetFrameName() override;
   bool IsFrameDisplayNone() override;
   const base::Optional<gfx::Size>& GetFrameSize() override;
+  size_t GetFrameDepth() override;
   bool IsCrossProcessSubframe() override;
   const GURL& GetLastCommittedURL() override;
   const url::Origin& GetLastCommittedOrigin() override;
@@ -1063,11 +1062,6 @@
   void OnDetach();
   void OnFrameFocused();
   void OnOpenURL(const FrameHostMsg_OpenURL_Params& params);
-  void OnDidFailProvisionalLoadWithError(
-      const FrameHostMsg_DidFailProvisionalLoadWithError_Params& params);
-  void OnDidFailLoadWithError(const GURL& url,
-                              int error_code,
-                              const base::string16& error_description);
   void OnUpdateState(const PageState& state);
   void OnBeforeUnloadACK(
       bool proceed,
@@ -1219,7 +1213,14 @@
                               const base::string16& message,
                               int32_t line_no,
                               const base::string16& source_id) override;
-
+  void DidFailProvisionalLoadWithError(
+      const GURL& url,
+      int error_code,
+      const base::string16& error_description,
+      bool showing_repost_interstitial) override;
+  void DidFailLoadWithError(const GURL& url,
+                            int error_code,
+                            const base::string16& error_description) override;
 #if defined(OS_ANDROID)
   void UpdateUserGestureCarryoverInfo() override;
 #endif
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc
index 184de12..ce9c79b 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -2000,16 +2000,16 @@
   return new_render_frame_host;
 }
 
-int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) {
+void RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) {
   // A RenderFrameProxyHost should never be created in the same SiteInstance as
   // the current RFH.
   CHECK(instance);
   CHECK_NE(instance, render_frame_host_->GetSiteInstance());
 
-  // Return an already existing RenderFrameProxyHost if one exists and is alive.
+  // If a proxy already exists and is alive, nothing needs to be done.
   RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
   if (proxy && proxy->is_render_frame_proxy_live())
-    return proxy->GetRoutingID();
+    return;
 
   // At this point we know that we either have to 1) create a new
   // RenderFrameProxyHost or 2) revive an existing, but no longer alive
@@ -2035,8 +2035,6 @@
   } else {
     proxy->InitRenderFrameProxy();
   }
-
-  return proxy->GetRoutingID();
 }
 
 void RenderFrameHostManager::CreateProxiesForChildFrame(FrameTreeNode* child) {
diff --git a/content/browser/frame_host/render_frame_host_manager.h b/content/browser/frame_host/render_frame_host_manager.h
index 9aaa8af..b1c7855 100644
--- a/content/browser/frame_host/render_frame_host_manager.h
+++ b/content/browser/frame_host/render_frame_host_manager.h
@@ -297,9 +297,8 @@
   std::unique_ptr<RenderFrameHostImpl> CreateRenderFrame(SiteInstance* instance,
                                                          bool hidden);
 
-  // Helper method to create and initialize a RenderFrameProxyHost and return
-  // its routing id.
-  int CreateRenderFrameProxy(SiteInstance* instance);
+  // Helper method to create and initialize a RenderFrameProxyHost.
+  void CreateRenderFrameProxy(SiteInstance* instance);
 
   // Creates proxies for a new child frame at FrameTreeNode |child| in all
   // SiteInstances for which the current frame has proxies.  This method is
diff --git a/content/browser/network_service_client.cc b/content/browser/network_service_client.cc
index 50e7f266..5de9edc 100644
--- a/content/browser/network_service_client.cc
+++ b/content/browser/network_service_client.cc
@@ -335,20 +335,6 @@
   return WebContents::FromFrameTreeNodeId(routing_id);
 }
 
-BrowserContext* GetBrowserContextFromIds(int process_id, int routing_id) {
-  WebContents* web_contents = GetWebContents(process_id, routing_id);
-  if (web_contents)
-    return web_contents->GetBrowserContext();
-  // Some requests such as service worker updates are not associated with
-  // a WebContents so we can't use it to obtain the BrowserContext.
-  // TODO(dullweber): Could we always use RenderProcessHost?
-  RenderProcessHost* process_host = RenderProcessHostImpl::FromID(process_id);
-  if (process_host)
-    return process_host->GetBrowserContext();
-
-  return nullptr;
-}
-
 bool IsMainFrameRequest(int process_id, int routing_id) {
   if (process_id != network::mojom::kBrowserProcessId)
     return false;
@@ -443,7 +429,7 @@
     const net::AuthChallengeInfo& auth_info,
     const base::Optional<network::ResourceResponseHead>& head,
     network::mojom::AuthChallengeResponderPtr auth_challenge_responder) {
-  base::Callback<WebContents*(void)> web_contents_getter =
+  base::RepeatingCallback<WebContents*(void)> web_contents_getter =
       base::BindRepeating(GetWebContents, process_id, routing_id);
 
   if (!web_contents_getter.Run()) {
@@ -491,7 +477,7 @@
     OnSSLCertificateErrorCallback response) {
   SSLErrorDelegate* delegate =
       new SSLErrorDelegate(std::move(response));  // deletes self
-  base::Callback<WebContents*(void)> web_contents_getter =
+  base::RepeatingCallback<WebContents*(void)> web_contents_getter =
       base::BindRepeating(GetWebContents, process_id, routing_id);
   bool is_main_frame_request = IsMainFrameRequest(process_id, routing_id);
   SSLManager::OnSSLCertificateError(
@@ -564,21 +550,6 @@
   std::move(callback).Run();
 }
 
-void NetworkServiceClient::OnClearSiteData(int process_id,
-                                           int routing_id,
-                                           const GURL& url,
-                                           const std::string& header_value,
-                                           int load_flags,
-                                           OnClearSiteDataCallback callback) {
-  auto browser_context_getter =
-      base::BindRepeating(GetBrowserContextFromIds, process_id, routing_id);
-  auto web_contents_getter =
-      base::BindRepeating(GetWebContents, process_id, routing_id);
-  ClearSiteDataHandler::HandleHeader(browser_context_getter,
-                                     web_contents_getter, url, header_value,
-                                     load_flags, std::move(callback));
-}
-
 void NetworkServiceClient::OnCertDBChanged() {
   GetNetworkService()->OnCertDBChanged();
 }
diff --git a/content/browser/network_service_client.h b/content/browser/network_service_client.h
index 1069c0a..64e8b79 100644
--- a/content/browser/network_service_client.h
+++ b/content/browser/network_service_client.h
@@ -80,12 +80,6 @@
                       bool blocked_by_policy) override;
   void OnLoadingStateUpdate(std::vector<network::mojom::LoadInfoPtr> infos,
                             OnLoadingStateUpdateCallback callback) override;
-  void OnClearSiteData(int process_id,
-                       int routing_id,
-                       const GURL& url,
-                       const std::string& header_value,
-                       int load_flags,
-                       OnClearSiteDataCallback callback) override;
   void OnDataUseUpdate(int32_t network_traffic_annotation_id_hash,
                        int64_t recv_bytes,
                        int64_t sent_bytes) override;
diff --git a/content/browser/network_service_instance.cc b/content/browser/network_service_instance.cc
index c3c7336f..cfeea7a 100644
--- a/content/browser/network_service_instance.cc
+++ b/content/browser/network_service_instance.cc
@@ -183,10 +183,12 @@
           if (!file.IsValid()) {
             LOG(ERROR) << "Failed opening: " << log_path.value();
           } else {
-            // TODO(mmenke): Get capture mode from the command line.
+            net::NetLogCaptureMode capture_mode =
+                net::GetNetCaptureModeFromCommandLine(
+                    *command_line, network::switches::kNetLogCaptureMode);
+
             (*g_network_service_ptr)
-                ->StartNetLog(std::move(file),
-                              net::NetLogCaptureMode::Default(),
+                ->StartNetLog(std::move(file), capture_mode,
                               std::move(client_constants));
           }
         }
diff --git a/content/browser/portal/portal.cc b/content/browser/portal/portal.cc
index b45333f..ada87ca 100644
--- a/content/browser/portal/portal.cc
+++ b/content/browser/portal/portal.cc
@@ -163,15 +163,6 @@
 }
 
 void Portal::Navigate(const GURL& url) {
-  if (!url.SchemeIsHTTPOrHTTPS()) {
-    mojo::ReportBadMessage("Portal::Navigate tried to use non-HTTP protocol.");
-    binding_->Close();  // Also deletes |this|.
-    return;
-  }
-
-  // TODO(lfg): Investigate which other restrictions we might need when
-  // navigating portals. See http://crbug.com/964395.
-
   NavigationController::LoadURLParams load_url_params(url);
   portal_contents_impl_->GetController().LoadURLWithParams(load_url_params);
 }
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc
index a0088ca..a3f3892 100644
--- a/content/browser/portal/portal_browsertest.cc
+++ b/content/browser/portal/portal_browsertest.cc
@@ -22,7 +22,6 @@
 #include "content/public/test/hit_test_region_observer.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "content/shell/browser/shell.h"
-#include "content/test/content_browser_test_utils_internal.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -60,15 +59,6 @@
     portal_->Activate(std::move(data), std::move(callback));
   }
 
-  void Navigate(const GURL& url) override {
-    if (navigate_callback_) {
-      navigate_callback_.Run(url);
-      return;
-    }
-
-    portal_->Navigate(url);
-  }
-
   void WaitForActivate() {
     if (portal_activated_)
       return;
@@ -82,9 +72,6 @@
   content::Portal* GetPortal() { return portal_.get(); }
   WebContents* GetPortalContents() { return portal_->GetPortalContents(); }
 
-  // IPC callbacks
-  base::RepeatingCallback<void(const GURL&)> navigate_callback_;
-
  private:
   PortalInterceptorForTesting(RenderFrameHostImpl* render_frame_host_impl)
       : portal_(content::Portal::CreateForTesting(render_frame_host_impl)) {}
@@ -500,39 +487,6 @@
       << "Note: The portal's FrameSinkId is " << portal_view->GetFrameSinkId();
 }
 
-// Tests that trying to navigate to a chrome:// URL kills the renderer.
-IN_PROC_BROWSER_TEST_F(PortalBrowserTest, NavigateToChrome) {
-  EXPECT_TRUE(NavigateToURL(
-      shell(), embedded_test_server()->GetURL("portal.test", "/title1.html")));
-  WebContentsImpl* web_contents_impl =
-      static_cast<WebContentsImpl*>(shell()->web_contents());
-  RenderFrameHostImpl* main_frame = web_contents_impl->GetMainFrame();
-
-  // Create portal.
-  PortalCreatedObserver portal_created_observer(main_frame);
-  EXPECT_TRUE(ExecJs(main_frame,
-                     "var portal = document.createElement('portal');"
-                     "document.body.appendChild(portal);"));
-  Portal* portal = portal_created_observer.WaitUntilPortalCreated();
-  PortalInterceptorForTesting* portal_interceptor =
-      PortalInterceptorForTesting::From(portal);
-  WebContentsImpl* portal_contents = portal->GetPortalContents();
-
-  // Try to navigate to chrome://settings and wait for the process to die.
-  portal_interceptor->navigate_callback_ = base::BindRepeating(
-      [](Portal* portal, const GURL& url) {
-        GURL chrome_url("chrome://settings");
-        portal->Navigate(chrome_url);
-      },
-      portal);
-  RenderProcessHostKillWaiter kill_waiter(
-      portal_contents->GetMainFrame()->GetProcess());
-  GURL a_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
-  EXPECT_TRUE(ExecJs(main_frame, JsReplace("portal.src = $1;", a_url)));
-
-  EXPECT_EQ(base::nullopt, kill_waiter.Wait());
-}
-
 class PortalOOPIFBrowserTest : public PortalBrowserTest {
  protected:
   PortalOOPIFBrowserTest() {}
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index 063223c..b06af8e 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -45,7 +45,6 @@
 class ServiceWorkerJobCoordinator;
 class ServiceWorkerProviderHost;
 class ServiceWorkerRegistration;
-class ServiceWorkerStorage;
 class URLLoaderFactoryGetter;
 
 // This class manages data associated with service workers.
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc
index 72072a7..e5e181d 100644
--- a/content/browser/service_worker/service_worker_register_job.cc
+++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -667,12 +667,15 @@
         registration()->UnsetVersion(new_version());
         new_version()->Doom();
       }
-      if (!registration()->waiting_version() &&
-          !registration()->active_version()) {
+      if (!registration()->newest_installed_version()) {
         registration()->NotifyRegistrationFailed();
-        context_->storage()->DeleteRegistration(
-            registration()->id(), registration()->scope().GetOrigin(),
-            base::DoNothing());
+        if (!registration()->is_deleted()) {
+          context_->storage()->DeleteRegistration(
+              registration(), registration()->scope().GetOrigin(),
+              base::DoNothing());
+          context_->storage()->NotifyDoneUninstallingRegistration(
+              registration(), ServiceWorkerRegistration::Status::kUninstalled);
+        }
       }
     }
     if (!is_promise_resolved_)
@@ -682,8 +685,26 @@
   if (registration()) {
     context_->storage()->NotifyDoneInstallingRegistration(
         registration(), new_version(), status);
-    if (registration()->newest_installed_version())
-      registration()->set_is_uninstalled(false);
+#if DCHECK_IS_ON()
+    switch (registration()->status()) {
+      case ServiceWorkerRegistration::Status::kIntact:
+        // The registration must have a version installed, but this job may or
+        // may not have succeeded (i.e., may have failed to update).
+        DCHECK(registration()->newest_installed_version());
+        break;
+      case ServiceWorkerRegistration::Status::kUninstalling:
+        // This job must have failed. One case this happens is when the
+        // registration was already uninstalling when the job started, so it
+        // aborted.
+        DCHECK_NE(status, blink::ServiceWorkerStatusCode::kOk);
+        break;
+      case ServiceWorkerRegistration::Status::kUninstalled:
+        // This job must have failed.
+        DCHECK(!registration()->newest_installed_version());
+        DCHECK_NE(status, blink::ServiceWorkerStatusCode::kOk);
+        break;
+    }
+#endif  // DCHECK_IS_ON()
   }
 }
 
diff --git a/content/browser/service_worker/service_worker_registration.cc b/content/browser/service_worker/service_worker_registration.cc
index a724432e..09f039ec 100644
--- a/content/browser/service_worker/service_worker_registration.cc
+++ b/content/browser/service_worker/service_worker_registration.cc
@@ -46,9 +46,7 @@
     : scope_(options.scope),
       update_via_cache_(options.update_via_cache),
       registration_id_(registration_id),
-      is_deleted_(false),
-      is_uninstalling_(false),
-      is_uninstalled_(false),
+      status_(Status::kIntact),
       should_activate_when_ready_(false),
       resources_total_size_bytes_(0),
       context_(context),
@@ -68,6 +66,32 @@
     active_version()->RemoveObserver(this);
 }
 
+void ServiceWorkerRegistration::SetStatus(Status status) {
+  if (status_ == status)
+    return;
+#if DCHECK_IS_ON()
+  switch (status_) {
+    case Status::kIntact:
+      DCHECK_EQ(status, Status::kUninstalling);
+      break;
+    case Status::kUninstalling:
+      // All transitions are allowed:
+      // - To kIntact: resurrected.
+      // - To kUninstalled: finished uninstalling.
+      break;
+    case Status::kUninstalled:
+      // We can return to kIntact in the rare case of an in-progress register
+      // job that registers after DeleteVersion() deletes.
+      // TODO(crbug.com/964201): Disallow transitions after DeleteVersion aborts
+      // in-progress register jobs, for simplicity.
+      DCHECK_EQ(status, Status::kIntact);
+      break;
+  }
+#endif  // DCHECK_IS_ON()
+
+  status_ = status;
+}
+
 ServiceWorkerVersion* ServiceWorkerRegistration::GetNewestVersion() const {
   if (installing_version())
     return installing_version();
@@ -107,8 +131,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   return ServiceWorkerRegistrationInfo(
       scope(), update_via_cache(), registration_id_,
-      is_deleted_ ? ServiceWorkerRegistrationInfo::IS_DELETED
-                  : ServiceWorkerRegistrationInfo::IS_NOT_DELETED,
+      is_deleted() ? ServiceWorkerRegistrationInfo::IS_DELETED
+                   : ServiceWorkerRegistrationInfo::IS_NOT_DELETED,
       GetVersionInfo(active_version_.get()),
       GetVersionInfo(waiting_version_.get()),
       GetVersionInfo(installing_version_.get()), resources_total_size_bytes_,
@@ -246,13 +270,13 @@
 
 void ServiceWorkerRegistration::ClearWhenReady() {
   DCHECK(context_);
-  if (is_uninstalling_)
+  if (is_deleted()) {
+    // We already deleted and are waiting to clear, or the registration is
+    // already cleared.
     return;
-  is_uninstalling_ = true;
-
-  context_->storage()->NotifyUninstallingRegistration(this);
+  }
   context_->storage()->DeleteRegistration(
-      id(), scope().GetOrigin(),
+      this, scope().GetOrigin(),
       AdaptCallbackForRepeating(
           base::BindOnce(&ServiceWorkerRegistration::OnDeleteFinished, this)));
 
@@ -262,12 +286,21 @@
 
 void ServiceWorkerRegistration::AbortPendingClear(StatusCallback callback) {
   DCHECK(context_);
-  if (!is_uninstalling()) {
-    std::move(callback).Run(blink::ServiceWorkerStatusCode::kOk);
-    return;
+
+  switch (status_) {
+    case Status::kIntact:
+      std::move(callback).Run(blink::ServiceWorkerStatusCode::kOk);
+      return;
+    case Status::kUninstalling:
+      break;
+    case Status::kUninstalled:
+      NOTREACHED()
+          << "attempt to resurrect a completely uninstalled registration";
+      break;
   }
-  is_uninstalling_ = false;
-  context_->storage()->NotifyDoneUninstallingRegistration(this);
+
+  context_->storage()->NotifyDoneUninstallingRegistration(this,
+                                                          Status::kIntact);
 
   scoped_refptr<ServiceWorkerVersion> most_recent_version =
       waiting_version() ? waiting_version() : active_version();
@@ -283,7 +316,7 @@
   if (!context_)
     return;
   DCHECK_EQ(active_version(), version);
-  if (is_uninstalling_) {
+  if (is_uninstalling()) {
     // TODO(falken): This can destroy the caller during this observer function
     // call, which is impolite and dangerous. Try to make this async, or make
     // OnNoControllees not an observer function.
@@ -475,15 +508,17 @@
   if (!active_version() && !waiting_version()) {
     // Delete the records from the db.
     context_->storage()->DeleteRegistration(
-        id(), scope().GetOrigin(),
+        this, scope().GetOrigin(),
         base::BindOnce(&ServiceWorkerRegistration::OnDeleteFinished, protect));
     // But not from memory if there is a version in the pipeline.
-    // TODO(falken): Fix this logic. There could be a running register job for
-    // this registration that hasn't set installing_version() yet.
+    // TODO(crbug.com/964201): This is too clever. Delete this exception and
+    // just abort on-going register jobs.
     if (installing_version()) {
-      is_deleted_ = false;
+      context_->storage()->NotifyDoneUninstallingRegistration(this,
+                                                              Status::kIntact);
     } else {
-      is_uninstalled_ = true;
+      context_->storage()->NotifyDoneUninstallingRegistration(
+          this, Status::kUninstalled);
       NotifyRegistrationFailed();
     }
   }
@@ -581,8 +616,8 @@
 }
 
 void ServiceWorkerRegistration::Clear() {
-  is_uninstalling_ = false;
-  is_uninstalled_ = true;
+  DCHECK(is_uninstalling());
+  SetStatus(Status::kUninstalled);
   should_activate_when_ready_ = false;
 
   // Some callbacks, at least OnRegistrationFinishedUninstalling and
@@ -592,8 +627,10 @@
   // or make the observers more polite?
   auto protect = base::WrapRefCounted(this);
 
-  if (context_)
-    context_->storage()->NotifyDoneUninstallingRegistration(this);
+  if (context_) {
+    context_->storage()->NotifyDoneUninstallingRegistration(
+        this, Status::kUninstalled);
+  }
 
   std::vector<scoped_refptr<ServiceWorkerVersion>> versions_to_doom;
   auto mask =
diff --git a/content/browser/service_worker/service_worker_registration.h b/content/browser/service_worker/service_worker_registration.h
index 12b6452..69e36bd2 100644
--- a/content/browser/service_worker/service_worker_registration.h
+++ b/content/browser/service_worker/service_worker_registration.h
@@ -62,6 +62,20 @@
     virtual void OnSkippedWaiting(ServiceWorkerRegistration* registation) {}
   };
 
+  enum class Status {
+    // This registration has not been deleted.
+    kIntact,
+    // The registration data has been deleted from the database, but it's still
+    // usable: if a page has an existing controller from this registration, the
+    // controller will continue to function until all such pages are unloaded.
+    // The registration may also be resurrected if register() is called while in
+    // this state.
+    kUninstalling,
+    // This registration is completely uninstalled. It cannot be resurrected or
+    // used.
+    kUninstalled,
+  };
+
   ServiceWorkerRegistration(
       const blink::mojom::ServiceWorkerRegistrationOptions& options,
       int64_t registration_id,
@@ -73,13 +87,11 @@
     return update_via_cache_;
   }
 
-  bool is_deleted() const { return is_deleted_; }
-  void set_is_deleted(bool deleted) { is_deleted_ = deleted; }
-
-  bool is_uninstalling() const { return is_uninstalling_; }
-
-  void set_is_uninstalled(bool uninstalled) { is_uninstalled_ = uninstalled; }
-  bool is_uninstalled() const { return is_uninstalled_; }
+  bool is_deleted() const { return status_ != Status::kIntact; }
+  bool is_uninstalling() const { return status_ == Status::kUninstalling; }
+  bool is_uninstalled() const { return status_ == Status::kUninstalled; }
+  Status status() const { return status_; }
+  void SetStatus(Status status);
 
   int64_t resources_total_size_bytes() const {
     return resources_total_size_bytes_;
@@ -231,9 +243,7 @@
   const GURL scope_;
   blink::mojom::ServiceWorkerUpdateViaCache update_via_cache_;
   const int64_t registration_id_;
-  bool is_deleted_;
-  bool is_uninstalling_;
-  bool is_uninstalled_;
+  Status status_;
   bool should_activate_when_ready_;
   blink::mojom::NavigationPreloadState navigation_preload_state_;
   base::Time last_update_check_;
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc
index 0439d41..bd5b444 100644
--- a/content/browser/service_worker/service_worker_storage.cc
+++ b/content/browser/service_worker/service_worker_storage.cc
@@ -429,6 +429,13 @@
 
   DCHECK_NE(version->fetch_handler_existence(),
             ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN);
+  // The registration must be new or fully uninstalled. In-progress
+  // uninstallation should be canceled first to remove it from the uninstalling
+  // list.
+  // TODO(crbug.com/964201): Also disallow kUninstalled after DeleteVersion
+  // aborts in-progress register jobs, for simplicity.
+  DCHECK_NE(registration->status(),
+            ServiceWorkerRegistration::Status::kUninstalling);
 
   ServiceWorkerDatabase::RegistrationData data;
   data.registration_id = registration->id();
@@ -474,8 +481,7 @@
                      base::BindOnce(&ServiceWorkerStorage::DidStoreRegistration,
                                     weak_factory_.GetWeakPtr(),
                                     std::move(callback), data)));
-
-  registration->set_is_deleted(false);
+  registration->SetStatus(ServiceWorkerRegistration::Status::kIntact);
 }
 
 void ServiceWorkerStorage::UpdateToActiveState(
@@ -562,9 +568,10 @@
       base::BindOnce(&DidUpdateNavigationPreloadState, std::move(callback)));
 }
 
-void ServiceWorkerStorage::DeleteRegistration(int64_t registration_id,
-                                              const GURL& origin,
-                                              StatusCallback callback) {
+void ServiceWorkerStorage::DeleteRegistration(
+    scoped_refptr<ServiceWorkerRegistration> registration,
+    const GURL& origin,
+    StatusCallback callback) {
   DCHECK(state_ == STORAGE_STATE_INITIALIZED ||
          state_ == STORAGE_STATE_DISABLED)
       << state_;
@@ -578,23 +585,22 @@
   if (!has_checked_for_stale_resources_)
     DeleteStaleResources();
 
+  DCHECK(!registration->is_deleted())
+      << "attempt to delete a registration twice";
+
   auto params = std::make_unique<DidDeleteRegistrationParams>(
-      registration_id, origin, std::move(callback));
+      registration->id(), origin, std::move(callback));
 
   database_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(
           &DeleteRegistrationFromDB, database_.get(),
-          base::ThreadTaskRunnerHandle::Get(), registration_id, origin,
+          base::ThreadTaskRunnerHandle::Get(), registration->id(), origin,
           base::BindOnce(&ServiceWorkerStorage::DidDeleteRegistration,
                          weak_factory_.GetWeakPtr(), std::move(params))));
 
-  // The registration should no longer be findable.
-  pending_deletions_.insert(registration_id);
-  ServiceWorkerRegistration* registration =
-      context_->GetLiveRegistration(registration_id);
-  if (registration)
-    registration->set_is_deleted(true);
+  uninstalling_registrations_[registration->id()] = registration;
+  registration->SetStatus(ServiceWorkerRegistration::Status::kUninstalling);
 }
 
 void ServiceWorkerStorage::PerformStorageCleanup(base::OnceClosure callback) {
@@ -1121,15 +1127,10 @@
   }
 }
 
-void ServiceWorkerStorage::NotifyUninstallingRegistration(
-    ServiceWorkerRegistration* registration) {
-  DCHECK(uninstalling_registrations_.find(registration->id()) ==
-         uninstalling_registrations_.end());
-  uninstalling_registrations_[registration->id()] = registration;
-}
-
 void ServiceWorkerStorage::NotifyDoneUninstallingRegistration(
-    ServiceWorkerRegistration* registration) {
+    ServiceWorkerRegistration* registration,
+    ServiceWorkerRegistration::Status new_status) {
+  registration->SetStatus(new_status);
   uninstalling_registrations_.erase(registration->id());
 }
 
@@ -1531,7 +1532,6 @@
     const ServiceWorkerDatabase::RegistrationData& deleted_version,
     const std::vector<int64_t>& newly_purgeable_resources,
     ServiceWorkerDatabase::Status status) {
-  pending_deletions_.erase(params->registration_id);
   if (status != ServiceWorkerDatabase::STATUS_OK) {
     ScheduleDeleteAndStartOver();
     std::move(params->callback).Run(DatabaseStatusToStatusCode(status));
@@ -1636,10 +1636,9 @@
       new ServiceWorkerRegistration(options, data.registration_id, context_);
   registration->set_resources_total_size_bytes(data.resources_total_size_bytes);
   registration->set_last_update_check(data.last_update_check);
-  if (pending_deletions_.find(data.registration_id) !=
-      pending_deletions_.end()) {
-    registration->set_is_deleted(true);
-  }
+  DCHECK(uninstalling_registrations_.find(data.registration_id) ==
+         uninstalling_registrations_.end());
+
   scoped_refptr<ServiceWorkerVersion> version =
       context_->GetLiveVersion(data.version_id);
   if (!version) {
diff --git a/content/browser/service_worker/service_worker_storage.h b/content/browser/service_worker/service_worker_storage.h
index cda01b5..02177be3 100644
--- a/content/browser/service_worker/service_worker_storage.h
+++ b/content/browser/service_worker/service_worker_storage.h
@@ -23,6 +23,7 @@
 #include "base/memory/weak_ptr.h"
 #include "content/browser/service_worker/service_worker_database.h"
 #include "content/browser/service_worker/service_worker_metrics.h"
+#include "content/browser/service_worker/service_worker_registration.h"
 #include "content/browser/service_worker/service_worker_version.h"
 #include "content/common/content_export.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
@@ -41,7 +42,6 @@
 
 class ServiceWorkerContextCore;
 class ServiceWorkerDiskCache;
-class ServiceWorkerRegistration;
 class ServiceWorkerResponseMetadataWriter;
 class ServiceWorkerResponseReader;
 class ServiceWorkerResponseWriter;
@@ -166,10 +166,16 @@
                                      const std::string& value,
                                      StatusCallback callback);
 
-  // Deletes the registration data for |registration_id|. If the registration's
-  // version is live, its script resources will remain available.
-  // PurgeResources should be called when it's OK to delete them.
-  void DeleteRegistration(int64_t registration_id,
+  // Deletes the registration data for |registration|. The live registration is
+  // still findable via GetUninstallingRegistration(), and versions are usable
+  // because their script resources have not been deleted. After calling this,
+  // the caller should later:
+  // - Call NotifyDoneUninstallingRegistration() to let storage know the
+  //   uninstalling operation is done.
+  // - If it no longer wants versions to be usable, call PurgeResources() to
+  //   delete their script resources.
+  // If these aren't called, on the next profile session the cleanup occurs.
+  void DeleteRegistration(scoped_refptr<ServiceWorkerRegistration> registration,
                           const GURL& origin,
                           StatusCallback callback);
 
@@ -267,9 +273,9 @@
   void NotifyDoneInstallingRegistration(ServiceWorkerRegistration* registration,
                                         ServiceWorkerVersion* version,
                                         blink::ServiceWorkerStatusCode status);
-  void NotifyUninstallingRegistration(ServiceWorkerRegistration* registration);
   void NotifyDoneUninstallingRegistration(
-      ServiceWorkerRegistration* registration);
+      ServiceWorkerRegistration* registration,
+      ServiceWorkerRegistration::Status new_status);
 
   void Disable();
 
@@ -607,7 +613,6 @@
   base::circular_deque<int64_t> purgeable_resource_ids_;
   bool is_purge_pending_;
   bool has_checked_for_stale_resources_;
-  std::set<int64_t> pending_deletions_;
 
   base::WeakPtrFactory<ServiceWorkerStorage> weak_factory_;
 
diff --git a/content/browser/service_worker/service_worker_storage_unittest.cc b/content/browser/service_worker/service_worker_storage_unittest.cc
index 3670546..3289028 100644
--- a/content/browser/service_worker/service_worker_storage_unittest.cc
+++ b/content/browser/service_worker/service_worker_storage_unittest.cc
@@ -399,12 +399,13 @@
     return result.value();
   }
 
-  blink::ServiceWorkerStatusCode DeleteRegistration(int64_t registration_id,
-                                                    const GURL& origin) {
+  blink::ServiceWorkerStatusCode DeleteRegistration(
+      scoped_refptr<ServiceWorkerRegistration> registration,
+      const GURL& origin) {
     bool was_called = false;
     base::Optional<blink::ServiceWorkerStatusCode> result;
-    storage()->DeleteRegistration(
-        registration_id, origin, MakeStatusCallback(&was_called, &result));
+    storage()->DeleteRegistration(registration, origin,
+                                  MakeStatusCallback(&was_called, &result));
     EXPECT_FALSE(was_called);  // always async
     base::RunLoop().RunUntilIdle();
     EXPECT_TRUE(was_called);
@@ -672,7 +673,7 @@
             UpdateToActiveState(live_registration));
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorAbort,
-            DeleteRegistration(kRegistrationId, kScope.GetOrigin()));
+            DeleteRegistration(live_registration, kScope.GetOrigin()));
 
   // Response reader and writer created by the disabled storage should fail to
   // access the disk cache.
@@ -888,25 +889,6 @@
   EXPECT_EQ(ServiceWorkerVersion::ACTIVATED,
             found_registration->active_version()->status());
   EXPECT_EQ(kToday, found_registration->last_update_check());
-
-  // Delete from storage but with a instance still live.
-  EXPECT_TRUE(context()->GetLiveVersion(kRegistrationId));
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            DeleteRegistration(kRegistrationId, kScope.GetOrigin()));
-  EXPECT_TRUE(context()->GetLiveVersion(kRegistrationId));
-
-  // Should no longer be found.
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
-            FindRegistrationForId(kRegistrationId, kScope.GetOrigin(),
-                                  &found_registration));
-  EXPECT_FALSE(found_registration.get());
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
-            FindRegistrationForIdOnly(kRegistrationId, &found_registration));
-  EXPECT_FALSE(found_registration.get());
-
-  // Deleting an unstored registration should succeed.
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            DeleteRegistration(kRegistrationId + 1, kScope.GetOrigin()));
 }
 
 TEST_F(ServiceWorkerStorageTest, InstallingRegistrationsAreFindable) {
@@ -1154,7 +1136,7 @@
   ASSERT_EQ("data", data_out[0]);
 
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk,
-            DeleteRegistration(kRegistrationId, kScope.GetOrigin()));
+            DeleteRegistration(live_registration, kScope.GetOrigin()));
   EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorNotFound,
             GetUserData(kRegistrationId, {"key"}, &data_out));
   data_list_out.clear();
@@ -1399,13 +1381,12 @@
   std::set<int64_t> verify_ids;
 
   registration_->SetWaitingVersion(nullptr);
-  registration_ = nullptr;
 
   // Deleting the registration should result in the resources being added to the
   // purgeable list and then doomed in the disk cache and removed from that
   // list.
   storage()->DeleteRegistration(
-      registration_id_, scope_.GetOrigin(),
+      registration_, scope_.GetOrigin(),
       base::BindOnce(&VerifyPurgeableListStatusCallback,
                      base::Unretained(database()), &verify_ids, &was_called,
                      &result));
@@ -1432,7 +1413,7 @@
   // purgeable list and then doomed in the disk cache and removed from that
   // list.
   storage()->DeleteRegistration(
-      registration_->id(), scope_.GetOrigin(),
+      registration_, scope_.GetOrigin(),
       base::BindOnce(&VerifyPurgeableListStatusCallback,
                      base::Unretained(database()), &verify_ids, &was_called,
                      &result));
@@ -1479,7 +1460,7 @@
   // Deleting the registration should move the resources to the purgeable list
   // but keep them available.
   storage()->DeleteRegistration(
-      registration_->id(), scope_.GetOrigin(),
+      registration_, scope_.GetOrigin(),
       base::BindOnce(&VerifyPurgeableListStatusCallback,
                      base::Unretained(database()), &verify_ids, &was_called,
                      &result));
@@ -1529,7 +1510,7 @@
   // Deleting the registration should move the resources to the purgeable list
   // but keep them available.
   storage()->DeleteRegistration(
-      registration_->id(), scope_.GetOrigin(),
+      registration_, scope_.GetOrigin(),
       base::BindOnce(&VerifyPurgeableListStatusCallback,
                      base::Unretained(database()), &verify_ids, &was_called,
                      &result));
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 93376189..d8d548a 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -1517,7 +1517,7 @@
     // registration. To handle the case, check the live registrations here.
     protect = context_->GetLiveRegistration(registration_id_);
     if (protect) {
-      DCHECK(protect->is_deleted());
+      DCHECK(protect->is_uninstalling());
       status = blink::ServiceWorkerStatusCode::kOk;
     }
   }
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc
index cc10f39..fa8ab95 100644
--- a/content/browser/service_worker/service_worker_version_unittest.cc
+++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -397,13 +397,13 @@
   base::Optional<blink::ServiceWorkerStatusCode> status;
   base::RunLoop run_loop;
   helper_->context()->storage()->DeleteRegistration(
-      registration_->id(), registration_->scope().GetOrigin(),
+      registration_, registration_->scope().GetOrigin(),
       ReceiveServiceWorkerStatus(&status, run_loop.QuitClosure()));
   run_loop.Run();
   ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value());
 
-  // The live registration is marked as deleted, but still exists.
-  ASSERT_TRUE(registration_->is_deleted());
+  // The live registration is marked as uninstalling, but still exists.
+  ASSERT_TRUE(registration_->is_uninstalling());
 
   {
     // Stop the worker.
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index b9a7b5e80..4b4afb4 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -30,6 +30,7 @@
 #include "content/browser/blob_storage/blob_registry_wrapper.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
 #include "content/browser/browser_main_loop.h"
+#include "content/browser/browsing_data/clear_site_data_handler.h"
 #include "content/browser/browsing_data/storage_partition_code_cache_data_remover.h"
 #include "content/browser/browsing_data/storage_partition_http_cache_data_remover.h"
 #include "content/browser/child_process_security_policy_impl.h"
@@ -41,6 +42,7 @@
 #include "content/browser/loader/prefetch_url_loader_service.h"
 #include "content/browser/native_file_system/native_file_system_manager_impl.h"
 #include "content/browser/notifications/platform_notification_context_impl.h"
+#include "content/browser/web_contents/web_contents_impl.h"
 #include "content/common/dom_storage/dom_storage_types.h"
 #include "content/common/service_worker/service_worker_utils.h"
 #include "content/public/browser/browser_context.h"
@@ -270,6 +272,19 @@
       origin_matcher, perform_storage_cleanup, std::move(callback)));
 }
 
+WebContents* GetWebContentsForStoragePartition(uint32_t process_id,
+                                               uint32_t routing_id) {
+  if (process_id != network::mojom::kBrowserProcessId) {
+    return WebContentsImpl::FromRenderFrameHostID(process_id, routing_id);
+  }
+  return WebContents::FromFrameTreeNodeId(routing_id);
+}
+
+BrowserContext* GetBrowserContextFromStoragePartition(
+    base::WeakPtr<StoragePartitionImpl> weak_partition_ptr) {
+  return weak_partition_ptr ? weak_partition_ptr->browser_context() : nullptr;
+}
+
 }  // namespace
 
 // Class to own the NetworkContext wrapping a storage partitions
@@ -992,6 +1007,21 @@
       blink::mojom::PermissionStatus::GRANTED);
 }
 
+void StoragePartitionImpl::OnClearSiteData(uint32_t process_id,
+                                           int32_t routing_id,
+                                           const GURL& url,
+                                           const std::string& header_value,
+                                           int load_flags,
+                                           OnClearSiteDataCallback callback) {
+  auto browser_context_getter = base::BindRepeating(
+      GetBrowserContextFromStoragePartition, weak_factory_.GetWeakPtr());
+  auto web_contents_getter = base::BindRepeating(
+      GetWebContentsForStoragePartition, process_id, routing_id);
+  ClearSiteDataHandler::HandleHeader(browser_context_getter,
+                                     web_contents_getter, url, header_value,
+                                     load_flags, std::move(callback));
+}
+
 void StoragePartitionImpl::ClearDataImpl(
     uint32_t remove_mask,
     uint32_t quota_storage_remove_mask,
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h
index c7fbd2ef..c313351 100644
--- a/content/browser/storage_partition_impl.h
+++ b/content/browser/storage_partition_impl.h
@@ -171,6 +171,12 @@
   void OnCanSendDomainReliabilityUpload(
       const GURL& origin,
       OnCanSendDomainReliabilityUploadCallback callback) override;
+  void OnClearSiteData(uint32_t process_id,
+                       int32_t routing_id,
+                       const GURL& url,
+                       const std::string& header_value,
+                       int load_flags,
+                       OnClearSiteDataCallback callback) override;
 
   scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter() {
     return url_loader_factory_getter_;
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index 51f72c8..cc911a0 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -372,6 +372,7 @@
       network::switches::kIgnoreCertificateErrorsSPKIList,
       network::switches::kIgnoreUrlFetcherCertRequests,
       network::switches::kLogNetLog,
+      network::switches::kNetLogCaptureMode,
       network::switches::kNoReferrers,
       network::switches::kExplicitlyAllowedPorts,
       service_manager::switches::kNoSandbox,
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index 05f7b9f..227e15df 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -2466,7 +2466,8 @@
   other_contents->NavigateAndCommit(url_normalized);
 
   // Check that an IPC with about:whatever is correctly normalized.
-  other_contents->TestDidFailLoadWithError(url_from_ipc, 1, base::string16());
+  other_contents->GetMainFrame()->DidFailLoadWithError(url_from_ipc, 1,
+                                                       base::string16());
   EXPECT_EQ(url_blocked, other_observer.last_url());
 }
 
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc
index 05915fa..ee5760e 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -280,6 +280,38 @@
   }
 }
 
+#if defined(OS_WIN)
+// Function returning whether this drop target should extract virtual file data
+// from the data store.
+// (1) As with real files, only add virtual files if the drag did not originate
+// in the renderer process. Without this, if an anchor element is dragged and
+// then dropped on the same page, the browser will navigate to the URL
+// referenced by the anchor. That is because virtual ".url" file data
+// (internet shortcut) is added to the data object on drag start, and if
+// script doesn't handle the drop, the browser behaves just as if a .url file
+// were dragged in from the desktop. Filtering out virtual files if the drag
+// is renderer tainted also prevents the possibility of a compromised renderer
+// gaining access to the backing temp file paths.
+// (2) Even if the drag is not renderer tainted, also exclude virtual files
+// if the UniformResourceLocatorW clipboard format is found in the data object.
+// Drags initiated in the browser process, such as dragging a bookmark from
+// the bookmark bar, will add a virtual .url file to the data object using the
+// CFSTR_FILEDESCRIPTORW/CFSTR_FILECONTENTS formats, which represents an
+// internet shortcut intended to be  dropped on the desktop. But this causes a
+// regression in the behavior of the extensions page (see
+// https://crbug.com/963392). The primary scenario for introducing virtual file
+// support was for dragging items out of Outlook.exe for upload to a file
+// hosting service. The Outlook drag source does not add url data to the data
+// object.
+// TODO(https://crbug.com/958273): DragDrop: Extend virtual filename support
+// to DropData, for parity with real filename support.
+// TODO(https://crbug.com/964461): Drag and drop: Should support both virtual
+// file and url data on drop.
+bool ShouldIncludeVirtualFiles(const DropData& drop_data) {
+  return !drop_data.did_originate_from_renderer && drop_data.url.is_empty();
+}
+#endif
+
 // Utility to fill a DropData object from ui::OSExchangeData.
 void PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) {
   drop_data->did_originate_from_renderer = data.DidOriginateFromRenderer();
@@ -312,7 +344,8 @@
   // Get a list of virtual files for later retrieval when a drop is performed
   // (will return empty vector if there are any non-virtual files in the data
   // store).
-  data.GetVirtualFilenames(&drop_data->filenames);
+  if (ShouldIncludeVirtualFiles(*drop_data))
+    data.GetVirtualFilenames(&drop_data->filenames);
 #endif
 
   base::Pickle pickle;
@@ -1331,18 +1364,7 @@
 
   const int key_modifiers = ui::EventFlagsToWebEventModifiers(event.flags());
 #if defined(OS_WIN)
-  // As with real files, only add virtual files if the drag did not originate in
-  // the renderer process. Without this, if an anchor element is dragged and
-  // then dropped on the same page, the browser will navigate to the URL
-  // referenced by the anchor. That is because virtual ".url" file data
-  // (internet shortcut) is added to the data object on drag start, and if
-  // script doesn't handle the drop, the browser behaves just as if a .url file
-  // were dragged in from the desktop. Filtering out virtual files if the drag
-  // is renderer tainted also prevents the possibility of a compromised renderer
-  // gaining access to the backing temp file paths.
-  // TODO(https://crbug.com/958273): DragDrop: Extend virtual filename support
-  // to DropData, for parity with real filename support.
-  if (!current_drop_data_->did_originate_from_renderer &&
+  if (ShouldIncludeVirtualFiles(*current_drop_data_) &&
       event.data().HasVirtualFilenames()) {
     // Asynchronously retrieve the actual content of any virtual files now (this
     // step is not needed for "real" files already on the file system, e.g.
diff --git a/content/browser/web_contents/web_contents_view_aura.h b/content/browser/web_contents/web_contents_view_aura.h
index dacd6cc8..46ca496 100644
--- a/content/browser/web_contents/web_contents_view_aura.h
+++ b/content/browser/web_contents/web_contents_view_aura.h
@@ -72,6 +72,7 @@
   FRIEND_TEST_ALL_PREFIXES(WebContentsViewAuraTest, DragDropVirtualFiles);
   FRIEND_TEST_ALL_PREFIXES(WebContentsViewAuraTest,
                            DragDropVirtualFilesOriginateFromRenderer);
+  FRIEND_TEST_ALL_PREFIXES(WebContentsViewAuraTest, DragDropUrlData);
 
   class WindowObserver;
 
diff --git a/content/browser/web_contents/web_contents_view_aura_unittest.cc b/content/browser/web_contents/web_contents_view_aura_unittest.cc
index a7fb899..03b712ec 100644
--- a/content/browser/web_contents/web_contents_view_aura_unittest.cc
+++ b/content/browser/web_contents/web_contents_view_aura_unittest.cc
@@ -447,6 +447,57 @@
 
   ASSERT_TRUE(drop_complete_data_->drop_data.filenames.empty());
 }
+
+TEST_F(WebContentsViewAuraTest, DragDropUrlData) {
+  WebContentsViewAura* view = GetView();
+  ui::OSExchangeData data;
+
+  const std::string url_spec = "https://www.wikipedia.org/";
+  const GURL url(url_spec);
+  const base::string16 url_title = base::ASCIIToUTF16("Wikipedia");
+  data.SetURL(url, url_title);
+
+  // SetUrl should also add a virtual .url (internet shortcut) file.
+  std::vector<ui::FileInfo> file_infos;
+  EXPECT_TRUE(data.GetVirtualFilenames(&file_infos));
+  ASSERT_EQ(1ULL, file_infos.size());
+  EXPECT_EQ(base::FilePath(url_title + base::ASCIIToUTF16(".url")),
+            file_infos[0].display_name);
+
+  ui::DropTargetEvent event(data, kClientPt, kScreenPt,
+                            ui::DragDropTypes::DRAG_COPY);
+
+  // Simulate drag enter.
+  EXPECT_EQ(nullptr, view->current_drop_data_);
+  view->OnDragEntered(event);
+  ASSERT_NE(nullptr, view->current_drop_data_);
+
+  EXPECT_EQ(url_spec, view->current_drop_data_->url);
+  EXPECT_EQ(url_title, view->current_drop_data_->url_title);
+
+  // Virtual files should not have been retrieved if url data present.
+  ASSERT_TRUE(view->current_drop_data_->filenames.empty());
+
+  // Simulate drop (completes asynchronously since virtual file data is
+  // present).
+  auto callback = base::BindOnce(&WebContentsViewAuraTest::OnDropComplete,
+                                 base::Unretained(this));
+  view->RegisterDropCallbackForTesting(std::move(callback));
+
+  base::RunLoop run_loop;
+  async_drop_closure_ = run_loop.QuitClosure();
+
+  view->OnPerformDrop(event);
+  run_loop.Run();
+
+  CheckDropData(view);
+
+  EXPECT_EQ(url_spec, drop_complete_data_->drop_data.url);
+  EXPECT_EQ(url_title, drop_complete_data_->drop_data.url_title);
+
+  // Virtual files should not have been retrieved if url data present.
+  ASSERT_TRUE(drop_complete_data_->drop_data.filenames.empty());
+}
 #endif
 
 }  // namespace content
diff --git a/content/browser/webauth/authenticator_type_converters.cc b/content/browser/webauth/authenticator_type_converters.cc
index c6c8337..543f34a 100644
--- a/content/browser/webauth/authenticator_type_converters.cc
+++ b/content/browser/webauth/authenticator_type_converters.cc
@@ -168,10 +168,10 @@
               PublicKeyCredentialRpEntityPtr>::
     Convert(const PublicKeyCredentialRpEntityPtr& input) {
   device::PublicKeyCredentialRpEntity rp_entity(input->id);
-  rp_entity.SetRpName(input->name);
-  if (input->icon)
-    rp_entity.SetRpIconUrl(*input->icon);
-
+  rp_entity.name = input->name;
+  if (input->icon) {
+    rp_entity.icon_url = input->icon;
+  }
   return rp_entity;
 }
 
diff --git a/content/common/frame.mojom b/content/common/frame.mojom
index ee0ca5d5..82882159 100644
--- a/content/common/frame.mojom
+++ b/content/common/frame.mojom
@@ -488,4 +488,29 @@
       int32 line_number,
       mojo_base.mojom.String16 source_id);
 
+  // Sent when the renderer fails a provisional load with an error.
+  //
+  // |url| is the URL that the error is reported for.
+  //
+  // |error_code| is a net::Error code as reported in the
+  // DidFailProvisionalLoad callback.
+  //
+  // |error_description| is an error message generated from the error_code.
+  // This can be an empty string if we were unable to find a meaningful
+  // description.
+  //
+  // |showing_repost_interstitial| is true if the failure is the result of
+  // navigating to a POST again and we're going to show the POST interstitial.
+  // TODO(https://crbug.com/963806): Delete this method.
+  DidFailProvisionalLoadWithError(
+      url.mojom.Url url,
+      int32 error_code,
+      mojo_base.mojom.String16 error_description,
+      bool showing_repost_interstitial);
+
+  // Sent when the renderer fails to load with an error.
+  DidFailLoadWithError(
+      url.mojom.Url url,
+      int32 error_code,
+      mojo_base.mojom.String16 error_description);
 };
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 78b5de6..3759f0f 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -337,19 +337,6 @@
   IPC_STRUCT_TRAITS_MEMBER(description)
 IPC_STRUCT_TRAITS_END()
 
-IPC_STRUCT_BEGIN(FrameHostMsg_DidFailProvisionalLoadWithError_Params)
-  // Error code as reported in the DidFailProvisionalLoad callback.
-  IPC_STRUCT_MEMBER(int, error_code)
-  // An error message generated from the error_code. This can be an empty
-  // string if we were unable to find a meaningful description.
-  IPC_STRUCT_MEMBER(base::string16, error_description)
-  // The URL that the error is reported for.
-  IPC_STRUCT_MEMBER(GURL, url)
-  // True if the failure is the result of navigating to a POST again
-  // and we're going to show the POST interstitial.
-  IPC_STRUCT_MEMBER(bool, showing_repost_interstitial)
-IPC_STRUCT_END()
-
 IPC_STRUCT_TRAITS_BEGIN(content::FrameNavigateParams)
   IPC_STRUCT_TRAITS_MEMBER(nav_entry_id)
   IPC_STRUCT_TRAITS_MEMBER(item_sequence_number)
@@ -1135,17 +1122,9 @@
 // Sent by the renderer when the frame becomes focused.
 IPC_MESSAGE_ROUTED0(FrameHostMsg_FrameFocused)
 
-// Sent when the renderer fails a provisional load with an error.
-IPC_MESSAGE_ROUTED1(FrameHostMsg_DidFailProvisionalLoadWithError,
-                    FrameHostMsg_DidFailProvisionalLoadWithError_Params)
-
 // Notifies the browser that a document has been loaded.
 IPC_MESSAGE_ROUTED0(FrameHostMsg_DidFinishDocumentLoad)
 
-IPC_MESSAGE_ROUTED3(FrameHostMsg_DidFailLoadWithError,
-                    GURL /* validated_url */,
-                    int /* error_code */,
-                    base::string16 /* error_description */)
 
 // Sent when the renderer is done loading a page.
 IPC_MESSAGE_ROUTED0(FrameHostMsg_DidStopLoading)
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index 2adc95d..2697e90 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -60,7 +60,6 @@
     "//components/download/public/common:public_java",
     "//device/bluetooth:java",
     "//device/gamepad:java",
-    "//device/usb:java",
     "//media/base/android:media_java",
     "//media/capture/content/android:screen_capture_java",
     "//media/capture/video/android:capture_java",
diff --git a/content/public/android/java/strings/translations/android_content_strings_hi.xtb b/content/public/android/java/strings/translations/android_content_strings_hi.xtb
index 8010b2e..a1ad329 100644
--- a/content/public/android/java/strings/translations/android_content_strings_hi.xtb
+++ b/content/public/android/java/strings/translations/android_content_strings_hi.xtb
@@ -14,7 +14,7 @@
 <translation id="3845599764535987402">घंटा</translation>
 <translation id="4247305538398689241">सप्ताह सेट करें</translation>
 <translation id="4768459022382175196">सेकंड</translation>
-<translation id="4859501799452851758">प्रोफ़ाइलर पूर्ण. परिणाम <ph name="FILENAME" /> में हैं.</translation>
+<translation id="4859501799452851758">प्रोफ़ाइलर पूरा हुआ. नतीजा <ph name="FILENAME" /> में हैं.</translation>
 <translation id="4932733599132424254">तारीख</translation>
 <translation id="5659744962989939577">शब्दकोश में जोड़ें</translation>
 <translation id="5789643057113097023">.</translation>
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index ca52787..7266e15b6 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -374,11 +374,11 @@
   public_deps = [
     "//components/download/public/common:public",
     "//content/public/common:common_sources",
-    "//device/usb/public/mojom",
     "//ipc",
     "//media/mojo/interfaces:remoting",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
+    "//services/device/public/mojom:usb",
     "//services/media_session/public/cpp",
     "//services/media_session/public/mojom",
     "//services/network/public/mojom",
diff --git a/content/public/browser/DEPS b/content/public/browser/DEPS
index 805504c5..995eedcc 100644
--- a/content/public/browser/DEPS
+++ b/content/public/browser/DEPS
@@ -4,7 +4,6 @@
   "+components/download/public/common",
   "+components/viz/common",
   "+components/viz/host",
-  "+device/usb/public/mojom",
   "+device/fido",
   "+services/device/public",
   "+services/media_session/public",
diff --git a/content/public/browser/render_frame_host.h b/content/public/browser/render_frame_host.h
index 712e8a3b..667bea1b 100644
--- a/content/public/browser/render_frame_host.h
+++ b/content/public/browser/render_frame_host.h
@@ -160,6 +160,9 @@
   // of its size.
   virtual const base::Optional<gfx::Size>& GetFrameSize() = 0;
 
+  // Returns the distance from this frame to the root frame.
+  virtual size_t GetFrameDepth() = 0;
+
   // Returns true if the frame is out of process.
   virtual bool IsCrossProcessSubframe() = 0;
 
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 392e527b..40b99e7 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -130,7 +130,7 @@
 // When a screen reader is detected, allow users the option of letting
 // Google provide descriptions for unlabeled images.
 const base::Feature kExperimentalAccessibilityLabels{
-    "ExperimentalAccessibilityLabels", base::FEATURE_DISABLED_BY_DEFAULT};
+    "ExperimentalAccessibilityLabels", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Throttle tasks in Blink background timer queues based on CPU budgets
 // for the background tab. Bug: https://crbug.com/639852.
diff --git a/content/public/renderer/BUILD.gn b/content/public/renderer/BUILD.gn
index bc03d93..1f3e181 100644
--- a/content/public/renderer/BUILD.gn
+++ b/content/public/renderer/BUILD.gn
@@ -40,7 +40,6 @@
     "context_menu_client.h",
     "document_state.cc",
     "document_state.h",
-    "media_stream_utils.h",
     "pepper_plugin_instance.h",
     "plugin_instance_throttler.h",
     "render_accessibility.h",
diff --git a/content/public/renderer/media_stream_utils.h b/content/public/renderer/media_stream_utils.h
deleted file mode 100644
index 29100db..0000000
--- a/content/public/renderer/media_stream_utils.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_PUBLIC_RENDERER_MEDIA_STREAM_UTILS_H_
-#define CONTENT_PUBLIC_RENDERER_MEDIA_STREAM_UTILS_H_
-
-#include <memory>
-
-#include "content/common/content_export.h"
-#include "media/capture/video_capture_types.h"
-
-namespace blink {
-class WebMediaStream;
-}
-
-namespace media {
-class VideoCapturerSource;
-}
-
-namespace content {
-// This method creates a WebMediaStreamSource + MediaStreamSource pair with the
-// provided video capturer source. A new WebMediaStreamTrack +
-// MediaStreamTrack pair is created, connected to the source and is plugged into
-// the WebMediaStream (|web_media_stream|).
-// |is_remote| should be true if the source of the data is not a local device.
-// |is_readonly| should be true if the format of the data cannot be changed by
-//     MediaTrackConstraints.
-CONTENT_EXPORT bool AddVideoTrackToMediaStream(
-    std::unique_ptr<media::VideoCapturerSource> video_source,
-    bool is_remote,
-    blink::WebMediaStream* web_media_stream);
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_RENDERER_MEDIA_STREAM_UTILS_H_
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 6f336de..9b756cf 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -355,8 +355,6 @@
     "media/webrtc_logging.h",
     "media_capture_from_element/html_audio_element_capturer_source.cc",
     "media_capture_from_element/html_audio_element_capturer_source.h",
-    "media_capture_from_element/html_video_element_capturer_source.cc",
-    "media_capture_from_element/html_video_element_capturer_source.h",
     "media_recorder/audio_track_encoder.cc",
     "media_recorder/audio_track_encoder.h",
     "media_recorder/audio_track_opus_encoder.cc",
@@ -373,7 +371,6 @@
     "media_recorder/video_track_recorder.h",
     "media_recorder/vpx_encoder.cc",
     "media_recorder/vpx_encoder.h",
-    "media_stream_utils.cc",
     "menu_item_builder.cc",
     "menu_item_builder.h",
     "mhtml_handle_writer.cc",
@@ -588,7 +585,6 @@
     "//device/base/synchronization",
     "//device/gamepad/public/cpp:shared_with_blink",
     "//device/gamepad/public/mojom",
-    "//device/usb/public/mojom",
     "//gin",
     "//gpu",
     "//gpu/command_buffer/client:gles2_interface",
@@ -618,6 +614,7 @@
     "//services/device/public/cpp/generic_sensor",
     "//services/device/public/mojom",
     "//services/device/public/mojom:constants",
+    "//services/device/public/mojom:usb",
     "//services/image_annotation/public/cpp:cpp",
     "//services/image_annotation/public/mojom:mojom",
     "//services/metrics/public/cpp:metrics_cpp",
diff --git a/content/renderer/DEPS b/content/renderer/DEPS
index c6c43f5..3b0f954c 100644
--- a/content/renderer/DEPS
+++ b/content/renderer/DEPS
@@ -15,7 +15,6 @@
   "+device/base/synchronization",
   "+device/gamepad/public/cpp",
   "+device/gamepad/public/mojom",
-  "+device/usb/public",
   "+gin",
   "+jingle/glue",
   "+mojo",
diff --git a/content/renderer/accessibility/ax_image_annotator.cc b/content/renderer/accessibility/ax_image_annotator.cc
index ef669e56..07e88d51 100644
--- a/content/renderer/accessibility/ax_image_annotator.cc
+++ b/content/renderer/accessibility/ax_image_annotator.cc
@@ -178,7 +178,7 @@
   blink::WebAXObject parent = image.ParentObject();
   for (int ancestor_count = 0; !parent.IsDetached() && ancestor_count < 2;
        parent = parent.ParentObject()) {
-    if (!parent.AccessibilityIsIgnored()) {
+    if (parent.AccessibilityIsIncludedInTree()) {
       ++ancestor_count;
       if (parent.Role() == ax::mojom::Role::kLink ||
           parent.Role() == ax::mojom::Role::kRootWebArea) {
diff --git a/content/renderer/accessibility/blink_ax_enum_conversion.cc b/content/renderer/accessibility/blink_ax_enum_conversion.cc
index cca4b0d..7892d1f5 100644
--- a/content/renderer/accessibility/blink_ax_enum_conversion.cc
+++ b/content/renderer/accessibility/blink_ax_enum_conversion.cc
@@ -71,8 +71,7 @@
   else if (o.Orientation() == blink::kWebAXOrientationHorizontal)
     dst->AddState(ax::mojom::State::kHorizontal);
 
-  if (o.IsVisited())
-    dst->AddState(ax::mojom::State::kVisited);
+  DCHECK(!o.AccessibilityIsIgnored());
 }
 
 }  // namespace content.
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc
index f2f3b9d..cc38608 100644
--- a/content/renderer/accessibility/blink_ax_tree_source.cc
+++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -161,7 +161,7 @@
 
 WebAXObject ParentObjectUnignored(WebAXObject child) {
   WebAXObject parent = child.ParentObject();
-  while (!parent.IsDetached() && parent.AccessibilityIsIgnored())
+  while (!parent.IsDetached() && !parent.AccessibilityIsIncludedInTree())
     parent = parent.ParentObject();
   return parent;
 }
@@ -488,7 +488,7 @@
     if (node.Equals(root()))
       return WebAXObject();
     node = node.ParentObject();
-  } while (!node.IsDetached() && node.AccessibilityIsIgnored());
+  } while (!node.IsDetached() && !node.AccessibilityIsIncludedInTree());
 
   return node;
 }
diff --git a/content/renderer/media_stream_utils.cc b/content/renderer/media_stream_utils.cc
deleted file mode 100644
index 10a94b5..0000000
--- a/content/renderer/media_stream_utils.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/public/renderer/media_stream_utils.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/guid.h"
-#include "media/capture/video_capturer_source.h"
-#include "third_party/blink/public/platform/web_media_stream.h"
-#include "third_party/blink/public/platform/web_media_stream_source.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_constraints_util.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_capturer_source.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
-
-namespace content {
-
-bool AddVideoTrackToMediaStream(
-    std::unique_ptr<media::VideoCapturerSource> video_source,
-    bool is_remote,
-    blink::WebMediaStream* web_media_stream) {
-  DCHECK(video_source.get());
-  if (!web_media_stream || web_media_stream->IsNull()) {
-    DLOG(ERROR) << "WebMediaStream is null";
-    return false;
-  }
-
-  media::VideoCaptureFormats preferred_formats =
-      video_source->GetPreferredFormats();
-  blink::MediaStreamVideoSource* const media_stream_source =
-      new blink::MediaStreamVideoCapturerSource(
-          blink::WebPlatformMediaStreamSource::SourceStoppedCallback(),
-          std::move(video_source));
-  const blink::WebString track_id =
-      blink::WebString::FromUTF8(base::GenerateGUID());
-  blink::WebMediaStreamSource web_media_stream_source;
-  web_media_stream_source.Initialize(
-      track_id, blink::WebMediaStreamSource::kTypeVideo, track_id, is_remote);
-  // Takes ownership of |media_stream_source|.
-  web_media_stream_source.SetPlatformSource(
-      base::WrapUnique(media_stream_source));
-  web_media_stream_source.SetCapabilities(ComputeCapabilitiesForVideoSource(
-      track_id, preferred_formats,
-      media::VideoFacingMode::MEDIA_VIDEO_FACING_NONE,
-      false /* is_device_capture */));
-  web_media_stream->AddTrack(blink::MediaStreamVideoTrack::CreateVideoTrack(
-      media_stream_source, blink::MediaStreamVideoSource::ConstraintsCallback(),
-      true));
-  return true;
-}
-
-}  // namespace content
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 2788fe571..151bcb0 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -4959,9 +4959,8 @@
   base::string16 error_description;
   GetContentClient()->renderer()->GetErrorDescription(
       error, document_loader->HttpMethod().Ascii(), &error_description);
-  Send(new FrameHostMsg_DidFailLoadWithError(
-      routing_id_, document_loader->GetUrl(), error.reason(),
-      error_description));
+  GetFrameHost()->DidFailLoadWithError(document_loader->GetUrl(),
+                                       error.reason(), error_description);
 }
 
 void RenderFrameImpl::DidFinishLoad() {
@@ -7181,13 +7180,11 @@
   bool show_repost_interstitial =
       error.reason() == net::ERR_CACHE_MISS && http_method == "POST";
 
-  FrameHostMsg_DidFailProvisionalLoadWithError_Params params;
-  params.error_code = error.reason();
-  GetContentClient()->renderer()->GetErrorDescription(
-      error, http_method, &params.error_description);
-  params.url = error.url(),
-  params.showing_repost_interstitial = show_repost_interstitial;
-  Send(new FrameHostMsg_DidFailProvisionalLoadWithError(routing_id_, params));
+  base::string16 error_description;
+  GetContentClient()->renderer()->GetErrorDescription(error, http_method,
+                                                      &error_description);
+  GetFrameHost()->DidFailProvisionalLoadWithError(
+      error.url(), error.reason(), error_description, show_repost_interstitial);
 }
 
 bool RenderFrameImpl::ShouldDisplayErrorPageForFailedLoad(
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 097fe84..31218b0 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -1270,7 +1270,7 @@
                      std::string* data,
                      GURL* base_url);
 
-  // Sends a proper FrameHostMsg_DidFailProvisionalLoadWithError_Params IPC for
+  // Sends a proper DidFailProvisionalLoadWithError mojo IPC for
   // the failed provisional load.
   void SendFailedProvisionalLoad(const std::string& http_method,
                                  const blink::WebURLError& error,
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 641c9db..bf2755a 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -23,6 +23,7 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
+#include "cc/input/browser_controls_state.h"
 #include "cc/trees/layer_tree_host.h"
 #include "content/common/frame_messages.h"
 #include "content/common/frame_owner_properties.h"
@@ -578,7 +579,14 @@
   EXPECT_FALSE(child_proxy_1->is_pinch_gesture_active_for_testing());
 
   // Set the |is_pinch_gesture_active| flag.
-  view()->PageScaleFactorChanged(1.f, true);
+  cc::ApplyViewportChangesArgs args;
+  args.page_scale_delta = 1.f;
+  args.is_pinch_gesture_active = true;
+  args.browser_controls_delta = 0.f;
+  args.browser_controls_constraint = cc::BrowserControlsState::kHidden;
+  args.scroll_gesture_did_end = false;
+
+  view()->webview()->MainFrameWidget()->ApplyViewportChanges(args);
   EXPECT_TRUE(child_proxy_1->is_pinch_gesture_active_for_testing());
 
   // Create a new remote child, and get its proxy. Swapping out will force
@@ -594,7 +602,8 @@
   EXPECT_TRUE(child_proxy_2->is_pinch_gesture_active_for_testing());
 
   // Reset the flag, make sure both children respond.
-  view()->PageScaleFactorChanged(1.f, false);
+  args.is_pinch_gesture_active = false;
+  view()->webview()->MainFrameWidget()->ApplyViewportChanges(args);
   EXPECT_FALSE(child_proxy_1->is_pinch_gesture_active_for_testing());
   EXPECT_FALSE(child_proxy_2->is_pinch_gesture_active_for_testing());
 }
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 6a00f40..25ab2ac 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -2063,17 +2063,12 @@
                                         maximum_percent));
 }
 
-void RenderViewImpl::PageScaleFactorChanged(float page_scale_factor,
-                                            bool is_pinch_gesture_active) {
+void RenderViewImpl::PageScaleFactorChanged(float page_scale_factor) {
   if (!webview())
     return;
 
   Send(new ViewHostMsg_PageScaleFactorChanged(GetRoutingID(),
                                               page_scale_factor));
-  // TODO(wjmaclean): Merge this into RenderWidget's
-  // SetPageScaleFactorAndLimits().
-  GetWidget()->PageScaleFactorChanged(page_scale_factor,
-                                      is_pinch_gesture_active);
 }
 
 void RenderViewImpl::PageImportanceSignalsChanged() {
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 3a5d85b..561588c 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -243,8 +243,7 @@
   int HistoryBackListCount() override;
   int HistoryForwardListCount() override;
   void ZoomLimitsChanged(double minimum_level, double maximum_level) override;
-  void PageScaleFactorChanged(float page_scale_factor,
-                              bool is_pinch_gesture_active) override;
+  void PageScaleFactorChanged(float page_scale_factor) override;
   void PageImportanceSignalsChanged() override;
   void DidAutoResize(const blink::WebSize& newSize) override;
   void DidFocus(blink::WebLocalFrame* calling_frame) override;
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index b5d8bca9..046e138 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -3298,11 +3298,35 @@
       allow_gpu_raster);
 }
 
-void RenderWidget::SetPageScaleFactorAndLimits(float page_scale_factor,
-                                               float minimum,
-                                               float maximum) {
+void RenderWidget::SetPageScaleStateAndLimits(float page_scale_factor,
+                                              bool is_pinch_gesture_active,
+                                              float minimum,
+                                              float maximum) {
   layer_tree_view_->layer_tree_host()->SetPageScaleFactorAndLimits(
       page_scale_factor, minimum, maximum);
+
+  // Only continue if this is a mainframe, or something's actually changed.
+  if (!delegate() ||
+      (page_scale_factor == page_scale_factor_from_mainframe_ &&
+       is_pinch_gesture_active == is_pinch_gesture_active_from_mainframe_)) {
+    return;
+  }
+
+  // The page scale is controlled by the WebView for the local main frame of
+  // the Page. So this is called from blink by for the RenderWidget of that
+  // local main frame. We forward the value on to each child RenderWidget (each
+  // of which will be via proxy child frame). These will each in turn forward
+  // the message to their child RenderWidgets (through their proxy child
+  // frames).
+  DCHECK(!is_frozen_);
+
+  for (auto& observer : render_frame_proxies_) {
+    observer.OnPageScaleFactorChanged(page_scale_factor,
+                                      is_pinch_gesture_active);
+  }
+  // Store the value to give to any new RenderFrameProxy that is registered.
+  page_scale_factor_from_mainframe_ = page_scale_factor;
+  is_pinch_gesture_active_from_mainframe_ = is_pinch_gesture_active;
 }
 
 void RenderWidget::StartPageScaleAnimation(const gfx::Vector2d& target_offset,
@@ -3582,26 +3606,6 @@
          layer_tree_view_->IsSurfaceSynchronizationEnabled();
 }
 
-void RenderWidget::PageScaleFactorChanged(float page_scale_factor,
-                                          bool is_pinch_gesture_active) {
-  // The page scale is controlled by the WebView for the local main frame of
-  // the Page. So this is called from blink by for the RenderWidget of that
-  // local main frame. We forward the value on to each child RenderWidget (each
-  // of which will be via proxy child frame). These will each in turn forward
-  // the message to their child RenderWidgets (through their proxy child
-  // frames).
-  DCHECK(!is_frozen_);
-  DCHECK(delegate());
-
-  for (auto& observer : render_frame_proxies_) {
-    observer.OnPageScaleFactorChanged(page_scale_factor,
-                                      is_pinch_gesture_active);
-  }
-  // Store the value to give to any new RenderFrameProxy that is registered.
-  page_scale_factor_from_mainframe_ = page_scale_factor;
-  is_pinch_gesture_active_from_mainframe_ = is_pinch_gesture_active;
-}
-
 void RenderWidget::UseSynchronousResizeModeForTesting(bool enable) {
   synchronous_resize_mode_for_testing_ = enable;
 }
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 4b0d56aa..e90f150b 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -440,9 +440,10 @@
                                     bool down) override;
   void FallbackCursorModeSetCursorVisibility(bool visible) override;
   void SetAllowGpuRasterization(bool allow_gpu_raster) override;
-  void SetPageScaleFactorAndLimits(float page_scale_factor,
-                                   float minimum,
-                                   float maximum) override;
+  void SetPageScaleStateAndLimits(float page_scale_factor,
+                                  bool is_pinch_gesture_active,
+                                  float minimum,
+                                  float maximum) override;
   void StartPageScaleAnimation(const gfx::Vector2d& destination,
                                bool use_anchor,
                                float new_page_scale,
@@ -619,9 +620,6 @@
 
   bool IsSurfaceSynchronizationEnabled() const;
 
-  void PageScaleFactorChanged(float page_scale_factor,
-                              bool is_pinch_gesture_active);
-
   void UseSynchronousResizeModeForTesting(bool enable);
   void SetDeviceScaleFactorForTesting(float factor);
   void SetDeviceColorSpaceForTesting(const gfx::ColorSpace& color_space);
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 01b7e68..2e3a922 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -39,7 +39,6 @@
 #include "content/public/common/service_names.mojom.h"
 #include "content/public/common/webplugininfo.h"
 #include "content/public/renderer/content_renderer_client.h"
-#include "content/public/renderer/media_stream_utils.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/renderer/blob_storage/webblobregistry_impl.h"
 #include "content/renderer/dom_storage/local_storage_cached_areas.h"
@@ -55,7 +54,6 @@
 #include "content/renderer/media/renderer_webaudiodevice_impl.h"
 #include "content/renderer/media/webrtc/transmission_encoding_info_handler.h"
 #include "content/renderer/media_capture_from_element/html_audio_element_capturer_source.h"
-#include "content/renderer/media_capture_from_element/html_video_element_capturer_source.h"
 #include "content/renderer/media_recorder/media_recorder_handler.h"
 #include "content/renderer/mojo/blink_interface_provider_impl.h"
 #include "content/renderer/p2p/port_allocator.h"
@@ -750,20 +748,6 @@
 
 //------------------------------------------------------------------------------
 
-void RendererBlinkPlatformImpl::CreateHTMLVideoElementCapturer(
-    WebMediaStream* web_media_stream,
-    WebMediaPlayer* web_media_player,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  DCHECK(web_media_stream);
-  DCHECK(web_media_player);
-  AddVideoTrackToMediaStream(
-      HtmlVideoElementCapturerSource::CreateFromWebMediaPlayerImpl(
-          web_media_player, content::RenderThread::Get()->GetIOTaskRunner(),
-          std::move(task_runner)),
-      false,  // is_remote
-      web_media_stream);
-}
-
 void RendererBlinkPlatformImpl::CreateHTMLAudioElementCapturer(
     WebMediaStream* web_media_stream,
     WebMediaPlayer* web_media_player,
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index 91345bba..f5298e5e 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -159,10 +159,6 @@
       blink::WebLocalFrame* frame) override;
   std::unique_ptr<webrtc::AsyncResolverFactory>
   CreateWebRtcAsyncResolverFactory() override;
-  void CreateHTMLVideoElementCapturer(
-      blink::WebMediaStream* web_media_stream,
-      blink::WebMediaPlayer* web_media_player,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner) override;
   void CreateHTMLAudioElementCapturer(
       blink::WebMediaStream* web_media_stream,
       blink::WebMediaPlayer* web_media_player,
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index 3dd1dab..db4bdbb1 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -835,10 +835,12 @@
       "//sandbox/mac:seatbelt",
     ]
     ldflags = [
-      # The helper is in Content Shell.app/Contents/Frameworks/Content Shell Helper.app/Contents/MacOS/
+      # The helper is in Content Shell.app/Contents/Frameworks/
+      #     Content Shell Framework.framework/Versions/C/Helpers/
+      #     Content Shell Helper.app/Contents/MacOS/
       # so set rpath up to the base.
       "-rpath",
-      "@executable_path/../../../../../..",
+      "@executable_path/../../../../../../../../../..",
     ]
     info_plist_target = ":content_shell_helper_plist"
   }
diff --git a/content/shell/app/shell_main.cc b/content/shell/app/shell_main.cc
index 6258ba62..0c9a301 100644
--- a/content/shell/app/shell_main.cc
+++ b/content/shell/app/shell_main.cc
@@ -7,6 +7,7 @@
 #include "content/shell/app/shell_main_delegate.h"
 
 #if defined(OS_WIN)
+#include "base/win/win_util.h"
 #include "content/public/app/sandbox_helper_win.h"
 #include "sandbox/win/src/sandbox_types.h"
 #endif
@@ -19,6 +20,9 @@
 int main() {
   HINSTANCE instance = GetModuleHandle(NULL);
 #endif
+  // Load and pin user32.dll to avoid having to load it once tests start while
+  // on the main thread loop where blocking calls are disallowed.
+  base::win::PinUser32();
   sandbox::SandboxInterfaceInfo sandbox_info = {0};
   content::InitializeSandboxInfo(&sandbox_info);
   content::ShellMainDelegate delegate;
diff --git a/content/shell/browser/shell_devtools_manager_delegate.cc b/content/shell/browser/shell_devtools_manager_delegate.cc
index 01f178cd..a3b04f88 100644
--- a/content/shell/browser/shell_devtools_manager_delegate.cc
+++ b/content/shell/browser/shell_devtools_manager_delegate.cc
@@ -64,8 +64,9 @@
   // content::DevToolsSocketFactory.
   std::unique_ptr<net::ServerSocket> CreateForHttpServer() override {
     std::unique_ptr<net::UnixDomainServerSocket> socket(
-        new net::UnixDomainServerSocket(base::Bind(&CanUserConnectToDevTools),
-                                        true /* use_abstract_namespace */));
+        new net::UnixDomainServerSocket(
+            base::BindRepeating(&CanUserConnectToDevTools),
+            true /* use_abstract_namespace */));
     if (socket->BindAndListen(socket_name_, kBackLog) != net::OK)
       return std::unique_ptr<net::ServerSocket>();
 
diff --git a/content/shell/browser/web_test/blink_test_controller.cc b/content/shell/browser/web_test/blink_test_controller.cc
index 5ba6c88..c2eff84 100644
--- a/content/shell/browser/web_test/blink_test_controller.cc
+++ b/content/shell/browser/web_test/blink_test_controller.cc
@@ -368,37 +368,6 @@
   instance_ = nullptr;
 }
 
-void BlinkTestController::EnsureMainWindow() {
-  if (main_window_)
-    return;
-
-  ShellBrowserContext* browser_context =
-      ShellContentBrowserClient::Get()->browser_context();
-
-  initial_size_ = Shell::GetShellDefaultSize();
-  main_window_ = content::Shell::CreateNewWindow(
-      browser_context, GURL(url::kAboutBlankURL), nullptr, initial_size_);
-
-  WebContents* web_contents = main_window_->web_contents();
-  WebContentsObserver::Observe(web_contents);
-
-  RenderViewHost* render_view_host = web_contents->GetRenderViewHost();
-  RenderWidgetHost* render_view_host_widget = render_view_host->GetWidget();
-
-  current_pid_ = base::kNullProcessId;
-  default_prefs_ = render_view_host->GetWebkitPreferences();
-
-  // Focus the RenderWidgetHost. This will send an IPC message to the
-  // renderer to propagate the state change.
-  render_view_host_widget->Focus();
-
-  // Flush various interfaces to ensure a test run begins from a known
-  // state. This will block until page navigation to about:blank successfully
-  // completes.
-  render_view_host_widget->FlushForTesting();
-  GetWebTestControlPtr(render_view_host->GetMainFrame()).FlushForTesting();
-}
-
 bool BlinkTestController::PrepareForWebTest(const TestInfo& test_info) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   test_phase_ = DURING_TEST;
@@ -424,60 +393,113 @@
   accumulated_web_test_runtime_flags_changes_.Clear();
   web_test_control_map_.clear();
 
+  ShellBrowserContext* browser_context =
+      ShellContentBrowserClient::Get()->browser_context();
   is_compositing_test_ =
       test_url_.spec().find("compositing/") != std::string::npos;
   initial_size_ = Shell::GetShellDefaultSize();
+  if (!main_window_) {
+    main_window_ = content::Shell::CreateNewWindow(
+        browser_context, GURL(url::kAboutBlankURL), nullptr, initial_size_);
+    WebContentsObserver::Observe(main_window_->web_contents());
 
-  EnsureMainWindow();
+    // The render frame host is constructed before the call to
+    // WebContentsObserver::Observe, so we need to manually handle the creation
+    // of the new render frame host.
+    HandleNewRenderFrameHost(main_window_->web_contents()->GetMainFrame());
 
-#if defined(OS_MACOSX)
-  // Shell::SizeTo is not implemented on all platforms.
-  main_window_->SizeTo(initial_size_);
-#endif
-  WebContents* web_contents = main_window_->web_contents();
-  RenderViewHost* render_view_host = web_contents->GetRenderViewHost();
-  RenderWidgetHost* render_view_host_widget = render_view_host->GetWidget();
+    if (is_devtools_protocol_test) {
+      devtools_protocol_test_bindings_.reset(
+          new DevToolsProtocolTestBindings(main_window_->web_contents()));
+    }
+    current_pid_ = base::kNullProcessId;
+    default_prefs_ = main_window_->web_contents()
+                         ->GetRenderViewHost()
+                         ->GetWebkitPreferences();
+    if (is_devtools_js_test) {
+      LoadDevToolsJSTest();
+    } else {
+      // Focus the RenderWidgetHost. This will send an IPC message to the
+      // renderer to propagate the state change.
+      main_window_->web_contents()->GetRenderViewHost()->GetWidget()->Focus();
 
-  render_view_host_widget->GetView()->SetSize(initial_size_);
-  // Try to reset the window size. This can fail, see crbug.com/772811
-  render_view_host_widget->SynchronizeVisualProperties();
+      // Flush various interfaces to ensure a test run begins from a known
+      // state.
+      main_window_->web_contents()
+          ->GetRenderViewHost()
+          ->GetWidget()
+          ->FlushForTesting();
+      GetWebTestControlPtr(
+          main_window_->web_contents()->GetRenderViewHost()->GetMainFrame())
+          .FlushForTesting();
 
-  if (is_devtools_protocol_test) {
-    devtools_protocol_test_bindings_.reset(
-        new DevToolsProtocolTestBindings(web_contents));
-  }
+      // Loading the URL will immediately start the web test. Manually call
+      // LoadURLWithParams on the WebContents to avoid extraneous calls from
+      // content::Shell such as SetFocus(), which could race with the web
+      // test.
+      NavigationController::LoadURLParams params(test_url_);
 
-  // Compositing tests override the default preferences (see
-  // BlinkTestController::OverrideWebkitPrefs) so we force them to be
-  // calculated again to ensure is_compositing_test_ changes are picked up.
-  OverrideWebkitPrefs(&default_prefs_);
+      // Using PAGE_TRANSITION_TYPED replicates an omnibox navigation.
+      params.transition_type =
+          ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED);
 
-  render_view_host->UpdateWebkitPreferences(default_prefs_);
-
-  RenderFrameHost* main_frame = render_view_host->GetMainFrame();
-
-  bool new_frame = !base::ContainsKey(main_window_render_process_hosts_,
-                                      main_frame->GetProcess());
-  HandleNewRenderFrameHost(main_frame);
-
-  // Focus the RenderWidgetHost. This will send an IPC message to the
-  // renderer to propagate the state change.
-  render_view_host_widget->Focus();
-
-  // Flush various interfaces to ensure a test run begins from a known state.
-  render_view_host_widget->FlushForTesting();
-  GetWebTestControlPtr(main_frame).FlushForTesting();
-
-  if (is_devtools_js_test) {
-    LoadDevToolsJSTest();
+      // Clear history to purge the prior navigation to about:blank.
+      params.should_clear_history_list = true;
+      main_window_->web_contents()->GetController().LoadURLWithParams(params);
+    }
   } else {
-    NavigationController::LoadURLParams params(test_url_);
-    // Using PAGE_TRANSITION_LINK avoids a BrowsingInstance/process swap
-    // between web tests.
-    params.transition_type = ui::PageTransitionFromInt(
-        new_frame ? ui::PAGE_TRANSITION_TYPED : ui::PAGE_TRANSITION_LINK);
-    params.should_clear_history_list = true;
-    web_contents->GetController().LoadURLWithParams(params);
+#if defined(OS_MACOSX)
+    // Shell::SizeTo is not implemented on all platforms.
+    main_window_->SizeTo(initial_size_);
+#endif
+    main_window_->web_contents()
+        ->GetRenderViewHost()
+        ->GetWidget()
+        ->GetView()
+        ->SetSize(initial_size_);
+    // Try to reset the window size. This can fail, see crbug.com/772811
+    main_window_->web_contents()
+        ->GetRenderViewHost()
+        ->GetWidget()
+        ->SynchronizeVisualProperties();
+    RenderViewHost* render_view_host =
+        main_window_->web_contents()->GetRenderViewHost();
+
+    if (is_devtools_protocol_test) {
+      devtools_protocol_test_bindings_.reset(
+          new DevToolsProtocolTestBindings(main_window_->web_contents()));
+    }
+
+    // Compositing tests override the default preferences (see
+    // BlinkTestController::OverrideWebkitPrefs) so we force them to be
+    // calculated again to ensure is_compositing_test_ changes are picked up.
+    OverrideWebkitPrefs(&default_prefs_);
+
+    render_view_host->UpdateWebkitPreferences(default_prefs_);
+    HandleNewRenderFrameHost(render_view_host->GetMainFrame());
+
+    // Focus the RenderWidgetHost. This will send an IPC message to the
+    // renderer to propagate the state change.
+    main_window_->web_contents()->GetRenderViewHost()->GetWidget()->Focus();
+
+    // Flush various interfaces to ensure a test run begins from a known state.
+    main_window_->web_contents()
+        ->GetRenderViewHost()
+        ->GetWidget()
+        ->FlushForTesting();
+    GetWebTestControlPtr(render_view_host->GetMainFrame()).FlushForTesting();
+
+    if (is_devtools_js_test) {
+      LoadDevToolsJSTest();
+    } else {
+      NavigationController::LoadURLParams params(test_url_);
+      // Using PAGE_TRANSITION_LINK avoids a BrowsingInstance/process swap
+      // between web tests.
+      params.transition_type =
+          ui::PageTransitionFromInt(ui::PAGE_TRANSITION_LINK);
+      params.should_clear_history_list = true;
+      main_window_->web_contents()->GetController().LoadURLWithParams(params);
+    }
   }
   return true;
 }
diff --git a/content/shell/browser/web_test/blink_test_controller.h b/content/shell/browser/web_test/blink_test_controller.h
index b77ed7a..2a6ef05b 100644
--- a/content/shell/browser/web_test/blink_test_controller.h
+++ b/content/shell/browser/web_test/blink_test_controller.h
@@ -114,9 +114,6 @@
   BlinkTestController();
   ~BlinkTestController() override;
 
-  // Make sure the browser window has been created and ready to load a test.
-  void EnsureMainWindow();
-
   // True if the controller is ready for testing.
   bool PrepareForWebTest(const TestInfo& test_info);
   // True if the controller was reset successfully.
diff --git a/content/shell/browser/web_test/web_test_browser_main.cc b/content/shell/browser/web_test/web_test_browser_main.cc
index 4ecf3a5d..622ddfc 100644
--- a/content/shell/browser/web_test/web_test_browser_main.cc
+++ b/content/shell/browser/web_test/web_test_browser_main.cc
@@ -80,8 +80,6 @@
     test_controller.SetTempPath(temp_path);
   }
 
-  test_controller.EnsureMainWindow();
-
   std::cout << "#READY\n";
   std::cout.flush();
 
diff --git a/content/shell/test_runner/test_runner_for_specific_view.cc b/content/shell/test_runner/test_runner_for_specific_view.cc
index 91cf99b..280bce0 100644
--- a/content/shell/test_runner/test_runner_for_specific_view.cc
+++ b/content/shell/test_runner/test_runner_for_specific_view.cc
@@ -650,6 +650,9 @@
         blink::MainThreadIsolate(), content_security_policy.As<v8::String>());
   }
 
+  // Clear the document->isolated world CSP mapping.
+  web_view()->FocusedFrame()->ClearIsolatedWorldCSPForTesting(world_id);
+
   web_view()->FocusedFrame()->SetIsolatedWorldInfo(world_id, info);
 }
 
diff --git a/content/shell/test_runner/web_ax_object_proxy.cc b/content/shell/test_runner/web_ax_object_proxy.cc
index 0e03fabc..abf42f7 100644
--- a/content/shell/test_runner/web_ax_object_proxy.cc
+++ b/content/shell/test_runner/web_ax_object_proxy.cc
@@ -1657,7 +1657,8 @@
 v8::Local<v8::Object> WebAXObjectProxy::ParentElement() {
   accessibility_object_.UpdateLayoutAndCheckValidity();
   blink::WebAXObject parent_object = accessibility_object_.ParentObject();
-  while (parent_object.AccessibilityIsIgnored())
+  while (!parent_object.IsNull() &&
+         !parent_object.AccessibilityIsIncludedInTree())
     parent_object = parent_object.ParentObject();
   return factory_->GetOrCreate(parent_object);
 }
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 98455d6b..49763cbd 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1865,7 +1865,6 @@
     "../renderer/media/webrtc/webrtc_video_track_source_unittest.cc",
     "../renderer/media/webrtc_local_audio_source_provider_unittest.cc",
     "../renderer/media_capture_from_element/html_audio_element_capturer_source_unittest.cc",
-    "../renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc",
     "../renderer/media_recorder/audio_track_recorder_unittest.cc",
     "../renderer/media_recorder/media_recorder_handler_unittest.cc",
     "../renderer/media_recorder/video_track_recorder_unittest.cc",
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py b/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py
index 01e47d43..f6b97ce 100644
--- a/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py
+++ b/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py
@@ -745,11 +745,10 @@
       ['expected_skip'],
       ['--retry-only-retry-on-failure', '--retry-limit=3',
       '--test-name-prefix=unittest_data.integration_tests.SimpleTest.'])
-    # TODO(rmhasan): re-enable assertion after landing crrev.com/c/1594272
     # The number of browser starts include the one call to StartBrowser at the
     # beginning of the run of the test suite and for each RestartBrowser call
     # which happens after every failure
-    # self.assertEquals(self._test_state['num_browser_starts'], 6)
+    self.assertEquals(self._test_state['num_browser_starts'], 6)
 
   def testIntegrationTesttWithBrowserFailure(self):
     self._RunIntegrationTest(
@@ -780,17 +779,28 @@
   def _RunTestsWithExpectationsFiles(self):
     self._RunIntegrationTest(
       'run_tests_with_expectations_files',
-      [('a/b/unexpected-fail.html')],
-      [('a/b/expected-fail.html'),
-       ('a/b/expected-flaky.html')],
-      [('a/b/expected-skip.html')],
+      ['a/b/unexpected-fail.html'],
+      ['a/b/expected-fail.html', 'a/b/expected-flaky.html'],
+      ['should_skip'],
       ['--retry-limit=3', '--retry-only-retry-on-failure-tests',
        ('--test-name-prefix=unittest_data.integration_tests.'
         'RunTestsWithExpectationsFiles.')])
 
+  def testTestFilterCommandLineArg(self):
+    self._RunIntegrationTest(
+      'run_tests_with_expectations_files',
+      ['a/b/unexpected-fail.html'],
+      ['a/b/expected-fail.html'],
+      ['should_skip'],
+      ['--retry-limit=3', '--retry-only-retry-on-failure-tests',
+       ('--test-filter=a/b/unexpected-fail.html::a/b/expected-fail.html::'
+        'should_skip'),
+       ('--test-name-prefix=unittest_data.integration_tests.'
+        'RunTestsWithExpectationsFiles.')])
+
   def testUseTestExpectationsFileToHandleExpectedSkip(self):
     self._RunTestsWithExpectationsFiles()
-    results = self._test_result['tests']['a']['b']['expected-skip.html']
+    results = self._test_result['tests']['should_skip']
     self.assertEqual(results['expected'], 'SKIP')
     self.assertEqual(results['actual'], 'SKIP')
     self.assertNotIn('is_regression', results)
diff --git a/content/test/gpu/gpu_tests/trace_integration_test.py b/content/test/gpu/gpu_tests/trace_integration_test.py
index b3c13a8..0318735 100644
--- a/content/test/gpu/gpu_tests/trace_integration_test.py
+++ b/content/test/gpu/gpu_tests/trace_integration_test.py
@@ -81,11 +81,6 @@
 # The following is defined for Chromium testing internal use.
 _SWAP_CHAIN_GET_FRAME_STATISTICS_MEDIA_FAILED = -1
 
-# Pixel format enums match OverlayFormat in DirectCompositionSurfaceWin.
-_SWAP_CHAIN_PIXEL_FORMAT_BGRA = 0
-_SWAP_CHAIN_PIXEL_FORMAT_YUY2 = 1
-_SWAP_CHAIN_PIXEL_FORMAT_NV12 = 2
-
 _GET_STATISTICS_EVENT_NAME = 'GetFrameStatisticsMedia'
 _SWAP_CHAIN_PRESENT_EVENT_NAME = 'SwapChain::Present'
 
@@ -210,16 +205,6 @@
         os_version_name, gpu.vendor_id, gpu.device_id)
 
   @staticmethod
-  def _SwapChainPixelFormatToStr(pixel_format):
-    if pixel_format == _SWAP_CHAIN_PIXEL_FORMAT_BGRA:
-      return 'BGRA'
-    if pixel_format == _SWAP_CHAIN_PIXEL_FORMAT_YUY2:
-      return 'YUY2'
-    if pixel_format == _SWAP_CHAIN_PIXEL_FORMAT_NV12:
-      return 'NV12'
-    return str(pixel_format)
-
-  @staticmethod
   def _SwapChainPresentationModeToStr(presentation_mode):
     if presentation_mode == _SWAP_CHAIN_PRESENTATION_MODE_COMPOSED:
       return 'COMPOSED'
@@ -283,7 +268,7 @@
       self.fail('Overlay bot config can not be determined')
     assert overlay_bot_config.get('direct_composition', False)
 
-    expected_pixel_format = _SWAP_CHAIN_PIXEL_FORMAT_NV12
+    expected_pixel_format = "NV12"
     supports_nv12_overlays = False
     if overlay_bot_config.get('supports_overlays', False):
       supports_yuy2_overlays = False
@@ -293,7 +278,7 @@
         supports_nv12_overlays = True
       assert supports_yuy2_overlays or supports_nv12_overlays
       if expect_yuy2 or not supports_nv12_overlays:
-        expected_pixel_format = _SWAP_CHAIN_PIXEL_FORMAT_YUY2
+        expected_pixel_format = "YUY2"
     if not supports_nv12_overlays:
       zero_copy = False
 
@@ -309,10 +294,7 @@
                   _SWAP_CHAIN_PRESENT_EVENT_NAME)
       if expected_pixel_format != detected_pixel_format:
         self.fail('SwapChain pixel format mismatch, expected %s got %s' %
-            (TraceIntegrationTest._SwapChainPixelFormatToStr(
-                 expected_pixel_format),
-             TraceIntegrationTest._SwapChainPixelFormatToStr(
-                 detected_pixel_format)))
+            (expected_pixel_format, detected_pixel_format))
       detected_zero_copy = event.args.get('ZeroCopy', None)
       if detected_zero_copy is None:
         self.fail('ZeroCopy is missing from event %s' %
diff --git a/content/test/gpu/unittest_data/integration_tests.py b/content/test/gpu/unittest_data/integration_tests.py
index 1729be1..28c00a0 100644
--- a/content/test/gpu/unittest_data/integration_tests.py
+++ b/content/test/gpu/unittest_data/integration_tests.py
@@ -214,7 +214,7 @@
     tests = [('a/b/unexpected-fail.html', 'failure.html', ()),
              ('a/b/expected-fail.html', 'failure.html', ()),
              ('a/b/expected-flaky.html', 'flaky.html', ()),
-             ('a/b/expected-skip.html', 'skip.html', ())]
+             ('should_skip', 'skip.html', ())]
     for test in tests:
       yield test
 
diff --git a/content/test/gpu/unittest_data/test_expectations/run_tests_with_expectations_files_expectations.txt b/content/test/gpu/unittest_data/test_expectations/run_tests_with_expectations_files_expectations.txt
index 6f80f9e..a4bf7897 100644
--- a/content/test/gpu/unittest_data/test_expectations/run_tests_with_expectations_files_expectations.txt
+++ b/content/test/gpu/unittest_data/test_expectations/run_tests_with_expectations_files_expectations.txt
@@ -2,4 +2,4 @@
 
 crbug.com/124 [ foo ] a/b/expected-fail.html [ Failure ]
 crbug.com/125 [ foo ] a/b/expected-flaky.html [ RetryOnFailure ]
-crbug.com/125 [ foo ] a/b/expected-skip.html [ Skip ]
+crbug.com/125 [ foo ] should_skip [ Skip ]
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index d338d1e..e66997d 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -172,6 +172,16 @@
     }
   }
 
+  void DidFailProvisionalLoadWithError(
+      const GURL& url,
+      int error_code,
+      const base::string16& error_description,
+      bool showing_repost_interstitial) override {}
+
+  void DidFailLoadWithError(const GURL& url,
+                            int error_code,
+                            const base::string16& error_description) override {}
+
 #if defined(OS_ANDROID)
   void UpdateUserGestureCarryoverInfo() override {}
 #endif
diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc
index c705533..dcd35c4 100644
--- a/content/test/test_render_frame_host.cc
+++ b/content/test/test_render_frame_host.cc
@@ -101,6 +101,22 @@
   return true;
 }
 
+void TestRenderFrameHost::DidFailProvisionalLoadWithError(
+    const GURL& url,
+    int error_code,
+    const base::string16& error_description,
+    bool showing_repost_interstitial) {
+  RenderFrameHostImpl::DidFailProvisionalLoadWithError(
+      url, error_code, error_description, showing_repost_interstitial);
+}
+
+void TestRenderFrameHost::DidFailLoadWithError(
+    const GURL& url,
+    int error_code,
+    const base::string16& error_description) {
+  RenderFrameHostImpl::DidFailLoadWithError(url, error_code, error_description);
+}
+
 void TestRenderFrameHost::InitializeRenderFrameIfNeeded() {
   if (!render_view_host()->IsRenderViewLive()) {
     render_view_host()->GetProcess()->Init();
diff --git a/content/test/test_render_frame_host.h b/content/test/test_render_frame_host.h
index ec074d6..ec3214cc 100644
--- a/content/test/test_render_frame_host.h
+++ b/content/test/test_render_frame_host.h
@@ -23,8 +23,6 @@
 #include "content/test/test_render_widget_host.h"
 #include "ui/base/page_transition_types.h"
 
-struct FrameHostMsg_DidCommitProvisionalLoad_Params;
-
 namespace net {
 class IPEndPoint;
 }
@@ -66,6 +64,16 @@
                            const std::string& message) override;
   bool IsTestRenderFrameHost() const override;
 
+  // Public overrides to expose RenderFrameHostImpl's mojo methods to tests.
+  void DidFailProvisionalLoadWithError(
+      const GURL& url,
+      int error_code,
+      const base::string16& error_description,
+      bool showing_repost_interstitial) override;
+  void DidFailLoadWithError(const GURL& url,
+                            int error_code,
+                            const base::string16& error_description) override;
+
   // RenderFrameHostTester implementation.
   void InitializeRenderFrameIfNeeded() override;
   TestRenderFrameHost* AppendChild(const std::string& frame_name) override;
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index 69468bc..4d42b2a 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -256,8 +256,7 @@
     const GURL& url,
     int error_code,
     const base::string16& error_description) {
-  FrameHostMsg_DidFailLoadWithError msg(0, url, error_code, error_description);
-  frame_tree_.root()->current_frame_host()->OnMessageReceived(msg);
+  GetMainFrame()->DidFailLoadWithError(url, error_code, error_description);
 }
 
 bool TestWebContents::CrossProcessNavigationPending() {
diff --git a/device/BUILD.gn b/device/BUILD.gn
index 4968cd08..cd4c5af8 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -124,6 +124,8 @@
     "//base/third_party/dynamic_annotations:dynamic_annotations",
     "//components/apdu",
     "//components/cbor",
+    "//components/device_event_log",
+    "//device/base",
     "//device/base/synchronization",
     "//device/bluetooth",
     "//device/bluetooth:deprecated_experimental_mojo",
@@ -143,7 +145,6 @@
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/blink/public:blink_headers",
-    "//tools/usb_gadget",
     "//ui/base",
     "//url",
   ]
@@ -175,45 +176,10 @@
     deps += [ "//device/udev_linux" ]
   }
 
-  # USB does not compile on iOS.
-  if (!is_ios) {
-    sources += [
-      "usb/mojo/device_impl_unittest.cc",
-      "usb/mojo/device_manager_impl_unittest.cc",
-      "usb/public/cpp/usb_utils_unittest.cc",
-      "usb/usb_descriptors_unittest.cc",
-      "usb/usb_device_handle_unittest.cc",
-      "usb/usb_service_unittest.cc",
-      "usb/webusb_descriptors_unittest.cc",
-    ]
-    deps += [
-      ":usb_test_gadget",
-      "//device/base",
-      "//device/usb",
-      "//device/usb:test_support",
-      "//device/usb/mojo",
-      "//device/usb/public/cpp",
-      "//device/usb/public/cpp:test_support",
-      "//device/usb/public/mojom",
-      "//net:test_support",
-    ]
-
-    if (!is_android) {
-      sources += [ "usb/public/cpp/usb_ids_unittest.cc" ]
-    }
-  }
-
-  # UsbContext is a libusb-specific object.
-  if (is_mac || is_win) {
-    sources += [ "usb/usb_context_unittest.cc" ]
-    deps += [ "//third_party/libusb" ]
-  }
-
   if (is_android) {
     deps += [
       ":bluetooth_test_java",
       ":bluetooth_test_jni_headers",
-      "//device/usb:java",
     ]
   }
 
@@ -387,21 +353,6 @@
   }
 }
 
-source_set("usb_test_gadget") {
-  testonly = true
-
-  sources = [
-    "test/usb_test_gadget.h",
-    "test/usb_test_gadget_impl.cc",
-  ]
-
-  deps = [
-    "//device/base",
-    "//device/usb",
-    "//net:test_support",
-  ]
-}
-
 if (is_android) {
   bluetooth_java_sources_needing_jni = [
     "bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java",
diff --git a/device/fido/ctap_make_credential_request.cc b/device/fido/ctap_make_credential_request.cc
index 7b27a9f..84c37ac 100644
--- a/device/fido/ctap_make_credential_request.cc
+++ b/device/fido/ctap_make_credential_request.cc
@@ -47,7 +47,8 @@
     const CtapMakeCredentialRequest& request) {
   cbor::Value::MapValue cbor_map;
   cbor_map[cbor::Value(1)] = cbor::Value(request.client_data_hash);
-  cbor_map[cbor::Value(2)] = request.rp.ConvertToCBOR();
+  cbor_map[cbor::Value(2)] =
+      PublicKeyCredentialRpEntity::ConvertToCBOR(request.rp);
   cbor_map[cbor::Value(3)] =
       PublicKeyCredentialUserEntity::ConvertToCBOR(request.user);
   cbor_map[cbor::Value(4)] =
diff --git a/device/fido/ctap_request_unittest.cc b/device/fido/ctap_request_unittest.cc
index a0ecf9ff..aa9ddfaf 100644
--- a/device/fido/ctap_request_unittest.cc
+++ b/device/fido/ctap_request_unittest.cc
@@ -20,7 +20,7 @@
 // https://fidoalliance.org/specs/fido-v2.0-rd-20170927/fido-client-to-authenticator-protocol-v2.0-rd-20170927.html
 TEST(CTAPRequestTest, TestConstructMakeCredentialRequestParam) {
   PublicKeyCredentialRpEntity rp("acme.com");
-  rp.SetRpName("Acme");
+  rp.name = "Acme";
 
   PublicKeyCredentialUserEntity user(
       fido_parsing_utils::Materialize(test_data::kUserId));
@@ -98,8 +98,8 @@
   auto client_data_hash = std::get<1>(*request_and_hash);
   EXPECT_THAT(client_data_hash,
               ::testing::ElementsAreArray(test_data::kClientDataHash));
-  EXPECT_EQ(test_data::kRelyingPartyId, request.rp.rp_id());
-  EXPECT_EQ("Acme", request.rp.rp_name());
+  EXPECT_EQ(test_data::kRelyingPartyId, request.rp.id);
+  EXPECT_EQ("Acme", request.rp.name);
   EXPECT_THAT(request.user.id, ::testing::ElementsAreArray(test_data::kUserId));
   ASSERT_TRUE(request.user.name);
   EXPECT_EQ("johnpsmith@example.com", *request.user.name);
diff --git a/device/fido/mac/make_credential_operation.mm b/device/fido/mac/make_credential_operation.mm
index 888524a..4d8604e 100644
--- a/device/fido/mac/make_credential_operation.mm
+++ b/device/fido/mac/make_credential_operation.mm
@@ -45,7 +45,7 @@
 MakeCredentialOperation::~MakeCredentialOperation() = default;
 
 const std::string& MakeCredentialOperation::RpId() const {
-  return request().rp.rp_id();
+  return request().rp.id;
 }
 
 void MakeCredentialOperation::Run() {
diff --git a/device/fido/make_credential_request_handler.cc b/device/fido/make_credential_request_handler.cc
index d709e91..90c3e96 100644
--- a/device/fido/make_credential_request_handler.cc
+++ b/device/fido/make_credential_request_handler.cc
@@ -340,8 +340,7 @@
     return;
   }
 
-  const auto rp_id_hash =
-      fido_parsing_utils::CreateSHA256Hash(request_.rp.rp_id());
+  const auto rp_id_hash = fido_parsing_utils::CreateSHA256Hash(request_.rp.id);
 
   if (!response || response->GetRpIdHash() != rp_id_hash) {
     FIDO_LOG(ERROR) << "Failing assertion request due to bad response from "
diff --git a/device/fido/make_credential_task.cc b/device/fido/make_credential_task.cc
index 05ef98b3..053f60f 100644
--- a/device/fido/make_credential_task.cc
+++ b/device/fido/make_credential_task.cc
@@ -125,7 +125,7 @@
 CtapGetAssertionRequest MakeCredentialTask::NextSilentSignRequest() {
   DCHECK(request_.exclude_list &&
          current_credential_ < request_.exclude_list->size());
-  CtapGetAssertionRequest request(request_.rp.rp_id(),
+  CtapGetAssertionRequest request(request_.rp.id,
                                   /*client_data_json=*/"");
   request.allow_list = {{request_.exclude_list->at(current_credential_)}};
   request.user_presence_required = false;
diff --git a/device/fido/public_key_credential_rp_entity.cc b/device/fido/public_key_credential_rp_entity.cc
index c46d0df..cae203a 100644
--- a/device/fido/public_key_credential_rp_entity.cc
+++ b/device/fido/public_key_credential_rp_entity.cc
@@ -14,41 +14,52 @@
 // static
 base::Optional<PublicKeyCredentialRpEntity>
 PublicKeyCredentialRpEntity::CreateFromCBORValue(const cbor::Value& cbor) {
-  if (!cbor.is_map() || cbor.GetMap().size() > 3)
+  if (!cbor.is_map() || cbor.GetMap().size() > 3) {
     return base::nullopt;
-
-  const auto& rp_map = cbor.GetMap();
-  bool is_rp_map_format_correct =
-      std::all_of(rp_map.begin(), rp_map.end(), [](const auto& element) {
-        if (!element.first.is_string() || !element.second.is_string())
-          return false;
-
-        const auto& key = element.first.GetString();
-        return (key == kEntityIdMapKey || key == kEntityNameMapKey ||
-                key == kIconUrlMapKey);
-      });
-
-  if (!is_rp_map_format_correct)
+  }
+  const cbor::Value::MapValue& rp_map = cbor.GetMap();
+  for (const auto& element : rp_map) {
+    if (!element.first.is_string() || !element.second.is_string()) {
+      return base::nullopt;
+    }
+    const std::string& key = element.first.GetString();
+    if (key != kEntityIdMapKey && key != kEntityNameMapKey &&
+        key != kIconUrlMapKey) {
+      return base::nullopt;
+    }
+  }
+  const auto id_it = rp_map.find(cbor::Value(kEntityIdMapKey));
+  if (id_it == rp_map.end()) {
     return base::nullopt;
-
-  const auto& id_it = rp_map.find(cbor::Value(kEntityIdMapKey));
-  const auto& name_it = rp_map.find(cbor::Value(kEntityNameMapKey));
-  const auto& icon_it = rp_map.find(cbor::Value(kIconUrlMapKey));
-  if (id_it == rp_map.end())
-    return base::nullopt;
+  }
   PublicKeyCredentialRpEntity rp(id_it->second.GetString());
-
-  if (name_it != rp_map.end())
-    rp.SetRpName(name_it->second.GetString());
-
-  if (icon_it != rp_map.end())
-    rp.SetRpIconUrl(GURL(icon_it->second.GetString()));
-
+  const auto name_it = rp_map.find(cbor::Value(kEntityNameMapKey));
+  if (name_it != rp_map.end()) {
+    rp.name = name_it->second.GetString();
+  }
+  const auto icon_it = rp_map.find(cbor::Value(kIconUrlMapKey));
+  if (icon_it != rp_map.end()) {
+    rp.icon_url = GURL(icon_it->second.GetString());
+  }
   return rp;
 }
 
+// static
+cbor::Value PublicKeyCredentialRpEntity::ConvertToCBOR(
+    const PublicKeyCredentialRpEntity& rp) {
+  cbor::Value::MapValue rp_map;
+  rp_map.emplace(kEntityIdMapKey, rp.id);
+  if (rp.name) {
+    rp_map.emplace(kEntityNameMapKey, *rp.name);
+  }
+  if (rp.icon_url) {
+    rp_map.emplace(kIconUrlMapKey, rp.icon_url->spec());
+  }
+  return cbor::Value(std::move(rp_map));
+}
+
 PublicKeyCredentialRpEntity::PublicKeyCredentialRpEntity(std::string rp_id)
-    : rp_id_(std::move(rp_id)) {}
+    : id(std::move(rp_id)) {}
 
 PublicKeyCredentialRpEntity::PublicKeyCredentialRpEntity(
     const PublicKeyCredentialRpEntity& other) = default;
@@ -64,28 +75,4 @@
 
 PublicKeyCredentialRpEntity::~PublicKeyCredentialRpEntity() = default;
 
-PublicKeyCredentialRpEntity& PublicKeyCredentialRpEntity::SetRpName(
-    std::string rp_name) {
-  rp_name_ = std::move(rp_name);
-  return *this;
-}
-
-PublicKeyCredentialRpEntity& PublicKeyCredentialRpEntity::SetRpIconUrl(
-    GURL icon_url) {
-  rp_icon_url_ = std::move(icon_url);
-  return *this;
-}
-
-cbor::Value PublicKeyCredentialRpEntity::ConvertToCBOR() const {
-  cbor::Value::MapValue rp_map;
-  rp_map.emplace(kEntityIdMapKey, rp_id_);
-  if (rp_name_)
-    rp_map.emplace(kEntityNameMapKey, *rp_name_);
-
-  if (rp_icon_url_)
-    rp_map.emplace(kIconUrlMapKey, rp_icon_url_->spec());
-
-  return cbor::Value(std::move(rp_map));
-}
-
 }  // namespace device
diff --git a/device/fido/public_key_credential_rp_entity.h b/device/fido/public_key_credential_rp_entity.h
index d7a7d23..e701357a 100644
--- a/device/fido/public_key_credential_rp_entity.h
+++ b/device/fido/public_key_credential_rp_entity.h
@@ -16,13 +16,15 @@
 
 namespace device {
 
-// Data structure containing information about relying party that invoked
-// WebAuth API. Includes a relying party id, an optional relying party name,,
-// and optional relying party display image url.
-class COMPONENT_EXPORT(DEVICE_FIDO) PublicKeyCredentialRpEntity {
+// PublicKeyCredentialRpEntity identifies the web application creating or
+// challenging a WebAuthn credential.
+//
+// https://www.w3.org/TR/webauthn/#dictdef-publickeycredentialrpentity
+struct COMPONENT_EXPORT(DEVICE_FIDO) PublicKeyCredentialRpEntity {
  public:
   static base::Optional<PublicKeyCredentialRpEntity> CreateFromCBORValue(
       const cbor::Value& cbor);
+  static cbor::Value ConvertToCBOR(const PublicKeyCredentialRpEntity&);
 
   explicit PublicKeyCredentialRpEntity(std::string rp_id);
   PublicKeyCredentialRpEntity(const PublicKeyCredentialRpEntity& other);
@@ -32,19 +34,9 @@
   PublicKeyCredentialRpEntity& operator=(PublicKeyCredentialRpEntity&& other);
   ~PublicKeyCredentialRpEntity();
 
-  cbor::Value ConvertToCBOR() const;
-
-  PublicKeyCredentialRpEntity& SetRpName(std::string rp_name);
-  PublicKeyCredentialRpEntity& SetRpIconUrl(GURL icon_url);
-
-  const std::string& rp_id() const { return rp_id_; }
-  const base::Optional<std::string>& rp_name() const { return rp_name_; }
-  const base::Optional<GURL>& rp_icon_url() const { return rp_icon_url_; }
-
- private:
-  std::string rp_id_;
-  base::Optional<std::string> rp_name_;
-  base::Optional<GURL> rp_icon_url_;
+  std::string id;
+  base::Optional<std::string> name;
+  base::Optional<GURL> icon_url;
 };
 
 }  // namespace device
diff --git a/device/fido/u2f_command_constructor.cc b/device/fido/u2f_command_constructor.cc
index 84d2e3f..9c4dfca 100644
--- a/device/fido/u2f_command_constructor.cc
+++ b/device/fido/u2f_command_constructor.cc
@@ -49,7 +49,7 @@
       request.attestation_preference ==
       AttestationConveyancePreference::ENTERPRISE;
   return ConstructU2fRegisterCommand(
-      fido_parsing_utils::CreateSHA256Hash(request.rp.rp_id()),
+      fido_parsing_utils::CreateSHA256Hash(request.rp.id),
       request.client_data_hash, is_invidual_attestation);
 }
 
@@ -57,7 +57,7 @@
     const CtapMakeCredentialRequest& request,
     base::span<const uint8_t> key_handle) {
   return ConstructU2fSignCommand(
-      fido_parsing_utils::CreateSHA256Hash(request.rp.rp_id()),
+      fido_parsing_utils::CreateSHA256Hash(request.rp.id),
       request.client_data_hash, key_handle);
 }
 
diff --git a/device/fido/u2f_command_constructor_unittest.cc b/device/fido/u2f_command_constructor_unittest.cc
index d3ec18a..3120560 100644
--- a/device/fido/u2f_command_constructor_unittest.cc
+++ b/device/fido/u2f_command_constructor_unittest.cc
@@ -20,7 +20,7 @@
 
 CtapMakeCredentialRequest ConstructMakeCredentialRequest() {
   PublicKeyCredentialRpEntity rp("acme.com");
-  rp.SetRpName("acme.com");
+  rp.name = "acme.com";
 
   PublicKeyCredentialUserEntity user(
       fido_parsing_utils::Materialize(test_data::kUserId));
@@ -73,7 +73,7 @@
 
 TEST(U2fCommandConstructorTest, TestU2fRegisterCredentialAlgorithmRequirement) {
   PublicKeyCredentialRpEntity rp("acme.com");
-  rp.SetRpName("acme.com");
+  rp.name = "acme.com";
 
   PublicKeyCredentialUserEntity user(
       fido_parsing_utils::Materialize(test_data::kUserId));
diff --git a/device/fido/u2f_register_operation.cc b/device/fido/u2f_register_operation.cc
index 342287e..d799c31 100644
--- a/device/fido/u2f_register_operation.cc
+++ b/device/fido/u2f_register_operation.cc
@@ -147,7 +147,7 @@
       auto response =
           AuthenticatorMakeCredentialResponse::CreateFromU2fRegisterResponse(
               device()->DeviceTransport(),
-              fido_parsing_utils::CreateSHA256Hash(request().rp.rp_id()),
+              fido_parsing_utils::CreateSHA256Hash(request().rp.id),
               apdu_response->data());
       std::move(callback())
           .Run(CtapDeviceResponseCode::kSuccess, std::move(response));
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc
index eeb9a0c4..821df8f3 100644
--- a/device/fido/virtual_ctap2_device.cc
+++ b/device/fido/virtual_ctap2_device.cc
@@ -604,8 +604,7 @@
   }
 
   // 6. Check for already registered credentials.
-  const auto rp_id_hash =
-      fido_parsing_utils::CreateSHA256Hash(request.rp.rp_id());
+  const auto rp_id_hash = fido_parsing_utils::CreateSHA256Hash(request.rp.id);
   if (request.exclude_list) {
     if (config_.reject_large_allow_and_exclude_lists &&
         request.exclude_list->size() > 1) {
@@ -1302,7 +1301,7 @@
     DCHECK(!registration.second.is_u2f);
     DCHECK(registration.second.user);
     DCHECK(registration.second.rp);
-    if (!base::ContainsKey(rp_ids, registration.second.rp->rp_id())) {
+    if (!base::ContainsKey(rp_ids, registration.second.rp->id)) {
       mutable_state()->pending_rps.push_back(*registration.second.rp);
     }
   }
@@ -1345,11 +1344,12 @@
 void VirtualCtap2Device::GetNextRP(cbor::Value::MapValue* response_map) {
   DCHECK(!mutable_state()->pending_rps.empty());
   response_map->emplace(static_cast<int>(CredentialManagementResponseKey::kRP),
-                        mutable_state()->pending_rps.front().ConvertToCBOR());
+                        PublicKeyCredentialRpEntity::ConvertToCBOR(
+                            mutable_state()->pending_rps.front()));
   response_map->emplace(
       static_cast<int>(CredentialManagementResponseKey::kRPIDHash),
       fido_parsing_utils::CreateSHA256Hash(
-          mutable_state()->pending_rps.front().rp_id()));
+          mutable_state()->pending_rps.front().id));
   mutable_state()->pending_rps.pop_front();
 }
 
diff --git a/device/fido/win/webauthn_api.cc b/device/fido/win/webauthn_api.cc
index bfd297f..4ee1a90 100644
--- a/device/fido/win/webauthn_api.cc
+++ b/device/fido/win/webauthn_api.cc
@@ -196,9 +196,9 @@
                                     CtapMakeCredentialRequest request) {
   DCHECK(webauthn_api->IsAvailable());
 
-  base::string16 rp_id = base::UTF8ToUTF16(request.rp.rp_id());
-  base::string16 rp_name = base::UTF8ToUTF16(request.rp.rp_name().value_or(""));
-  base::string16 rp_icon_url = OptionalGURLToUTF16(request.rp.rp_icon_url());
+  base::string16 rp_id = base::UTF8ToUTF16(request.rp.id);
+  base::string16 rp_name = base::UTF8ToUTF16(request.rp.name.value_or(""));
+  base::string16 rp_icon_url = OptionalGURLToUTF16(request.rp.icon_url);
   WEBAUTHN_RP_ENTITY_INFORMATION rp_info{
       WEBAUTHN_RP_ENTITY_INFORMATION_CURRENT_VERSION, base::as_wcstr(rp_id),
       base::as_wcstr(rp_name), base::as_wcstr(rp_icon_url)};
diff --git a/device/test/DEPS b/device/test/DEPS
index 89ce397..5677ce6c 100644
--- a/device/test/DEPS
+++ b/device/test/DEPS
@@ -1,9 +1,5 @@
 include_rules = [
   "+mojo/core/embedder",
-  "+net/base",
-  "+net/proxy_resolution",
-  "+net/traffic_annotation",
-  "+net/url_request",
   # The test runner needs to initialize various parts of the UI stack.
   "+ui",
 ]
diff --git a/device/usb/public/cpp/BUILD.gn b/device/usb/public/cpp/BUILD.gn
deleted file mode 100644
index 4b144d3..0000000
--- a/device/usb/public/cpp/BUILD.gn
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_ids = "//third_party/usb_ids/usb.ids"
-generated_ids = "$target_gen_dir/usb_ids_gen.cc"
-
-action("usb_device_ids") {
-  script = "//device/usb/public/tools/usb_ids.py"
-  inputs = [
-    source_ids,
-  ]
-  outputs = [
-    generated_ids,
-  ]
-  args = [
-    "-i",
-    rebase_path(source_ids, root_build_dir),
-    "-o",
-    rebase_path(generated_ids, root_build_dir),
-  ]
-
-  # Only the device_usb_public_cpp target can depend on us.
-  visibility = [ ":cpp" ]
-}
-
-source_set("cpp") {
-  sources = [
-    "usb_ids.cc",
-    "usb_ids.h",
-    "usb_utils.cc",
-    "usb_utils.h",
-    generated_ids,
-  ]
-
-  deps = [
-    ":usb_device_ids",
-    "//device/usb/public/mojom",
-  ]
-}
-
-static_library("test_support") {
-  testonly = true
-
-  sources = [
-    "fake_usb_device.cc",
-    "fake_usb_device.h",
-    "fake_usb_device_info.cc",
-    "fake_usb_device_info.h",
-    "fake_usb_device_manager.cc",
-    "fake_usb_device_manager.h",
-    "mock_usb_mojo_device.cc",
-    "mock_usb_mojo_device.h",
-  ]
-
-  deps = [
-    ":cpp",
-  ]
-
-  public_deps = [
-    "//base",
-    "//device/usb/public/mojom",
-    "//testing/gmock",
-    "//url:url",
-  ]
-}
diff --git a/device/usb/public/mojom/BUILD.gn b/device/usb/public/mojom/BUILD.gn
deleted file mode 100644
index 1de3791..0000000
--- a/device/usb/public/mojom/BUILD.gn
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-mojom("mojom") {
-  sources = [
-    "device.mojom",
-    "device_enumeration_options.mojom",
-    "device_manager.mojom",
-    "device_manager_client.mojom",
-  ]
-
-  public_deps = [
-    "//mojo/public/mojom/base",
-    "//url/mojom:url_mojom_gurl",
-  ]
-
-  # USB Mojom interfaces are exposed publicly to layout tests which use
-  # prepackaged redistributable JS bindings. It is therefore not desirable to
-  # scramble these messages.
-  scramble_message_ids = false
-
-  # The blink variant of the usb mojom is depended on by the blink platform
-  # target. All blink variant mojoms use WTF types, which are part of the
-  # blink platform component. In order to avoid a dependency cycle, these
-  # targets must be part of that component.
-  export_class_attribute_blink = "BLINK_PLATFORM_EXPORT"
-  export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
-  export_header_blink = "third_party/blink/public/platform/web_common.h"
-
-  visibility_blink = [
-    "//components/arc/common:common_blink",
-    "//third_party/blink/public/mojom/usb:usb_blink",
-    "//third_party/blink/renderer/modules/webusb",
-    "//chrome/browser/ui/webui/usb_internals:mojo_bindings_blink",
-  ]
-}
-
-mojom("test") {
-  sources = [
-    "device_manager_test.mojom",
-  ]
-
-  public_deps = [
-    "//url/mojom:url_mojom_gurl",
-  ]
-}
diff --git a/device/usb/public/mojom/OWNERS b/device/usb/public/mojom/OWNERS
deleted file mode 100644
index 08850f4..0000000
--- a/device/usb/public/mojom/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/device/usb/usb_device_android.h b/device/usb/usb_device_android.h
deleted file mode 100644
index 2b83bfb..0000000
--- a/device/usb/usb_device_android.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef DEVICE_USB_USB_DEVICE_ANDROID_H_
-#define DEVICE_USB_USB_DEVICE_ANDROID_H_
-
-#include "base/android/scoped_java_ref.h"
-#include "base/memory/weak_ptr.h"
-#include "device/usb/usb_device.h"
-
-namespace device {
-
-class UsbServiceAndroid;
-
-class UsbDeviceAndroid : public UsbDevice {
- public:
-  static scoped_refptr<UsbDeviceAndroid> Create(
-      JNIEnv* env,
-      base::WeakPtr<UsbServiceAndroid> service,
-      const base::android::JavaRef<jobject>& usb_device);
-
-  // UsbDevice:
-  void RequestPermission(ResultCallback callback) override;
-  bool permission_granted() const override;
-  void Open(OpenCallback callback) override;
-
-  jint device_id() const { return device_id_; }
-  void PermissionGranted(JNIEnv* env, bool granted);
-
- private:
-  UsbDeviceAndroid(
-      JNIEnv* env,
-      base::WeakPtr<UsbServiceAndroid> service,
-      uint16_t usb_version,
-      uint8_t device_class,
-      uint8_t device_subclass,
-      uint8_t device_protocol,
-      uint16_t vendor_id,
-      uint16_t product_id,
-      uint16_t device_version,
-      const base::string16& manufacturer_string,
-      const base::string16& product_string,
-      const base::string16& serial_number,
-      const base::android::JavaRef<jobject>& wrapper);
-  ~UsbDeviceAndroid() override;
-
-  void CallRequestPermissionCallbacks(bool granted);
-  void OnDeviceOpenedToReadDescriptors(
-      scoped_refptr<UsbDeviceHandle> device_handle);
-  void OnReadDescriptors(scoped_refptr<UsbDeviceHandle> device_handle,
-                         std::unique_ptr<UsbDeviceDescriptor> descriptor);
-  void OnReadWebUsbDescriptors(
-      scoped_refptr<UsbDeviceHandle> device_handle,
-      const GURL& landing_page);
-
-  const jint device_id_;
-  bool permission_granted_ = false;
-  std::list<ResultCallback> request_permission_callbacks_;
-  base::WeakPtr<UsbServiceAndroid> service_;
-
-  // Java object org.chromium.device.usb.ChromeUsbDevice.
-  base::android::ScopedJavaGlobalRef<jobject> j_object_;
-};
-
-}  // namespace device
-
-#endif  // DEVICE_USB_USB_DEVICE_ANDROID_H_
diff --git a/docs/security/sheriff.md b/docs/security/sheriff.md
index 48e61b9..df742104 100644
--- a/docs/security/sheriff.md
+++ b/docs/security/sheriff.md
@@ -18,75 +18,81 @@
 You might also like the [HOWTO: Be A Security Sheriff
 deck](https://docs.google.com/presentation/d/1eISJXxyv7dUCGUKk_rvUI9t9s2xb98QY4d_-dZSa7Wg/edit#slide=id.p).
 
-## What Is A Security Sheriff?
+## What Is A Security Sheriff Or Marshal?
 
-A security sheriff is a member of a rotation that occurs in 1-week time slots,
-starting on Tuesdays and ending the following Monday. All sheriffs are Googlers
-and so some links on this page might not be externally accessible (or indeed
-locked down to just Chrome Security Googlers).
+A security sheriff (as well as a security marshal) is a member of a rotation
+that occurs in 1-week time slots, starting on Tuesdays and ending the following
+Monday. All sheriffs and marshals are Googlers and so some links on this page
+might not be externally accessible (or indeed locked down to just Chrome
+Security Googlers).
 
 [Here is the rotation
 schedule](https://docs.google.com/spreadsheets/d/10sLYZbi6QfLcXrhO-j5eSc82uc7NKnBz_o1pR9y8h7U/edit#gid=0).
 
-Sheriffs ensure that all incoming security issues are triaged quickly and
-correctly. We aim to have get every bug triaged and assigned **within 48 hours**
-(preferably 24). This includes weekends, so it's good for sheriffs to check in
-once on a weekend and see if there are any emergencies that need immediate action.
+Sheriffs and marshals ensure that all incoming security issues are triaged
+quickly and correctly. We aim to have every bug triaged and assigned **within
+two business days** (preferably one). This does not include weekends, but please
+ensure you leave a clear queue before the weekend (i.e. on Friday, unless there
+is a holiday) and check first thing after the weekend (i.e. on Monday morning,
+unless there is a holiday).
 
-Sheriffing is not an on-call rotation, however. Sheriffs don't have to work
-nights or to do more than a few minutes' work on weekends.
 
-## When Am I The Security Sheriff?
+## When Am I The Security Sheriff Or Marshal?
 
-You should get a calendar invite. Please accept it to acknowledge. If you need to
-swap shifts, ask around for a volunteer and then just update the
+You should get a calendar invite. Please accept it to acknowledge. If you need
+to swap shifts, ask around for a volunteer and then just update the
 [rotation sheet](https://docs.google.com/spreadsheets/d/10sLYZbi6QfLcXrhO-j5eSc82uc7NKnBz_o1pR9y8h7U/edit#gid=0)
 and wait 10 minutes for the calendar invites to be updated.
 
-## I'm The Security Sheriff. What Do I Do?
+## I'm The Security Sheriff Or Marshal. What Do I Do?
 
-Each week has a primary and secondary sheriff, and during their rotation both
-have various important and overlapping responsibilities:
+Each week has a sheriff and marshal, and during their rotation both have
+various important responsibilities:
 
-### Primary Sheriff
+### Sheriff
 
 * Look at every incoming security bug report on the
-[dashboard](http://go/chrome-security-bugs). Ensure each is accurately triaged,
-and actively progressing towards getting fixed.
+  [dashboard](http://go/chrome-security-bugs). Ensure each is accurately
+  triaged, and actively progressing towards getting fixed.
 * Keep the [Sheriff Handoff Log](http://go/chrome-security-sheriff-handoff) up
-to date.
+  to date.
 * Shout for help if the incoming bug rate is too high ([suggested vocal
-exercises](https://youtu.be/5y_SbnPx_cE?t=37s)). The first person to ask is
-the secondary sheriff.
+  exercises](https://youtu.be/5y_SbnPx_cE?t=37s)). The first person to ask is
+  the marshal.
+* Make sure all new bug reports are triaged completely. That means no red cells
+  on the dashboard. Double-check that OS are set properly. For most of the bugs,
+  more than one OS is affected, but the dashboard will not highlight it in red.
 * Stay sharp, keep in shape ([hand-stand
-pushups](https://www.youtube.com/watch?v=jZ1ZDlLImF8#t=50) are standard for the
-primary sheriff), and remember you may be [called upon during
-emergencies](https://www.youtube.com/watch?v=buHaKYL9Jhg).
+  pushups](https://www.youtube.com/watch?v=jZ1ZDlLImF8#t=50) are standard for
+  the sheriff), and remember you may be [called upon during
+  emergencies](https://www.youtube.com/watch?v=buHaKYL9Jhg).
 
-### Secondary Sheriff
+### Marshal
 
 * Ensure that all incoming queries to the
-[security@chromium.org](https://groups.google.com/a/chromium.org/forum/#!forum/security)
-and
-[chrome-security@google.com](https://groups.google.com/a/google.com/forum/#!forum/chrome-security)
-lists get a reply (by someone; not necessarily the sheriffs themselves).
-See [go/chrome-security-emails](https://goto.google.com/chrome-security-emails) for a dashboard.
+  [security@chromium.org](https://groups.google.com/a/chromium.org/forum/#!forum/security)
+  and
+  [chrome-security@google.com](https://groups.google.com/a/google.com/forum/#!forum/chrome-security)
+  lists get a reply (by someone; not necessarily the marshal themselves). See
+  [go/chrome-security-emails](https://goto.google.com/chrome-security-emails)
+  for a dashboard.
   * Note: external emails will always come in on security@chromium.org as
-chrome-security@google.com is a google-only list, but both need to be triaged.
+    chrome-security@google.com is a Google-only list, but both need to be
+    triaged.
 * Ensure [accurate label management](security-labels.md) on bugs, for example
-applying the correct **Merge-?** and **Restrict-View-?** labels when a bug
-transitions to **Fixed**.
+  applying the correct **Merge-?** and **Restrict-View-?** labels when a bug
+  transitions to **Fixed**.
 * Change bugs status to **Fixed** for those that the developer forgets to
-close. Make sure to read bug comments where developer might point out that it
-needs more CLs, et c. Wait 24 hours before closing ClusterFuzz bugs, to give
-ClusterFuzz a chance to close it automatically.
+  close. Make sure to read bug comments where developer might point out that it
+  needs more CLs, et c. Wait 24 hours before closing ClusterFuzz bugs, to give
+  ClusterFuzz a chance to close it automatically.
   * [Starting point](https://bugs.chromium.org/p/chromium/issues/list?can=2&q=Type%3D%22Bug-Security%22+%22Change-Id:%22)
-* Look at open security bug reports and check that progress is occurring.
-* Generally keep an eye on all bug traffic in case anything needs action or
-replying to.
+* Look at open security bug reports and check that progress is occurring. That
+  includes the Low Severity Bugs page of the dashboard. The rule of thumb is
+  *if there is any red cell on the dashboard, it needs your attention*.
 * Stay sharp, keep in shape ([finger
-exercises](https://youtu.be/20elMaVZ9lg?t=47s) are standard for the secondary
-sheriff), and remember you may be called upon during emergencies.
+  exercises](https://youtu.be/20elMaVZ9lg?t=47s) are standard for the marshal),
+  and remember you may be called upon during emergencies.
 
 ## Life Of A Security Bug
 
@@ -107,46 +113,51 @@
 ![alt text](life-of-a-security-issue.png "Life of a security issue.")
 
 * **If the report is invalid**, remove the **Restrict-View-SecurityTeam** label
-and mark it **WontFix**.
+  and mark it **WontFix**.
 * **If the report is a duplicate**, mark it **Duplicate**. If the issue this is
-a duplicate of is public, remove the **Restrict-View-SecurityTeam** label.
+  a duplicate of is public, remove the **Restrict-View-SecurityTeam** label.
 * **If the report is primarily a privacy issue**, send it to the privacy team:
-  * Add the **Privacy** component so that it enters their triage queue
+  * Add the **Privacy** component so that it enters their triage queue.
   * CC any security team members, including yourself, who may be interested in
-  the privacy issue
+    the privacy issue.
 	* Change the **Restrict-View-SecurityTeam** label to
-  **Restrict-View-ChromePrivacy**
+  **Restrict-View-ChromePrivacy**.
     * Note that security team members don't automatically have privacy bug
-    access, so this will probably make the issue inaccessible to you.
+      access, so this will probably make the issue inaccessible to you.
 * **If the report is asking about why something is or is not on the Safe
-Browsing list:**
-  * Assign it to zbutler@, who will triage it for the Safe Browsing team
+  Browsing list:**
+  * Assign it to zbutler@, who will triage it for the Safe Browsing team.
 	* Remove the **Restrict-View-SecurityTeam** label and add the
-  **Restrict-View-Google** label
-  * Change **Type-Bug-Security** label to **Type-Bug**
-  * Add the **Security** component
-  * See below for reporting URLs to SafeBrowsing
-* **If the report is a potentially valid bug but is not a security vulnerability:**
-  * remove the **Restrict-View-SecurityTeam** label. If necessary, add one of the
-  other **Restrict-View-?** labels:
-    * **Restrict-View-Google** if this is a crash report
-    * **Restrict-View-EditIssue** if the bug can be abused (e.g. denial of service)
+  **Restrict-View-Google** label.
+  * Change **Type-Bug-Security** label to **Type-Bug**.
+  * Add the **Security** component.
+  * See below for reporting URLs to SafeBrowsing.
+* **If the report is a potentially valid bug but is not a security
+  vulnerability:**
+  * remove the **Restrict-View-SecurityTeam** label. If necessary, add one of
+    the other **Restrict-View-?** labels:
+    * **Restrict-View-Google** if this is a crash report.
+    * **Restrict-View-EditIssue** if the bug can be abused (e.g. denial of
+      service)
 	* Change **Type-Bug-Security** label to **Type-Bug** (or whatever **Type-?**
-  is appropriate)
-  * Add appropriate component or CCs to ensure it does get triaged
-  * Add the **Security** component or the **Team-Security-UX** label if the security
-team should still track the issue (e.g. security features).
+    is appropriate).
+  * Add appropriate component or CCs to ensure it does get triaged.
+  * Add the **Security** component or the **Team-Security-UX** label if the
+    security team should still track the issue (e.g. security features).
 * **If the report doesn't have enough information**, ask the reporter for more
-information, add the **Needs-Feedback** label and wait for 24 hours for a response.
+  information, add the **Needs-Feedback** label and wait for 24 hours for a
+  response.
 	* The [security bug template](https://bugs.chromium.org/p/chromium/issues/entry?template=Security+Bug)
-asks reporters to attach files directly, not in zip or other archives, and attach
-the source of any online demos they've created.  If they've not done so, please make
-sure all files needed to reproduce the issue are downloaded and attached.
+    asks reporters to attach files directly, not in zip or other archives, and
+    attach the source of any online demos they've created. If they've not done
+    so, please make sure all files needed to reproduce the issue are downloaded
+    and attached.
 * **If the bug is a security bug, but is only applicable to Chrome OS**:
-	* The Chrome OS Security team now has their own sheriffing rotation. To get bugs
-into their triage queue, just set OS to the single value of "Chrome". No other steps
-or labels are needed.
-	* If you need to ping or ask about Chrome OS bug, [ask their current sheriff](go/whos-the-chromeos-sheriff).
+	* The Chrome OS Security team now has their own sheriffing rotation. To get
+    bugs into their triage queue, just set OS to the single value of "Chrome".
+    No other steps or labels are needed.
+	* If you need to ping or ask about Chrome OS bug, [ask their current
+    sheriff](go/whos-the-chromeos-sheriff).
 * **If the report smells like a vulnerability, keep going.**
 
 ### Verify And Label The Bug
@@ -159,25 +170,26 @@
 Tips for reproducing bugs:
 
 * [https://clusterfuzz.com/upload-testcase](https://clusterfuzz.com/upload-testcase)
-allows you to upload files to reproduce crashes on various platforms and will
-identify revision ranges when the regression was introduced. If a test case
-requires multiple files, they can be uploaded together in a zip or tar archive.
+  allows you to upload files to reproduce crashes on various platforms and will
+  identify revision ranges when the regression was introduced. If a test case
+  requires multiple files, they can be uploaded together in a zip or tar
+  archive.
 * When you can't just build from a specific branch locally, check out
-[https://dev.chromium.org/getting-involved/dev-channel](https://dev.chromium.org/getting-involved/dev-channel)
-or
-[https://commondatastorage.googleapis.com/chromium-browser-asan/index.html](https://commondatastorage.googleapis.com/chromium-browser-asan/index.html)
-for latest release of a specific version.
+  [https://dev.chromium.org/getting-involved/dev-channel](https://dev.chromium.org/getting-involved/dev-channel)
+  or
+  [https://commondatastorage.googleapis.com/chromium-browser-asan/index.html](https://commondatastorage.googleapis.com/chromium-browser-asan/index.html)
+  for latest release of a specific version.
 * There are many tools available to help you reproduce various memory issues
-reliably. If you aren't already familiar with them, check out
-[AddressSanitizer](https://www.chromium.org/developers/testing/addresssanitizer),
-[MemorySanitizer](https://www.chromium.org/developers/testing/memorysanitizer),
-[ThreadSanitizer](https://www.chromium.org/developers/testing/threadsanitizer-tsan-v2),
-and
-[UndefinedBehaviorSanitizer](https://www.chromium.org/developers/testing/undefinedbehaviorsanitizer).
+  reliably. If you aren't already familiar with them, check out
+  [AddressSanitizer](https://www.chromium.org/developers/testing/addresssanitizer),
+  [MemorySanitizer](https://www.chromium.org/developers/testing/memorysanitizer),
+  [ThreadSanitizer](https://www.chromium.org/developers/testing/threadsanitizer-tsan-v2),
+  and
+  [UndefinedBehaviorSanitizer](https://www.chromium.org/developers/testing/undefinedbehaviorsanitizer).
 * If you run into issues with a reproducible ClusterFuzz test case (like
-missing symbols, or if anything else seems off), try uploading the test case
-again using a different job type with a more mature tool (e.g. ASan on Linux).
-It may give more complete information.
+  missing symbols, or if anything else seems off), try uploading the test case
+  again using a different job type with a more mature tool (e.g. ASan on Linux).
+  It may give more complete information.
 
 #### Step 2. Assess the severity.
 
@@ -194,10 +206,11 @@
 child bug can have its own priority. Examples of this in action are [issue
 352369](https://crbug.com/352369) and [issue 453937](https://crbug.com/453937).
 
-Even after initial triage, re-assess the severity while you're looking at a security
-bug update: does it have new information in the bug that could change the assessment?
-Be especially on the lookout for Highs that are really Criticals, and Lows that are
-really Mediums (make sure to account for process types and sandbox boundaries).
+Even after initial triage, re-assess the severity while you're looking at a
+security bug update: does it have new information in the bug that could change
+the assessment? Be especially on the lookout for Highs that are really
+Criticals, and Lows that are really Mediums (make sure to account for process
+types and sandbox boundaries).
 
 #### Step 3. [Label, label, label](security-labels.md).
 
@@ -211,29 +224,30 @@
 * **Restrict-View-SecurityTeam**
 * **Type-Bug-Security**
 * **If the reporter wants to remain anonymous or if the bug description or
-comments contain PII**, add **Restrict-View-SecurityEmbargo**.
+  comments contain PII**, add **Restrict-View-SecurityEmbargo**.
 
 Generally, see [the Security Labels document](security-labels.md).
 
 **Ensure the comment adequately explains any status changes.** Severity,
-milestone, and priority assignment generally require explanatory text.
+  milestone, and priority assignment generally require explanatory text.
 
 * Report suspected malicious URLs to SafeBrowsing:
   * Public URL:
-  [https://support.google.com/websearch/contact/safe_browsing](https://support.google.com/websearch/contact/safe_browsing)
+  [https://support.google.com/websearch/contact/safe_browsing](https://support.google.com/websearch/contact/safe_browsing).
   * Googlers: see instructions at [go/safebrowsing-escalation](https://goto.google.com/safebrowsing-escalation)
   * Report suspected malicious file attachments to SafeBrowsing and VirusTotal.
 * Make sure the report is properly forwarded when the vulnerability is in an
-upstream project, the OS, or some other dependency.
+  upstream project, the OS, or some other dependency.
 * For vulnerabilities in services Chrome uses (e.g. Omaha, Chrome Web Store,
-SafeBrowsing), make sure the affected team is informed and has access to the
-necessary bugs.
+  SafeBrowsing), make sure the affected team is informed and has access to the
+  necessary bugs.
 
 ##### Labeling For Chrome On iOS
 
-* Reproduce using iOS device, desktop Safari, or [Browserstack](http://browserstack.com/)
-* Assign severity, impact, milestone, and component labels
-* Label **ExternalDependency**
+* Reproduce using iOS device, desktop Safari, or
+  [Browserstack](http://browserstack.com/).
+* Assign severity, impact, milestone, and component labels.
+* Label **ExternalDependency**.
 * Label **Hotlist-WebKit**. This label is monitored by Apple friends.
 * File a security bug at [bugs.webkit.org](https://bugs.webkit.org), and CC
   chrome-ios-security-bugs@google.com. This alias is monitored by iOS Chrome
@@ -268,43 +282,43 @@
 cases will simply be too difficult without a deep understanding of certain
 portions of the codebase.
 
-* If you can narrow the bug to a specific file or block of code, or if
-something stands out as suspicious, try to assign an owner based on `git
-hyper-blame` or add some CCs based on OWNERS files
-* If not, consider searching in the issue tracker for people that fixed
-similar bugs or bugs in similar areas of the code base, such as issues with the
-same components, recently. For example, let's say you were trying to figure out
-a good person to assign a Content>Fonts issue. Look for "status=fixed,
-verified" and query by when the issues were closed after (i.e. w/ in the last
-30 days == closed>today-30).
+* If you can narrow the bug to a specific file or block of code, or if something
+  stands out as suspicious, try to assign an owner based on `git hyper-blame` or
+  add some CCs based on OWNERS files.
+* If not, consider searching in the issue tracker for people that fixed similar
+  bugs or bugs in similar areas of the code base, such as issues with the same
+  components, recently. For example, let's say you were trying to figure out a
+  good person to assign a Content>Fonts issue. Look for `status=fixed,verified`
+  and query by when the issues were closed after (i.e. w/ in the last 30 days ==
+  `closed>today-30`).
 
 A few components have their own triage processes or points of contact who can
 help.
 
 * V8 bugs? Look for V8 rolls within the regression range, then look within the
-CLs of those rolls to find possible culprits. If you are unable to find the
-culprit CL, assign to the [V8 ClusterFuzz
-Sheriff](https://rotation.googleplex.com/status?id=5714662985302016) for
-triage. Note that V8 CHECK failure crashes can have security implications, so
-don't triage it yourself and instead assign it to V8 ClusterFuzz Sheriff. He or
-she can make an informed decision on whether it is a security vulnerability or
-not and whether it is safe to strip the security tags (**Type=Bug-Security**,
-**Restrict-View-SecurityTeam**).
+  CLs of those rolls to find possible culprits. If you are unable to find the
+  culprit CL, assign to the [V8 ClusterFuzz
+  Sheriff](https://rotation.googleplex.com/status?id=5714662985302016) for
+  triage. Note that V8 CHECK failure crashes can have security implications, so
+  don't triage it yourself and instead assign it to V8 ClusterFuzz Sheriff. They
+  can make an informed decision on whether it is a security vulnerability or not
+  and whether it is safe to strip the security tags (**Type=Bug-Security**,
+  **Restrict-View-SecurityTeam**).
 * Skia bugs? If you made it this far and still aren't sure, assign them to
-hcm@chromium.org. Be careful while triaging these! The place where we're
-crashing isn't necessarily the place where the bug was introduced, so blame may
-be misleading.
+  hcm@chromium.org. Be careful while triaging these! The place where we're
+  crashing isn't necessarily the place where the bug was introduced, so blame
+  may be misleading.
 * URL spoofing issues, especially related to RTL or IDNs? See
-[go/url-spoofs](go/url-spoofs) for a guide to triaging these.
+  [go/url-spoofs](go/url-spoofs) for a guide to triaging these.
 
 Still stuck? Ask #chrome-security or someone from
-[go/chrome-security-secondary-sheriffs](https://goto.google.com/chrome-security-secondary-sheriffs)
+[go/chrome-security-sheriff-mentors](https://goto.google.com/chrome-security-sheriff-mentors)
 for help! That's why we're here. Don't be afraid to do this!
 
-Make sure that the person you assign to handle a bug is not OOO. And,
-generally, explicitly CC more than 1 person on the bug, if possible, and
-preferably people from more than 1 geographic region. (See the OWNERS file(s)
-that affect(s) the relevant area of code.)
+Make sure that the person you assign to handle a bug is not OOO. And, generally,
+explicitly CC more than one person on the bug, if possible, and preferably
+people from more than one geographic region. (See the OWNERS file(s) that
+affect(s) the relevant area of code.)
 
 **Sometimes, finding an owner isn't enough to ensure that a bug will get
 fixed.** Check the stale bug list on the security dashboard and try resolve
@@ -327,17 +341,17 @@
 ### Wrap Up The Fixed Issue
 
 1. For any **Security_Severity-**{**Critical**, **High**, **Medium**} bugs that
-**Security_Impact-**{**Beta**, **Stable**}, add **Merge-Requested** so that the
-fix gets merged into the next release. Exercise discretion according to
-security severity and risk associated with the bug fix; you can ask the patch
-author whether any risky code paths are affected. The actual merging and
-drafting of release notes is taken care of by the [security release management
-role](https://www.chromium.org/Home/chromium-security/security-release-management).
+  **Security_Impact-**{**Beta**, **Stable**}, add **Merge-Requested** so that
+  the fix gets merged into the next release. Exercise discretion according to
+  security severity and risk associated with the bug fix; you can ask the patch
+  author whether any risky code paths are affected. The actual merging and
+  drafting of release notes is taken care of by the [security release management
+  role](https://www.chromium.org/Home/chromium-security/security-release-management).
 1. Chrome's [Vulnerability Rewards
-Program](https://www.google.com/about/appsecurity/chrome-rewards/index.html)
-TPM adds the **reward-topanel** label by mass modification, but **do** label any
-bugs reported by a @chromium.org email that should be rewarded (e.g. "I'm
-filing this on behalf of" or the like).
+  Program](https://www.google.com/about/appsecurity/chrome-rewards/index.html)
+  TPM adds the **reward-topanel** label by mass modification, but **do** label
+  any bugs reported by a @chromium.org email that should be rewarded (e.g. "I'm
+  filing this on behalf of" or the like).
 
 ## End Of Rotation
 
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index dd20ca8..6fdf8f8 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -485,7 +485,6 @@
     "//components/storage_monitor:test_support",
     "//content/test:test_support",
     "//device/bluetooth:mocks",
-    "//device/usb/public/cpp:test_support",
     "//extensions:test_support",
     "//extensions/browser:test_support",
     "//extensions/common",
@@ -495,6 +494,7 @@
     "//net:test_support",
     "//services/device/public/cpp/hid",
     "//services/device/public/cpp/hid:test_support",
+    "//services/device/public/cpp/test:test_support",
     "//services/device/public/mojom",
     "//services/service_manager/public/cpp",
     "//ui/display:test_support",
diff --git a/extensions/browser/DEPS b/extensions/browser/DEPS
index 7af2e64..5d48ea7c 100644
--- a/extensions/browser/DEPS
+++ b/extensions/browser/DEPS
@@ -16,7 +16,6 @@
   "+components/zoom",
   "+content/public/browser",
   "+device/bluetooth",
-  "+device/usb/public",
   "+google_apis/gaia",
   "+gpu/config",
   "+grit/extensions_strings.h",
@@ -24,6 +23,7 @@
   # This directory contains build flags and does not pull all of PPAPI in.
   "+ppapi/buildflags",
   "+services/data_decoder/public",
+  "+services/device/public",
   "+services/identity/public/cpp",
   "+services/network/public/cpp",
   "+services/network/public/mojom",
diff --git a/extensions/browser/api/DEPS b/extensions/browser/api/DEPS
index e197b1f7..3ba38ad 100644
--- a/extensions/browser/api/DEPS
+++ b/extensions/browser/api/DEPS
@@ -1,6 +1,5 @@
 include_rules = [
   "+components/device_event_log",
-  "+device/usb/public",
   "+services/device/public",
   "+storage/browser/fileapi",
   "+storage/common/fileapi",
diff --git a/extensions/browser/api/device_permissions_manager.cc b/extensions/browser/api/device_permissions_manager.cc
index 346f789..92dece3 100644
--- a/extensions/browser/api/device_permissions_manager.cc
+++ b/extensions/browser/api/device_permissions_manager.cc
@@ -16,7 +16,6 @@
 #include "base/values.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "content/public/browser/browser_thread.h"
-#include "device/usb/public/cpp/usb_ids.h"
 #include "extensions/browser/api/hid/hid_device_manager.h"
 #include "extensions/browser/api/usb/usb_device_manager.h"
 #include "extensions/browser/extension_host.h"
@@ -24,6 +23,7 @@
 #include "extensions/browser/extensions_browser_client.h"
 #include "extensions/common/value_builder.h"
 #include "extensions/strings/grit/extensions_strings.h"
+#include "services/device/public/cpp/usb/usb_ids.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace extensions {
diff --git a/extensions/browser/api/device_permissions_manager.h b/extensions/browser/api/device_permissions_manager.h
index 4282acba..1d7806c 100644
--- a/extensions/browser/api/device_permissions_manager.h
+++ b/extensions/browser/api/device_permissions_manager.h
@@ -21,8 +21,8 @@
 #include "base/threading/thread_checker.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "services/device/public/mojom/hid.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace base {
 template <typename T>
diff --git a/extensions/browser/api/device_permissions_prompt.cc b/extensions/browser/api/device_permissions_prompt.cc
index 48406ad..c49c413 100644
--- a/extensions/browser/api/device_permissions_prompt.cc
+++ b/extensions/browser/api/device_permissions_prompt.cc
@@ -16,8 +16,6 @@
 #include "build/build_config.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/service_manager_connection.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
 #include "extensions/browser/api/device_permissions_manager.h"
 #include "extensions/browser/api/usb/usb_device_manager.h"
 #include "extensions/common/extension.h"
@@ -25,7 +23,9 @@
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "services/device/public/cpp/hid/hid_device_filter.h"
 #include "services/device/public/cpp/hid/hid_usage_and_page.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
 #include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/extensions/browser/api/device_permissions_prompt.h b/extensions/browser/api/device_permissions_prompt.h
index e1140ca..b3115bb 100644
--- a/extensions/browser/api/device_permissions_prompt.h
+++ b/extensions/browser/api/device_permissions_prompt.h
@@ -15,9 +15,9 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
 #include "services/device/public/mojom/hid.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 
 namespace content {
 class BrowserContext;
diff --git a/extensions/browser/api/printer_provider/BUILD.gn b/extensions/browser/api/printer_provider/BUILD.gn
index f591cd5f..d9d81bc3 100644
--- a/extensions/browser/api/printer_provider/BUILD.gn
+++ b/extensions/browser/api/printer_provider/BUILD.gn
@@ -18,9 +18,9 @@
   ]
 
   deps = [
-    "//device/usb/public/cpp",
-    "//device/usb/public/mojom",
     "//extensions/common/api",
+    "//services/device/public/cpp/usb",
+    "//services/device/public/mojom:usb",
   ]
 
   public_deps = [
diff --git a/extensions/browser/api/printer_provider/printer_provider_api.h b/extensions/browser/api/printer_provider/printer_provider_api.h
index 6901bb3e..042bbf581 100644
--- a/extensions/browser/api/printer_provider/printer_provider_api.h
+++ b/extensions/browser/api/printer_provider/printer_provider_api.h
@@ -10,7 +10,7 @@
 #include "base/callback_forward.h"
 #include "base/memory/ref_counted.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace base {
 class DictionaryValue;
diff --git a/extensions/browser/api/printer_provider/printer_provider_apitest.cc b/extensions/browser/api/printer_provider/printer_provider_apitest.cc
index c873f31..e7e5e6f 100644
--- a/extensions/browser/api/printer_provider/printer_provider_apitest.cc
+++ b/extensions/browser/api/printer_provider/printer_provider_apitest.cc
@@ -15,7 +15,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_restrictions.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
 #include "extensions/browser/api/printer_provider/printer_provider_api.h"
 #include "extensions/browser/api/printer_provider/printer_provider_api_factory.h"
 #include "extensions/browser/api/printer_provider/printer_provider_print_job.h"
@@ -26,6 +25,7 @@
 #include "extensions/shell/test/shell_apitest.h"
 #include "extensions/test/extension_test_message_listener.h"
 #include "extensions/test/result_catcher.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace extensions {
diff --git a/extensions/browser/api/usb/BUILD.gn b/extensions/browser/api/usb/BUILD.gn
index 1e123b6..513b30c 100644
--- a/extensions/browser/api/usb/BUILD.gn
+++ b/extensions/browser/api/usb/BUILD.gn
@@ -25,9 +25,9 @@
   deps = [
     "//content/public/browser",
     "//content/public/common",
-    "//device/usb/public/cpp",
-    "//device/usb/public/mojom",
     "//extensions/common/api",
+    "//services/device/public/cpp/usb",
+    "//services/device/public/mojom:usb",
   ]
 
   public_deps = [
diff --git a/extensions/browser/api/usb/usb_api.cc b/extensions/browser/api/usb/usb_api.cc
index 6f5c3ee..ca24c4d 100644
--- a/extensions/browser/api/usb/usb_api.cc
+++ b/extensions/browser/api/usb/usb_api.cc
@@ -16,10 +16,6 @@
 #include "base/bind.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/values.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
 #include "extensions/browser/api/device_permissions_manager.h"
 #include "extensions/browser/api/device_permissions_prompt.h"
 #include "extensions/browser/api/extensions_api_client.h"
@@ -29,6 +25,10 @@
 #include "extensions/common/api/usb.h"
 #include "extensions/common/permissions/permissions_data.h"
 #include "extensions/common/permissions/usb_device_permission.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 
 namespace usb = extensions::api::usb;
 namespace BulkTransfer = usb::BulkTransfer;
diff --git a/extensions/browser/api/usb/usb_api.h b/extensions/browser/api/usb/usb_api.h
index 43bdb31..b685b8aa 100644
--- a/extensions/browser/api/usb/usb_api.h
+++ b/extensions/browser/api/usb/usb_api.h
@@ -14,11 +14,11 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "extensions/browser/api/api_resource_manager.h"
 #include "extensions/browser/api/usb/usb_device_manager.h"
 #include "extensions/browser/extension_function.h"
 #include "extensions/common/api/usb.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace extensions {
 
diff --git a/extensions/browser/api/usb/usb_apitest.cc b/extensions/browser/api/usb/usb_apitest.cc
index 301a42a..2a92e6c 100644
--- a/extensions/browser/api/usb/usb_apitest.cc
+++ b/extensions/browser/api/usb/usb_apitest.cc
@@ -9,15 +9,15 @@
 #include "base/memory/ref_counted_memory.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_utils.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/cpp/fake_usb_device_manager.h"
-#include "device/usb/public/cpp/mock_usb_mojo_device.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "extensions/browser/api/device_permissions_prompt.h"
 #include "extensions/browser/api/usb/usb_api.h"
 #include "extensions/shell/browser/shell_extensions_api_client.h"
 #include "extensions/shell/test/shell_apitest.h"
 #include "extensions/test/extension_test_message_listener.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
+#include "services/device/public/cpp/test/mock_usb_mojo_device.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 using device::mojom::UsbControlTransferParams;
 using device::mojom::UsbControlTransferRecipient;
diff --git a/extensions/browser/api/usb/usb_device_manager.cc b/extensions/browser/api/usb/usb_device_manager.cc
index 2b65d59..8a9112b 100644
--- a/extensions/browser/api/usb/usb_device_manager.cc
+++ b/extensions/browser/api/usb/usb_device_manager.cc
@@ -12,13 +12,13 @@
 #include "base/strings/utf_string_conversions.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/service_manager_connection.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
 #include "extensions/browser/api/device_permissions_manager.h"
 #include "extensions/browser/event_router_factory.h"
 #include "extensions/common/api/usb.h"
 #include "extensions/common/permissions/permissions_data.h"
 #include "extensions/common/permissions/usb_device_permission.h"
 #include "services/device/public/mojom/constants.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 namespace usb = extensions::api::usb;
diff --git a/extensions/browser/api/usb/usb_device_manager.h b/extensions/browser/api/usb/usb_device_manager.h
index 231dc717..7bce6c62 100644
--- a/extensions/browser/api/usb/usb_device_manager.h
+++ b/extensions/browser/api/usb/usb_device_manager.h
@@ -11,12 +11,12 @@
 
 #include "base/macros.h"
 #include "content/public/browser/browser_thread.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
 #include "extensions/browser/browser_context_keyed_api_factory.h"
 #include "extensions/browser/event_router.h"
 #include "extensions/common/api/usb.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
 
 namespace extensions {
 
diff --git a/extensions/browser/api/usb/usb_device_resource.h b/extensions/browser/api/usb/usb_device_resource.h
index 5dd5dd1..2408fc6 100644
--- a/extensions/browser/api/usb/usb_device_resource.h
+++ b/extensions/browser/api/usb/usb_device_resource.h
@@ -11,9 +11,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
 #include "content/public/browser/browser_thread.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "extensions/browser/api/api_resource.h"
 #include "extensions/browser/api/api_resource_manager.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace extensions {
 
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 9f79021..ee96fba 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1398,6 +1398,7 @@
   AUTOTESTPRIVATE_GETSHELFALIGNMENT = 1335,
   AUTOTESTPRIVATE_SETSHELFALIGNMENT = 1336,
   BLUETOOTH_RECORDPAIRING = 1337,
+  FILEMANAGERPRIVATE_SETARCSTORAGETOASTSHOWNFLAG = 1338,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn
index c121cc8..5ebc8465 100644
--- a/extensions/common/BUILD.gn
+++ b/extensions/common/BUILD.gn
@@ -326,12 +326,12 @@
       "//components/version_info",
       "//crypto",
       "//device/bluetooth",
-      "//device/usb/public/cpp",
-      "//device/usb/public/mojom",
       "//extensions:extensions_resources",
       "//extensions/common/api",
       "//extensions/strings",
       "//net",
+      "//services/device/public/cpp/usb",
+      "//services/device/public/mojom:usb",
       "//services/network/public/mojom",
       "//third_party/boringssl",
       "//third_party/icu",
@@ -453,7 +453,6 @@
       "//components/crx_file",
       "//components/version_info:version_info",
       "//content/test:test_support",
-      "//device/usb/public/cpp:test_support",
       "//extensions:extensions_resources",
 
       # TODO(brettw) these tests should not be including headers from browser.
@@ -461,6 +460,7 @@
       "//extensions/browser",
       "//extensions/strings",
       "//ipc",
+      "//services/device/public/cpp/test:test_support",
       "//testing/gmock",
       "//testing/gtest",
       "//ui/base",
diff --git a/extensions/common/DEPS b/extensions/common/DEPS
index b81685e..2179e703 100644
--- a/extensions/common/DEPS
+++ b/extensions/common/DEPS
@@ -3,10 +3,10 @@
   "+components/url_formatter",
   "+components/nacl/common/buildflags.h",
   "+device/bluetooth",  # For BluetoothPermission
-  "+device/usb/public",
   "+grit/extensions_strings.h",
   "+libxml",
   "+net",
+  "+services/device/public",
   "+services/network/public/mojom/cors_origin_pattern.mojom-forward.h",
   "+services/network/public/mojom/cors_origin_pattern.mojom.h",
   "+third_party/libxml",
diff --git a/extensions/common/api/printer_provider/usb_printer_manifest_data.cc b/extensions/common/api/printer_provider/usb_printer_manifest_data.cc
index d14187b..bca900e 100644
--- a/extensions/common/api/printer_provider/usb_printer_manifest_data.cc
+++ b/extensions/common/api/printer_provider/usb_printer_manifest_data.cc
@@ -7,10 +7,10 @@
 #include <utility>
 
 #include "base/strings/utf_string_conversions.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
 #include "extensions/common/api/extensions_manifest_types.h"
 #include "extensions/common/manifest_constants.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 
 namespace extensions {
 
diff --git a/extensions/common/api/printer_provider/usb_printer_manifest_data.h b/extensions/common/api/printer_provider/usb_printer_manifest_data.h
index 2fab639..d918dba 100644
--- a/extensions/common/api/printer_provider/usb_printer_manifest_data.h
+++ b/extensions/common/api/printer_provider/usb_printer_manifest_data.h
@@ -8,9 +8,9 @@
 #include <memory>
 #include <vector>
 
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
 #include "extensions/common/extension.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 
 namespace extensions {
 
diff --git a/extensions/common/api/printer_provider/usb_printer_manifest_unittest.cc b/extensions/common/api/printer_provider/usb_printer_manifest_unittest.cc
index 45cf5aa..c07357c 100644
--- a/extensions/common/api/printer_provider/usb_printer_manifest_unittest.cc
+++ b/extensions/common/api/printer_provider/usb_printer_manifest_unittest.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
 #include "extensions/common/api/printer_provider/usb_printer_manifest_data.h"
 #include "extensions/common/manifest_test.h"
 #include "extensions/common/value_builder.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 
 namespace extensions {
 
diff --git a/extensions/common/api/virtual_keyboard_private.json b/extensions/common/api/virtual_keyboard_private.json
index ecd053d5..438540b 100644
--- a/extensions/common/api/virtual_keyboard_private.json
+++ b/extensions/common/api/virtual_keyboard_private.json
@@ -31,7 +31,7 @@
       {
         "id": "KeyboardMode",
         "type": "string",
-        "enum": [ "FULL_WIDTH", "FLOATING", "FULLSCREEN" ],
+        "enum": [ "FULL_WIDTH", "FLOATING" ],
         "description": "The value of the virtual keyboard mode to set to."
       },
       {
diff --git a/extensions/common/permissions/usb_device_permission.cc b/extensions/common/permissions/usb_device_permission.cc
index 9a5f556..f746aaf4 100644
--- a/extensions/common/permissions/usb_device_permission.cc
+++ b/extensions/common/permissions/usb_device_permission.cc
@@ -13,13 +13,13 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "device/usb/public/cpp/usb_ids.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/features/behavior_feature.h"
 #include "extensions/common/features/feature.h"
 #include "extensions/common/features/feature_provider.h"
 #include "extensions/common/permissions/permissions_info.h"
 #include "extensions/strings/grit/extensions_strings.h"
+#include "services/device/public/cpp/usb/usb_ids.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace extensions {
diff --git a/extensions/common/permissions/usb_device_permission.h b/extensions/common/permissions/usb_device_permission.h
index f1251af..47b685ce5 100644
--- a/extensions/common/permissions/usb_device_permission.h
+++ b/extensions/common/permissions/usb_device_permission.h
@@ -12,10 +12,10 @@
 #include <string>
 #include <vector>
 
-#include "device/usb/public/mojom/device.mojom.h"
 #include "extensions/common/permissions/api_permission.h"
 #include "extensions/common/permissions/set_disjunction_permission.h"
 #include "extensions/common/permissions/usb_device_permission_data.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace extensions {
 
diff --git a/extensions/common/permissions/usb_device_permission_unittest.cc b/extensions/common/permissions/usb_device_permission_unittest.cc
index dd8e347..ff033921 100644
--- a/extensions/common/permissions/usb_device_permission_unittest.cc
+++ b/extensions/common/permissions/usb_device_permission_unittest.cc
@@ -6,14 +6,14 @@
 #include <utility>
 
 #include "base/memory/ref_counted.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/features/feature_channel.h"
 #include "extensions/common/features/feature_session_type.h"
 #include "extensions/common/permissions/usb_device_permission.h"
 #include "extensions/common/permissions/usb_device_permission_data.h"
 #include "extensions/common/value_builder.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace extensions {
diff --git a/fuchsia/BUILD.gn b/fuchsia/BUILD.gn
index d56a8c74..1aa6d36 100644
--- a/fuchsia/BUILD.gn
+++ b/fuchsia/BUILD.gn
@@ -145,5 +145,6 @@
     "runners:cast_runner_browsertests",
     "runners:cast_runner_integration_tests",
     "runners:web_runner",
+    "//chromecast/bindings:bindings_manager_fuchsia",
   ]
 }
diff --git a/fuchsia/engine/browser/context_impl_browsertest.cc b/fuchsia/engine/browser/context_impl_browsertest.cc
index 41d63a8..598cd17 100644
--- a/fuchsia/engine/browser/context_impl_browsertest.cc
+++ b/fuchsia/engine/browser/context_impl_browsertest.cc
@@ -21,6 +21,9 @@
 #include "net/cookies/cookie_store.h"
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/features.h"
+#include "services/network/public/mojom/cookie_manager.mojom.h"
+#include "services/network/public/mojom/network_context.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/url_constants.h"
@@ -31,12 +34,18 @@
 
 namespace {
 
+void OnNetworkServiceCookiesReceived(net::CookieList* output,
+                                     base::OnceClosure on_received_cb,
+                                     const net::CookieList& cookies) {
+  *output = cookies;
+  std::move(on_received_cb).Run();
+}
+
 void OnCookiesReceived(net::CookieList* output,
                        base::OnceClosure on_received_cb,
                        const net::CookieList& cookies,
-                       const net::CookieStatusList& excluded_cookies) {
-  *output = cookies;
-  std::move(on_received_cb).Run();
+                       const net::CookieStatusList& cookie_status) {
+  OnNetworkServiceCookiesReceived(output, std::move(on_received_cb), cookies);
 }
 
 // Defines a suite of tests that exercise browser-level configuration and
@@ -54,22 +63,33 @@
 
   // Synchronously gets a list of cookies for this BrowserContext.
   net::CookieList GetCookies() {
-    net::CookieStore* cookie_store =
-        content::BrowserContext::GetDefaultStoragePartition(
-            context_impl()->browser_context_for_test())
-            ->GetURLRequestContext()
-            ->GetURLRequestContext()
-            ->cookie_store();
-
     base::RunLoop run_loop;
     net::CookieList cookies;
-    base::PostTaskWithTraits(
-        FROM_HERE, {content::BrowserThread::IO},
-        base::BindOnce(
-            &net::CookieStore::GetAllCookiesAsync,
-            base::Unretained(cookie_store),
-            base::BindOnce(&OnCookiesReceived, base::Unretained(&cookies),
-                           run_loop.QuitClosure())));
+    network::mojom::CookieManagerPtr cookie_manager;
+    if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+      content::BrowserContext::GetDefaultStoragePartition(
+          context_impl()->browser_context_for_test())
+          ->GetNetworkContext()
+          ->GetCookieManager(mojo::MakeRequest(&cookie_manager));
+      cookie_manager->GetAllCookies(
+          base::BindOnce(&OnNetworkServiceCookiesReceived,
+                         base::Unretained(&cookies), run_loop.QuitClosure()));
+    } else {
+      net::CookieStore* cookie_store =
+          content::BrowserContext::GetDefaultStoragePartition(
+              context_impl()->browser_context_for_test())
+              ->GetURLRequestContext()
+              ->GetURLRequestContext()
+              ->cookie_store();
+      base::PostTaskWithTraits(
+          FROM_HERE, {content::BrowserThread::IO},
+          base::BindOnce(
+              &net::CookieStore::GetAllCookiesAsync,
+              base::Unretained(cookie_store),
+              base::BindOnce(&OnCookiesReceived, base::Unretained(&cookies),
+                             run_loop.QuitClosure())));
+    }
+
     run_loop.Run();
     return cookies;
   }
diff --git a/fuchsia/fidl/cast/api_bindings.fidl b/fuchsia/fidl/cast/api_bindings.fidl
index 05d36ee..a44d0dc 100644
--- a/fuchsia/fidl/cast/api_bindings.fidl
+++ b/fuchsia/fidl/cast/api_bindings.fidl
@@ -16,7 +16,7 @@
 
     /// Should be invoked when a connecting a named MessagePort to a native
     /// bindings backend.
-    Connect(string api_name, fuchsia.web.MessagePort message_port);
+    Connect(string port_name, fuchsia.web.MessagePort message_port);
 };
 
 table ApiBinding {
diff --git a/fuchsia/runners/BUILD.gn b/fuchsia/runners/BUILD.gn
index 6d2a024..e7971b0 100644
--- a/fuchsia/runners/BUILD.gn
+++ b/fuchsia/runners/BUILD.gn
@@ -50,11 +50,13 @@
   ]
   data = [
     "cast/cast_channel_bindings.js",
-    "cast/named_message_port_connector.js",
     "cast/not_implemented_api_bindings.js",
     "cast/queryable_data_bindings.js",
     "cast/touch_input_bindings.js",
   ]
+  data_deps = [
+    "//chromecast/bindings:named_message_port_connector_resources",
+  ]
   deps = [
     "//base",
     "//fuchsia/base",
diff --git a/fuchsia/runners/cast/named_message_port_connector.cc b/fuchsia/runners/cast/named_message_port_connector.cc
index e8d338d..d1f04b4 100644
--- a/fuchsia/runners/cast/named_message_port_connector.cc
+++ b/fuchsia/runners/cast/named_message_port_connector.cc
@@ -21,7 +21,7 @@
 namespace {
 
 const char kBindingsJsPath[] =
-    FILE_PATH_LITERAL("fuchsia/runners/cast/named_message_port_connector.js");
+    FILE_PATH_LITERAL("chromecast/bindings/named_message_port_connector.js");
 const char kControlPortConnectMessage[] = "cast.master.connect";
 
 }  // namespace
diff --git a/google_apis/drive/auth_service.cc b/google_apis/drive/auth_service.cc
index 41a7606..a91a47f 100644
--- a/google_apis/drive/auth_service.cc
+++ b/google_apis/drive/auth_service.cc
@@ -40,7 +40,7 @@
 class AuthRequest {
  public:
   AuthRequest(identity::IdentityManager* identity_manager,
-              const std::string& account_id,
+              const CoreAccountId& account_id,
               scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
               const AuthStatusCallback& callback,
               const std::vector<std::string>& scopes);
@@ -59,7 +59,7 @@
 
 AuthRequest::AuthRequest(
     identity::IdentityManager* identity_manager,
-    const std::string& account_id,
+    const CoreAccountId& account_id,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const AuthStatusCallback& callback,
     const std::vector<std::string>& scopes)
@@ -112,7 +112,7 @@
 
 AuthService::AuthService(
     identity::IdentityManager* identity_manager,
-    const std::string& account_id,
+    const CoreAccountId& account_id,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const std::vector<std::string>& scopes)
     : identity_manager_(identity_manager),
@@ -207,7 +207,7 @@
 }
 
 void AuthService::OnRefreshTokenRemovedForAccount(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   if (account_id == account_id_)
     OnHandleRefreshToken(false);
 }
diff --git a/google_apis/drive/auth_service.h b/google_apis/drive/auth_service.h
index 8cc6780a..4cd0a50 100644
--- a/google_apis/drive/auth_service.h
+++ b/google_apis/drive/auth_service.h
@@ -36,7 +36,7 @@
   //
   // |scopes| specifies OAuth2 scopes.
   AuthService(identity::IdentityManager* identity_manager,
-              const std::string& account_id,
+              const CoreAccountId& account_id,
               scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
               const std::vector<std::string>& scopes);
   ~AuthService() override;
@@ -54,7 +54,8 @@
   // Overridden from IdentityManager::Observer
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override;
 
  private:
   // Called when the state of the refresh token changes.
@@ -67,7 +68,7 @@
                        const std::string& access_token);
 
   identity::IdentityManager* identity_manager_;
-  std::string account_id_;
+  CoreAccountId account_id_;
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
   bool has_refresh_token_;
   std::string access_token_;
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_completion_query.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_completion_query.txt
index f2c24a3..3283304 100644
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_completion_query.txt
+++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_completion_query.txt
@@ -28,8 +28,13 @@
         glEndQueryEXT(PROGRAM_COMPLETION_QUERY_CHROMIUM);
         GLuint available = 0u;
         glGetQueryObjectuivEXT(query, GL_QUERY_RESULT_AVAILABLE, &available);
+        if (available)
+        {
+          GLuint result = 0u;
+          glGetQueryObjectuivEXT(query, GL_QUERY_RESULT, &result);
+        }
     If 'available' returns true, that's equivalent to COMPLETION_STATUS_KHR
-    returning true.
+    returning true. Then LINK_STATUS can be obtained from 'result'.
 
 New Procedures and Functions
 
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
index cf2fcb3..59eaf5f 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -2156,8 +2156,13 @@
           } else {
             program_completion_query_deferred = true;
           }
+          result = 0;
+        } else {
+          GLint link_status = 0;
+          api()->glGetProgramivFn(query.program_service_id, GL_LINK_STATUS,
+                                  &link_status);
+          result = link_status;
         }
-        result = 0;
         break;
 
       default:
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json
index 6548216..f7436560 100644
--- a/gpu/config/gpu_driver_bug_list.json
+++ b/gpu/config/gpu_driver_bug_list.json
@@ -3231,13 +3231,13 @@
       "description": "Mesa hangs the system when allocating large textures",
       "cr_bugs": [927470],
       "os": {
-        "type" : "linux"
+        "type" : "linux",
+        "version": {
+          "op": "<",
+          "value": "5.0"
+        }
       },
-      "driver_vendor": "Mesa",
-      "driver_version": {
-        "op": ">=",
-        "value": "18"
-      },
+      "vendor_id": "0x8086",
       "features": [
         "max_texture_size_limit_4096",
         "max_3d_array_texture_size_1024"
diff --git a/gpu/ipc/service/direct_composition_surface_win.cc b/gpu/ipc/service/direct_composition_surface_win.cc
index b7f7546e..e196793 100644
--- a/gpu/ipc/service/direct_composition_surface_win.cc
+++ b/gpu/ipc/service/direct_composition_surface_win.cc
@@ -27,36 +27,28 @@
 #endif /* EGL_ANGLE_flexible_surface_compatibility */
 
 namespace gpu {
-using OverlayFormat = DirectCompositionSurfaceWin::OverlayFormat;
-
 namespace {
 struct OverlaySupportInfo {
-  OverlayFormat overlay_format;
-  DXGI_FORMAT dxgi_format;
+  DXGI_FORMAT format;
   UINT flags;
 };
 
 // Indicates support for either NV12 or YUY2 hardware overlays.
 bool g_supports_overlays = false;
 
-// Indicates support for hardware overlay scaling.
-bool g_supports_scaled_overlays = true;
-
 // Used for workaround limiting overlay size to monitor size.
 gfx::Size g_overlay_monitor_size;
 
 // Preferred overlay format set when detecting hardware overlay support during
 // initialization.  Set to NV12 by default so that it's used when enabling
 // overlays using command line flags.
-OverlayFormat g_overlay_format_used = OverlayFormat::kNV12;
-DXGI_FORMAT g_overlay_dxgi_format_used = DXGI_FORMAT_NV12;
+DXGI_FORMAT g_overlay_format_used = DXGI_FORMAT_NV12;
 
 // This is the raw support info, which shouldn't depend on field trial state, or
 // command line flags. Ordered by most preferred to least preferred format.
 OverlaySupportInfo g_overlay_support_info[] = {
-    {OverlayFormat::kNV12, DXGI_FORMAT_NV12, 0},
-    {OverlayFormat::kYUY2, DXGI_FORMAT_YUY2, 0},
-    {OverlayFormat::kBGRA, DXGI_FORMAT_B8G8R8A8_UNORM, 0},
+    {DXGI_FORMAT_NV12, 0},
+    {DXGI_FORMAT_YUY2, 0},
 };
 
 void InitializeHardwareOverlaySupport() {
@@ -112,23 +104,25 @@
       continue;
     DCHECK(output3);
 
+    // TODO(zmo): Get rid of the loop and just set two global vars for NV12
+    // and YUY2.
     for (auto& info : g_overlay_support_info) {
-      if (FAILED(output3->CheckOverlaySupport(
-              info.dxgi_format, d3d11_device.Get(), &info.flags))) {
+      if (FAILED(output3->CheckOverlaySupport(info.format, d3d11_device.Get(),
+                                              &info.flags))) {
         continue;
       }
       // Per Intel's request, use NV12 only when
       // COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 is also supported. Rec 709 is
       // commonly used for H.264 and HEVC. At least one Intel Gen9 SKU will not
       // support NV12 overlays.
-      if (info.overlay_format == OverlayFormat::kNV12) {
+      if (info.format == DXGI_FORMAT_NV12) {
         UINT color_space_support_flags = 0;
         Microsoft::WRL::ComPtr<IDXGIOutput4> output4;
         if (FAILED(output.As(&output4)))
           continue;
 
         if (FAILED(output4->CheckOverlayColorSpaceSupport(
-                info.dxgi_format, DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709,
+                info.format, DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709,
                 d3d11_device.Get(), &color_space_support_flags))) {
           continue;
         }
@@ -142,14 +136,11 @@
       // support for all formats in UMA.
       if (g_supports_overlays)
         continue;
-      // Don't use BGRA overlays in any case, but record support in UMA.
-      if (info.overlay_format == OverlayFormat::kBGRA)
-        continue;
       // Overlays are supported for NV12 only if the feature flag to prefer NV12
       // over YUY2 is enabled.
       bool prefer_nv12 = base::FeatureList::IsEnabled(
           features::kDirectCompositionPreferNV12Overlays);
-      if (info.overlay_format == OverlayFormat::kNV12 &&
+      if (info.format == DXGI_FORMAT_NV12 &&
           (!prefer_nv12 || !supports_nv12_rec709))
         continue;
       // Some new Intel drivers only claim to support unscaled overlays, but
@@ -159,12 +150,9 @@
       // overlay path should be relatively efficient.
       if (info.flags & (DXGI_OVERLAY_SUPPORT_FLAG_DIRECT |
                         DXGI_OVERLAY_SUPPORT_FLAG_SCALING)) {
-        g_overlay_format_used = info.overlay_format;
-        g_overlay_dxgi_format_used = info.dxgi_format;
+        g_overlay_format_used = info.format;
 
         g_supports_overlays = true;
-        g_supports_scaled_overlays =
-            !!(info.flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING);
 
         DXGI_OUTPUT_DESC monitor_desc = {};
         if (SUCCEEDED(output3->GetDesc(&monitor_desc))) {
@@ -183,8 +171,8 @@
       break;
   }
   if (g_supports_overlays) {
-    UMA_HISTOGRAM_ENUMERATION("GPU.DirectComposition.OverlayFormatUsed2",
-                              g_overlay_format_used);
+    base::UmaHistogramSparse("GPU.DirectComposition.OverlayFormatUsed3",
+                             g_overlay_format_used);
   }
   UMA_HISTOGRAM_BOOLEAN("GPU.DirectComposition.OverlaysSupported",
                         g_supports_overlays);
@@ -285,19 +273,24 @@
 
 // static
 bool DirectCompositionSurfaceWin::AreScaledOverlaysSupported() {
-  return g_supports_scaled_overlays;
+  for (const auto& info : g_overlay_support_info) {
+    if (info.format == g_overlay_format_used)
+      return !!(info.flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING);
+  }
+  NOTREACHED();
+  return false;
 }
 
 // static
 bool DirectCompositionSurfaceWin::SupportsOverlayFormat(
-    OverlayFormat format,
+    DXGI_FORMAT format,
     bool* supports_scaling) {
   InitializeHardwareOverlaySupport();
   DCHECK(supports_scaling);
   *supports_scaling = false;
   for (const auto& info : g_overlay_support_info) {
     if (info.flags) {
-      if (format == info.overlay_format) {
+      if (format == info.format) {
         *supports_scaling = !!(info.flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING);
         return true;
       }
@@ -312,25 +305,24 @@
 }
 
 // static
-OverlayFormat DirectCompositionSurfaceWin::GetOverlayFormatUsed() {
+DXGI_FORMAT DirectCompositionSurfaceWin::GetOverlayFormatUsed() {
   return g_overlay_format_used;
 }
 
 // static
-DXGI_FORMAT DirectCompositionSurfaceWin::GetOverlayDxgiFormatUsed() {
-  return g_overlay_dxgi_format_used;
-}
-
-// static
 void DirectCompositionSurfaceWin::SetScaledOverlaysSupportedForTesting(
-    bool value) {
-  g_supports_scaled_overlays = value;
+    bool supported) {
+  for (auto& info : g_overlay_support_info) {
+    if (supported)
+      info.flags |= DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+    else
+      info.flags &= ~DXGI_OVERLAY_SUPPORT_FLAG_SCALING;
+  }
 }
 
 // static
 void DirectCompositionSurfaceWin::SetPreferNV12OverlaysForTesting() {
-  g_overlay_format_used = OverlayFormat::kNV12;
-  g_overlay_dxgi_format_used = DXGI_FORMAT_NV12;
+  g_overlay_format_used = DXGI_FORMAT_NV12;
 }
 
 // static
diff --git a/gpu/ipc/service/direct_composition_surface_win.h b/gpu/ipc/service/direct_composition_surface_win.h
index b8f9e49..cf0be64a 100644
--- a/gpu/ipc/service/direct_composition_surface_win.h
+++ b/gpu/ipc/service/direct_composition_surface_win.h
@@ -32,16 +32,6 @@
   using VSyncCallback =
       base::RepeatingCallback<void(base::TimeTicks, base::TimeDelta)>;
 
-  // Common overlay formats that we're interested in. Must match the
-  // OverlayFormat enum in //tools/metrics/histograms/enums.xml. Mapped to
-  // corresponding DXGI formats in DirectCompositionSurfaceWin.
-  enum class OverlayFormat {
-    kBGRA = 0,
-    kYUY2 = 1,
-    kNV12 = 2,
-    kMaxValue = kNV12
-  };
-
   struct Settings {
     bool disable_nv12_dynamic_textures = false;
     bool disable_larger_than_screen_overlays = false;
@@ -73,8 +63,7 @@
 
   // Returns preferred overlay format set when detecting hardware overlay
   // support.
-  static OverlayFormat GetOverlayFormatUsed();
-  static DXGI_FORMAT GetOverlayDxgiFormatUsed();
+  static DXGI_FORMAT GetOverlayFormatUsed();
 
   // Returns monitor size.
   static gfx::Size GetOverlayMonitorSize();
@@ -82,8 +71,7 @@
   // Returns if the given format is supported for hardware overlays.
   // Also, if |supports_scaling| is set to true, SCALING mode is supported for
   // the given format; otherwise, only DIRECT mode is supported.
-  static bool SupportsOverlayFormat(OverlayFormat format,
-                                    bool* supports_scaling);
+  static bool SupportsOverlayFormat(DXGI_FORMAT format, bool* supports_scaling);
 
   // Returns true if there is an HDR capable display connected.
   static bool IsHDRSupported();
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index 381bf61e..82b62aa3 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -84,14 +84,13 @@
     gpu_info->supports_overlays =
         DirectCompositionSurfaceWin::AreOverlaysSupported();
     bool supports_scaling = false;
-    using OverlayFormat = DirectCompositionSurfaceWin::OverlayFormat;
-    if (DirectCompositionSurfaceWin::SupportsOverlayFormat(OverlayFormat::kYUY2,
+    if (DirectCompositionSurfaceWin::SupportsOverlayFormat(DXGI_FORMAT_YUY2,
                                                            &supports_scaling)) {
       gpu_info->yuy2_overlay_support = supports_scaling
                                            ? gpu::OverlaySupport::kScaling
                                            : gpu::OverlaySupport::kDirect;
     }
-    if (DirectCompositionSurfaceWin::SupportsOverlayFormat(OverlayFormat::kNV12,
+    if (DirectCompositionSurfaceWin::SupportsOverlayFormat(DXGI_FORMAT_NV12,
                                                            &supports_scaling)) {
       gpu_info->nv12_overlay_support = supports_scaling
                                            ? gpu::OverlaySupport::kScaling
diff --git a/gpu/ipc/service/swap_chain_presenter.cc b/gpu/ipc/service/swap_chain_presenter.cc
index afb75b6..5f2cf20 100644
--- a/gpu/ipc/service/swap_chain_presenter.cc
+++ b/gpu/ipc/service/swap_chain_presenter.cc
@@ -20,8 +20,6 @@
 #include "ui/gl/gl_switches.h"
 
 namespace gpu {
-using OverlayFormat = DirectCompositionSurfaceWin::OverlayFormat;
-
 namespace {
 // Some drivers fail to correctly handle BT.709 video in overlays. This flag
 // converts them to BT.601 in the video processor.
@@ -148,14 +146,19 @@
   return true;
 }
 
-const char* OverlayFormatToString(OverlayFormat format) {
+const char* DxgiFormatToString(DXGI_FORMAT format) {
+  // Please also modify histogram enum and trace integration tests if new
+  // formats are added.
   switch (format) {
-    case OverlayFormat::kBGRA:
+    case DXGI_FORMAT_B8G8R8A8_UNORM:
       return "BGRA";
-    case OverlayFormat::kYUY2:
+    case DXGI_FORMAT_YUY2:
       return "YUY2";
-    case OverlayFormat::kNV12:
+    case DXGI_FORMAT_NV12:
       return "NV12";
+    default:
+      NOTREACHED();
+      return nullptr;
   }
 }
 }  // namespace
@@ -504,8 +507,8 @@
 
   auto not_used_reason = DecodeSwapChainNotUsedReason::kFailedToPresent;
 
-  bool nv12_supported = (OverlayFormat::kNV12 ==
-                         DirectCompositionSurfaceWin::GetOverlayFormatUsed());
+  bool nv12_supported =
+      (DXGI_FORMAT_NV12 == DirectCompositionSurfaceWin::GetOverlayFormatUsed());
   // TODO(sunnyps): Try using decode swap chain for uploaded video images.
   if (image_dxgi && nv12_supported && !failed_to_present_decode_swapchain_) {
     D3D11_TEXTURE2D_DESC texture_desc = {};
@@ -857,11 +860,11 @@
 }
 
 void SwapChainPresenter::RecordPresentationStatistics() {
-  OverlayFormat swap_chain_format =
+  DXGI_FORMAT swap_chain_format =
       is_yuv_swapchain_ ? DirectCompositionSurfaceWin::GetOverlayFormatUsed()
-                        : OverlayFormat::kBGRA;
-  UMA_HISTOGRAM_ENUMERATION("GPU.DirectComposition.SwapChainFormat2",
-                            swap_chain_format);
+                        : DXGI_FORMAT_B8G8R8A8_UNORM;
+  base::UmaHistogramSparse("GPU.DirectComposition.SwapChainFormat3",
+                           swap_chain_format);
 
   VideoPresentationMode presentation_mode;
   if (decode_swap_chain_) {
@@ -879,8 +882,8 @@
 
   TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("gpu.service"),
                        "SwapChain::Present", TRACE_EVENT_SCOPE_THREAD,
-                       "PixelFormat", swap_chain_format, "ZeroCopy",
-                       !!decode_swap_chain_);
+                       "PixelFormat", DxgiFormatToString(swap_chain_format),
+                       "ZeroCopy", !!decode_swap_chain_);
   HRESULT hr = 0;
   Microsoft::WRL::ComPtr<IDXGISwapChainMedia> swap_chain_media;
   if (decode_swap_chain_) {
@@ -1121,7 +1124,7 @@
   DXGI_SWAP_CHAIN_DESC1 desc = {};
   desc.Width = swap_chain_size_.width();
   desc.Height = swap_chain_size_.height();
-  desc.Format = DirectCompositionSurfaceWin::GetOverlayDxgiFormatUsed();
+  desc.Format = DirectCompositionSurfaceWin::GetOverlayFormatUsed();
   desc.Stereo = FALSE;
   desc.SampleDesc.Count = 1;
   desc.BufferCount = 2;
@@ -1144,11 +1147,10 @@
   const std::string protected_video_type_string =
       ProtectedVideoTypeToString(protected_video_type);
 
-  OverlayFormat overlay_format_used =
-      DirectCompositionSurfaceWin::GetOverlayFormatUsed();
+  DXGI_FORMAT format_used = DirectCompositionSurfaceWin::GetOverlayFormatUsed();
   if (use_yuv_swap_chain) {
     TRACE_EVENT1("gpu", "SwapChainPresenter::ReallocateSwapChain::YUV",
-                 "format", OverlayFormatToString(overlay_format_used));
+                 "format", DxgiFormatToString(format_used));
     HRESULT hr = media_factory->CreateSwapChainForCompositionSurfaceHandle(
         d3d11_device_.Get(), swap_chain_handle_.Get(), &desc, nullptr,
         &swap_chain_);
@@ -1156,15 +1158,14 @@
     failed_to_create_yuv_swapchain_ = !is_yuv_swapchain_;
 
     base::UmaHistogramSparse(kSwapChainCreationResultByFormatUmaPrefix +
-                                 OverlayFormatToString(overlay_format_used),
+                                 DxgiFormatToString(format_used),
                              hr);
     base::UmaHistogramSparse(kSwapChainCreationResultByVideoTypeUmaPrefix +
                                  protected_video_type_string,
                              hr);
 
     if (FAILED(hr)) {
-      DLOG(ERROR) << "Failed to create "
-                  << OverlayFormatToString(overlay_format_used)
+      DLOG(ERROR) << "Failed to create " << DxgiFormatToString(format_used)
                   << " swap chain of size " << swap_chain_size.ToString()
                   << " with error 0x" << std::hex << hr
                   << "\nFalling back to BGRA";
@@ -1184,7 +1185,7 @@
         &swap_chain_);
 
     base::UmaHistogramSparse(kSwapChainCreationResultByFormatUmaPrefix +
-                                 OverlayFormatToString(OverlayFormat::kBGRA),
+                                 DxgiFormatToString(DXGI_FORMAT_B8G8R8A8_UNORM),
                              hr);
     base::UmaHistogramSparse(kSwapChainCreationResultByVideoTypeUmaPrefix +
                                  protected_video_type_string,
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg
index c6edc3b..c239b96 100644
--- a/infra/config/cr-buildbucket.cfg
+++ b/infra/config/cr-buildbucket.cfg
@@ -343,6 +343,27 @@
 }
 
 builder_mixins {
+  name: "clang-linux-ci"
+  mixins: "clang-ci"
+  mixins: "linux"
+  dimensions: "cores:32"
+}
+
+builder_mixins {
+  name: "clang-mac-ci"
+  mixins: "clang-ci"
+  mixins: "mac"
+  dimensions: "cores:24"
+}
+
+builder_mixins {
+  name: "clang-win-ci"
+  mixins: "clang-ci"
+  mixins: "win"
+  dimensions: "cores:32"
+}
+
+builder_mixins {
   name: "clang-coverage"
   recipe {
     name: "chromium_clang_coverage_tot"
@@ -1815,174 +1836,143 @@
     # chromium.clang
     builders {
       name: "CFI Linux CF"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "CFI Linux ToT"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "CrWinAsan"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "CrWinAsan(dll)"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTAndroid"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTAndroid (dbg)"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTAndroid x64"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTAndroid64"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTAndroidASan"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
 
       # needed to target dedicated HW
       dimensions: "builderless:"
+      dimensions: "cores:"
       dimensions: "os:"
       auto_builder_dimension: YES
     }
     builders {
       name: "ToTAndroidCFI"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTAndroidOfficial"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTLinux"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTLinux (dbg)"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTLinuxASan"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTLinuxASanLibfuzzer"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTLinuxCoverage"
-      mixins: "clang-ci"
+      mixins: "clang-linux-ci"
       mixins: "clang-coverage"
-      mixins: "linux"
     }
     builders {
       name: "ToTLinuxMSan"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTLinuxTSan"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTLinuxThinLTO"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTLinuxUBSanVptr"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "ToTMac"
-      mixins: "clang-ci"
-      mixins: "mac"
+      mixins: "clang-mac-ci"
     }
     builders {
       name: "ToTMac (dbg)"
-      mixins: "clang-ci"
-      mixins: "mac"
+      mixins: "clang-mac-ci"
     }
     builders {
       name: "ToTMacASan"
-      mixins: "clang-ci"
-      mixins: "mac"
+      mixins: "clang-mac-ci"
     }
     builders {
       name: "ToTMacCoverage"
-      mixins: "clang-ci"
+      mixins: "clang-mac-ci"
       mixins: "clang-coverage"
-      mixins: "mac"
     }
     builders {
       name: "ToTWin(dbg)"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTWin(dll)"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTWin64(dbg)"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTWin64(dll)"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTWinASanLibfuzzer"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTWinCFI"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTWinCFI64"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTWinLibcxx64"
-      mixins: "clang-ci"
-      mixins: "win"
+      mixins: "clang-win-ci"
     }
     builders {
       name: "ToTiOS"
-      mixins: "clang-ci"
+      mixins: "clang-mac-ci"
       mixins: "ios"
       recipe {
         name: "ios/unified_builder_tester"
@@ -1990,7 +1980,7 @@
     }
     builders {
       name: "ToTiOSDevice"
-      mixins: "clang-ci"
+      mixins: "clang-mac-ci"
       mixins: "ios"
       recipe {
         name: "ios/unified_builder_tester"
@@ -1998,13 +1988,11 @@
     }
     builders {
       name: "UBSanVptr Linux"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
     builders {
       name: "linux-win_cross-rel"
-      mixins: "clang-ci"
-      mixins: "linux"
+      mixins: "clang-linux-ci"
     }
 
     # chromium.gpu
@@ -2813,54 +2801,6 @@
       mixins: "goma-rbe-prod"
     }
     builders {
-      name: "Chromium Linux Goma RBE LoadTest"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ci"
-      mixins: "goma-j300"
-    }
-    builders {
-      name: "Chromium Linux Goma RBE LoadTest (debug)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ci"
-      mixins: "goma-j300"
-    }
-    builders {
-      name: "Chromium Linux Goma RBE LoadTest (clobber)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ci"
-      mixins: "goma-j300"
-    }
-    builders {
-      name: "Chromium Linux Goma RBE LoadTest (clobber) (debug)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ci"
-      mixins: "goma-j300"
-    }
-    builders {
-      name: "Chromium Linux Goma RBE LoadTest (ATS)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ats"
-      mixins: "goma-ci"
-    }
-    builders {
-      name: "Chromium Linux Goma RBE LoadTest (ATS) (debug)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ats"
-      mixins: "goma-ci"
-    }
-    builders {
-      name: "Chromium Linux Goma RBE LoadTest (ATS) (clobber)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ats"
-      mixins: "goma-ci"
-    }
-    builders {
-      name: "Chromium Linux Goma RBE LoadTest (ATS) (clobber) (debug)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ats"
-      mixins: "goma-ci"
-    }
-    builders {
       name: "Chromium Mac Goma RBE ToT"
       dimensions: "os:Mac-10.13"
       dimensions: "cores:4"
@@ -2978,30 +2918,6 @@
       mixins: "goma-ci"
       mixins: "goma-rbe-prod"
     }
-    builders {
-      name: "Chromium Android ARM 32-bit Goma RBE LoadTest"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ci"
-      mixins: "goma-j300"
-    }
-    builders {
-      name: "Chromium Android ARM 32-bit Goma RBE LoadTest (debug)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ci"
-      mixins: "goma-j300"
-    }
-    builders {
-      name: "Chromium Android ARM 32-bit Goma RBE LoadTest (clobber)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ci"
-      mixins: "goma-j300"
-    }
-    builders {
-      name: "Chromium Android ARM 32-bit Goma RBE LoadTest (clobber) (debug)"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "goma-ci"
-      mixins: "goma-j300"
-    }
     # Goma RBE FYI
     builders {
       name: "Cast Linux (Goma RBE FYI)"
diff --git a/infra/config/luci-milo.cfg b/infra/config/luci-milo.cfg
index 18f7af0d..f995fe4 100644
--- a/infra/config/luci-milo.cfg
+++ b/infra/config/luci-milo.cfg
@@ -2538,70 +2538,6 @@
 
 consoles {
   header_id: "chromium"
-  id: "chromium.goma.loadtest"
-  name: "chromium.goma.loadtest"
-  repo_url: "https://chromium.googlesource.com/chromium/src"
-  refs: "refs/heads/master"
-  manifest_name: "REVISION"
-  include_experimental_builds: true
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Linux Goma RBE LoadTest"
-    category: "linux|rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Linux Goma RBE LoadTest (clobber)"
-    category: "linux|rel"
-    short_name: "clb"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Linux Goma RBE LoadTest (ATS)"
-    category: "linux|rel|ats"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Linux Goma RBE LoadTest (ATS) (clobber)"
-    category: "linux|rel|ats"
-    short_name: "clb"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Linux Goma RBE LoadTest (debug)"
-    category: "linux|dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Linux Goma RBE LoadTest (clobber) (debug)"
-    category: "linux|dbg"
-    short_name: "clb"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Linux Goma RBE LoadTest (ATS) (debug)"
-    category: "linux|dbg|ats"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Linux Goma RBE LoadTest (ATS) (clobber) (debug)"
-    category: "linux|dbg|ats"
-    short_name: "clb"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Android ARM 32-bit Goma RBE LoadTest"
-    category: "android arm|rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Android ARM 32-bit Goma RBE LoadTest (clobber)"
-    category: "android arm|rel"
-    short_name: "clb"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Android ARM 32-bit Goma RBE LoadTest (debug)"
-    category: "android arm|dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Chromium Android ARM 32-bit Goma RBE LoadTest (clobber) (debug)"
-    category: "android arm|dbg"
-    short_name: "clb"
-  }
-}
-
-consoles {
-  header_id: "chromium"
   id: "chromium.goma.fyi"
   name: "chromium.goma.fyi"
   repo_url: "https://chromium.googlesource.com/chromium/src"
diff --git a/infra/config/luci-scheduler.cfg b/infra/config/luci-scheduler.cfg
index 14ff0b3c..fd659614 100644
--- a/infra/config/luci-scheduler.cfg
+++ b/infra/config/luci-scheduler.cfg
@@ -98,10 +98,6 @@
   triggers: "Cast Audio Linux"
   triggers: "Cast Linux"
   triggers: "Cast Linux (Goma RBE FYI)"
-  triggers: "Chromium Android ARM 32-bit Goma RBE LoadTest"
-  triggers: "Chromium Android ARM 32-bit Goma RBE LoadTest (clobber)"
-  triggers: "Chromium Android ARM 32-bit Goma RBE LoadTest (clobber) (debug)"
-  triggers: "Chromium Android ARM 32-bit Goma RBE LoadTest (debug)"
   triggers: "Chromium Android ARM 32-bit Goma RBE Prod"
   triggers: "Chromium Android ARM 32-bit Goma RBE Prod (clobber)"
   triggers: "Chromium Android ARM 32-bit Goma RBE Prod (dbg)"
@@ -109,14 +105,6 @@
   triggers: "Chromium Android ARM 32-bit Goma RBE Staging"
   triggers: "Chromium Android ARM 32-bit Goma RBE ToT"
   triggers: "Chromium Android ARM 32-bit Goma RBE ToT (ATS)"
-  triggers: "Chromium Linux Goma RBE LoadTest"
-  triggers: "Chromium Linux Goma RBE LoadTest (ATS)"
-  triggers: "Chromium Linux Goma RBE LoadTest (ATS) (clobber)"
-  triggers: "Chromium Linux Goma RBE LoadTest (ATS) (clobber) (debug)"
-  triggers: "Chromium Linux Goma RBE LoadTest (ATS) (debug)"
-  triggers: "Chromium Linux Goma RBE LoadTest (clobber)"
-  triggers: "Chromium Linux Goma RBE LoadTest (clobber) (debug)"
-  triggers: "Chromium Linux Goma RBE LoadTest (debug)"
   triggers: "Chromium Linux Goma RBE Prod"
   triggers: "Chromium Linux Goma RBE Prod (clobber)"
   triggers: "Chromium Linux Goma RBE Prod (dbg)"
@@ -4625,126 +4613,6 @@
 }
 
 job {
-  id: "Chromium Android ARM 32-bit Goma RBE LoadTest"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Android ARM 32-bit Goma RBE LoadTest"
-  }
-}
-
-job {
-  id: "Chromium Android ARM 32-bit Goma RBE LoadTest (debug)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Android ARM 32-bit Goma RBE LoadTest (debug)"
-  }
-}
-
-job {
-  id: "Chromium Android ARM 32-bit Goma RBE LoadTest (clobber)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Android ARM 32-bit Goma RBE LoadTest (clobber)"
-  }
-}
-
-job {
-  id: "Chromium Android ARM 32-bit Goma RBE LoadTest (clobber) (debug)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Android ARM 32-bit Goma RBE LoadTest (clobber) (debug)"
-  }
-}
-
-job {
-  id: "Chromium Linux Goma RBE LoadTest (ATS)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Linux Goma RBE LoadTest (ATS)"
-  }
-}
-
-job {
-  id: "Chromium Linux Goma RBE LoadTest (ATS) (debug)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Linux Goma RBE LoadTest (ATS) (debug)"
-  }
-}
-
-job {
-  id: "Chromium Linux Goma RBE LoadTest (ATS) (clobber)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Linux Goma RBE LoadTest (ATS) (clobber)"
-  }
-}
-
-job {
-  id: "Chromium Linux Goma RBE LoadTest (ATS) (clobber) (debug)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Linux Goma RBE LoadTest (ATS) (clobber) (debug)"
-  }
-}
-
-job {
-  id: "Chromium Linux Goma RBE LoadTest"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Linux Goma RBE LoadTest"
-  }
-}
-
-job {
-  id: "Chromium Linux Goma RBE LoadTest (debug)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Linux Goma RBE LoadTest (debug)"
-  }
-}
-
-job {
-  id: "Chromium Linux Goma RBE LoadTest (clobber)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Linux Goma RBE LoadTest (clobber)"
-  }
-}
-
-job {
-  id: "Chromium Linux Goma RBE LoadTest (clobber) (debug)"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Chromium Linux Goma RBE LoadTest (clobber) (debug)"
-  }
-}
-
-job {
   id: "Chromium Linux Goma RBE ToT"
   acl_sets: "default"
   buildbucket: {
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 39babe1..6735c18 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -112,7 +112,6 @@
 #include "ios/chrome/browser/system_flags.h"
 #import "ios/chrome/browser/tabs/tab.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
-#import "ios/chrome/browser/tabs/tab_model_observer.h"
 #import "ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.h"
 #import "ios/chrome/browser/ui/browser_view/browser_coordinator.h"
 #import "ios/chrome/browser/ui/browser_view/browser_view_controller.h"
@@ -143,6 +142,7 @@
 #import "ios/chrome/browser/url_loading/url_loading_service_factory.h"
 #import "ios/chrome/browser/web/tab_id_tab_helper.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
+#import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
 #include "ios/chrome/common/app_group/app_group_constants.h"
 #include "ios/chrome/common/app_group/app_group_field_trial_version.h"
 #include "ios/chrome/common/app_group/app_group_utils.h"
@@ -314,8 +314,8 @@
                               GoogleServicesNavigationCoordinatorDelegate,
                               PrefObserverDelegate,
                               SettingsNavigationControllerDelegate,
-                              TabModelObserver,
                               TabSwitcherDelegate,
+                              WebStateListObserving,
                               UserFeedbackDataSource> {
   IBOutlet UIWindow* _window;
 
@@ -723,7 +723,7 @@
   [_browserViewWrangler shutdown];
   _browserViewWrangler =
       [[BrowserViewWrangler alloc] initWithBrowserState:_mainBrowserState
-                                       tabModelObserver:self
+                                   webStateListObserver:self
                              applicationCommandEndpoint:self
                                    appURLLoadingService:_appURLLoadingService
                                         storageSwitcher:self];
@@ -2203,20 +2203,19 @@
   _settingsNavigationController = nil;
 }
 
-#pragma mark - TabModelObserver
+#pragma mark - WebStateListObserving
 
-// Called when a Tab is removed. Triggers the switcher view when the last tab is
-// closed on a device that uses the switcher.
-- (void)tabModel:(TabModel*)notifiedTabModel
-    didRemoveTab:(Tab*)tab
-         atIndex:(NSUInteger)index {
-  TabModel* currentTabModel = [self currentTabModel];
+// Called when a WebState is removed. Triggers the switcher view when the last
+// WebState is closed on a device that uses the switcher.
+- (void)webStateList:(WebStateList*)notifiedWebStateList
+    didDetachWebState:(web::WebState*)webState
+              atIndex:(int)atIndex {
   // Do nothing on initialization.
-  if (!currentTabModel)
+  if (![self currentTabModel].webStateList)
     return;
 
-  if (notifiedTabModel.count == 0U) {
-    if ([notifiedTabModel isOffTheRecord]) {
+  if (notifiedWebStateList->empty()) {
+    if (webState->GetBrowserState()->IsOffTheRecord()) {
       [self lastIncognitoTabClosed];
     } else {
       [self lastRegularTabClosed];
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
index 942002c19..6475d95 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
@@ -41,7 +41,7 @@
 <translation id="7208566199746267865">Chromium menghemat waktu Anda dengan membawa akun ke web. Anda dapat menambahkan atau menghapus akun di Setelan.</translation>
 <translation id="7269362888766543920">Beberapa add-on telah menyebabkan Chromium berhenti bekerja. Harap coba uninstal.</translation>
 <translation id="7337881442233988129">Chromium</translation>
-<translation id="7357211569052832586">Data yang dipilih telah dihapus dari Chromium dan perangkat yang disinkronkan. Akun Google Anda mungkin memiliki bentuk histori pencarian lain seperti penelusuran dan aktivitas dari layanan Google lainnya di history.google.com.</translation>
+<translation id="7357211569052832586">Data yang dipilih telah dihapus dari Chromium dan perangkat yang disinkronkan. Akun Google Anda mungkin memiliki bentuk histori penelusuran lain seperti penelusuran dan aktivitas dari layanan Google lainnya di history.google.com.</translation>
 <translation id="7400689562045506105">Gunakan Chromium di Mana Saja</translation>
 <translation id="7674213385180944843">Buka Setelan &gt; Privasi &gt; Kamera &gt; Chromium, lalu aktifkan kamera.</translation>
 <translation id="7746854981345936341">Tips Chromium. Beberapa tombol sekarang terdapat di bagian bawah layar, seperti Kembali, Teruskan, dan Telusuri.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index 15d8aeec..a0ed3a45 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">የዕልባቶች አሞሌ</translation>
 <translation id="5197255632782567636">በይነመረብ</translation>
 <translation id="5228579091201413441">ማመሳሰልን አንቃ</translation>
+<translation id="5234764350956374838">አሰናብት</translation>
 <translation id="5244474230056479698">ከ<ph name="EMAIL" /> ጋር በማስመር ላይ</translation>
 <translation id="5245322853195994030">ስምረትን ሰርዝ</translation>
 <translation id="5271549068863921519">የይለፍ ቃሉን አስቀምጥ</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">ይህ መሣሪያ ሊሞላ ትንሽ ነው የቀረው። ቦታ ያስለቅቁና እንደገና ይሞክሩ።</translation>
 <translation id="5948291296578561264">ይህ ፎቶዎችን ወደ የፎቶ ቤተ-መጽሔፍትዎ እንዲያስቀምጡ ያስችልዎታል።</translation>
 <translation id="5955891643922670672">የመስመር ውጭ ስሪቱን በመመልከት ላይ</translation>
+<translation id="5957613098218939406">ተጨማሪ አማራጮች</translation>
 <translation id="5964480694698977962">አዲስ ማንነት የማያሳውቅ ትር ፍጠር።</translation>
 <translation id="5965679971710331625">ወደ መለያ ገብተዋል</translation>
 <translation id="5979837087407522202">የይለፍ ቃላትን ይፈልጉ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index f1e540b..6e07006 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">شريط الإشارات</translation>
 <translation id="5197255632782567636">الإنترنت</translation>
 <translation id="5228579091201413441">تفعيل المزامنة</translation>
+<translation id="5234764350956374838">رفض</translation>
 <translation id="5244474230056479698">المزامنة مع <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">إلغاء المزامنة</translation>
 <translation id="5271549068863921519">حفظ كلمة المرور</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">جهازك ممتلئ تقريبًا. يمكنك إخلاء بعض المساحة وإعادة المحاولة.</translation>
 <translation id="5948291296578561264">يسمح لك ذلك بحفظ الصور في مكتبة صورك.</translation>
 <translation id="5955891643922670672">عرض النسخة بلا إنترنت</translation>
+<translation id="5957613098218939406">خيارات إضافية</translation>
 <translation id="5964480694698977962">إنشاء علامة تبويب جديدة للتصفح المتخفي.</translation>
 <translation id="5965679971710331625">تم تسجيل الدخول</translation>
 <translation id="5979837087407522202">بحث عن كلمات المرور</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 3b7280a..5bccd11 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Лента на отметките</translation>
 <translation id="5197255632782567636">Интернет</translation>
 <translation id="5228579091201413441">Активиране на синхронизирането</translation>
+<translation id="5234764350956374838">Отхвърляне</translation>
 <translation id="5244474230056479698">Синхронизира се със: <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Анулиране на синхронизирането</translation>
 <translation id="5271549068863921519">Запазване на паролата</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">Хранилището на устройството ви е почти пълно. Освободете място и опитайте отново.</translation>
 <translation id="5948291296578561264">Това ви позволява да запазвате снимки във фотобиблиотеката си.</translation>
 <translation id="5955891643922670672">Гледате офлайн версията</translation>
+<translation id="5957613098218939406">Още опции</translation>
 <translation id="5964480694698977962">Създаване на нов раздел в режим „инкогнито“.</translation>
 <translation id="5965679971710331625">Влезли сте в профил</translation>
 <translation id="5979837087407522202">Търсене в паролите</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index d99830b9..822bccb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">বুকমার্ক বার</translation>
 <translation id="5197255632782567636">ইন্টারনেট</translation>
 <translation id="5228579091201413441">সিঙ্ক সক্ষম করুন</translation>
+<translation id="5234764350956374838">খারিজ</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> এ সিঙ্ক হচ্ছে</translation>
 <translation id="5245322853195994030">সিঙ্ক বাতিল করুন</translation>
 <translation id="5271549068863921519">পাসওয়ার্ড সেভ করুন</translation>
@@ -313,6 +314,7 @@
 <translation id="5938160824633642847">আপনার ডিভাইসে পর্যাপ্ত জায়গা নেই। জায়গা খালি করে আবার চেষ্টা করুন।</translation>
 <translation id="5948291296578561264">এর ফলে আপনি ফটো লাইব্রেরিতে ফটো সেভ করতে পারবেন।</translation>
 <translation id="5955891643922670672">অফলাইন ভার্সন দেখছেন</translation>
+<translation id="5957613098218939406">আরও বিকল্পগুলি</translation>
 <translation id="5964480694698977962">নতুন ছদ্মবেশী ট্যাব তৈরি করুন।</translation>
 <translation id="5965679971710331625">আপনি প্রবেশ করেছেন</translation>
 <translation id="5979837087407522202">পাসওয়ার্ড খুঁজুন</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index e471b87c..0a1386a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Barra d'adreces d'interès</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Activa la sincronització</translation>
+<translation id="5234764350956374838">Omet</translation>
 <translation id="5244474230056479698">S'està sincronitzant amb <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Cancel·la la sincronització</translation>
 <translation id="5271549068863921519">Desa la contrasenya</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Més opcions</translation>
 <translation id="5964480694698977962">Crea una pestanya d'incògnit nova.</translation>
 <translation id="5965679971710331625">Tens la sessió iniciada</translation>
 <translation id="5979837087407522202">Cerca contrasenyes</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index ca956a9..443f1afc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Lišta záložek</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Aktivace synchronizace</translation>
+<translation id="5234764350956374838">Zavřít</translation>
 <translation id="5244474230056479698">Údaje se synchronizují do účtu <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Zrušit synchronizaci</translation>
 <translation id="5271549068863921519">Uložit heslo</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Další možnosti</translation>
 <translation id="5964480694698977962">Vytvořit novou anonymní kartu</translation>
 <translation id="5965679971710331625">Jste přihlášeni</translation>
 <translation id="5979837087407522202">Prohledat hesla</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 9334073..7c50592 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bogmærkelinje</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Aktivér synkronisering</translation>
+<translation id="5234764350956374838">Luk</translation>
 <translation id="5244474230056479698">Synkroniserer til <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Annuller synkronisering</translation>
 <translation id="5271549068863921519">Gem adgangskode</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Flere valgmuligheder</translation>
 <translation id="5964480694698977962">Opret ny inkognitofane.</translation>
 <translation id="5965679971710331625">Du er logget ind</translation>
 <translation id="5979837087407522202">Søg i adgangskoder</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 49db6ac..ed45df3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Lesezeichenleiste</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Synchronisierung aktivieren</translation>
+<translation id="5234764350956374838">Schließen</translation>
 <translation id="5244474230056479698">Mit <ph name="EMAIL" /> synchronisieren</translation>
 <translation id="5245322853195994030">Synchronisierung abbrechen</translation>
 <translation id="5271549068863921519">Passwort speichern</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Weitere Optionen</translation>
 <translation id="5964480694698977962">Neuen Inkognito-Tab erstellen.</translation>
 <translation id="5965679971710331625">Sie sind angemeldet</translation>
 <translation id="5979837087407522202">Passwörter suchen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index 9cdf7ca..67e2409 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Γραμμή σελιδοδεικτών</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Ενεργοποίηση συγχρονισμού</translation>
+<translation id="5234764350956374838">Παράβλεψη</translation>
 <translation id="5244474230056479698">Συγχρονισμός με <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Ακύρωση συγχρονισμού</translation>
 <translation id="5271549068863921519">Αποθήκευση κωδικού πρόσβασης</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">Ο αποθηκευτικός χώρος της συσκευής σας έχει σχεδόν γεμίσει. Ελευθερώστε χώρο και προσπαθήστε ξανά.</translation>
 <translation id="5948291296578561264">Σας επιτρέπει να αποθηκεύετε φωτογραφίες στη βιβλιοθήκη φωτογραφιών σας.</translation>
 <translation id="5955891643922670672">Προβολή έκδοσης εκτός σύνδεσης</translation>
+<translation id="5957613098218939406">Περισσότερες επιλογές</translation>
 <translation id="5964480694698977962">Δημιουργία νέας καρτέλας ανώνυμης περιήγησης.</translation>
 <translation id="5965679971710331625">Είστε συνδεδεμένοι</translation>
 <translation id="5979837087407522202">Αναζήτηση κωδικών πρόσβασης</translation>
@@ -412,7 +414,7 @@
 <translation id="7272437679830969316">Δεν είναι δυνατή η επαλήθευση της ταυτότητας σας. Ο κωδικός πρόσβασης δεν αντιγράφηκε.</translation>
 <translation id="7285236536143823449">ΝΑΙ, ΣΥΜΦΩΝΩ</translation>
 <translation id="7291368939935408496">Προετοιμασία κωδικών πρόσβασης…</translation>
-<translation id="7293171162284876153">Για να ξεκινήσετε τον συγχρονισμό, ενεργοποιήστε την επιλογή Συγχρονισμός των δεδομένων σας Chrome.</translation>
+<translation id="7293171162284876153">Για να ξεκινήσετε τον συγχρονισμό, ενεργοποιήστε την επιλογή "Συγχρονισμός των δεδομένων του Chrome".</translation>
 <translation id="7336264872878993241">Έγινε λήψη του <ph name="PERCENT" /> τοις εκατό</translation>
 <translation id="7346909386216857016">OK, το κατάλαβα</translation>
 <translation id="7348502496356775519">Σελιδοδείκτης</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 95e7bff..ccc41d8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bookmarks Bar</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Enable sync</translation>
+<translation id="5234764350956374838">Dismiss</translation>
 <translation id="5244474230056479698">Syncing to <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Cancel sync</translation>
 <translation id="5271549068863921519">Save password</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">More Options</translation>
 <translation id="5964480694698977962">Create new incognito tab.</translation>
 <translation id="5965679971710331625">You're signed in</translation>
 <translation id="5979837087407522202">Search passwords</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 30b3586..fb0138d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -126,7 +126,7 @@
 <translation id="2800683595868705743">Salir del alternador de pestañas</translation>
 <translation id="2830972654601096923">Administrar direcciones…</translation>
 <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation>
-<translation id="2840687315230832938">No se completó la configuración de la sincronización inicial</translation>
+<translation id="2840687315230832938">No se completó la configuración de sincronización inicial</translation>
 <translation id="2843803966603263712">Restablecer</translation>
 <translation id="2858204748079866344">Para proteger tu privacidad, Chrome no completará de forma automática tu contraseña en este campo.</translation>
 <translation id="285960592395650245">Volver a descargar</translation>
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Barra de favoritos</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Habilitar sincronización</translation>
+<translation id="5234764350956374838">Rechazar</translation>
 <translation id="5244474230056479698">Sincronizando con <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Cancelar sincronización</translation>
 <translation id="5271549068863921519">Guardar contraseña</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Más opciones</translation>
 <translation id="5964480694698977962">Crea una nueva pestaña de incógnito.</translation>
 <translation id="5965679971710331625">Accediste</translation>
 <translation id="5979837087407522202">Buscar contraseñas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index cb82e7f..6c187b6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Barra de marcadores</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Habilitar sincronización</translation>
+<translation id="5234764350956374838">Cerrar</translation>
 <translation id="5244474230056479698">Sincronizando con <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">¿Quieres cancelar la sincronización?</translation>
 <translation id="5271549068863921519">Guardar contraseña</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Más opciones</translation>
 <translation id="5964480694698977962">Crear nueva pestaña de incógnito.</translation>
 <translation id="5965679971710331625">Has iniciado sesión</translation>
 <translation id="5979837087407522202">Buscar contraseñas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 210c085..ada2b17 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Järjehoidjariba</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Sünkroonimise lubamine</translation>
+<translation id="5234764350956374838">Loobu</translation>
 <translation id="5244474230056479698">Sünkroonimine aadressiga <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Tühista sünkroonimine</translation>
 <translation id="5271549068863921519">Salvesta parool</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Rohkem valikuid</translation>
 <translation id="5964480694698977962">Loo uus inkognito vaheleht.</translation>
 <translation id="5965679971710331625">Olete sisse logitud</translation>
 <translation id="5979837087407522202">Otsi paroole</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index 40bd0e1..d2753cc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">نوار نشانک‌ها</translation>
 <translation id="5197255632782567636">اینترنت</translation>
 <translation id="5228579091201413441">فعال کردن همگام‌سازی</translation>
+<translation id="5234764350956374838">لغو کردن</translation>
 <translation id="5244474230056479698">درحال همگام‌سازی در <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">لغو همگام‌سازی</translation>
 <translation id="5271549068863921519">ذخیره گذرواژه</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">دستگاهتان تقریباً پر است. فضا آزاد کنید و دوباره امتحان کنید.</translation>
 <translation id="5948291296578561264">با این کار می‌توانید عکس‌ها را در کتابخانه عکستان ذخیره کنید.</translation>
 <translation id="5955891643922670672">درحال مشاهده نسخه آفلاین</translation>
+<translation id="5957613098218939406">گزینه‌های بیشتر</translation>
 <translation id="5964480694698977962">ایجاد برگه ناشناس جدید</translation>
 <translation id="5965679971710331625">در سیستم هستید</translation>
 <translation id="5979837087407522202">جستجوی گذرواژه‌ها</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 50183cc..9722c48 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Kirjanmerkkipalkki</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Ota synkronointi käyttöön</translation>
+<translation id="5234764350956374838">Piilota</translation>
 <translation id="5244474230056479698">Synkronoidaan osoitteeseen <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Peruuta synkronointi</translation>
 <translation id="5271549068863921519">Tallenna salasana</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Lisäasetukset</translation>
 <translation id="5964480694698977962">Luo uusi incognito-välilehti.</translation>
 <translation id="5965679971710331625">Olet kirjautunut sisään</translation>
 <translation id="5979837087407522202">Hae salasanoista</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 9281ce17..713227b7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bar ng Mga Bookmark</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">I-enable ang pag-sync</translation>
+<translation id="5234764350956374838">Balewalain</translation>
 <translation id="5244474230056479698">Sini-sync sa <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Kanselahin ang Pag-sync</translation>
 <translation id="5271549068863921519">I-save ang password</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Higit Pang Mga Opsyon</translation>
 <translation id="5964480694698977962">Gumawa ng bagong tab na incognito.</translation>
 <translation id="5965679971710331625">Naka-sign in ka</translation>
 <translation id="5979837087407522202">Maghanap ng Mga Password</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index b142e81..62eb667 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -126,7 +126,7 @@
 <translation id="2800683595868705743">Quitter le sélecteur d'onglets</translation>
 <translation id="2830972654601096923">Gérer les adresses…</translation>
 <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation>
-<translation id="2840687315230832938">Configuration initiale de la synchronisation non terminée</translation>
+<translation id="2840687315230832938">Configuration de la synchronisation initiale non terminée</translation>
 <translation id="2843803966603263712">Réinitialiser paramètres Traduction</translation>
 <translation id="2858204748079866344">Pour protéger votre vie privée, Chrome ne renseigne pas automatiquement le champ du mot de passe.</translation>
 <translation id="285960592395650245">Relancer téléchargement</translation>
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Barre de favoris</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Activer la synchronisation</translation>
+<translation id="5234764350956374838">Ignorer</translation>
 <translation id="5244474230056479698">Synchronisation avec <ph name="EMAIL" />…</translation>
 <translation id="5245322853195994030">Annuler la synchronisation</translation>
 <translation id="5271549068863921519">Enregistrer le mot de passe</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Plus d'options</translation>
 <translation id="5964480694698977962">Créer un onglet de navigation privée</translation>
 <translation id="5965679971710331625">Vous êtes connecté</translation>
 <translation id="5979837087407522202">Rechercher des mots de passe</translation>
@@ -411,7 +413,7 @@
 <translation id="7272437679830969316">Impossible de confirmer votre identité. Mot de passe non copié.</translation>
 <translation id="7285236536143823449">OUI, J'ACCEPTE</translation>
 <translation id="7291368939935408496">Préparation des mots de passe…</translation>
-<translation id="7293171162284876153">Pour lancer la synchronisation, activez l'option "Synchroniser vos données Chrome".</translation>
+<translation id="7293171162284876153">Pour lancer la synchronisation, activez l'option "Synchroniser vos données Chrome".</translation>
 <translation id="7336264872878993241"><ph name="PERCENT" /> % téléchargés</translation>
 <translation id="7346909386216857016">OK</translation>
 <translation id="7348502496356775519">Ajouter aux favoris</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index 320d5064..2c6a56d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">બુકમાર્ક્સ બાર</translation>
 <translation id="5197255632782567636">ઇન્ટરનેટ</translation>
 <translation id="5228579091201413441">સિંક ચાલુ કરો</translation>
+<translation id="5234764350956374838">કાઢી નાખો</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> પર સમન્વયિત કરી રહ્યાં છે</translation>
 <translation id="5245322853195994030">સિંક કરવાનું રદ કરો</translation>
 <translation id="5271549068863921519">પાસવર્ડ સાચવો</translation>
@@ -294,7 +295,7 @@
 <translation id="5659593005791499971">ઇમેઇલ</translation>
 <translation id="5669528293118408608">www</translation>
 <translation id="567881659373499783">વર્ઝન <ph name="PRODUCT_VERSION" /></translation>
-<translation id="5711039611392265845">પ્રાઇવસી, સુરક્ષા અને ડેટા સંગ્રહથી સંબંધિત વધુ સેટિંગ માટે, <ph name="BEGIN_LINK" />સિંક અને Google સેવાઓ<ph name="END_LINK" /> જુઓ.</translation>
+<translation id="5711039611392265845">ગોપનીયતા, સુરક્ષા, અને ડેટા સંગ્રહથી સંબંધિત વધુ સેટિંગ માટે, <ph name="BEGIN_LINK" />સિંક અને Google સેવાઓ<ph name="END_LINK" /> જુઓ.</translation>
 <translation id="5728700505257787410">માફ કરશો, તમારા એકાઉન્ટમાં સાઇન ઇન કરવામાં સમસ્યા હતી.</translation>
 <translation id="5737974891429562743">એકાઉન્ટ સાઇન ઇન વિગતો જૂની થઈ ગઈ છે. સિંકને પ્રારંભ કરવા માટે અપડેટ કરો.</translation>
 <translation id="5738887413654608789">આ તમને તમારી આસપાસના વાતાવરણના આધારે સંગત વેબ પૃષ્ઠોની શોધ કરવા દે છે.</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">તમારું ઉપકરણ લગભગ ભરાઈ ગયું છે. સ્પેસ બનાવો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="5948291296578561264">આ તમને તમારી ફોટો લાઇબ્રેરીમાં ફોટો સાચવવા દે છે.</translation>
 <translation id="5955891643922670672">ઑફલાઇન વર્ઝન જોઈ રહ્યા છે</translation>
+<translation id="5957613098218939406">વધુ વિકલ્પો</translation>
 <translation id="5964480694698977962">નવું છૂપું ટૅબ બનાવો</translation>
 <translation id="5965679971710331625">તમે સાઇન ઇન છો</translation>
 <translation id="5979837087407522202">પાસવર્ડ શોધો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 1bbd8dc1..19e5dfea 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -7,7 +7,7 @@
 <translation id="1063454504051558093">कोई और पासवर्ड इस्तेमाल करें...</translation>
 <translation id="1066060668811609597">सिंक प्रबंधित करें</translation>
 <translation id="1076421457278169141">कोड स्कैन किया गया</translation>
-<translation id="1084365883616172403">Facebook पोस्ट पूर्ण.</translation>
+<translation id="1084365883616172403">Facebook पोस्ट पूरी हुई.</translation>
 <translation id="1104948393051856124">स्‍वीकार करें और जारी रखें</translation>
 <translation id="1112015203684611006">प्रिंट विफल रहा.</translation>
 <translation id="1125564390852150847">नया टैब बनाएं.</translation>
@@ -196,7 +196,7 @@
 <translation id="3929457972718048006">पते</translation>
 <translation id="3943492037546055397">पासवर्ड</translation>
 <translation id="3950820424414687140">साइन इन करें</translation>
-<translation id="3967822245660637423">डाउनलोड पूर्ण</translation>
+<translation id="3967822245660637423">डाउनलोड पूरा हुआ</translation>
 <translation id="3989635538409502728">साइन आउट करें</translation>
 <translation id="3995521777587992544">पेज लोड प्रगति बार, <ph name="EMAIL" /> लोड किया गया.</translation>
 <translation id="4002066346123236978">शीर्षक</translation>
@@ -264,7 +264,7 @@
 <translation id="5059136629401106827">ठीक</translation>
 <translation id="5062321486222145940">Google डिस्क इंस्टॉल करें</translation>
 <translation id="5083464117946352670">फ़ाइल आकार तय नहीं हो पा रहा.</translation>
-<translation id="5094827893301452931">ट्वीट पूर्ण.</translation>
+<translation id="5094827893301452931">ट्वीट पूरा हुआ.</translation>
 <translation id="5127805178023152808">समन्वयन बंद है</translation>
 <translation id="5132942445612118989">सभी डिवाइस पर अपने पासवर्ड, इतिहास और दूसरी कई चीज़ें सिंक करें</translation>
 <translation id="5140288047769711648">Chrome आपके लिए इस पासवर्ड को याद रखेगा. आपको इसे याद नहीं रखना होगा.</translation>
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">बुकमार्क बार</translation>
 <translation id="5197255632782567636">इंटरनेट</translation>
 <translation id="5228579091201413441">सिंक चालू करें</translation>
+<translation id="5234764350956374838">खारिज करें</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> से समन्वयित हो रहा है</translation>
 <translation id="5245322853195994030">सिंक करना रद्द करें</translation>
 <translation id="5271549068863921519">पासवर्ड सेव करें</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">आपके डिवाइस की करीब पूरी जगह भर गई है. जगह खाली करके दोबारा आज़माएं.</translation>
 <translation id="5948291296578561264">इससे फ़ोटो आपकी फ़ोटो लाइब्रेरी में सेव कर लिए जाते हैं.</translation>
 <translation id="5955891643922670672">ऑफ़लाइन वर्शन देख रहे हैं</translation>
+<translation id="5957613098218939406">ज़्यादा विकल्प</translation>
 <translation id="5964480694698977962">नया गुप्त टैब बनाएं.</translation>
 <translation id="5965679971710331625">आप प्रवेश किए हुए हैं</translation>
 <translation id="5979837087407522202">पासवर्ड खोजें</translation>
@@ -479,7 +481,7 @@
 <translation id="8524799873541103884"><ph name="NUMBER_OF_OPEN_TABS" /> में से <ph name="FIRST_VISIBLE_TAB" /> से लेकर <ph name="LAST_VISIBLE_TAB" /> तक <ph name="INCOGNITO" /> टैब</translation>
 <translation id="8529767659511976195">नई</translation>
 <translation id="8532105204136943229">समाप्‍ति वर्ष</translation>
-<translation id="8534481786647257214">Google+ पोस्ट पूर्ण.</translation>
+<translation id="8534481786647257214">Google+ पोस्ट पूरा हुआ.</translation>
 <translation id="8548878600947630424">पेज में ढूंढें...</translation>
 <translation id="8605219856220328675">टैब बंद करें.</translation>
 <translation id="8620640915598389714">बदलाव करें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index bb05cf9..c6d139c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Traka oznaka</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Omogući sinkronizaciju</translation>
+<translation id="5234764350956374838">Odbaci</translation>
 <translation id="5244474230056479698">Sinkronizira se s računom <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Otkaži sinkronizaciju</translation>
 <translation id="5271549068863921519">Spremi zaporku</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Više opcija</translation>
 <translation id="5964480694698977962">Otvori novu anonimnu karticu.</translation>
 <translation id="5965679971710331625">Prijavili ste se</translation>
 <translation id="5979837087407522202">Pretraživanje zaporki</translation>
@@ -411,7 +413,7 @@
 <translation id="7272437679830969316">Potvrda identiteta nije moguća. Zaporka nije kopirana.</translation>
 <translation id="7285236536143823449">DA, U REDU</translation>
 <translation id="7291368939935408496">Priprema zaporki...</translation>
-<translation id="7293171162284876153">Da biste pokrenuli sinkronizaciju, uključite "Sinkroniziraj podatke iz Chromea".</translation>
+<translation id="7293171162284876153">Da biste pokrenuli sinkronizaciju, uključite postavku "Sinkroniziraj podatke s Chromea".</translation>
 <translation id="7336264872878993241"><ph name="PERCENT" /> posto preuzeto</translation>
 <translation id="7346909386216857016">Dobro, shvaćam</translation>
 <translation id="7348502496356775519">Označi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index d6f06c37..ddbf385c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Könyvjelzősáv</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Szinkronizálás bekapcsolása</translation>
+<translation id="5234764350956374838">Elvetés</translation>
 <translation id="5244474230056479698">Szinkronizálás a következővel: <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Szinkronizálás megszakítása</translation>
 <translation id="5271549068863921519">Jelszó mentése</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">További lehetőségek</translation>
 <translation id="5964480694698977962">Új inkognitólap létrehozása.</translation>
 <translation id="5965679971710331625">Sikeresen bejelentkezett</translation>
 <translation id="5979837087407522202">Jelszavak keresése</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 65d97c0a..c232b0c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bilah Bookmark</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Aktifkan sinkronisasi</translation>
+<translation id="5234764350956374838">Tutup</translation>
 <translation id="5244474230056479698">Menyinkronkan dengan <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Batalkan Sinkronisasi</translation>
 <translation id="5271549068863921519">Simpan sandi</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Opsi Lainnya</translation>
 <translation id="5964480694698977962">Buat tab penyamaran baru</translation>
 <translation id="5965679971710331625">Anda sudah masuk</translation>
 <translation id="5979837087407522202">Telusuri Sandi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index cc93ec9e..23fea70f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Barra dei Preferiti</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Abilita sincronizzazione</translation>
+<translation id="5234764350956374838">Ignora</translation>
 <translation id="5244474230056479698">Sincronizzazione con <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Annulla sincronizzazione</translation>
 <translation id="5271549068863921519">Salva password</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Altre opzioni</translation>
 <translation id="5964480694698977962">Crea nuova scheda in incognito.</translation>
 <translation id="5965679971710331625">Hai eseguito l'accesso</translation>
 <translation id="5979837087407522202">Cerca password</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index 1d475af3..cd005e9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">סרגל הסימניות</translation>
 <translation id="5197255632782567636">אינטרנט</translation>
 <translation id="5228579091201413441">הפעל סנכרון</translation>
+<translation id="5234764350956374838">סגור</translation>
 <translation id="5244474230056479698">מסנכרן ל-<ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">ביטול הסנכרון</translation>
 <translation id="5271549068863921519">שמור סיסמה</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">המכשיר שלך כמעט מלא. צריך לפנות מקום ולנסות שוב.</translation>
 <translation id="5948291296578561264">מאפשר לך לשמור תמונות בספריית התמונות.</translation>
 <translation id="5955891643922670672">מציג גרסה לא מקוונת</translation>
+<translation id="5957613098218939406">אפשרויות נוספות</translation>
 <translation id="5964480694698977962">יצירת כרטיסייה חדשה של גלישה בסתר.</translation>
 <translation id="5965679971710331625">אתה מחובר</translation>
 <translation id="5979837087407522202">חיפוש בסיסמאות</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 33440dd7..f188a88 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">ブックマーク バー</translation>
 <translation id="5197255632782567636">インターネット</translation>
 <translation id="5228579091201413441">同期を有効にする</translation>
+<translation id="5234764350956374838">閉じる</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> に同期しています</translation>
 <translation id="5245322853195994030">同期をキャンセル</translation>
 <translation id="5271549068863921519">パスワードを保存</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">デバイスの空き容量が少なくなっています。空き容量を増やしてからもう一度お試しください。</translation>
 <translation id="5948291296578561264">フォト ライブラリに写真を保存します。</translation>
 <translation id="5955891643922670672">オフライン版を表示しています</translation>
+<translation id="5957613098218939406">その他のオプション</translation>
 <translation id="5964480694698977962">新しいシークレット タブを作成。</translation>
 <translation id="5965679971710331625">ログイン中のアカウント</translation>
 <translation id="5979837087407522202">パスワードを検索</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 7c1d36f8..d37eb7c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳ ಬಾರ್</translation>
 <translation id="5197255632782567636">ಇಂಟರ್ನೆಟ್</translation>
 <translation id="5228579091201413441">ಸಿಂಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
+<translation id="5234764350956374838">ವಜಾಗೊಳಿಸಿ</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> ಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="5245322853195994030">ಸಿಂಕ್ ರದ್ದುಗೊಳಿಸಿ</translation>
 <translation id="5271549068863921519">ಪಾಸ್‌ವರ್ಡ್ ಉಳಿಸಿ</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">ನಿಮ್ಮ ಸಾಧನ ಬಹುತೇಕ ಭರ್ತಿಯಾಗಿದೆ. ಸ್ಥಳಾವಕಾಶ ಮುಕ್ತಗೊಳಿಸಿ, ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="5948291296578561264">ನಿಮ್ಮ ಫೋಟೋ ಲೈಬ್ರರಿಗೆ ಫೋಟೋಗಳನ್ನು ಉಳಿಸಲು ಇದು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation>
 <translation id="5955891643922670672">ಆಫ್‌ಲೈನ್ ಆವೃತ್ತಿ ಅನ್ನು ವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ</translation>
+<translation id="5957613098218939406">ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು</translation>
 <translation id="5964480694698977962">ಹೊಸ ಅದೃಶ್ಯ ಟ್ಯಾಬ್ ರಚಿಸಿ.</translation>
 <translation id="5965679971710331625">ನೀವು ಸೈನ್ ಇನ್ ಆಗಿರುವಿರಿ</translation>
 <translation id="5979837087407522202">ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಹುಡುಕಿ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 18ac3df..b209c49d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">북마크바</translation>
 <translation id="5197255632782567636">인터넷</translation>
 <translation id="5228579091201413441">동기화 사용</translation>
+<translation id="5234764350956374838">숨기기</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />에 동기화</translation>
 <translation id="5245322853195994030">동기화 취소</translation>
 <translation id="5271549068863921519">비밀번호 저장</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">기기의 저장용량이 거의 가득 찼습니다. 여유 공간을 확보한 후 다시 시도해 보세요.</translation>
 <translation id="5948291296578561264">이렇게 하면 사진 라이브러리에 사진을 저장할 수 있습니다.</translation>
 <translation id="5955891643922670672">오프라인 버전 보는 중</translation>
+<translation id="5957613098218939406">옵션 더보기</translation>
 <translation id="5964480694698977962">새 시크릿 탭 만들기</translation>
 <translation id="5965679971710331625">로그인됨</translation>
 <translation id="5979837087407522202">비밀번호 검색</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 2a4307f4..d583f07 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Žymių juosta</translation>
 <translation id="5197255632782567636">Internetas</translation>
 <translation id="5228579091201413441">Įgalinti sinchronizavimą</translation>
+<translation id="5234764350956374838">Atsisakyti</translation>
 <translation id="5244474230056479698">Sinchronizavimas su <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Atšaukti sinchronizavimą</translation>
 <translation id="5271549068863921519">Išsaugoti slaptažodį</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Daugiau parinkčių</translation>
 <translation id="5964480694698977962">Kurti naują inkognito skirtuką.</translation>
 <translation id="5965679971710331625">Esate prisijungę</translation>
 <translation id="5979837087407522202">Ieškoti slaptažodžių</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 0c0c403d..87900610 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Grāmatzīmju josla</translation>
 <translation id="5197255632782567636">Internets</translation>
 <translation id="5228579091201413441">Iespējot sinhronizāciju</translation>
+<translation id="5234764350956374838">Noraidīt</translation>
 <translation id="5244474230056479698">Sinhronizēšana ar <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Atcelt sinhronizēšanu</translation>
 <translation id="5271549068863921519">Saglabāt paroli</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Citas opcijas</translation>
 <translation id="5964480694698977962">Izveidot jaunu inkognito cilni.</translation>
 <translation id="5965679971710331625">Jūs esat pierakstījies</translation>
 <translation id="5979837087407522202">Meklēt paroles</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index e29475d3..cd66118 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">ബുക്ക്‌മാര്‍‌ക്ക് ബാര്‍‌</translation>
 <translation id="5197255632782567636">ഇന്‍റര്‍നെറ്റ്</translation>
 <translation id="5228579091201413441">സമന്വയം പ്രവർത്തനക്ഷമമാക്കുക</translation>
+<translation id="5234764350956374838">ബഹിഷ്‌ക്കരിക്കുക</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> ഇമെയിലിലേക്ക് സമന്വയിപ്പിക്കുന്നു</translation>
 <translation id="5245322853195994030">സമന്വയം റദ്ദാക്കുക</translation>
 <translation id="5271549068863921519">പാസ്‌വേഡ് സംരക്ഷിക്കുക</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">ഉപകരണത്തിന്റെ സ്‌റ്റോറേജ് ഏകദേശം നിറഞ്ഞു. കുറച്ച് ഇടം സൃഷ്ടിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5948291296578561264">നിങ്ങളുടെ ഫോട്ടോ ലൈബ്രറിയിലേക്ക് ഫോട്ടോകൾ സംരക്ഷിക്കാൻ അനുവദിക്കുന്നു.</translation>
 <translation id="5955891643922670672">ഓഫ്‌ലൈൻ പതിപ്പ് കാണുന്നു</translation>
+<translation id="5957613098218939406">കൂടുതൽ ഓപ്‌ഷനുകൾ</translation>
 <translation id="5964480694698977962">പുതിയ അദൃശ്യ ടാബ് സൃഷ്‌ടിക്കുക.</translation>
 <translation id="5965679971710331625">നിങ്ങൾ സൈൻ ഇൻ ചെയ്‌തു</translation>
 <translation id="5979837087407522202">പാസ്‌വേഡുകൾ തിരയുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 6e4448a87..ad27445a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -274,6 +274,7 @@
 <translation id="5190835502935405962">बुकमार्क बार</translation>
 <translation id="5197255632782567636">इंटरनेट</translation>
 <translation id="5228579091201413441">संकालन सुरू करा</translation>
+<translation id="5234764350956374838">डिसमिस करा</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> वर संकालित करीत आहे</translation>
 <translation id="5245322853195994030">सिंक रद्द करा</translation>
 <translation id="5271549068863921519">पासवर्ड सेव्ह करा</translation>
@@ -313,6 +314,7 @@
 <translation id="5938160824633642847">तुमचे डिव्हाइस जवळजवळ भरले आहे. जागा मोकळी करा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="5948291296578561264">हे तुम्हाला तुमच्या फोटो लायब्ररीवर फोटो सेव्ह करू देते.</translation>
 <translation id="5955891643922670672">ऑफलाइन आवृत्ती पाहत आहे</translation>
+<translation id="5957613098218939406">अधिक पर्याय</translation>
 <translation id="5964480694698977962">नवीन गुप्त टॅब तयार करा.</translation>
 <translation id="5965679971710331625">तुम्ही साइन इन केले आहे</translation>
 <translation id="5979837087407522202">पासवर्ड शोधा</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index 9db551e..f4a2aa9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bar Penanda Halaman</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Dayakan penyegerakan</translation>
+<translation id="5234764350956374838">Singkirkan</translation>
 <translation id="5244474230056479698">Menyegerak ke <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Batalkan Penyegerakan</translation>
 <translation id="5271549068863921519">Simpan kata laluan</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Lebih Banyak Pilihan</translation>
 <translation id="5964480694698977962">Buat tab inkognito baharu.</translation>
 <translation id="5965679971710331625">Anda sudah log masuk</translation>
 <translation id="5979837087407522202">Cari Kata Laluan</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index e4bcc53..d350a0a2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bladwijzerbalk</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Synchronisatie inschakelen</translation>
+<translation id="5234764350956374838">Sluiten</translation>
 <translation id="5244474230056479698">Synchroniseren met <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Synchronisatie annuleren</translation>
 <translation id="5271549068863921519">Wachtwoord opslaan</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Meer opties</translation>
 <translation id="5964480694698977962">Nieuw incognitotabblad maken.</translation>
 <translation id="5965679971710331625">Je bent ingelogd</translation>
 <translation id="5979837087407522202">Wachtwoorden zoeken</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 4c22540..dba082d0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bokmerkerad</translation>
 <translation id="5197255632782567636">Internett</translation>
 <translation id="5228579091201413441">Slå på synkronisering</translation>
+<translation id="5234764350956374838">Lukk</translation>
 <translation id="5244474230056479698">Synkroniserer til <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Avbryt synkronisering</translation>
 <translation id="5271549068863921519">Lagre passord</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Flere alternativer</translation>
 <translation id="5964480694698977962">Åpne en ny inkognitofane.</translation>
 <translation id="5965679971710331625">Du er pålogget</translation>
 <translation id="5979837087407522202">Søk etter passord</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index 5367d00..37f57d74 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Pasek zakładek</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Włącz synchronizację</translation>
+<translation id="5234764350956374838">Zamknij</translation>
 <translation id="5244474230056479698">Synchronizacja z <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Anuluj synchronizację</translation>
 <translation id="5271549068863921519">Zapisz hasło</translation>
@@ -294,7 +295,7 @@
 <translation id="5659593005791499971">E-mail</translation>
 <translation id="5669528293118408608">www</translation>
 <translation id="567881659373499783">Wersja <ph name="PRODUCT_VERSION" /></translation>
-<translation id="5711039611392265845">Więcej ustawień związanych z prywatnością, bezpieczeństwem i zbieraniem danych znajdziesz w sekcji <ph name="BEGIN_LINK" />Synchronizacja i usługi Google<ph name="END_LINK" />.</translation>
+<translation id="5711039611392265845">Więcej ustawień związanych z prywatnością, bezpieczeństwem i zbieraniem danych znajdziesz w sekcji <ph name="BEGIN_LINK" />Synchronizacja i usługi Google<ph name="END_LINK" />.</translation>
 <translation id="5728700505257787410">Niestety, wystąpił problem z zalogowaniem się na konto.</translation>
 <translation id="5737974891429562743">Dane logowania na konto są nieaktualne. Zaktualizuj je, by rozpocząć synchronizację.</translation>
 <translation id="5738887413654608789">Pozwoli Ci to odkrywać strony internetowe dotyczące rzeczy z Twojego otoczenia.</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Więcej opcji</translation>
 <translation id="5964480694698977962">Utwórz nową kartę incognito.</translation>
 <translation id="5965679971710331625">Jesteś zalogowany</translation>
 <translation id="5979837087407522202">Szukaj haseł</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 44cdb0f..b1768a8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Barra de favoritos</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Ativar sincronização</translation>
+<translation id="5234764350956374838">Dispensar</translation>
 <translation id="5244474230056479698">Sincronizado com <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Cancelar sincronização</translation>
 <translation id="5271549068863921519">Salvar senha</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Mais opções</translation>
 <translation id="5964480694698977962">Criar nova guia anônima.</translation>
 <translation id="5965679971710331625">Você está conectado</translation>
 <translation id="5979837087407522202">Pesquisar senhas</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 40ffc5d..8f31dfcc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Barra de marcadores</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Ativar a sincronização</translation>
+<translation id="5234764350956374838">Ignorar</translation>
 <translation id="5244474230056479698">A sincronizar com <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Cancelar sincronização</translation>
 <translation id="5271549068863921519">Guardar palavra-passe</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Mais opções</translation>
 <translation id="5964480694698977962">Criar novo separador de navegação anónima</translation>
 <translation id="5965679971710331625">Tem sessão iniciada</translation>
 <translation id="5979837087407522202">Pesquisar palavras-passe</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 289835bd..0684104f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bară de marcaje</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Activează sincronizarea</translation>
+<translation id="5234764350956374838">Închide</translation>
 <translation id="5244474230056479698">Se sincronizează cu <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Anulează sincronizarea</translation>
 <translation id="5271549068863921519">Salvează parola</translation>
@@ -294,7 +295,7 @@
 <translation id="5659593005791499971">Adresă de e-mail</translation>
 <translation id="5669528293118408608">www</translation>
 <translation id="567881659373499783">Versiunea <ph name="PRODUCT_VERSION" /></translation>
-<translation id="5711039611392265845">Pentru mai multe setări privind confidențialitatea, securitatea și colectarea datelor, consultă <ph name="BEGIN_LINK" />Sincronizarea și Serviciile Google<ph name="END_LINK" />.</translation>
+<translation id="5711039611392265845">Pentru mai multe setări privind confidențialitatea, securitatea și colectarea datelor, consultă <ph name="BEGIN_LINK" />Sincronizarea și serviciile Google<ph name="END_LINK" /></translation>
 <translation id="5728700505257787410">A apărut o problemă de conectare la cont.</translation>
 <translation id="5737974891429562743">Datele de conectare la cont sunt învechite. Actualizează pentru a începe sincronizarea.</translation>
 <translation id="5738887413654608789">Astfel, poți descoperi pagini web relevante în funcție de lucrurile din jurul tău.</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Mai multe opțiuni</translation>
 <translation id="5964480694698977962">Creează o filă incognito nouă.</translation>
 <translation id="5965679971710331625">Te-ai conectat</translation>
 <translation id="5979837087407522202">Caută parole</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index e5f1419..f870937 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Панель закладок</translation>
 <translation id="5197255632782567636">Интернет</translation>
 <translation id="5228579091201413441">Включить синхронизацию</translation>
+<translation id="5234764350956374838">Закрыть</translation>
 <translation id="5244474230056479698">Синхронизация с <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Отключить</translation>
 <translation id="5271549068863921519">Сохранить пароль</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">Освободите место на устройстве и повторите попытку.</translation>
 <translation id="5948291296578561264">Это позволяет вам сохранять фотографии в галерее.</translation>
 <translation id="5955891643922670672">Просматривается в офлайн-режиме</translation>
+<translation id="5957613098218939406">Другое</translation>
 <translation id="5964480694698977962">Создать вкладку инкогнито.</translation>
 <translation id="5965679971710331625">Вы вошли в аккаунт</translation>
 <translation id="5979837087407522202">Поиск паролей</translation>
@@ -411,7 +413,7 @@
 <translation id="7272437679830969316">Не удалось пройти проверку. Пароль не скопирован.</translation>
 <translation id="7285236536143823449">ОК</translation>
 <translation id="7291368939935408496">Подготовка паролей…</translation>
-<translation id="7293171162284876153">Чтобы начать синхронизацию, нажмите "Синхронизировать данные Chrome".</translation>
+<translation id="7293171162284876153">Чтобы начать ее, нажмите "Синхронизировать данные Chrome".</translation>
 <translation id="7336264872878993241">Скачивается: <ph name="PERCENT" />%</translation>
 <translation id="7346909386216857016">ОК</translation>
 <translation id="7348502496356775519">Закладка</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 69418e6..e1a3f937 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Panel so záložkami</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Povoliť synchronizáciu</translation>
+<translation id="5234764350956374838">Zatvoriť</translation>
 <translation id="5244474230056479698">Synchronizácia do účtu <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Zrušiť synchronizáciu</translation>
 <translation id="5271549068863921519">Uložiť heslo</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Ďalšie možnosti</translation>
 <translation id="5964480694698977962">Vytvoriť novú kartu inkognito.</translation>
 <translation id="5965679971710331625">Ste prihlásený/-á</translation>
 <translation id="5979837087407522202">Vyhľadajte heslá</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index 64dd796..66c40cd6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Vrstica z zaznamki</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Omogoči sinhronizacijo</translation>
+<translation id="5234764350956374838">Opusti</translation>
 <translation id="5244474230056479698">Syncing to <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Prekliči sinhronizacijo</translation>
 <translation id="5271549068863921519">Shrani geslo</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Več možnosti</translation>
 <translation id="5964480694698977962">Create new incognito tab.</translation>
 <translation id="5965679971710331625">Prijavljeni ste</translation>
 <translation id="5979837087407522202">Iskanje gesel</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index 7efda98..6572f729 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Трака са обележивачима</translation>
 <translation id="5197255632782567636">Интернет</translation>
 <translation id="5228579091201413441">Омогући синхронизацију</translation>
+<translation id="5234764350956374838">Одбаци</translation>
 <translation id="5244474230056479698">Синхронизује се са <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Желите ли да откажете синхронизацију?</translation>
 <translation id="5271549068863921519">Сачувај лозинку</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">Уређај је скоро пун. Ослободите простор и пробајте поново.</translation>
 <translation id="5948291296578561264">Ово вам омогућава да чувате слике у фототеци.</translation>
 <translation id="5955891643922670672">Прегледате офлајн верзију</translation>
+<translation id="5957613098218939406">Још опција</translation>
 <translation id="5964480694698977962">Направи нову картицу без архивирања.</translation>
 <translation id="5965679971710331625">Пријављени сте</translation>
 <translation id="5979837087407522202">Претражите лозинке</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index b012c00..a71248d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Bokmärkesfältet</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Aktivera synkronisering</translation>
+<translation id="5234764350956374838">Ta bort permanent</translation>
 <translation id="5244474230056479698">Synkroniseras med <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Avbryt synkronisering</translation>
 <translation id="5271549068863921519">Spara lösenord</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Fler alternativ</translation>
 <translation id="5964480694698977962">Skapa en ny inkognitoflik.</translation>
 <translation id="5965679971710331625">Du är inloggad</translation>
 <translation id="5979837087407522202">Sök efter lösenord</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 916eb417..5b50e8f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Sehemu ya Alamisho</translation>
 <translation id="5197255632782567636">Wavuti</translation>
 <translation id="5228579091201413441">Washa usawazishaji</translation>
+<translation id="5234764350956374838">Ondoa</translation>
 <translation id="5244474230056479698">Inasawazisha kwenye <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Ungependa kughairi usawazishaji</translation>
 <translation id="5271549068863921519">Hifadhi nenosiri</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Chaguo Zaidi</translation>
 <translation id="5964480694698977962">Unda kichupo fiche kipya.</translation>
 <translation id="5965679971710331625">Umeingia katika akaunti</translation>
 <translation id="5979837087407522202">Tafuta Manenosiri</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index bcc4b18a..d2dcc9a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">புக்மார்க் பட்டி</translation>
 <translation id="5197255632782567636">இணையம்</translation>
 <translation id="5228579091201413441">ஒத்திசைவை இயக்கு</translation>
+<translation id="5234764350956374838">நிராகரி</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />க்கு ஒத்திசைக்கிறது</translation>
 <translation id="5245322853195994030">ஒத்திசைவை ரத்துசெய்</translation>
 <translation id="5271549068863921519">கடவுச்சொல்லைச் சேமி</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">உங்கள் சாதனச் சேமிப்பகம் கிட்டத்தட்ட நிரம்பிவிட்டது. இடத்தைக் காலியாக்கி, மீண்டும் முயலவும்.</translation>
 <translation id="5948291296578561264">உங்கள் பட நூலகத்தில் படங்களைச் சேமிக்க இது அனுமதிக்கும்.</translation>
 <translation id="5955891643922670672">ஆஃப்லைன் பதிப்பைப் பார்க்கிறீர்கள்</translation>
+<translation id="5957613098218939406">கூடுதல் விருப்பங்கள்</translation>
 <translation id="5964480694698977962">புதிய மறைநிலைத் தாவலை உருவாக்கு</translation>
 <translation id="5965679971710331625">உள்நுழைந்துள்ளீர்கள்</translation>
 <translation id="5979837087407522202">கடவுச்சொற்களைத் தேடு</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 3468e8a..e48a6a6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">బుక్‌మార్క్‌ల బార్</translation>
 <translation id="5197255632782567636">ఇంటర్నెట్</translation>
 <translation id="5228579091201413441">సమకాలీకరణను ప్రారంభించండి</translation>
+<translation id="5234764350956374838">తొలగించు</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />కి సమకాలీకరిస్తోంది</translation>
 <translation id="5245322853195994030">సింక్‌ను రద్దు చేయి</translation>
 <translation id="5271549068863921519">పాస్‌వర్డ్‌ను సేవ్ చేయి</translation>
@@ -294,7 +295,7 @@
 <translation id="5659593005791499971">ఇమెయిల్</translation>
 <translation id="5669528293118408608">www</translation>
 <translation id="567881659373499783"><ph name="PRODUCT_VERSION" /> వెర్షన్</translation>
-<translation id="5711039611392265845">గోప్యత, భద్రత మరియు డేటా సేకరణకు సంబంధించిన మరిన్ని సెట్టింగ్‌ల కోసం, <ph name="BEGIN_LINK" />సింక్ మరియు Google సేవలు<ph name="END_LINK" /> చూడండి.</translation>
+<translation id="5711039611392265845">గోప్యత, భద్రత, డేటా సేకరణకు సంబంధించిన మరిన్ని సెట్టింగ్‌ల కోసం, <ph name="BEGIN_LINK" />సింక్ మరియు Google సేవలు<ph name="END_LINK" /> చూడండి.</translation>
 <translation id="5728700505257787410">క్షమించండి, మీ ఖాతాకు సైన్ ఇన్ చేయడంలో సమస్య ఉంది.</translation>
 <translation id="5737974891429562743">ఖాతా సైన్-ఇన్ వివరాలు పాతవి. సింక్‌ను ప్రారంభించడానికి అప్‌డేట్ చేయండి.</translation>
 <translation id="5738887413654608789">దీని వలన మీరు మీ పరిసరాల ఆధారంగా సంబంధిత వెబ్‌ పేజీలను కనుగొనగలుగుతారు.</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">మీ పరికరం దాదాపు నిండింది. స్థలాన్ని ఖాళీ చేసిన తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5948291296578561264">ఇది మీ ఫోటో లైబ్రరీకి ఫోటోలను సేవ్ చేయడానికి మీకు వీలు కల్పిస్తుంది.</translation>
 <translation id="5955891643922670672">ఆఫ్‌లైన్ వెర్షన్‌ను చూస్తున్నారు</translation>
+<translation id="5957613098218939406">మరిన్ని ఎంపికలు</translation>
 <translation id="5964480694698977962">కొత్త అజ్ఞాత ట్యాబ్‌ను సృష్టించండి.</translation>
 <translation id="5965679971710331625">మీరు సైన్ ఇన్ చేసారు</translation>
 <translation id="5979837087407522202">పాస్‌వర్డ్‌లను వెతుకు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 8c5532fb..9a3e2fe 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">แถบบุ๊กมาร์ก</translation>
 <translation id="5197255632782567636">อินเทอร์เน็ต</translation>
 <translation id="5228579091201413441">เปิดใช้การซิงค์</translation>
+<translation id="5234764350956374838">ปิด</translation>
 <translation id="5244474230056479698">กำลังซิงค์กับ <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">ยกเลิกการซิงค์</translation>
 <translation id="5271549068863921519">บันทึกรหัสผ่าน</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">พื้นที่ในอุปกรณ์เกือบเต็มแล้ว เพิ่มพื้นที่ว่างแล้วลองอีกครั้ง</translation>
 <translation id="5948291296578561264">ช่วยให้คุณบันทึกรูปภาพในคลังภาพได้</translation>
 <translation id="5955891643922670672">การดูเวอร์ชันออฟไลน์</translation>
+<translation id="5957613098218939406">ตัวเลือกเพิ่มเติม</translation>
 <translation id="5964480694698977962">สร้างแท็บที่ไม่ระบุตัวตนใหม่</translation>
 <translation id="5965679971710331625">คุณลงชื่อเข้าใช้แล้ว</translation>
 <translation id="5979837087407522202">ค้นหารหัสผ่าน</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index 10423e1..20e698ea 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Yer İşareti Çubuğu</translation>
 <translation id="5197255632782567636">İnternet</translation>
 <translation id="5228579091201413441">Senkronizasyonu etkinleştir</translation>
+<translation id="5234764350956374838">Kapat</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> hesabıyla senkronize ediliyor</translation>
 <translation id="5245322853195994030">Senkronizasyonu iptal et</translation>
 <translation id="5271549068863921519">Şifreyi kaydet</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Diğer Seçenekler</translation>
 <translation id="5964480694698977962">Yeni gizli sekme oluştur.</translation>
 <translation id="5965679971710331625">Oturum açtınız</translation>
 <translation id="5979837087407522202">Şifrelerde Ara</translation>
@@ -411,7 +413,7 @@
 <translation id="7272437679830969316">Kimliğiniz doğrulanamıyor. Şifre kopyalanmadı.</translation>
 <translation id="7285236536143823449">EVET, İSTİYORUM</translation>
 <translation id="7291368939935408496">Şifreler Hazırlanıyor...</translation>
-<translation id="7293171162284876153">Senkronizasyonu başlatmak için "Chrome verilerinizi senkronize edin" ayarını etkinleştirin.</translation>
+<translation id="7293171162284876153">Senkronizasyonu başlatmak için "Chrome verilerimi senkronize et" ayarını etkinleştirin.</translation>
 <translation id="7336264872878993241">Yüzde <ph name="PERCENT" /> indirildi</translation>
 <translation id="7346909386216857016">Tamam, anladım</translation>
 <translation id="7348502496356775519">Yer işareti koy</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index 131aae9..c6cb44f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Панель закладок</translation>
 <translation id="5197255632782567636">Інтернет</translation>
 <translation id="5228579091201413441">Увімкнути синхронізацію</translation>
+<translation id="5234764350956374838">Відхилити</translation>
 <translation id="5244474230056479698">Синхронізація з обліковим записом <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Скасувати синхронізацію</translation>
 <translation id="5271549068863921519">Зберегти пароль</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">Пам’ять на пристрої майже заповнено. Звільніть місце та повторіть спробу.</translation>
 <translation id="5948291296578561264">Ви зможете зберігати знімки в бібліотеці фотографій.</translation>
 <translation id="5955891643922670672">Перегляд офлайн-версії</translation>
+<translation id="5957613098218939406">Інші параметри</translation>
 <translation id="5964480694698977962">Створити анонімну вкладку.</translation>
 <translation id="5965679971710331625">Ви ввійшли в обліковий запис</translation>
 <translation id="5979837087407522202">Пошук паролів</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index 698f282..2a979327 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">Thanh Dấu trang</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Bật đồng bộ hóa</translation>
+<translation id="5234764350956374838">Loại bỏ</translation>
 <translation id="5244474230056479698">Đang đồng bộ hóa với <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Hủy đồng bộ hóa</translation>
 <translation id="5271549068863921519">Lưu mật khẩu</translation>
@@ -312,6 +313,7 @@
 <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>
+<translation id="5957613098218939406">Tùy chọn khác</translation>
 <translation id="5964480694698977962">Tạo tab ẩn danh mới.</translation>
 <translation id="5965679971710331625">Bạn đã đăng nhập</translation>
 <translation id="5979837087407522202">Tìm kiếm mật khẩu</translation>
@@ -411,7 +413,7 @@
 <translation id="7272437679830969316">Không thể xác minh danh tính của bạn. Chưa sao chép mật khẩu.</translation>
 <translation id="7285236536143823449">CÓ, TÔI ĐỒNG Ý</translation>
 <translation id="7291368939935408496">Đang chuẩn bị mật khẩu...</translation>
-<translation id="7293171162284876153">Để bắt đầu đồng bộ hóa, hãy bật tùy chọn "Đồng bộ hóa dữ liệu Chrome".</translation>
+<translation id="7293171162284876153">Để bắt đầu đồng bộ hóa, hãy bật tùy chọn "Đồng bộ hóa dữ liệu của bạn trên Chrome".</translation>
 <translation id="7336264872878993241">Đã tải xuống <ph name="PERCENT" /> phần trăm</translation>
 <translation id="7346909386216857016">Ok</translation>
 <translation id="7348502496356775519">Đánh dấu trang</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 ac79ce5..058bd7c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">书签栏</translation>
 <translation id="5197255632782567636">互联网</translation>
 <translation id="5228579091201413441">启用同步功能</translation>
+<translation id="5234764350956374838">关闭</translation>
 <translation id="5244474230056479698">同步到 <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">取消同步</translation>
 <translation id="5271549068863921519">保存密码</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">您设备上的存储空间即将用尽,请释放空间并重试。</translation>
 <translation id="5948291296578561264">这样,您便可将照片保存到您的照片库中。</translation>
 <translation id="5955891643922670672">正在查看离线版本</translation>
+<translation id="5957613098218939406">更多选项</translation>
 <translation id="5964480694698977962">创建新的无痕式标签页。</translation>
 <translation id="5965679971710331625">您已登录</translation>
 <translation id="5979837087407522202">搜索密码</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 5468efb..c1f8ec54 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -273,6 +273,7 @@
 <translation id="5190835502935405962">書籤列</translation>
 <translation id="5197255632782567636">網際網路</translation>
 <translation id="5228579091201413441">啟用同步功能</translation>
+<translation id="5234764350956374838">關閉</translation>
 <translation id="5244474230056479698">同步到 <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">取消同步處理</translation>
 <translation id="5271549068863921519">儲存密碼</translation>
@@ -312,6 +313,7 @@
 <translation id="5938160824633642847">你的裝置空間即將用盡,請在釋出空間後再試一次。</translation>
 <translation id="5948291296578561264">可讓你將相片儲存至相片庫。</translation>
 <translation id="5955891643922670672">正在查看離線版</translation>
+<translation id="5957613098218939406">更多選項</translation>
 <translation id="5964480694698977962">新增無痕式分頁。</translation>
 <translation id="5965679971710331625">你已登入帳戶</translation>
 <translation id="5979837087407522202">搜尋密碼</translation>
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index b98bb09c..54014c8 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -622,6 +622,17 @@
           [NSString stringWithFormat:@"FreeformCommandLineFlag%d", i];
       NSString* flag = [defaults stringForKey:key];
       if ([flag length]) {
+        // iOS keyboard replaces -- with —, so undo that.
+        flag = [flag stringByReplacingOccurrencesOfString:@"—"
+                                               withString:@"--"
+                                                  options:0
+                                                    range:NSMakeRange(0, 1)];
+        // To make things easier, allow flags with no dashes by prepending them
+        // here. This also allows for flags that just have one dash if they
+        // exist.
+        if (![flag hasPrefix:@"-"]) {
+          flag = [@"--" stringByAppendingString:flag];
+        }
         flags.push_back(base::SysNSStringToUTF8(flag));
       }
     }
diff --git a/ios/chrome/browser/autofill/automation/automation_action.mm b/ios/chrome/browser/autofill/automation/automation_action.mm
index a5048ef..b4e623c 100644
--- a/ios/chrome/browser/autofill/automation/automation_action.mm
+++ b/ios/chrome/browser/autofill/automation/automation_action.mm
@@ -216,7 +216,7 @@
 
   // Wait for the element to be visible on the page.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:selector]);
+      [ChromeEarlGrey waitForWebStateContainingElement:selector]);
 
   // Potentially scroll into view if below the fold.
   [[EarlGrey selectElementWithMatcher:web::WebViewInWebState(web_state)]
@@ -441,7 +441,7 @@
 
   // Wait for the element to be visible on the page.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:selector]);
+      [ChromeEarlGrey waitForWebStateContainingElement:selector]);
 
   NSString* expectedType = base::SysUTF8ToNSString([self
       getStringFromDictionaryWithKey:"expectedAutofillType"
@@ -499,7 +499,7 @@
 
   // Wait for the element to be visible on the page.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:selector]);
+      [ChromeEarlGrey waitForWebStateContainingElement:selector]);
 
   int selectedIndex = [self getIntFromDictionaryWithKey:"index" error:&error];
   if (error) {
diff --git a/ios/chrome/browser/autofill/form_input_egtest.mm b/ios/chrome/browser/autofill/form_input_egtest.mm
index 73950ab..bf3a15eb 100644
--- a/ios/chrome/browser/autofill/form_input_egtest.mm
+++ b/ios/chrome/browser/autofill/form_input_egtest.mm
@@ -93,7 +93,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"hello!"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"hello!"]);
 
   // Opening the keyboard from a webview blocks EarlGrey's synchronization.
   [[GREYConfiguration sharedInstance]
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm
index 702b7a70..490a149 100644
--- a/ios/chrome/browser/context_menu/context_menu_egtest.mm
+++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -14,7 +14,6 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/histogram_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
@@ -193,7 +192,7 @@
   const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogoPageText]);
 
   LongPressElement(kLogoPageChromiumImageId);
   TapOnContextMenuButton(OpenImageButton());
@@ -211,7 +210,7 @@
   const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogoPageText]);
 
   LongPressElement(kLogoPageChromiumImageId);
   TapOnContextMenuButton(OpenImageInNewTabButton());
@@ -231,7 +230,7 @@
   const GURL initialURL = self.testServer->GetURL(kInitialPageUrl);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:initialURL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:kInitialPageDestinationLinkText]);
+      waitForWebStateContainingText:kInitialPageDestinationLinkText]);
 
   LongPressElement(kInitialPageDestinationLinkId);
   TapOnContextMenuButton(OpenLinkInNewTabButton());
@@ -239,7 +238,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   SelectTabAtIndexInCurrentMode(1U);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationPageText]);
 
   // Verify url.
   const GURL destinationURL = self.testServer->GetURL(kDestinationPageUrl);
@@ -288,7 +287,7 @@
   const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogoPageText]);
 
   LongPressElement(kLogoPageChromiumImageId);
   TapOnContextMenuButton(OpenImageButton());
@@ -307,7 +306,7 @@
   const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogoPageText]);
 
   LongPressElement(kLogoPageChromiumImageId);
   TapOnContextMenuButton(OpenImageButton());
@@ -330,7 +329,7 @@
   const GURL destinationURL = self.testServer->GetURL(kDestinationPageUrl);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationPageText]);
 
   LongPressElement(kDestinationPageTextId);
 
@@ -354,7 +353,7 @@
   const GURL initialURL = self.testServer->GetURL(kInitialPageUrl);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:initialURL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:kInitialPageDestinationLinkText]);
+      waitForWebStateContainingText:kInitialPageDestinationLinkText]);
 
   // Display the context menu twice.
   for (NSInteger i = 0; i < 2; i++) {
@@ -390,7 +389,7 @@
   const GURL initialURL = self.testServer->GetURL(kInitialPageUrl);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:initialURL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:kInitialPageDestinationLinkText]);
+      waitForWebStateContainingText:kInitialPageDestinationLinkText]);
 
   LongPressElement(kInitialPageDestinationLinkId);
 
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index e9dc43c4..5552d63 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -191,6 +191,7 @@
     "//components/strings",
     "//components/ukm",
     "//components/ukm:test_support",
+    "//components/unified_consent:unified_consent",
     "//ios/chrome/app/strings:ios_strings_grit",
     "//ios/chrome/browser",
     "//ios/chrome/browser/metrics",
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
index 9c6da2f..6caf53b 100644
--- a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
+++ b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
@@ -21,7 +21,6 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/histogram_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
@@ -88,7 +87,8 @@
   int number_of_tabs = chrome_test_util::GetMainTabCount();
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url]);
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForWebViewContainingText:word]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:word]);
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey waitForMainTabCount:(number_of_tabs + 1)]);
 }
@@ -160,7 +160,7 @@
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+      [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]);
 
   histogramTester.ExpectTotalCount(kSelectedTabHistogramName, 2, failureBlock);
   histogramTester.ExpectBucketCount(kSelectedTabHistogramName,
@@ -187,7 +187,7 @@
     CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
     CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url1]);
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+        [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]);
     CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:(i + 1)]);
   }
 
@@ -216,7 +216,7 @@
                @"JavaScript to reload each tab did not finish");
     [ChromeEarlGreyUI reload];
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+        [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]);
   }
 
   // Evict the tab. Create a dummy tab so that switching back to normal mode
@@ -230,7 +230,7 @@
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+      [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]);
 
   // Verify that one page-load count has been recorded. It should contain two
   // page loads for each tab created.
@@ -271,12 +271,12 @@
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kURL2FirstWord]);
+      [ChromeEarlGrey waitForWebStateContainingText:kURL2FirstWord]);
 
   // Select the other one so it also reloads.
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+      [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]);
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
   };
@@ -293,7 +293,7 @@
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+      [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]);
   histogramTester.ExpectBucketCount(kSelectedTabHistogramName,
                                     TabUsageRecorder::EVICTED_DUE_TO_COLD_START,
                                     1, failureBlock);
@@ -330,7 +330,7 @@
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kURL2FirstWord]);
+      [ChromeEarlGrey waitForWebStateContainingText:kURL2FirstWord]);
 
   const GURL url1 = web::test::HttpServer::MakeUrl(kTestUrl1);
   const GURL url2 = web::test::HttpServer::MakeUrl(kTestUrl2);
@@ -341,7 +341,7 @@
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+      [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::OmniboxText(url1.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -365,7 +365,7 @@
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+      [ChromeEarlGrey waitForWebStateContainingText:kURL1FirstWord]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   histogramTester.ExpectUniqueSample(kEvictedTabReloadSuccessRate,
@@ -507,7 +507,7 @@
   [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:responses[slowURL]]);
+      [ChromeEarlGrey waitForWebStateContainingText:responses[slowURL]]);
 
   histogramTester.ExpectBucketCount(kDidUserWaitForEvictedTabReload,
                                     TabUsageRecorder::USER_DID_NOT_WAIT, 0,
@@ -626,7 +626,7 @@
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(tabIndex);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"arrived"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"arrived"]);
 
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
@@ -664,11 +664,10 @@
   // Open a tab with a link to click.
   NewMainTabWithURL(initialURL, "link");
   // Click the link.
-  GREYAssert(chrome_test_util::TapWebViewElementWithId("link"),
-             @"Failed to tap \"link\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Whee"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Whee"]);
   NSUInteger tabIndex = chrome_test_util::GetMainTabCount() - 1;
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
@@ -676,7 +675,7 @@
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(tabIndex);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Whee"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Whee"]);
 
   // Verify that the page-load count has been recorded.  It should contain a
   // sum of 2 - one sample with 2 page loads.
@@ -736,7 +735,7 @@
 
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Whee"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Whee"]);
 
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
diff --git a/ios/chrome/browser/metrics/ukm_egtest.mm b/ios/chrome/browser/metrics/ukm_egtest.mm
index 1edcd82..304447e 100644
--- a/ios/chrome/browser/metrics/ukm_egtest.mm
+++ b/ios/chrome/browser/metrics/ukm_egtest.mm
@@ -12,6 +12,7 @@
 #include "components/metrics_services_manager/metrics_services_manager.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/ukm/ukm_service.h"
+#include "components/unified_consent/feature.h"
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/metrics/ios_chrome_metrics_service_accessor.h"
 #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view.h"
@@ -42,6 +43,7 @@
 using chrome_test_util::ButtonWithAccessibilityLabelId;
 using chrome_test_util::ClearBrowsingDataView;
 using chrome_test_util::GetIncognitoTabCount;
+using chrome_test_util::GoogleServicesSettingsButton;
 using chrome_test_util::IsIncognitoMode;
 using chrome_test_util::SettingsAccountButton;
 using chrome_test_util::SettingsDoneButton;
@@ -348,36 +350,54 @@
   uint64_t original_client_id = metrics::UkmEGTestHelper::client_id();
 
   [ChromeEarlGreyUI openSettingsMenu];
-  // Open accounts settings, then sync settings.
-  [[EarlGrey selectElementWithMatcher:SettingsAccountButton()]
-      performAction:grey_tap()];
-  [[EarlGrey selectElementWithMatcher:AccountsSyncButton()]
-      performAction:grey_tap()];
-  // Toggle "Sync Everything" then "History" switches off.
-  [[EarlGrey selectElementWithMatcher:SyncSwitchCell(
-                                          l10n_util::GetNSString(
-                                              IDS_IOS_SYNC_EVERYTHING_TITLE),
-                                          YES)]
-      performAction:TurnSyncSwitchOn(NO)];
-  [[EarlGrey
-      selectElementWithMatcher:SyncSwitchCell(l10n_util::GetNSString(
-                                                  IDS_SYNC_DATATYPE_TYPED_URLS),
-                                              YES)]
-      performAction:TurnSyncSwitchOn(NO)];
-
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // Open Sync and Google services settings
+    [ChromeEarlGreyUI tapSettingsMenuButton:GoogleServicesSettingsButton()];
+    // Toggle "Make searches and browsing better" switch off.
+    [[EarlGrey
+        selectElementWithMatcher:chrome_test_util::SettingsSwitchCell(
+                                     @"betterSearchAndBrowsingItem_switch",
+                                     YES)]
+        performAction:chrome_test_util::TurnSettingsSwitchOn(NO)];
+  } else {
+    // Open accounts settings, then sync settings.
+    [[EarlGrey selectElementWithMatcher:SettingsAccountButton()]
+        performAction:grey_tap()];
+    [[EarlGrey selectElementWithMatcher:AccountsSyncButton()]
+        performAction:grey_tap()];
+    // Toggle "Sync Everything" then "History" switches off.
+    [[EarlGrey selectElementWithMatcher:SyncSwitchCell(
+                                            l10n_util::GetNSString(
+                                                IDS_IOS_SYNC_EVERYTHING_TITLE),
+                                            YES)]
+        performAction:TurnSyncSwitchOn(NO)];
+    [[EarlGrey selectElementWithMatcher:SyncSwitchCell(
+                                            l10n_util::GetNSString(
+                                                IDS_SYNC_DATATYPE_TYPED_URLS),
+                                            YES)]
+        performAction:TurnSyncSwitchOn(NO)];
+  }
   AssertUKMEnabled(false);
 
-  // Toggle "History" then "Sync Everything" switches on.
-  [[EarlGrey
-      selectElementWithMatcher:SyncSwitchCell(l10n_util::GetNSString(
-                                                  IDS_SYNC_DATATYPE_TYPED_URLS),
-                                              NO)]
-      performAction:TurnSyncSwitchOn(YES)];
-  [[EarlGrey selectElementWithMatcher:SyncSwitchCell(
-                                          l10n_util::GetNSString(
-                                              IDS_IOS_SYNC_EVERYTHING_TITLE),
-                                          NO)]
-      performAction:TurnSyncSwitchOn(YES)];
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // Toggle "Make searches and browsing better" switch on.
+    [[EarlGrey
+        selectElementWithMatcher:chrome_test_util::SettingsSwitchCell(
+                                     @"betterSearchAndBrowsingItem_switch", NO)]
+        performAction:chrome_test_util::TurnSettingsSwitchOn(YES)];
+  } else {
+    // Toggle "History" then "Sync Everything" switches on.
+    [[EarlGrey selectElementWithMatcher:SyncSwitchCell(
+                                            l10n_util::GetNSString(
+                                                IDS_SYNC_DATATYPE_TYPED_URLS),
+                                            NO)]
+        performAction:TurnSyncSwitchOn(YES)];
+    [[EarlGrey selectElementWithMatcher:SyncSwitchCell(
+                                            l10n_util::GetNSString(
+                                                IDS_IOS_SYNC_EVERYTHING_TITLE),
+                                            NO)]
+        performAction:TurnSyncSwitchOn(YES)];
+  }
 
   AssertUKMEnabled(true);
   // Client ID should have been reset.
@@ -392,6 +412,12 @@
 
 // Make sure that UKM is disabled when a secondary passphrase is used.
 - (void)testSecondaryPassphrase {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    EARL_GREY_TEST_DISABLED(
+        @"When Unified Consent feature is enabled, setting a custom passphrase "
+         "does not disable UKM anymore, so this test is not needed");
+  }
+
   uint64_t original_client_id = metrics::UkmEGTestHelper::client_id();
 
   [ChromeEarlGreyUI openSettingsMenu];
diff --git a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
index 2304989..efabdea9 100644
--- a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
+++ b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
@@ -102,7 +102,7 @@
   // Load first URL and expect redirect to destination URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstRedirectURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"redirect complete"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"redirect complete"]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
diff --git a/ios/chrome/browser/passwords/credential_manager_egtest.mm b/ios/chrome/browser/passwords/credential_manager_egtest.mm
index af2909e..261f741 100644
--- a/ios/chrome/browser/passwords/credential_manager_egtest.mm
+++ b/ios/chrome/browser/passwords/credential_manager_egtest.mm
@@ -102,7 +102,7 @@
   const GURL URL = self.testServer->GetURL("/example");
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"You are here."]);
+      [ChromeEarlGrey waitForWebStateContainingText:"You are here."]);
 
   // Obtain a PasswordStore.
   scoped_refptr<password_manager::PasswordStore> passwordStore =
diff --git a/ios/chrome/browser/prerender/prerender_egtest.mm b/ios/chrome/browser/prerender/prerender_egtest.mm
index 2b95210..97a51b1 100644
--- a/ios/chrome/browser/prerender/prerender_egtest.mm
+++ b/ios/chrome/browser/prerender/prerender_egtest.mm
@@ -78,7 +78,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+      [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
                           chrome_test_util::Omnibox()]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       performAction:grey_typeText([pageString stringByAppendingString:@"\n"])];
@@ -90,7 +90,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+      [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
                           chrome_test_util::Omnibox()]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       performAction:grey_typeText(
diff --git a/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm b/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm
index af95c022..3dc67da 100644
--- a/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm
+++ b/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm
@@ -28,7 +28,6 @@
 #include "ios/chrome/browser/ui/translate/language_selection_view_controller.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -215,7 +214,6 @@
 using chrome_test_util::ButtonWithAccessibilityLabel;
 using chrome_test_util::ButtonWithAccessibilityLabelId;
 using chrome_test_util::CloseButton;
-using chrome_test_util::TapWebViewElementWithId;
 using translate::LanguageDetectionController;
 
 #pragma mark - MockTranslateScriptManager
@@ -479,12 +477,12 @@
 
   // Check that the translation happened.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 
   // Click on the link.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"link"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:"link"]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:"link"]);
 
   GURL frenchPagePathURL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
@@ -494,7 +492,7 @@
 
   // Check that the auto-translation happened.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 }
 
 #pragma mark - Utility methods
@@ -511,7 +509,7 @@
   // The infobar is presented with an animation. Wait for the "Done" button
   // to become visibile before considering the animation as complete.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+      [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
                           ButtonWithAccessibilityLabelId(IDS_DONE)]);
 
   // Assert that the infobar is visible.
diff --git a/ios/chrome/browser/translate/translate_egtest.mm b/ios/chrome/browser/translate/translate_egtest.mm
index 30e55a73..a35848f 100644
--- a/ios/chrome/browser/translate/translate_egtest.mm
+++ b/ios/chrome/browser/translate/translate_egtest.mm
@@ -38,7 +38,6 @@
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -65,7 +64,6 @@
 using chrome_test_util::ButtonWithAccessibilityLabel;
 using chrome_test_util::ButtonWithAccessibilityLabelId;
 using chrome_test_util::CloseButton;
-using chrome_test_util::TapWebViewElementWithId;
 using chrome_test_util::ToolsMenuView;
 
 namespace {
@@ -636,7 +634,7 @@
   expectedLanguageDetails.adopted_language = "fr";
   [self assertLanguageDetails:expectedLanguageDetails];
   // Trigger the hash change.
-  GREYAssert(TapWebViewElementWithId("Hash"), @"Failed to tap \"Hash\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"Hash"]);
   // Check that language detection has been re-run.
   expectedLanguageDetails.adopted_language = "en";
   [self assertLanguageDetails:expectedLanguageDetails];
@@ -692,9 +690,9 @@
   GURL URL = web::test::HttpServer::MakeUrl(std::string("http://") + kLinkPath);
   GURL someLanguageURL = web::test::HttpServer::MakeUrl(kSomeLanguageUrl);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
-  GREYAssert(TapWebViewElementWithId("click"), @"Failed to tap \"click\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"click"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLanguagePathText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLanguagePathText]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           someLanguageURL.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -881,7 +879,7 @@
 
   // Make sure the page is not translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:"Translated"]);
 
   // The source language tab must be selected and the target language tab must
   // not. Translate the page by tapping the target language tab.
@@ -892,7 +890,7 @@
 
   // Make sure the page is translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 
   // The target language tab must be selected and the source language tab must
   // not. Revert the translation by tapping the source language tab.
@@ -903,7 +901,7 @@
 
   // Make sure the translation is reverted.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:"Translated"]);
 
   // The source language tab must be selected and the target language tab must
   // not.
@@ -929,7 +927,7 @@
 
   // Make sure the page is not translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:"Translated"]);
 
   // The target language tab must not be selected. Translate the page by
   // tapping the target language tab.
@@ -938,10 +936,10 @@
 
   // Make sure the page is translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 
   // Click on the link.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"link"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
 
   // Make sure the navigation is completed.
   GURL frenchPagePathURL = web::test::HttpServer::MakeUrl(
@@ -952,7 +950,7 @@
 
   // Make sure the page is automatically translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 }
 
 // Tests that the source and the target languages can be changed.
@@ -1006,7 +1004,7 @@
 
   // Make sure the page is translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 
   // Make sure the target language changes to "Dutch". The target language
   // tab must be selected and the source language tab must not. Revert the
@@ -1018,7 +1016,7 @@
 
   // Make sure the translation is reverted.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:"Translated"]);
 
   // Open the translate options menu.
   [[EarlGrey selectElementWithMatcher:OptionsButton()]
@@ -1043,7 +1041,7 @@
 
   // Make sure the page is translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 
   // Make sure the source language changes to "English". The target language
   // tab must be selected and the source language tab must not.
@@ -1088,7 +1086,7 @@
 
   // Make sure the page is not translated yet.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:"Translated"]);
 
   // Make sure that French to English translation is not whitelisted yet.
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
@@ -1104,7 +1102,7 @@
 
   // Make sure the page is translated after the snackbar is dismissed.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 
   // Make sure that French to English translation is whitelisted after the
   // snackbar is dismissed.
@@ -1118,7 +1116,7 @@
 
   // Make sure the page is translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 
   // The target language tab must be selected and the source language tab must
   // not.
@@ -1610,7 +1608,7 @@
 
   // Make sure the page is translated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Translated"]);
 
   // Dismiss the translate infobar.
   [[EarlGrey selectElementWithMatcher:CloseButton()] performAction:grey_tap()];
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
index d6976c7..d3b6b39 100644
--- a/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
+++ b/ios/chrome/browser/ui/activity_services/activity_service_controller_unittest.mm
@@ -165,12 +165,6 @@
   _latestErrorAlertMessage = [message copy];
 }
 
-- (CGRect)shareButtonAnchorRect {
-  // On iPad, UIPopovers must be anchored to rectangles that have a non zero
-  // size.
-  return CGRectMake(0, 0, 1, 1);
-}
-
 - (UIView*)shareButtonView {
   return self.parentViewController.view;
 }
diff --git a/ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h b/ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h
index 71e246bb..2912e20 100644
--- a/ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h
+++ b/ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h
@@ -11,8 +11,8 @@
 // activity services menu on the screen.
 @protocol ActivityServicePositioner
 
-// Returns the view that defines the coordinate system that is used for the
-// CGRect returned by |shareButtonAnchorRect|.
+// Returns the view whose bound defines where the ActivityServiceController
+// should be presented.
 - (UIView*)shareButtonView;
 
 @end
diff --git a/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm b/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm
index 0131fe88..423a6f7 100644
--- a/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm
@@ -59,8 +59,7 @@
     // (including the corresponding AccountViewBase).
     ios::GetChromeBrowserProvider()
         ->GetChromeIdentityService()
-        ->GetAvatarForIdentity(identity, ^(UIImage*){
-                               });
+        ->GetAvatarForIdentity(identity, nil);
   }
   return image;
 }
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
index e3748a0..ed3e7c8 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
@@ -29,7 +29,6 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
 #include "ios/web/public/test/element_selector.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "url/gurl.h"
 
@@ -143,7 +142,7 @@
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"hello!"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"hello!"]);
 
   _personalDataManager =
       autofill::PersonalDataManagerFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
index 182215e8..d9cb09d 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
@@ -31,7 +31,6 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
 #include "ios/web/public/test/element_selector.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "url/gurl.h"
 
@@ -329,7 +328,7 @@
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Profile form"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Profile form"]);
 }
 
 - (void)tearDown {
@@ -595,7 +594,7 @@
   NSString* omniboxText = base::SysUTF8ToNSString(URL.spec() + "\n");
   [ChromeEarlGreyUI focusOmniboxAndType:omniboxText];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Profile form"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Profile form"]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -629,7 +628,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   [ChromeEarlGreyUI focusOmniboxAndType:omniboxText];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:webViewText]);
+      [ChromeEarlGrey waitForWebStateContainingText:webViewText]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
       performAction:chrome_test_util::TapWebElement(kFormElementCity)];
@@ -642,7 +641,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:webViewText]);
+      [ChromeEarlGrey waitForWebStateContainingText:webViewText]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -657,7 +656,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   [ChromeEarlGreyUI focusOmniboxAndType:omniboxText];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:webViewText]);
+      [ChromeEarlGrey waitForWebStateContainingText:webViewText]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -668,7 +667,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:webViewText]);
+      [ChromeEarlGrey waitForWebStateContainingText:webViewText]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -700,7 +699,7 @@
   NSString* omniboxText = base::SysUTF8ToNSString(URL.spec() + "\n");
   [ChromeEarlGreyUI focusOmniboxAndType:omniboxText];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Profile form"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Profile form"]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -711,7 +710,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Profile form"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Profile form"]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller_egtest.mm
index f207f04..0de23ba 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller_egtest.mm
@@ -23,7 +23,6 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
 #include "ios/web/public/test/element_selector.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "url/gurl.h"
 
@@ -89,7 +88,7 @@
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Hello"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Hello"]);
 }
 
 - (void)tearDown {
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm
index 3b980c7b..d2afd93 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm
@@ -96,7 +96,7 @@
       "http://ios/testing/data/http_server_files/multi_field_form.html");
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"hello!"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"hello!"]);
 
   // Opening the keyboard from a webview blocks EarlGrey's synchronization.
   [[GREYConfiguration sharedInstance]
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
index 579523f..dd60593 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
@@ -30,7 +30,6 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
 #include "ios/web/public/test/element_selector.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "url/gurl.h"
 
@@ -244,7 +243,7 @@
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"hello!"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"hello!"]);
   SaveExamplePasswordForm();
 }
 
@@ -578,7 +577,7 @@
   const GURL URL = self.testServer->GetURL(kIFrameHTMLFile);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"iFrame"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"iFrame"]);
   SaveLocalPasswordForm(URL);
 
   // Bring up the keyboard.
diff --git a/ios/chrome/browser/ui/autofill/save_card_infobar_egtest.mm b/ios/chrome/browser/ui/autofill/save_card_infobar_egtest.mm
index 19f34af..b4ee55a 100644
--- a/ios/chrome/browser/ui/autofill/save_card_infobar_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/save_card_infobar_egtest.mm
@@ -22,7 +22,6 @@
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
 #import "ios/chrome/browser/ui/autofill/save_card_infobar_controller.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -44,7 +43,6 @@
 using base::test::ios::kWaitForDownloadTimeout;
 using base::test::ios::kWaitForUIElementTimeout;
 using base::test::ios::WaitUntilConditionOrTimeout;
-using chrome_test_util::TapWebViewElementWithId;
 
 // URLs of the test pages.
 const char kCreditCardUploadForm[] =
@@ -239,19 +237,20 @@
 #pragma mark - Page interaction helper methods
 
 - (void)fillAndSubmitFormWithCardDetailsOnly {
-  GREYAssert(TapWebViewElementWithId("fill_card_only"),
-             @"Failed to tap \"fill_card_only\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"fill_card_only"]);
   [self submitForm];
 }
 
 - (void)fillAndSubmitForm {
-  GREYAssert(TapWebViewElementWithId("fill_form"),
-             @"Failed to tap \"fill_form\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"fill_form"]);
   [self submitForm];
 }
 
 - (void)submitForm {
-  GREYAssert(TapWebViewElementWithId("submit"), @"Failed to tap \"submit\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"submit"]);
 }
 
 #pragma mark - Helper methods
diff --git a/ios/chrome/browser/ui/autofill/save_profile_egtest.mm b/ios/chrome/browser/ui/autofill/save_profile_egtest.mm
index 297ac0f..66d0290 100644
--- a/ios/chrome/browser/ui/autofill/save_profile_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/save_profile_egtest.mm
@@ -11,7 +11,6 @@
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
@@ -24,8 +23,6 @@
 
 namespace {
 
-using chrome_test_util::TapWebViewElementWithId;
-
 // URLs of the test pages.
 const char kProfileForm[] =
     "http://ios/testing/data/http_server_files/autofill_smoke_test.html";
@@ -60,10 +57,10 @@
 #pragma mark - Page interaction helper methods
 
 - (void)fillAndSubmitForm {
-  GREYAssert(TapWebViewElementWithId("fill_profile_president"),
-             @"Failed to tap \"fill_profile_president\"");
-  GREYAssert(TapWebViewElementWithId("submit_profile"),
-             @"Failed to tap \"submit_profile\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"fill_profile_president"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"submit_profile"]);
 }
 
 #pragma mark - Tests
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index f980bfc..69d1c27 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -163,6 +163,7 @@
     "//components/bookmarks/browser",
     "//components/prefs",
     "//components/strings",
+    "//components/unified_consent",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/bookmarks",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
index 6247f5b64..445b688 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -16,6 +16,7 @@
 #include "components/bookmarks/browser/titled_url_match.h"
 #include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/unified_consent/feature.h"
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/pref_names.h"
@@ -923,7 +924,7 @@
   // Verify that the resulting page is an error page.
   std::string errorMessage = net::ErrorToShortString(net::ERR_INVALID_URL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:errorMessage]);
+      [ChromeEarlGrey waitForWebStateContainingText:errorMessage]);
 }
 
 #pragma mark - Helpers
@@ -2805,10 +2806,19 @@
       selectElementWithMatcher:grey_allOf(PrimarySignInButton(),
                                           grey_sufficientlyVisible(), nil)]
       performAction:grey_tap()];
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_buttonTitle(@"Cancel"),
-                                          grey_sufficientlyVisible(), nil)]
-      performAction:grey_tap()];
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // Cancel the sign-in operation.
+    [[EarlGrey selectElementWithMatcher:
+                   grey_buttonTitle([l10n_util::GetNSString(
+                       IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON)
+                       uppercaseString])] performAction:grey_tap()];
+  } else {
+    // Cancel the add account operation.
+    [[EarlGrey
+        selectElementWithMatcher:grey_allOf(grey_buttonTitle(@"Cancel"),
+                                            grey_sufficientlyVisible(), nil)]
+        performAction:grey_tap()];
+  }
 
   // Check that the bookmarks UI reappeared and the cell is still here.
   [BookmarksTestCase verifyPromoAlreadySeen:NO];
@@ -2833,18 +2843,25 @@
   [SigninEarlGreyUI
       checkSigninPromoVisibleWithMode:SigninPromoViewModeWarmState];
 
-  // Tap the Sign in button.
+  // Tap the primary button.
   [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_accessibilityID(
-                                              kSigninPromoSecondaryButtonId),
+      selectElementWithMatcher:grey_allOf(PrimarySignInButton(),
                                           grey_sufficientlyVisible(), nil)]
       performAction:grey_tap()];
 
-  // Tap the CANCEL button.
-  [[EarlGrey selectElementWithMatcher:
-                 grey_buttonTitle([l10n_util::GetNSString(
-                     IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON)
-                     uppercaseString])] performAction:grey_tap()];
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // Cancel the sign-in operation.
+    [[EarlGrey selectElementWithMatcher:
+                   grey_buttonTitle([l10n_util::GetNSString(
+                       IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON)
+                       uppercaseString])] performAction:grey_tap()];
+  } else {
+    // Undo the sign-in operation.
+    [[EarlGrey selectElementWithMatcher:
+                   grey_buttonTitle([l10n_util::GetNSString(
+                       IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_UNDO_BUTTON)
+                       uppercaseString])] performAction:grey_tap()];
+  }
 
   // Check that the bookmarks UI reappeared and the cell is still here.
   [SigninEarlGreyUI
@@ -2875,6 +2892,11 @@
                                           grey_sufficientlyVisible(), nil)]
       performAction:grey_tap()];
 
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // Select the identity to dismiss the identity chooser.
+    [SigninEarlGreyUI selectIdentityWithEmail:identity.userEmail];
+  }
+
   // Tap the CANCEL button.
   [[EarlGrey selectElementWithMatcher:
                  grey_buttonTitle([l10n_util::GetNSString(
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
index df16929..f4421c2 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
@@ -60,7 +60,7 @@
 
   // Waits for the page to load and check it is the expected content.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:responses[startURL]]);
+      [ChromeEarlGrey waitForWebStateContainingText:responses[startURL]]);
 
   // In the omnibox, the URL should be present, without the http:// prefix.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
@@ -84,7 +84,7 @@
 
   // Verifies that the destination page is shown.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:responses[destinationURL]]);
+      [ChromeEarlGrey waitForWebStateContainingText:responses[destinationURL]]);
 }
 
 // Tests the fix for the regression reported in https://crbug.com/801165.  The
@@ -102,11 +102,11 @@
   // Load the test page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"File Picker Test"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"File Picker Test"]);
 
   // Invoke the file picker and tap on the "Cancel" button to dismiss the file
   // picker.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"file"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"file"]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::CancelButton()]
       performAction:grey_tap()];
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
@@ -179,14 +179,14 @@
   // Load the test page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:testPageContents]);
+      [ChromeEarlGrey waitForWebStateContainingText:testPageContents]);
   web::WebState* firstWebState = chrome_test_util::GetCurrentTab().webState;
 
   // And do the same in a second tab.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:testPageContents]);
+      [ChromeEarlGrey waitForWebStateContainingText:testPageContents]);
   web::WebState* secondWebState = chrome_test_util::GetCurrentTab().webState;
 
   // Check visibility before and after switching tabs.
diff --git a/ios/chrome/browser/ui/bubble/bubble_presenter.mm b/ios/chrome/browser/ui/bubble/bubble_presenter.mm
index 3a9c5a8f..6fa42b48 100644
--- a/ios/chrome/browser/ui/bubble/bubble_presenter.mm
+++ b/ios/chrome/browser/ui/bubble/bubble_presenter.mm
@@ -288,7 +288,7 @@
   NSString* text =
       l10n_util::GetNSStringWithFixup(IDS_IOS_NEW_TAB_IPH_PROMOTION_TEXT);
   CGPoint tabSwitcherAnchor;
-  if (IsIPadIdiom()) {
+  if (IsRegularXRegularSizeClass()) {
     tabSwitcherAnchor = [self anchorPointToGuide:kTabStripTabSwitcherGuide
                                        direction:arrowDirection];
   } else {
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
index 1f14ffc..652ea3b 100644
--- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -243,6 +243,7 @@
     "//components/reading_list/core",
     "//components/search_engines",
     "//components/strings",
+    "//components/unified_consent",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state",
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
index 7605730..8a67659 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
@@ -20,6 +20,7 @@
 #include "components/ntp_snippets/content_suggestions_service.h"
 #include "components/ntp_snippets/mock_content_suggestions_provider.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/unified_consent/feature.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_switches.h"
 #include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h"
@@ -240,6 +241,14 @@
 // behavior depends on having a real remote provider, so it cannot be tested
 // here.
 - (void)testPrivacySwitch {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    EARL_GREY_TEST_DISABLED(
+        @"Privacy swich for ContentSuggestion was moved to the Sync and Google "
+         "services settings screen, so it is no longer present in the privacy "
+         "section. This test is now covered by "
+         "-[GoogleServicesSettingsTestCase testOpeningServices].");
+  }
+
   [ChromeEarlGreyUI openSettingsMenu];
   [ChromeEarlGreyUI
       tapSettingsMenuButton:chrome_test_util::SettingsMenuPrivacyButton()];
@@ -289,7 +298,7 @@
 
   // Check that the page has been opened.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           pageURL.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -360,7 +369,7 @@
   // Check the page has been correctly opened.
   chrome_test_util::SelectTabAtIndexInCurrentMode(1);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           pageURL.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -383,7 +392,7 @@
 
   // Check that the tab has been opened in foreground.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           pageURL.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -493,7 +502,7 @@
   [ChromeEarlGrey clearBrowsingHistory];
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
index 5e7fd08..0a5f025 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -431,7 +431,7 @@
                      base::SysUTF8ToNSString(kPageTitle))]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   // Check that the new position is the same.
@@ -470,7 +470,7 @@
                      base::SysUTF8ToNSString(kPageTitle))]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   // Check that the new position is the same.
@@ -501,7 +501,7 @@
 
   // Check that the page is loaded.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
 }
 
 // Tests that tapping the omnibox search button logs correctly.
@@ -633,7 +633,7 @@
                                           kToolbarOmniboxButtonIdentifier)]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+      [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
                           chrome_test_util::Omnibox()]);
 }
 
@@ -725,7 +725,7 @@
   [ChromeEarlGrey clearBrowsingHistory];
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
@@ -739,7 +739,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+      [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
                           chrome_test_util::Omnibox()]);
 }
 
diff --git a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
index ca9e5b9..6c45942 100644
--- a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
+++ b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
@@ -391,13 +391,13 @@
 - (void)loadBlankTestPage {
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:self.emptyPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:std::string()]);
+      [ChromeEarlGrey waitForWebStateContainingText:std::string()]);
 }
 
 - (void)loadPageWithLink {
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:self.linkPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLinkPageLinkText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLinkPageLinkText]);
 }
 
 #pragma mark - Tests
@@ -412,7 +412,7 @@
 
   // Wait for the html body to be reset to the correct value.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody]);
+      [ChromeEarlGrey waitForWebStateContainingText:kAlertResultBody]);
 }
 
 // Tests that a confirmation dialog is shown, and that the completion block is
@@ -426,7 +426,7 @@
 
   // Wait for the html body to be reset to the correct value.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kConfirmationResultBodyOK]);
+      [ChromeEarlGrey waitForWebStateContainingText:kConfirmationResultBodyOK]);
 }
 
 // Tests that a confirmation dialog is shown, and that the completion block is
@@ -441,7 +441,7 @@
 
   // Wait for the html body to be reset to the correct value.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:kConfirmationResultBodyCancelled]);
+      waitForWebStateContainingText:kConfirmationResultBodyCancelled]);
 }
 
 // Tests that a prompt dialog is shown, and that the completion block is called
@@ -464,7 +464,7 @@
 
   // Wait for the html body to be reset to the input text.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPromptTestUserInput]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPromptTestUserInput]);
 }
 
 // Tests that a prompt dialog is shown, and that the completion block is called
@@ -487,8 +487,8 @@
   TapCancel();
 
   // Wait for the html body to be reset to the cancel text.
-  CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPromptResultBodyCancelled]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebStateContainingText:kPromptResultBodyCancelled]);
 }
 
 // Tests that JavaScript alerts that are shown in a loop can be suppressed.
@@ -516,7 +516,7 @@
 
   // Wait for the html body to be reset to the loop finished text.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kAlertLoopFinishedText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kAlertLoopFinishedText]);
 }
 
 // Tests to ensure crbug.com/658260 does not regress.
@@ -554,7 +554,7 @@
 
   // Wait for the html body to be reset to the correct value.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody]);
+      [ChromeEarlGrey waitForWebStateContainingText:kAlertResultBody]);
 }
 
 // Tests that an alert is presented after displaying the share menu.
@@ -581,7 +581,7 @@
 
   // Wait for the html body to be reset to the correct value.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody]);
+      [ChromeEarlGrey waitForWebStateContainingText:kAlertResultBody]);
 }
 
 // Tests that an alert is presented after a new tab animation is finished.
diff --git a/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm b/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm
index 56417f2..f1961c2 100644
--- a/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm
+++ b/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm
@@ -92,8 +92,8 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Good"]);
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"good"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Good"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"good"]);
 
   // QLPreviewController UI is rendered out of host process so EarlGrey matcher
   // can not find QLPreviewController UI. Instead this test relies on view
@@ -119,9 +119,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Unauthorized"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Unauthorized"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"unauthorized"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"unauthorized"]);
 
   // QLPreviewController UI is rendered out of host process so EarlGrey matcher
   // can not find QLPreviewController UI. Instead this test relies on view
@@ -147,9 +147,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Forbidden"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Forbidden"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"forbidden"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"forbidden"]);
 
   // QLPreviewController UI is rendered out of host process so EarlGrey matcher
   // can not find QLPreviewController UI. Instead this test relies on view
@@ -175,9 +175,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Changing Mime Type"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Changing Mime Type"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"changing-mime-type"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"changing-mime-type"]);
 
   // QLPreviewController UI is rendered out of host process so EarlGrey matcher
   // can not find QLPreviewController UI. Instead this test relies on view
diff --git a/ios/chrome/browser/ui/download/download_manager_egtest.mm b/ios/chrome/browser/ui/download/download_manager_egtest.mm
index 0a735e9..14775a3 100644
--- a/ios/chrome/browser/ui/download/download_manager_egtest.mm
+++ b/ios/chrome/browser/ui/download/download_manager_egtest.mm
@@ -111,9 +111,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Download"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -130,9 +130,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Download"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -146,9 +146,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Download"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -170,9 +170,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Download"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -190,7 +190,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUITermsURL)]);
   const char kTermsText[] = "Google Chrome Terms of Service";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTermsText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTermsText]);
   [ChromeEarlGrey closeCurrentTab];
   GREYAssert(WaitForOpenInButton(), @"Open in... button did not show up");
 }
@@ -200,7 +200,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Download"]);
 
   // Open context menu for download link.
   [[EarlGrey selectElementWithMatcher:WebViewInWebState(GetCurrentWebState())]
@@ -230,9 +230,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Download"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -246,9 +246,9 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Download"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
diff --git a/ios/chrome/browser/ui/download/pass_kit_egtest.mm b/ios/chrome/browser/ui/download/pass_kit_egtest.mm
index 5bf9db5..fc0333f 100644
--- a/ios/chrome/browser/ui/download/pass_kit_egtest.mm
+++ b/ios/chrome/browser/ui/download/pass_kit_egtest.mm
@@ -82,8 +82,8 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Bad"]);
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"bad"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Bad"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"bad"]);
 
   bool infobarShown = WaitUntilConditionOrTimeout(kWaitForDownloadTimeout, ^{
     NSError* error = nil;
@@ -105,8 +105,8 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Good"]);
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"good"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Good"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"good"]);
 
   // PKAddPassesViewController UI is rendered out of host process so EarlGrey
   // matcher can not find PassKit Dialog UI. Instead this test relies on view
diff --git a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
index 8bd03184..e6c8ec83 100644
--- a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
+++ b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
@@ -227,7 +227,7 @@
 
   // Verify web page finished loading.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kFindInPageResponse]);
+      [ChromeEarlGrey waitForWebStateContainingText:kFindInPageResponse]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn
index 74baffb..da788eb 100644
--- a/ios/chrome/browser/ui/first_run/BUILD.gn
+++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -95,6 +95,7 @@
     "//base/test:test_support",
     "//components/metrics",
     "//components/prefs",
+    "//components/unified_consent",
     "//ios/chrome/app:app_internal",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
index 6a7222b..6017478 100644
--- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm
+++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -11,6 +11,7 @@
 #include "components/metrics/metrics_reporting_default_state.h"
 #include "components/prefs/pref_member.h"
 #include "components/prefs/pref_service.h"
+#include "components/unified_consent/feature.h"
 #import "ios/chrome/app/main_controller.h"
 #include "ios/chrome/browser/application_context.h"
 #import "ios/chrome/browser/geolocation/omnibox_geolocation_controller+Testing.h"
@@ -18,6 +19,7 @@
 #import "ios/chrome/browser/geolocation/test_location_manager.h"
 #include "ios/chrome/browser/sync/sync_setup_service.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
+#import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h"
 #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.h"
 #include "ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.h"
@@ -40,6 +42,7 @@
 using chrome_test_util::ButtonWithAccessibilityLabelId;
 using chrome_test_util::SettingsDoneButton;
 using chrome_test_util::SettingsMenuBackButton;
+using chrome_test_util::SyncSettingsConfirmButton;
 
 namespace {
 
@@ -65,19 +68,6 @@
   return ButtonWithAccessibilityLabelId(
       IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_UNDO_BUTTON);
 }
-
-// Wait until |matcher| is accessible (not nil)
-void WaitForMatcher(id<GREYMatcher> matcher) {
-  ConditionBlock condition = ^{
-    NSError* error = nil;
-    [[EarlGrey selectElementWithMatcher:matcher] assertWithMatcher:grey_notNil()
-                                                             error:&error];
-    return error == nil;
-  };
-  GREYAssert(base::test::ios::WaitUntilConditionOrTimeout(
-                 base::test::ios::kWaitForUIElementTimeout, condition),
-             @"Waiting for matcher %@ failed.", matcher);
-}
 }
 
 @interface MainController (ExposedForTesting)
@@ -209,6 +199,12 @@
 
 // Signs in to an account and then taps the Undo button to sign out.
 - (void)testSignInAndUndo {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    LOG(WARNING) << "Skipping test as there is no undo operation when "
+                    "Unified Consent is enabled.";
+    return;
+  }
+
   ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
@@ -237,6 +233,15 @@
 
 // Signs in to an account and then taps the Advanced link to go to settings.
 - (void)testSignInAndTapSettingsLink {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // TODO(crbug.com/963412): Update the test once opening the Sync and Google
+    // Services settings screen is correctly open when the user taps on
+    // the Settings link from the FRE.
+    EARL_GREY_TEST_DISABLED(
+        @"This test was disabled as the Sync and Google Services screen "
+         "is not correctly open when the user taps on the Settings links");
+  }
+
   ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
@@ -246,34 +251,37 @@
   [[EarlGrey selectElementWithMatcher:FirstRunOptInAcceptButton()]
       performAction:grey_tap()];
 
-  // Sign In |identity|.
-  [[EarlGrey selectElementWithMatcher:AccountConsistencySetupSigninButton()]
-      performAction:grey_tap()];
+  if (!unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // Sign In |identity|.
+    [[EarlGrey selectElementWithMatcher:AccountConsistencySetupSigninButton()]
+        performAction:grey_tap()];
 
-  NSError* signedInError =
-      [SigninEarlGreyUtils checkSignedInWithIdentity:identity];
-  // TODO(crbug.com/951600): Avoid asserting directly unless the test fails,
-  // due to timing issues.
-  if (signedInError != nil) {
-    GREYAssert(false, signedInError.localizedDescription);
+    NSError* signedInError =
+        [SigninEarlGreyUtils checkSignedInWithIdentity:identity];
+    // TODO(crbug.com/951600): Avoid asserting directly unless the test fails,
+    // due to timing issues.
+    if (signedInError != nil) {
+      GREYAssert(false, signedInError.localizedDescription);
+    }
   }
 
   // Tap Settings link.
-  id<GREYMatcher> settings_link_matcher = grey_allOf(
-      grey_accessibilityLabel(@"Settings"), grey_sufficientlyVisible(), nil);
-  WaitForMatcher(settings_link_matcher);
-  [[EarlGrey selectElementWithMatcher:settings_link_matcher]
-      performAction:grey_tap()];
+  [SigninEarlGreyUI tapSettingsLink];
 
-  // Check Sync hasn't started yet, allowing the user to change somes settings.
+  // Check Sync hasn't started yet, allowing the user to change some settings.
   SyncSetupService* sync_service = SyncSetupServiceFactory::GetForBrowserState(
       chrome_test_util::GetOriginalBrowserState());
   GREYAssertFalse(sync_service->HasFinishedInitialSetup(),
                   @"Sync shouldn't have finished its original setup yet");
 
   // Close Settings, user is still signed in and sync is now starting.
-  [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
-      performAction:grey_tap()];
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    [[EarlGrey selectElementWithMatcher:SyncSettingsConfirmButton()]
+        performAction:grey_tap()];
+  } else {
+    [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
+        performAction:grey_tap()];
+  }
 
   CHROME_EG_ASSERT_NO_ERROR(
       [SigninEarlGreyUtils checkSignedInWithIdentity:identity]);
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
index 28f3813e..5a5d665 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
@@ -15,7 +15,6 @@
 #import "base/test/ios/wait_util.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -26,7 +25,6 @@
 #import "ios/web/public/test/http_server/error_page_response_provider.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #include "ios/web/public/test/http_server/http_server_util.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #import "ios/web/public/web_client.h"
 #import "ios/web/public/web_state/web_state.h"
 #include "url/gurl.h"
@@ -35,8 +33,6 @@
 #error "This file requires ARC support."
 #endif
 
-using chrome_test_util::TapWebViewElementWithId;
-
 namespace {
 
 // The page height of test pages. This must be big enough to triger fullscreen.
@@ -191,7 +187,7 @@
   const GURL kChromeAboutURL("chrome://chrome-urls");
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:kChromeAboutURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"chrome://version"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"chrome://version"]);
 
   // Hide the toolbar. The page is not long enough to dismiss the toolbar using
   // the UI so we have to zoom in.
@@ -231,7 +227,8 @@
 
   // Test that the toolbar is visible when moving from one chrome:// link to
   // another chrome:// link.
-  GREYAssert(TapWebViewElementWithId("version"), @"Failed to tap \"version\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"version"]);
   [ChromeEarlGreyUI waitForToolbarVisible:YES];
 }
 
@@ -272,14 +269,12 @@
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Tall page"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Tall page"]);
 
   // Hide the toolbar.
   HideToolbarUsingUI();
   [ChromeEarlGreyUI waitForToolbarVisible:NO];
-
-  GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
-
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
   // Main test is here: Make sure the header is still visible!
   [ChromeEarlGreyUI waitForToolbarVisible:YES];
 }
@@ -314,7 +309,7 @@
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"link1"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"link1"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Hide the toolbar.
@@ -322,11 +317,11 @@
   [ChromeEarlGreyUI waitForToolbarVisible:NO];
 
   // Open new window.
-  GREYAssert(TapWebViewElementWithId("link1"), @"Failed to tap \"link1\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link1"]);
 
   // Check that a new Tab was created.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"link2"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"link2"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   AssertURLIs(destinationURL);
@@ -336,8 +331,8 @@
   [ChromeEarlGreyUI waitForToolbarVisible:NO];
 
   // Close the tab by tapping link2.
-  NSError* error = nil;
-  if (!chrome_test_util::TapWebViewElementWithId("link2", &error)) {
+  NSError* error = [ChromeEarlGrey tapWebStateElementWithID:@"link2"];
+  if (error != nil) {
     // Sometimes, the tap will be unsuccessful due to the window.close()
     // operation invalidating the WKWebView.  If this occurs, verify the error.
     // This results in |TapWebViewElementWithId| returning false.
@@ -350,7 +345,7 @@
   }
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"link1"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"link1"]);
 
   // Make sure the toolbar is on the screen.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
@@ -382,15 +377,15 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:originURL]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"link1"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"link1"]);
   // Dismiss the toolbar.
   HideToolbarUsingUI();
   [ChromeEarlGreyUI waitForToolbarVisible:NO];
 
   // Navigate to the other page.
-  GREYAssert(TapWebViewElementWithId("link1"), @"Failed to tap \"link1\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link1"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"link2"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"link2"]);
 
   // Make sure toolbar is shown since a new load has started.
   [ChromeEarlGreyUI waitForToolbarVisible:YES];
@@ -400,7 +395,7 @@
   [ChromeEarlGreyUI waitForToolbarVisible:NO];
 
   // Go back.
-  GREYAssert(TapWebViewElementWithId("link2"), @"Failed to tap \"link2\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link2"]);
 
   // Make sure the toolbar has loaded now that a new page has loaded.
   [ChromeEarlGreyUI waitForToolbarVisible:YES];
@@ -422,14 +417,14 @@
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"link"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"link"]);
 
   // Dismiss the toolbar.
   HideToolbarUsingUI();
   [ChromeEarlGreyUI waitForToolbarVisible:NO];
 
   // Go back to NTP, which is a native view.
-  GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
 
   // Make sure the toolbar is visible now that a new page has loaded.
   [ChromeEarlGreyUI waitForToolbarVisible:YES];
@@ -455,7 +450,7 @@
   HideToolbarUsingUI();
   [ChromeEarlGreyUI waitForToolbarVisible:NO];
 
-  GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
   AssertURLIs(ErrorPageResponseProvider::GetDnsFailureUrl());
   [ChromeEarlGreyUI waitForToolbarVisible:YES];
 }
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn
index 4470a67a..7d28dd5a 100644
--- a/ios/chrome/browser/ui/history/BUILD.gn
+++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -36,6 +36,14 @@
   ]
 }
 
+source_set("constants") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "history_ui_constants.h",
+    "history_ui_constants.mm",
+  ]
+}
+
 source_set("history_ui") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
@@ -54,12 +62,11 @@
     "history_table_view_controller.mm",
     "history_transitioning_delegate.h",
     "history_transitioning_delegate.mm",
-    "history_ui_constants.h",
-    "history_ui_constants.mm",
     "history_util.h",
     "history_util.mm",
   ]
   deps = [
+    ":constants",
     "public",
     "resources:empty_history",
     "//base",
@@ -136,6 +143,7 @@
     "history_ui_egtest.mm",
   ]
   deps = [
+    ":constants",
     ":history",
     ":history_ui",
     "//base",
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm
index a286b48f..4bc88bd8 100644
--- a/ios/chrome/browser/ui/history/history_ui_egtest.mm
+++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -198,7 +198,7 @@
   [[EarlGrey selectElementWithMatcher:HistoryEntry(_URL1, kTitle1)]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse1]);
 }
 
 // Tests that history is not changed after performing back navigation.
@@ -209,7 +209,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse1]);
 
   [self openHistoryPanel];
 
@@ -424,15 +424,15 @@
 - (void)loadTestURLs {
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse1]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL2]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse2]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL3]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse3]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse3]);
 }
 
 - (void)openHistoryPanel {
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
index 13f6f96..2b27b879 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
@@ -13,6 +13,7 @@
 #import "ios/chrome/browser/ui/infobars/presentation/infobar_modal_positioner.h"
 #import "ios/chrome/browser/ui/infobars/presentation/infobar_modal_transition_driver.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
+#import "ios/chrome/browser/ui/util/ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -20,7 +21,8 @@
 
 namespace {
 // Banner View constants.
-const CGFloat kBannerOverlapWithOmnibox = 5.0;
+const CGFloat kiPhoneBannerOverlapWithOmnibox = 5.0;
+const CGFloat kiPadBannerOverlapWithOmnibox = 10.0;
 }  // namespace
 
 @interface InfobarCoordinator () <InfobarCoordinatorImplementation,
@@ -189,12 +191,26 @@
 #pragma mark InfobarBannerPositioner
 
 - (CGFloat)bannerYPosition {
-  NamedGuide* topLayout =
+  NamedGuide* omniboxGuide =
       [NamedGuide guideWithName:kOmniboxGuide
                            view:self.baseViewController.view];
-  return topLayout.constrainedView.frame.origin.y +
-         topLayout.constrainedView.frame.size.height -
-         kBannerOverlapWithOmnibox;
+  UIView* omniboxView = omniboxGuide.constrainedView;
+  CGRect omniboxFrame = omniboxView.frame;
+
+  // TODO(crbug.com/964136): The TabStrip on iPad is pushing down the Omnibox
+  // view. On iPad when the TabStrip is visible convert the Omnibox frame to the
+  // self.baseViewController.view coordinate system.
+  CGFloat bannerOverlap = kiPhoneBannerOverlapWithOmnibox;
+  NamedGuide* tabStripGuide =
+      [NamedGuide guideWithName:kTabStripTabSwitcherGuide
+                           view:self.baseViewController.view];
+  if (tabStripGuide.constrainedFrame.size.height) {
+    omniboxFrame = [omniboxView convertRect:omniboxView.frame
+                                     toView:self.baseViewController.view];
+    bannerOverlap = kiPadBannerOverlapWithOmnibox;
+  }
+
+  return omniboxFrame.origin.y + omniboxFrame.size.height - bannerOverlap;
 }
 
 - (UIView*)bannerView {
diff --git a/ios/chrome/browser/ui/main/browser_view_wrangler.h b/ios/chrome/browser/ui/main/browser_view_wrangler.h
index 7de0c6fb..9ce8c262 100644
--- a/ios/chrome/browser/ui/main/browser_view_wrangler.h
+++ b/ios/chrome/browser/ui/main/browser_view_wrangler.h
@@ -12,7 +12,7 @@
 @protocol ApplicationCommands;
 @class BrowserCoordinator;
 @class DeviceSharingManager;
-@protocol TabModelObserver;
+@protocol WebStateListObserving;
 
 class AppUrlLoadingService;
 
@@ -32,15 +32,15 @@
 @interface BrowserViewWrangler : NSObject <BrowserInterfaceProvider>
 
 // Initialize a new instance of this class using |browserState| as the primary
-// browser state for the tab models and BVCs, and setting |tabModelObserver|, if
-// not nil, as the tab model delegate for any tab models that are created.
-// |applicationCommandEndpoint| is the object that methods in the
-// ApplicationCommands protocol should be dispatched to by any BVCs that are
-// created. |storageSwitcher| is used to manage changing any storage associated
-// with the interfaces when the current interface changes; this is handled in
-// the implementation of -setCurrentInterface:.
+// browser state for the tab models and BVCs, and setting
+// |WebStateListObserving|, if not nil, as the webStateListObsever for any
+// WebStateLists that are created. |applicationCommandEndpoint| is the object
+// that methods in the ApplicationCommands protocol should be dispatched to by
+// any BVCs that are created. |storageSwitcher| is used to manage changing any
+// storage associated with the interfaces when the current interface changes;
+// this is handled in the implementation of -setCurrentInterface:.
 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
-                    tabModelObserver:(id<TabModelObserver>)tabModelObserver
+                webStateListObserver:(id<WebStateListObserving>)observer
           applicationCommandEndpoint:
               (id<ApplicationCommands>)applicationCommandEndpoint
                 appURLLoadingService:(AppUrlLoadingService*)appURLLoadingService
diff --git a/ios/chrome/browser/ui/main/browser_view_wrangler.mm b/ios/chrome/browser/ui/main/browser_view_wrangler.mm
index 8b13394..d9c521c 100644
--- a/ios/chrome/browser/ui/main/browser_view_wrangler.mm
+++ b/ios/chrome/browser/ui/main/browser_view_wrangler.mm
@@ -87,7 +87,6 @@
 
 @interface BrowserViewWrangler () <WebStateListObserving, TabModelObserver> {
   ios::ChromeBrowserState* _browserState;
-  __weak id<TabModelObserver> _tabModelObserver;
   __weak id<ApplicationCommands> _applicationCommandEndpoint;
   __weak id<BrowserStateStorageSwitching> _storageSwitcher;
   AppUrlLoadingService* _appURLLoadingService;
@@ -96,6 +95,7 @@
   std::unique_ptr<Browser> _mainBrowser;
   std::unique_ptr<Browser> _otrBrowser;
   std::unique_ptr<WebStateListObserverBridge> _webStateListObserver;
+  std::unique_ptr<WebStateListObserverBridge> _webStateListForwardingObserver;
 }
 
 @property(nonatomic, strong, readwrite) WrangledBrowser* mainInterface;
@@ -139,7 +139,7 @@
 @synthesize currentInterface = _currentInterface;
 
 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
-                    tabModelObserver:(id<TabModelObserver>)tabModelObserver
+                webStateListObserver:(id<WebStateListObserving>)observer
           applicationCommandEndpoint:
               (id<ApplicationCommands>)applicationCommandEndpoint
                 appURLLoadingService:(AppUrlLoadingService*)appURLLoadingService
@@ -147,11 +147,12 @@
                          (id<BrowserStateStorageSwitching>)storageSwitcher {
   if ((self = [super init])) {
     _browserState = browserState;
-    _tabModelObserver = tabModelObserver;
     _applicationCommandEndpoint = applicationCommandEndpoint;
     _appURLLoadingService = appURLLoadingService;
     _storageSwitcher = storageSwitcher;
     _webStateListObserver = std::make_unique<WebStateListObserverBridge>(self);
+    _webStateListForwardingObserver =
+        std::make_unique<WebStateListObserverBridge>(observer);
   }
   return self;
 }
@@ -245,11 +246,10 @@
     breakpad::StopMonitoringTabStateForWebStateList(tabModel.webStateList);
     breakpad::StopMonitoringURLsForWebStateList(tabModel.webStateList);
     [tabModel browserStateDestroyed];
-    if (_tabModelObserver) {
-      [tabModel removeObserver:_tabModelObserver];
-    }
     [tabModel removeObserver:self];
     tabModel.webStateList->RemoveObserver(_webStateListObserver.get());
+    tabModel.webStateList->RemoveObserver(
+        _webStateListForwardingObserver.get());
   }
 
   _mainBrowser = std::move(mainBrowser);
@@ -260,11 +260,10 @@
     TabModel* tabModel = self.otrBrowser->GetTabModel();
     breakpad::StopMonitoringTabStateForWebStateList(tabModel.webStateList);
     [tabModel browserStateDestroyed];
-    if (_tabModelObserver) {
-      [tabModel removeObserver:_tabModelObserver];
-    }
     [tabModel removeObserver:self];
     tabModel.webStateList->RemoveObserver(_webStateListObserver.get());
+    tabModel.webStateList->RemoveObserver(
+        _webStateListForwardingObserver.get());
   }
 
   _otrBrowser = std::move(otrBrowser);
@@ -416,11 +415,9 @@
   }
 
   // Add observers.
-  if (_tabModelObserver) {
-    [tabModel addObserver:_tabModelObserver];
-    [tabModel addObserver:self];
-    tabModel.webStateList->AddObserver(_webStateListObserver.get());
-  }
+  [tabModel addObserver:self];
+  tabModel.webStateList->AddObserver(_webStateListObserver.get());
+  tabModel.webStateList->AddObserver(_webStateListForwardingObserver.get());
   breakpad::MonitorTabStateForWebStateList(tabModel.webStateList);
 }
 
diff --git a/ios/chrome/browser/ui/main/browser_view_wrangler_unittest.mm b/ios/chrome/browser/ui/main/browser_view_wrangler_unittest.mm
index 23213487..1cf0618 100644
--- a/ios/chrome/browser/ui/main/browser_view_wrangler_unittest.mm
+++ b/ios/chrome/browser/ui/main/browser_view_wrangler_unittest.mm
@@ -35,7 +35,7 @@
   @autoreleasepool {
     BrowserViewWrangler* wrangler = [[BrowserViewWrangler alloc]
               initWithBrowserState:chrome_browser_state_.get()
-                  tabModelObserver:nil
+              webStateListObserver:nil
         applicationCommandEndpoint:(id<ApplicationCommands>)nil
               appURLLoadingService:nil
                    storageSwitcher:nil];
diff --git a/ios/chrome/browser/ui/omnibox/BUILD.gn b/ios/chrome/browser/ui/omnibox/BUILD.gn
index c1ae2d2..08d80078 100644
--- a/ios/chrome/browser/ui/omnibox/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/BUILD.gn
@@ -53,6 +53,8 @@
     "//components/omnibox/browser",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/colors",
+    "//ios/public/provider/chrome/browser",
+    "//ios/public/provider/chrome/browser/images",
     "//url",
   ]
 }
@@ -75,9 +77,9 @@
   deps = [
     "resources:answer_calculator",
     "resources:answer_conversion",
-    "resources:answer_currency",
     "resources:answer_dictionary",
     "resources:answer_local_time",
+    "resources:answer_stock",
     "resources:answer_sunrise",
     "resources:answer_translation",
     "resources:answer_when_is",
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_icon_formatter.h b/ios/chrome/browser/ui/omnibox/omnibox_icon_formatter.h
index 3cea6eb..11ba9cf 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_icon_formatter.h
+++ b/ios/chrome/browser/ui/omnibox/omnibox_icon_formatter.h
@@ -17,6 +17,10 @@
     NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 
+// Whether the default search engine is Google impacts which icon is used in
+// some cases
+@property(nonatomic, assign) BOOL defaultSearchEngineIsGoogle;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_ICON_FORMATTER_H_
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_icon_formatter.mm b/ios/chrome/browser/ui/omnibox/omnibox_icon_formatter.mm
index 1fc253f..98329784 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_icon_formatter.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_icon_formatter.mm
@@ -8,6 +8,8 @@
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_util.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
+#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
+#include "ios/public/provider/chrome/browser/images/branded_image_provider.h"
 #import "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -19,14 +21,12 @@
 OmniboxSuggestionIconType IconTypeFromMatchAndAnswerType(
     AutocompleteMatchType::Type type,
     base::Optional<int> answerType) {
-  // Some suggestions have custom icons. Others fallback to the icon from the
-  // overall match type.
   if (answerType) {
     switch (answerType.value()) {
       case SuggestionAnswer::ANSWER_TYPE_DICTIONARY:
         return DICTIONARY;
       case SuggestionAnswer::ANSWER_TYPE_FINANCE:
-        return CURRENCY;
+        return STOCK;
       case SuggestionAnswer::ANSWER_TYPE_TRANSLATION:
         return TRANSLATION;
       case SuggestionAnswer::ANSWER_TYPE_WHEN_IS:
@@ -41,7 +41,7 @@
       case SuggestionAnswer::ANSWER_TYPE_LOCAL_TIME:
       case SuggestionAnswer::ANSWER_TYPE_PLAY_INSTALL:
       case SuggestionAnswer::ANSWER_TYPE_WEATHER:
-        break;
+        return FALLBACK_ANSWER;
       case SuggestionAnswer::ANSWER_TYPE_INVALID:
       case SuggestionAnswer::ANSWER_TYPE_TOTAL_COUNT:
         NOTREACHED();
@@ -127,10 +127,12 @@
 }
 
 - (UIImage*)iconImage {
-  NSString* imageName =
-      GetOmniboxNewSuggestionIconTypeAssetName(self.suggestionIconType);
-  return [[UIImage imageNamed:imageName]
-      imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+  if (self.suggestionIconType == FALLBACK_ANSWER &&
+      self.defaultSearchEngineIsGoogle && [self fallbackAnswerBrandedIcon]) {
+    return [[self fallbackAnswerBrandedIcon]
+        imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+  }
+  return GetOmniboxSuggestionIcon(self.suggestionIconType);
 }
 
 - (BOOL)hasCustomAnswerIcon {
@@ -143,18 +145,32 @@
     case CALCULATOR:
     case CONVERSION:
     case DICTIONARY:
-    case CURRENCY:
+    case STOCK:
     case SUNRISE:
     case LOCAL_TIME:
     case WHEN_IS:
     case TRANSLATION:
       return YES;
+    // For the fallback answer, this depends on whether the branded icon exists
+    // and whether the default search engine is Google (the icon only exists for
+    // Google branding).
+    // The default fallback answer icon uses the grey background styling, like
+    // the non-answer icons.
+    case FALLBACK_ANSWER:
+      return self.defaultSearchEngineIsGoogle &&
+             [self fallbackAnswerBrandedIcon];
     case OMNIBOX_SUGGESTION_ICON_TYPE_COUNT:
       NOTREACHED();
       return NO;
   }
 }
 
+- (UIImage*)fallbackAnswerBrandedIcon {
+  return ios::GetChromeBrowserProvider()
+      ->GetBrandedImageProvider()
+      ->GetOmniboxAnswerIcon();
+}
+
 - (UIColor*)iconImageTintColor {
   switch (self.iconType) {
     case OmniboxIconTypeImage:
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_util.h b/ios/chrome/browser/ui/omnibox/omnibox_util.h
index a0a661b0..aa47ea00 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_util.h
+++ b/ios/chrome/browser/ui/omnibox/omnibox_util.h
@@ -21,11 +21,14 @@
   SEARCH,
   CONVERSION,
   DICTIONARY,
-  CURRENCY,
+  STOCK,
   SUNRISE,
   LOCAL_TIME,
   WHEN_IS,
   TRANSLATION,
+  // The FALLBACK_ANSWER icon is used for all answers that don't have special
+  // icons above.
+  FALLBACK_ANSWER,
   OMNIBOX_SUGGESTION_ICON_TYPE_COUNT,
 };
 
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_util.mm b/ios/chrome/browser/ui/omnibox/omnibox_util.mm
index d7f1c66..5405b40 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_util.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_util.mm
@@ -36,7 +36,7 @@
     case DICTIONARY:
       NOTREACHED();
       return @"omnibox_completion_default_favicon";
-    case CURRENCY:
+    case STOCK:
       NOTREACHED();
       return @"omnibox_completion_default_favicon";
     case SUNRISE:
@@ -51,6 +51,9 @@
     case TRANSLATION:
       NOTREACHED();
       return @"omnibox_completion_default_favicon";
+    case FALLBACK_ANSWER:
+      NOTREACHED();
+      return @"omnibox_completion_default_favicon";
     case OMNIBOX_SUGGESTION_ICON_TYPE_COUNT:
       NOTREACHED();
       return @"omnibox_completion_default_favicon";
@@ -78,8 +81,8 @@
       return @"answer_conversion";
     case DICTIONARY:
       return @"answer_dictionary";
-    case CURRENCY:
-      return @"answer_currency";
+    case STOCK:
+      return @"answer_stock";
     case SUNRISE:
       return @"answer_sunrise";
     case LOCAL_TIME:
@@ -88,6 +91,8 @@
       return @"answer_when_is";
     case TRANSLATION:
       return @"answer_translation";
+    case FALLBACK_ANSWER:
+      return @"search";
     case OMNIBOX_SUGGESTION_ICON_TYPE_COUNT:
       NOTREACHED();
       return @"favicon_fallback";
@@ -95,9 +100,12 @@
 }
 
 UIImage* GetOmniboxSuggestionIcon(OmniboxSuggestionIconType iconType) {
-  NSString* imageName = GetOmniboxSuggestionIconTypeAssetName(iconType);
-  if (base::FeatureList::IsEnabled(kNewOmniboxPopupLayout))
+  NSString* imageName = nil;
+  if (base::FeatureList::IsEnabled(kNewOmniboxPopupLayout)) {
     imageName = GetOmniboxNewSuggestionIconTypeAssetName(iconType);
+  } else {
+    imageName = GetOmniboxSuggestionIconTypeAssetName(iconType);
+  }
   return [[UIImage imageNamed:imageName]
       imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
 }
diff --git a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
index 004f0bc..789a887 100644
--- a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
@@ -22,10 +22,12 @@
     "//components/image_fetcher/ios",
     "//components/omnibox/browser",
     "//components/open_from_clipboard",
+    "//components/search_engines",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/favicon",
+    "//ios/chrome/browser/search_engines",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/ntp:util",
diff --git a/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.h b/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.h
index ec10cb8..ff0a49cf 100644
--- a/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.h
+++ b/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.h
@@ -8,12 +8,17 @@
 #import "ios/chrome/browser/ui/omnibox/popup/autocomplete_suggestion.h"
 
 struct AutocompleteMatch;
+
 @interface AutocompleteMatchFormatter : NSObject <AutocompleteSuggestion>
 
 // This is a temporary solution for coloring strings.
 @property(nonatomic, assign, getter=isIncognito) BOOL incognito;
 @property(nonatomic, assign, getter=isStarred) BOOL starred;
 
+// Whether the default search engine is Google impacts which icon is used in
+// some cases
+@property(nonatomic, assign) BOOL defaultSearchEngineIsGoogle;
+
 - (instancetype)initWithMatch:(const AutocompleteMatch&)match
     NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.mm b/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.mm
index edb3c61..5efb9a0 100644
--- a/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.mm
@@ -146,7 +146,10 @@
 }
 
 - (id<OmniboxIcon>)icon {
-  return [[OmniboxIconFormatter alloc] initWithMatch:_match];
+  OmniboxIconFormatter* icon =
+      [[OmniboxIconFormatter alloc] initWithMatch:_match];
+  icon.defaultSearchEngineIsGoogle = self.defaultSearchEngineIsGoogle;
+  return icon;
 }
 
 - (NSInteger)numberOfLines {
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.mm
index 0b01cf6..c0380e3 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.mm
@@ -8,8 +8,10 @@
 #import "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h"
 #include "components/omnibox/browser/autocomplete_result.h"
 #include "components/omnibox/common/omnibox_features.h"
+#import "components/search_engines/template_url_service.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h"
+#include "ios/chrome/browser/search_engines/template_url_service_factory.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/ntp/ntp_util.h"
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_view_controller.h"
@@ -68,6 +70,13 @@
              delegate:_popupView.get()];
   self.mediator.dispatcher = (id<BrowserCommands>)self.dispatcher;
   self.mediator.webStateList = self.webStateList;
+  TemplateURLService* templateURLService =
+      ios::TemplateURLServiceFactory::GetForBrowserState(self.browserState);
+  self.mediator.defaultSearchEngineIsGoogle =
+      templateURLService && templateURLService->GetDefaultSearchProvider() &&
+      templateURLService->GetDefaultSearchProvider()->GetEngineType(
+          templateURLService->search_terms_data()) == SEARCH_ENGINE_GOOGLE;
+
   if (base::FeatureList::IsEnabled(kNewOmniboxPopupLayout)) {
     self.popupViewController = [[OmniboxPopupViewController alloc] init];
   } else {
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_egtest.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_egtest.mm
index ff2181a..23dd1cf7 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_egtest.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_egtest.mm
@@ -114,14 +114,14 @@
   GURL firstPageURL = self.testServer->GetURL(kPage1URL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Open the second page in another tab.
   [ChromeEarlGreyUI openNewTab];
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage2URL)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage2]);
 
   // Type the URL of the first page in the omnibox to trigger it as suggestion.
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(kPage1URL)];
@@ -130,7 +130,7 @@
   [[EarlGrey selectElementWithMatcher:SwitchTabElementForUrl(firstPageURL)]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Check that both tabs are opened (and that we switched tab and not just
   // navigated.
@@ -152,13 +152,13 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage1URL)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Open the second page in another tab.
   [ChromeEarlGreyUI openNewTab];
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage2]);
 
   // Type the URL of the first page in the omnibox to trigger it as suggestion.
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(kPage2URL)];
@@ -181,31 +181,31 @@
   // Add all the pages to the history.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage2]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL3]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage3]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage3]);
   [[self class] closeAllTabs];
 
   // Load page 1 in non-incognito and page 2 in incognito.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage2]);
 
   // Open page 3 in non-incognito.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL3]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage3]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage3]);
 
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(URL3.host())];
 
@@ -227,7 +227,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL3]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage3]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage3]);
 
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(URL3.host())];
 
@@ -251,7 +251,7 @@
   GURL URL1 = self.testServer->GetURL(kPage1URL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Open a new tab and switch to the first tab.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
@@ -260,7 +260,7 @@
   [[EarlGrey selectElementWithMatcher:SwitchTabElementForUrl(URL1)]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Check that the other tab is closed.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
@@ -271,13 +271,13 @@
   GURL URL1 = self.testServer->GetURL(kPage1URL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Open a new tab, navigate to a page and go back to have forward history.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   // Navigate to the other tab.
@@ -286,7 +286,7 @@
   [[EarlGrey selectElementWithMatcher:SwitchTabElementForUrl(URL1)]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Check that the other tab is not closed.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
@@ -300,14 +300,14 @@
   // Open the first page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Open a new tab and load another URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage2URL)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage2]);
 
   // Start typing url of the first page.
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(kPage1URL)];
@@ -326,7 +326,7 @@
 
   // Check that the URL has been opened in a new foreground tab.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
@@ -337,14 +337,14 @@
   GURL URL1 = self.testServer->GetURL(kPage1URL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage1]);
 
   // Open the second page in a new tab.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   GURL URL2 = self.testServer->GetURL(kPage2URL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPage2]);
 
   // Start typing url of the two opened pages in a new tab.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h
index aa3ddb2..55b8f37 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h
@@ -66,6 +66,9 @@
 @property(nonatomic, strong) OmniboxPopupPresenter* presenter;
 // The web state list this mediator is handling.
 @property(nonatomic, assign) WebStateList* webStateList;
+// Whether the default search engine is Google impacts which icon is used in
+// some cases
+@property(nonatomic, assign) BOOL defaultSearchEngineIsGoogle;
 
 // Designated initializer. Takes ownership of |imageFetcher|.
 - (instancetype)initWithFetcher:
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.mm
index aed8b27..f34485e 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.mm
@@ -81,6 +81,7 @@
         [AutocompleteMatchFormatter formatterWithMatch:match];
     formatter.starred = _delegate->IsStarredMatch(match);
     formatter.incognito = _incognito;
+    formatter.defaultSearchEngineIsGoogle = self.defaultSearchEngineIsGoogle;
     [wrappedMatches addObject:formatter];
   }
 
diff --git a/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm b/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm
index b082c97..1daf176 100644
--- a/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm
@@ -123,7 +123,7 @@
   [[EarlGrey selectElementWithMatcher:[self mostVisitedTileMatcher]]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTilePageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTilePageLoadedString]);
 }
 
 - (void)testBookmarksShortcut {
@@ -246,7 +246,7 @@
       performAction:grey_tap()];
   // Wait for the real omnibox to be visible.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+      [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
                           chrome_test_util::Omnibox()]);
 
   // The shortcuts should not show up here.
@@ -264,14 +264,14 @@
   const GURL pageURL = self.testServer->GetURL(kPageURL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageLoadedString]);
 }
 
 - (void)prepareMostVisitedTiles {
   const GURL pageURL = self.testServer->GetURL(kTilePageURL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTilePageLoadedString]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTilePageLoadedString]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
diff --git a/ios/chrome/browser/ui/omnibox/resources/BUILD.gn b/ios/chrome/browser/ui/omnibox/resources/BUILD.gn
index 36f68a2..43c652a 100644
--- a/ios/chrome/browser/ui/omnibox/resources/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/resources/BUILD.gn
@@ -100,11 +100,11 @@
   ]
 }
 
-imageset("answer_currency") {
+imageset("answer_stock") {
   sources = [
-    "answer_currency.imageset/Contents.json",
-    "answer_currency.imageset/answer_currency@2x.png",
-    "answer_currency.imageset/answer_currency@3x.png",
+    "answer_stock.imageset/Contents.json",
+    "answer_stock.imageset/answer_stock@2x.png",
+    "answer_stock.imageset/answer_stock@3x.png",
   ]
 }
 
diff --git a/ios/chrome/browser/ui/omnibox/resources/answer_currency.imageset/Contents.json b/ios/chrome/browser/ui/omnibox/resources/answer_stock.imageset/Contents.json
similarity index 72%
rename from ios/chrome/browser/ui/omnibox/resources/answer_currency.imageset/Contents.json
rename to ios/chrome/browser/ui/omnibox/resources/answer_stock.imageset/Contents.json
index b1ef0a8..714c3b35 100644
--- a/ios/chrome/browser/ui/omnibox/resources/answer_currency.imageset/Contents.json
+++ b/ios/chrome/browser/ui/omnibox/resources/answer_stock.imageset/Contents.json
@@ -3,12 +3,12 @@
         {
             "idiom": "universal",
             "scale": "2x",
-            "filename": "answer_currency@2x.png"
+            "filename": "answer_stock@2x.png"
         },
         {
             "idiom": "universal",
             "scale": "3x",
-            "filename": "answer_currency@3x.png"
+            "filename": "answer_stock@3x.png"
         }
     ],
     "info": {
diff --git a/ios/chrome/browser/ui/omnibox/resources/answer_currency.imageset/answer_currency@2x.png b/ios/chrome/browser/ui/omnibox/resources/answer_stock.imageset/answer_stock@2x.png
similarity index 100%
rename from ios/chrome/browser/ui/omnibox/resources/answer_currency.imageset/answer_currency@2x.png
rename to ios/chrome/browser/ui/omnibox/resources/answer_stock.imageset/answer_stock@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/omnibox/resources/answer_currency.imageset/answer_currency@3x.png b/ios/chrome/browser/ui/omnibox/resources/answer_stock.imageset/answer_stock@3x.png
similarity index 100%
rename from ios/chrome/browser/ui/omnibox/resources/answer_currency.imageset/answer_currency@3x.png
rename to ios/chrome/browser/ui/omnibox/resources/answer_stock.imageset/answer_stock@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm
index e77554b..95581125 100644
--- a/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm
@@ -11,7 +11,6 @@
 #include "ios/chrome/browser/payments/payment_request_util.h"
 #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -115,7 +114,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kPaymentRequestDemoPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 }
 
 #pragma mark - Tests
diff --git a/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm
index b6e5a0d..b629b96b 100644
--- a/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm
@@ -61,7 +61,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"true"}];
 }
@@ -84,7 +84,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"true"}];
 }
@@ -94,7 +94,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -112,7 +112,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -130,7 +130,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -159,7 +159,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -198,14 +198,14 @@
       loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentCreditCardPage)]);
 
   // Query visa payment method.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // User does not have a visa card.
   [self waitForWebViewContainingTexts:{"false"}];
 
   // Query Mastercard payment method.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"other-buy"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"other-buy"]);
 
   // Query quota exceeded.
   [self
@@ -216,14 +216,14 @@
       [self addCreditCard:autofill::test::GetCreditCard()]);  // visa.
 
   // Query visa payment method.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // User has a visa card. While the query is cached, result is always fresh.
   [self waitForWebViewContainingTexts:{"true"}];
 
   // Query Mastercard payment method.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"other-buy"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"other-buy"]);
 
   // Query quota exceeded.
   [self
@@ -268,14 +268,14 @@
   // Query basic-card payment method with "supportedNetworks": ["visa"] in the
   // payment method specific data.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicVisa"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicVisa"]);
 
   // User does not have a visa card.
   [self waitForWebViewContainingTexts:{"false"}];
 
   // Query basic-card payment method without "supportedNetworks" parameter.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicCard"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicCard"]);
 
   // Query quota exceeded.
   [self
@@ -288,14 +288,14 @@
   // Query basic-card payment method with "supportedNetworks": ["visa"] in the
   // payment method specific data.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicVisa"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicVisa"]);
 
   // User has a visa card. While the query is cached, result is always fresh.
   [self waitForWebViewContainingTexts:{"true"}];
 
   // Query basic-card payment method without "supportedNetworks" parameter.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicCard"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"checkBasicCard"]);
 
   // Query quota exceeded.
   [self
diff --git a/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
index 4f25283..4d71c58 100644
--- a/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
@@ -19,7 +19,6 @@
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/web/public/test/http_server/http_server.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -55,7 +54,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -74,7 +73,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -92,7 +91,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -117,7 +116,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -148,7 +147,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -184,7 +183,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -221,13 +220,13 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
       assertWithMatcher:grey_notNil()];
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"abort"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"abort"]);
 
   // Confirm that the error confirmation UI is showing.
   [[EarlGrey
diff --git a/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm
index d60aff3..b3d54bc 100644
--- a/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm
@@ -37,7 +37,7 @@
                    "e; }\">Data URL Test</button><div "
                    "id='result'></div></body></html>")]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"SecurityError",
                                        "Failed to construct 'PaymentRequest': "
diff --git a/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm
index 5e08225cb..6a80846 100644
--- a/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm
@@ -105,7 +105,7 @@
   [self addServerCardWithType:DEBIT];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]);
 
   [self waitForWebViewContainingTexts:{"true"}];
 }
@@ -122,7 +122,7 @@
   [self addServerCardWithType:UNKNOWN];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]);
 
   [self waitForWebViewContainingTexts:{"true"}];
 }
@@ -136,7 +136,7 @@
   [self addServerCardWithType:PREPAID];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -152,7 +152,7 @@
 
   [self addServerCardWithType:DEBIT];
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -171,7 +171,7 @@
 
   [self addServerCardWithType:UNKNOWN];
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -194,7 +194,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
diff --git a/ios/chrome/browser/ui/payments/payment_request_egtest_base.mm b/ios/chrome/browser/ui/payments/payment_request_egtest_base.mm
index 40a74480..606dbe3 100644
--- a/ios/chrome/browser/ui/payments/payment_request_egtest_base.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_egtest_base.mm
@@ -26,7 +26,6 @@
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/testing/nserror_util.h"
 #import "ios/web/public/test/http_server/http_server.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -132,7 +131,7 @@
 - (void)waitForWebViewContainingTexts:(const std::vector<std::string>&)texts {
   for (const std::string& text : texts)
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:text]);
+        [ChromeEarlGrey waitForWebStateContainingText:text]);
 }
 
 - (autofill::PersonalDataManager*)personalDataManager {
diff --git a/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
index 0209489..d5312fd 100644
--- a/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
@@ -73,7 +73,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_no_shipping_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   // Make sure the correct events were logged.
@@ -129,7 +129,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_bobpay_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   [self waitForWebViewContainingTexts:{"rejected"}];
 
   FailureBlock failureBlock = ^(NSString* error) {
@@ -193,9 +193,9 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_multiple_show_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"showAgain"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"showAgain"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   // Trying to show the same request twice is not considered a concurrent
@@ -268,7 +268,7 @@
 
   [self loadTestPage:
             "payment_request_contact_details_and_free_shipping_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   FailureBlock failureBlock = ^(NSString* error) {
@@ -341,7 +341,7 @@
 
   [self loadTestPage:
             "payment_request_contact_details_and_free_shipping_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
@@ -418,7 +418,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_contact_details_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   FailureBlock failureBlock = ^(NSString* error) {
@@ -492,7 +492,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_contact_details_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
@@ -572,7 +572,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_free_shipping_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   FailureBlock failureBlock = ^(NSString* error) {
@@ -647,7 +647,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_free_shipping_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
@@ -721,7 +721,7 @@
 
   [self loadTestPage:"payment_request_can_make_payment_metrics_test.html"];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"queryNoShow"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"queryNoShow"]);
 
   // Navigate away to abort the Payment Request and trigger the logs.
   [self loadTestPage:"payment_request_email_test.html"];
@@ -767,7 +767,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_email_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Navigate away to abort the Payment Request and trigger the logs.
   [self loadTestPage:"payment_request_email_test.html"];
@@ -818,7 +818,7 @@
   [self addProfiles];  // The user has no form of payment on file.
 
   [self loadTestPage:"payment_request_email_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Navigate away to abort the Payment Request and trigger the logs.
   [self loadTestPage:"payment_request_email_test.html"];
@@ -870,7 +870,7 @@
   [self addCard2];  // AMEX is not supported by the merchant.
 
   [self loadTestPage:"payment_request_email_test.html"];
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Navigate away to abort the Payment Request and trigger the logs.
   [self loadTestPage:"payment_request_email_test.html"];
diff --git a/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm
index a98c489..74615eb3 100644
--- a/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm
@@ -104,7 +104,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Verify there's no line item.
   [[EarlGrey selectElementWithMatcher:PriceCellMatcher(@"Total, USD $5.00", NO)]
@@ -119,7 +119,7 @@
 
   [self addLocalCard];
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_localCard)]
@@ -148,7 +148,7 @@
 
   [self addServerCardWithType:CREDIT];
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
@@ -178,7 +178,7 @@
   [self addServerCardWithType:CREDIT];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"credit_supported_type"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"credit_supported_type"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
@@ -204,7 +204,7 @@
   [self addServerCardWithType:CREDIT];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"debit_supported_type"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"debit_supported_type"]);
 
   // Verify there's no line item.
   [[EarlGrey selectElementWithMatcher:PriceCellMatcher(@"Total, USD $5.00", NO)]
@@ -224,7 +224,7 @@
   [self addServerCardWithType:CREDIT];
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:@"mastercard_any_supported_type"]);
+      tapWebStateElementWithID:@"mastercard_any_supported_type"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
@@ -250,7 +250,7 @@
   [self addLocalCard];
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:@"mastercard_any_supported_type"]);
+      tapWebStateElementWithID:@"mastercard_any_supported_type"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_localCard)]
@@ -274,8 +274,8 @@
 
   [self addServerCardWithType:CREDIT];
 
-  CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"mastercard_supported_network"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"mastercard_supported_network"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm
index cc893ab..5eeb2fd 100644
--- a/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm
@@ -45,7 +45,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"NotSupportedError",
                                        "The payment method is not supported"}];
@@ -58,7 +58,7 @@
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"canMakePayment"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm
index 22da94e0..3d90de64 100644
--- a/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm
@@ -46,7 +46,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   const payments::PaymentRequestCache::PaymentRequestSet& requests =
       [self paymentRequestsForWebState:GetCurrentWebState()];
@@ -68,7 +68,7 @@
       loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"buyBasicCard"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"buyBasicCard"]);
 
   const payments::PaymentRequestCache::PaymentRequestSet& requests =
       [self paymentRequestsForWebState:GetCurrentWebState()];
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm
index cecb277d..3a58a44 100644
--- a/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm
@@ -20,7 +20,6 @@
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/web/public/test/http_server/http_server.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -71,7 +70,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
@@ -139,7 +138,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
@@ -194,7 +193,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kContactDetailsPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
@@ -231,7 +230,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kRequestEmailPage)]);
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
diff --git a/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm
index b5ba08c..b46fbc9 100644
--- a/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm
@@ -66,7 +66,7 @@
       loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"buyWithNoPromise"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"buyWithNoPromise"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -97,7 +97,7 @@
       forConfigKey:kGREYConfigKeySynchronizationEnabled];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"buyWithResolvingPromise"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"buyWithResolvingPromise"]);
 
   // Wait until the payment request view shows.
   ConditionBlock condition = ^{
@@ -151,7 +151,7 @@
       forConfigKey:kGREYConfigKeySynchronizationEnabled];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"buyWithRejectingPromise"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"buyWithRejectingPromise"]);
 
   // Wait until the payment request view shows.
   ConditionBlock condition = ^{
diff --git a/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm
index 677234f3..35b50f8 100644
--- a/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm
@@ -67,7 +67,7 @@
 
 // Completes the Payment Request.
 - (void)completePayment {
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h
index a74fd93..8b8af06 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONSTANTS_H_
 #define IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONSTANTS_H_
 
-#import <UIKit/UIKit.h>
+#import <Foundation/Foundation.h>
 
 // Accessibility IDs for the table view in various kinds of popup menus.
 extern NSString* const kPopupMenuToolsMenuTableViewId;
diff --git a/ios/chrome/browser/ui/popup_menu/request_desktop_mobile_site_egtest.mm b/ios/chrome/browser/ui/popup_menu/request_desktop_mobile_site_egtest.mm
index 8be3e09..b452545 100644
--- a/ios/chrome/browser/ui/popup_menu/request_desktop_mobile_site_egtest.mm
+++ b/ios/chrome/browser/ui/popup_menu/request_desktop_mobile_site_egtest.mm
@@ -108,19 +108,19 @@
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 
   // Verify that desktop user agent propagates.
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 }
 
 // Tests that requesting desktop site of a page works and desktop user agent
@@ -134,20 +134,20 @@
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 
   // Verify that desktop user agent does not propagate to new tab.
   [ChromeEarlGreyUI openNewTab];
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 }
 
 // Tests that requesting desktop site of a page works and going back re-opens
@@ -161,19 +161,19 @@
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 
   // Verify that going back returns to the mobile site.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 }
 
 // Tests that requesting mobile site of a page works and the user agent
@@ -187,25 +187,25 @@
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 
   // Request and verify reception of the mobile site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestMobileButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Verify that mobile user agent propagates.
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 }
 
 // Tests that requesting mobile site of a page works and going back re-opens
@@ -219,25 +219,25 @@
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 
   // Request and verify reception of the mobile site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestMobileButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Verify that going back returns to the desktop site.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 }
 
 // Tests that requesting desktop site button is not enabled on new tab pages.
@@ -268,13 +268,13 @@
       loadURL:web::test::HttpServer::MakeUrl(kUserAgentTestURL)]);
   // Verify initial reception of the mobile site.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 }
 
 // Tests that navigator.appVersion JavaScript API returns correct string for
@@ -285,19 +285,19 @@
       loadURL:web::test::HttpServer::MakeUrl(kUserAgentTestURL)]);
   // Verify initial reception of the mobile site.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDesktopSiteLabel]);
 
   // Request and verify reception of the mobile site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestMobileButton() performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kMobileSiteLabel]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/print/print_controller_egtest.mm b/ios/chrome/browser/ui/print/print_controller_egtest.mm
index 46e448b5..3708471 100644
--- a/ios/chrome/browser/ui/print/print_controller_egtest.mm
+++ b/ios/chrome/browser/ui/print/print_controller_egtest.mm
@@ -59,7 +59,7 @@
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:response]);
+      [ChromeEarlGrey waitForWebStateContainingText:response]);
 
   [self printCurrentPage];
 }
diff --git a/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm b/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm
index c231d56e..ad007a06 100644
--- a/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm
@@ -117,7 +117,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::NewTabPageOmnibox()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+      [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
                           chrome_test_util::Omnibox()]);
 
   // Tap the QR Code scanner button in the keyboard accessory view.
@@ -778,7 +778,7 @@
     TapKeyboardReturnKeyInOmniboxWithText(result);
   }
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:response]);
+      [ChromeEarlGrey waitForWebStateContainingText:response]);
 
   // Press the back button to get back to the NTP.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
index 4bf0762..ad45b63 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
+++ b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
@@ -401,7 +401,7 @@
     bool online,
     const GURL& distillable_url) {
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep]);
+      [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           distillable_url.GetContent())]
@@ -410,14 +410,14 @@
   // Test that the offline and online pages are properly displayed.
   if (online) {
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:kContentToRemove]);
+        [ChromeEarlGrey waitForWebStateContainingText:kContentToRemove]);
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep]);
+        [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]);
   } else {
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewNotContainingText:kContentToRemove]);
+        [ChromeEarlGrey waitForWebStateNotContainingText:kContentToRemove]);
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep]);
+        [ChromeEarlGrey waitForWebStateContainingText:kContentToKeep]);
   }
 
   // Test the presence of the omnibox offline chip.
@@ -457,12 +457,12 @@
   // Test that the offline and online pages are properly displayed.
   if (online) {
     CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-        waitForWebViewContainingText:base::SysNSStringToUTF8(contentToKeep)]);
+        waitForWebStateContainingText:base::SysNSStringToUTF8(contentToKeep)]);
     CHROME_EG_ASSERT_NO_ERROR(
         [ChromeEarlGrey waitForStaticHTMLViewNotContainingText:contentToKeep]);
   } else {
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewNotContainingText:kContentToKeep]);
+        [ChromeEarlGrey waitForWebStateNotContainingText:kContentToKeep]);
     CHROME_EG_ASSERT_NO_ERROR(
         [ChromeEarlGrey waitForStaticHTMLViewContainingText:contentToKeep]);
   }
diff --git a/ios/chrome/browser/ui/recent_tabs/BUILD.gn b/ios/chrome/browser/ui/recent_tabs/BUILD.gn
index bef8e86..aa5c206 100644
--- a/ios/chrome/browser/ui/recent_tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/recent_tabs/BUILD.gn
@@ -130,6 +130,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/ui/authentication:eg_test_support",
+    "//ios/chrome/browser/ui/history:constants",
     "//ios/chrome/browser/ui/history:history_ui",
     "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm
index fe2933c..c28a096 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm
@@ -111,7 +111,7 @@
   // Open the test page in a new tab.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"hello"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"hello"]);
 
   // Open the Recent Tabs panel, check that the test page is not
   // present.
@@ -145,7 +145,7 @@
   // Open the test page in a new tab.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"hello"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"hello"]);
 
   // Open a new incognito tab, then close the non-OTR tab.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
diff --git a/ios/chrome/browser/ui/sad_tab/sad_tab_view_egtest.mm b/ios/chrome/browser/ui/sad_tab/sad_tab_view_egtest.mm
index 431b9f33..c5c4a82 100644
--- a/ios/chrome/browser/ui/sad_tab/sad_tab_view_egtest.mm
+++ b/ios/chrome/browser/ui/sad_tab/sad_tab_view_egtest.mm
@@ -94,7 +94,7 @@
   void (^loadAndCheckSimpleURL)() = ^void() {
     CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:simple_URL]);
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
+        [ChromeEarlGrey waitForWebStateContainingText:"You've arrived"]);
     [[EarlGrey selectElementWithMatcher:reloadSadTabTitleText()]
         assertWithMatcher:grey_nil()];
     [[EarlGrey selectElementWithMatcher:feedbackSadTabTitleContainsText()]
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index 6b80ffa..79e69de1 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -361,6 +361,7 @@
     "//components/search_engines",
     "//components/strings",
     "//components/ukm/ios:features",
+    "//components/unified_consent",
     "//ios/chrome/app:app_internal",
     "//ios/chrome/app/strings",
     "//ios/chrome/app/theme",
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_settings_egtest.mm b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_settings_egtest.mm
index fbea7916..6c9402db 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_settings_egtest.mm
@@ -15,7 +15,6 @@
 #import "ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm
index 4ae16af..6880e45 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm
@@ -15,7 +15,6 @@
 #import "ios/chrome/browser/ui/settings/autofill/autofill_profile_edit_table_view_controller.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/ui/settings/block_popups_egtest.mm b/ios/chrome/browser/ui/settings/block_popups_egtest.mm
index 7326627f..4587420 100644
--- a/ios/chrome/browser/ui/settings/block_popups_egtest.mm
+++ b/ios/chrome/browser/ui/settings/block_popups_egtest.mm
@@ -12,7 +12,6 @@
 #include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
@@ -23,7 +22,6 @@
 #include "ios/chrome/test/scoped_block_popups_pref.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #include "ios/web/public/test/http_server/http_server_util.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 #include "url/gurl.h"
 
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index a301f22..2a3ce89d 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -140,7 +140,6 @@
   // Add a tableFooterView in order to disable separators at the bottom of the
   // tableView.
   self.tableView.tableFooterView = [[UIView alloc] init];
-  self.tableView.allowsMultipleSelection = YES;
   // Navigation controller configuration.
   self.title = l10n_util::GetNSString(IDS_IOS_CLEAR_BROWSING_DATA_TITLE);
   // Adds the "Done" button and hooks it up to |dismiss|.
@@ -164,21 +163,7 @@
   [self.dataManager restartCounters:BrowsingDataRemoveMask::REMOVE_ALL];
 
   if (IsNewClearBrowsingDataUIEnabled()) {
-    // Maintain selection state consistency.
-    NSArray* dataTypeItems = [self.tableViewModel
-        itemsInSectionWithIdentifier:SectionIdentifierDataTypes];
-    for (TableViewClearBrowsingDataItem* dataTypeItem in dataTypeItems) {
-      DCHECK(
-          [dataTypeItem isKindOfClass:[TableViewClearBrowsingDataItem class]]);
-      if (dataTypeItem.checked) {
-        [self.tableView selectRowAtIndexPath:[self.tableViewModel
-                                                 indexPathForItem:dataTypeItem]
-                                    animated:NO
-                              scrollPosition:UITableViewScrollPositionNone];
-      }
-    }
     [self updateToolbarButtons];
-
     // Showing toolbar here because parent class hides toolbar in
     // viewWillDisappear:.
     self.navigationController.toolbarHidden = NO;
@@ -306,7 +291,12 @@
       case ItemTypeDataTypeCache:
       case ItemTypeDataTypeSavedPasswords:
       case ItemTypeDataTypeAutofill: {
-        [self reconfigureCellAndUpdateItem:item toCheckedValue:YES];
+        DCHECK([item isKindOfClass:[TableViewClearBrowsingDataItem class]]);
+        TableViewClearBrowsingDataItem* clearBrowsingDataItem =
+            base::mac::ObjCCastStrict<TableViewClearBrowsingDataItem>(item);
+        clearBrowsingDataItem.checked = !clearBrowsingDataItem.checked;
+        [self reconfigureCellsForItems:@[ clearBrowsingDataItem ]];
+        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
         break;
       }
       default:
@@ -340,28 +330,6 @@
   }
 }
 
-- (void)tableView:(UITableView*)tableView
-    didDeselectRowAtIndexPath:(NSIndexPath*)indexPath {
-  if (!IsNewClearBrowsingDataUIEnabled()) {
-    return;
-  }
-  TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath];
-  DCHECK(item);
-  switch (item.type) {
-    case ItemTypeDataTypeBrowsingHistory:
-    case ItemTypeDataTypeCookiesSiteData:
-    case ItemTypeDataTypeCache:
-    case ItemTypeDataTypeSavedPasswords:
-    case ItemTypeDataTypeAutofill: {
-      [self reconfigureCellAndUpdateItem:item toCheckedValue:NO];
-      break;
-    }
-    default:
-      break;
-  }
-  [self updateToolbarButtons];
-}
-
 #pragma mark - TableViewTextLinkCellDelegate
 
 - (void)tableViewTextLinkCell:(TableViewTextLinkCell*)cell
@@ -381,20 +349,6 @@
   // thus the cell height needs to adapt accordingly.
   [self reloadCellsForItems:@[ item ]
            withRowAnimation:UITableViewRowAnimationAutomatic];
-
-  // Restore a cell's seleted state potentially cleared by the above reload
-  // method.
-  if (IsNewClearBrowsingDataUIEnabled() &&
-      [item isKindOfClass:[TableViewClearBrowsingDataItem class]]) {
-    TableViewClearBrowsingDataItem* dataTypeItem =
-        base::mac::ObjCCastStrict<TableViewClearBrowsingDataItem>(item);
-    if (dataTypeItem.checked) {
-      [self.tableView selectRowAtIndexPath:[self.tableViewModel
-                                               indexPathForItem:dataTypeItem]
-                                  animated:NO
-                            scrollPosition:UITableViewScrollPositionNone];
-    }
-  }
 }
 
 - (void)removeBrowsingDataForBrowserState:(ios::ChromeBrowserState*)browserState
@@ -503,16 +457,6 @@
   [self.actionSheetCoordinator start];
 }
 
-// Sets |item|'s checked to |value|, then invokes cell configuration.
-- (void)reconfigureCellAndUpdateItem:(TableViewItem*)item
-                      toCheckedValue:(BOOL)value {
-  DCHECK([item isKindOfClass:[TableViewClearBrowsingDataItem class]]);
-  TableViewClearBrowsingDataItem* clearBrowsingDataItem =
-      base::mac::ObjCCastStrict<TableViewClearBrowsingDataItem>(item);
-  clearBrowsingDataItem.checked = value;
-  [self reconfigureCellsForItems:@[ clearBrowsingDataItem ]];
-}
-
 - (void)updateToolbarButtons {
   self.clearBrowsingDataBarButton.enabled = [self hasDataTypeItemsSelected];
 }
diff --git a/ios/chrome/browser/ui/settings/google_services/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
index 7dee5dc..66bd99e 100644
--- a/ios/chrome/browser/ui/settings/google_services/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
@@ -90,6 +90,7 @@
     "//components/browser_sync",
     "//components/strings",
     "//components/sync",
+    "//components/unified_consent",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state",
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
index 292b8e35..847f782 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
@@ -12,6 +12,7 @@
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/engine/sync_encryption_handler.h"
 #include "components/sync/protocol/proto_value_conversions.h"
+#include "components/unified_consent/feature.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h"
 #include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.h"
@@ -38,6 +39,7 @@
 
 using chrome_test_util::AccountsSyncButton;
 using chrome_test_util::ButtonWithAccessibilityLabel;
+using chrome_test_util::GoogleServicesSettingsButton;
 using chrome_test_util::SettingsAccountButton;
 using chrome_test_util::SettingsDoneButton;
 using chrome_test_util::SignOutAccountsButton;
@@ -70,7 +72,9 @@
   [SigninEarlGreyUI signinWithIdentity:identity];
   [ChromeEarlGreyUI openSettingsMenu];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()];
-  [ChromeEarlGreyUI tapAccountsMenuButton:AccountsSyncButton()];
+  if (!unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    [ChromeEarlGreyUI tapAccountsMenuButton:AccountsSyncButton()];
+  }
 
   // Forget |identity|, screens should be popped back to the Main Settings.
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
@@ -148,6 +152,13 @@
 // Tests that the Sync Settings screen is correctly reloaded when one of the
 // secondary accounts disappears.
 - (void)testSignInReloadSyncOnForgetIdentity {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    EARL_GREY_TEST_DISABLED(
+        @"Sync section was moved to the Sync and Google services settings "
+         "screen, so it is no longer present in the account settings screen. "
+         "This test is now covered by GoogleServicesSettingsTestCase.");
+  }
+
   ios::FakeChromeIdentityService* identity_service =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
   ChromeIdentity* identity1 = [SigninEarlGreyUtils fakeIdentity1];
@@ -246,6 +257,8 @@
 - (void)checkSyncCellWithExpectedTextLabelCallback:
     (ExpectedTextLabelCallback)callback {
   NSAssert(callback, @"Need callback");
+  NSAssert(!unified_consent::IsUnifiedConsentFeatureEnabled(),
+           @"Only runs when unified consent is disabled");
   ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
 
   // Sign In |identity|, then open the Account Settings.
@@ -272,6 +285,12 @@
 
 // Tests the sync cell is correctly configured when having a MDM error.
 - (void)testMDMError {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    EARL_GREY_TEST_DISABLED(
+        @"Sync section was moved to the Sync and Google services settings "
+         "screen, so it is no longer present in the account settings screen. "
+         "This test is now covered by GoogleServicesSettingsTestCase.");
+  }
   ios::FakeChromeIdentityService* fakeChromeIdentityService =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
   fakeChromeIdentityService->SetFakeMDMError(true);
@@ -283,6 +302,13 @@
 
 // Tests the sync cell is correctly configured when no error.
 - (void)testSyncItemWithSyncingMessage {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    EARL_GREY_TEST_DISABLED(
+        @"Sync section was moved to the Sync and Google services settings "
+         "screen, so it is no longer present in the account settings screen. "
+         "This test is now covered by GoogleServicesSettingsTestCase.");
+  }
+
   ExpectedTextLabelCallback callback = ^(NSString* identityEmail) {
     return l10n_util::GetNSStringF(IDS_IOS_SIGN_IN_TO_CHROME_SETTING_SYNCING,
                                    base::SysNSStringToUTF16(identityEmail));
@@ -292,6 +318,13 @@
 
 // Tests the sync cell is correctly configured when the passphrase is required.
 - (void)testSyncItemWithPassphraseRequired {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    EARL_GREY_TEST_DISABLED(
+        @"Sync section was moved to the Sync and Google services settings "
+         "screen, so it is no longer present in the account settings screen. "
+         "This test is now covered by GoogleServicesSettingsTestCase.");
+  }
+
   ExpectedTextLabelCallback callback = ^(NSString* identityEmail) {
     ios::ChromeBrowserState* browser_state =
         chrome_test_util::GetOriginalBrowserState();
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
index 1a9fe1c..41ad9e3 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
@@ -45,6 +45,9 @@
 
 namespace {
 
+NSString* const kBetterSearchAndBrowsingItemAccessibilityID =
+    @"betterSearchAndBrowsingItem_switch";
+
 // List of sections.
 typedef NS_ENUM(NSInteger, SectionIdentifier) {
   IdentitySectionIdentifier = kSectionIdentifierEnumZero,
@@ -554,6 +557,8 @@
                 detailStringID:
                     IDS_IOS_GOOGLE_SERVICES_SETTINGS_BETTER_SEARCH_AND_BROWSING_DETAIL
                       dataType:0];
+    betterSearchAndBrowsingItemType.accessibilityIdentifier =
+        kBetterSearchAndBrowsingItemAccessibilityID;
     _nonPersonalizedItems = @[
       autocompleteSearchesAndURLsItem, improveChromeItem,
       betterSearchAndBrowsingItemType
diff --git a/ios/chrome/browser/ui/settings/settings_egtest.mm b/ios/chrome/browser/ui/settings/settings_egtest.mm
index a83e85d3..64ae7d9 100644
--- a/ios/chrome/browser/ui/settings/settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/settings_egtest.mm
@@ -18,6 +18,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/ukm/ios/features.h"
+#include "components/unified_consent/feature.h"
 #import "ios/chrome/app/main_controller.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h"
@@ -28,7 +29,6 @@
 #include "ios/chrome/grit/ios_theme_resources.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
@@ -37,7 +37,6 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #include "ios/web/public/test/http_server/http_server_util.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #import "ios/web/public/web_state/web_state.h"
 #include "ios/web/public/web_task_traits.h"
 #include "ios/web/public/web_thread.h"
@@ -463,7 +462,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse]);
 
   NSDictionary* cookies = [ChromeEarlGrey cookies];
   GREYAssertEqual(0U, cookies.count, @"No cookie should be found.");
@@ -473,11 +472,11 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:web::test::HttpServer::MakeUrl(kUrlWithSetCookie)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponseWithSetCookie]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponseWithSetCookie]);
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse]);
 
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kCookieValue, cookies[kCookieName],
@@ -498,7 +497,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse]);
 
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqual(0U, cookies.count, @"No cookie should be found.");
@@ -709,10 +708,20 @@
                 @"Settings should not register key commands when presented.");
 
   // Dismiss the Sign-in UI.
-  id<GREYMatcher> cancelButton =
-      grey_allOf(grey_accessibilityID(@"cancel"),
-                 grey_accessibilityTrait(UIAccessibilityTraitButton), nil);
-  [[EarlGrey selectElementWithMatcher:cancelButton] performAction:grey_tap()];
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // Cancel the sign-in operation.
+    [[EarlGrey selectElementWithMatcher:
+                   grey_buttonTitle([l10n_util::GetNSString(
+                       IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON)
+                       uppercaseString])] performAction:grey_tap()];
+  } else {
+    // Cancel the add account operation.
+    [[EarlGrey
+        selectElementWithMatcher:grey_allOf(grey_buttonTitle(@"Cancel"),
+                                            grey_sufficientlyVisible(), nil)]
+        performAction:grey_tap()];
+  }
+
   // Wait for UI to finish closing the Sign-in screen.
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
 
@@ -723,6 +732,13 @@
 
 // Verifies the UI elements are accessible on the Send Usage Data page.
 - (void)testAccessibilityOnSendUsageData {
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    EARL_GREY_TEST_DISABLED(
+        @"Privacy switch for ContentSuggestion was moved to the Sync and "
+         "Google services settings screen, so it is no longer present in the "
+         "privacy section. This test is now covered by "
+         "-[GoogleServicesSettingsTestCase testOpeningServices].");
+  }
   [ChromeEarlGreyUI openSettingsMenu];
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsMenuPrivacyButton()];
   [ChromeEarlGreyUI tapPrivacyMenuButton:SendUsageDataButton()];
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index 76452231..b15e12c3 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -1210,8 +1210,7 @@
     // (including the corresponding AccountViewBase).
     ios::GetChromeBrowserProvider()
         ->GetChromeIdentityService()
-        ->GetAvatarForIdentity(_identity, ^(UIImage*){
-                               });
+        ->GetAvatarForIdentity(_identity, nil);
   }
 
   // If the currently used image has already been resized, use it.
diff --git a/ios/chrome/browser/ui/settings/signin_settings_egtest.mm b/ios/chrome/browser/ui/settings/signin_settings_egtest.mm
index abe03b30..9f76d33 100644
--- a/ios/chrome/browser/ui/settings/signin_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/signin_settings_egtest.mm
@@ -6,6 +6,7 @@
 
 #include "base/strings/sys_string_conversions.h"
 #include "components/prefs/pref_service.h"
+#include "components/unified_consent/feature.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/pref_names.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h"
@@ -19,6 +20,7 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h"
+#include "ui/base/l10n/l10n_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -42,10 +44,19 @@
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
   [ChromeEarlGreyUI tapSettingsMenuButton:PrimarySignInButton()];
 
-  [[EarlGrey
-      selectElementWithMatcher:grey_allOf(grey_buttonTitle(@"Cancel"),
-                                          grey_sufficientlyVisible(), nil)]
-      performAction:grey_tap()];
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    // Cancel the sign-in operation.
+    [[EarlGrey selectElementWithMatcher:
+                   grey_buttonTitle([l10n_util::GetNSString(
+                       IDS_IOS_ACCOUNT_CONSISTENCY_SETUP_SKIP_BUTTON)
+                       uppercaseString])] performAction:grey_tap()];
+  } else {
+    // Cancel the add account operation.
+    [[EarlGrey
+        selectElementWithMatcher:grey_allOf(grey_buttonTitle(@"Cancel"),
+                                            grey_sufficientlyVisible(), nil)]
+        performAction:grey_tap()];
+  }
   [SigninEarlGreyUI
       checkSigninPromoVisibleWithMode:SigninPromoViewModeColdState];
 }
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
index 17fb838..53d720d 100644
--- a/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
+++ b/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
@@ -56,7 +56,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Echo"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Echo"]);
 
   // Open a new Tab to have a tab to switch to.
   [ChromeEarlGreyUI openNewTab];
@@ -65,7 +65,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/defaultresponse")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Default response"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Default response"]);
 
   // Side swipe on the toolbar.
   [[EarlGrey selectElementWithMatcher:grey_kindOfClass(klass)]
@@ -73,7 +73,7 @@
 
   // Check that we swiped back to our web page.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Echo"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Echo"]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm
index 1650142..b52269b 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm
@@ -145,15 +145,15 @@
 - (void)loadTestURLs {
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse1]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL2]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse2]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL3]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kResponse3]);
+      [ChromeEarlGrey waitForWebStateContainingText:kResponse3]);
 }
 
 // Test that Clear Browsing Data can be successfully done from tab grid.
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm
index e08a4a7..f8ee54e6 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm
@@ -204,7 +204,7 @@
 
   // Verify that the original tab is visible again.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]);
 }
 
 // Tests exiting the switcher by tapping the new tab button or selecting new tab
@@ -222,7 +222,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]);
 }
 
 // Tests exiting the switcher by tapping the new incognito tab button or
@@ -244,7 +244,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]);
 }
 
 // Tests exiting the switcher by opening a new tab in the other tab model.
@@ -264,7 +264,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(incognito_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(incognito_title)]);
 
   // Go from incognito mode to normal mode.
   ShowTabSwitcher();
@@ -277,7 +277,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(normal_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(normal_title)]);
 }
 
 // Tests exiting the tab switcher by selecting a normal tab.
@@ -300,12 +300,12 @@
   ShowTabSwitcher();
   SelectTab(tab1_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]);
 
   ShowTabSwitcher();
   SelectTab(tab3_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab3_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab3_title)]);
 }
 
 // Tests exiting the tab switcher by selecting an incognito tab.
@@ -330,12 +330,12 @@
   ShowTabSwitcher();
   SelectTab(tab1_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab1_title)]);
 
   ShowTabSwitcher();
   SelectTab(tab3_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab3_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab3_title)]);
 }
 
 // Tests exiting the tab switcher by selecting a tab in the other tab model.
@@ -357,7 +357,7 @@
       performAction:grey_tap()];
   SelectTab(normal_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(normal_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(normal_title)]);
 
   ShowTabSwitcher();
   // Switch to the incognito panel and select the one tab that is there.
@@ -366,7 +366,7 @@
 
   SelectTab(incognito_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(incognito_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(incognito_title)]);
 }
 
 // Tests switching back and forth between the normal and incognito BVCs.
@@ -400,7 +400,7 @@
   ShowTabSwitcher();
   SelectTab(tab_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]);
 
   // Show the tab switcher and return to the BVC, in landscape.
   [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationLandscapeLeft
@@ -408,7 +408,7 @@
   ShowTabSwitcher();
   SelectTab(tab_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]);
 
   // Show the tab switcher and return to the BVC, in portrait.
   [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationPortrait
@@ -416,7 +416,7 @@
   ShowTabSwitcher();
   SelectTab(tab_title);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)]);
+      waitForWebStateContainingText:base::SysNSStringToUTF8(tab_title)]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
index d205e2e..671c231 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
+++ b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
@@ -498,6 +498,7 @@
 
 - (void)hideTabStrip:(BOOL)hidden {
   self.view.hidden = hidden;
+  [self updateTabSwitcherGuide];
 }
 
 #pragma mark - Private
@@ -727,9 +728,13 @@
 - (void)updateTabSwitcherGuide {
   NamedGuide* tabSwitcherGuide =
       [NamedGuide guideWithName:kTabStripTabSwitcherGuide view:self.view];
-  tabSwitcherGuide.constrainedFrame =
-      [_tabSwitcherButton.superview convertRect:_tabSwitcherButton.frame
-                                         toView:tabSwitcherGuide.owningView];
+  if (self.view.hidden) {
+    tabSwitcherGuide.constrainedFrame = CGRectZero;
+  } else {
+    tabSwitcherGuide.constrainedFrame =
+        [_tabSwitcherButton.superview convertRect:_tabSwitcherButton.frame
+                                           toView:tabSwitcherGuide.owningView];
+  }
 }
 
 #pragma mark -
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
index d7262a5..bc91336 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -51,7 +51,7 @@
   [[EarlGrey selectElementWithMatcher:OmniboxText(URL.GetContent())]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"You've arrived"]);
 }
 
 // Verifies opening a new tab from the tools menu.
@@ -434,7 +434,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::NewTabPageOmnibox()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+      [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher:
                           chrome_test_util::Omnibox()]);
 
   // Tap the "/" keyboard accessory button.
diff --git a/ios/chrome/browser/ui/webui/inspect/inspect_ui_egtest.mm b/ios/chrome/browser/ui/webui/inspect/inspect_ui_egtest.mm
index 7cad473..3253acd 100644
--- a/ios/chrome/browser/ui/webui/inspect/inspect_ui_egtest.mm
+++ b/ios/chrome/browser/ui/webui/inspect/inspect_ui_egtest.mm
@@ -10,7 +10,6 @@
 #include "ios/chrome/browser/chrome_url_constants.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -23,7 +22,6 @@
 #endif
 
 using chrome_test_util::GetCurrentWebState;
-using chrome_test_util::TapWebViewElementWithIdInIframe;
 
 namespace {
 // Directory containing the |kLogoPagePath| and |kLogoPageImageSourcePath|
@@ -116,21 +114,21 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+      [ChromeEarlGrey waitForWebStateContainingElement:StartLoggingButton()]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStartLoggingButtonId]);
 
   ElementSelector* stopLoggingButton = [ElementSelector
       selectorWithElementID:base::SysNSStringToUTF8(kStopLoggingButtonId)];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:stopLoggingButton]);
+      [ChromeEarlGrey waitForWebStateContainingElement:stopLoggingButton]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStopLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStopLoggingButtonId]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+      [ChromeEarlGrey waitForWebStateContainingElement:StartLoggingButton()]);
 }
 
 // Tests that log messages from a page's main frame are displayed.
@@ -139,9 +137,9 @@
 
   // Start logging.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+      [ChromeEarlGrey waitForWebStateContainingElement:StartLoggingButton()]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
@@ -149,43 +147,43 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string debugButtonID = base::SysNSStringToUTF8(kDebugMessageButtonId);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingElement:
+      waitForWebStateContainingElement:
           [ElementSelector selectorWithElementID:debugButtonID]]);
 
   // Log messages.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kDebugMessageButtonId]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kErrorMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kErrorMessageButtonId]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kInfoMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kInfoMessageButtonId]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kLogMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kLogMessageButtonId]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kWarningMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kWarningMessageButtonId]);
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   // Validate messages and labels are displayed.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageText]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kErrorMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kErrorMessageText]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kInfoMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kInfoMessageText]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogMessageText]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kWarningMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kWarningMessageText]);
 }
 
 // Tests that log messages from an iframe are displayed.
@@ -194,9 +192,9 @@
 
   // Start logging.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+      [ChromeEarlGrey waitForWebStateContainingElement:StartLoggingButton()]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
@@ -205,51 +203,51 @@
 
   std::string debugButtonID = base::SysNSStringToUTF8(kDebugMessageButtonId);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingElement:
+      waitForWebStateContainingElement:
           [ElementSelector selectorWithElementID:debugButtonID]]);
 
   // Log messages.
-  GREYAssertTrue(TapWebViewElementWithIdInIframe(debugButtonID),
-                 @"Failed to tap debug button.");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementInIFrameWithID:debugButtonID]);
 
   std::string errorButtonID = base::SysNSStringToUTF8(kErrorMessageButtonId);
-  GREYAssertTrue(TapWebViewElementWithIdInIframe(errorButtonID),
-                 @"Failed to tap error button.");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementInIFrameWithID:errorButtonID]);
 
   std::string infoButtonID = base::SysNSStringToUTF8(kInfoMessageButtonId);
-  GREYAssertTrue(TapWebViewElementWithIdInIframe(infoButtonID),
-                 @"Failed to tap info button.");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementInIFrameWithID:infoButtonID]);
 
   std::string logButtonID = base::SysNSStringToUTF8(kLogMessageButtonId);
-  GREYAssertTrue(TapWebViewElementWithIdInIframe(logButtonID),
-                 @"Failed to tap log button.");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementInIFrameWithID:logButtonID]);
 
   std::string warnButtonID = base::SysNSStringToUTF8(kWarningMessageButtonId);
-  GREYAssertTrue(TapWebViewElementWithIdInIframe(warnButtonID),
-                 @"Failed to tap warn button.");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementInIFrameWithID:warnButtonID]);
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   // Validate messages and labels are displayed.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kIFrameDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kIFrameDebugMessageText]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kErrorMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kIFrameErrorMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kIFrameErrorMessageText]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kInfoMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kIFrameInfoMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kIFrameInfoMessageText]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kIFrameLogMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kIFrameLogMessageText]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kWarningMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kIFrameWarningMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kIFrameWarningMessageText]);
 }
 
 // Tests that log messages are correctly displayed from multiple tabs.
@@ -258,9 +256,9 @@
 
   // Start logging.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+      [ChromeEarlGrey waitForWebStateContainingElement:StartLoggingButton()]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
@@ -268,39 +266,39 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string logButtonID = base::SysNSStringToUTF8(kLogMessageButtonId);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:logButtonID]]);
+      waitForWebStateContainingElement:[ElementSelector
+                                           selectorWithElementID:logButtonID]]);
 
   // Log a message and verify it is displayed.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kDebugMessageButtonId]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageText]);
 
   // Open console test page again.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:logButtonID]]);
+      waitForWebStateContainingElement:[ElementSelector
+                                           selectorWithElementID:logButtonID]]);
 
   // Log another message and verify it is displayed.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kLogMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kLogMessageButtonId]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLogMessageText]);
 
   // Ensure the log from the first tab still exists.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageText]);
 }
 
 // Tests that messages are cleared after stopping logging.
@@ -309,9 +307,9 @@
 
   // Start logging.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+      [ChromeEarlGrey waitForWebStateContainingElement:StartLoggingButton()]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
@@ -319,26 +317,26 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string logButtonID = base::SysNSStringToUTF8(kLogMessageButtonId);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:logButtonID]]);
+      waitForWebStateContainingElement:[ElementSelector
+                                           selectorWithElementID:logButtonID]]);
 
   // Log a message and verify it is displayed.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kDebugMessageButtonId]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageText]);
 
   // Stop logging.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStopLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStopLoggingButtonId]);
   // Ensure message was cleared.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:kDebugMessageText]);
 }
 
 // Tests that messages are cleared after a page reload.
@@ -347,9 +345,9 @@
 
   // Start logging.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+      [ChromeEarlGrey waitForWebStateContainingElement:StartLoggingButton()]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
@@ -357,25 +355,25 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string logButtonID = base::SysNSStringToUTF8(kLogMessageButtonId);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:logButtonID]]);
+      waitForWebStateContainingElement:[ElementSelector
+                                           selectorWithElementID:logButtonID]]);
 
   // Log a message and verify it is displayed.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kDebugMessageButtonId]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDebugMessageText]);
 
   // Reload page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
   // Ensure message was cleared.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:kDebugMessageText]);
 }
 
 // Tests that messages are cleared for a tab which is closed.
@@ -384,9 +382,9 @@
 
   // Start logging.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+      [ChromeEarlGrey waitForWebStateContainingElement:StartLoggingButton()]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
@@ -394,18 +392,18 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string debugButtonID = base::SysNSStringToUTF8(kDebugMessageButtonId);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForWebViewContainingElement:
+      waitForWebStateContainingElement:
           [ElementSelector selectorWithElementID:debugButtonID]]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
+      [ChromeEarlGrey tapWebStateElementWithID:kDebugMessageButtonId]);
   [ChromeEarlGrey closeCurrentTab];
 
   // Validate message and label are not displayed.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:kDebugMessageLabel]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:kDebugMessageText]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/webui/web_ui_egtest.mm b/ios/chrome/browser/ui/webui/web_ui_egtest.mm
index 5ffd7cc..e4c5525 100644
--- a/ios/chrome/browser/ui/webui/web_ui_egtest.mm
+++ b/ios/chrome/browser/ui/webui/web_ui_egtest.mm
@@ -13,7 +13,6 @@
 #include "ios/chrome/browser/chrome_url_constants.h"
 #include "ios/chrome/browser/system_flags.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -30,7 +29,6 @@
 
 using chrome_test_util::BackButton;
 using chrome_test_util::ForwardButton;
-using chrome_test_util::TapWebViewElementWithId;
 
 namespace {
 
@@ -87,13 +85,13 @@
   // Verify that app version is present on the page.
   const std::string version = version_info::GetVersionNumber();
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:version]);
+      [ChromeEarlGrey waitForWebStateContainingText:version]);
 
   // Verify that mobile User Agent string is present on the page.
   const std::string userAgent =
       web::GetWebClient()->GetUserAgent(web::UserAgentType::MOBILE);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:userAgent]);
+      [ChromeEarlGrey waitForWebStateContainingText:userAgent]);
 }
 
 // Tests that clicking on a chrome://terms link from chrome://chrome-urls
@@ -102,15 +100,16 @@
   LoadWebUIUrl(kChromeUIChromeURLsHost);
 
   // Tap on chrome://terms link on the page.
-  GREYAssert(TapWebViewElementWithId(kChromeUITermsHost), @"Failed to tap %s",
-             kChromeUITermsHost);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:[NSString
+                                   stringWithUTF8String:kChromeUITermsHost]]);
 
   // Verify that the resulting page is chrome://terms.
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText("chrome://terms")]
       assertWithMatcher:grey_notNil()];
   const std::string kTermsText = "Google Chrome Terms of Service";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTermsText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTermsText]);
 }
 
 // Tests that back navigation functions properly after navigation via anchor
@@ -119,14 +118,15 @@
   LoadWebUIUrl(kChromeUIChromeURLsHost);
 
   // Tap on chrome://version link on the page.
-  GREYAssert(TapWebViewElementWithId(kChromeUIVersionHost), @"Failed to tap %s",
-             kChromeUIVersionHost);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:[NSString
+                                   stringWithUTF8String:kChromeUIVersionHost]]);
 
   // Verify that the resulting page is chrome://version.
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText("chrome://version")]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"The Chromium Authors"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"The Chromium Authors"]);
 
   // Tap the back button in the toolbar and verify that the resulting page is
   // the previously visited page chrome://chrome-urls.
@@ -135,7 +135,7 @@
       selectElementWithMatcher:WaitForOmniboxText("chrome://chrome-urls")]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"List of Chrome URLs"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"List of Chrome URLs"]);
 }
 
 // Tests that back and forward navigation between chrome URLs functions
@@ -204,7 +204,7 @@
       assertWithMatcher:grey_notNil()];
   std::string errorMessage = net::ErrorToShortString(net::ERR_INVALID_URL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:errorMessage]);
+      [ChromeEarlGrey waitForWebStateContainingText:errorMessage]);
 }
 
 // Tests that repeated back/forward navigation from web URL is allowed.
@@ -221,28 +221,28 @@
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText(kChromeVersionURL)]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kChromeVersionWebText]);
 
   GURL webURL = self.testServer->GetURL("/pony.html");
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:webURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWebPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kWebPageText]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText(kChromeVersionURL)]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kChromeVersionWebText]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWebPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kWebPageText]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText(kChromeVersionURL)]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kChromeVersionWebText]);
 }
 
 @end
diff --git a/ios/chrome/browser/web/browsing_egtest.mm b/ios/chrome/browser/web/browsing_egtest.mm
index eaf6df1..8dfb938 100644
--- a/ios/chrome/browser/web/browsing_egtest.mm
+++ b/ios/chrome/browser/web/browsing_egtest.mm
@@ -14,7 +14,6 @@
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -39,7 +38,6 @@
 using chrome_test_util::GetOriginalBrowserState;
 using chrome_test_util::OmniboxText;
 using chrome_test_util::OmniboxContainingText;
-using chrome_test_util::TapWebViewElementWithId;
 
 namespace {
 
@@ -106,13 +104,13 @@
   std::string expectedBodyBeforeReload(
       ReloadResponseProvider::GetResponseBody(0 /* request number */));
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:expectedBodyBeforeReload]);
+      [ChromeEarlGrey waitForWebStateContainingText:expectedBodyBeforeReload]);
 
   [ChromeEarlGreyUI reload];
   std::string expectedBodyAfterReload(
       ReloadResponseProvider::GetResponseBody(1 /* request_number */));
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:expectedBodyAfterReload]);
+      [ChromeEarlGrey waitForWebStateContainingText:expectedBodyAfterReload]);
 }
 
 // Tests that a tab's title is based on the URL when no other information is
@@ -196,8 +194,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
-  GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
-
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Verify the new tab was opened with the expected URL.
@@ -227,7 +224,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
-  GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
@@ -270,8 +267,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
-  GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
-
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Verify the new tab was opened with the expected URL.
@@ -310,8 +306,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
-  GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
-
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Verify the new tab was opened with the expected URL.
@@ -335,7 +330,7 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
-  GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
 
   [[EarlGrey selectElementWithMatcher:OmniboxText(destURL.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -343,7 +338,7 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Link"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Link"]);
   if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
     // Using partial match for Omnibox text because the displayed URL is now
     // "http://origin/#" due to the link click. This is consistent with all
@@ -384,14 +379,14 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // Tap on chrome://version link.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"link"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:@"link"]);
 
   // Verify that page did not change by checking its URL and message printed by
   // onclick event.
   [[EarlGrey selectElementWithMatcher:OmniboxText("chrome://version")]
       assertWithMatcher:grey_nil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Hello world!"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Hello world!"]);
 
   // Verify that no new tabs were open which could load chrome://version.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
@@ -458,7 +453,7 @@
   // Execute some JavaScript in the omnibox.
   [ChromeEarlGreyUI focusOmniboxAndType:@"javascript:document.write('foo')\n"];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"foo"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"foo"]);
 
   // Verify that the JavaScript did not affect history by going back and then
   // forward again.
diff --git a/ios/chrome/browser/web/browsing_prevent_default_egtest.mm b/ios/chrome/browser/web/browsing_prevent_default_egtest.mm
index 30493324..45e90ab4 100644
--- a/ios/chrome/browser/web/browsing_prevent_default_egtest.mm
+++ b/ios/chrome/browser/web/browsing_prevent_default_egtest.mm
@@ -9,7 +9,6 @@
 #include "base/strings/sys_string_conversions.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -24,7 +23,6 @@
 #endif
 
 using chrome_test_util::GetOriginalBrowserState;
-using chrome_test_util::TapWebViewElementWithId;
 
 namespace {
 
@@ -61,10 +59,12 @@
 
   // Tap on the test link and wait for the page to display "Click done", as an
   // indicator that the element was tapped.
-  GREYAssert(TapWebViewElementWithId(linkID), @"Failed to tap %s",
-             linkID.c_str());
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:
+          [NSString stringWithCString:linkID.c_str()
+                             encoding:[NSString defaultCStringEncoding]]]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Click done"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Click done"]);
 
   // Check that no navigation occurred and no new tabs were opened.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
@@ -101,7 +101,7 @@
 
   // Tap on the test link.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"overrides-window-open"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"overrides-window-open"]);
 
   // Check that the tab navigated to about:blank and no new tabs were opened.
   [[GREYCondition
diff --git a/ios/chrome/browser/web/cache_egtest.mm b/ios/chrome/browser/web/cache_egtest.mm
index e2ea843..c66a31c 100644
--- a/ios/chrome/browser/web/cache_egtest.mm
+++ b/ios/chrome/browser/web/cache_egtest.mm
@@ -10,7 +10,6 @@
 #include "base/strings/stringprintf.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -27,7 +26,6 @@
 #endif
 
 using chrome_test_util::GetOriginalBrowserState;
-using chrome_test_util::TapWebViewElementWithId;
 using web::test::HttpServer;
 
 namespace {
@@ -135,29 +133,30 @@
   // 1st hit to server. Verify that the server has the correct hit count.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:cacheTestFirstPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 1"]);
 
   // Navigate to another page. 2nd hit to server.
-  GREYAssert(chrome_test_util::TapWebViewElementWithId(kCacheTestLinkID),
-             @"Failed to tap %s", kCacheTestLinkID);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:[NSString
+                                   stringWithUTF8String:kCacheTestLinkID]]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 2"]);
 
   // Navigate back. This should not hit the server. Verify the page has been
   // loaded from cache. The serverHitCounter will remain the same.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 1"]);
 
   // Reload page. 3rd hit to server. Verify that page reload causes the
   // hitCounter to show updated value.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 3"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 3"]);
 
   // Verify that page reload causes Cache-Control value to be sent with request.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"cacheControl: max-age=0"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"cacheControl: max-age=0"]);
 }
 
 // Tests caching behavior when opening new tab. New tab should not use the
@@ -173,27 +172,28 @@
   // 1st hit to server. Verify title and hitCount.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:cacheTestFirstPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"First Page"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"First Page"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 1"]);
 
   // 2nd hit to server. Verify hitCount.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:cacheTestThirdPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 2"]);
 
   // Open the first page in a new tab. Verify that cache was not used. Must
   // first allow popups.
   ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_ALLOW,
                                    GetOriginalBrowserState());
-  GREYAssert(chrome_test_util::TapWebViewElementWithId(kCacheTestLinkID),
-             @"Failed to tap %s", kCacheTestLinkID);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:[NSString
+                                   stringWithUTF8String:kCacheTestLinkID]]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"First Page"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"First Page"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 3"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 3"]);
 }
 
 // Tests that cache is not used when selecting omnibox suggested website, even
@@ -216,9 +216,9 @@
   // 1st hit to server. Verify title and hitCount.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:cacheTestFirstPageURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"First Page"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"First Page"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 1"]);
 
   // Type a search into omnnibox and select the first suggestion (second row)
   [ChromeEarlGreyUI focusOmniboxAndType:@"cachetestfirstpage"];
@@ -228,9 +228,9 @@
 
   // Verify title and hitCount. Cache should not be used.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"First Page"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"First Page"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"serverHitCounter: 2"]);
 }
 
 @end
diff --git a/ios/chrome/browser/web/child_window_open_by_dom_egtest.mm b/ios/chrome/browser/web/child_window_open_by_dom_egtest.mm
index 9137375f..bea2beff 100644
--- a/ios/chrome/browser/web/child_window_open_by_dom_egtest.mm
+++ b/ios/chrome/browser/web/child_window_open_by_dom_egtest.mm
@@ -4,9 +4,9 @@
 
 #import <EarlGrey/EarlGrey.h>
 
+#include "base/strings/sys_string_conversions.h"
 #include "components/content_settings/core/common/content_settings.h"
 #import "ios/chrome/test/app/tab_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -18,13 +18,12 @@
 #error "This file requires ARC support."
 #endif
 
-using chrome_test_util::TapWebViewElementWithId;
 using web::test::HttpServer;
 
 namespace {
 // Test link text and ids.
-const char kNamedWindowLink[] = "openWindowWithName";
-const char kUnnamedWindowLink[] = "openWindowNoName";
+NSString* kNamedWindowLink = @"openWindowWithName";
+NSString* kUnnamedWindowLink = @"openWindowNoName";
 
 // Web view text that indicates window's closed state.
 const char kWindow2NeverOpen[] = "window2.closed: never opened";
@@ -62,7 +61,8 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:HttpServer::MakeUrl(kChildWindowTestURL)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kNamedWindowLink]);
+      [ChromeEarlGrey waitForWebStateContainingText:(base::SysNSStringToUTF8(
+                                                        kNamedWindowLink))]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
@@ -70,67 +70,67 @@
 // the same window object.
 - (void)test2ChildWindowsWithName {
   // Open two windows with the same name.
-  GREYAssert(TapWebViewElementWithId(kNamedWindowLink), @"Failed to tap %s",
-             kNamedWindowLink);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kNamedWindowLink]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
-  GREYAssert(TapWebViewElementWithId(kNamedWindowLink), @"Failed to tap %s",
-             kNamedWindowLink);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kNamedWindowLink]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that they're the same window.
-  GREYAssert(TapWebViewElementWithId("compareNamedWindows"),
-             @"Failed to tap \"compareNamedWindows\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"compareNamedWindows"]);
   const char kWindowsEqualText[] = "named windows equal: true";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kWindowsEqualText]);
 }
 
 // Tests that multiple calls to window.open() with no window name passed in
 // returns a unique window object each time.
 - (void)test2ChildWindowsWithoutName {
   // Open two unnamed windows.
-  GREYAssert(TapWebViewElementWithId(kUnnamedWindowLink), @"Failed to tap %s",
-             kUnnamedWindowLink);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kUnnamedWindowLink]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
-  GREYAssert(TapWebViewElementWithId(kUnnamedWindowLink), @"Failed to tap %s",
-             kUnnamedWindowLink);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kUnnamedWindowLink]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that they aren't the same window object.
-  GREYAssert(TapWebViewElementWithId("compareUnnamedWindows"),
-             @"Failed to tap \"compareUnnamedWindows\"");
-  const char kWindowsEqualText[] = "unnamed windows equal: false";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"compareUnnamedWindows"]);
+  std::string kWindowsEqualText = "unnamed windows equal: false";
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kWindowsEqualText]);
 }
 
 // Tests that calling window.open() with a name returns a different window
 // object than a subsequent call to window.open() without a name.
 - (void)testChildWindowsWithAndWithoutName {
   // Open a named window.
-  GREYAssert(TapWebViewElementWithId(kNamedWindowLink), @"Failed to tap %s",
-             kNamedWindowLink);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kNamedWindowLink]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Open an unnamed window.
-  GREYAssert(TapWebViewElementWithId(kUnnamedWindowLink), @"Failed to tap %s",
-             kUnnamedWindowLink);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kUnnamedWindowLink]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that they aren't the same window object.
-  GREYAssert(TapWebViewElementWithId("compareNamedAndUnnamedWindows"),
-             @"Failed to tap \"compareNamedAndUnnamedWindows\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"compareNamedAndUnnamedWindows"]);
   const char kWindowsEqualText[] = "named and unnamed equal: false";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kWindowsEqualText]);
 }
 
 // Tests that window.closed is correctly set to true when the corresponding tab
@@ -139,99 +139,103 @@
 // results in window.closed being set to true for all references to the window
 // object for that tab.
 - (void)testWindowClosedWithName {
-  GREYAssert(TapWebViewElementWithId("openWindowWithName"),
-             @"Failed to tap \"openWindowWithName\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"openWindowWithName"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that named window 1 is opened and named window 2 isn't.
   const char kCheckWindow1Link[] = "checkNamedWindow1Closed";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kCheckWindow1Link]);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow1Link), @"Failed to tap %s",
-             kCheckWindow1Link);
+      [ChromeEarlGrey waitForWebStateContainingText:kCheckWindow1Link]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:[NSString
+                                   stringWithUTF8String:kCheckWindow1Link]]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow1Open]);
-  const char kCheckWindow2Link[] = "checkNamedWindow2Closed";
-  GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
-             kCheckWindow2Link);
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow1Open]);
+  NSString* kCheckWindow2Link = @"checkNamedWindow2Closed";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow2NeverOpen]);
+      [ChromeEarlGrey tapWebStateElementWithID:kCheckWindow2Link]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow2NeverOpen]);
 
   // Open another window with the same name. Check that named window 2 is now
   // opened.
-  GREYAssert(TapWebViewElementWithId("openWindowWithName"),
-             @"Failed to tap \"openWindowWithName\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"openWindowWithName"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
-             kCheckWindow2Link);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open]);
+      [ChromeEarlGrey tapWebStateElementWithID:kCheckWindow2Link]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow2Open]);
 
   // Close the opened window. Check that named window 1 and 2 are both closed.
   chrome_test_util::CloseTabAtIndex(1);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow1Link), @"Failed to tap %s",
-             kCheckWindow1Link);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:[NSString
+                                   stringWithUTF8String:kCheckWindow1Link]]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow1Closed]);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
-             kCheckWindow2Link);
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow1Closed]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Closed]);
+      [ChromeEarlGrey tapWebStateElementWithID:kCheckWindow2Link]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow2Closed]);
 }
 
 // Tests that closing a tab will set window.closed to true for only
 // corresponding window object and not for any other window objects.
 - (void)testWindowClosedWithoutName {
-  GREYAssert(TapWebViewElementWithId("openWindowNoName"),
-             @"Failed to tap \"openWindowNoName\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"openWindowNoName"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that unnamed window 1 is opened and unnamed window 2 isn't.
   const char kCheckWindow1Link[] = "checkUnnamedWindow1Closed";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kCheckWindow1Link]);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow1Link), @"Failed to tap %s",
-             kCheckWindow1Link);
+      [ChromeEarlGrey waitForWebStateContainingText:kCheckWindow1Link]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:[NSString
+                                   stringWithUTF8String:kCheckWindow1Link]]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow1Open]);
-  const char kCheckWindow2Link[] = "checkUnnamedWindow2Closed";
-  GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
-             kCheckWindow2Link);
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow1Open]);
+  NSString* kCheckWindow2Link = @"checkUnnamedWindow2Closed";
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow2NeverOpen]);
+      [ChromeEarlGrey tapWebStateElementWithID:kCheckWindow2Link]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow2NeverOpen]);
 
   // Open another unnamed window. Check that unnamed window 2 is now opened.
-  GREYAssert(TapWebViewElementWithId("openWindowNoName"),
-             @"Failed to tap \"openWindowNoName\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"openWindowNoName"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
-             kCheckWindow2Link);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open]);
+      [ChromeEarlGrey tapWebStateElementWithID:kCheckWindow2Link]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow2Open]);
 
   // Close the first opened window. Check that unnamed window 1 is closed and
   // unnamed window 2 is still open.
   chrome_test_util::CloseTabAtIndex(1);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow1Link), @"Failed to tap %s",
-             kCheckWindow1Link);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:[NSString
+                                   stringWithUTF8String:kCheckWindow1Link]]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow1Closed]);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
-             kCheckWindow2Link);
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow1Closed]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open]);
+      [ChromeEarlGrey tapWebStateElementWithID:kCheckWindow2Link]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow2Open]);
 
   // Close the second opened window. Check that unnamed window 2 is closed.
   chrome_test_util::CloseTabAtIndex(1);
-  GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
-             kCheckWindow2Link);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Closed]);
+      [ChromeEarlGrey tapWebStateElementWithID:kCheckWindow2Link]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kWindow2Closed]);
 }
 
 @end
diff --git a/ios/chrome/browser/web/error_page_egtest.mm b/ios/chrome/browser/web/error_page_egtest.mm
index a2aebc3..c1aff13 100644
--- a/ios/chrome/browser/web/error_page_egtest.mm
+++ b/ios/chrome/browser/web/error_page_egtest.mm
@@ -57,13 +57,13 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo-query?foo")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:GetErrorMessage()]);
+      [ChromeEarlGrey waitForWebStateContainingText:GetErrorMessage()]);
 
   // Reload the page, which should load without errors.
   self.serverRespondsWithContent = YES;
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"foo"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"foo"]);
 }
 
 // Sucessfully loads the page, stops the server and reloads the page.
@@ -73,13 +73,13 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo-query?foo")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"foo"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"foo"]);
 
   // Reload the page, no response leads to ERR_CONNECTION_CLOSED error.
   self.serverRespondsWithContent = NO;
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:GetErrorMessage()]);
+      [ChromeEarlGrey waitForWebStateContainingText:GetErrorMessage()]);
 }
 
 @end
diff --git a/ios/chrome/browser/web/forms_egtest.mm b/ios/chrome/browser/web/forms_egtest.mm
index ce500d28..20946f0 100644
--- a/ios/chrome/browser/web/forms_egtest.mm
+++ b/ios/chrome/browser/web/forms_egtest.mm
@@ -14,7 +14,6 @@
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -36,7 +35,6 @@
 
 using chrome_test_util::ButtonWithAccessibilityLabelId;
 using chrome_test_util::OmniboxText;
-using chrome_test_util::TapWebViewElementWithId;
 using testing::ElementToDismissAlert;
 
 namespace {
@@ -48,7 +46,7 @@
 const char kGenericText[] = "A generic page";
 
 // Label for the button in the form.
-const char kSubmitButtonLabel[] = "submit";
+NSString* kSubmitButtonLabel = @"submit";
 
 // Html form template with a submission button named "submit".
 const char* kFormHtmlTemplate =
@@ -212,10 +210,10 @@
   const GURL destinationURL = GetDestinationUrl();
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
-  GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
-             kSubmitButtonLabel);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey tapWebStateElementWithID:kSubmitButtonLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -231,7 +229,7 @@
   [self confirmResendWarning];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -243,10 +241,10 @@
   const GURL destinationURL = GetDestinationUrl();
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
-  GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
-             kSubmitButtonLabel);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey tapWebStateElementWithID:kSubmitButtonLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -264,7 +262,7 @@
 
   [self confirmResendWarning];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -276,10 +274,10 @@
   const GURL destinationURL = GetDestinationUrl();
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
-  GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
-             kSubmitButtonLabel);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey tapWebStateElementWithID:kSubmitButtonLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -296,7 +294,7 @@
 
   [self confirmResendWarning];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -308,10 +306,10 @@
   const GURL destinationURL = GetDestinationUrl();
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
-  GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
-             kSubmitButtonLabel);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey tapWebStateElementWithID:kSubmitButtonLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -331,7 +329,7 @@
   }
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -342,10 +340,10 @@
   const GURL destinationURL = GetDestinationUrl();
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
-  GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
-             kSubmitButtonLabel);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey tapWebStateElementWithID:kSubmitButtonLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -369,8 +367,9 @@
   if (!web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
     // LegacyNavigationManager displays repost on |goBack|. So after cancelling,
     // web view should show form URL.
-    CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:kSubmitButtonLabel]);
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+        waitForWebStateContainingText:(base::SysNSStringToUTF8(
+                                          kSubmitButtonLabel))]);
     [[EarlGrey selectElementWithMatcher:OmniboxText(GetFormUrl().GetContent())]
         assertWithMatcher:grey_notNil()];
     [[EarlGrey selectElementWithMatcher:chrome_test_util::ForwardButton()]
@@ -379,7 +378,7 @@
     // WKBasedNavigationManager displays repost on |reload|. So after
     // cancelling, web view should show |destinationURL|.
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+        [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
     [[EarlGrey
         selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
         assertWithMatcher:grey_notNil()];
@@ -394,10 +393,10 @@
   const GURL destinationURL = GetDestinationUrl();
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
-  GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
-             kSubmitButtonLabel);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey tapWebStateElementWithID:kSubmitButtonLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -413,13 +412,13 @@
 
   // Repost confirmation box should be visible.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:ResendPostButtonMatcher()]);
+      waitForSufficientlyVisibleElementWithMatcher:ResendPostButtonMatcher()]);
 
   // Starting a new navigation while the repost dialog is presented should not
   // crash.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetGenericUrl()]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kGenericText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kGenericText]);
 
   // Repost dialog should not be visible anymore.
   [[EarlGrey selectElementWithMatcher:ResendPostButtonMatcher()]
@@ -433,17 +432,18 @@
   GURL destinationURL = GetDestinationUrl();
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
-  GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
-             kSubmitButtonLabel);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
+      [ChromeEarlGrey tapWebStateElementWithID:kSubmitButtonLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Go back and verify the browser navigates to the original URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kSubmitButtonLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:(base::SysNSStringToUTF8(
+                                                        kSubmitButtonLabel))]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(GetFormUrl().GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -456,12 +456,12 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetRedirectFormUrl()]);
 
   // Submit the form, which redirects before printing the data.
-  GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
-             kSubmitButtonLabel);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kSubmitButtonLabel]);
 
   // Check that the redirect changes the POST to a GET.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"GET"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"GET"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -471,7 +471,7 @@
   [[EarlGrey selectElementWithMatcher:ResendPostButtonMatcher()]
       assertWithMatcher:grey_nil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"GET"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"GET"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -495,9 +495,10 @@
   // Open the second URL, tap the button, and verify the browser navigates to
   // the expected URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:formURL]);
-  GREYAssert(TapWebViewElementWithId("button"), @"Failed to tap \"button\"");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"POST"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"button"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:"POST"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(formURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -524,7 +525,7 @@
 
   // Verify that the browser navigates to the expected URL.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"bar!"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"bar!"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
diff --git a/ios/chrome/browser/web/http_auth_egtest.mm b/ios/chrome/browser/web/http_auth_egtest.mm
index cf6459ba..29994642 100644
--- a/ios/chrome/browser/web/http_auth_egtest.mm
+++ b/ios/chrome/browser/web/http_auth_egtest.mm
@@ -98,7 +98,7 @@
 
   const std::string pageText = web::HttpAuthResponseProvider::page_text();
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:pageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:pageText]);
 }
 
 // Tests Basic HTTP Authentication with incorrect username and password.
diff --git a/ios/chrome/browser/web/js_print_egtest.mm b/ios/chrome/browser/web/js_print_egtest.mm
index 5119cf7..bdca7a1 100644
--- a/ios/chrome/browser/web/js_print_egtest.mm
+++ b/ios/chrome/browser/web/js_print_egtest.mm
@@ -50,7 +50,7 @@
 
   // Tap print button.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"printButton"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"printButton"]);
 
   // Test if print dialog appeared.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Printer Options")]
diff --git a/ios/chrome/browser/web/navigation_egtest.mm b/ios/chrome/browser/web/navigation_egtest.mm
index 16b701d..cd5146f 100644
--- a/ios/chrome/browser/web/navigation_egtest.mm
+++ b/ios/chrome/browser/web/navigation_egtest.mm
@@ -9,7 +9,6 @@
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -28,7 +27,6 @@
 using chrome_test_util::ForwardButton;
 using chrome_test_util::PurgeCachedWebViewPages;
 using chrome_test_util::OmniboxText;
-using chrome_test_util::TapWebViewElementWithId;
 
 namespace {
 
@@ -63,8 +61,8 @@
 NSString* const kGoBackTwoID = @"go-back-2";
 
 // URLs and labels for testWindowLocation* tests.
-const char kHashChangeWithHistoryLabel[] = "hashChangedWithHistory";
-const char kHashChangeWithoutHistoryLabel[] = "hashChangedWithoutHistory";
+NSString* kHashChangeWithHistoryLabel = @"hashChangedWithHistory";
+NSString* kHashChangeWithoutHistoryLabel = @"hashChangedWithoutHistory";
 const char kPage1URL[] = "/page1/";
 const char kHashChangedWithHistoryURL[] = "/page1/#hashChangedWithHistory";
 const char kHashChangedWithoutHistoryURL[] =
@@ -159,17 +157,17 @@
       self.testServer->GetURL(kWindowHistoryGoTestURL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
 
   // Tap on the window.history.go() button.  This will clear |kOnLoadText|, so
   // the subsequent check for |kOnLoadText| will only pass if a reload has
   // occurred.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kGoNoParameterID]);
+      [ChromeEarlGrey tapWebStateElementWithID:kGoNoParameterID]);
 
   // Verify that the onload text is reset.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
 }
 
 // Tests reloading the current page via history.go(0).
@@ -180,16 +178,17 @@
       self.testServer->GetURL(kWindowHistoryGoTestURL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
 
   // Tap on the window.history.go() button.  This will clear |kOnLoadText|, so
   // the subsequent check for |kOnLoadText| will only pass if a reload has
   // occurred.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:kGoZeroID]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kGoZeroID]);
 
   // Verify that the onload text is reset.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
 }
 
 // Tests that calling window.history.go() with an offset that is out of bounds
@@ -201,22 +200,22 @@
       self.testServer->GetURL(kWindowHistoryGoTestURL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
 
   // Tap on the window.history.go(2) button.  This will clear all div text, so
   // the subsequent check for |kNoOpText| will only pass if no navigations have
   // occurred.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:kGoTwoID]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:kGoTwoID]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kNoOpText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kNoOpText]);
 
   // Tap on the window.history.go(-2) button.  This will clear all div text, so
   // the subsequent check for |kNoOpText| will only pass if no navigations have
   // occurred.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kGoBackTwoID]);
+      [ChromeEarlGrey tapWebStateElementWithID:kGoBackTwoID]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kNoOpText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kNoOpText]);
 }
 
 // Tests going back and forward via history.go().
@@ -233,20 +232,20 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:thirdURL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:fourthURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"onload"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"onload"]);
 
   // Tap button to go back 3 pages.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"goBack3"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"goBack3"]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(firstURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Tap button to go forward 2 pages.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:kGoTwoID]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebStateElementWithID:kGoTwoID]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(thirdURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -260,22 +259,22 @@
       self.testServer->GetURL(kWindowHistoryGoTestURL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
 
   const GURL sampleURL = self.testServer->GetURL(kSimpleFileBasedTestURL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:sampleURL]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
 
   // Tap the window.history.go(-2) button.  This will clear the current page's
   // |kOnLoadText|, so the subsequent check will only pass if another load
   // occurs.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kGoBackTwoID]);
+      [ChromeEarlGrey tapWebStateElementWithID:kGoBackTwoID]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
 }
 
 #pragma mark window.history.[back/forward] operations
@@ -292,9 +291,10 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:secondURL]);
 
   // Tap the back button in the HTML and verify the first URL is loaded.
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:kGoBackID]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
+      [ChromeEarlGrey tapWebStateElementWithID:kGoBackID]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebStateContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(firstURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -320,15 +320,15 @@
   // is loaded.
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kOnLoadText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(firstURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Tap the forward button in the HTML and verify the second URL is loaded.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:kGoForwardID]);
+      [ChromeEarlGrey tapWebStateElementWithID:kGoForwardID]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(secondURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -346,7 +346,7 @@
   const GURL testURL = self.testServer->GetURL(kSimpleFileBasedTestURL);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"pony"]);
 
   // Tap the back button and verify NTP is loaded.
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
@@ -358,7 +358,7 @@
   [[EarlGrey selectElementWithMatcher:ForwardButton()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"pony"]);
 }
 
 #pragma mark window.location.hash operations
@@ -376,8 +376,8 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:page1URL]);
 
   // Click link to update location.hash and go to new URL (same page).
-  GREYAssert(TapWebViewElementWithId(kHashChangeWithHistoryLabel),
-             @"Failed to tap %s", kHashChangeWithHistoryLabel);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kHashChangeWithHistoryLabel]);
 
   // Navigate back to original URL. This should fire a hashchange event.
   std::string backHashChangeContent = "backHashChange";
@@ -388,7 +388,7 @@
   [[EarlGrey selectElementWithMatcher:OmniboxText(page1OmniboxText)]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:backHashChangeContent]);
+      [ChromeEarlGrey waitForWebStateContainingText:backHashChangeContent]);
 
   // Navigate forward to the new URL. This should fire a hashchange event.
   std::string forwardHashChangeContent = "forwardHashChange";
@@ -401,14 +401,14 @@
       selectElementWithMatcher:OmniboxText(hashChangedWithHistoryOmniboxText)]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:forwardHashChangeContent]);
+      [ChromeEarlGrey waitForWebStateContainingText:forwardHashChangeContent]);
 
   // Load a hash URL directly. This shouldn't fire a hashchange event.
   std::string hashChangeContent = "FAIL_loadUrlHashChange";
   [self addHashChangeListenerWithContent:hashChangeContent];
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:hashChangedWithHistoryURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewNotContainingText:hashChangeContent]);
+      [ChromeEarlGrey waitForWebStateNotContainingText:hashChangeContent]);
 }
 
 // Loads a URL and replaces its location, then updates its location.hash
@@ -426,8 +426,8 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:page1URL]);
 
   // Tap link to replace the location value.
-  GREYAssert(TapWebViewElementWithId(kHashChangeWithoutHistoryLabel),
-             @"Failed to tap %s", kHashChangeWithoutHistoryLabel);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kHashChangeWithoutHistoryLabel]);
   const std::string hashChangedWithoutHistoryOmniboxText =
       net::GetContentAndFragmentForUrl(hashChangedWithoutHistoryURL);
   [[EarlGrey selectElementWithMatcher:OmniboxText(
@@ -435,8 +435,8 @@
       assertWithMatcher:grey_notNil()];
 
   // Tap link to update the location.hash with a new value.
-  GREYAssert(TapWebViewElementWithId(kHashChangeWithHistoryLabel),
-             @"Failed to tap %s", kHashChangeWithHistoryLabel);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kHashChangeWithHistoryLabel]);
   const std::string hashChangedWithHistoryOmniboxText =
       net::GetContentAndFragmentForUrl(hashChangedWithHistoryURL);
   [[EarlGrey
@@ -464,8 +464,8 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:page1URL]);
 
   // Tap link to update location.hash with a new value.
-  GREYAssert(TapWebViewElementWithId(kHashChangeWithHistoryLabel),
-             @"Failed to tap %s", kHashChangeWithHistoryLabel);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kHashChangeWithHistoryLabel]);
   const std::string hashChangedWithHistoryOmniboxText =
       net::GetContentAndFragmentForUrl(hashChangedWithHistoryURL);
   [[EarlGrey
@@ -473,8 +473,8 @@
       assertWithMatcher:grey_notNil()];
 
   // Tap link to update location.hash with the same value.
-  GREYAssert(TapWebViewElementWithId(kHashChangeWithHistoryLabel),
-             @"Failed to tap %s", kHashChangeWithHistoryLabel);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:kHashChangeWithHistoryLabel]);
 
   // Tap back once to return to original URL.
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
@@ -564,10 +564,12 @@
   // Load index, tap on redirect link, and assert that the page is redirected
   // to the proper destination.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:indexURL]);
-  GREYAssert(TapWebViewElementWithId(redirectLabel), @"Failed to tap %s",
-             redirectLabel.c_str());
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:
+          [NSString stringWithCString:redirectLabel.c_str()
+                             encoding:[NSString defaultCStringEncoding]]]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"You've arrived"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -576,14 +578,14 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:lastURL]);
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"You've arrived"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Navigate back and assert that the resulting page is the initial index.
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:redirectLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:redirectLabel]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(indexURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -592,7 +594,7 @@
   [[EarlGrey selectElementWithMatcher:ForwardButton()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"You've arrived"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -609,12 +611,12 @@
   GREYAssert(PurgeCachedWebViewPages(), @"History not restored");
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Revision"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Revision"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText("chrome://version")]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -631,7 +633,7 @@
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
diff --git a/ios/chrome/browser/web/progress_indicator_egtest.mm b/ios/chrome/browser/web/progress_indicator_egtest.mm
index c63c266f..6f37db7 100644
--- a/ios/chrome/browser/web/progress_indicator_egtest.mm
+++ b/ios/chrome/browser/web/progress_indicator_egtest.mm
@@ -15,7 +15,6 @@
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -192,7 +191,7 @@
 
   // Wait until the page is half loaded.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageText]);
 
   // Verify progress view visible and halfway progress.
   [[EarlGrey selectElementWithMatcher:ProgressViewWithProgress(0.5)]
@@ -228,13 +227,13 @@
   // Load form first.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:formURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kFormPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kFormPageText]);
 
-  chrome_test_util::SubmitWebViewFormWithId(kFormID);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey submitWebStateFormWithID:kFormID]);
 
   // Wait until the page is half loaded.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageText]);
 
   // Verify progress view visible and halfway progress.
   [[EarlGrey selectElementWithMatcher:ProgressViewWithProgress(0.5)]
@@ -262,13 +261,13 @@
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:formURL]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kFormPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kFormPageText]);
 
-  chrome_test_util::SubmitWebViewFormWithId(kFormID);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey submitWebStateFormWithID:kFormID]);
 
   // Verify the new page has been loaded.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageText]);
 
   // Verify progress view is not visible.
   [[EarlGrey selectElementWithMatcher:ProgressView()]
@@ -292,9 +291,9 @@
 
   // Verify the form page has been loaded.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kFormPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kFormPageText]);
 
-  chrome_test_util::SubmitWebViewFormWithId(kFormID);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey submitWebStateFormWithID:kFormID]);
 
   // Verify progress view is not visible.
   [[EarlGrey selectElementWithMatcher:grey_kindOfClass([MDCProgressView class])]
diff --git a/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm b/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
index 17dfd5c..0ac2bd8 100644
--- a/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
+++ b/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
@@ -69,19 +69,19 @@
 
   // Push 3 URLs. Verify that the URL changed and the status was updated.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashWithObject"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStateHashWithObject"]);
   [self assertStatusText:@"pushStateHashWithObject"
          withOmniboxText:pushStateHashWithObjectOmniboxText
               pageLoaded:NO];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateRootPath"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStateRootPath"]);
   [self assertStatusText:@"pushStateRootPath"
          withOmniboxText:pushStateRootPathOmniboxText
               pageLoaded:NO];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePathSpace"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStatePathSpace"]);
   [self assertStatusText:@"pushStatePathSpace"
          withOmniboxText:pushStatePathSpaceOmniboxText
               pageLoaded:NO];
@@ -98,7 +98,8 @@
          withOmniboxText:pushStateHashWithObjectOmniboxText
               pageLoaded:NO];
 
-  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"goBack"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"goBack"]);
   const GURL historyTestURL = web::test::HttpServer::MakeUrl(kHistoryTestUrl);
   [self assertStatusText:nil
          withOmniboxText:net::GetContentAndFragmentForUrl(historyTestURL)
@@ -107,7 +108,7 @@
   // Go forward 2 pages and check that the page doesn't load and the status text
   // is updated by the popstate event.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"goForward2"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"goForward2"]);
   [self assertStatusText:@"pushStateRootPath"
          withOmniboxText:pushStateRootPathOmniboxText
               pageLoaded:NO];
@@ -129,7 +130,7 @@
   const std::string replaceStateHashWithObjectOmniboxText =
       net::GetContentAndFragmentForUrl(replaceStateHashWithObjectURL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateHashWithObject"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"replaceStateHashWithObject"]);
   [self assertStatusText:@"replaceStateHashWithObject"
          withOmniboxText:replaceStateHashWithObjectOmniboxText
               pageLoaded:NO];
@@ -154,7 +155,7 @@
   const std::string pushStateHashStringOmniboxText =
       net::GetContentAndFragmentForUrl(pushStateHashStringURL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStateHashString"]);
   [self assertStatusText:@"pushStateHashString"
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:NO];
@@ -164,7 +165,7 @@
   const std::string replaceStateHashStringOmniboxText =
       net::GetContentAndFragmentForUrl(replaceStateHashStringURL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateHashString"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"replaceStateHashString"]);
   [self assertStatusText:@"replaceStateHashString"
          withOmniboxText:replaceStateHashStringOmniboxText
               pageLoaded:NO];
@@ -174,7 +175,7 @@
   const std::string pushStatePathOmniboxText =
       net::GetContentAndFragmentForUrl(pushStatePathURL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePath"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStatePath"]);
   [self assertStatusText:@"pushStatePath"
          withOmniboxText:pushStatePathOmniboxText
               pageLoaded:NO];
@@ -184,7 +185,7 @@
   const std::string replaceStateRootPathSpaceOmniboxText =
       net::GetContentAndFragmentForUrl(replaceStateRootPathSpaceURL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateRootPathSpace"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"replaceStateRootPathSpace"]);
   [self assertStatusText:@"replaceStateRootPathSpace"
          withOmniboxText:replaceStateRootPathSpaceOmniboxText
               pageLoaded:NO];
@@ -201,7 +202,7 @@
 
   // Go forward and check URL.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"goForward2"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"goForward2"]);
   [self assertStatusText:@"replaceStateRootPathSpace"
          withOmniboxText:replaceStateRootPathSpaceOmniboxText
               pageLoaded:NO];
@@ -222,12 +223,12 @@
   const std::string pushStateHashStringOmniboxText =
       net::GetContentAndFragmentForUrl(pushStateHashStringURL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStateHashString"]);
   [self assertStatusText:@"pushStateHashString"
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStateHashString"]);
   [self assertStatusText:@"pushStateHashString"
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:NO];
@@ -238,7 +239,7 @@
   // Load history.html and push another URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:historyTestURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStateHashString"]);
   [self assertStatusText:@"pushStateHashString"
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:NO];
@@ -270,7 +271,7 @@
 
   // Go forward 4 entries at once (to third #string) and verify page did load.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"goForward4"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"goForward4"]);
 
   [self assertStatusText:nil
          withOmniboxText:pushStateHashStringOmniboxText
@@ -278,7 +279,7 @@
 
   // Go back 4 entries at once (to first #string) and verify page did load.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"goBack4"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"goBack4"]);
 
   [self assertStatusText:nil
          withOmniboxText:pushStateHashStringOmniboxText
@@ -310,20 +311,20 @@
 
   // Do 2 push states with unicode characters.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateUnicode"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStateUnicode"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::OmniboxText(pushStateUnicode)]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:pushStateUnicodeLabel]);
+      [ChromeEarlGrey waitForWebStateContainingText:pushStateUnicodeLabel]);
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateUnicode2"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStateUnicode2"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::OmniboxText(pushStateUnicode2)]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:pushStateUnicode2Label]);
+      [ChromeEarlGrey waitForWebStateContainingText:pushStateUnicode2Label]);
 
   // Do a push state without a unicode character.
   const GURL pushStatePathURL =
@@ -331,7 +332,7 @@
   const std::string pushStatePathOmniboxText =
       net::GetContentAndFragmentForUrl(pushStatePathURL);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePath"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushStatePath"]);
 
   [self assertStatusText:@"pushStatePath"
          withOmniboxText:pushStatePathOmniboxText
@@ -381,13 +382,13 @@
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:originURL]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"pushState"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"pushState"]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           pushResultOmniboxText)]
       assertWithMatcher:grey_notNil()];
 
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey tapWebViewElementWithID:@"replaceState"]);
+      [ChromeEarlGrey tapWebStateElementWithID:@"replaceState"]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           replaceResultOmniboxText)]
       assertWithMatcher:grey_notNil()];
@@ -403,16 +404,16 @@
               pageLoaded:(BOOL)pageLoaded {
   if (pageLoaded) {
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewContainingText:"onload"]);
+        [ChromeEarlGrey waitForWebStateContainingText:"onload"]);
   } else {
     CHROME_EG_ASSERT_NO_ERROR(
-        [ChromeEarlGrey waitForWebViewNotContainingText:"onload"]);
+        [ChromeEarlGrey waitForWebStateNotContainingText:"onload"]);
   }
 
   if (status != nil) {
     NSString* statusLabel = [NSString stringWithFormat:@"Action: %@", status];
     CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-        waitForWebViewContainingText:base::SysNSStringToUTF8(statusLabel)]);
+        waitForWebStateContainingText:base::SysNSStringToUTF8(statusLabel)]);
   }
 
   [[EarlGrey
diff --git a/ios/chrome/browser/web/stop_loading_egtest.mm b/ios/chrome/browser/web/stop_loading_egtest.mm
index 6dcf85f..e4a07861 100644
--- a/ios/chrome/browser/web/stop_loading_egtest.mm
+++ b/ios/chrome/browser/web/stop_loading_egtest.mm
@@ -117,7 +117,7 @@
 
   // Wait until the page is half loaded.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kPageText]);
+      [ChromeEarlGrey waitForWebStateContainingText:kPageText]);
 
   // On iPhone Stop/Reload button is a part of tools menu, so open it.
   if (!IsIPadIdiom()) {
diff --git a/ios/chrome/browser/web/tab_order_egtest.mm b/ios/chrome/browser/web/tab_order_egtest.mm
index 482dfb9f..3e6cf13 100644
--- a/ios/chrome/browser/web/tab_order_egtest.mm
+++ b/ios/chrome/browser/web/tab_order_egtest.mm
@@ -60,7 +60,7 @@
   // Create a tab that will act as the parent tab.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL1Text]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLinksTestURL1Text]);
   Tab* parentTab = chrome_test_util::GetCurrentTab();
 
   // Child tab should be inserted after the parent.
@@ -90,13 +90,13 @@
   const GURL URL2 = self.testServer->GetURL(kLinksTestURL2);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL2Text]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLinksTestURL2Text]);
   GREYAssertEqual(3U, chrome_test_util::GetMainTabCount(),
                   @"Unexpected number of tabs");
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL1Text]);
+      [ChromeEarlGrey waitForWebStateContainingText:kLinksTestURL1Text]);
   GREYAssertEqual(3U, chrome_test_util::GetMainTabCount(),
                   @"Unexpected number of tabs");
 
diff --git a/ios/chrome/browser/web/visible_url_egtest.mm b/ios/chrome/browser/web/visible_url_egtest.mm
index dc8533c..8f9b250 100644
--- a/ios/chrome/browser/web/visible_url_egtest.mm
+++ b/ios/chrome/browser/web/visible_url_egtest.mm
@@ -176,7 +176,7 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the back button in the toolbar and verify that URL2 (committed URL) is
@@ -191,7 +191,7 @@
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -199,7 +199,7 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [self setServerPaused:YES];
 
   // Tap the forward button in the toolbar and verify that URL1 (committed URL)
@@ -214,7 +214,7 @@
   // Make server respond so URL2 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -230,7 +230,7 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Re-enable synchronization here to synchronize EarlGrey LongPress and Tap
@@ -259,7 +259,7 @@
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -275,7 +275,7 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the back button, stop pending navigation and reload.
@@ -298,7 +298,7 @@
   // Make server respond and verify that page2 was reloaded, not page1.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -314,13 +314,13 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the back button on the page and verify that URL2 (committed URL) is
   // displayed even though URL1 is a pending URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
+      tapWebStateElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1],
              @"Last request URL: %@", self.lastRequestURLSpec);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
@@ -329,7 +329,7 @@
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -337,13 +337,13 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [self setServerPaused:YES];
 
   // Tap the forward button on the page and verify that URL1 (committed URL)
   // is displayed even though URL2 is a pending URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoForwardLink)]);
+      tapWebStateElementWithID:base::SysUTF8ToNSString(kGoForwardLink)]);
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL2],
              @"Last request URL: %@", self.lastRequestURLSpec);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
@@ -352,7 +352,7 @@
   // Make server respond so URL2 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -368,13 +368,13 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the go negative delta button on the page and verify that URL2
   // (committed URL) is displayed even though URL1 is a pending URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoNegativeDeltaLink)]);
+      tapWebStateElementWithID:base::SysUTF8ToNSString(kGoNegativeDeltaLink)]);
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1],
              @"Last request URL: %@", self.lastRequestURLSpec);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
@@ -383,7 +383,7 @@
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -391,13 +391,13 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [self setServerPaused:YES];
 
   // Tap go positive delta button on the page and verify that URL1 (committed
   // URL) is displayed even though URL2 is a pending URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoPositiveDeltaLink)]);
+      tapWebStateElementWithID:base::SysUTF8ToNSString(kGoPositiveDeltaLink)]);
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL2],
              @"Last request URL: %@", self.lastRequestURLSpec);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
@@ -406,7 +406,7 @@
   // Make server respond so URL2 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -422,7 +422,7 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Start reloading the page.
@@ -449,7 +449,7 @@
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -473,12 +473,12 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Start renderer initiated navigation.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kPage3Link)]);
+      tapWebStateElementWithID:base::SysUTF8ToNSString(kPage3Link)]);
 
   // Do not wait until renderer-initiated navigation is finished, tap the back
   // button in the toolbar and verify that URL2 (committed URL) is displayed
@@ -493,7 +493,7 @@
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -510,7 +510,7 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the back button in the toolbar and verify that URL2 (committed URL) is
@@ -524,14 +524,14 @@
 
   // Interrupt back navigation with renderer initiated navigation.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kPage3Link)]);
+      tapWebStateElementWithID:base::SysUTF8ToNSString(kPage3Link)]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage3]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage3]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL3.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -550,7 +550,7 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage3]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage3]);
   [self setServerPaused:YES];
 
   // Tap the back button twice in the toolbar and verify that URL3 (committed
@@ -568,7 +568,7 @@
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -590,7 +590,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
 
   // Quickly navigate forward twice and wait for kChromeUIVersionURL to load.
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() goForward];
@@ -598,7 +598,7 @@
 
   const std::string version = version_info::GetVersionNumber();
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:version]);
+      [ChromeEarlGrey waitForWebStateContainingText:version]);
 
   // Make sure that kChromeUIVersionURL URL is displayed in the omnibox.
   std::string expectedText = base::UTF16ToUTF8(web::GetDisplayTitleForUrl(URL));
@@ -620,15 +620,15 @@
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage3]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage3]);
   [self setServerPaused:YES];
 
   // Tap the back button twice on the page and verify that URL3 (committed URL)
   // is displayed even though URL1 is a pending URL.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
+      tapWebStateElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
+      tapWebStateElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
   // Server will receive only one request either for |_testURL2| or for
   // |_testURL1| depending on load timing and then will pause. So there is no
   // need to wait for particular request.
@@ -639,7 +639,7 @@
   [self setServerPaused:NO];
   // TODO(crbug.com/866406): fix the test to have documented behavior.
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
+      [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
diff --git a/ios/chrome/browser/web/window_open_by_dom_egtest.mm b/ios/chrome/browser/web/window_open_by_dom_egtest.mm
index d10075d0..1e2dec6 100644
--- a/ios/chrome/browser/web/window_open_by_dom_egtest.mm
+++ b/ios/chrome/browser/web/window_open_by_dom_egtest.mm
@@ -13,7 +13,6 @@
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
-#import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -33,7 +32,6 @@
 using chrome_test_util::ExecuteJavaScript;
 using chrome_test_util::GetCurrentWebState;
 using chrome_test_util::OmniboxText;
-using chrome_test_util::TapWebViewElementWithId;
 using web::test::HttpServer;
 using web::WebViewInWebState;
 
@@ -76,17 +74,16 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:HttpServer::MakeUrl(kTestURL)]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Expected result"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Expected result"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests that opening a link with target=_blank which then immediately closes
 // itself works.
 - (void)testLinkWithBlankTargetWithImmediateClose {
-  GREYAssert(
-      TapWebViewElementWithId(
-          "webScenarioWindowOpenBlankTargetWithImmediateClose"),
-      @"Failed to tap \"webScenarioWindowOpenBlankTargetWithImmediateClose\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:
+          @"webScenarioWindowOpenBlankTargetWithImmediateClose"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
@@ -104,7 +101,7 @@
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Expected result"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Expected result"]);
 
   id value = ExecuteJavaScript(@"sessionStorage.getItem('key');", &error);
   GREYAssert(!error, @"Error during script execution: %@", error);
@@ -131,7 +128,7 @@
       &error);
   GREYAssert(!error, @"Failed to tap 'webScenarioWindowOpenRegularLink'");
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:PopupBlocker()]);
+      waitForSufficientlyVisibleElementWithMatcher:PopupBlocker()]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
@@ -155,18 +152,17 @@
 
 // Tests a window.open by assigning to window.location.
 - (void)testWindowOpenAndAssignToHref {
-  GREYAssert(
-      TapWebViewElementWithId("webScenarioWindowOpenTabWithAssignmentToHref"),
-      @"Failed to tap \"webScenarioWindowOpenTabWithAssignmentToHref\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:
+                          @"webScenarioWindowOpenTabWithAssignmentToHref"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests that opening a window and calling window.location.assign works.
 - (void)testWindowOpenAndCallLocationAssign {
   // Open a child tab.
-  GREYAssert(
-      TapWebViewElementWithId("webScenarioWindowOpenAndCallLocationAssign"),
-      @"Failed to tap \"webScenarioWindowOpenAndCallLocationAssign\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioWindowOpenAndCallLocationAssign"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Ensure that the resulting tab is updated as expected.
@@ -182,8 +178,8 @@
 // completes and causes a navigation. (Reduced test case from actual site.)
 - (void)testWindowOpenAndSetLocation {
   // Open a child tab.
-  GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenAndSetLocation"),
-             @"Failed to tap \"webScenarioWindowOpenAndSetLocation\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioWindowOpenAndSetLocation"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Ensure that the resulting tab is updated as expected.
@@ -197,8 +193,8 @@
 
 // Tests a button that invokes window.open() with "_blank" target parameter.
 - (void)testWindowOpenWithBlankTarget {
-  GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenWithBlankTarget"),
-             @"Failed to tap \"webScenarioWindowOpenWithBlankTarget\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioWindowOpenWithBlankTarget"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
@@ -217,15 +213,15 @@
 
 // Tests a window.open used in a <button onClick> element.
 - (void)testWindowOpenWithButtonOnClick {
-  GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenWithButtonOnClick"),
-             @"Failed to tap \"webScenarioWindowOpenWithButtonOnClick\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioWindowOpenWithButtonOnClick"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests a button that invokes window.open with an empty target parameter.
 - (void)testWindowOpenWithEmptyTarget {
-  GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenWithEmptyTarget"),
-             @"Failed to tap \"webScenarioWindowOpenWithEmptyTarget\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioWindowOpenWithEmptyTarget"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
@@ -233,10 +229,9 @@
 // script window.open('', '').location.replace('about:blank#hash').
 // This is a regression test for crbug.com/866142.
 - (void)testLocationReplaceInWindowOpenWithEmptyTarget {
-  GREYAssert(TapWebViewElementWithId(
-                 "webScenarioLocationReplaceInWindowOpenWithEmptyTarget"),
-             @"Failed to tap "
-             @"\"webScenarioLocationReplaceInWindowOpenWithEmptyTarget\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:
+          @"webScenarioLocationReplaceInWindowOpenWithEmptyTarget"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   // WebKit doesn't parse 'about:blank#hash' as about:blank with URL fragment.
   // Instead, it percent encodes '#hash' and considers 'blank%23hash' as the
@@ -249,16 +244,15 @@
 
 // Tests a link with JavaScript in the href.
 + (void)testWindowOpenWithJavaScriptInHref {
-  GREYAssert(
-      TapWebViewElementWithId("webScenarioWindowOpenWithJavaScriptInHref"),
-      @"Failed to tap \"webScenarioWindowOpenWithJavaScriptInHref\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioWindowOpenWithJavaScriptInHref"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests a window.open by running Meta-Refresh.
 - (void)testWindowOpenWithMetaRefresh {
-  GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenWithMetaRefresh"),
-             @"Failed to tap \"webScenarioWindowOpenWithMetaRefresh\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioWindowOpenWithMetaRefresh"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
@@ -266,9 +260,8 @@
 // opens the tab, but doesn't navigate the main tab.
 - (void)testWindowOpenWithPreventDefaultLink {
   // Open a child tab.
-  GREYAssert(
-      TapWebViewElementWithId("webScenarioWindowOpenWithPreventDefaultLink"),
-      @"Failed to tap \"webScenarioWindowOpenWithPreventDefaultLink\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioWindowOpenWithPreventDefaultLink"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Ensure that the starting tab hasn't navigated.
@@ -280,8 +273,8 @@
 
 // Tests that closing the current window using DOM fails.
 - (void)testCloseWindowNotOpenByDOM {
-  GREYAssert(TapWebViewElementWithId("webScenarioWindowClose"),
-             @"Failed to tap \"webScenarioWindowClose\"");
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebStateElementWithID:@"webScenarioWindowClose"]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
@@ -290,8 +283,8 @@
 - (void)testBlockPopupInjectedIntoOpenedWindow {
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey setContentSettings:CONTENT_SETTING_BLOCK]);
-  GREYAssert(TapWebViewElementWithId("webScenarioOpenWindowAndInjectPopup"),
-             @"Failed to tap \"webScenarioOpenWindowAndInjectPopup\"");
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebStateElementWithID:@"webScenarioOpenWindowAndInjectPopup"]);
   [[EarlGrey selectElementWithMatcher:PopupBlocker()]
       assertWithMatcher:grey_notNil()];
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index f9a2eb6..29101e4 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -210,6 +210,10 @@
 
 chrome_ios_eg_test("ios_chrome_unified_consent_egtests") {
   deps = [
+    "//ios/chrome/browser/ui/bookmarks:eg_tests",
+    "//ios/chrome/browser/ui/first_run:eg_tests",
+    "//ios/chrome/browser/ui/settings:eg_tests",
+    "//ios/chrome/browser/ui/settings/google_services:eg_tests",
     "//ios/chrome/browser/ui/settings/google_services:unified_consent_eg_tests",
     "//ios/chrome/browser/ui/signin_interaction:unity_eg_tests",
   ]
@@ -258,6 +262,7 @@
     "//ios/chrome/browser/ui/commands:commands",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_ui",
+    "//ios/chrome/browser/ui/history:constants",
     "//ios/chrome/browser/ui/history:history_ui",
     "//ios/chrome/browser/ui/location_bar:location_bar",
     "//ios/chrome/browser/ui/omnibox:omnibox_internal",
@@ -378,6 +383,8 @@
     "chrome_earl_grey.h",
     "chrome_earl_grey.mm",
     "chrome_earl_grey_app_interface.h",
+    "chrome_egtest_bundle_main.h",
+    "chrome_egtest_bundle_main.mm",
     "chrome_error_util.h",
     "chrome_matchers.h",
     "chrome_matchers.mm",
@@ -393,6 +400,7 @@
     "//ios/testing/earl_grey:eg_test_support+eg2",
     "//ios/third_party/earl_grey2:test_lib",
     "//ios/web/public/test:element_selector",
+    "//ui/base",
     "//url",
   ]
 }
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index 2392729..06826e8 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -38,11 +38,25 @@
 // will properly synchronize the UI for Earl Grey tests.
 @interface ChromeEarlGreyImpl : BaseEGTestHelperImpl
 
-#pragma mark - History Utilities
+#pragma mark - History Utilities (EG2)
 // Clears browsing history. Raises an EarlGrey exception if history is not
 // cleared within a timeout.
 - (void)clearBrowsingHistory;
 
+#pragma mark - Navigation Utilities (EG2)
+
+// Navigates back to the previous page and waits for the loading to complete
+// within a timeout, or a GREYAssert is induced.
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)goBack;
+
+// Waits for the page to finish loading within a timeout, or a GREYAssert is
+// induced.
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)waitForPageToFinishLoading;
+
 @end
 
 // Helpers that only compile under EarlGrey 1 are included in this "EG1"
@@ -69,8 +83,9 @@
 
 // Loads |URL| in the current WebState with transition type
 // ui::PAGE_TRANSITION_TYPED, and waits for the loading to complete within a
-// timeout. Returns nil on success, or else an NSError indicating why the
-// operation failed.
+// timeout.
+// If the condition is not met within a timeout returns an NSError indicating
+// why the operation failed, otherwise nil.
 // TODO(crbug.com/963613): Change return type to avoid when
 // CHROME_EG_ASSERT_NO_ERROR is removed.
 - (NSError*)loadURL:(const GURL&)URL;
@@ -78,21 +93,23 @@
 // Checks whether current WebState is loading.
 - (BOOL)isLoading WARN_UNUSED_RESULT;
 
-// Reloads the page and waits for the loading to complete within a timeout.
-// If the condition is not met within a timeout returns an NSError indicating
-// why the operation failed, otherwise nil.
-- (NSError*)reload WARN_UNUSED_RESULT;
-
-// Navigates back to the previous page and waits for the loading to complete
-// within a timeout, or a GREYAssert is induced.
-- (NSError*)goBack WARN_UNUSED_RESULT;
+// Reloads the page and waits for the loading to complete within a timeout, or a
+// GREYAssert is induced.
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)reload;
 
 // Navigates forward to the next page and waits for the loading to complete
 // within a timeout, or a GREYAssert is induced.
-- (NSError*)goForward WARN_UNUSED_RESULT;
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)goForward;
 
-// Opens a new tab and waits for the new tab animation to complete.
-- (NSError*)openNewTab WARN_UNUSED_RESULT;
+// Opens a new tab and waits for the new tab animation to complete within a
+// timeout, or a GREYAssert is induced.
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)openNewTab;
 
 // Opens a new incognito tab and waits for the new tab animation to complete.
 - (NSError*)openNewIncognitoTab WARN_UNUSED_RESULT;
@@ -102,68 +119,49 @@
 // normal after closing all tabs.
 - (void)closeAllTabsInCurrentMode;
 
-// Closes all incognito tabs and waits for the UI to complete.
-- (NSError*)closeAllIncognitoTabs WARN_UNUSED_RESULT;
+// Closes all incognito tabs and waits for the UI to complete  within a
+// timeout, or a GREYAssert is induced.
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)closeAllIncognitoTabs;
 
 // Closes the current tab and waits for the UI to complete.
 - (void)closeCurrentTab;
 
-// Waits for the page to finish loading within a timeout, or a GREYAssert is
-// induced.
-- (NSError*)waitForPageToFinishLoading WARN_UNUSED_RESULT;
-
 // Taps html element with |elementID| in the current web view.
 - (NSError*)tapWebViewElementWithID:(NSString*)elementID WARN_UNUSED_RESULT;
 
 // Waits for a static html view containing |text|. If the condition is not met
 // within a timeout, a GREYAssert is induced.
-- (NSError*)waitForStaticHTMLViewContainingText:(NSString*)text
-    WARN_UNUSED_RESULT;
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)waitForStaticHTMLViewContainingText:(NSString*)text;
 
 // Waits for there to be no static html view, or a static html view that does
 // not contain |text|. If the condition is not met within a timeout, a
 // GREYAssert is induced.
-- (NSError*)waitForStaticHTMLViewNotContainingText:(NSString*)text
-    WARN_UNUSED_RESULT;
+// TODO(crbug.com/963613): Change return type to void when
+// CHROME_EG_ASSERT_NO_ERROR is removed.
+- (NSError*)waitForStaticHTMLViewNotContainingText:(NSString*)text;
 
-// Waits for a Chrome error page. If it is not found within a timeout, a
-// GREYAssert is induced.
+// Waits for a Chrome error page.
+// If the condition is not met within a timeout returns an NSError indicating
+// why the operation failed, otherwise nil.
 - (NSError*)waitForErrorPage WARN_UNUSED_RESULT;
 
-// Waits for the current web view to contain |text|. If the condition is not met
-// within a timeout, a GREYAssert is induced.
-- (NSError*)waitForWebViewContainingText:(std::string)text WARN_UNUSED_RESULT;
-
-// Waits for the current web view to contain an element matching |selector|.
-// If the condition is not met within a timeout, a GREYAssert is induced.
-- (NSError*)waitForWebViewContainingElement:(ElementSelector*)selector
-    WARN_UNUSED_RESULT;
-
-// Waits for there to be no web view containing |text|. If the condition is not
-// met within a timeout, a GREYAssert is induced.
-- (NSError*)waitForWebViewNotContainingText:(std::string)text
-    WARN_UNUSED_RESULT;
-
-// Waits for there to be |count| number of non-incognito tabs. If the condition
-// is not met within a timeout, a GREYAssert is induced.
+// Waits for there to be |count| number of non-incognito tabs.
+// If the condition is not met within a timeout returns an NSError indicating
+// why the operation failed, otherwise nil.
 - (NSError*)waitForMainTabCount:(NSUInteger)count WARN_UNUSED_RESULT;
 
-// Waits for there to be |count| number of incognito tabs. If the condition is
-// not met within a timeout, a GREYAssert is induced.
+// Waits for there to be |count| number of incognito tabs.
+// If the condition is not met within a timeout returns an NSError indicating
+// why the operation failed, otherwise nil.
 - (NSError*)waitForIncognitoTabCount:(NSUInteger)count WARN_UNUSED_RESULT;
 
-// Waits for there to be a web view containing a blocked |image_id|.  When
-// blocked, the image element will be smaller than the actual image size.
-- (NSError*)waitForWebViewContainingBlockedImageElementWithID:
-    (std::string)imageID WARN_UNUSED_RESULT;
-
-// Waits for there to be a web view containing loaded image with |image_id|.
-// When loaded, the image element will have the same size as actual image.
-- (NSError*)waitForWebViewContainingLoadedImageElementWithID:
-    (std::string)imageID WARN_UNUSED_RESULT;
-
-// Waits for the bookmark internal state to be done loading. If it does not
-// happen within a timeout, a GREYAssert is induced.
+// Waits for the bookmark internal state to be done loading.
+// If the condition is not met within a timeout returns an NSError indicating
+// why the operation failed, otherwise nil.
 - (NSError*)waitForBookmarksToFinishLoading WARN_UNUSED_RESULT;
 
 // Clears bookmarks and if any bookmark still presents. Returns nil on success,
@@ -171,9 +169,86 @@
 - (NSError*)clearBookmarks;
 
 // Waits for the matcher to return an element that is sufficiently visible.
+- (NSError*)waitForSufficientlyVisibleElementWithMatcher:
+    (id<GREYMatcher>)matcher WARN_UNUSED_RESULT;
+
+#pragma mark - WebView Utilities to not break downstream builds.
+
+// Remove methods below since a cl below will be submitted
+// https://chrome-internal-review.googlesource.com/c/chrome/ios_internal/+/1284395
+
+// Waits for the matcher to return an element that is sufficiently visible.
 - (NSError*)waitForElementWithMatcherSufficientlyVisible:
     (id<GREYMatcher>)matcher WARN_UNUSED_RESULT;
 
+// Waits for the current web state to contain |text|. Returns nil if the
+// condition is met within a timeout, otherwise an NSError indicating why the
+// operation failed.
+- (NSError*)waitForWebViewContainingText:(std::string)text WARN_UNUSED_RESULT;
+
+// Waits for there to be no web state containing |text|.
+// If the condition is not met within a timeout returns an NSError indicating
+// why the operation failed, otherwise nil.
+- (NSError*)waitForWebViewNotContainingText:(std::string)text
+    WARN_UNUSED_RESULT;
+
+// Taps html element with |elementID| in the current web state.
+- (NSError*)tapWebViewElementWithID:(NSString*)elementID WARN_UNUSED_RESULT;
+
+// Waits for there to be a web state containing loaded image with |image_id|.
+// When loaded, the image element will have the same size as actual image.
+- (NSError*)waitForWebViewContainingLoadedImageElementWithID:
+    (std::string)imageID WARN_UNUSED_RESULT;
+
+// Waits for there to be a web state containing a blocked |image_id|.  When
+// blocked, the image element will be smaller than the actual image size.
+- (NSError*)waitForWebViewContainingBlockedImageElementWithID:
+    (std::string)imageID WARN_UNUSED_RESULT;
+
+#pragma mark - WebState Utilities
+
+// Taps html element with |elementID| in the current web state.
+- (NSError*)tapWebStateElementWithID:(NSString*)elementID WARN_UNUSED_RESULT;
+
+// Attempts to tap the element with |element_id| within window.frames[0] of the
+// current WebState using a JavaScript click() event. This only works on
+// same-origin iframes.
+// If the condition did not succeeded returns an NSError indicating
+// why the operation failed, otherwise nil.
+- (NSError*)tapWebStateElementInIFrameWithID:(const std::string&)elementID
+    WARN_UNUSED_RESULT;
+
+// Attempts to submit form with |formID| in the current WebState.
+- (NSError*)submitWebStateFormWithID:(const std::string&)formID
+    WARN_UNUSED_RESULT;
+
+// Waits for the current web state to contain |text|. Returns nil if the
+// condition is met within a timeout, otherwise an NSError indicating why the
+// operation failed.
+- (NSError*)waitForWebStateContainingText:(std::string)text WARN_UNUSED_RESULT;
+
+// Waits for the current web state to contain an element matching |selector|.
+// If the condition is not met within a timeout returns an NSError indicating
+// why the operation failed, otherwise nil.
+- (NSError*)waitForWebStateContainingElement:(ElementSelector*)selector
+    WARN_UNUSED_RESULT;
+
+// Waits for there to be no web state containing |text|.
+// If the condition is not met within a timeout returns an NSError indicating
+// why the operation failed, otherwise nil.
+- (NSError*)waitForWebStateNotContainingText:(std::string)text
+    WARN_UNUSED_RESULT;
+
+// Waits for there to be a web state containing a blocked |image_id|.  When
+// blocked, the image element will be smaller than the actual image size.
+- (NSError*)waitForWebStateContainingBlockedImageElementWithID:
+    (std::string)imageID WARN_UNUSED_RESULT;
+
+// Waits for there to be a web state containing loaded image with |image_id|.
+// When loaded, the image element will have the same size as actual image.
+- (NSError*)waitForWebStateContainingLoadedImageElementWithID:
+    (std::string)imageID WARN_UNUSED_RESULT;
+
 #pragma mark - Sync Utilities
 
 // Clears fake sync server data.
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index fe391f2..4e454bab 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -39,9 +39,14 @@
 #endif
 
 using base::test::ios::kWaitForJSCompletionTimeout;
+using base::test::ios::kWaitForPageLoadTimeout;
 using base::test::ios::kWaitForUIElementTimeout;
 using base::test::ios::WaitUntilConditionOrTimeout;
 
+namespace {
+NSString* kWaitForPageToFinishLoadingError = @"Page did not finish loading";
+}
+
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
@@ -63,6 +68,26 @@
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
 }
 
+- (NSError*)goBack {
+  [ChromeEarlGreyAppInterface goBack];
+
+  [self waitForPageToFinishLoading];
+  return nil;
+}
+
+- (NSError*)waitForPageToFinishLoading {
+  GREYCondition* finishedLoading = [GREYCondition
+      conditionWithName:kWaitForPageToFinishLoadingError
+                  block:^{
+                    return ![ChromeEarlGreyAppInterface isLoading];
+                  }];
+
+  bool pageLoaded = [finishedLoading waitWithTimeout:kWaitForPageLoadTimeout];
+  EG_TEST_HELPER_ASSERT_TRUE(pageLoaded, kWaitForPageToFinishLoadingError);
+
+  return nil;
+}
+
 @end
 
 // The helpers below only compile under EarlGrey1.
@@ -132,13 +157,10 @@
 
 - (NSError*)loadURL:(const GURL&)URL waitForCompletion:(BOOL)wait {
   chrome_test_util::LoadUrl(URL);
-  if (!wait) {
-    return nil;
+  if (wait) {
+    [self waitForPageToFinishLoading];
   }
 
-  bool pageLoaded = chrome_test_util::WaitForPageToFinishLoading();
-  EG_TEST_HELPER_ASSERT_TRUE(pageLoaded, @"Page did not complete loading");
-
   web::WebState* webState = chrome_test_util::GetCurrentWebState();
   if (webState->ContentIsHTML()) {
     bool windowIDInjected = web::WaitUntilWindowIdInjected(webState);
@@ -158,37 +180,32 @@
 
 - (NSError*)reload {
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() reload];
-  return [ChromeEarlGrey waitForPageToFinishLoading];
-}
+  [self waitForPageToFinishLoading];
 
-- (NSError*)goBack {
-  [chrome_test_util::BrowserCommandDispatcherForMainBVC() goBack];
-
-  return [ChromeEarlGrey waitForPageToFinishLoading];
+  return nil;
 }
 
 - (NSError*)goForward {
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() goForward];
+  [self waitForPageToFinishLoading];
 
-  return [ChromeEarlGrey waitForPageToFinishLoading];
+  return nil;
 }
 
 - (NSError*)openNewTab {
   chrome_test_util::OpenNewTab();
-  NSError* error = [ChromeEarlGrey waitForPageToFinishLoading];
-  if (!error) {
-    [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-  }
-  return error;
+  [self waitForPageToFinishLoading];
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
+  return nil;
 }
 
 - (NSError*)openNewIncognitoTab {
   chrome_test_util::OpenNewIncognitoTab();
-  NSError* error = [ChromeEarlGrey waitForPageToFinishLoading];
-  if (!error) {
-    [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-  }
-  return error;
+  [self waitForPageToFinishLoading];
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
+  return nil;
 }
 
 - (void)closeAllTabsInCurrentMode {
@@ -197,11 +214,10 @@
 }
 
 - (NSError*)closeAllIncognitoTabs {
-  if (!chrome_test_util::CloseAllIncognitoTabs()) {
-    return testing::NSErrorWithLocalizedDescription(@"Tabs did not close");
-  }
-
+  bool closed = chrome_test_util::CloseAllIncognitoTabs();
+  EG_TEST_HELPER_ASSERT_TRUE(closed, @"Could not close all Incognito tabs");
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
   return nil;
 }
 
@@ -210,29 +226,6 @@
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
 }
 
-- (NSError*)waitForPageToFinishLoading {
-  if (!chrome_test_util::WaitForPageToFinishLoading()) {
-    return testing::NSErrorWithLocalizedDescription(
-        @"Page did not complete loading.");
-  }
-
-  return nil;
-}
-
-- (NSError*)tapWebViewElementWithID:(NSString*)elementID {
-  BOOL success =
-      web::test::TapWebViewElementWithId(chrome_test_util::GetCurrentWebState(),
-                                         base::SysNSStringToUTF8(elementID));
-
-  if (!success) {
-    NSString* errorDescription = [NSString
-        stringWithFormat:@"Failed to tap web view element with ID: %@",
-                         elementID];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
-  }
-  return nil;
-}
-
 - (NSError*)waitForErrorPage {
   NSString* const kErrorPageText =
       l10n_util::GetNSString(IDS_ERRORPAGES_HEADING_NOT_AVAILABLE);
@@ -240,81 +233,28 @@
 }
 
 - (NSError*)waitForStaticHTMLViewContainingText:(NSString*)text {
-  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
+  bool hasStaticView = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
     return chrome_test_util::StaticHtmlViewContainingText(
         chrome_test_util::GetCurrentWebState(), base::SysNSStringToUTF8(text));
   });
 
-  if (!success) {
-    NSString* errorDescription = [NSString
-        stringWithFormat:@"Failed to find static html view containing %@",
-                         text];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
-  }
+  NSString* errorDescription = [NSString
+      stringWithFormat:@"Failed to find static html view containing %@", text];
+  EG_TEST_HELPER_ASSERT_TRUE(hasStaticView, errorDescription);
 
   return nil;
 }
 
 - (NSError*)waitForStaticHTMLViewNotContainingText:(NSString*)text {
-  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
+  bool noStaticView = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
     return !chrome_test_util::StaticHtmlViewContainingText(
         chrome_test_util::GetCurrentWebState(), base::SysNSStringToUTF8(text));
   });
 
-  if (!success) {
-    NSString* errorDescription = [NSString
-        stringWithFormat:@"Failed, there was a static html view containing %@",
-                         text];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
-  }
-
-  return nil;
-}
-
-- (NSError*)waitForWebViewContainingText:(std::string)text {
-  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
-    return web::test::IsWebViewContainingText(
-        chrome_test_util::GetCurrentWebState(), text);
-  });
-
-  if (!success) {
-    NSString* errorDescription =
-        [NSString stringWithFormat:@"Failed waiting for web view containing %s",
-                                   text.c_str()];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
-  }
-
-  return nil;
-}
-
-- (NSError*)waitForWebViewContainingElement:(ElementSelector*)selector {
-  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
-    return web::test::IsWebViewContainingElement(
-        chrome_test_util::GetCurrentWebState(), selector);
-  });
-
-  if (!success) {
-    NSString* errorDescription = [NSString
-        stringWithFormat:@"Failed waiting for web view containing element %@",
-                         selector.selectorDescription];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
-  }
-
-  return nil;
-}
-
-- (NSError*)waitForWebViewNotContainingText:(std::string)text {
-  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
-    return !web::test::IsWebViewContainingText(
-        chrome_test_util::GetCurrentWebState(), text);
-  });
-
-  if (!success) {
-    NSString* errorDescription = [NSString
-        stringWithFormat:@"Failed waiting for web view not containing %s",
-                         text.c_str()];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
-  }
+  NSString* errorDescription = [NSString
+      stringWithFormat:@"Failed, there was a static html view containing %@",
+                       text];
+  EG_TEST_HELPER_ASSERT_TRUE(noStaticView, errorDescription);
 
   return nil;
 }
@@ -327,11 +267,10 @@
   });
 
   if (!success) {
-    NSString* errorDescription =
+    return testing::NSErrorWithLocalizedDescription(
         [NSString stringWithFormat:@"Failed waiting for main tab "
                                    @"count to become %" PRIuNS,
-                                   count];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
+                                   count]);
   }
 
   return nil;
@@ -345,43 +284,10 @@
   });
 
   if (!success) {
-    NSString* errorDescription =
+    return testing::NSErrorWithLocalizedDescription(
         [NSString stringWithFormat:@"Failed waiting for incognito tab "
                                    @"count to become %" PRIuNS,
-                                   count];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
-  }
-
-  return nil;
-}
-
-- (NSError*)waitForWebViewContainingBlockedImageElementWithID:
-    (std::string)imageID {
-  bool success = web::test::WaitForWebViewContainingImage(
-      imageID, chrome_test_util::GetCurrentWebState(),
-      web::test::IMAGE_STATE_BLOCKED);
-
-  if (!success) {
-    NSString* errorDescription = [NSString
-        stringWithFormat:@"Failed waiting for web view blocked image %s",
-                         imageID.c_str()];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
-  }
-
-  return nil;
-}
-
-- (NSError*)waitForWebViewContainingLoadedImageElementWithID:
-    (std::string)imageID {
-  bool success = web::test::WaitForWebViewContainingImage(
-      imageID, chrome_test_util::GetCurrentWebState(),
-      web::test::IMAGE_STATE_LOADED);
-
-  if (!success) {
-    NSString* errorDescription = [NSString
-        stringWithFormat:@"Failed waiting for web view loaded image %s",
-                         imageID.c_str()];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
+                                   count]);
   }
 
   return nil;
@@ -409,7 +315,7 @@
   return nil;
 }
 
-- (NSError*)waitForElementWithMatcherSufficientlyVisible:
+- (NSError*)waitForSufficientlyVisibleElementWithMatcher:
     (id<GREYMatcher>)matcher {
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     NSError* error = nil;
@@ -420,16 +326,165 @@
   });
 
   if (!success) {
-    NSString* errorDescription = [NSString
+    return testing::NSErrorWithLocalizedDescription([NSString
         stringWithFormat:
             @"Failed waiting for element with matcher %@ to become visible",
-            matcher];
-    return testing::NSErrorWithLocalizedDescription(errorDescription);
+            matcher]);
+  }
+  return nil;
+}
+
+#pragma mark - WebState Utilities
+
+- (NSError*)tapWebStateElementWithID:(NSString*)elementID {
+  NSError* error = nil;
+  NSError* __autoreleasing tempError = error;
+  BOOL success = web::test::TapWebViewElementWithId(
+      chrome_test_util::GetCurrentWebState(),
+      base::SysNSStringToUTF8(elementID), &tempError);
+  error = tempError;
+
+  if (error != nil) {
+    return error;
+  }
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription([NSString
+        stringWithFormat:@"Failed to tap web state element with ID: %@",
+                         elementID]);
+  }
+  return nil;
+}
+
+- (NSError*)tapWebStateElementInIFrameWithID:(const std::string&)elementID {
+  bool success = web::test::TapWebViewElementWithIdInIframe(
+      chrome_test_util::GetCurrentWebState(), elementID);
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription(
+        [NSString stringWithFormat:@"Failed to tap element with ID=%s",
+                                   elementID.c_str()]);
   }
 
   return nil;
 }
 
+- (NSError*)submitWebStateFormWithID:(const std::string&)formID {
+  bool success = web::test::SubmitWebViewFormWithId(
+      chrome_test_util::GetCurrentWebState(), formID);
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription([NSString
+        stringWithFormat:@"Failed to submit form with ID=%s", formID.c_str()]);
+  }
+
+  return nil;
+}
+
+- (NSError*)waitForWebStateContainingText:(std::string)text {
+  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
+    return web::test::IsWebViewContainingText(
+        chrome_test_util::GetCurrentWebState(), text);
+  });
+
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription([NSString
+        stringWithFormat:@"Failed waiting for web state containing %s",
+                         text.c_str()]);
+  }
+
+  return nil;
+}
+
+- (NSError*)waitForWebStateContainingElement:(ElementSelector*)selector {
+  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
+    return web::test::IsWebViewContainingElement(
+        chrome_test_util::GetCurrentWebState(), selector);
+  });
+
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription([NSString
+        stringWithFormat:@"Failed waiting for web state containing element %@",
+                         selector.selectorDescription]);
+  }
+
+  return nil;
+}
+
+- (NSError*)waitForWebStateNotContainingText:(std::string)text {
+  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
+    return !web::test::IsWebViewContainingText(
+        chrome_test_util::GetCurrentWebState(), text);
+  });
+
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription([NSString
+        stringWithFormat:@"Failed waiting for web view not containing %s",
+                         text.c_str()]);
+  }
+
+  return nil;
+}
+
+- (NSError*)waitForWebStateContainingBlockedImageElementWithID:
+    (std::string)imageID {
+  bool success = web::test::WaitForWebViewContainingImage(
+      imageID, chrome_test_util::GetCurrentWebState(),
+      web::test::IMAGE_STATE_BLOCKED);
+
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription([NSString
+        stringWithFormat:@"Failed waiting for web view blocked image %s",
+                         imageID.c_str()]);
+  }
+
+  return nil;
+}
+
+- (NSError*)waitForWebStateContainingLoadedImageElementWithID:
+    (std::string)imageID {
+  bool success = web::test::WaitForWebViewContainingImage(
+      imageID, chrome_test_util::GetCurrentWebState(),
+      web::test::IMAGE_STATE_LOADED);
+
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription([NSString
+        stringWithFormat:@"Failed waiting for web view loaded image %s",
+                         imageID.c_str()]);
+  }
+
+  return nil;
+}
+
+#pragma mark - WebState Utilities to not break downstream builds.
+
+// Remove methods below since a cl below will be submitted
+// https://chrome-internal-review.googlesource.com/c/chrome/ios_internal/+/1284395
+
+- (NSError*)waitForElementWithMatcherSufficientlyVisible:
+    (id<GREYMatcher>)matcher {
+  return [self waitForSufficientlyVisibleElementWithMatcher:matcher];
+}
+
+- (NSError*)waitForWebViewContainingText:(std::string)text {
+  return [self waitForWebStateContainingText:text];
+}
+
+- (NSError*)waitForWebViewNotContainingText:(std::string)text {
+  return [self waitForWebStateNotContainingText:text];
+}
+
+- (NSError*)tapWebViewElementWithID:(NSString*)elementID {
+  return [self tapWebStateElementWithID:elementID];
+}
+
+- (NSError*)waitForWebViewContainingLoadedImageElementWithID:
+    (std::string)imageID {
+  return [self waitForWebStateContainingLoadedImageElementWithID:imageID];
+}
+
+- (NSError*)waitForWebViewContainingBlockedImageElementWithID:
+    (std::string)imageID {
+  return [self waitForWebStateContainingBlockedImageElementWithID:imageID];
+}
+
 #pragma mark - Sync Utilities
 
 - (void)clearSyncServerData {
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
index ac8c6738..034e305e 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -17,6 +17,12 @@
 // operation failed.
 + (NSError*)clearBrowsingHistory;
 
+// Returns YES if the current WebState is loading.
++ (BOOL)isLoading;
+
+// Navigates back to the previous page.
++ (void)goBack;
+
 @end
 
 #endif  // IOS_CHROME_TEST_EARL_GREY_CHROME_EARL_GREY_APP_INTERFACE_H_
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
index 517def1..f9ef2c8 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -4,7 +4,9 @@
 
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h"
 
+#import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/history_test_util.h"
+#include "ios/chrome/test/app/navigation_test_util.h"
 #import "ios/testing/nserror_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -22,4 +24,12 @@
       @"Clearing browser history timed out");
 }
 
++ (bool)isLoading {
+  return chrome_test_util::IsLoading();
+}
+
++ (void)goBack {
+  [chrome_test_util::BrowserCommandDispatcherForMainBVC() goBack];
+}
+
 @end
diff --git a/ios/chrome/test/earl_grey/chrome_egtest_bundle_main.h b/ios/chrome/test/earl_grey/chrome_egtest_bundle_main.h
new file mode 100644
index 0000000..d1f7b55
--- /dev/null
+++ b/ios/chrome/test/earl_grey/chrome_egtest_bundle_main.h
@@ -0,0 +1,17 @@
+// 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 IOS_CHROME_TEST_EARL_GREY_CHROME_EGTEST_BUNDLE_MAIN_H_
+#define IOS_CHROME_TEST_EARL_GREY_CHROME_EGTEST_BUNDLE_MAIN_H_
+
+#import <Foundation/Foundation.h>
+
+// An object that can be set as the NSPrincipalClass for an EG2 test bundle and
+// performs various startup-related tasks.  This is necessary because test
+// bundles don't have a fixed entry point in the way that application bundles
+// do.
+@interface ChromeEGTestBundleMain : NSObject
+@end
+
+#endif  // IOS_CHROME_TEST_EARL_GREY_CHROME_EGTEST_BUNDLE_MAIN_H_
diff --git a/ios/chrome/test/earl_grey/chrome_egtest_bundle_main.mm b/ios/chrome/test/earl_grey/chrome_egtest_bundle_main.mm
new file mode 100644
index 0000000..c97b7ad3
--- /dev/null
+++ b/ios/chrome/test/earl_grey/chrome_egtest_bundle_main.mm
@@ -0,0 +1,88 @@
+// 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.
+
+#import "ios/chrome/test/earl_grey/chrome_egtest_bundle_main.h"
+
+#import <XCTest/XCTest.h>
+#include <memory>
+
+#include "base/at_exit.h"
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+#include "ui/base/resource/resource_bundle.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+// Contains startup code for a Chrome EG2 test module. Performs startup tasks
+// when constructed and shutdown tasks when destroyed. Callers should create an
+// instance of this object before running any tests and destroy the instance
+// after tests have completed.
+class TestMain {
+ public:
+  TestMain() {
+    // Initialize the CommandLine, because ResourceBundle requires it to exist.
+    base::CommandLine::Init(/*argc=*/0, /*argv=*/nullptr);
+
+    // Load pak files into the ResourceBundle.
+    l10n_util::OverrideLocaleWithCocoaLocale();
+    const std::string loaded_locale =
+        ui::ResourceBundle::InitSharedInstanceWithLocale(
+            /*pref_locale=*/std::string(), /*delegate=*/nullptr,
+            ui::ResourceBundle::LOAD_COMMON_RESOURCES);
+    CHECK(!loaded_locale.empty());
+  }
+
+  ~TestMain() {}
+
+ private:
+  base::AtExitManager exit_manager_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestMain);
+};
+
+}
+
+@interface ChromeEGTestBundleMain () <XCTestObservation> {
+  std::unique_ptr<TestMain> _testMain;
+}
+@end
+
+@implementation ChromeEGTestBundleMain
+
+- (instancetype)init {
+  if ((self = [super init])) {
+    [[XCTestObservationCenter sharedTestObservationCenter]
+        addTestObserver:self];
+  }
+  return self;
+}
+
+#pragma mark - XCTestObservation
+
+- (void)testBundleWillStart:(NSBundle*)testBundle {
+  DCHECK(!_testMain);
+  _testMain = std::make_unique<TestMain>();
+
+  // Ensure that //ios/web and the bulk of //ios/chrome/browser are not compiled
+  // into the test module. This is hard to assert at compile time, due to
+  // transitive dependencies, but at runtime it's easy to check if certain key
+  // classes are present or absent.
+  CHECK(NSClassFromString(@"CRWWebController") == nil);
+  CHECK(NSClassFromString(@"MainController") == nil);
+  CHECK(NSClassFromString(@"BrowserViewController") == nil);
+}
+
+- (void)testBundleDidFinish:(NSBundle*)testBundle {
+  [[XCTestObservationCenter sharedTestObservationCenter]
+      removeTestObserver:self];
+
+  _testMain.reset();
+}
+
+@end
diff --git a/ios/chrome/test/earl_grey/device_check_egtest.mm b/ios/chrome/test/earl_grey/device_check_egtest.mm
index be3c969..9b7ece8 100644
--- a/ios/chrome/test/earl_grey/device_check_egtest.mm
+++ b/ios/chrome/test/earl_grey/device_check_egtest.mm
@@ -25,7 +25,7 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [ChromeEarlGrey loadURL:GURL("http://browsingtest.appspot.com")]);
   CHROME_EG_ASSERT_NO_ERROR(
-      [ChromeEarlGrey waitForWebViewContainingText:"Window1"]);
+      [ChromeEarlGrey waitForWebStateContainingText:"Window1"]);
 }
 
 @end
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn
index 945fd8b..9e4f66d 100644
--- a/ios/chrome/test/earl_grey2/BUILD.gn
+++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -67,9 +67,11 @@
 
   deps = [
     ":shared_helper_headers",
+    "//ios/chrome/app/strings",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:eg_test_support+eg2",
     "//ios/third_party/earl_grey2:test_lib",
+    "//ui/base",
   ]
 
   libs = [ "UIKit.framework" ]
diff --git a/ios/chrome/test/earl_grey2/chrome_ios_eg2_test.gni b/ios/chrome/test/earl_grey2/chrome_ios_eg2_test.gni
index 592eda5..3a230f1 100644
--- a/ios/chrome/test/earl_grey2/chrome_ios_eg2_test.gni
+++ b/ios/chrome/test/earl_grey2/chrome_ios_eg2_test.gni
@@ -148,10 +148,14 @@
                              "deps",
                            ])
 
+    xctest_bundle_principal_class = "ChromeEGTestBundleMain"
+
     if (!defined(deps)) {
       deps = []
     }
     deps += [ "//ios/chrome/test/earl_grey:eg_test_support+eg2" ]
+
+    bundle_deps = [ "//ios/chrome/app/resources" ]
   }
 }
 
diff --git a/ios/chrome/test/earl_grey2/smoke_egtest.mm b/ios/chrome/test/earl_grey2/smoke_egtest.mm
index b2f0add..d0f2abfb 100644
--- a/ios/chrome/test/earl_grey2/smoke_egtest.mm
+++ b/ios/chrome/test/earl_grey2/smoke_egtest.mm
@@ -5,6 +5,7 @@
 #import <TestLib/EarlGreyImpl/EarlGrey.h>
 #import <UIKit/UIKit.h>
 
+#include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_error_util.h"
@@ -12,6 +13,7 @@
 #import "ios/chrome/test/earl_grey2/chrome_earl_grey_edo.h"
 #import "ios/testing/earl_grey/base_earl_grey_test_case.h"
 #import "ios/testing/earl_grey/earl_grey_test.h"
+#include "ui/base/l10n/l10n_util_mac.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -85,4 +87,19 @@
   [ChromeEarlGrey clearBrowsingHistory];
 }
 
+// Tests that string resources are loaded into the ResourceBundle and available
+// for use in tests.
+- (void)testAppResourcesArePresent {
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::ToolsMenuButton()]
+      performAction:grey_tap()];
+
+  NSString* settingsLabel = l10n_util::GetNSString(IDS_IOS_TOOLBAR_SETTINGS);
+  [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(settingsLabel)]
+      assertWithMatcher:grey_sufficientlyVisible()];
+
+  // Tap a second time to close the menu.
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::ToolsMenuButton()]
+      performAction:grey_tap()];
+}
+
 @end
diff --git a/ios/public/provider/chrome/browser/images/branded_image_provider.h b/ios/public/provider/chrome/browser/images/branded_image_provider.h
index a2c721da..03da08c8 100644
--- a/ios/public/provider/chrome/browser/images/branded_image_provider.h
+++ b/ios/public/provider/chrome/browser/images/branded_image_provider.h
@@ -54,6 +54,10 @@
   virtual UIImage* GetToolbarSearchIcon(SearchEngineIcon type,
                                         bool dark_version);
 
+  // Returns the 30pt x 30pt image to use for the fallback icon for answers in
+  // the omnibox popup and in the omnibox as the default search engine icon.
+  virtual UIImage* GetOmniboxAnswerIcon();
+
  private:
   DISALLOW_COPY_AND_ASSIGN(BrandedImageProvider);
 };
diff --git a/ios/public/provider/chrome/browser/images/branded_image_provider.mm b/ios/public/provider/chrome/browser/images/branded_image_provider.mm
index 2867b0c..1a3164f0 100644
--- a/ios/public/provider/chrome/browser/images/branded_image_provider.mm
+++ b/ios/public/provider/chrome/browser/images/branded_image_provider.mm
@@ -51,3 +51,7 @@
                                                     bool dark_version) {
   return [UIImage imageNamed:@"toolbar_search"];
 }
+
+UIImage* BrandedImageProvider::GetOmniboxAnswerIcon() {
+  return nil;
+}
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index e0314873..8e41d817 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -205,6 +205,7 @@
     "//ios/web/download:download_unittests",
     "//ios/web/find_in_page:find_in_page_unittests",
     "//ios/web/interstitials:interstitials_unittests",
+    "//ios/web/web_view:unittests",
   ]
 
   assert_no_deps = ios_assert_no_deps
diff --git a/ios/web/navigation/BUILD.gn b/ios/web/navigation/BUILD.gn
index 816b5c8e..c1d73da4 100644
--- a/ios/web/navigation/BUILD.gn
+++ b/ios/web/navigation/BUILD.gn
@@ -15,14 +15,19 @@
   deps = [
     ":block_universal_links_buildflags",
     ":core",
+    ":navigation_manager_util",
     "//base",
+    "//ios/net",
     "//ios/web:core",
     "//ios/web/common",
     "//ios/web/navigation:wk_navigation_util",
     "//ios/web/public",
+    "//ios/web/public/download",
     "//ios/web/web_state:session_certificate_policy_cache",
+    "//ios/web/web_state:user_interaction",
     "//ios/web/web_state:web_state_impl_header",
     "//ios/web/web_state/ui:crw_web_view_navigation_proxy",
+    "//ios/web/web_view",
     "//ui/base",
     "//url",
   ]
diff --git a/ios/web/navigation/crw_wk_navigation_handler.h b/ios/web/navigation/crw_wk_navigation_handler.h
index aff7624..92283dc1 100644
--- a/ios/web/navigation/crw_wk_navigation_handler.h
+++ b/ios/web/navigation/crw_wk_navigation_handler.h
@@ -8,21 +8,87 @@
 #import <UIKit/UIKit.h>
 #import <WebKit/WebKit.h>
 
+#import <memory>
+
+#include "ui/base/page_transition_types.h"
+
+@class CRWWKNavigationHandler;
 @class CRWPendingNavigationInfo;
 @class CRWWKNavigationStates;
-@class CRWWKNavigationHandler;
-
+class GURL;
 namespace base {
 class RepeatingTimer;
 }
+namespace web {
+enum class WKNavigationState;
+struct Referrer;
+class WebStateImpl;
+class NavigationContextImpl;
+class UserInteractionState;
+}
 
 // CRWWKNavigationHandler uses this protocol to interact with its owner.
 @protocol CRWWKNavigationHandlerDelegate <NSObject>
 
+// Returns associated WebStateImpl.
+- (web::WebStateImpl*)webStateImplForNavigationHandler:
+    (CRWWKNavigationHandler*)navigationHandler;
+
+// Returns associated UserInteractionState.
+- (web::UserInteractionState*)userInteractionStateForNavigationHandler:
+    (CRWWKNavigationHandler*)navigationHandler;
+
+// Returns current Referrer.
+- (web::Referrer)currentReferrerForNavigationHandler:
+    (CRWWKNavigationHandler*)navigationHandler;
+
 // Returns YES if WKWebView was deallocated or is being deallocated.
 - (BOOL)navigationHandlerWebViewBeingDestroyed:
     (CRWWKNavigationHandler*)navigationHandler;
 
+// Returns the actual URL of the document object (i.e., the last committed URL
+// of the main frame).
+- (GURL)navigationHandlerDocumentURL:(CRWWKNavigationHandler*)navigationHandler;
+
+// Sets document URL to newURL, and updates any relevant state information.
+- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler
+           setDocumentURL:(const GURL&)newURL
+                  context:(web::NavigationContextImpl*)context;
+
+// Maps WKNavigationType to ui::PageTransition.
+- (ui::PageTransition)navigationHandler:
+                          (CRWWKNavigationHandler*)navigationHandler
+       pageTransitionFromNavigationType:(WKNavigationType)navigationType;
+
+// Sets up WebUI for URL.
+- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler
+        createWebUIForURL:(const GURL&)URL;
+
+// Stop Loading current page.
+- (void)navigationHandlerStopLoading:(CRWWKNavigationHandler*)navigationHandler;
+
+// Aborts any load for both the web view and its controller.
+- (void)navigationHandlerAbortLoading:
+    (CRWWKNavigationHandler*)navigationHandler;
+
+// Returns YES if |url| should be loaded in a native view.
+- (BOOL)navigationHandler:(CRWWKNavigationHandler*)navigationHandler
+    shouldLoadURLInNativeView:(const GURL&)url;
+
+// Requires that the next load rebuild the web view. This is expensive, and
+// should be used only in the case where something has changed that the web view
+// only checks on creation, such that the whole object needs to be rebuilt.
+- (void)navigationHandlerRequirePageReconstruction:
+    (CRWWKNavigationHandler*)navigationHandler;
+
+- (std::unique_ptr<web::NavigationContextImpl>)
+            navigationHandler:(CRWWKNavigationHandler*)navigationHandler
+    registerLoadRequestForURL:(const GURL&)URL
+       sameDocumentNavigation:(BOOL)sameDocumentNavigation
+               hasUserGesture:(BOOL)hasUserGesture
+            rendererInitiated:(BOOL)renderedInitiated
+        placeholderNavigation:(BOOL)placeholderNavigation;
+
 @end
 
 // Handler class for WKNavigationDelegate, deals with navigation callbacks from
@@ -31,6 +97,10 @@
 
 @property(nonatomic, weak) id<CRWWKNavigationHandlerDelegate> delegate;
 
+// TODO(crbug.com/956511): Change this to readonly when
+// |webViewWebProcessDidCrash| is moved to CRWWKNavigationHandler.
+@property(nonatomic, assign) BOOL webProcessCrashed;
+
 // Pending information for an in-progress page navigation. The lifetime of
 // this object starts at |decidePolicyForNavigationAction| where the info is
 // extracted from the request, and ends at either |didCommitNavigation| or
@@ -41,14 +111,34 @@
 // flight.
 @property(nonatomic, readonly, strong) CRWWKNavigationStates* navigationStates;
 
+// The current page loading phase.
+// TODO(crbug.com/956511): Remove this once refactor is done.
+@property(nonatomic, readwrite, assign) web::WKNavigationState navigationState;
+
 // The SafeBrowsingDetection timer.
 // TODO(crbug.com/956511): Remove this once refactor is done.
 @property(nonatomic, readonly, assign)
     base::RepeatingTimer* safeBrowsingWarningDetectionTimer;
 
+// Discards non committed items, only if the last committed URL was not loaded
+// in native view. But if it was a native view, no discard will happen to avoid
+// an ugly animation where the web view is inserted and quickly removed.
+- (void)discardNonCommittedItemsIfLastCommittedWasNotNativeView;
+
 // Instructs this handler to stop loading.
 - (void)stopLoading;
 
+// Returns context for pending navigation that has |URL|. null if there is no
+// matching pending navigation.
+- (web::NavigationContextImpl*)contextForPendingMainFrameNavigationWithURL:
+    (const GURL&)URL;
+
+// Notifies that server redirect has been received.
+// TODO(crbug.com/956511): Remove this once "webView:didCommitNavigation" is
+// moved into CRWWKNavigationHandler.
+- (void)didReceiveRedirectForNavigation:(web::NavigationContextImpl*)context
+                                withURL:(const GURL&)URL;
+
 @end
 
 #endif  // IOS_WEB_NAVIGATION_CRW_WK_NAVIGATION_HANDLER_H_
diff --git a/ios/web/navigation/crw_wk_navigation_handler.mm b/ios/web/navigation/crw_wk_navigation_handler.mm
index 8568a9e5..5bae183 100644
--- a/ios/web/navigation/crw_wk_navigation_handler.mm
+++ b/ios/web/navigation/crw_wk_navigation_handler.mm
@@ -4,15 +4,53 @@
 
 #import "ios/web/navigation/crw_wk_navigation_handler.h"
 
+#include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/strings/sys_string_conversions.h"
 #include "base/timer/timer.h"
+#import "ios/net/http_response_headers_util.h"
+#include "ios/web/common/features.h"
 #import "ios/web/navigation/crw_pending_navigation_info.h"
 #import "ios/web/navigation/crw_wk_navigation_states.h"
+#import "ios/web/navigation/navigation_context_impl.h"
+#import "ios/web/navigation/navigation_manager_impl.h"
+#include "ios/web/navigation/navigation_manager_util.h"
+#import "ios/web/navigation/wk_navigation_action_policy_util.h"
+#import "ios/web/navigation/wk_navigation_action_util.h"
+#import "ios/web/navigation/wk_navigation_util.h"
+#include "ios/web/public/browser_state.h"
+#import "ios/web/public/download/download_controller.h"
+#import "ios/web/public/url_scheme_util.h"
+#import "ios/web/public/web_client.h"
+#import "ios/web/web_state/user_interaction_state.h"
+#import "ios/web/web_state/web_state_impl.h"
+#import "ios/web/web_view/wk_web_view_util.h"
+#import "net/base/mac/url_conversions.h"
+#include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
+using web::wk_navigation_util::IsPlaceholderUrl;
+using web::wk_navigation_util::CreatePlaceholderUrlForUrl;
+using web::wk_navigation_util::kReferrerHeaderName;
+using web::wk_navigation_util::IsRestoreSessionUrl;
+using web::wk_navigation_util::IsWKInternalUrl;
+
+@interface CRWWKNavigationHandler ()
+
+// Returns the WebStateImpl from self.delegate.
+@property(nonatomic, readonly, assign) web::WebStateImpl* webStateImpl;
+// Returns the NavigationManagerImpl from self.webStateImpl.
+@property(nonatomic, readonly, assign)
+    web::NavigationManagerImpl* navigationManagerImpl;
+// Returns the UserInteractionState from self.delegate.
+@property(nonatomic, readonly, assign)
+    web::UserInteractionState* userInteractionState;
+
+@end
+
 @implementation CRWWKNavigationHandler {
   // Used to poll for a SafeBrowsing warning being displayed. This is created in
   // |decidePolicyForNavigationAction| and destroyed once any of the following
@@ -24,6 +62,9 @@
 - (instancetype)init {
   if (self = [super init]) {
     _navigationStates = [[CRWWKNavigationStates alloc] init];
+    // Load phase when no WebView present is 'loaded' because this represents
+    // the idle state.
+    _navigationState = web::WKNavigationState::FINISHED;
   }
   return self;
 }
@@ -35,6 +76,322 @@
                     decisionHandler:
                         (void (^)(WKNavigationActionPolicy))decisionHandler {
   [self didReceiveWKNavigationDelegateCallback];
+
+  self.webProcessCrashed = NO;
+  if ([self.delegate navigationHandlerWebViewBeingDestroyed:self]) {
+    decisionHandler(WKNavigationActionPolicyCancel);
+    return;
+  }
+
+  GURL requestURL = net::GURLWithNSURL(action.request.URL);
+
+  // Workaround for a WKWebView bug where the web content loaded using
+  // |-loadHTMLString:baseURL| clobbers the next WKBackForwardListItem. It works
+  // by detecting back/forward navigation to a clobbered item and replacing the
+  // clobberred item and its forward history using a partial session restore in
+  // the current web view. There is an unfortunate caveat: if the workaround is
+  // triggered in a back navigation to a clobbered item, the restored forward
+  // session is inserted after the current item before the back navigation, so
+  // it doesn't fully replaces the "bad" history, even though user will be
+  // navigated to the expected URL and may not notice the issue until they
+  // review the back history by long pressing on "Back" button.
+  //
+  // TODO(crbug.com/887497): remove this workaround once iOS ships the fix.
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
+      action.targetFrame.mainFrame) {
+    GURL webViewURL = net::GURLWithNSURL(webView.URL);
+    GURL currentWKItemURL =
+        net::GURLWithNSURL(webView.backForwardList.currentItem.URL);
+    GURL backItemURL = net::GURLWithNSURL(webView.backForwardList.backItem.URL);
+    web::NavigationContextImpl* context =
+        [self contextForPendingMainFrameNavigationWithURL:webViewURL];
+    bool willClobberHistory =
+        action.navigationType == WKNavigationTypeBackForward &&
+        requestURL == backItemURL && webView.backForwardList.currentItem &&
+        requestURL != currentWKItemURL && currentWKItemURL == webViewURL &&
+        context &&
+        (context->GetPageTransition() & ui::PAGE_TRANSITION_FORWARD_BACK);
+
+    UMA_HISTOGRAM_BOOLEAN("IOS.WKWebViewClobberedHistory", willClobberHistory);
+
+    if (willClobberHistory && base::FeatureList::IsEnabled(
+                                  web::features::kHistoryClobberWorkaround)) {
+      decisionHandler(WKNavigationActionPolicyCancel);
+      self.navigationManagerImpl
+          ->ApplyWKWebViewForwardHistoryClobberWorkaround();
+      return;
+    }
+  }
+
+  // The page will not be changed until this navigation is committed, so the
+  // retrieved state will be pending until |didCommitNavigation| callback.
+  [self updatePendingNavigationInfoFromNavigationAction:action];
+
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
+      action.targetFrame.mainFrame &&
+      action.navigationType == WKNavigationTypeBackForward) {
+    web::NavigationContextImpl* context =
+        [self contextForPendingMainFrameNavigationWithURL:requestURL];
+    if (context) {
+      // Context is null for renderer-initiated navigations.
+      int index = web::GetCommittedItemIndexWithUniqueID(
+          self.navigationManagerImpl, context->GetNavigationItemUniqueID());
+      self.navigationManagerImpl->SetPendingItemIndex(index);
+    }
+  }
+
+  // If this is a placeholder navigation, pass through.
+  if (IsPlaceholderUrl(requestURL)) {
+    decisionHandler(WKNavigationActionPolicyAllow);
+    return;
+  }
+
+  ui::PageTransition transition =
+      [self.delegate navigationHandler:self
+          pageTransitionFromNavigationType:action.navigationType];
+  BOOL isMainFrameNavigationAction = [self isMainFrameNavigationAction:action];
+  if (isMainFrameNavigationAction) {
+    web::NavigationContextImpl* context =
+        [self contextForPendingMainFrameNavigationWithURL:requestURL];
+    if (context) {
+      DCHECK(!context->IsRendererInitiated() ||
+             (context->GetPageTransition() & ui::PAGE_TRANSITION_FORWARD_BACK));
+      transition = context->GetPageTransition();
+      if (context->IsLoadingErrorPage()) {
+        // loadHTMLString: navigation which loads error page into WKWebView.
+        decisionHandler(WKNavigationActionPolicyAllow);
+        return;
+      }
+    }
+  }
+
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
+    // WKBasedNavigationManager doesn't use |loadCurrentURL| for reload or back/
+    // forward navigation. So this is the first point where a form repost would
+    // be detected. Display the confirmation dialog.
+    if ([action.request.HTTPMethod isEqual:@"POST"] &&
+        (action.navigationType == WKNavigationTypeFormResubmitted)) {
+      self.webStateImpl->ShowRepostFormWarningDialog(
+          base::BindOnce(^(bool shouldContinue) {
+            if (shouldContinue) {
+              decisionHandler(WKNavigationActionPolicyAllow);
+            } else {
+              decisionHandler(WKNavigationActionPolicyCancel);
+              if (action.targetFrame.mainFrame) {
+                [self.pendingNavigationInfo setCancelled:YES];
+                self.webStateImpl->SetIsLoading(false);
+              }
+            }
+          }));
+      return;
+    }
+  }
+
+  // Invalid URLs should not be loaded.
+  if (!requestURL.is_valid()) {
+    decisionHandler(WKNavigationActionPolicyCancel);
+    // The HTML5 spec indicates that window.open with an invalid URL should open
+    // about:blank.
+    BOOL isFirstLoadInOpenedWindow =
+        self.webStateImpl->HasOpener() &&
+        !self.webStateImpl->GetNavigationManager()->GetLastCommittedItem();
+    BOOL isMainFrame = action.targetFrame.mainFrame;
+    if (isFirstLoadInOpenedWindow && isMainFrame) {
+      GURL aboutBlankURL(url::kAboutBlankURL);
+      web::NavigationManager::WebLoadParams loadParams(aboutBlankURL);
+      loadParams.referrer =
+          [self.delegate currentReferrerForNavigationHandler:self];
+
+      self.webStateImpl->GetNavigationManager()->LoadURLWithParams(loadParams);
+    }
+    return;
+  }
+
+  // First check if the navigation action should be blocked by the controller
+  // and make sure to update the controller in the case that the controller
+  // can't handle the request URL. Then use the embedders' policyDeciders to
+  // either: 1- Handle the URL it self and return false to stop the controller
+  // from proceeding with the navigation if needed. or 2- return true to allow
+  // the navigation to be proceeded by the web controller.
+  BOOL allowLoad = YES;
+  if (web::GetWebClient()->IsAppSpecificURL(requestURL)) {
+    allowLoad = [self shouldAllowAppSpecificURLNavigationAction:action
+                                                     transition:transition];
+    if (allowLoad && !self.webStateImpl->HasWebUI()) {
+      [self.delegate navigationHandler:self createWebUIForURL:requestURL];
+    }
+  }
+
+  BOOL webControllerCanShow =
+      web::UrlHasWebScheme(requestURL) ||
+      web::GetWebClient()->IsAppSpecificURL(requestURL) ||
+      requestURL.SchemeIs(url::kFileScheme) ||
+      requestURL.SchemeIs(url::kAboutScheme) ||
+      requestURL.SchemeIs(url::kBlobScheme);
+
+  if (allowLoad) {
+    // If the URL doesn't look like one that can be shown as a web page, it may
+    // handled by the embedder. In that case, update the web controller to
+    // correctly reflect the current state.
+    if (!webControllerCanShow) {
+      if (!web::features::StorePendingItemInContext()) {
+        if ([self isMainFrameNavigationAction:action]) {
+          [self.delegate navigationHandlerStopLoading:self];
+        }
+      }
+
+      // Purge web view if last committed URL is different from the document
+      // URL. This can happen if external URL was added to the navigation stack
+      // and was loaded using Go Back or Go Forward navigation (in which case
+      // document URL will point to the previous page).  If this is the first
+      // load for a NavigationManager, there will be no last committed item, so
+      // check here.
+      // TODO(crbug.com/850760): Check if this code is still needed. The current
+      // implementation doesn't put external apps URLs in the history, so they
+      // shouldn't be accessable by Go Back or Go Forward navigation.
+      web::NavigationItem* lastCommittedItem =
+          self.webStateImpl->GetNavigationManager()->GetLastCommittedItem();
+      if (lastCommittedItem) {
+        GURL lastCommittedURL = lastCommittedItem->GetURL();
+        if (lastCommittedURL !=
+            [self.delegate navigationHandlerDocumentURL:self]) {
+          [self.delegate navigationHandlerRequirePageReconstruction:self];
+          [self.delegate navigationHandler:self
+                            setDocumentURL:lastCommittedURL
+                                   context:nullptr];
+        }
+      }
+    }
+  }
+
+  if (allowLoad) {
+    BOOL userInteractedWithRequestMainFrame =
+        self.userInteractionState->HasUserTappedRecently(webView) &&
+        net::GURLWithNSURL(action.request.mainDocumentURL) ==
+            self.userInteractionState->LastUserInteraction()->main_document_url;
+    web::WebStatePolicyDecider::RequestInfo requestInfo(
+        transition, isMainFrameNavigationAction,
+        userInteractedWithRequestMainFrame);
+
+    allowLoad =
+        self.webStateImpl->ShouldAllowRequest(action.request, requestInfo);
+    // The WebState may have been closed in the ShouldAllowRequest callback.
+    if ([self.delegate navigationHandlerWebViewBeingDestroyed:self]) {
+      decisionHandler(WKNavigationActionPolicyCancel);
+      return;
+    }
+  }
+
+  if (!webControllerCanShow && web::features::StorePendingItemInContext()) {
+    allowLoad = NO;
+  }
+
+  if (allowLoad) {
+    if ([[action.request HTTPMethod] isEqualToString:@"POST"]) {
+      web::NavigationItemImpl* item =
+          self.navigationManagerImpl->GetCurrentItemImpl();
+      // TODO(crbug.com/570699): Remove this check once it's no longer possible
+      // to have no current entries.
+      if (item)
+        [self cachePOSTDataForRequest:action.request inNavigationItem:item];
+    }
+  } else {
+    if (action.targetFrame.mainFrame) {
+      [self.pendingNavigationInfo setCancelled:YES];
+      // Discard the pending item to ensure that the current URL is not
+      // different from what is displayed on the view. Discard only happens
+      // if the last item was not a native view, to avoid ugly animation of
+      // inserting the webview.
+      [self discardNonCommittedItemsIfLastCommittedWasNotNativeView];
+
+      web::NavigationContextImpl* context =
+          [self contextForPendingMainFrameNavigationWithURL:requestURL];
+      if (context) {
+        // Destroy associated pending item, because this will be the last
+        // WKWebView callback for this navigation context.
+        context->ReleaseItem();
+      }
+
+      if (![self.delegate navigationHandlerWebViewBeingDestroyed:self] &&
+          [self shouldClosePageOnNativeApplicationLoad]) {
+        // Loading was started for user initiated navigations and should be
+        // stopped because no other WKWebView callbacks are called.
+        // TODO(crbug.com/767092): Loading should not start until
+        // webView.loading is changed to YES.
+        self.webStateImpl->SetIsLoading(false);
+        self.webStateImpl->CloseWebState();
+        decisionHandler(WKNavigationActionPolicyCancel);
+        return;
+      }
+    }
+
+    if (![self.delegate navigationHandlerWebViewBeingDestroyed:self]) {
+      // Loading was started for user initiated navigations and should be
+      // stopped because no other WKWebView callbacks are called.
+      // TODO(crbug.com/767092): Loading should not start until webView.loading
+      // is changed to YES.
+      self.webStateImpl->SetIsLoading(false);
+    }
+  }
+
+  // Only try to detect a SafeBrowsing warning if one isn't already displayed,
+  // since the detection logic won't be able to distinguish between the current
+  // warning and a warning for the page that's about to be loaded. Also, since
+  // the purpose of running this logic is to ensure that the right URL is
+  // displayed in the omnibox, don't try to detect a SafeBrowsing warning for
+  // iframe navigations, because the omnibox already shows the correct main
+  // frame URL in that case.
+  if (allowLoad && isMainFrameNavigationAction &&
+      !web::IsSafeBrowsingWarningDisplayedInWebView(webView)) {
+    __weak CRWWKNavigationHandler* weakSelf = self;
+    __weak WKWebView* weakWebView = webView;
+    const base::TimeDelta kDelayUntilSafeBrowsingWarningCheck =
+        base::TimeDelta::FromMilliseconds(20);
+    _safeBrowsingWarningDetectionTimer.Start(
+        FROM_HERE, kDelayUntilSafeBrowsingWarningCheck, base::BindRepeating(^{
+          __strong __typeof(weakSelf) strongSelf = weakSelf;
+          __strong __typeof(weakWebView) strongWebView = weakWebView;
+          if (web::IsSafeBrowsingWarningDisplayedInWebView(strongWebView)) {
+            // Extract state from an existing navigation context if one exists.
+            // Create a new context rather than just re-using the existing one,
+            // since the existing context will continue to be used if the user
+            // decides to proceed to the unsafe page. In that case, WebKit
+            // continues the navigation with the same WKNavigation* that's
+            // associated with the existing context.
+            web::NavigationContextImpl* existingContext = [strongSelf
+                contextForPendingMainFrameNavigationWithURL:requestURL];
+            bool hasUserGesture =
+                existingContext ? existingContext->HasUserGesture() : false;
+            bool isRendererInitiated =
+                existingContext ? existingContext->IsRendererInitiated() : true;
+            std::unique_ptr<web::NavigationContextImpl> context =
+                web::NavigationContextImpl::CreateNavigationContext(
+                    strongSelf.webStateImpl, requestURL, hasUserGesture,
+                    transition, isRendererInitiated);
+            [strongSelf navigationManagerImpl] -> AddTransientItem(requestURL);
+            strongSelf.webStateImpl->OnNavigationStarted(context.get());
+            strongSelf.webStateImpl->OnNavigationFinished(context.get());
+            strongSelf->_safeBrowsingWarningDetectionTimer.Stop();
+            if (!existingContext) {
+              // If there's an existing context, observers will already be aware
+              // of a load in progress. Otherwise, observers need to be notified
+              // here, so that if the user decides to go back to the previous
+              // page (stopping the load), observers will be aware of a possible
+              // URL change and the URL displayed in the omnibox will get
+              // updated.
+              DCHECK(strongWebView.loading);
+              strongSelf.webStateImpl->SetIsLoading(true);
+            }
+          }
+        }));
+  }
+
+  if (!allowLoad) {
+    decisionHandler(WKNavigationActionPolicyCancel);
+    return;
+  }
+  BOOL isOffTheRecord = self.webStateImpl->GetBrowserState()->IsOffTheRecord();
+  decisionHandler(web::GetAllowNavigationActionPolicy(isOffTheRecord));
 }
 
 - (void)webView:(WKWebView*)webView
@@ -42,16 +399,197 @@
                       decisionHandler:
                           (void (^)(WKNavigationResponsePolicy))handler {
   [self didReceiveWKNavigationDelegateCallback];
+
+  // If this is a placeholder navigation, pass through.
+  GURL responseURL = net::GURLWithNSURL(WKResponse.response.URL);
+  if (IsPlaceholderUrl(responseURL)) {
+    handler(WKNavigationResponsePolicyAllow);
+    return;
+  }
+
+  scoped_refptr<net::HttpResponseHeaders> headers;
+  if ([WKResponse.response isKindOfClass:[NSHTTPURLResponse class]]) {
+    headers = net::CreateHeadersFromNSHTTPURLResponse(
+        static_cast<NSHTTPURLResponse*>(WKResponse.response));
+    // TODO(crbug.com/551677): remove |OnHttpResponseHeadersReceived| and attach
+    // headers to web::NavigationContext.
+    self.webStateImpl->OnHttpResponseHeadersReceived(headers.get(),
+                                                     responseURL);
+  }
+
+  // The page will not be changed until this navigation is committed, so the
+  // retrieved state will be pending until |didCommitNavigation| callback.
+  [self updatePendingNavigationInfoFromNavigationResponse:WKResponse];
+
+  BOOL shouldRenderResponse = [self shouldRenderResponse:WKResponse];
+  if (!shouldRenderResponse) {
+    if (web::UrlHasWebScheme(responseURL)) {
+      [self createDownloadTaskForResponse:WKResponse HTTPHeaders:headers.get()];
+    } else {
+      // DownloadTask only supports web schemes, so do nothing.
+    }
+    // Discard the pending item to ensure that the current URL is not different
+    // from what is displayed on the view.
+    [self discardNonCommittedItemsIfLastCommittedWasNotNativeView];
+    if (!web::features::StorePendingItemInContext()) {
+      // Loading will be stopped in webView:didFinishNavigation: callback. This
+      // call is here to preserve the original behavior when pending item is not
+      // stored in NavigationContext.
+      self.webStateImpl->SetIsLoading(false);
+    }
+  } else {
+    shouldRenderResponse = self.webStateImpl->ShouldAllowResponse(
+        WKResponse.response, WKResponse.forMainFrame);
+  }
+
+  if (!shouldRenderResponse && WKResponse.canShowMIMEType &&
+      WKResponse.forMainFrame) {
+    self.pendingNavigationInfo.cancelled = YES;
+  }
+
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
+      !WKResponse.forMainFrame && !webView.loading) {
+    // This is the terminal callback for iframe navigation and there is no
+    // pending main frame navigation. Last chance to flip IsLoading to false.
+    self.webStateImpl->SetIsLoading(false);
+  }
+
+  handler(shouldRenderResponse ? WKNavigationResponsePolicyAllow
+                               : WKNavigationResponsePolicyCancel);
 }
 
 - (void)webView:(WKWebView*)webView
     didStartProvisionalNavigation:(WKNavigation*)navigation {
   [self didReceiveWKNavigationDelegateCallback];
+
+  GURL webViewURL = net::GURLWithNSURL(webView.URL);
+
+  [self.navigationStates setState:web::WKNavigationState::STARTED
+                    forNavigation:navigation];
+
+  if (webViewURL.is_empty()) {
+    // May happen on iOS9, however in didCommitNavigation: callback the URL
+    // will be "about:blank".
+    webViewURL = GURL(url::kAboutBlankURL);
+  }
+
+  web::NavigationContextImpl* context =
+      [self.navigationStates contextForNavigation:navigation];
+
+  if (context) {
+    // This is already seen and registered navigation.
+
+    if (context->IsLoadingErrorPage()) {
+      // This is loadHTMLString: navigation to display error page in web view.
+      self.navigationState = web::WKNavigationState::REQUESTED;
+      return;
+    }
+
+    if (!context->IsPlaceholderNavigation() &&
+        context->GetUrl() != webViewURL) {
+      // Update last seen URL because it may be changed by WKWebView (f.e. by
+      // performing characters escaping).
+      web::NavigationItem* item =
+          web::GetItemWithUniqueID(self.navigationManagerImpl, context);
+      if (!IsWKInternalUrl(webViewURL)) {
+        if (item) {
+          item->SetURL(webViewURL);
+        }
+        context->SetUrl(webViewURL);
+      }
+    }
+    self.webStateImpl->OnNavigationStarted(context);
+    return;
+  }
+
+  // This is renderer-initiated navigation which was not seen before and
+  // should be registered.
+
+  // When using WKBasedNavigationManager, renderer-initiated app-specific loads
+  // should be allowed in two specific cases:
+  // 1) if |backForwardList.currentItem| is a placeholder URL for the
+  //    provisional load URL (i.e. webView.URL), then this is an in-progress
+  //    app-specific load and should not be restarted.
+  // 2) back/forward navigation to an app-specific URL should be allowed.
+  bool exemptedAppSpecificLoad = false;
+  if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
+    bool currentItemIsPlaceholder =
+        CreatePlaceholderUrlForUrl(webViewURL) ==
+        net::GURLWithNSURL(webView.backForwardList.currentItem.URL);
+    bool isBackForward = self.pendingNavigationInfo.navigationType ==
+                         WKNavigationTypeBackForward;
+    bool isRestoringSession =
+        web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
+        IsRestoreSessionUrl([self.delegate navigationHandlerDocumentURL:self]);
+    exemptedAppSpecificLoad =
+        currentItemIsPlaceholder || isBackForward || isRestoringSession;
+  }
+
+  if (!web::GetWebClient()->IsAppSpecificURL(webViewURL) ||
+      !exemptedAppSpecificLoad) {
+    self.webStateImpl->ClearWebUI();
+  }
+
+  if (web::GetWebClient()->IsAppSpecificURL(webViewURL) &&
+      !exemptedAppSpecificLoad) {
+    // Restart app specific URL loads to properly capture state.
+    // TODO(crbug.com/546347): Extract necessary tasks for app specific URL
+    // navigation rather than restarting the load.
+
+    // Renderer-initiated loads of WebUI can be done only from other WebUI
+    // pages. WebUI pages may have increased power and using the same web
+    // process (which may potentially be controller by an attacker) is
+    // dangerous.
+    if (web::GetWebClient()->IsAppSpecificURL(
+            [self.delegate navigationHandlerDocumentURL:self])) {
+      [self.delegate navigationHandlerAbortLoading:self];
+      web::NavigationManager::WebLoadParams params(webViewURL);
+      self.navigationManagerImpl->LoadURLWithParams(params);
+    }
+    return;
+  }
+
+  self.webStateImpl->GetNavigationManagerImpl()
+      .OnRendererInitiatedNavigationStarted(webViewURL);
+
+  // When a client-side redirect occurs while an interstitial warning is
+  // displayed, clear the warning and its navigation item, so that a new
+  // pending item is created for |context| in |registerLoadRequestForURL|. See
+  // crbug.com/861836.
+  self.webStateImpl->ClearTransientContent();
+
+  std::unique_ptr<web::NavigationContextImpl> navigationContext =
+      [self.delegate navigationHandler:self
+             registerLoadRequestForURL:webViewURL
+                sameDocumentNavigation:NO
+                        hasUserGesture:self.pendingNavigationInfo.hasUserGesture
+                     rendererInitiated:YES
+                 placeholderNavigation:IsPlaceholderUrl(webViewURL)];
+  web::NavigationContextImpl* navigationContextPtr = navigationContext.get();
+  // GetPendingItem which may be called inside OnNavigationStarted relies on
+  // association between NavigationContextImpl and WKNavigation.
+  [self.navigationStates setContext:std::move(navigationContext)
+                      forNavigation:navigation];
+  self.webStateImpl->OnNavigationStarted(navigationContextPtr);
+  DCHECK_EQ(web::WKNavigationState::REQUESTED, self.navigationState);
 }
 
 - (void)webView:(WKWebView*)webView
     didReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation {
   [self didReceiveWKNavigationDelegateCallback];
+
+  GURL webViewURL = net::GURLWithNSURL(webView.URL);
+
+  // This callback should never be triggered for placeholder navigations.
+  DCHECK(!(web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
+           IsPlaceholderUrl(webViewURL)));
+
+  [self.navigationStates setState:web::WKNavigationState::REDIRECTED
+                    forNavigation:navigation];
+
+  web::NavigationContextImpl* context =
+      [self.navigationStates contextForNavigation:navigation];
+  [self didReceiveRedirectForNavigation:context withURL:webViewURL];
 }
 
 - (void)webView:(WKWebView*)webView
@@ -90,6 +628,18 @@
 
 #pragma mark - Private methods
 
+- (web::NavigationManagerImpl*)navigationManagerImpl {
+  return &(self.webStateImpl->GetNavigationManagerImpl());
+}
+
+- (web::WebStateImpl*)webStateImpl {
+  return [self.delegate webStateImplForNavigationHandler:self];
+}
+
+- (web::UserInteractionState*)userInteractionState {
+  return [self.delegate userInteractionStateForNavigationHandler:self];
+}
+
 // This method should be called on receiving WKNavigationDelegate callbacks. It
 // will log a metric if the callback occurs after the reciever has already been
 // closed. It also stops the SafeBrowsing warning detection timer, since after
@@ -102,6 +652,261 @@
   _safeBrowsingWarningDetectionTimer.Stop();
 }
 
+// Extracts navigation info from WKNavigationAction and sets it as a pending.
+// Some pieces of navigation information are only known in
+// |decidePolicyForNavigationAction|, but must be in a pending state until
+// |didgo/Navigation| where it becames current.
+- (void)updatePendingNavigationInfoFromNavigationAction:
+    (WKNavigationAction*)action {
+  if (action.targetFrame.mainFrame) {
+    self.pendingNavigationInfo = [[CRWPendingNavigationInfo alloc] init];
+    self.pendingNavigationInfo.referrer =
+        [action.request valueForHTTPHeaderField:kReferrerHeaderName];
+    self.pendingNavigationInfo.navigationType = action.navigationType;
+    self.pendingNavigationInfo.HTTPMethod = action.request.HTTPMethod;
+    self.pendingNavigationInfo.hasUserGesture =
+        web::GetNavigationActionInitiationType(action) ==
+        web::NavigationActionInitiationType::kUserInitiated;
+  }
+}
+
+// Returns YES if the navigation action is associated with a main frame request.
+- (BOOL)isMainFrameNavigationAction:(WKNavigationAction*)action {
+  if (action.targetFrame) {
+    return action.targetFrame.mainFrame;
+  }
+  // According to WKNavigationAction documentation, in the case of a new window
+  // navigation, target frame will be nil. In this case check if the
+  // |sourceFrame| is the mainFrame.
+  return action.sourceFrame.mainFrame;
+}
+
+// Returns YES if the given |action| should be allowed to continue for app
+// specific URL. If this returns NO, the navigation should be cancelled.
+// App specific pages have elevated privileges and WKWebView uses the same
+// renderer process for all page frames. With that Chromium does not allow
+// running App specific pages in the same process as a web site from the
+// internet. Allows navigation to app specific URL in the following cases:
+//   - last committed URL is app specific
+//   - navigation not a new navigation (back-forward or reload)
+//   - navigation is typed, generated or bookmark
+//   - navigation is performed in iframe and main frame is app-specific page
+- (BOOL)shouldAllowAppSpecificURLNavigationAction:(WKNavigationAction*)action
+                                       transition:
+                                           (ui::PageTransition)pageTransition {
+  GURL requestURL = net::GURLWithNSURL(action.request.URL);
+  DCHECK(web::GetWebClient()->IsAppSpecificURL(requestURL));
+  if (web::GetWebClient()->IsAppSpecificURL(
+          self.webStateImpl->GetLastCommittedURL())) {
+    // Last committed page is also app specific and navigation should be
+    // allowed.
+    return YES;
+  }
+
+  if (!ui::PageTransitionIsNewNavigation(pageTransition)) {
+    // Allow reloads and back-forward navigations.
+    return YES;
+  }
+
+  if (ui::PageTransitionTypeIncludingQualifiersIs(pageTransition,
+                                                  ui::PAGE_TRANSITION_TYPED)) {
+    return YES;
+  }
+
+  if (ui::PageTransitionTypeIncludingQualifiersIs(
+          pageTransition, ui::PAGE_TRANSITION_GENERATED)) {
+    return YES;
+  }
+
+  if (ui::PageTransitionTypeIncludingQualifiersIs(
+          pageTransition, ui::PAGE_TRANSITION_AUTO_BOOKMARK)) {
+    return YES;
+  }
+
+  // If the session is being restored, allow the navigation.
+  if (IsRestoreSessionUrl([self.delegate navigationHandlerDocumentURL:self])) {
+    return YES;
+  }
+
+  GURL mainDocumentURL = net::GURLWithNSURL(action.request.mainDocumentURL);
+  if (web::GetWebClient()->IsAppSpecificURL(mainDocumentURL) &&
+      !action.sourceFrame.mainFrame) {
+    // AppSpecific URLs are allowed inside iframe if the main frame is also
+    // app specific page.
+    return YES;
+  }
+
+  return NO;
+}
+
+// Caches request POST data in the given session entry.
+- (void)cachePOSTDataForRequest:(NSURLRequest*)request
+               inNavigationItem:(web::NavigationItemImpl*)item {
+  NSUInteger maxPOSTDataSizeInBytes = 4096;
+  NSString* cookieHeaderName = @"cookie";
+
+  DCHECK(item);
+  const bool shouldUpdateEntry =
+      ui::PageTransitionCoreTypeIs(item->GetTransitionType(),
+                                   ui::PAGE_TRANSITION_FORM_SUBMIT) &&
+      ![request HTTPBodyStream] &&  // Don't cache streams.
+      !item->HasPostData() &&
+      item->GetURL() == net::GURLWithNSURL([request URL]);
+  const bool belowSizeCap =
+      [[request HTTPBody] length] < maxPOSTDataSizeInBytes;
+  DLOG_IF(WARNING, shouldUpdateEntry && !belowSizeCap)
+      << "Data in POST request exceeds the size cap (" << maxPOSTDataSizeInBytes
+      << " bytes), and will not be cached.";
+
+  if (shouldUpdateEntry && belowSizeCap) {
+    item->SetPostData([request HTTPBody]);
+    item->ResetHttpRequestHeaders();
+    item->AddHttpRequestHeaders([request allHTTPHeaderFields]);
+    // Don't cache the "Cookie" header.
+    // According to NSURLRequest documentation, |-valueForHTTPHeaderField:| is
+    // case insensitive, so it's enough to test the lower case only.
+    if ([request valueForHTTPHeaderField:cookieHeaderName]) {
+      // Case insensitive search in |headers|.
+      NSSet* cookieKeys = [item->GetHttpRequestHeaders()
+          keysOfEntriesPassingTest:^(id key, id obj, BOOL* stop) {
+            NSString* header = (NSString*)key;
+            const BOOL found =
+                [header caseInsensitiveCompare:cookieHeaderName] ==
+                NSOrderedSame;
+            *stop = found;
+            return found;
+          }];
+      DCHECK_EQ(1u, [cookieKeys count]);
+      item->RemoveHttpRequestHeaderForKey([cookieKeys anyObject]);
+    }
+  }
+}
+
+// Discards non committed items, only if the last committed URL was not loaded
+// in native view. But if it was a native view, no discard will happen to avoid
+// an ugly animation where the web view is inserted and quickly removed.
+- (void)discardNonCommittedItemsIfLastCommittedWasNotNativeView {
+  GURL lastCommittedURL = self.webStateImpl->GetLastCommittedURL();
+  BOOL previousItemWasLoadedInNativeView =
+      [self.delegate navigationHandler:self
+             shouldLoadURLInNativeView:lastCommittedURL];
+  if (!previousItemWasLoadedInNativeView)
+    self.navigationManagerImpl->DiscardNonCommittedItems();
+}
+
+// If YES, the page should be closed if it successfully redirects to a native
+// application, for example if a new tab redirects to the App Store.
+- (BOOL)shouldClosePageOnNativeApplicationLoad {
+  // The page should be closed if it was initiated by the DOM and there has been
+  // no user interaction with the page since the web view was created, or if
+  // the page has no navigation items, as occurs when an App Store link is
+  // opened from another application.
+  BOOL rendererInitiatedWithoutInteraction =
+      self.webStateImpl->HasOpener() &&
+      !self.userInteractionState
+           ->UserInteractionRegisteredSinceWebViewCreated();
+  BOOL noNavigationItems = !(self.navigationManagerImpl->GetItemCount());
+  return rendererInitiatedWithoutInteraction || noNavigationItems;
+}
+
+// Extracts navigation info from WKNavigationResponse and sets it as a pending.
+// Some pieces of navigation information are only known in
+// |decidePolicyForNavigationResponse|, but must be in a pending state until
+// |didCommitNavigation| where it becames current.
+- (void)updatePendingNavigationInfoFromNavigationResponse:
+    (WKNavigationResponse*)response {
+  if (response.isForMainFrame) {
+    if (!self.pendingNavigationInfo) {
+      self.pendingNavigationInfo = [[CRWPendingNavigationInfo alloc] init];
+    }
+    self.pendingNavigationInfo.MIMEType = response.response.MIMEType;
+  }
+}
+
+// Returns YES if response should be rendered in WKWebView.
+- (BOOL)shouldRenderResponse:(WKNavigationResponse*)WKResponse {
+  if (!WKResponse.canShowMIMEType) {
+    return NO;
+  }
+
+  GURL responseURL = net::GURLWithNSURL(WKResponse.response.URL);
+  if (responseURL.SchemeIs(url::kDataScheme) && WKResponse.forMainFrame) {
+    // Block rendering data URLs for renderer-initiated navigations in main
+    // frame to prevent abusive behavior (crbug.com/890558).
+    web::NavigationContext* context =
+        [self contextForPendingMainFrameNavigationWithURL:responseURL];
+    if (context->IsRendererInitiated()) {
+      return NO;
+    }
+  }
+
+  return YES;
+}
+
+// Creates DownloadTask for the given navigation response. Headers are passed
+// as argument to avoid extra NSDictionary -> net::HttpResponseHeaders
+// conversion.
+- (void)createDownloadTaskForResponse:(WKNavigationResponse*)WKResponse
+                          HTTPHeaders:(net::HttpResponseHeaders*)headers {
+  const GURL responseURL = net::GURLWithNSURL(WKResponse.response.URL);
+  const int64_t contentLength = WKResponse.response.expectedContentLength;
+  const std::string MIMEType =
+      base::SysNSStringToUTF8(WKResponse.response.MIMEType);
+
+  std::string contentDisposition;
+  if (headers) {
+    headers->GetNormalizedHeader("content-disposition", &contentDisposition);
+  }
+
+  ui::PageTransition transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME;
+  if (WKResponse.forMainFrame) {
+    web::NavigationContextImpl* context =
+        [self contextForPendingMainFrameNavigationWithURL:responseURL];
+    context->SetIsDownload(true);
+    context->ReleaseItem();
+    // Navigation callbacks can only be called for the main frame.
+    self.webStateImpl->OnNavigationFinished(context);
+    transition = context->GetPageTransition();
+    bool transitionIsLink = ui::PageTransitionTypeIncludingQualifiersIs(
+        transition, ui::PAGE_TRANSITION_LINK);
+    if (transitionIsLink && !context->HasUserGesture()) {
+      // Link click is not possible without user gesture, so this transition
+      // was incorrectly classified and should be "client redirect" instead.
+      // TODO(crbug.com/549301): Remove this workaround when transition
+      // detection is fixed.
+      transition = ui::PAGE_TRANSITION_CLIENT_REDIRECT;
+    }
+  }
+  web::DownloadController::FromBrowserState(
+      self.webStateImpl->GetBrowserState())
+      ->CreateDownloadTask(self.webStateImpl, [NSUUID UUID].UUIDString,
+                           responseURL, contentDisposition, contentLength,
+                           MIMEType, transition);
+}
+
+// Updates URL for navigation context and navigation item.
+- (void)didReceiveRedirectForNavigation:(web::NavigationContextImpl*)context
+                                withURL:(const GURL&)URL {
+  context->SetUrl(URL);
+  web::NavigationItemImpl* item =
+      web::GetItemWithUniqueID(self.navigationManagerImpl, context);
+
+  // Associated item can be a pending item, previously discarded by another
+  // navigation. WKWebView allows multiple provisional navigations, while
+  // Navigation Manager has only one pending navigation.
+  if (item) {
+    if (!IsWKInternalUrl(URL)) {
+      item->SetVirtualURL(URL);
+      item->SetURL(URL);
+    }
+    // Redirects (3xx response code), must change POST requests to GETs.
+    item->SetPostData(nil);
+    item->ResetHttpRequestHeaders();
+  }
+
+  self.userInteractionState->ResetLastTransferTime();
+}
+
 #pragma mark - Public methods
 
 - (void)stopLoading {
@@ -113,4 +918,26 @@
   return &_safeBrowsingWarningDetectionTimer;
 }
 
+// Returns context for pending navigation that has |URL|. null if there is no
+// matching pending navigation.
+- (web::NavigationContextImpl*)contextForPendingMainFrameNavigationWithURL:
+    (const GURL&)URL {
+  // Here the enumeration variable |navigation| is __strong to allow setting it
+  // to nil.
+  for (__strong id navigation in [self.navigationStates pendingNavigations]) {
+    if (navigation == [NSNull null]) {
+      // null is a valid navigation object passed to WKNavigationDelegate
+      // callbacks and represents window opening action.
+      navigation = nil;
+    }
+
+    web::NavigationContextImpl* context =
+        [self.navigationStates contextForNavigation:navigation];
+    if (context && context->GetUrl() == URL) {
+      return context;
+    }
+  }
+  return nullptr;
+}
+
 @end
diff --git a/ios/web/public/find_in_page/README.md b/ios/web/public/find_in_page/README.md
new file mode 100644
index 0000000..a539948b
--- /dev/null
+++ b/ios/web/public/find_in_page/README.md
@@ -0,0 +1 @@
+This directory contains API to search for text on a web page. This directory does not support any UI API except content highlighting.
diff --git a/ios/web/public/test/earl_grey/web_view_matchers.mm b/ios/web/public/test/earl_grey/web_view_matchers.mm
index 4b721b9..72a3dfa0 100644
--- a/ios/web/public/test/earl_grey/web_view_matchers.mm
+++ b/ios/web/public/test/earl_grey/web_view_matchers.mm
@@ -13,7 +13,6 @@
 #include "base/values.h"
 #import "ios/testing/earl_grey/earl_grey_app.h"
 #import "ios/web/interstitials/web_interstitial_impl.h"
-#import "ios/web/public/test/web_view_interaction_test_util.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "net/base/mac/url_conversions.h"
 
diff --git a/ios/web/public/test/fakes/crw_test_js_injection_receiver.mm b/ios/web/public/test/fakes/crw_test_js_injection_receiver.mm
index 9ae27b5..bb30523 100644
--- a/ios/web/public/test/fakes/crw_test_js_injection_receiver.mm
+++ b/ios/web/public/test/fakes/crw_test_js_injection_receiver.mm
@@ -37,6 +37,11 @@
   web::ExecuteJavaScript(_webView, script, completionHandler);
 }
 
+- (void)executeUserJavaScript:(NSString*)script
+            completionHandler:(void (^)(id, NSError*))completionHandler {
+  web::ExecuteJavaScript(_webView, script, completionHandler);
+}
+
 - (BOOL)scriptHasBeenInjectedForClass:(Class)injectionManagerClass {
   return [_injectedScriptManagers containsObject:injectionManagerClass];
 }
diff --git a/ios/web/public/test/web_test_with_web_state.mm b/ios/web/public/test/web_test_with_web_state.mm
index 5cc6be5..900f3b8 100644
--- a/ios/web/public/test/web_test_with_web_state.mm
+++ b/ios/web/public/test/web_test_with_web_state.mm
@@ -16,6 +16,7 @@
 #import "ios/web/public/web_client.h"
 #include "ios/web/public/web_state/url_verification_constants.h"
 #include "ios/web/public/web_state/web_state_observer.h"
+#import "ios/web/web_state/ui/crw_js_injector.h"
 #import "ios/web/web_state/ui/crw_web_controller.h"
 #import "ios/web/web_state/ui/wk_web_view_configuration_provider.h"
 #import "ios/web/web_state/web_state_impl.h"
@@ -207,7 +208,7 @@
   __block id execution_result = nil;
   __block bool execution_completed = false;
   SCOPED_TRACE(base::SysNSStringToUTF8(script));
-  [GetWebController(web_state())
+  [GetWebController(web_state()).jsInjector
       executeJavaScript:script
       completionHandler:^(id result, NSError* error) {
         // Most of executed JS does not return the result, and there is no need
diff --git a/ios/web/public/test/web_view_interaction_test_util.mm b/ios/web/public/test/web_view_interaction_test_util.mm
index 9d75d55..340f0a5 100644
--- a/ios/web/public/test/web_view_interaction_test_util.mm
+++ b/ios/web/public/test/web_view_interaction_test_util.mm
@@ -11,6 +11,7 @@
 #include "base/strings/utf_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/web_state/ui/crw_js_injector.h"
 #import "ios/web/web_state/ui/crw_web_controller.h"
 #import "ios/web/web_state/ui/crw_web_view_proxy_impl.h"
 #import "ios/web/web_state/web_state_impl.h"
@@ -184,12 +185,12 @@
   // |executeUserJavaScript:completionHandler:| is no-op for app-specific URLs,
   // so simulate a user gesture by calling TouchTracking method.
   [web_controller touched:YES];
-  [web_controller executeJavaScript:script
-                  completionHandler:^(id result, NSError* error) {
-                    did_complete = true;
-                    element_found = [result boolValue];
-                    block_error = [error copy];
-                  }];
+  [web_controller.jsInjector executeJavaScript:script
+                             completionHandler:^(id result, NSError* error) {
+                               did_complete = true;
+                               element_found = [result boolValue];
+                               block_error = [error copy];
+                             }];
 
   bool js_finished = WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
     return did_complete;
diff --git a/ios/web/public/web_state/js/crw_js_injection_evaluator.h b/ios/web/public/web_state/js/crw_js_injection_evaluator.h
index 5fad8b1..10cdea5 100644
--- a/ios/web/public/web_state/js/crw_js_injection_evaluator.h
+++ b/ios/web/public/web_state/js/crw_js_injection_evaluator.h
@@ -16,6 +16,12 @@
 - (void)executeJavaScript:(NSString*)script
         completionHandler:(void (^)(id, NSError*))completionHandler;
 
+// Asynchronously executes |javaScript| in the main frame's context,
+// registering user interaction. For security reasons, some implementations may
+// reject the request if the page has some elevated privileges.
+- (void)executeUserJavaScript:(NSString*)script
+            completionHandler:(void (^)(id, NSError*))completionHandler;
+
 // Checks to see if the script for a class has been injected into the
 // current page already.
 - (BOOL)scriptHasBeenInjectedForClass:(Class)injectionManagerClass;
diff --git a/ios/web/web_state/js/crw_js_injection_receiver.mm b/ios/web/web_state/js/crw_js_injection_receiver.mm
index b7572dc0..8b74208 100644
--- a/ios/web/web_state/js/crw_js_injection_receiver.mm
+++ b/ios/web/web_state/js/crw_js_injection_receiver.mm
@@ -13,7 +13,7 @@
 #endif
 
 @implementation CRWJSInjectionReceiver {
-  // Used to evaluate JavaScripts.
+  // Used to evaluate JavaScript.
   __weak id<CRWJSInjectionEvaluator> _evaluator;
 
   // Map from a CRWJSInjectionManager class to its instance created for this
@@ -39,6 +39,11 @@
   [_evaluator executeJavaScript:script completionHandler:completionHandler];
 }
 
+- (void)executeUserJavaScript:(NSString*)script
+            completionHandler:(void (^)(id, NSError*))completionHandler {
+  [_evaluator executeUserJavaScript:script completionHandler:completionHandler];
+}
+
 - (BOOL)scriptHasBeenInjectedForClass:(Class)injectionManagerClass {
   return [_evaluator scriptHasBeenInjectedForClass:injectionManagerClass];
 }
diff --git a/ios/web/web_state/ui/BUILD.gn b/ios/web/web_state/ui/BUILD.gn
index 975d0bc..aecf877 100644
--- a/ios/web/web_state/ui/BUILD.gn
+++ b/ios/web/web_state/ui/BUILD.gn
@@ -44,6 +44,8 @@
   ]
 
   sources = [
+    "crw_js_injector.h",
+    "crw_js_injector.mm",
     "crw_swipe_recognizer_provider.h",
     "crw_touch_tracking_recognizer.h",
     "crw_touch_tracking_recognizer.mm",
diff --git a/ios/web/web_state/ui/crw_js_injector.h b/ios/web/web_state/ui/crw_js_injector.h
new file mode 100644
index 0000000..9781a6d
--- /dev/null
+++ b/ios/web/web_state/ui/crw_js_injector.h
@@ -0,0 +1,52 @@
+// 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 IOS_WEB_WEB_STATE_UI_CRW_JS_INJECTOR_H_
+#define IOS_WEB_WEB_STATE_UI_CRW_JS_INJECTOR_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/web/public/web_state/js/crw_js_injection_evaluator.h"
+#include "url/gurl.h"
+
+@class CRWJSInjectionReceiver;
+@class WKWebView;
+@class CRWJSInjector;
+
+@protocol CRWJSInjectorDelegate <NSObject>
+
+// Tells delegate that user script is about to be executed.
+- (void)willExecuteUserScriptForJSInjector:(CRWJSInjector*)injector;
+
+// Returns the last committed URL by the delegate.
+- (GURL)lastCommittedURLForJSInjector:(CRWJSInjector*)injector;
+
+@end
+
+// TODO(crbug.com/954137): This class is responsible for both "injection" and
+// "execution" and probably should be split into separate classes (f.e.
+// CRWJSExecutor and CRWLegacyInjector) when we get to the next phase of
+// refactoring. CRWLegacyInjector would be removed at some point, while
+// CRWJSExecutor would always stay around to support omnibox.
+@interface CRWJSInjector : NSObject <CRWJSInjectionEvaluator>
+
+@property(strong, nonatomic, readonly)
+    CRWJSInjectionReceiver* JSInjectionReceiver;
+
+// Contains a web view, if one is associated.
+@property(weak, nonatomic) WKWebView* webView;
+
+// Designated initializer. Initializes with |delegate|.
+- (instancetype)initWithDelegate:(id<CRWJSInjectorDelegate>)delegate;
+
+// Resets list of all scripts injected with |injectScript|. Affects only results
+// returned by |scriptHasBeenInjectedForClass|.
+- (void)resetInjectedScriptSet;
+
+// Injects windowId in the web page.
+- (void)injectWindowID;
+
+@end
+
+#endif  // IOS_WEB_WEB_STATE_UI_CRW_JS_INJECTOR_H_
diff --git a/ios/web/web_state/ui/crw_js_injector.mm b/ios/web/web_state/ui/crw_js_injector.mm
new file mode 100644
index 0000000..4024749
--- /dev/null
+++ b/ios/web/web_state/ui/crw_js_injector.mm
@@ -0,0 +1,120 @@
+// 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.
+
+#import "ios/web/web_state/ui/crw_js_injector.h"
+
+#import <WebKit/WebKit.h>
+
+#include "base/logging.h"
+#import "ios/web/public/web_client.h"
+#import "ios/web/public/web_state/js/crw_js_injection_manager.h"
+#import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
+#import "ios/web/web_state/js/crw_js_window_id_manager.h"
+#import "ios/web/web_state/ui/web_view_js_utils.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface CRWJSInjector () {
+  __weak id<CRWJSInjectorDelegate> _delegate;
+
+  // Script manager for setting the windowID.
+  CRWJSWindowIDManager* _windowIDJSManager;
+
+  // A set of script managers whose scripts have been injected into the current
+  // page.
+  NSMutableSet* _injectedScriptManagers;
+}
+
+@end
+
+@implementation CRWJSInjector
+
+- (instancetype)initWithDelegate:(id<CRWJSInjectorDelegate>)delegate {
+  self = [super init];
+  if (self) {
+    _delegate = delegate;
+
+    _JSInjectionReceiver =
+        [[CRWJSInjectionReceiver alloc] initWithEvaluator:self];
+
+    _injectedScriptManagers = [[NSMutableSet alloc] init];
+  }
+  return self;
+}
+
+- (void)resetInjectedScriptSet {
+  [_injectedScriptManagers removeAllObjects];
+}
+
+- (void)setWebView:(WKWebView*)webView {
+  _webView = webView;
+  if (webView) {
+    _windowIDJSManager = [[CRWJSWindowIDManager alloc] initWithWebView:webView];
+  } else {
+    _windowIDJSManager = nil;
+  }
+}
+
+- (void)injectWindowID {
+  [_windowIDJSManager inject];
+}
+
+#pragma mark - CRWJSInjectionEvaluator
+
+- (void)executeJavaScript:(NSString*)script
+        completionHandler:(void (^)(id, NSError*))completionHandler {
+  NSString* safeScript = [self scriptByAddingWindowIDCheckForScript:script];
+  web::ExecuteJavaScript(self.webView, safeScript, completionHandler);
+}
+
+- (void)executeUserJavaScript:(NSString*)script
+            completionHandler:(void (^)(id, NSError*))completionHandler {
+  // For security reasons, executing JavaScript on pages with app-specific URLs
+  // is not allowed, because those pages may have elevated privileges.
+  GURL lastCommittedURL = [_delegate lastCommittedURLForJSInjector:self];
+  if (web::GetWebClient()->IsAppSpecificURL(lastCommittedURL)) {
+    if (completionHandler) {
+      dispatch_async(dispatch_get_main_queue(), ^{
+        NSError* error = [[NSError alloc]
+            initWithDomain:web::kJSEvaluationErrorDomain
+                      code:web::JS_EVALUATION_ERROR_CODE_REJECTED
+                  userInfo:nil];
+        completionHandler(nil, error);
+      });
+    }
+    return;
+  }
+
+  [_delegate willExecuteUserScriptForJSInjector:self];
+  [self executeJavaScript:script completionHandler:completionHandler];
+}
+
+- (BOOL)scriptHasBeenInjectedForClass:(Class)injectionManagerClass {
+  return [_injectedScriptManagers containsObject:injectionManagerClass];
+}
+
+- (void)injectScript:(NSString*)script forClass:(Class)JSInjectionManagerClass {
+  DCHECK(script.length);
+  // Script execution is an asynchronous operation which may pass sensitive
+  // data to the page. executeJavaScript:completionHandler makes sure that
+  // receiver page did not change by checking its window id.
+  // |[self.webView executeJavaScript:completionHandler:]| is not used here
+  // because it does not check that page is the same.
+  [self executeJavaScript:script completionHandler:nil];
+  [_injectedScriptManagers addObject:JSInjectionManagerClass];
+}
+
+#pragma mark - JavaScript Helpers (Private)
+
+// Returns a new script which wraps |script| with windowID check so |script| is
+// not evaluated on windowID mismatch.
+- (NSString*)scriptByAddingWindowIDCheckForScript:(NSString*)script {
+  NSString* kTemplate = @"if (__gCrWeb['windowId'] === '%@') { %@; }";
+  return [NSString
+      stringWithFormat:kTemplate, [_windowIDJSManager windowID], script];
+}
+
+@end
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h
index f9d221b..0701f8bf 100644
--- a/ios/web/web_state/ui/crw_web_controller.h
+++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -8,7 +8,6 @@
 #import <UIKit/UIKit.h>
 
 #import "ios/web/navigation/crw_session_controller.h"
-#import "ios/web/public/web_state/js/crw_js_injection_evaluator.h"
 #include "ios/web/public/web_state/url_verification_constants.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/web_state/ui/crw_touch_tracking_recognizer.h"
@@ -21,7 +20,7 @@
 
 }  // namespace web
 
-@class CRWJSInjectionReceiver;
+@class CRWJSInjector;
 @protocol CRWNativeContent;
 @protocol CRWNativeContentProvider;
 @protocol CRWSwipeRecognizerProvider;
@@ -41,9 +40,8 @@
 // web view.
 // This is an abstract class which must not be instantiated directly.
 // TODO(stuartmorgan): Move all of the navigation APIs out of this class.
-@interface CRWWebController : NSObject <CRWJSInjectionEvaluator,
-                                        CRWSessionControllerDelegate,
-                                        CRWTouchTrackingDelegate>
+@interface CRWWebController
+    : NSObject <CRWSessionControllerDelegate, CRWTouchTrackingDelegate>
 
 // Whether or not a UIWebView is allowed to exist in this CRWWebController.
 // Defaults to NO; this should be enabled before attempting to access the view.
@@ -68,15 +66,13 @@
 // is not supported.
 @property(weak, nonatomic, readonly) UIView* viewForPrinting;
 
-// Returns the current page loading phase.
-@property(nonatomic, readonly, assign) web::WKNavigationState navigationState;
-
 // The fraction of the page load that has completed as a number between 0.0
 // (nothing loaded) and 1.0 (fully loaded).
 @property(nonatomic, readonly) double loadingProgress;
 
 // YES if the web process backing WebView is believed to currently be crashed.
-@property(nonatomic, assign, getter=isWebProcessCrashed) BOOL webProcessCrashed;
+@property(nonatomic, readonly, assign, getter=isWebProcessCrashed)
+    BOOL webProcessCrashed;
 
 // Whether the WebController is visible. Returns YES after wasShown call and
 // NO after wasHidden() call.
@@ -86,9 +82,8 @@
 // back-forward list navigations.
 @property(nonatomic) BOOL allowsBackForwardNavigationGestures;
 
-// The receiver of JavaScripts.
-@property(nonatomic, strong, readonly)
-    CRWJSInjectionReceiver* jsInjectionReceiver;
+// JavaScript injector.
+@property(nonatomic, strong, readonly) CRWJSInjector* jsInjector;
 
 // Whether the WebController should attempt to keep the render process alive.
 @property(nonatomic, assign, getter=shouldKeepRenderProcessAlive)
@@ -166,13 +161,6 @@
 // Stops loading the page.
 - (void)stopLoading;
 
-// Executes |script| in the web view, registering user interaction.
-// |result| will be backed up by different classes depending on resulting JS
-// type: NSString (string), NSNumber (number or boolean), NSDictionary (object),
-// NSArray (array), NSNull (null), NSDate (Date), nil (undefined).
-- (void)executeUserJavaScript:(NSString*)script
-            completionHandler:(void (^)(id result, NSError*))completion;
-
 // Requires that the next load rebuild the web view. This is expensive, and
 // should be used only in the case where something has changed that the web view
 // only checks on creation, such that the whole object needs to be rebuilt.
@@ -221,6 +209,9 @@
 
 @property(nonatomic, readonly) web::WebState* webState;
 @property(nonatomic, readonly) web::WebStateImpl* webStateImpl;
+// Returns the current page loading phase.
+// TODO(crbug.com/956511): Remove this once refactor is done.
+@property(nonatomic, readonly, assign) web::WKNavigationState navigationState;
 
 // Injects a CRWWebViewContentView for testing.  Takes ownership of
 // |webViewContentView|.
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index c6ebd42..85c7f3e 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -78,8 +78,6 @@
 #import "ios/web/public/url_scheme_util.h"
 #import "ios/web/public/web_client.h"
 #import "ios/web/public/web_state/context_menu_params.h"
-#import "ios/web/public/web_state/js/crw_js_injection_manager.h"
-#import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
 #import "ios/web/public/web_state/page_display_state.h"
 #import "ios/web/public/web_state/ui/crw_context_menu_delegate.h"
 #import "ios/web/public/web_state/ui/crw_native_content.h"
@@ -93,10 +91,10 @@
 #import "ios/web/public/web_state/web_state_policy_decider.h"
 #include "ios/web/public/webui/web_ui_ios.h"
 #import "ios/web/web_state/error_translation_util.h"
-#import "ios/web/web_state/js/crw_js_window_id_manager.h"
 #import "ios/web/web_state/page_viewport_state.h"
 #import "ios/web/web_state/session_certificate_policy_cache_impl.h"
 #import "ios/web/web_state/ui/crw_context_menu_controller.h"
+#import "ios/web/web_state/ui/crw_js_injector.h"
 #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h"
 #import "ios/web/web_state/ui/crw_web_controller.h"
 #import "ios/web/web_state/ui/crw_web_controller_container_view.h"
@@ -218,13 +216,15 @@
 @interface CRWWebController () <BrowsingDataRemoverObserver,
                                 CRWWKNavigationHandlerDelegate,
                                 CRWContextMenuDelegate,
+                                CRWJSInjectorDelegate,
                                 CRWNativeContentDelegate,
                                 CRWSSLStatusUpdaterDataSource,
                                 CRWSSLStatusUpdaterDelegate,
                                 CRWWebControllerContainerViewDelegate,
                                 CRWWebViewScrollViewProxyObserver,
                                 WKNavigationDelegate,
-                                WKUIDelegate> {
+                                WKUIDelegate,
+                                CRWWKNavigationHandlerDelegate> {
   // The view used to display content.  Must outlive |_webViewProxy|. The
   // container view should be accessed through this property rather than
   // |self.view| from within this class, as |self.view| triggers creation while
@@ -264,19 +264,6 @@
   // history navigations.
   BOOL _dispatchingSameDocumentHashChangeEvent;
 
-  // A set of script managers whose scripts have been injected into the current
-  // page.
-  // TODO(stuartmorgan): Revisit this approach; it's intended only as a stopgap
-  // measure to make all the existing script managers work. Longer term, there
-  // should probably be a couple of points where managers can register to have
-  // things happen automatically based on page lifecycle, and if they don't want
-  // to use one of those fixed points, they should make their scripts internally
-  // idempotent.
-  NSMutableSet* _injectedScriptManagers;
-
-  // Script manager for setting the windowID.
-  CRWJSWindowIDManager* _windowIDJSManager;
-
   // Backs up property with the same name.
   std::unique_ptr<web::MojoFacade> _mojoFacade;
 
@@ -330,9 +317,6 @@
 // changed.
 @property(weak, nonatomic, readonly) NSDictionary* WKWebViewObservers;
 
-// Current page navigation state.
-@property(nonatomic, readwrite, assign) web::WKNavigationState navigationState;
-
 // The web view's view of the current URL. During page transitions
 // this may not be the same as the session history's view of the current URL.
 // This method can change the state of the CRWWebController, as it will display
@@ -414,9 +398,6 @@
 // Updates the internal state and informs the delegate that any outstanding load
 // operations are cancelled.
 - (void)loadCancelled;
-// If YES, the page should be closed if it successfully redirects to a native
-// application, for example if a new tab redirects to the App Store.
-- (BOOL)shouldClosePageOnNativeApplicationLoad;
 // Called following navigation completion to generate final navigation lifecycle
 // events. Navigation is considered complete when the document has finished
 // loading, or when other page load mechanics are completed on a
@@ -426,9 +407,10 @@
 // may be called multiple times and thus must be idempotent.
 - (void)loadCompleteWithSuccess:(BOOL)loadSuccess
                      forContext:(web::NavigationContextImpl*)context;
-// Called after URL is finished loading and self.navigationState is set to
-// FINISHED. |context| contains information about the navigation associated
-// with the URL. It is nil if currentURL is invalid.
+// Called after URL is finished loading and
+// self.navigationHandler.navigationState is set to FINISHED. |context| contains
+// information about the navigation associated with the URL. It is nil if
+// currentURL is invalid.
 - (void)didFinishWithURL:(const GURL&)currentURL
              loadSuccess:(BOOL)loadSuccess
                  context:(nullable const web::NavigationContextImpl*)context;
@@ -441,9 +423,6 @@
              senderFrame:(web::WebFrame*)senderFrame;
 // Called when web controller receives a new message from the web page.
 - (void)didReceiveScriptMessage:(WKScriptMessage*)message;
-// Returns a new script which wraps |script| with windowID check so |script| is
-// not evaluated on windowID mismatch.
-- (NSString*)scriptByAddingWindowIDCheckForScript:(NSString*)script;
 // Attempts to handle a script message. Returns YES on success, NO otherwise.
 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage;
 // Handles frame became available message.
@@ -452,9 +431,6 @@
 - (void)frameBecameUnavailableWithMessage:(WKScriptMessage*)message;
 // Clears the frames list.
 - (void)removeAllWebFrames;
-// Maps WKNavigationType to ui::PageTransition.
-- (ui::PageTransition)pageTransitionFromNavigationType:
-    (WKNavigationType)navigationType;
 
 // Restores the state for this page from session history.
 - (void)restoreStateFromHistory;
@@ -484,9 +460,6 @@
 // Sets scroll offset value for webview scroll view from |scrollState|.
 - (void)applyWebViewScrollOffsetFromScrollState:
     (const web::PageScrollState&)scrollState;
-// Sets _documentURL to newURL, and updates any relevant state information.
-- (void)setDocumentURL:(const GURL&)newURL
-               context:(web::NavigationContextImpl*)context;
 // Sets last committed NavigationItem's title to the given |title|, which can
 // not be nil.
 - (void)setNavigationItemTitle:(NSString*)title;
@@ -501,8 +474,6 @@
 // Finds all the scrollviews in the view hierarchy and makes sure they do not
 // interfere with scroll to top when tapping the statusbar.
 - (void)optOutScrollsToTopForSubviews;
-// Returns YES if the navigation action is associated with a main frame request.
-- (BOOL)isMainFrameNavigationAction:(WKNavigationAction*)action;
 // Updates SSL status for the current navigation item based on the information
 // provided by web view.
 - (void)updateSSLStatusForCurrentNavigationItem;
@@ -539,8 +510,6 @@
 // navigation is not back forward navigation.
 - (void)reportBackForwardNavigationTypeForFastNavigation:(BOOL)isFast;
 
-// Sets up WebUI for URL.
-- (void)createWebUIForURL:(const GURL&)URL;
 // Clears WebUI, if one exists.
 - (void)clearWebUI;
 
@@ -563,13 +532,9 @@
       _allowsBackForwardNavigationGestures = YES;
 
     DCHECK(_webStateImpl);
-    // Load phase when no WebView present is 'loaded' because this represents
-    // the idle state.
-    _navigationState = web::WKNavigationState::FINISHED;
     // Content area is lazily instantiated.
     _defaultURL = GURL(url::kAboutBlankURL);
-    _jsInjectionReceiver =
-        [[CRWJSInjectionReceiver alloc] initWithEvaluator:self];
+    _jsInjector = [[CRWJSInjector alloc] initWithDelegate:self];
     _webViewProxy = [[CRWWebViewProxyImpl alloc] initWithWebController:self];
     [[_webViewProxy scrollViewProxy] addObserver:self];
     _pendingLoadCompleteActions = [[NSMutableArray alloc] init];
@@ -650,6 +615,10 @@
   return [self.webView estimatedProgress];
 }
 
+- (BOOL)isWebProcessCrashed {
+  return self.navigationHandler.webProcessCrashed;
+}
+
 - (void)setAllowsBackForwardNavigationGestures:
     (BOOL)allowsBackForwardNavigationGestures {
   // Store it to an instance variable as well as
@@ -703,11 +672,8 @@
         }
                            name:kFrameBecameUnavailableMessageName
                         webView:webView];
-
-    _windowIDJSManager = [[CRWJSWindowIDManager alloc] initWithWebView:webView];
-  } else {
-    _windowIDJSManager = nil;
   }
+  [_jsInjector setWebView:webView];
   [_webView setNavigationDelegate:self];
   [_webView setUIDelegate:self];
   for (NSString* keyPath in self.WKWebViewObservers) {
@@ -715,7 +681,6 @@
   }
   _webView.allowsBackForwardNavigationGestures =
       _allowsBackForwardNavigationGestures;
-  _injectedScriptManagers = [[NSMutableSet alloc] init];
   [self setDocumentURL:_defaultURL context:nullptr];
 }
 
@@ -989,7 +954,8 @@
 }
 
 - (BOOL)isViewAlive {
-  return !_webProcessCrashed && [_containerView isViewAlive];
+  return !self.navigationHandler.webProcessCrashed &&
+         [_containerView isViewAlive];
 }
 
 - (BOOL)contentIsHTML {
@@ -1140,7 +1106,8 @@
 
   // Abort any outstanding page load. This ensures the delegate gets informed
   // about the outgoing page, and further messages from the page are suppressed.
-  if (self.navigationState != web::WKNavigationState::FINISHED)
+  if (self.navigationHandler.navigationState !=
+      web::WKNavigationState::FINISHED)
     [self abortLoad];
 
   DCHECK(!_isHalted);
@@ -1178,7 +1145,7 @@
 }
 
 - (void)loadCurrentURLIfNecessary {
-  if (_webProcessCrashed) {
+  if (self.navigationHandler.webProcessCrashed) {
     [self loadCurrentURLWithRendererInitiatedNavigation:NO];
   } else if (!_currentURLLoadWasTrigerred) {
     [self ensureContainerViewCreated];
@@ -1204,7 +1171,7 @@
       self.webStateImpl, URL,
       /*has_user_gesture=*/true, item->GetTransitionType(),
       /*is_renderer_initiated=*/false);
-  self.navigationState = web::WKNavigationState::REQUESTED;
+  self.navigationHandler.navigationState = web::WKNavigationState::REQUESTED;
   navigationContext->SetNavigationItemUniqueID(item->GetUniqueID());
 
   item->SetNavigationInitiationType(
@@ -1245,7 +1212,7 @@
   // Remove the transient content view.
   self.webStateImpl->ClearTransientContent();
 
-  self.navigationState = web::WKNavigationState::REQUESTED;
+  self.navigationHandler.navigationState = web::WKNavigationState::REQUESTED;
 
   // Web View should not be created for App Specific URLs.
   if (!web::GetWebClient()->IsAppSpecificURL(URL)) {
@@ -1289,28 +1256,6 @@
                                         forNavigation:navigation];
 }
 
-- (void)executeUserJavaScript:(NSString*)script
-            completionHandler:(void (^)(id, NSError*))completion {
-  // For security reasons, executing JavaScript on pages with app-specific URLs
-  // is not allowed, because those pages may have elevated privileges.
-  GURL lastCommittedURL = self.webState->GetLastCommittedURL();
-  if (web::GetWebClient()->IsAppSpecificURL(lastCommittedURL)) {
-    if (completion) {
-      dispatch_async(dispatch_get_main_queue(), ^{
-        NSError* error = [[NSError alloc]
-            initWithDomain:web::kJSEvaluationErrorDomain
-                      code:web::JS_EVALUATION_ERROR_CODE_NO_WEB_VIEW
-                  userInfo:nil];
-        completion(nil, error);
-      });
-    }
-    return;
-  }
-
-  [self touched:YES];
-  [self executeJavaScript:script completionHandler:completion];
-}
-
 - (void)requirePageReconstruction {
   // TODO(crbug.com/736103): Removing web view will destroy session history for
   // WKBasedNavigationManager.
@@ -1409,7 +1354,7 @@
     context->SetIsSameDocument(true);
   } else {
     self.webStateImpl->SetIsLoading(true);
-    self.navigationState = web::WKNavigationState::REQUESTED;
+    self.navigationHandler.navigationState = web::WKNavigationState::REQUESTED;
   }
 
   web::WKBackForwardListItemHolder* holder =
@@ -1462,29 +1407,6 @@
                   }];
 }
 
-#pragma mark - CRWJSInjectionEvaluator (Public)
-
-- (void)executeJavaScript:(NSString*)script
-        completionHandler:(void (^)(id, NSError*))completionHandler {
-  NSString* safeScript = [self scriptByAddingWindowIDCheckForScript:script];
-  web::ExecuteJavaScript(self.webView, safeScript, completionHandler);
-}
-
-- (BOOL)scriptHasBeenInjectedForClass:(Class)injectionManagerClass {
-  return [_injectedScriptManagers containsObject:injectionManagerClass];
-}
-
-- (void)injectScript:(NSString*)script forClass:(Class)JSInjectionManagerClass {
-  DCHECK(script.length);
-  // Script execution is an asynchronous operation which may pass sensitive
-  // data to the page. executeJavaScript:completionHandler makes sure that
-  // receiver page did not change by checking its window id.
-  // |[self.webView executeJavaScript:completionHandler:]| is not used here
-  // because it does not check that page is the same.
-  [self executeJavaScript:script completionHandler:nil];
-  [_injectedScriptManagers addObject:JSInjectionManagerClass];
-}
-
 #pragma mark - CRWSessionControllerDelegate (Public)
 
 - (web::NavigationItemImpl*)pendingItemForSessionController:
@@ -1604,18 +1526,7 @@
   return _documentURL;
 }
 
-- (BOOL)shouldClosePageOnNativeApplicationLoad {
-  // The page should be closed if it was initiated by the DOM and there has been
-  // no user interaction with the page since the web view was created, or if
-  // the page has no navigation items, as occurs when an App Store link is
-  // opened from another application.
-  BOOL rendererInitiatedWithoutInteraction =
-      self.hasOpener &&
-      !_userInteractionState.UserInteractionRegisteredSinceWebViewCreated();
-  BOOL noNavigationItems = !(self.navigationManagerImpl->GetItemCount());
-  return rendererInitiatedWithoutInteraction || noNavigationItems;
-}
-
+// Maps WKNavigationType to ui::PageTransition.
 - (ui::PageTransition)pageTransitionFromNavigationType:
     (WKNavigationType)navigationType {
   switch (navigationType) {
@@ -1733,10 +1644,11 @@
     // Before changing navigation state, the delegate should be informed that
     // any existing request is being cancelled before completion.
     [self loadCancelled];
-    DCHECK_EQ(web::WKNavigationState::FINISHED, self.navigationState);
+    DCHECK_EQ(web::WKNavigationState::FINISHED,
+              self.navigationHandler.navigationState);
   }
 
-  self.navigationState = web::WKNavigationState::REQUESTED;
+  self.navigationHandler.navigationState = web::WKNavigationState::REQUESTED;
 
   // Record the state of outgoing web view. Do nothing if native controller
   // exists, because in that case recordStateInHistory will record the state
@@ -2117,8 +2029,9 @@
 
 - (void)loadCancelled {
   // TODO(crbug.com/821995):  Check if this function should be removed.
-  if (self.navigationState != web::WKNavigationState::FINISHED) {
-    self.navigationState = web::WKNavigationState::FINISHED;
+  if (self.navigationHandler.navigationState !=
+      web::WKNavigationState::FINISHED) {
+    self.navigationHandler.navigationState = web::WKNavigationState::FINISHED;
     if (!_isHalted) {
       self.webStateImpl->SetIsLoading(false);
     }
@@ -2128,7 +2041,8 @@
 - (void)didFinishNavigation:(web::NavigationContextImpl*)context {
   // This can be called at multiple times after the document has loaded. Do
   // nothing if the document has already loaded.
-  if (self.navigationState == web::WKNavigationState::FINISHED)
+  if (self.navigationHandler.navigationState ==
+      web::WKNavigationState::FINISHED)
     return;
 
   // Restore allowsBackForwardNavigationGestures and the scroll proxy once
@@ -2155,12 +2069,12 @@
                      forContext:(web::NavigationContextImpl*)context {
   // The webView may have been torn down (or replaced by a native view). Be
   // safe and do nothing if that's happened.
-  if (self.navigationState != web::WKNavigationState::STARTED)
+  if (self.navigationHandler.navigationState != web::WKNavigationState::STARTED)
     return;
 
   const GURL currentURL([self currentURL]);
 
-  self.navigationState = web::WKNavigationState::FINISHED;
+  self.navigationHandler.navigationState = web::WKNavigationState::FINISHED;
 
   [self optOutScrollsToTopForSubviews];
 
@@ -2177,7 +2091,8 @@
 - (void)didFinishWithURL:(const GURL&)currentURL
              loadSuccess:(BOOL)loadSuccess
                  context:(nullable const web::NavigationContextImpl*)context {
-  DCHECK_EQ(web::WKNavigationState::FINISHED, self.navigationState);
+  DCHECK_EQ(web::WKNavigationState::FINISHED,
+            self.navigationHandler.navigationState);
 
   [self restoreStateFromHistory];
 
@@ -2475,7 +2390,7 @@
     [script appendString:[self javaScriptToDispatchHashChangeWithOldURL:oldURL
                                                                  newURL:URL]];
   }
-  [self executeJavaScript:script completionHandler:nil];
+  [_jsInjector executeJavaScript:script completionHandler:nil];
 }
 
 #pragma mark - Native Content
@@ -2587,21 +2502,10 @@
     [self.nativeController setDelegate:self];
   }
 
-  self.navigationState = web::WKNavigationState::FINISHED;
+  self.navigationHandler.navigationState = web::WKNavigationState::FINISHED;
   [self didFinishWithURL:targetURL loadSuccess:YES context:context.get()];
 }
 
-// Discards non committed items, only if the last committed URL was not loaded
-// in native view. But if it was a native view, no discard will happen to avoid
-// an ugly animation where the web view is inserted and quickly removed.
-- (void)discardNonCommittedItemsIfLastCommittedWasNotNativeView {
-  GURL lastCommittedURL = self.webState->GetLastCommittedURL();
-  BOOL previousItemWasLoadedInNativeView =
-      [self shouldLoadURLInNativeView:lastCommittedURL];
-  if (!previousItemWasLoadedInNativeView)
-    self.navigationManagerImpl->DiscardNonCommittedItems();
-}
-
 #pragma mark - CRWWebControllerContainerViewDelegate
 
 - (CRWWebViewProxyImpl*)contentViewProxyForContainerView:
@@ -2702,12 +2606,6 @@
   }
 }
 
-- (NSString*)scriptByAddingWindowIDCheckForScript:(NSString*)script {
-  NSString* kTemplate = @"if (__gCrWeb['windowId'] === '%@') { %@; }";
-  return [NSString
-      stringWithFormat:kTemplate, [_windowIDJSManager windowID], script];
-}
-
 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage {
   if (![scriptMessage.name isEqualToString:kScriptMessageName]) {
     return NO;
@@ -3021,14 +2919,14 @@
   NSString* replaceWebViewJS = [self javaScriptToReplaceWebViewURL:pushURL
                                                    stateObjectJSON:stateObject];
   __weak CRWWebController* weakSelf = self;
-  [self executeJavaScript:replaceWebViewJS
-        completionHandler:^(id, NSError*) {
-          CRWWebController* strongSelf = weakSelf;
-          if (strongSelf && !strongSelf->_isBeingDestroyed) {
-            [strongSelf optOutScrollsToTopForSubviews];
-            [strongSelf didFinishNavigation:nullptr];
-          }
-        }];
+  [_jsInjector executeJavaScript:replaceWebViewJS
+               completionHandler:^(id, NSError*) {
+                 CRWWebController* strongSelf = weakSelf;
+                 if (strongSelf && !strongSelf->_isBeingDestroyed) {
+                   [strongSelf optOutScrollsToTopForSubviews];
+                   [strongSelf didFinishNavigation:nullptr];
+                 }
+               }];
   return YES;
 }
 
@@ -3081,13 +2979,13 @@
   NSString* replaceStateJS = [self javaScriptToReplaceWebViewURL:replaceURL
                                                  stateObjectJSON:stateObject];
   __weak CRWWebController* weakSelf = self;
-  [self executeJavaScript:replaceStateJS
-        completionHandler:^(id, NSError*) {
-          CRWWebController* strongSelf = weakSelf;
-          if (!strongSelf || strongSelf->_isBeingDestroyed)
-            return;
-          [strongSelf didFinishNavigation:nullptr];
-        }];
+  [_jsInjector executeJavaScript:replaceStateJS
+               completionHandler:^(id, NSError*) {
+                 CRWWebController* strongSelf = weakSelf;
+                 if (!strongSelf || strongSelf->_isBeingDestroyed)
+                   return;
+                 [strongSelf didFinishNavigation:nullptr];
+               }];
   return YES;
 }
 
@@ -3177,6 +3075,7 @@
 
 #pragma mark - WebUI
 
+// Sets up WebUI for URL.
 - (void)createWebUIForURL:(const GURL&)URL {
   // |CreateWebUI| will do nothing if |URL| is not a WebUI URL and then
   // |HasWebUI| will return false.
@@ -3313,15 +3212,17 @@
 // window.scrollTo while user is scrolling. See crbug.com/554257
 - (void)webViewScrollViewWillBeginDragging:
     (CRWWebViewScrollViewProxy*)webViewScrollViewProxy {
-  [self executeJavaScript:@"__gCrWeb.setWebViewScrollViewIsDragging(true)"
-        completionHandler:nil];
+  [_jsInjector
+      executeJavaScript:@"__gCrWeb.setWebViewScrollViewIsDragging(true)"
+      completionHandler:nil];
 }
 
 - (void)webViewScrollViewDidEndDragging:
             (CRWWebViewScrollViewProxy*)webViewScrollViewProxy
                          willDecelerate:(BOOL)decelerate {
-  [self executeJavaScript:@"__gCrWeb.setWebViewScrollViewIsDragging(false)"
-        completionHandler:nil];
+  [_jsInjector
+      executeJavaScript:@"__gCrWeb.setWebViewScrollViewIsDragging(false)"
+      completionHandler:nil];
 }
 
 #pragma mark - Page State
@@ -3344,17 +3245,17 @@
        "viewport ? viewport.content : '';";
   __weak CRWWebController* weakSelf = self;
   int itemID = currentItem->GetUniqueID();
-  [self executeJavaScript:kViewportContentQuery
-        completionHandler:^(id viewportContent, NSError*) {
-          web::NavigationItem* item = [weakSelf currentNavItem];
-          if (item && item->GetUniqueID() == itemID) {
-            web::PageViewportState viewportState(
-                base::mac::ObjCCast<NSString>(viewportContent));
-            completion(&viewportState);
-          } else {
-            completion(nullptr);
-          }
-        }];
+  [_jsInjector executeJavaScript:kViewportContentQuery
+               completionHandler:^(id viewportContent, NSError*) {
+                 web::NavigationItem* item = [weakSelf currentNavItem];
+                 if (item && item->GetUniqueID() == itemID) {
+                   web::PageViewportState viewportState(
+                       base::mac::ObjCCast<NSString>(viewportContent));
+                   completion(&viewportState);
+                 } else {
+                   completion(nullptr);
+                 }
+               }];
 }
 
 - (void)orientationDidChange {
@@ -3473,7 +3374,8 @@
   DCHECK(scrollState.IsValid());
   CGPoint contentOffset = scrollState.GetEffectiveContentOffsetForContentInset(
       self.webScrollView.contentInset);
-  if (self.navigationState == web::WKNavigationState::FINISHED) {
+  if (self.navigationHandler.navigationState ==
+      web::WKNavigationState::FINISHED) {
     // If the page is loaded, update the scroll immediately.
     self.webScrollView.contentOffset = contentOffset;
   } else {
@@ -3501,18 +3403,6 @@
   }
 }
 
-#pragma mark - WKNavigationDelegate Helpers
-
-- (BOOL)isMainFrameNavigationAction:(WKNavigationAction*)action {
-  if (action.targetFrame) {
-    return action.targetFrame.mainFrame;
-  }
-  // According to WKNavigationAction documentation, in the case of a new window
-  // navigation, target frame will be nil. In this case check if the
-  // |sourceFrame| is the mainFrame.
-  return action.sourceFrame.mainFrame;
-}
-
 #pragma mark - Security Helpers
 
 - (void)updateSSLStatusForCurrentNavigationItem {
@@ -3786,7 +3676,7 @@
   // once rdar://35063950 is fixed.
   [self removeWebView];
 
-  _webProcessCrashed = YES;
+  self.navigationHandler.webProcessCrashed = YES;
   self.webStateImpl->CancelDialogs();
   self.webStateImpl->OnRenderProcessGone();
 }
@@ -3971,321 +3861,12 @@
 #pragma mark - WKNavigationDelegate Methods
 
 - (void)webView:(WKWebView*)webView
-    decidePolicyForNavigationAction:(WKNavigationAction*)action
+    decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction
                     decisionHandler:
                         (void (^)(WKNavigationActionPolicy))decisionHandler {
   [self.navigationHandler webView:webView
-      decidePolicyForNavigationAction:action
+      decidePolicyForNavigationAction:navigationAction
                       decisionHandler:decisionHandler];
-
-  _webProcessCrashed = NO;
-  if (_isBeingDestroyed) {
-    decisionHandler(WKNavigationActionPolicyCancel);
-    return;
-  }
-
-  GURL requestURL = net::GURLWithNSURL(action.request.URL);
-
-  // Workaround for a WKWebView bug where the web content loaded using
-  // |-loadHTMLString:baseURL| clobbers the next WKBackForwardListItem. It works
-  // by detecting back/forward navigation to a clobbered item and replacing the
-  // clobberred item and its forward history using a partial session restore in
-  // the current web view. There is an unfortunate caveat: if the workaround is
-  // triggered in a back navigation to a clobbered item, the restored forward
-  // session is inserted after the current item before the back navigation, so
-  // it doesn't fully replaces the "bad" history, even though user will be
-  // navigated to the expected URL and may not notice the issue until they
-  // review the back history by long pressing on "Back" button.
-  //
-  // TODO(crbug.com/887497): remove this workaround once iOS ships the fix.
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
-      action.targetFrame.mainFrame) {
-    GURL webViewURL = net::GURLWithNSURL(webView.URL);
-    GURL currentWKItemURL =
-        net::GURLWithNSURL(webView.backForwardList.currentItem.URL);
-    GURL backItemURL = net::GURLWithNSURL(webView.backForwardList.backItem.URL);
-    web::NavigationContextImpl* context =
-        [self contextForPendingMainFrameNavigationWithURL:webViewURL];
-    bool willClobberHistory =
-        action.navigationType == WKNavigationTypeBackForward &&
-        requestURL == backItemURL && webView.backForwardList.currentItem &&
-        requestURL != currentWKItemURL && currentWKItemURL == webViewURL &&
-        context &&
-        (context->GetPageTransition() & ui::PAGE_TRANSITION_FORWARD_BACK);
-
-    UMA_HISTOGRAM_BOOLEAN("IOS.WKWebViewClobberedHistory", willClobberHistory);
-
-    if (willClobberHistory && base::FeatureList::IsEnabled(
-                                  web::features::kHistoryClobberWorkaround)) {
-      decisionHandler(WKNavigationActionPolicyCancel);
-      self.navigationManagerImpl
-          ->ApplyWKWebViewForwardHistoryClobberWorkaround();
-      return;
-    }
-  }
-
-  // The page will not be changed until this navigation is committed, so the
-  // retrieved state will be pending until |didCommitNavigation| callback.
-  [self updatePendingNavigationInfoFromNavigationAction:action];
-
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
-      action.targetFrame.mainFrame &&
-      action.navigationType == WKNavigationTypeBackForward) {
-    web::NavigationContextImpl* context =
-        [self contextForPendingMainFrameNavigationWithURL:requestURL];
-    if (context) {
-      // Context is null for renderer-initiated navigations.
-      int index = web::GetCommittedItemIndexWithUniqueID(
-          self.navigationManagerImpl, context->GetNavigationItemUniqueID());
-      self.navigationManagerImpl->SetPendingItemIndex(index);
-    }
-  }
-
-  // If this is a placeholder navigation, pass through.
-  if (IsPlaceholderUrl(requestURL)) {
-    decisionHandler(WKNavigationActionPolicyAllow);
-    return;
-  }
-
-  ui::PageTransition transition =
-      [self pageTransitionFromNavigationType:action.navigationType];
-  BOOL isMainFrameNavigationAction = [self isMainFrameNavigationAction:action];
-  if (isMainFrameNavigationAction) {
-    web::NavigationContextImpl* context =
-        [self contextForPendingMainFrameNavigationWithURL:requestURL];
-    if (context) {
-      DCHECK(!context->IsRendererInitiated() ||
-             (context->GetPageTransition() & ui::PAGE_TRANSITION_FORWARD_BACK));
-      transition = context->GetPageTransition();
-      if (context->IsLoadingErrorPage()) {
-        // loadHTMLString: navigation which loads error page into WKWebView.
-        decisionHandler(WKNavigationActionPolicyAllow);
-        return;
-      }
-    }
-  }
-
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
-    // WKBasedNavigationManager doesn't use |loadCurrentURL| for reload or back/
-    // forward navigation. So this is the first point where a form repost would
-    // be detected. Display the confirmation dialog.
-    if ([action.request.HTTPMethod isEqual:@"POST"] &&
-        (action.navigationType == WKNavigationTypeFormResubmitted)) {
-      self.webStateImpl->ShowRepostFormWarningDialog(
-          base::BindOnce(^(bool shouldContinue) {
-            if (shouldContinue) {
-              decisionHandler(WKNavigationActionPolicyAllow);
-            } else {
-              decisionHandler(WKNavigationActionPolicyCancel);
-              if (action.targetFrame.mainFrame) {
-                self.navigationHandler.pendingNavigationInfo.cancelled = YES;
-                self.webStateImpl->SetIsLoading(false);
-              }
-            }
-          }));
-      return;
-    }
-  }
-
-  // Invalid URLs should not be loaded.
-  if (!requestURL.is_valid()) {
-    decisionHandler(WKNavigationActionPolicyCancel);
-    // The HTML5 spec indicates that window.open with an invalid URL should open
-    // about:blank.
-    BOOL isFirstLoadInOpenedWindow =
-        self.webState->HasOpener() &&
-        !self.webState->GetNavigationManager()->GetLastCommittedItem();
-    BOOL isMainFrame = action.targetFrame.mainFrame;
-    if (isFirstLoadInOpenedWindow && isMainFrame) {
-      GURL aboutBlankURL(url::kAboutBlankURL);
-      NavigationManager::WebLoadParams loadParams(aboutBlankURL);
-      loadParams.referrer = [self currentReferrer];
-      self.webState->GetNavigationManager()->LoadURLWithParams(loadParams);
-    }
-    return;
-  }
-
-  // First check if the navigation action should be blocked by the controller
-  // and make sure to update the controller in the case that the controller
-  // can't handle the request URL. Then use the embedders' policyDeciders to
-  // either: 1- Handle the URL it self and return false to stop the controller
-  // from proceeding with the navigation if needed. or 2- return true to allow
-  // the navigation to be proceeded by the web controller.
-  BOOL allowLoad = YES;
-  if (web::GetWebClient()->IsAppSpecificURL(requestURL)) {
-    allowLoad = [self shouldAllowAppSpecificURLNavigationAction:action
-                                                     transition:transition];
-    if (allowLoad && !self.webStateImpl->HasWebUI()) {
-      [self createWebUIForURL:requestURL];
-    }
-  }
-
-  BOOL webControllerCanShow =
-      web::UrlHasWebScheme(requestURL) ||
-      web::GetWebClient()->IsAppSpecificURL(requestURL) ||
-      requestURL.SchemeIs(url::kFileScheme) ||
-      requestURL.SchemeIs(url::kAboutScheme) ||
-      requestURL.SchemeIs(url::kBlobScheme);
-
-  if (allowLoad) {
-    // If the URL doesn't look like one that can be shown as a web page, it may
-    // handled by the embedder. In that case, update the web controller to
-    // correctly reflect the current state.
-    if (!webControllerCanShow) {
-      if (!web::features::StorePendingItemInContext()) {
-        if ([self isMainFrameNavigationAction:action]) {
-          [self stopLoading];
-        }
-      }
-
-      // Purge web view if last committed URL is different from the document
-      // URL. This can happen if external URL was added to the navigation stack
-      // and was loaded using Go Back or Go Forward navigation (in which case
-      // document URL will point to the previous page).  If this is the first
-      // load for a NavigationManager, there will be no last committed item, so
-      // check here.
-      // TODO(crbug.com/850760): Check if this code is still needed. The current
-      // implementation doesn't put external apps URLs in the history, so they
-      // shouldn't be accessable by Go Back or Go Forward navigation.
-      web::NavigationItem* lastCommittedItem =
-          self.webState->GetNavigationManager()->GetLastCommittedItem();
-      if (lastCommittedItem) {
-        GURL lastCommittedURL = lastCommittedItem->GetURL();
-        if (lastCommittedURL != _documentURL) {
-          [self requirePageReconstruction];
-          [self setDocumentURL:lastCommittedURL context:nullptr];
-        }
-      }
-    }
-  }
-
-  if (allowLoad) {
-    BOOL userInteractedWithRequestMainFrame =
-        _userInteractionState.HasUserTappedRecently(self.webView) &&
-        net::GURLWithNSURL(action.request.mainDocumentURL) ==
-            _userInteractionState.LastUserInteraction()->main_document_url;
-    web::WebStatePolicyDecider::RequestInfo requestInfo(
-        transition, isMainFrameNavigationAction,
-        userInteractedWithRequestMainFrame);
-
-    allowLoad =
-        self.webStateImpl->ShouldAllowRequest(action.request, requestInfo);
-    // The WebState may have been closed in the ShouldAllowRequest callback.
-    if (_isBeingDestroyed) {
-      decisionHandler(WKNavigationActionPolicyCancel);
-      return;
-    }
-  }
-
-  if (!webControllerCanShow && web::features::StorePendingItemInContext()) {
-    allowLoad = NO;
-  }
-
-  if (allowLoad) {
-    if ([[action.request HTTPMethod] isEqualToString:@"POST"]) {
-      web::NavigationItemImpl* item = self.currentNavItem;
-      // TODO(crbug.com/570699): Remove this check once it's no longer possible
-      // to have no current entries.
-      if (item)
-        [self cachePOSTDataForRequest:action.request inNavigationItem:item];
-    }
-  } else {
-    if (action.targetFrame.mainFrame) {
-      self.navigationHandler.pendingNavigationInfo.cancelled = YES;
-      // Discard the pending item to ensure that the current URL is not
-      // different from what is displayed on the view. Discard only happens
-      // if the last item was not a native view, to avoid ugly animation of
-      // inserting the webview.
-      [self discardNonCommittedItemsIfLastCommittedWasNotNativeView];
-
-      web::NavigationContextImpl* context =
-          [self contextForPendingMainFrameNavigationWithURL:requestURL];
-      if (context) {
-        // Destroy associated pending item, because this will be the last
-        // WKWebView callback for this navigation context.
-        context->ReleaseItem();
-      }
-
-      if (!_isBeingDestroyed && [self shouldClosePageOnNativeApplicationLoad]) {
-        // Loading was started for user initiated navigations and should be
-        // stopped because no other WKWebView callbacks are called.
-        // TODO(crbug.com/767092): Loading should not start until
-        // webView.loading is changed to YES.
-        self.webStateImpl->SetIsLoading(false);
-
-        self.webStateImpl->CloseWebState();
-        decisionHandler(WKNavigationActionPolicyCancel);
-        return;
-      }
-    }
-
-    if (!_isBeingDestroyed) {
-      // Loading was started for user initiated navigations and should be
-      // stopped because no other WKWebView callbacks are called.
-      // TODO(crbug.com/767092): Loading should not start until webView.loading
-      // is changed to YES.
-      self.webStateImpl->SetIsLoading(false);
-    }
-  }
-
-  // Only try to detect a SafeBrowsing warning if one isn't already displayed,
-  // since the detection logic won't be able to distinguish between the current
-  // warning and a warning for the page that's about to be loaded. Also, since
-  // the purpose of running this logic is to ensure that the right URL is
-  // displayed in the omnibox, don't try to detect a SafeBrowsing warning for
-  // iframe navigations, because the omnibox already shows the correct main
-  // frame URL in that case.
-  if (allowLoad && isMainFrameNavigationAction &&
-      !web::IsSafeBrowsingWarningDisplayedInWebView(self.webView)) {
-    __weak CRWWebController* weakSelf = self;
-    const base::TimeDelta kDelayUntilSafeBrowsingWarningCheck =
-        base::TimeDelta::FromMilliseconds(20);
-    self.navigationHandler.safeBrowsingWarningDetectionTimer->Start(
-        FROM_HERE, kDelayUntilSafeBrowsingWarningCheck, base::BindRepeating(^{
-          __strong __typeof(weakSelf) strongSelf = weakSelf;
-          if (web::IsSafeBrowsingWarningDisplayedInWebView(
-                  strongSelf.webView)) {
-            // Extract state from an existing navigation context if one exists.
-            // Create a new context rather than just re-using the existing one,
-            // since the existing context will continue to be used if the user
-            // decides to proceed to the unsafe page. In that case, WebKit
-            // continues the navigation with the same WKNavigation* that's
-            // associated with the existing context.
-            web::NavigationContextImpl* existingContext = [strongSelf
-                contextForPendingMainFrameNavigationWithURL:requestURL];
-            bool hasUserGesture =
-                existingContext ? existingContext->HasUserGesture() : false;
-            bool isRendererInitiated =
-                existingContext ? existingContext->IsRendererInitiated() : true;
-            std::unique_ptr<web::NavigationContextImpl> context =
-                web::NavigationContextImpl::CreateNavigationContext(
-                    strongSelf->_webStateImpl, requestURL, hasUserGesture,
-                    transition, isRendererInitiated);
-            strongSelf.navigationManagerImpl->AddTransientItem(requestURL);
-            strongSelf.webStateImpl->OnNavigationStarted(context.get());
-            strongSelf.webStateImpl->OnNavigationFinished(context.get());
-            strongSelf.navigationHandler.safeBrowsingWarningDetectionTimer
-                ->Stop();
-            if (!existingContext) {
-              // If there's an existing context, observers will already be aware
-              // of a load in progress. Otherwise, observers need to be notified
-              // here, so that if the user decides to go back to the previous
-              // page (stopping the load), observers will be aware of a possible
-              // URL change and the URL displayed in the omnibox will get
-              // updated.
-              DCHECK(strongSelf->_webView.loading);
-              strongSelf->_webStateImpl->SetIsLoading(true);
-            }
-          }
-        }));
-  }
-
-  if (!allowLoad) {
-    decisionHandler(WKNavigationActionPolicyCancel);
-    return;
-  }
-  BOOL isOffTheRecord = self.webState->GetBrowserState()->IsOffTheRecord();
-  decisionHandler(web::GetAllowNavigationActionPolicy(isOffTheRecord));
 }
 
 - (void)webView:(WKWebView*)webView
@@ -4295,202 +3876,18 @@
   [self.navigationHandler webView:webView
       decidePolicyForNavigationResponse:WKResponse
                         decisionHandler:handler];
-
-  // If this is a placeholder navigation, pass through.
-  GURL responseURL = net::GURLWithNSURL(WKResponse.response.URL);
-  if (IsPlaceholderUrl(responseURL)) {
-    handler(WKNavigationResponsePolicyAllow);
-    return;
-  }
-
-  scoped_refptr<net::HttpResponseHeaders> headers;
-  if ([WKResponse.response isKindOfClass:[NSHTTPURLResponse class]]) {
-    headers = net::CreateHeadersFromNSHTTPURLResponse(
-        static_cast<NSHTTPURLResponse*>(WKResponse.response));
-    // TODO(crbug.com/551677): remove |OnHttpResponseHeadersReceived| and attach
-    // headers to web::NavigationContext.
-    self.webStateImpl->OnHttpResponseHeadersReceived(headers.get(),
-                                                     responseURL);
-  }
-
-  // The page will not be changed until this navigation is committed, so the
-  // retrieved state will be pending until |didCommitNavigation| callback.
-  [self updatePendingNavigationInfoFromNavigationResponse:WKResponse];
-
-  BOOL shouldRenderResponse = [self shouldRenderResponse:WKResponse];
-  if (!shouldRenderResponse) {
-    if (web::UrlHasWebScheme(responseURL)) {
-      [self createDownloadTaskForResponse:WKResponse HTTPHeaders:headers.get()];
-    } else {
-      // DownloadTask only supports web schemes, so do nothing.
-    }
-    // Discard the pending item to ensure that the current URL is not different
-    // from what is displayed on the view.
-    [self discardNonCommittedItemsIfLastCommittedWasNotNativeView];
-    if (!web::features::StorePendingItemInContext()) {
-      // Loading will be stopped in webView:didFinishNavigation: callback. This
-      // call is here to preserve the original behavior when pending item is not
-      // stored in NavigationContext.
-      self.webStateImpl->SetIsLoading(false);
-    }
-  } else {
-    shouldRenderResponse = self.webStateImpl->ShouldAllowResponse(
-        WKResponse.response, WKResponse.forMainFrame);
-  }
-
-  if (!shouldRenderResponse && WKResponse.canShowMIMEType &&
-      WKResponse.forMainFrame) {
-    self.navigationHandler.pendingNavigationInfo.cancelled = YES;
-  }
-
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
-      !WKResponse.forMainFrame && !self.webView.loading) {
-    // This is the terminal callback for iframe navigation and there is no
-    // pending main frame navigation. Last chance to flip IsLoading to false.
-    self.webStateImpl->SetIsLoading(false);
-  }
-
-  handler(shouldRenderResponse ? WKNavigationResponsePolicyAllow
-                               : WKNavigationResponsePolicyCancel);
 }
 
 - (void)webView:(WKWebView*)webView
     didStartProvisionalNavigation:(WKNavigation*)navigation {
   [self.navigationHandler webView:webView
       didStartProvisionalNavigation:navigation];
-
-  GURL webViewURL = net::GURLWithNSURL(webView.URL);
-
-  [self.navigationHandler.navigationStates
-           setState:web::WKNavigationState::STARTED
-      forNavigation:navigation];
-
-  if (webViewURL.is_empty()) {
-    // May happen on iOS9, however in didCommitNavigation: callback the URL
-    // will be "about:blank".
-    webViewURL = GURL(url::kAboutBlankURL);
-  }
-
-  web::NavigationContextImpl* context =
-      [self.navigationHandler.navigationStates contextForNavigation:navigation];
-
-  if (context) {
-    // This is already seen and registered navigation.
-
-    if (context->IsLoadingErrorPage()) {
-      // This is loadHTMLString: navigation to display error page in web view.
-      self.navigationState = web::WKNavigationState::REQUESTED;
-      return;
-    }
-
-    if (!context->IsPlaceholderNavigation() &&
-        context->GetUrl() != webViewURL) {
-      // Update last seen URL because it may be changed by WKWebView (f.e. by
-      // performing characters escaping).
-      web::NavigationItem* item =
-          web::GetItemWithUniqueID(self.navigationManagerImpl, context);
-      if (!IsWKInternalUrl(webViewURL)) {
-        if (item) {
-          item->SetURL(webViewURL);
-        }
-        context->SetUrl(webViewURL);
-      }
-    }
-    self.webStateImpl->OnNavigationStarted(context);
-    return;
-  }
-
-  // This is renderer-initiated navigation which was not seen before and
-  // should be registered.
-
-  // When using WKBasedNavigationManager, renderer-initiated app-specific loads
-  // should be allowed in two specific cases:
-  // 1) if |backForwardList.currentItem| is a placeholder URL for the
-  //    provisional load URL (i.e. webView.URL), then this is an in-progress
-  //    app-specific load and should not be restarted.
-  // 2) back/forward navigation to an app-specific URL should be allowed.
-  bool exemptedAppSpecificLoad = false;
-  if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
-    bool currentItemIsPlaceholder =
-        CreatePlaceholderUrlForUrl(webViewURL) ==
-        net::GURLWithNSURL(webView.backForwardList.currentItem.URL);
-    bool isBackForward =
-        self.navigationHandler.pendingNavigationInfo.navigationType ==
-        WKNavigationTypeBackForward;
-    bool isRestoringSession =
-        web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
-        IsRestoreSessionUrl(_documentURL);
-    exemptedAppSpecificLoad =
-        currentItemIsPlaceholder || isBackForward || isRestoringSession;
-  }
-
-  if (!web::GetWebClient()->IsAppSpecificURL(webViewURL) ||
-      !exemptedAppSpecificLoad) {
-    [self clearWebUI];
-  }
-
-  if (web::GetWebClient()->IsAppSpecificURL(webViewURL) &&
-      !exemptedAppSpecificLoad) {
-    // Restart app specific URL loads to properly capture state.
-    // TODO(crbug.com/546347): Extract necessary tasks for app specific URL
-    // navigation rather than restarting the load.
-
-    // Renderer-initiated loads of WebUI can be done only from other WebUI
-    // pages. WebUI pages may have increased power and using the same web
-    // process (which may potentially be controller by an attacker) is
-    // dangerous.
-    if (web::GetWebClient()->IsAppSpecificURL(_documentURL)) {
-      [self abortLoad];
-      NavigationManager::WebLoadParams params(webViewURL);
-      self.webState->GetNavigationManager()->LoadURLWithParams(params);
-    }
-    return;
-  }
-
-  self.webStateImpl->GetNavigationManagerImpl()
-      .OnRendererInitiatedNavigationStarted(webViewURL);
-
-  // When a client-side redirect occurs while an interstitial warning is
-  // displayed, clear the warning and its navigation item, so that a new
-  // pending item is created for |context| in |registerLoadRequestForURL|. See
-  // crbug.com/861836.
-  self.webStateImpl->ClearTransientContent();
-
-  std::unique_ptr<web::NavigationContextImpl> navigationContext =
-      [self registerLoadRequestForURL:webViewURL
-               sameDocumentNavigation:NO
-                       hasUserGesture:self.navigationHandler
-                                          .pendingNavigationInfo.hasUserGesture
-                    rendererInitiated:YES
-                placeholderNavigation:IsPlaceholderUrl(webViewURL)];
-  web::NavigationContextImpl* navigationContextPtr = navigationContext.get();
-  // GetPendingItem which may be called inside OnNavigationStarted relies on
-  // association between NavigationContextImpl and WKNavigation.
-  [self.navigationHandler.navigationStates
-         setContext:std::move(navigationContext)
-      forNavigation:navigation];
-  self.webStateImpl->OnNavigationStarted(navigationContextPtr);
-  DCHECK_EQ(web::WKNavigationState::REQUESTED, self.navigationState);
 }
 
 - (void)webView:(WKWebView*)webView
     didReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation {
   [self.navigationHandler webView:webView
       didReceiveServerRedirectForProvisionalNavigation:navigation];
-
-  GURL webViewURL = net::GURLWithNSURL(webView.URL);
-
-  // This callback should never be triggered for placeholder navigations.
-  DCHECK(!(web::GetWebClient()->IsSlimNavigationManagerEnabled() &&
-           IsPlaceholderUrl(webViewURL)));
-
-  [self.navigationHandler.navigationStates
-           setState:web::WKNavigationState::REDIRECTED
-      forNavigation:navigation];
-
-  web::NavigationContextImpl* context =
-      [self.navigationHandler.navigationStates contextForNavigation:navigation];
-  [self didReceiveRedirectForNavigation:context withURL:webViewURL];
 }
 
 - (void)webView:(WKWebView*)webView
@@ -4640,7 +4037,8 @@
       // rdar://37547029 was fixed on iOS 12.
     } else if (context && !context->IsPlaceholderNavigation() &&
                context->GetUrl() != webViewURL) {
-      [self didReceiveRedirectForNavigation:context withURL:webViewURL];
+      [self.navigationHandler didReceiveRedirectForNavigation:context
+                                                      withURL:webViewURL];
     }
   }
 
@@ -4691,13 +4089,13 @@
   // |loadHTMLString:baseURL| navigation is committed.
   if (!web::GetWebClient()->IsSlimNavigationManagerEnabled() ||
       !IsPlaceholderUrl(webViewURL)) {
-    _injectedScriptManagers = [[NSMutableSet alloc] init];
+    [_jsInjector resetInjectedScriptSet];
     if ([self contentIsHTML] || [self contentIsImage] ||
         self.webState->GetContentsMimeType().empty()) {
       // In unit tests MIME type will be empty, because loadHTML:forURL: does
       // not notify web view delegate about received response, so web controller
       // does not get a chance to properly update MIME type.
-      [_windowIDJSManager inject];
+      [_jsInjector injectWindowID];
       web::WebFramesManagerImpl::FromWebState(self.webState)
           ->RegisterExistingFrames();
     }
@@ -5066,114 +4464,13 @@
 // been registered for a non-document-changing URL change. Updates internal
 // state not specific to web pages.
 - (void)didStartLoading {
-  self.navigationState = web::WKNavigationState::STARTED;
+  self.navigationHandler.navigationState = web::WKNavigationState::STARTED;
   _displayStateOnStartLoading = self.pageDisplayState;
 
   _userInteractionState.SetUserInteractionRegisteredSincePageLoaded(false);
   _pageHasZoomed = NO;
 }
 
-// Caches request POST data in the given session entry.
-- (void)cachePOSTDataForRequest:(NSURLRequest*)request
-               inNavigationItem:(web::NavigationItemImpl*)item {
-  NSUInteger maxPOSTDataSizeInBytes = 4096;
-  NSString* cookieHeaderName = @"cookie";
-
-  DCHECK(item);
-  const bool shouldUpdateEntry =
-      ui::PageTransitionCoreTypeIs(item->GetTransitionType(),
-                                   ui::PAGE_TRANSITION_FORM_SUBMIT) &&
-      ![request HTTPBodyStream] &&  // Don't cache streams.
-      !item->HasPostData() &&
-      item->GetURL() == net::GURLWithNSURL([request URL]);
-  const bool belowSizeCap =
-      [[request HTTPBody] length] < maxPOSTDataSizeInBytes;
-  DLOG_IF(WARNING, shouldUpdateEntry && !belowSizeCap)
-      << "Data in POST request exceeds the size cap (" << maxPOSTDataSizeInBytes
-      << " bytes), and will not be cached.";
-
-  if (shouldUpdateEntry && belowSizeCap) {
-    item->SetPostData([request HTTPBody]);
-    item->ResetHttpRequestHeaders();
-    item->AddHttpRequestHeaders([request allHTTPHeaderFields]);
-    // Don't cache the "Cookie" header.
-    // According to NSURLRequest documentation, |-valueForHTTPHeaderField:| is
-    // case insensitive, so it's enough to test the lower case only.
-    if ([request valueForHTTPHeaderField:cookieHeaderName]) {
-      // Case insensitive search in |headers|.
-      NSSet* cookieKeys = [item->GetHttpRequestHeaders()
-          keysOfEntriesPassingTest:^(id key, id obj, BOOL* stop) {
-            NSString* header = (NSString*)key;
-            const BOOL found =
-                [header caseInsensitiveCompare:cookieHeaderName] ==
-                NSOrderedSame;
-            *stop = found;
-            return found;
-          }];
-      DCHECK_EQ(1u, [cookieKeys count]);
-      item->RemoveHttpRequestHeaderForKey([cookieKeys anyObject]);
-    }
-  }
-}
-
-// Returns YES if the given |action| should be allowed to continue for app
-// specific URL. If this returns NO, the navigation should be cancelled.
-// App specific pages have elevated privileges and WKWebView uses the same
-// renderer process for all page frames. With that Chromium does not allow
-// running App specific pages in the same process as a web site from the
-// internet. Allows navigation to app specific URL in the following cases:
-//   - last committed URL is app specific
-//   - navigation not a new navigation (back-forward or reload)
-//   - navigation is typed, generated or bookmark
-//   - navigation is performed in iframe and main frame is app-specific page
-- (BOOL)shouldAllowAppSpecificURLNavigationAction:(WKNavigationAction*)action
-                                       transition:
-                                           (ui::PageTransition)pageTransition {
-  GURL requestURL = net::GURLWithNSURL(action.request.URL);
-  DCHECK(web::GetWebClient()->IsAppSpecificURL(requestURL));
-  if (web::GetWebClient()->IsAppSpecificURL(
-          self.webStateImpl->GetLastCommittedURL())) {
-    // Last committed page is also app specific and navigation should be
-    // allowed.
-    return YES;
-  }
-
-  if (!ui::PageTransitionIsNewNavigation(pageTransition)) {
-    // Allow reloads and back-forward navigations.
-    return YES;
-  }
-
-  if (ui::PageTransitionTypeIncludingQualifiersIs(pageTransition,
-                                                  ui::PAGE_TRANSITION_TYPED)) {
-    return YES;
-  }
-
-  if (ui::PageTransitionTypeIncludingQualifiersIs(
-          pageTransition, ui::PAGE_TRANSITION_GENERATED)) {
-    return YES;
-  }
-
-  if (ui::PageTransitionTypeIncludingQualifiersIs(
-          pageTransition, ui::PAGE_TRANSITION_AUTO_BOOKMARK)) {
-    return YES;
-  }
-
-  // If the session is being restored, allow the navigation.
-  if (IsRestoreSessionUrl(_documentURL)) {
-    return YES;
-  }
-
-  GURL mainDocumentURL = net::GURLWithNSURL(action.request.mainDocumentURL);
-  if (web::GetWebClient()->IsAppSpecificURL(mainDocumentURL) &&
-      !action.sourceFrame.mainFrame) {
-    // AppSpecific URLs are allowed inside iframe if the main frame is also
-    // app specific page.
-    return YES;
-  }
-
-  return NO;
-}
-
 // Called when a load ends in an error.
 - (void)handleLoadError:(NSError*)error
           forNavigation:(WKNavigation*)navigation
@@ -5354,104 +4651,6 @@
   return provisionalLoad;
 }
 
-// Returns YES if response should be rendered in WKWebView.
-- (BOOL)shouldRenderResponse:(WKNavigationResponse*)WKResponse {
-  if (!WKResponse.canShowMIMEType) {
-    return NO;
-  }
-
-  GURL responseURL = net::GURLWithNSURL(WKResponse.response.URL);
-  if (responseURL.SchemeIs(url::kDataScheme) && WKResponse.forMainFrame) {
-    // Block rendering data URLs for renderer-initiated navigations in main
-    // frame to prevent abusive behavior (crbug.com/890558).
-    web::NavigationContext* context =
-        [self contextForPendingMainFrameNavigationWithURL:responseURL];
-    if (context->IsRendererInitiated()) {
-      return NO;
-    }
-  }
-
-  return YES;
-}
-
-// Creates DownloadTask for the given navigation response. Headers are passed
-// as argument to avoid extra NSDictionary -> net::HttpResponseHeaders
-// conversion.
-- (void)createDownloadTaskForResponse:(WKNavigationResponse*)WKResponse
-                          HTTPHeaders:(net::HttpResponseHeaders*)headers {
-  const GURL responseURL = net::GURLWithNSURL(WKResponse.response.URL);
-  const int64_t contentLength = WKResponse.response.expectedContentLength;
-  const std::string MIMEType =
-      base::SysNSStringToUTF8(WKResponse.response.MIMEType);
-
-  std::string contentDisposition;
-  if (headers) {
-    headers->GetNormalizedHeader("content-disposition", &contentDisposition);
-  }
-
-  ui::PageTransition transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME;
-  if (WKResponse.forMainFrame) {
-    web::NavigationContextImpl* context =
-        [self contextForPendingMainFrameNavigationWithURL:responseURL];
-    context->SetIsDownload(true);
-    context->ReleaseItem();
-    // Navigation callbacks can only be called for the main frame.
-    self.webStateImpl->OnNavigationFinished(context);
-    transition = context->GetPageTransition();
-    bool transitionIsLink = ui::PageTransitionTypeIncludingQualifiersIs(
-        transition, ui::PAGE_TRANSITION_LINK);
-    if (transitionIsLink && !context->HasUserGesture()) {
-      // Link click is not possible without user gesture, so this transition
-      // was incorrectly classified and should be "client redirect" instead.
-      // TODO(crbug.com/549301): Remove this workaround when transition
-      // detection is fixed.
-      transition = ui::PAGE_TRANSITION_CLIENT_REDIRECT;
-    }
-  }
-  web::DownloadController::FromBrowserState(
-      self.webStateImpl->GetBrowserState())
-      ->CreateDownloadTask(self.webStateImpl, [NSUUID UUID].UUIDString,
-                           responseURL, contentDisposition, contentLength,
-                           MIMEType, transition);
-}
-
-// Extracts navigation info from WKNavigationAction and sets it as a pending.
-// Some pieces of navigation information are only known in
-// |decidePolicyForNavigationAction|, but must be in a pending state until
-// |didgo/Navigation| where it becames current.
-- (void)updatePendingNavigationInfoFromNavigationAction:
-    (WKNavigationAction*)action {
-  if (action.targetFrame.mainFrame) {
-    self.navigationHandler.pendingNavigationInfo =
-        [[CRWPendingNavigationInfo alloc] init];
-    self.navigationHandler.pendingNavigationInfo.referrer =
-        [action.request valueForHTTPHeaderField:kReferrerHeaderName];
-    self.navigationHandler.pendingNavigationInfo.navigationType =
-        action.navigationType;
-    self.navigationHandler.pendingNavigationInfo.HTTPMethod =
-        action.request.HTTPMethod;
-    self.navigationHandler.pendingNavigationInfo.hasUserGesture =
-        web::GetNavigationActionInitiationType(action) ==
-        web::NavigationActionInitiationType::kUserInitiated;
-  }
-}
-
-// Extracts navigation info from WKNavigationResponse and sets it as a pending.
-// Some pieces of navigation information are only known in
-// |decidePolicyForNavigationResponse|, but must be in a pending state until
-// |didCommitNavigation| where it becames current.
-- (void)updatePendingNavigationInfoFromNavigationResponse:
-    (WKNavigationResponse*)response {
-  if (response.isForMainFrame) {
-    if (!self.navigationHandler.pendingNavigationInfo) {
-      self.navigationHandler.pendingNavigationInfo =
-          [[CRWPendingNavigationInfo alloc] init];
-    }
-    self.navigationHandler.pendingNavigationInfo.MIMEType =
-        response.response.MIMEType;
-  }
-}
-
 // Updates current state with any pending information. Should be called when a
 // navigation is committed.
 - (void)commitPendingNavigationInfo {
@@ -5493,53 +4692,6 @@
         self.navigationHandler.pendingNavigationInfo.MIMEType);
 }
 
-// Returns context for pending navigation that has |URL|. null if there is no
-// matching pending navigation.
-- (web::NavigationContextImpl*)contextForPendingMainFrameNavigationWithURL:
-    (const GURL&)URL {
-  // Here the enumeration variable |navigation| is __strong to allow setting it
-  // to nil.
-  for (__strong id navigation in
-       [self.navigationHandler.navigationStates pendingNavigations]) {
-    if (navigation == [NSNull null]) {
-      // null is a valid navigation object passed to WKNavigationDelegate
-      // callbacks and represents window opening action.
-      navigation = nil;
-    }
-
-    web::NavigationContextImpl* context =
-        [self.navigationHandler.navigationStates
-            contextForNavigation:navigation];
-    if (context && context->GetUrl() == URL) {
-      return context;
-    }
-  }
-  return nullptr;
-}
-
-// Updates URL for navigation context and navigation item.
-- (void)didReceiveRedirectForNavigation:(web::NavigationContextImpl*)context
-                                withURL:(const GURL&)URL {
-  context->SetUrl(URL);
-  web::NavigationItemImpl* item =
-      web::GetItemWithUniqueID(self.navigationManagerImpl, context);
-
-  // Associated item can be a pending item, previously discarded by another
-  // navigation. WKWebView allows multiple provisional navigations, while
-  // Navigation Manager has only one pending navigation.
-  if (item) {
-    if (!IsWKInternalUrl(URL)) {
-      item->SetVirtualURL(URL);
-      item->SetURL(URL);
-    }
-    // Redirects (3xx response code), must change POST requests to GETs.
-    item->SetPostData(nil);
-    item->ResetHttpRequestHeaders();
-  }
-
-  _userInteractionState.ResetLastTransferTime();
-}
-
 // Returns YES if the current live view is a web view with an image MIME type.
 - (BOOL)contentIsImage {
   if (!self.webView)
@@ -5596,7 +4748,18 @@
 - (void)webView:(WKWebView*)webView
     executeJavaScript:(NSString*)javaScript
     completionHandler:(void (^)(id, NSError*))completionHandler {
-  [self executeJavaScript:javaScript completionHandler:completionHandler];
+  [_jsInjector executeJavaScript:javaScript
+               completionHandler:completionHandler];
+}
+
+#pragma mark - CRWJSInjectorDelegate methods
+
+- (GURL)lastCommittedURLForJSInjector:(CRWJSInjector*)injector {
+  return self.webState->GetLastCommittedURL();
+}
+
+- (void)willExecuteUserScriptForJSInjector:(CRWJSInjector*)injector {
+  [self touched:YES];
 }
 
 #pragma mark - CRWNativeContentDelegate methods
@@ -5648,7 +4811,8 @@
 // Called when WKWebView certificateChain or hasOnlySecureContent property has
 // changed.
 - (void)webViewSecurityFeaturesDidChange {
-  if (self.navigationState == web::WKNavigationState::REQUESTED) {
+  if (self.navigationHandler.navigationState ==
+      web::WKNavigationState::REQUESTED) {
     // Do not update SSL Status for pending load. It will be updated in
     // |webView:didCommitNavigation:| callback.
     return;
@@ -5666,8 +4830,8 @@
   if (![self isCurrentNavigationBackForward])
     return;
 
-  web::NavigationContextImpl* existingContext =
-      [self contextForPendingMainFrameNavigationWithURL:webViewURL];
+  web::NavigationContextImpl* existingContext = [self.navigationHandler
+      contextForPendingMainFrameNavigationWithURL:webViewURL];
 
   // When traversing history restored from a previous session, WKWebView does
   // not fire 'pageshow', 'onload', 'popstate' or any of the
@@ -5687,7 +4851,8 @@
       IsRestoreSessionUrl(webViewURL)) {
     if (previousURLHasAboutScheme || is_back_forward_navigation) {
       [self.webView reload];
-      self.navigationState = web::WKNavigationState::REQUESTED;
+      self.navigationHandler.navigationState =
+          web::WKNavigationState::REQUESTED;
       return;
     }
   }
@@ -5696,8 +4861,8 @@
   // before committing the current navigation or resetting the web view's
   // |isLoading| property to NO.  If this is the first navigation for the web
   // view, this will result in an empty URL.
-  BOOL navigationWasCommitted =
-      self.navigationState != web::WKNavigationState::REQUESTED;
+  BOOL navigationWasCommitted = self.navigationHandler.navigationState !=
+                                web::WKNavigationState::REQUESTED;
   if (!navigationWasCommitted &&
       (webViewURL.is_empty() || webViewURL == _documentURL)) {
     return;
@@ -5753,7 +4918,7 @@
 - (void)webViewTitleDidChange {
   // WKWebView's title becomes empty when the web process dies; ignore that
   // update.
-  if (_webProcessCrashed) {
+  if (self.navigationHandler.webProcessCrashed) {
     DCHECK_EQ(self.webView.title.length, 0U);
     return;
   }
@@ -5948,7 +5113,8 @@
       _documentURL.GetOrigin() != newURL.GetOrigin()) {
     return NO;
   }
-  if (self.navigationState == web::WKNavigationState::REQUESTED) {
+  if (self.navigationHandler.navigationState ==
+      web::WKNavigationState::REQUESTED) {
     // Normally LOAD_REQUESTED indicates that this is a regular, pending
     // navigation, but it can also happen during a fast-back navigation across
     // a hash change, so that case is potentially a same-document navigation.
@@ -6001,7 +5167,8 @@
   // context object.
   std::unique_ptr<web::NavigationContextImpl> newNavigationContext;
   if (!_changingHistoryState) {
-    if ([self contextForPendingMainFrameNavigationWithURL:newURL]) {
+    if ([self.navigationHandler
+            contextForPendingMainFrameNavigationWithURL:newURL]) {
       // NavigationManager::LoadURLWithParams() was called with URL that has
       // different fragment comparing to the previous URL.
     } else {
@@ -6037,8 +5204,8 @@
     // existed before.
     web::NavigationContextImpl* navigationContext = newNavigationContext.get();
     if (!navigationContext) {
-      navigationContext =
-          [self contextForPendingMainFrameNavigationWithURL:newURL];
+      navigationContext = [self.navigationHandler
+          contextForPendingMainFrameNavigationWithURL:newURL];
     }
     navigationContext->SetIsSameDocument(true);
     self.webStateImpl->OnNavigationStarted(navigationContext);
@@ -6057,7 +5224,78 @@
 
 - (BOOL)navigationHandlerWebViewBeingDestroyed:
     (CRWWKNavigationHandler*)navigationHandler {
-  return _beingDestroyed;
+  return _isBeingDestroyed;
+}
+
+- (web::WebStateImpl*)webStateImplForNavigationHandler:
+    (CRWWKNavigationHandler*)navigationHandler {
+  return self.webStateImpl;
+}
+
+- (web::UserInteractionState*)userInteractionStateForNavigationHandler:
+    (CRWWKNavigationHandler*)navigationHandler {
+  return &_userInteractionState;
+}
+
+- (web::Referrer)currentReferrerForNavigationHandler:
+    (CRWWKNavigationHandler*)navigationHandler {
+  return self.currentReferrer;
+}
+
+- (GURL)navigationHandlerDocumentURL:
+    (CRWWKNavigationHandler*)navigationHandler {
+  return _documentURL;
+}
+
+- (ui::PageTransition)navigationHandler:
+                          (CRWWKNavigationHandler*)navigationHandler
+       pageTransitionFromNavigationType:(WKNavigationType)navigationType {
+  return [self pageTransitionFromNavigationType:navigationType];
+}
+
+- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler
+        createWebUIForURL:(const GURL&)URL {
+  [self createWebUIForURL:URL];
+}
+
+- (void)navigationHandlerStopLoading:
+    (CRWWKNavigationHandler*)navigationHandler {
+  [self stopLoading];
+}
+
+- (void)navigationHandlerAbortLoading:
+    (CRWWKNavigationHandler*)navigationHandler {
+  [self abortLoad];
+}
+
+- (void)navigationHandler:(CRWWKNavigationHandler*)navigationHandler
+           setDocumentURL:(const GURL&)newURL
+                  context:(web::NavigationContextImpl*)context {
+  [self setDocumentURL:newURL context:context];
+}
+
+- (BOOL)navigationHandler:(CRWWKNavigationHandler*)navigationHandler
+    shouldLoadURLInNativeView:(const GURL&)url {
+  return [self shouldLoadURLInNativeView:url];
+}
+
+- (void)navigationHandlerRequirePageReconstruction:
+    (CRWWKNavigationHandler*)navigationHandler {
+  [self requirePageReconstruction];
+}
+
+- (std::unique_ptr<web::NavigationContextImpl>)
+            navigationHandler:(CRWWKNavigationHandler*)navigationHandler
+    registerLoadRequestForURL:(const GURL&)URL
+       sameDocumentNavigation:(BOOL)sameDocumentNavigation
+               hasUserGesture:(BOOL)hasUserGesture
+            rendererInitiated:(BOOL)renderedInitiated
+        placeholderNavigation:(BOOL)placeholderNavigation {
+  return [self registerLoadRequestForURL:URL
+                  sameDocumentNavigation:sameDocumentNavigation
+                          hasUserGesture:hasUserGesture
+                       rendererInitiated:renderedInitiated
+                   placeholderNavigation:placeholderNavigation];
 }
 
 #pragma mark - Testing-Only Methods
@@ -6077,4 +5315,8 @@
   _containerView = nil;
 }
 
+- (web::WKNavigationState)navigationState {
+  return self.navigationHandler.navigationState;
+}
+
 @end
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm
index 27ad1b6..93ece91 100644
--- a/ios/web/web_state/ui/crw_web_controller_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -50,6 +50,7 @@
 #include "ios/web/test/test_url_constants.h"
 #import "ios/web/test/web_test_with_web_controller.h"
 #import "ios/web/test/wk_web_view_crash_utils.h"
+#import "ios/web/web_state/ui/crw_js_injector.h"
 #import "ios/web/web_state/ui/crw_web_controller.h"
 #import "ios/web/web_state/ui/crw_web_controller_container_view.h"
 #import "ios/web/web_state/ui/web_view_js_utils.h"
@@ -1224,7 +1225,7 @@
     __block id script_result = nil;
     __block NSError* script_error = nil;
     __block bool script_executed = false;
-    [web_controller()
+    [web_controller().jsInjector
         executeUserJavaScript:java_script
             completionHandler:^(id local_result, NSError* local_error) {
               script_result = local_result;
@@ -1272,7 +1273,7 @@
   EXPECT_FALSE(ExecuteUserJavaScript(@"window.w = 0;", &error));
   ASSERT_TRUE(error);
   EXPECT_NSEQ(kJSEvaluationErrorDomain, error.domain);
-  EXPECT_EQ(JS_EVALUATION_ERROR_CODE_NO_WEB_VIEW, error.code);
+  EXPECT_EQ(JS_EVALUATION_ERROR_CODE_REJECTED, error.code);
 
   EXPECT_FALSE(ExecuteJavaScript(@"window.w"));
 }
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index 156c80c5..e2f546c7 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -41,6 +41,7 @@
 #include "ios/web/public/webui/web_ui_ios_controller.h"
 #include "ios/web/web_state/global_web_state_event_tracker.h"
 #import "ios/web/web_state/session_certificate_policy_cache_impl.h"
+#import "ios/web/web_state/ui/crw_js_injector.h"
 #import "ios/web/web_state/ui/crw_web_controller.h"
 #import "ios/web/web_state/ui/crw_web_controller_container_view.h"
 #import "ios/web/web_state/ui/crw_web_view_navigation_proxy.h"
@@ -647,32 +648,33 @@
 }
 
 CRWJSInjectionReceiver* WebStateImpl::GetJSInjectionReceiver() const {
-  return [web_controller_ jsInjectionReceiver];
+  return [web_controller_.jsInjector JSInjectionReceiver];
 }
 
 void WebStateImpl::ExecuteJavaScript(const base::string16& javascript) {
-  [web_controller_ executeJavaScript:base::SysUTF16ToNSString(javascript)
-                   completionHandler:nil];
+  [web_controller_.jsInjector
+      executeJavaScript:base::SysUTF16ToNSString(javascript)
+      completionHandler:nil];
 }
 
 void WebStateImpl::ExecuteJavaScript(const base::string16& javascript,
                                      JavaScriptResultCallback callback) {
   __block JavaScriptResultCallback stack_callback = std::move(callback);
-  [web_controller_ executeJavaScript:base::SysUTF16ToNSString(javascript)
-                   completionHandler:^(id value, NSError* error) {
-                     if (error) {
-                       DLOG(WARNING)
-                           << "Script execution has failed: "
-                           << base::SysNSStringToUTF16(
-                                  error.userInfo[NSLocalizedDescriptionKey]);
-                     }
-                     std::move(stack_callback)
-                         .Run(ValueResultFromWKResult(value).get());
-                   }];
+  [web_controller_.jsInjector
+      executeJavaScript:base::SysUTF16ToNSString(javascript)
+      completionHandler:^(id value, NSError* error) {
+        if (error) {
+          DLOG(WARNING) << "Script execution has failed: "
+                        << base::SysNSStringToUTF16(
+                               error.userInfo[NSLocalizedDescriptionKey]);
+        }
+        std::move(stack_callback).Run(ValueResultFromWKResult(value).get());
+      }];
 }
 
 void WebStateImpl::ExecuteUserJavaScript(NSString* javaScript) {
-  [web_controller_ executeUserJavaScript:javaScript completionHandler:nil];
+  [web_controller_.jsInjector executeUserJavaScript:javaScript
+                                  completionHandler:nil];
 }
 
 const std::string& WebStateImpl::GetContentsMimeType() const {
diff --git a/ios/web/web_view/BUILD.gn b/ios/web/web_view/BUILD.gn
index b5daaab..cde9709a 100644
--- a/ios/web/web_view/BUILD.gn
+++ b/ios/web/web_view/BUILD.gn
@@ -16,3 +16,18 @@
 
   configs += [ "//build/config/compiler:enable_arc" ]
 }
+
+source_set("unittests") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  deps = [
+    ":web_view",
+    "//base",
+    "//base/test:test_support",
+    "//testing/gtest",
+  ]
+
+  sources = [
+    "wk_web_view_util_unittest.mm",
+  ]
+}
diff --git a/ios/web/web_view/wk_web_view_util_unittest.mm b/ios/web/web_view/wk_web_view_util_unittest.mm
new file mode 100644
index 0000000..4bfdb19
--- /dev/null
+++ b/ios/web/web_view/wk_web_view_util_unittest.mm
@@ -0,0 +1,56 @@
+// 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.
+
+#import "ios/web/web_view/wk_web_view_util.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface WKPreferences (Private)
+
+@property(nonatomic,
+          getter=_isSafeBrowsingEnabled,
+          setter=_setSafeBrowsingEnabled:) BOOL _safeBrowsingEnabled;
+
+@end
+
+@interface WKWebView (Private)
+
+- (void)_showSafeBrowsingWarningWithURL:(NSURL*)url
+                                  title:(NSString*)title
+                                warning:(NSString*)warning
+                                details:(NSAttributedString*)details
+                      completionHandler:(void (^)(BOOL))completionHandler;
+@end
+
+class WKWebViewUtilTest : public PlatformTest {};
+
+// Tests that IsSafeBrowsingWarningDisplayedInWebView returns true when safe
+// browsing warning is displayed in WKWebView.
+TEST_F(WKWebViewUtilTest, TestIsSafeBrowsingWarningDisplayedInWebView) {
+  if (@available(iOS 12.2, *)) {
+    UIViewController* controller = [[UIViewController alloc] init];
+    UIApplication.sharedApplication.keyWindow.rootViewController = controller;
+    WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init];
+    WKWebView* web_view = [[WKWebView alloc] initWithFrame:CGRectZero
+                                             configuration:config];
+    [controller.view addSubview:web_view];
+
+    // Use private API of WKPreferences to enable safe browsing warning.
+    [config.preferences _setSafeBrowsingEnabled:YES];
+
+    // Use private API of WKWebView to show safe browsing warning.
+    [web_view _showSafeBrowsingWarningWithURL:nil
+                                        title:nil
+                                      warning:nil
+                                      details:nil
+                            completionHandler:nil];
+
+    EXPECT_TRUE(web::IsSafeBrowsingWarningDisplayedInWebView(web_view));
+  }
+}
diff --git a/media/DEPS b/media/DEPS
index 5a96a3f..096cc14 100644
--- a/media/DEPS
+++ b/media/DEPS
@@ -5,11 +5,11 @@
   "+chromeos/audio",
   "+crypto",
   "+device/udev_linux",
-  "+device/usb/public",
   "+gpu",
   "+jni",
   "+mojo/public/cpp/bindings/callback_helpers.h",
   "+mojo/public/cpp/system/platform_handle.h",
+  "+services/device/public",
   "+services/ws/public/cpp/gpu/context_provider_command_buffer.h",
   "+skia/ext",
   "+third_party/dav1d",
diff --git a/media/gpu/linux/generic_dmabuf_video_frame_mapper.cc b/media/gpu/linux/generic_dmabuf_video_frame_mapper.cc
index def9dec..f7b59c02 100644
--- a/media/gpu/linux/generic_dmabuf_video_frame_mapper.cc
+++ b/media/gpu/linux/generic_dmabuf_video_frame_mapper.cc
@@ -109,7 +109,7 @@
 
 GenericDmaBufVideoFrameMapper::GenericDmaBufVideoFrameMapper(
     VideoPixelFormat format)
-    : format_(format) {}
+    : VideoFrameMapper(format) {}
 
 scoped_refptr<VideoFrame> GenericDmaBufVideoFrameMapper::Map(
     scoped_refptr<const VideoFrame> video_frame) const {
diff --git a/media/gpu/linux/generic_dmabuf_video_frame_mapper.h b/media/gpu/linux/generic_dmabuf_video_frame_mapper.h
index 4fe8f78..89d19411 100644
--- a/media/gpu/linux/generic_dmabuf_video_frame_mapper.h
+++ b/media/gpu/linux/generic_dmabuf_video_frame_mapper.h
@@ -25,9 +25,6 @@
  private:
   explicit GenericDmaBufVideoFrameMapper(VideoPixelFormat format);
 
-  // The pixel format of mapped VideoFrame.
-  VideoPixelFormat format_;
-
   DISALLOW_COPY_AND_ASSIGN(GenericDmaBufVideoFrameMapper);
 };
 
diff --git a/media/gpu/test/video_frame_validator.cc b/media/gpu/test/video_frame_validator.cc
index f66e050c..c8392353 100644
--- a/media/gpu/test/video_frame_validator.cc
+++ b/media/gpu/test/video_frame_validator.cc
@@ -120,7 +120,12 @@
           VideoFrameMapperFactory::CreateMapper(video_frame->format());
       LOG_ASSERT(video_frame_mapper_) << "Failed to create VideoFrameMapper";
     }
+
     validated_frame = video_frame_mapper_->Map(std::move(validated_frame));
+    if (!validated_frame) {
+      LOG(ERROR) << "Failed to map video frame";
+      return;
+    }
   }
 #endif  // defined(OS_CHROMEOS)
 
diff --git a/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
index 8e134f7..2235b37 100644
--- a/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
+++ b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
@@ -103,7 +103,7 @@
 // conversion. Either mode or profile isn't required to create the VaapiWrapper.
 VaapiDmaBufVideoFrameMapper::VaapiDmaBufVideoFrameMapper(
     VideoPixelFormat format)
-    : format_(format),
+    : VideoFrameMapper(format),
       vaapi_wrapper_(VaapiWrapper::CreateForVideoCodec(VaapiWrapper::kDecode,
                                                        H264PROFILE_MAIN,
                                                        base::DoNothing())),
diff --git a/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.h b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.h
index d39b5ac5..0f1efc5 100644
--- a/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.h
+++ b/media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.h
@@ -32,9 +32,6 @@
  private:
   explicit VaapiDmaBufVideoFrameMapper(VideoPixelFormat format);
 
-  // The pixel format of mapped VideoFrame.
-  VideoPixelFormat format_;
-
   // Vaapi components for mapping.
   const scoped_refptr<VaapiWrapper> vaapi_wrapper_;
   const std::unique_ptr<VaapiPictureFactory> vaapi_picture_factory_;
diff --git a/media/gpu/video_frame_mapper.h b/media/gpu/video_frame_mapper.h
index 9ba8c051..9dcffc73 100644
--- a/media/gpu/video_frame_mapper.h
+++ b/media/gpu/video_frame_mapper.h
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "media/base/video_frame.h"
+#include "media/base/video_types.h"
 #include "media/gpu/media_gpu_export.h"
 
 namespace media {
@@ -24,8 +25,15 @@
   virtual scoped_refptr<VideoFrame> Map(
       scoped_refptr<const VideoFrame> video_frame) const = 0;
 
+  // Returns the allowed pixel format of video frames on Map().
+  VideoPixelFormat pixel_format() const { return format_; }
+
  protected:
-  VideoFrameMapper() = default;
+  explicit VideoFrameMapper(VideoPixelFormat format) : format_(format) {}
+
+  // The allowed pixel format of video frames on Map().
+  VideoPixelFormat format_;
+
   DISALLOW_COPY_AND_ASSIGN(VideoFrameMapper);
 };
 
diff --git a/media/midi/BUILD.gn b/media/midi/BUILD.gn
index 36dfc9ea..8e72395 100644
--- a/media/midi/BUILD.gn
+++ b/media/midi/BUILD.gn
@@ -137,7 +137,7 @@
   }
 
   if (is_win) {
-    deps += [ "//device/usb/public/cpp" ]
+    deps += [ "//services/device/public/cpp/usb" ]
     sources += [
       "midi_manager_win.cc",
       "midi_manager_win.h",
diff --git a/media/midi/midi_manager_win.cc b/media/midi/midi_manager_win.cc
index 3095128..5215411 100644
--- a/media/midi/midi_manager_win.cc
+++ b/media/midi/midi_manager_win.cc
@@ -29,12 +29,12 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/win/windows_version.h"
-#include "device/usb/public/cpp/usb_ids.h"
 #include "media/midi/message_util.h"
 #include "media/midi/midi_manager_winrt.h"
 #include "media/midi/midi_service.h"
 #include "media/midi/midi_service.mojom.h"
 #include "media/midi/midi_switches.h"
+#include "services/device/public/cpp/usb/usb_ids.h"
 
 namespace midi {
 
diff --git a/net/BUILD.gn b/net/BUILD.gn
index f11f8f2..98662801 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -3122,8 +3122,6 @@
 
   source_set("epoll_quic_tools") {
     sources = [
-      "quic/platform/impl/quic_default_proof_providers_impl.cc",
-      "quic/platform/impl/quic_default_proof_providers_impl.h",
       "quic/platform/impl/quic_epoll_clock.cc",
       "quic/platform/impl/quic_epoll_clock.h",
       "quic/platform/impl/quic_linux_socket_utils.cc",
@@ -3131,7 +3129,6 @@
       "quic/platform/impl/quic_socket_utils.cc",
       "quic/platform/impl/quic_socket_utils.h",
       "quic/platform/impl/quic_stream_buffer_allocator_impl.h",
-      "quic/platform/impl/quic_system_event_loop_impl.h",
       "third_party/quiche/src/quic/core/quic_default_packet_writer.cc",
       "third_party/quiche/src/quic/core/quic_default_packet_writer.h",
       "third_party/quiche/src/quic/core/quic_epoll_alarm_factory.cc",
@@ -3140,10 +3137,8 @@
       "third_party/quiche/src/quic/core/quic_epoll_connection_helper.h",
       "third_party/quiche/src/quic/core/quic_packet_reader.cc",
       "third_party/quiche/src/quic/core/quic_packet_reader.h",
-      "third_party/quiche/src/quic/platform/api/quic_default_proof_providers.h",
       "third_party/quiche/src/quic/platform/api/quic_epoll.h",
       "third_party/quiche/src/quic/platform/api/quic_stream_buffer_allocator.h",
-      "third_party/quiche/src/quic/platform/api/quic_system_event_loop.h",
       "third_party/quiche/src/quic/tools/quic_client.cc",
       "third_party/quiche/src/quic/tools/quic_client.h",
       "third_party/quiche/src/quic/tools/quic_client_epoll_network_helper.cc",
@@ -3166,6 +3161,10 @@
   executable("epoll_quic_client") {
     sources = [
       "third_party/quiche/src/quic/tools/quic_client_bin.cc",
+      "third_party/quiche/src/quic/tools/quic_epoll_client_factory.cc",
+      "third_party/quiche/src/quic/tools/quic_epoll_client_factory.h",
+      "third_party/quiche/src/quic/tools/quic_toy_client.cc",
+      "third_party/quiche/src/quic/tools/quic_toy_client.h",
     ]
     deps = [
       ":epoll_quic_tools",
@@ -3180,6 +3179,8 @@
   executable("epoll_quic_server") {
     sources = [
       "third_party/quiche/src/quic/tools/quic_server_bin.cc",
+      "third_party/quiche/src/quic/tools/quic_toy_server.cc",
+      "third_party/quiche/src/quic/tools/quic_toy_server.h",
     ]
     deps = [
       ":epoll_quic_tools",
@@ -3466,6 +3467,9 @@
 
 source_set("simple_quic_tools") {
   sources = [
+    "quic/platform/impl/quic_default_proof_providers_impl.cc",
+    "quic/platform/impl/quic_default_proof_providers_impl.h",
+    "quic/platform/impl/quic_system_event_loop_impl.h",
     "third_party/quiche/src/quic/core/chlo_extractor.cc",
     "third_party/quiche/src/quic/core/chlo_extractor.h",
     "third_party/quiche/src/quic/core/http/quic_spdy_client_session.cc",
@@ -3483,6 +3487,8 @@
     "third_party/quiche/src/quic/core/quic_time_wait_list_manager.h",
     "third_party/quiche/src/quic/core/stateless_rejector.cc",
     "third_party/quiche/src/quic/core/stateless_rejector.h",
+    "third_party/quiche/src/quic/platform/api/quic_default_proof_providers.h",
+    "third_party/quiche/src/quic/platform/api/quic_system_event_loop.h",
     "third_party/quiche/src/quic/tools/quic_backend_response.cc",
     "third_party/quiche/src/quic/tools/quic_backend_response.h",
     "third_party/quiche/src/quic/tools/quic_client_base.cc",
@@ -3504,6 +3510,7 @@
     "third_party/quiche/src/quic/tools/quic_simple_server_stream.h",
     "third_party/quiche/src/quic/tools/quic_spdy_client_base.cc",
     "third_party/quiche/src/quic/tools/quic_spdy_client_base.h",
+    "third_party/quiche/src/quic/tools/quic_spdy_server_base.h",
     "third_party/quiche/src/quic/tools/quic_url.cc",
     "third_party/quiche/src/quic/tools/quic_url.h",
     "tools/quic/quic_client_message_loop_network_helper.cc",
@@ -3535,6 +3542,8 @@
 if (!is_ios) {
   executable("quic_client") {
     sources = [
+      "third_party/quiche/src/quic/tools/quic_toy_client.cc",
+      "third_party/quiche/src/quic/tools/quic_toy_client.h",
       "tools/quic/quic_simple_client_bin.cc",
     ]
     deps = [
diff --git a/net/base/network_change_notifier_fuchsia.cc b/net/base/network_change_notifier_fuchsia.cc
index 0b66a09..2e802ca 100644
--- a/net/base/network_change_notifier_fuchsia.cc
+++ b/net/base/network_change_notifier_fuchsia.cc
@@ -29,9 +29,25 @@
 NetworkChangeNotifierFuchsia::NetworkChangeNotifierFuchsia(
     fuchsia::netstack::NetstackPtr netstack,
     uint32_t required_features)
-    : required_features_(required_features), netstack_(std::move(netstack)) {
-  DCHECK(netstack_);
+    : required_features_(required_features) {
+  DCHECK(netstack);
 
+  // Temporarily re-wrap our Netstack channel so we can query the interfaces
+  // and routing table synchronously to populate the initial state.
+  fuchsia::netstack::NetstackSyncPtr sync_netstack;
+  sync_netstack.Bind(netstack.Unbind());
+
+  // Manually fetch the interfaces and routes.
+  std::vector<fuchsia::netstack::NetInterface> interfaces;
+  zx_status_t status = sync_netstack->GetInterfaces(&interfaces);
+  ZX_CHECK(status == ZX_OK, status) << "synchronous GetInterfaces()";
+  std::vector<fuchsia::netstack::RouteTableEntry> routes;
+  status = sync_netstack->GetRouteTable(&routes);
+  ZX_CHECK(status == ZX_OK, status) << "synchronous GetInterfaces()";
+  OnRouteTableReceived(std::move(interfaces), std::move(routes), false);
+
+  // Re-wrap Netstack back into an asynchronous pointer.
+  netstack_.Bind(sync_netstack.Unbind());
   netstack_.set_error_handler([](zx_status_t status) {
     // TODO(https://crbug.com/901092): Unit tests that use NetworkService are
     // crashing because NetworkService does not clean up properly, and the
@@ -41,11 +57,6 @@
   });
   netstack_.events().OnInterfacesChanged = fit::bind_member(
       this, &NetworkChangeNotifierFuchsia::ProcessInterfaceList);
-
-  // Manually fetch the interface list, on which to base an initial
-  // ConnectionType.
-  netstack_->GetInterfaces(fit::bind_member(
-      this, &NetworkChangeNotifierFuchsia::ProcessInterfaceList));
 }
 
 NetworkChangeNotifierFuchsia::~NetworkChangeNotifierFuchsia() {
@@ -64,13 +75,15 @@
   netstack_->GetRouteTable(
       [this, interfaces = std::move(interfaces)](
           std::vector<fuchsia::netstack::RouteTableEntry> route_table) mutable {
-        OnRouteTableReceived(std::move(interfaces), std::move(route_table));
+        OnRouteTableReceived(std::move(interfaces), std::move(route_table),
+                             true);
       });
 }
 
 void NetworkChangeNotifierFuchsia::OnRouteTableReceived(
     std::vector<fuchsia::netstack::NetInterface> interfaces,
-    std::vector<fuchsia::netstack::RouteTableEntry> route_table) {
+    std::vector<fuchsia::netstack::RouteTableEntry> route_table,
+    bool notify_observers) {
   // Create a set of NICs that have default routes (ie 0.0.0.0).
   base::flat_set<uint32_t> default_route_ids;
   for (const auto& route : route_table) {
@@ -119,20 +132,16 @@
     }
   }
 
-  bool connection_type_changed = false;
-  if (connection_type != cached_connection_type_) {
-    base::subtle::Release_Store(&cached_connection_type_, connection_type);
-    connection_type_changed = true;
-  }
-
   if (addresses != cached_addresses_) {
     std::swap(cached_addresses_, addresses);
-    NotifyObserversOfIPAddressChange();
-    connection_type_changed = true;
+    if (notify_observers)
+      NotifyObserversOfIPAddressChange();
   }
 
-  if (connection_type_changed) {
-    NotifyObserversOfConnectionTypeChange();
+  if (connection_type != cached_connection_type_) {
+    base::subtle::Release_Store(&cached_connection_type_, connection_type);
+    if (notify_observers)
+      NotifyObserversOfConnectionTypeChange();
   }
 }
 
diff --git a/net/base/network_change_notifier_fuchsia.h b/net/base/network_change_notifier_fuchsia.h
index e1b73a0..acee7d4 100644
--- a/net/base/network_change_notifier_fuchsia.h
+++ b/net/base/network_change_notifier_fuchsia.h
@@ -27,15 +27,11 @@
   explicit NetworkChangeNotifierFuchsia(uint32_t required_features);
   ~NetworkChangeNotifierFuchsia() override;
 
+  // NetworkChangeNotifier implementation.
+  ConnectionType GetCurrentConnectionType() const override;
+
  private:
   friend class NetworkChangeNotifierFuchsiaTest;
-  FRIEND_TEST_ALL_PREFIXES(NetworkChangeNotifierFuchsiaTest,
-                           FindsInterfaceWithRequiredFeature);
-  FRIEND_TEST_ALL_PREFIXES(NetworkChangeNotifierFuchsiaTest, FoundWiFi);
-  FRIEND_TEST_ALL_PREFIXES(NetworkChangeNotifierFuchsiaTest,
-                           FoundWiFiNonDefault);
-  FRIEND_TEST_ALL_PREFIXES(NetworkChangeNotifierFuchsiaTest,
-                           IgnoresInterfaceWithMissingFeature);
 
   // For testing purposes. Receives a |netstack| pointer for easy mocking.
   // Interfaces can be filtered out by passing in |required_features|, which is
@@ -53,10 +49,8 @@
   // connection type changes are detected.
   void OnRouteTableReceived(
       std::vector<fuchsia::netstack::NetInterface> interfaces,
-      std::vector<fuchsia::netstack::RouteTableEntry> table);
-
-  // NetworkChangeNotifier implementation.
-  ConnectionType GetCurrentConnectionType() const override;
+      std::vector<fuchsia::netstack::RouteTableEntry> table,
+      bool notify_observers);
 
   // Bitmap of required features for an interface to be taken into account. The
   // features are defined in fuchsia::hardware::ethernet.
diff --git a/net/base/network_change_notifier_fuchsia_unittest.cc b/net/base/network_change_notifier_fuchsia_unittest.cc
index a68969b2..b301f08d 100644
--- a/net/base/network_change_notifier_fuchsia_unittest.cc
+++ b/net/base/network_change_notifier_fuchsia_unittest.cc
@@ -10,8 +10,11 @@
 #include <utility>
 #include <vector>
 
+#include "base/bind.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
+#include "base/threading/sequence_bound.h"
+#include "base/threading/thread.h"
 #include "net/base/ip_address.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -93,8 +96,6 @@
 }
 
 // Partial fake implementation of a Netstack.
-// GMock is not used because the methods make heavy use of move-only datatypes,
-// which aren't handled well by GMock.
 class FakeNetstack : public fuchsia::netstack::testing::Netstack_TestBase {
  public:
   explicit FakeNetstack(
@@ -115,18 +116,27 @@
 
   // Sends the accumulated |interfaces_| to the OnInterfacesChanged event.
   void NotifyInterfaces() {
+    did_work_ = true;
     binding_.events().OnInterfacesChanged(std::move(interfaces_));
     interfaces_.clear();
   }
 
-  fidl::Binding<fuchsia::netstack::Netstack>& binding() { return binding_; }
+  // Sets |*did_work_out| to |true| if any FIDL API was called since the
+  // last DidDoWork() call. This is used by the FakeNetstackAsync::Synchronize()
+  // call to determine when to stop pumping the message loops.
+  void DidDoWork(base::OnceClosure done, bool* did_work_out) {
+    *did_work_out = std::exchange(did_work_, false);
+    std::move(done).Run();
+  }
 
  private:
   void GetInterfaces(GetInterfacesCallback callback) override {
+    did_work_ = true;
     callback(std::move(interfaces_));
   }
 
   void GetRouteTable(GetRouteTableCallback callback) override {
+    did_work_ = true;
     std::vector<fuchsia::netstack::RouteTableEntry> table(2);
     table[0] = CreateRouteTableEntry(kDefaultNic, true);
     table[1] = CreateRouteTableEntry(kSecondaryNic, false);
@@ -142,13 +152,70 @@
 
   fidl::Binding<fuchsia::netstack::Netstack> binding_;
 
+  // |true| if any FIDL API was called since the last DidDoWork().
+  bool did_work_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(FakeNetstack);
 };
 
-class MockNetworkChangeObserver
-    : public NetworkChangeNotifier::NetworkChangeObserver {
+class FakeNetstackAsync {
  public:
-  MOCK_METHOD1(OnNetworkChanged, void(NetworkChangeNotifier::ConnectionType));
+  explicit FakeNetstackAsync(
+      fidl::InterfaceRequest<fuchsia::netstack::Netstack> netstack_request)
+      : thread_("Netstack Thread") {
+    base::Thread::Options options(base::MessageLoop::TYPE_IO, 0);
+    CHECK(thread_.StartWithOptions(options));
+    netstack_ = base::SequenceBound<FakeNetstack>(thread_.task_runner(),
+                                                  std::move(netstack_request));
+  }
+  ~FakeNetstackAsync() = default;
+
+  // Asynchronously update the state of the netstack.
+  void PushInterface(fuchsia::netstack::NetInterface&& interface) {
+    netstack_.Post(FROM_HERE, &FakeNetstack::PushInterface,
+                   std::move(interface));
+  }
+  void PushRouteTableEntry(fuchsia::netstack::RouteTableEntry&& route) {
+    netstack_.Post(FROM_HERE, &FakeNetstack::PushRouteTableEntry,
+                   std::move(route));
+  }
+  void NotifyInterfaces() {
+    netstack_.Post(FROM_HERE, &FakeNetstack::NotifyInterfaces);
+  }
+
+  // Pump the test main and Netstack loops until things stabilize.
+  void Synchronize() {
+    // Ensure that pending Push*() and Notify*() calls were processed.
+    thread_.FlushForTesting();
+
+    // Spin the Netstack until it stops receiving FIDL calls.
+    bool did_work = false;
+    do {
+      base::RunLoop loop;
+      did_work = false;
+      netstack_.Post(FROM_HERE, &FakeNetstack::DidDoWork,
+                     loop.QuitWhenIdleClosure(), &did_work);
+      loop.Run();
+    } while (did_work);
+  }
+
+ private:
+  base::Thread thread_;
+  base::SequenceBound<FakeNetstack> netstack_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeNetstackAsync);
+};
+
+class MockConnectionTypeObserver
+    : public NetworkChangeNotifier::ConnectionTypeObserver {
+ public:
+  MOCK_METHOD1(OnConnectionTypeChanged,
+               void(NetworkChangeNotifier::ConnectionType));
+};
+
+class MockIPAddressObserver : public NetworkChangeNotifier::IPAddressObserver {
+ public:
+  MOCK_METHOD0(OnIPAddressChanged, void());
 };
 
 }  // namespace
@@ -156,37 +223,40 @@
 class NetworkChangeNotifierFuchsiaTest : public testing::Test {
  public:
   NetworkChangeNotifierFuchsiaTest() : netstack_(netstack_ptr_.NewRequest()) {}
-
-  ~NetworkChangeNotifierFuchsiaTest() override {}
+  ~NetworkChangeNotifierFuchsiaTest() override = default;
 
   // Creates a NetworkChangeNotifier and spins the MessageLoop to allow it to
   // populate from the list of interfaces which have already been added to
   // |netstack_|. |observer_| is registered last, so that tests need only
   // express expectations on changes they make themselves.
   void CreateNotifier(uint32_t required_features = 0) {
+    // Ensure that the Netstack internal state is up-to-date before the
+    // notifier queries it.
+    netstack_.Synchronize();
+
     notifier_.reset(new NetworkChangeNotifierFuchsia(std::move(netstack_ptr_),
                                                      required_features));
 
-    // RunUntilIdle() is sufficient to populate the notifier from |netstack_|,
-    // since our fake netstack runs on the same MessageLoop.
-    ASSERT_EQ(notifier_->GetConnectionType(),
-              NetworkChangeNotifier::CONNECTION_UNKNOWN);
-    base::RunLoop().RunUntilIdle();
-
-    NetworkChangeNotifier::AddNetworkChangeObserver(&observer_);
+    NetworkChangeNotifier::AddConnectionTypeObserver(&observer_);
+    NetworkChangeNotifier::AddIPAddressObserver(&ip_observer_);
   }
 
   void TearDown() override {
+    // Spin the loops to catch any unintended notifications.
+    netstack_.Synchronize();
+
     if (notifier_) {
-      NetworkChangeNotifier::RemoveNetworkChangeObserver(&observer_);
+      NetworkChangeNotifier::RemoveConnectionTypeObserver(&observer_);
+      NetworkChangeNotifier::RemoveIPAddressObserver(&ip_observer_);
     }
   }
 
  protected:
   base::MessageLoopForIO message_loop_;
-  testing::StrictMock<MockNetworkChangeObserver> observer_;
+  testing::StrictMock<MockConnectionTypeObserver> observer_;
+  testing::StrictMock<MockIPAddressObserver> ip_observer_;
   fuchsia::netstack::NetstackPtr netstack_ptr_;
-  FakeNetstack netstack_;
+  FakeNetstackAsync netstack_;
 
   // Allows us to allocate our own NetworkChangeNotifier for unit testing.
   NetworkChangeNotifier::DisableForTest disable_for_test_;
@@ -198,6 +268,12 @@
   DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierFuchsiaTest);
 };
 
+TEST_F(NetworkChangeNotifierFuchsiaTest, InitialState) {
+  CreateNotifier();
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_NONE,
+            notifier_->GetCurrentConnectionType());
+}
+
 TEST_F(NetworkChangeNotifierFuchsiaTest, NoChange) {
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
@@ -206,7 +282,8 @@
   netstack_.PushRouteTableEntry(CreateRouteTableEntry(kDefaultNic, true));
 
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
+            notifier_->GetCurrentConnectionType());
 
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
@@ -214,7 +291,6 @@
                          CreateIPv4Address(255, 255, 255, 0), {}));
   netstack_.PushRouteTableEntry(CreateRouteTableEntry(kDefaultNic, true));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, NoChangeV6) {
@@ -223,14 +299,12 @@
                          CreateIPv6Address({0xfe, 0x80, 0x01}),
                          CreateIPv6Address({0xfe, 0x80}), {}));
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv6Address({0xfe, 0x80, 0x01}),
                          CreateIPv6Address({0xfe, 0x80}), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, MultiInterfaceNoChange) {
@@ -243,7 +317,6 @@
                          0, CreateIPv4Address(169, 254, 0, 2),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
@@ -254,7 +327,6 @@
                          0, CreateIPv4Address(169, 254, 0, 3),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, MultiV6IPNoChange) {
@@ -264,8 +336,8 @@
       kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
       CreateIPv4Address(169, 254, 0, 1), CreateIPv4Address(255, 255, 255, 0),
       std::move(addresses)));
+
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
   addresses.push_back(CreateSubnet({0xfe, 0x80, 0x01}, 2));
   netstack_.PushInterface(CreateNetInterface(
@@ -273,83 +345,78 @@
       CreateIPv4Address(169, 254, 0, 1), CreateIPv4Address(255, 255, 255, 0),
       std::move(addresses)));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, IpChange) {
+  EXPECT_CALL(ip_observer_, OnIPAddressChanged());
+
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_UNKNOWN));
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
+            notifier_->GetCurrentConnectionType());
+
   netstack_.PushInterface(CreateNetInterface(
       kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
       CreateIPv4Address(10, 0, 0, 1), CreateIPv4Address(255, 255, 0, 0), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, IpChangeV6) {
+  EXPECT_CALL(ip_observer_, OnIPAddressChanged());
+
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv6Address({0xfe, 0x80, 0x01}),
                          CreateIPv6Address({0xfe, 0x80}), {}));
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
+            notifier_->GetCurrentConnectionType());
 
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_UNKNOWN));
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv6Address({0xfe, 0x80, 0x02}),
                          CreateIPv6Address({0xfe, 0x80}), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, MultiV6IPChanged) {
+  EXPECT_CALL(ip_observer_, OnIPAddressChanged());
+
   std::vector<fuchsia::net::Subnet> addresses;
   addresses.push_back(CreateSubnet({0xfe, 0x80, 0x01}, 2));
   netstack_.PushInterface(CreateNetInterface(
       kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
       CreateIPv4Address(169, 254, 0, 1), CreateIPv4Address(255, 255, 255, 0),
       std::move(addresses)));
-  CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_UNKNOWN));
+  CreateNotifier();
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
+            notifier_->GetCurrentConnectionType());
+
   addresses.push_back(CreateSubnet({0xfe, 0x80, 0x02}, 2));
   netstack_.PushInterface(CreateNetInterface(
       kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
       CreateIPv4Address(10, 0, 0, 1), CreateIPv4Address(255, 255, 0, 0),
       std::move(addresses)));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, Ipv6AdditionalIpChange) {
+  EXPECT_CALL(ip_observer_, OnIPAddressChanged());
+
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
-  CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_UNKNOWN));
+  CreateNotifier();
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
+            notifier_->GetCurrentConnectionType());
+
   std::vector<fuchsia::net::Subnet> addresses;
   addresses.push_back(CreateSubnet({0xfe, 0x80, 0x01}, 2));
   netstack_.PushInterface(CreateNetInterface(
@@ -357,75 +424,82 @@
       CreateIPv4Address(169, 254, 0, 1), CreateIPv4Address(255, 255, 255, 0),
       std::move(addresses)));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, InterfaceDown) {
+  EXPECT_CALL(ip_observer_, OnIPAddressChanged());
+  EXPECT_CALL(observer_,
+              OnConnectionTypeChanged(NetworkChangeNotifier::CONNECTION_NONE));
+
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
-  CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
+  CreateNotifier();
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
+            notifier_->GetCurrentConnectionType());
+
   netstack_.PushInterface(
       CreateNetInterface(1, 0, 0, CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 0, 0), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, InterfaceUp) {
+  EXPECT_CALL(ip_observer_, OnIPAddressChanged());
+  EXPECT_CALL(observer_, OnConnectionTypeChanged(
+                             NetworkChangeNotifier::CONNECTION_UNKNOWN));
+
   netstack_.PushInterface(
       CreateNetInterface(1, 0, 0, CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
-  CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_UNKNOWN));
+  CreateNotifier();
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_NONE,
+            notifier_->GetCurrentConnectionType());
+
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 0, 0), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, InterfaceDeleted) {
+  EXPECT_CALL(ip_observer_, OnIPAddressChanged());
+  EXPECT_CALL(observer_,
+              OnConnectionTypeChanged(NetworkChangeNotifier::CONNECTION_NONE));
+
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
+            notifier_->GetCurrentConnectionType());
 
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
+  // NotifyInterfaces() with no new PushInterfaces() means removing everything.
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, InterfaceAdded) {
+  EXPECT_CALL(ip_observer_, OnIPAddressChanged());
+  EXPECT_CALL(observer_,
+              OnConnectionTypeChanged(NetworkChangeNotifier::CONNECTION_WIFI));
+
   // Initial interface list is intentionally left empty.
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
-  EXPECT_CALL(observer_,
-              OnNetworkChanged(NetworkChangeNotifier::CONNECTION_WIFI));
+  EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_NONE,
+            notifier_->GetCurrentConnectionType());
+
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp,
                          fuchsia::hardware::ethernet::INFO_FEATURE_WLAN,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, SecondaryInterfaceAddedNoop) {
@@ -434,7 +508,6 @@
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
   netstack_.PushInterface(
       CreateNetInterface(kSecondaryNic, fuchsia::netstack::NetInterfaceFlagUp,
@@ -445,7 +518,6 @@
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, SecondaryInterfaceDeletedNoop) {
@@ -458,14 +530,12 @@
                          0, CreateIPv4Address(169, 254, 0, 2),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   CreateNotifier();
-  base::RunLoop().RunUntilIdle();
 
   netstack_.PushInterface(
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
   netstack_.NotifyInterfaces();
-  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, FoundWiFi) {
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 088895ad..3bff221 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -138,7 +138,7 @@
       http_09_on_non_default_ports_enabled(false),
       disable_idle_sockets_close_on_memory_pressure(false) {
   quic_supported_versions.push_back(quic::ParsedQuicVersion(
-      quic::PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_43));
+      quic::PROTOCOL_QUIC_CRYPTO, quic::QUIC_VERSION_46));
   enable_early_data =
       base::FeatureList::IsEnabled(features::kEnableTLS13EarlyData);
 }
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc
index 8673b83..59762bc 100644
--- a/net/http/http_server_properties_manager_unittest.cc
+++ b/net/http/http_server_properties_manager_unittest.cc
@@ -1504,7 +1504,7 @@
       "\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\","
       "\"port\":1234,\"protocol_str\":\"h2\"}]}},"
       "{\"https://mail.google.com:80\":{\"alternative_service\":[{"
-      "\"advertised_versions\":[43],\"expiration\":\"9223372036854775807\","
+      "\"advertised_versions\":[46],\"expiration\":\"9223372036854775807\","
       "\"host\":\"foo.google.com\",\"port\":444,\"protocol_str\":\"quic\"}],"
       "\"network_stats\":{\"srtt\":42}}}],\"supports_quic\":{"
       "\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
@@ -1606,7 +1606,7 @@
       "{\"quic_servers\":{\"https://mail.google.com:80\":"
       "{\"server_info\":\"quic_server_info1\"}},\"servers\":["
       "{\"https://www.google.com:80\":"
-      "{\"alternative_service\":[{\"advertised_versions\":[43],"
+      "{\"alternative_service\":[{\"advertised_versions\":[46],"
       "\"expiration\":\"13756212000000000\",\"port\":443,"
       "\"protocol_str\":\"quic\"}]}}],\"supports_quic\":"
       "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
diff --git a/net/log/net_log_capture_mode.cc b/net/log/net_log_capture_mode.cc
index a8914d4..a2ff3c1 100644
--- a/net/log/net_log_capture_mode.cc
+++ b/net/log/net_log_capture_mode.cc
@@ -6,6 +6,9 @@
 
 #include <algorithm>
 
+#include "base/command_line.h"
+#include "base/strings/string_piece.h"
+
 namespace net {
 
 namespace {
@@ -64,4 +67,23 @@
 NetLogCaptureMode::NetLogCaptureMode(uint32_t value) : value_(value) {
 }
 
+NetLogCaptureMode GetNetCaptureModeFromCommandLine(
+    const base::CommandLine& command_line,
+    base::StringPiece switch_name) {
+  if (command_line.HasSwitch(switch_name)) {
+    std::string value = command_line.GetSwitchValueASCII(switch_name);
+
+    if (value == "Default")
+      return NetLogCaptureMode::Default();
+    if (value == "IncludeCookiesAndCredentials")
+      return NetLogCaptureMode::IncludeCookiesAndCredentials();
+    if (value == "IncludeSocketBytes")
+      return NetLogCaptureMode::IncludeSocketBytes();
+
+    LOG(ERROR) << "Unrecognized value for --" << switch_name;
+  }
+
+  return net::NetLogCaptureMode::Default();
+}
+
 }  // namespace net
diff --git a/net/log/net_log_capture_mode.h b/net/log/net_log_capture_mode.h
index a2555d6..470a00c 100644
--- a/net/log/net_log_capture_mode.h
+++ b/net/log/net_log_capture_mode.h
@@ -9,8 +9,13 @@
 
 #include <string>
 
+#include "base/strings/string_piece_forward.h"
 #include "net/base/net_export.h"
 
+namespace base {
+class CommandLine;
+}
+
 namespace net {
 
 // NetLogCaptureMode specifies the granularity of events that should be emitted
@@ -59,6 +64,11 @@
   int32_t value_;
 };
 
+// Parses a NetLogCaptureMode given an optional command-line switch.
+NET_EXPORT NetLogCaptureMode
+GetNetCaptureModeFromCommandLine(const base::CommandLine& command_line,
+                                 base::StringPiece switch_name);
+
 }  // namespace net
 
 #endif  // NET_LOG_NET_LOG_CAPTURE_MODE_H_
diff --git a/net/proxy_resolution/proxy_resolver_v8_tracing.cc b/net/proxy_resolution/proxy_resolver_v8_tracing.cc
index 5744166c..3f7b5e8 100644
--- a/net/proxy_resolution/proxy_resolver_v8_tracing.cc
+++ b/net/proxy_resolution/proxy_resolver_v8_tracing.cc
@@ -406,7 +406,12 @@
 
   ReleaseCallback();
 
-  pending_dns_.reset();
+  // Note we only mutate |pending_dns_| if it is non-null. If it is null, the
+  // worker thread may be about to request a new DNS resolution. This avoids a
+  // race condition with the DCHECK in PostDnsOperationAndWait().
+  // See https://crbug.com/699562.
+  if (pending_dns_)
+    pending_dns_.reset();
 
   // The worker thread might be blocked waiting for DNS.
   event_.Signal();
@@ -695,7 +700,9 @@
 bool Job::PostDnsOperationAndWait(const std::string& host,
                                   ProxyResolveDnsOperation op,
                                   bool* completed_synchronously) {
-  // Post the DNS request to the origin thread.
+  // Post the DNS request to the origin thread. It is safe to mutate
+  // |pending_dns_host_| and |pending_dns_op_| because there cannot be another
+  // DNS operation in progress or scheduled.
   DCHECK(!pending_dns_);
   pending_dns_host_ = host;
   pending_dns_op_ = op;
diff --git a/net/quic/mock_crypto_client_stream.cc b/net/quic/mock_crypto_client_stream.cc
index c1144481e..3406b2c 100644
--- a/net/quic/mock_crypto_client_stream.cc
+++ b/net/quic/mock_crypto_client_stream.cc
@@ -275,11 +275,14 @@
       QuicTime::Delta::FromSeconds(2 * kMaximumIdleTimeoutSecs),
       QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs));
   config.SetBytesForConnectionIdToSend(PACKET_8BYTE_CONNECTION_ID);
-  config.SetMaxIncomingDynamicStreamsToSend(kDefaultMaxStreamsPerConnection /
-                                            2);
+  config.SetMaxIncomingBidirectionalStreamsToSend(
+      kDefaultMaxStreamsPerConnection / 2);
+  config.SetMaxIncomingUnidirectionalStreamsToSend(
+      kDefaultMaxStreamsPerConnection / 2);
 
   CryptoHandshakeMessage msg;
-  config.ToHandshakeMessage(&msg);
+  config.ToHandshakeMessage(
+      &msg, session()->connection()->version().transport_version);
   std::string error_details;
   const QuicErrorCode error =
       session()->config()->ProcessPeerHello(msg, CLIENT, &error_details);
diff --git a/net/quic/platform/impl/quic_default_proof_providers_impl.cc b/net/quic/platform/impl/quic_default_proof_providers_impl.cc
index 4711300..d40162d 100644
--- a/net/quic/platform/impl/quic_default_proof_providers_impl.cc
+++ b/net/quic/platform/impl/quic_default_proof_providers_impl.cc
@@ -7,6 +7,8 @@
 #include <utility>
 
 #include "base/files/file_path.h"
+#include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
 #include "net/cert/cert_verifier.h"
 #include "net/cert/ct_log_verifier.h"
 #include "net/cert/ct_policy_enforcer.h"
@@ -61,8 +63,14 @@
 std::unique_ptr<ProofSource> CreateDefaultProofSourceImpl() {
   auto proof_source = std::make_unique<net::ProofSourceChromium>();
   CHECK(proof_source->Initialize(
+#if defined(OS_WIN)
+      base::FilePath(base::UTF8ToWide(GetQuicFlag(FLAGS_certificate_file))),
+      base::FilePath(base::UTF8ToWide(GetQuicFlag(FLAGS_key_file))),
+      base::FilePath()));
+#else
       base::FilePath(GetQuicFlag(FLAGS_certificate_file)),
       base::FilePath(GetQuicFlag(FLAGS_key_file)), base::FilePath()));
+#endif
   return std::move(proof_source);
 }
 
diff --git a/net/quic/platform/impl/quic_socket_address_impl.cc b/net/quic/platform/impl/quic_socket_address_impl.cc
index bc228d0..952a182 100644
--- a/net/quic/platform/impl/quic_socket_address_impl.cc
+++ b/net/quic/platform/impl/quic_socket_address_impl.cc
@@ -5,6 +5,7 @@
 #include "net/quic/platform/impl/quic_socket_address_impl.h"
 
 #include "net/base/sockaddr_storage.h"
+#include "net/quic/address_utils.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
 
 using std::string;
@@ -14,9 +15,9 @@
 QuicSocketAddressImpl::QuicSocketAddressImpl(const net::IPEndPoint& address)
     : socket_address_(address) {}
 
-QuicSocketAddressImpl::QuicSocketAddressImpl(QuicIpAddressImpl address,
+QuicSocketAddressImpl::QuicSocketAddressImpl(QuicIpAddress address,
                                              uint16_t port)
-    : socket_address_(address.ip_address(), port) {}
+    : socket_address_(net::ToIPAddress(address), port) {}
 
 QuicSocketAddressImpl::QuicSocketAddressImpl(
     const struct sockaddr_storage& saddr) {
diff --git a/net/quic/platform/impl/quic_socket_address_impl.h b/net/quic/platform/impl/quic_socket_address_impl.h
index e6d08d2..a6fa5439 100644
--- a/net/quic/platform/impl/quic_socket_address_impl.h
+++ b/net/quic/platform/impl/quic_socket_address_impl.h
@@ -6,8 +6,8 @@
 #define NET_QUIC_PLATFORM_IMPL_QUIC_SOCKET_ADDRESS_IMPL_H_
 
 #include "net/base/ip_endpoint.h"
-#include "net/quic/platform/impl/quic_ip_address_impl.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_ip_address.h"
 
 namespace quic {
 
@@ -15,7 +15,7 @@
  public:
   QuicSocketAddressImpl() = default;
   explicit QuicSocketAddressImpl(const net::IPEndPoint& addr);
-  QuicSocketAddressImpl(QuicIpAddressImpl address, uint16_t port);
+  QuicSocketAddressImpl(QuicIpAddress address, uint16_t port);
   explicit QuicSocketAddressImpl(const struct sockaddr_storage& saddr);
   explicit QuicSocketAddressImpl(const struct sockaddr& saddr);
   QuicSocketAddressImpl(const QuicSocketAddressImpl& other) = default;
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index 8c8c24c..830144a 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -216,11 +216,10 @@
     }
     // For version99, the count will include both static and dynamic streams.
     // These tests are only concerned with dynamic streams (that is, the number
-    // of streams that they can create), so back out the statics (2, one for
-    // crypto and one for headers).
+    // of streams that they can create), so back out the static header stream.
     return quic::test::QuicSessionPeer::v99_streamid_manager(quic_session)
                ->max_allowed_outgoing_bidirectional_streams() -
-           2;
+           1;
   }
 
   const quic::ParsedQuicVersion version_;
@@ -516,11 +515,9 @@
     // The open stream limit is set to 50 by
     // MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
     // requested, a STREAMS_BLOCKED will be sent, indicating that it's blocked
-    // at the limit of 50. The +2 accounts for the header and crypto streams.
-    // TODO(nharper): When stream 0 is no longer a crypto stream, change +2
-    // to +1(?)
+    // at the limit of 50. The +1 accounts for the header stream.
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                        2, true, 50 + 2,
+                                        2, true, 50 + 1,
                                         /*unidirectional=*/false));
     quic_data.AddWrite(
         SYNCHRONOUS, client_maker_.MakeRstPacket(
@@ -595,14 +592,12 @@
     // The open stream limit is set to 50 by
     // MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
     // requested, a STREAMS_BLOCKED will be sent, indicating that it's blocked
-    // at the limit of 50. The +2 accounts for the header and crypto streams.
-    // TODO(nharper): When stream 0 is no longer a crypto stream, change +2
-    // to +1(?)
+    // at the limit of 50. The +1 accounts for the header streams.
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                        2, true, 50 + 2,
+                                        2, true, 50 + 1,
                                         /*unidirectional=*/false));
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                        3, true, 50 + 2,
+                                        3, true, 50 + 1,
                                         /*unidirectional=*/false));
   }
   quic_data.AddRead(ASYNC, ERR_IO_PENDING);
@@ -661,7 +656,7 @@
     // MockCryptoClientStream::SetConfigNegotiated() so when the 51st stream is
     // requested, a STREAMS_BLOCKED will be sent.
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                        2, true, 52,
+                                        2, true, 51,
                                         /*unidirectional=*/false));
     // This node receives the RST_STREAM+STOP_SENDING, it responds
     // with only a RST_STREAM.
@@ -793,7 +788,7 @@
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
   if (version_.transport_version == quic::QUIC_VERSION_99) {
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                        2, true, 52,
+                                        2, true, 51,
                                         /*unidirectional=*/false));
   }
   quic_data.AddRead(ASYNC, ERR_IO_PENDING);
@@ -840,10 +835,10 @@
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
   if (version_.transport_version == quic::QUIC_VERSION_99) {
     // Initial configuration is 50 dynamic streams. Taking into account
-    // the two static streams (crypto and headers), expect to block on
-    // when hitting the limit of 52 streams
+    // the static stream (headers), expect to block on when hitting the limit
+    // of 51 streams
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                        2, true, 50 + 2,
+                                        2, true, 50 + 1,
                                         /*unidirectional=*/false));
     quic_data.AddWrite(
         SYNCHRONOUS, client_maker_.MakeRstPacket(
@@ -852,10 +847,10 @@
     // For the second CreateOutgoingStream that fails because of hitting the
     // stream count limit.
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                        4, true, 50 + 2,
+                                        4, true, 50 + 1,
                                         /*unidirectional=*/false));
     quic_data.AddRead(
-        ASYNC, server_maker_.MakeMaxStreamsPacket(1, true, 50 + 2 + 1,
+        ASYNC, server_maker_.MakeMaxStreamsPacket(1, true, 50 + 2,
                                                   /*unidirectional=*/false));
   } else {
     quic_data.AddWrite(
@@ -1184,7 +1179,7 @@
                      client_maker_.MakeInitialSettingsPacket(1, nullptr));
   if (version_.transport_version == quic::QUIC_VERSION_99) {
     quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                        2, true, 52,
+                                        2, true, 51,
                                         /*unidirectional=*/false));
     quic_data.AddWrite(
         SYNCHRONOUS, client_maker_.MakeRstPacket(
@@ -1206,7 +1201,6 @@
   Initialize();
   CompleteCryptoHandshake();
   const size_t kMaxOpenStreams = GetMaxAllowedOutgoingBidirectionalStreams();
-
   std::vector<QuicChromiumClientStream*> streams;
   for (size_t i = 0; i < kMaxOpenStreams; i++) {
     QuicChromiumClientStream* stream =
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc
index 79ae9d9..0e6cf422 100644
--- a/net/quic/quic_connection_logger.cc
+++ b/net/quic/quic_connection_logger.cc
@@ -810,8 +810,8 @@
     quic::QuicStreamId stream_id,
     int num_frames_received,
     int num_duplicate_frames_received) {
-  if (stream_id != quic::QuicUtils::GetCryptoStreamId(
-                       session_->connection()->transport_version())) {
+  if (!quic::QuicUtils::IsCryptoStreamId(session_->transport_version(),
+                                         stream_id)) {
     num_frames_received_ += num_frames_received;
     num_duplicate_frames_received_ += num_duplicate_frames_received;
   }
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 91298dba..542ae6b 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -106,7 +106,7 @@
 // If true, static streams in a QuicSession will be stored inside dynamic
 // stream map. static_stream_map will no longer be used.
 QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_eliminate_static_stream_map_2,
+          FLAGS_quic_reloadable_flag_quic_eliminate_static_stream_map_3,
           false)
 
 // Default enables QUIC ack decimation and adds a connection option to disable
@@ -371,3 +371,9 @@
 QUIC_FLAG(bool,
           FLAGS_quic_restart_flag_quic_no_framer_object_in_dispatcher,
           false)
+
+// When true, QuicFramer will not override connection IDs in headers and will
+// instead respect the source/destination direction as expected by IETF QUIC.
+QUIC_FLAG(bool,
+          FLAGS_quic_restart_flag_quic_do_not_override_connection_id,
+          false)
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index 6de7e444..73b3e28 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -1674,7 +1674,7 @@
   socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
   if (version_.transport_version == quic::QUIC_VERSION_99) {
     socket_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
-                                          2, true, 52,
+                                          2, true, 51,
                                           /*unidirectional=*/false));
     socket_data.AddWrite(
         SYNCHRONOUS, client_maker_.MakeRstPacket(3, true, stream_id,
@@ -1683,7 +1683,7 @@
         ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
                                            quic::QUIC_STREAM_CANCELLED));
     socket_data.AddRead(
-        ASYNC, server_maker_.MakeMaxStreamsPacket(4, true, 53,
+        ASYNC, server_maker_.MakeMaxStreamsPacket(4, true, 52,
                                                   /*unidirectional=*/false));
   } else {
     socket_data.AddWrite(
diff --git a/net/socket/unix_domain_server_socket_posix.h b/net/socket/unix_domain_server_socket_posix.h
index 8bccc06..01433e44 100644
--- a/net/socket/unix_domain_server_socket_posix.h
+++ b/net/socket/unix_domain_server_socket_posix.h
@@ -42,7 +42,7 @@
   // Callback that returns whether the already connected client, identified by
   // its credentials, is allowed to keep the connection open. Note that
   // the socket is closed immediately in case the callback returns false.
-  typedef base::Callback<bool (const Credentials&)> AuthCallback;
+  using AuthCallback = base::RepeatingCallback<bool(const Credentials&)>;
 
   UnixDomainServerSocket(const AuthCallback& auth_callack,
                          bool use_abstract_namespace);
diff --git a/net/tools/quic/quic_simple_client_bin.cc b/net/tools/quic/quic_simple_client_bin.cc
index 928926c..125ccc0 100644
--- a/net/tools/quic/quic_simple_client_bin.cc
+++ b/net/tools/quic/quic_simple_client_bin.cc
@@ -56,7 +56,9 @@
 #include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_system_event_loop.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
+#include "net/third_party/quiche/src/quic/tools/quic_toy_client.h"
 #include "net/third_party/quiche/src/spdy/core/spdy_header_block.h"
 #include "net/tools/quic/quic_simple_client.h"
 #include "net/tools/quic/synchronous_host_resolver.h"
@@ -75,347 +77,58 @@
 using std::cerr;
 using std::endl;
 
-// The IP or hostname the quic client will connect to.
-std::string FLAGS_host = "";
-// The port to connect to.
-int32_t FLAGS_port = 0;
-// If set, send a POST with this body.
-std::string FLAGS_body = "";
-// If set, contents are converted from hex to ascii, before sending as body of
-// a POST. e.g. --body_hex=\"68656c6c6f\"
-std::string FLAGS_body_hex = "";
-// A semicolon separated list of key:value pairs to add to request headers.
-std::string FLAGS_headers = "";
-// Set to true for a quieter output experience.
-bool FLAGS_quiet = false;
-// QUIC version to speak, e.g. "21". If not set, then all available versions are
-// offered in the handshake. The version label (e.g. "T099") can also be used.
-std::string FLAGS_quic_version = "";
-// QUIC IETF draft number to use over the wire.
-int32_t FLAGS_quic_ietf_draft = 0;
-// If true, a version mismatch in the handshake is not considered a failure.
-// Useful for probing a server to determine if it speaks any version of QUIC.
-bool FLAGS_version_mismatch_ok = false;
-// If true, start by proposing a version that is reserved for version
-// negotiation.
-bool FLAGS_force_version_negotiation = false;
-// If true, an HTTP response code of 3xx is considered to be a successful
-// response, otherwise a failure.
-bool FLAGS_redirect_is_success = true;
-// Initial MTU of the connection.
-int32_t FLAGS_initial_mtu = 0;
+namespace {
 
-class FakeProofVerifier : public quic::ProofVerifier {
+class QuicSimpleClientFactory : public quic::QuicToyClient::ClientFactory {
  public:
-  quic::QuicAsyncStatus VerifyProof(
-      const std::string& hostname,
-      const uint16_t port,
-      const std::string& server_config,
-      quic::QuicTransportVersion quic_version,
-      quic::QuicStringPiece chlo_hash,
-      const std::vector<std::string>& certs,
-      const std::string& cert_sct,
-      const std::string& signature,
-      const quic::ProofVerifyContext* context,
-      std::string* error_details,
-      std::unique_ptr<quic::ProofVerifyDetails>* details,
-      std::unique_ptr<quic::ProofVerifierCallback> callback) override {
-    return quic::QUIC_SUCCESS;
-  }
-
-  quic::QuicAsyncStatus VerifyCertChain(
-      const std::string& hostname,
-      const std::vector<std::string>& certs,
-      const std::string& ocsp_response,
-      const std::string& cert_sct,
-      const quic::ProofVerifyContext* verify_context,
-      std::string* error_details,
-      std::unique_ptr<quic::ProofVerifyDetails>* verify_details,
-      std::unique_ptr<quic::ProofVerifierCallback> callback) override {
-    return quic::QUIC_SUCCESS;
-  }
-
-  std::unique_ptr<quic::ProofVerifyContext> CreateDefaultContext() override {
-    return nullptr;
-  }
-};
-
-int main(int argc, char* argv[]) {
-  base::CommandLine::Init(argc, argv);
-  base::CommandLine* line = base::CommandLine::ForCurrentProcess();
-  const base::CommandLine::StringVector& urls = line->GetArgs();
-  base::ThreadPool::CreateAndStartWithDefaultParams("quic_client");
-
-  logging::LoggingSettings settings;
-  settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
-  CHECK(logging::InitLogging(settings));
-
-  if (line->HasSwitch("h") || line->HasSwitch("help") || urls.empty()) {
-    const char* help_str =
-        "Usage: quic_client [options] <url>\n"
-        "\n"
-        "<url> with scheme must be provided (e.g. http://www.google.com)\n\n"
-        "Options:\n"
-        "-h, --help                  show this help message and exit\n"
-        "--host=<host>               specify the IP address of the hostname to "
-        "connect to\n"
-        "--port=<port>               specify the port to connect to\n"
-        "--body=<body>               specify the body to post\n"
-        "--body_hex=<body_hex>       specify the body_hex to be printed out\n"
-        "--headers=<headers>         specify a semicolon separated list of "
-        "key:value pairs to add to request headers\n"
-        "--quiet                     specify for a quieter output experience\n"
-        "--quic_version=<quic version> specify QUIC version to speak "
-        "(e.g. 43, Q046 or T099).\n"
-        "--quic_ietf_draft=<draft> specify which QUIC IETF draft number to use "
-        "over the wire, e.g. 18. By default this sets quic_version to T099. "
-        "This also enables required internal QUIC flags.\n"
-        "--version_mismatch_ok       if specified a version mismatch in the "
-        "handshake is not considered a failure\n"
-        "--force_version_negotiation if specified start by proposing a version "
-        "that is reserved for version negotiation\n"
-        "--redirect_is_success       if specified an HTTP response code of 3xx "
-        "is considered to be a successful response, otherwise a failure\n"
-        "--initial_mtu=<initial_mtu> specify the initial MTU of the connection"
-        "\n"
-        "--disable_certificate_verification do not verify certificates\n";
-    cout << help_str;
-    exit(0);
-  }
-  if (line->HasSwitch("host")) {
-    FLAGS_host = line->GetSwitchValueASCII("host");
-  }
-  if (line->HasSwitch("port")) {
-    if (!base::StringToInt(line->GetSwitchValueASCII("port"), &FLAGS_port)) {
-      std::cerr << "--port must be an integer\n";
-      return 1;
-    }
-  }
-  if (line->HasSwitch("body")) {
-    FLAGS_body = line->GetSwitchValueASCII("body");
-  }
-  if (line->HasSwitch("body_hex")) {
-    FLAGS_body_hex = line->GetSwitchValueASCII("body_hex");
-  }
-  if (line->HasSwitch("headers")) {
-    FLAGS_headers = line->GetSwitchValueASCII("headers");
-  }
-  if (line->HasSwitch("quiet")) {
-    FLAGS_quiet = true;
-  }
-  if (line->HasSwitch("quic_version")) {
-    FLAGS_quic_version = line->GetSwitchValueASCII("quic_version");
-  }
-  if (line->HasSwitch("quic_ietf_draft")) {
-    if (!base::StringToInt(line->GetSwitchValueASCII("quic_ietf_draft"),
-                           &FLAGS_quic_ietf_draft)) {
-      std::cerr << "--quic_ietf_draft must be an integer\n";
-      return 1;
-    }
-  }
-  if (line->HasSwitch("version_mismatch_ok")) {
-    FLAGS_version_mismatch_ok = true;
-  }
-  if (line->HasSwitch("force_version_negotiation")) {
-    FLAGS_force_version_negotiation = true;
-  }
-  if (line->HasSwitch("redirect_is_success")) {
-    FLAGS_redirect_is_success = true;
-  }
-  if (line->HasSwitch("initial_mtu")) {
-    if (!base::StringToInt(line->GetSwitchValueASCII("initial_mtu"),
-                           &FLAGS_initial_mtu)) {
-      std::cerr << "--initial_mtu must be an integer\n";
-      return 1;
-    }
-  }
-
-  VLOG(1) << "server host: " << FLAGS_host << " port: " << FLAGS_port
-          << " body: " << FLAGS_body << " headers: " << FLAGS_headers
-          << " quiet: " << FLAGS_quiet
-          << " quic_version: " << FLAGS_quic_version
-          << " quic_ietf_draft: " << FLAGS_quic_ietf_draft
-          << " version_mismatch_ok: " << FLAGS_version_mismatch_ok
-          << " force_version_negotiation: " << FLAGS_force_version_negotiation
-          << " redirect_is_success: " << FLAGS_redirect_is_success
-          << " initial_mtu: " << FLAGS_initial_mtu;
-
-  base::AtExitManager exit_manager;
-  base::MessageLoopForIO message_loop;
-
-  // Determine IP address to connect to from supplied hostname.
-  quic::QuicIpAddress ip_addr;
-
-  GURL url(urls[0]);
-  std::string host = FLAGS_host;
-  if (host.empty()) {
-    host = url.host();
-  }
-  int port = FLAGS_port;
-  if (port == 0) {
-    port = url.EffectiveIntPort();
-  }
-  if (!ip_addr.FromString(host)) {
+  std::unique_ptr<quic::QuicSpdyClientBase> CreateClient(
+      std::string host,
+      uint16_t port,
+      quic::ParsedQuicVersionVector versions,
+      std::unique_ptr<quic::ProofVerifier> verifier) override {
     net::AddressList addresses;
     int rv = net::SynchronousHostResolver::Resolve(host, &addresses);
     if (rv != net::OK) {
       LOG(ERROR) << "Unable to resolve '" << host
                  << "' : " << net::ErrorToShortString(rv);
-      return 1;
+      return nullptr;
     }
-    ip_addr =
-        quic::QuicIpAddress(quic::QuicIpAddressImpl(addresses[0].address()));
-  }
-
-  std::string host_port = quic::QuicStrCat(ip_addr.ToString(), ":", port);
-  VLOG(1) << "Resolved " << host << " to " << host_port << endl;
-
-  // Build the client, and try to connect.
-  quic::QuicServerId server_id(url.host(), url.EffectiveIntPort(),
-                               net::PRIVACY_MODE_DISABLED);
-
-  // Select QUIC version to use.
-  quic::ParsedQuicVersionVector versions = quic::CurrentSupportedVersions();
-  std::string quic_version_string = FLAGS_quic_version;
-  if (FLAGS_quic_ietf_draft > 0) {
-    quic::QuicVersionInitializeSupportForIetfDraft(FLAGS_quic_ietf_draft);
-    if (quic_version_string.empty()) {
-      quic_version_string = "T099";
+    // Determine IP address to connect to from supplied hostname.
+    quic::QuicIpAddress ip_addr;
+    if (!ip_addr.FromString(host)) {
+      net::AddressList addresses;
+      int rv = net::SynchronousHostResolver::Resolve(host, &addresses);
+      if (rv != net::OK) {
+        LOG(ERROR) << "Unable to resolve '" << host
+                   << "' : " << net::ErrorToShortString(rv);
+        return nullptr;
+      }
+      ip_addr =
+          quic::QuicIpAddress(quic::QuicIpAddressImpl(addresses[0].address()));
     }
+
+    quic::QuicServerId server_id(host, port, false);
+    return quic::QuicMakeUnique<net::QuicSimpleClient>(
+        quic::QuicSocketAddress(ip_addr, port), server_id, versions,
+        std::move(verifier));
   }
-  if (!quic_version_string.empty()) {
-    if (quic_version_string[0] == 'T') {
-      // ParseQuicVersionString checks quic_supports_tls_handshake.
-      SetQuicFlag(FLAGS_quic_supports_tls_handshake, true);
-    }
-    quic::ParsedQuicVersion parsed_quic_version =
-        quic::ParseQuicVersionString(quic_version_string);
-    if (parsed_quic_version.transport_version ==
-        quic::QUIC_VERSION_UNSUPPORTED) {
-      return 1;
-    }
-    versions.clear();
-    versions.push_back(parsed_quic_version);
-    quic::QuicEnableVersion(parsed_quic_version);
+};
+
+}  // namespace
+
+int main(int argc, char* argv[]) {
+  QuicSystemEventLoop event_loop("quic_client");
+  const char* usage = "Usage: quic_client [options] <url>";
+
+  // All non-flag arguments should be interpreted as URLs to fetch.
+  std::vector<std::string> urls =
+      quic::QuicParseCommandLineFlags(usage, argc, argv);
+  if (urls.size() != 1) {
+    quic::QuicPrintCommandLineFlagHelp(usage);
+    exit(0);
   }
 
-  if (FLAGS_force_version_negotiation) {
-    versions.insert(versions.begin(),
-                    quic::QuicVersionReservedForNegotiation());
-  }
-
-  // For secure QUIC we need to verify the cert chain.
-  std::unique_ptr<CertVerifier> cert_verifier(
-      CertVerifier::CreateDefault(/*cert_net_fetcher=*/nullptr));
-  std::unique_ptr<TransportSecurityState> transport_security_state(
-      new TransportSecurityState);
-  std::unique_ptr<MultiLogCTVerifier> ct_verifier(new MultiLogCTVerifier());
-  std::unique_ptr<net::CTPolicyEnforcer> ct_policy_enforcer(
-      new net::DefaultCTPolicyEnforcer());
-  std::unique_ptr<quic::ProofVerifier> proof_verifier;
-  if (line->HasSwitch("disable_certificate_verification")) {
-    proof_verifier.reset(new FakeProofVerifier());
-  } else {
-    proof_verifier.reset(new ProofVerifierChromium(
-        cert_verifier.get(), ct_policy_enforcer.get(),
-        transport_security_state.get(), ct_verifier.get()));
-  }
-  net::QuicSimpleClient client(quic::QuicSocketAddress(ip_addr, port),
-                               server_id, versions, std::move(proof_verifier));
-  client.set_initial_max_packet_length(
-      FLAGS_initial_mtu != 0 ? FLAGS_initial_mtu : quic::kDefaultMaxPacketSize);
-  if (!client.Initialize()) {
-    cerr << "Failed to initialize client." << endl;
-    return 1;
-  }
-  if (!client.Connect()) {
-    quic::QuicErrorCode error = client.session()->error();
-    if (FLAGS_version_mismatch_ok && error == quic::QUIC_INVALID_VERSION) {
-      cout << "Server talks QUIC, but none of the versions supported by "
-           << "this client: " << ParsedQuicVersionVectorToString(versions)
-           << endl;
-      // Version mismatch is not deemed a failure.
-      return 0;
-    }
-    cerr << "Failed to connect to " << host_port
-         << ". Error: " << quic::QuicErrorCodeToString(error) << endl;
-    return 1;
-  }
-  cout << "Connected to " << host_port << endl;
-
-  // Construct the string body from flags, if provided.
-  std::string body = FLAGS_body;
-  if (!FLAGS_body_hex.empty()) {
-    DCHECK(FLAGS_body.empty()) << "Only set one of --body and --body_hex.";
-    body = quic::QuicTextUtils::HexDecode(FLAGS_body_hex);
-  }
-
-  // Construct a GET or POST request for supplied URL.
-  SpdyHeaderBlock header_block;
-  header_block[":method"] = body.empty() ? "GET" : "POST";
-  header_block[":scheme"] = url.scheme();
-  header_block[":authority"] = url.host();
-  header_block[":path"] = url.path();
-
-  // Append any additional headers supplied on the command line.
-  for (quic::QuicStringPiece sp :
-       quic::QuicTextUtils::Split(FLAGS_headers, ';')) {
-    quic::QuicTextUtils::RemoveLeadingAndTrailingWhitespace(&sp);
-    if (sp.empty()) {
-      continue;
-    }
-    std::vector<quic::QuicStringPiece> kv = quic::QuicTextUtils::Split(sp, ':');
-    quic::QuicTextUtils::RemoveLeadingAndTrailingWhitespace(&kv[0]);
-    quic::QuicTextUtils::RemoveLeadingAndTrailingWhitespace(&kv[1]);
-    header_block[kv[0]] = kv[1];
-  }
-
-  // Make sure to store the response, for later output.
-  client.set_store_response(true);
-
-  // Send the request.
-  client.SendRequestAndWaitForResponse(header_block, body, /*fin=*/true);
-
-  // Print request and response details.
-  if (!FLAGS_quiet) {
-    cout << "Request:" << endl;
-    cout << "headers:" << header_block.DebugString();
-    if (!FLAGS_body_hex.empty()) {
-      // Print the user provided hex, rather than binary body.
-      cout << "body:\n"
-           << quic::QuicTextUtils::HexDump(
-                  quic::QuicTextUtils::HexDecode(FLAGS_body_hex))
-           << endl;
-    } else {
-      cout << "body: " << body << endl;
-    }
-    cout << endl;
-    cout << "Response:" << endl;
-    cout << "headers: " << client.latest_response_headers() << endl;
-    std::string response_body = client.latest_response_body();
-    if (!FLAGS_body_hex.empty()) {
-      // Assume response is binary data.
-      cout << "body:\n" << quic::QuicTextUtils::HexDump(response_body) << endl;
-    } else {
-      cout << "body: " << response_body << endl;
-    }
-    cout << "trailers: " << client.latest_response_trailers() << endl;
-  }
-
-  size_t response_code = client.latest_response_code();
-  if (response_code >= 200 && response_code < 300) {
-    cout << "Request succeeded (" << response_code << ")." << endl;
-    return 0;
-  } else if (response_code >= 300 && response_code < 400) {
-    if (FLAGS_redirect_is_success) {
-      cout << "Request succeeded (redirect " << response_code << ")." << endl;
-      return 0;
-    } else {
-      cout << "Request failed (redirect " << response_code << ")." << endl;
-      return 1;
-    }
-  } else {
-    cerr << "Request failed (" << response_code << ")." << endl;
-    return 1;
-  }
+  QuicSimpleClientFactory factory;
+  quic::QuicToyClient client(&factory);
+  return client.SendRequestsAndPrintResponses(urls);
 }
diff --git a/remoting/base/grpc_support/grpc_async_executor.cc b/remoting/base/grpc_support/grpc_async_executor.cc
index 37b8f33..96d87ca 100644
--- a/remoting/base/grpc_support/grpc_async_executor.cc
+++ b/remoting/base/grpc_support/grpc_async_executor.cc
@@ -89,7 +89,9 @@
 
 }  // namespace
 
-GrpcAsyncExecutor::GrpcAsyncExecutor() : weak_factory_(this) {}
+GrpcAsyncExecutor::GrpcAsyncExecutor() : weak_factory_(this) {
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+}
 
 GrpcAsyncExecutor::~GrpcAsyncExecutor() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/remoting/host/it2me/it2me_native_messaging_host.cc b/remoting/host/it2me/it2me_native_messaging_host.cc
index 214345b..382520d 100644
--- a/remoting/host/it2me/it2me_native_messaging_host.cc
+++ b/remoting/host/it2me/it2me_native_messaging_host.cc
@@ -16,6 +16,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringize_macros.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "base/values.h"
@@ -26,14 +27,20 @@
 #include "net/url_request/url_request_context_getter.h"
 #include "remoting/base/auto_thread_task_runner.h"
 #include "remoting/base/name_value_map.h"
+#include "remoting/base/oauth_token_getter.h"
 #include "remoting/base/service_urls.h"
 #include "remoting/host/chromoting_host_context.h"
 #include "remoting/host/host_exit_codes.h"
 #include "remoting/host/it2me/it2me_confirmation_dialog.h"
 #include "remoting/host/policy_watcher.h"
+#include "remoting/host/remoting_register_support_host_request.h"
 #include "remoting/host/xmpp_register_support_host_request.h"
 #include "remoting/protocol/ice_config.h"
 #include "remoting/signaling/delegating_signal_strategy.h"
+#include "remoting/signaling/ftl_client_uuid_device_id_provider.h"
+#include "remoting/signaling/ftl_signal_strategy.h"
+#include "remoting/signaling/muxing_signal_strategy.h"
+#include "remoting/signaling/xmpp_signal_strategy.h"
 
 #if defined(OS_WIN)
 #include "base/command_line.h"
@@ -86,6 +93,30 @@
   task_runner->PostTask(FROM_HERE, callback);
 }
 
+// An OAuthTokenGetter implementation that simply passes |username| and
+// |access_token| when CallWithToken() is called.
+class PassthroguhOAuthTokenGetter : public OAuthTokenGetter {
+ public:
+  PassthroguhOAuthTokenGetter(const std::string& username,
+                              const std::string& access_token)
+      : username_(username), access_token_(access_token) {}
+
+  ~PassthroguhOAuthTokenGetter() override = default;
+
+  void CallWithToken(OAuthTokenGetter::TokenCallback on_access_token) override {
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(on_access_token),
+                                  OAuthTokenGetter::Status::SUCCESS, username_,
+                                  access_token_));
+  }
+
+  void InvalidateCache() override { NOTIMPLEMENTED(); }
+
+ private:
+  std::string username_;
+  std::string access_token_;
+};
+
 }  // namespace
 
 It2MeNativeMessagingHost::It2MeNativeMessagingHost(
@@ -239,24 +270,33 @@
   bool no_dialogs = false;
   message->GetBoolean("noDialogs", &no_dialogs);
 
+  std::string directory_bot_jid =
+      ServiceUrls::GetInstance()->directory_bot_jid();
+
   std::unique_ptr<SignalStrategy> signal_strategy;
+  std::unique_ptr<RegisterSupportHostRequest> register_host_request;
   if (use_signaling_proxy) {
     if (username.empty()) {
       // Allow unauthenticated users for the delegated signal strategy case.
       username = kAnonymousUserName;
     }
     signal_strategy = CreateDelegatedSignalStrategy(message.get());
+    register_host_request =
+        std::make_unique<XmppRegisterSupportHostRequest>(directory_bot_jid);
   } else {
-    signal_strategy = CreateXmppSignalStrategy(username, message.get());
+    std::string access_token = ExtractAccessToken(message.get());
+    signal_strategy =
+        CreateMuxingSignalStrategy(username, access_token, message.get());
+    register_host_request =
+        std::make_unique<RemotingRegisterSupportHostRequest>(
+            std::make_unique<PassthroguhOAuthTokenGetter>(username,
+                                                          access_token));
   }
   if (!signal_strategy) {
     SendErrorAndExit(std::move(response), ErrorCode::INCOMPATIBLE_PROTOCOL);
     return;
   }
 
-  std::string directory_bot_jid =
-      ServiceUrls::GetInstance()->directory_bot_jid();
-
 #if !defined(NDEBUG)
   if (!message->GetString("directoryBotJid", &directory_bot_jid)) {
     LOG(ERROR) << "'directoryBotJid' not found in request.";
@@ -288,8 +328,6 @@
 #if defined(OS_CHROMEOS) || !defined(NDEBUG)
   it2me_host_->set_enable_dialogs(!no_dialogs);
 #endif
-  auto register_host_request =
-      std::make_unique<XmppRegisterSupportHostRequest>(directory_bot_jid);
   it2me_host_->Connect(host_context_->Copy(), std::move(policies),
                        std::make_unique<It2MeConfirmationDialogFactory>(),
                        std::move(register_host_request), weak_ptr_,
@@ -541,8 +579,9 @@
 }
 
 std::unique_ptr<SignalStrategy>
-It2MeNativeMessagingHost::CreateXmppSignalStrategy(
+It2MeNativeMessagingHost::CreateMuxingSignalStrategy(
     const std::string& username,
+    const std::string& access_token,
     const base::DictionaryValue* message) {
   if (username.empty()) {
     LOG(ERROR) << "'userName' not found in request.";
@@ -558,25 +597,7 @@
                             &xmpp_config.host, &xmpp_config.port);
   DCHECK(xmpp_server_valid);
   xmpp_config.use_tls = service_urls->xmpp_server_use_tls();
-
-  std::string auth_service_with_token;
-  if (!message->GetString("authServiceWithToken", &auth_service_with_token)) {
-    LOG(ERROR) << "'authServiceWithToken' not found in request.";
-    return nullptr;
-  }
-
-  // For backward compatibility the webapp still passes OAuth service as part
-  // of the authServiceWithToken field. But auth service part is always
-  // expected to be set to oauth2.
-  const char kOAuth2ServicePrefix[] = "oauth2:";
-  if (!base::StartsWith(auth_service_with_token, kOAuth2ServicePrefix,
-                        base::CompareCase::SENSITIVE)) {
-    LOG(ERROR) << "Invalid 'authServiceWithToken': " << auth_service_with_token;
-    return nullptr;
-  }
-
-  xmpp_config.auth_token =
-      auth_service_with_token.substr(strlen(kOAuth2ServicePrefix));
+  xmpp_config.auth_token = access_token;
 
 #if !defined(NDEBUG)
   std::string address;
@@ -596,9 +617,35 @@
   }
 #endif  // !defined(NDEBUG)
 
-  return std::make_unique<XmppSignalStrategy>(
+  auto xmpp_signal_strategy = std::make_unique<XmppSignalStrategy>(
       net::ClientSocketFactory::GetDefaultFactory(),
       host_context_->url_request_context_getter(), xmpp_config);
+  auto ftl_signal_strategy = std::make_unique<FtlSignalStrategy>(
+      std::make_unique<PassthroguhOAuthTokenGetter>(username, access_token),
+      std::make_unique<FtlClientUuidDeviceIdProvider>());
+  return std::make_unique<MuxingSignalStrategy>(
+      std::move(ftl_signal_strategy), std::move(xmpp_signal_strategy));
+}
+
+std::string It2MeNativeMessagingHost::ExtractAccessToken(
+    const base::DictionaryValue* message) {
+  std::string auth_service_with_token;
+  if (!message->GetString("authServiceWithToken", &auth_service_with_token)) {
+    LOG(ERROR) << "'authServiceWithToken' not found in request.";
+    return {};
+  }
+
+  // For backward compatibility the webapp still passes OAuth service as part
+  // of the authServiceWithToken field. But auth service part is always
+  // expected to be set to oauth2.
+  const char kOAuth2ServicePrefix[] = "oauth2:";
+  if (!base::StartsWith(auth_service_with_token, kOAuth2ServicePrefix,
+                        base::CompareCase::SENSITIVE)) {
+    LOG(ERROR) << "Invalid 'authServiceWithToken': " << auth_service_with_token;
+    return {};
+  }
+
+  return auth_service_with_token.substr(strlen(kOAuth2ServicePrefix));
 }
 
 #if defined(OS_WIN)
diff --git a/remoting/host/it2me/it2me_native_messaging_host.h b/remoting/host/it2me/it2me_native_messaging_host.h
index 3801db9..a36c03af 100644
--- a/remoting/host/it2me/it2me_native_messaging_host.h
+++ b/remoting/host/it2me/it2me_native_messaging_host.h
@@ -115,12 +115,16 @@
   std::unique_ptr<SignalStrategy> CreateDelegatedSignalStrategy(
       const base::DictionaryValue* message);
 
-  // Creates an XMPP signal strategy from the values stored in |message| along
+  // Creates a Muxing signal strategy from the values stored in |message| along
   // with |user_name|.  Returns nullptr on failure.
-  std::unique_ptr<SignalStrategy> CreateXmppSignalStrategy(
+  std::unique_ptr<SignalStrategy> CreateMuxingSignalStrategy(
       const std::string& user_name,
+      const std::string& access_token,
       const base::DictionaryValue* message);
 
+  // Extracts OAuth access token from the message passed from the client.
+  std::string ExtractAccessToken(const base::DictionaryValue* message);
+
   // Used to determine whether to create and pass messages to an elevated host.
   bool needs_elevation_ = false;
 
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
index 743b487..0615a41 100644
--- a/remoting/host/remoting_me2me_host.cc
+++ b/remoting/host/remoting_me2me_host.cc
@@ -768,8 +768,8 @@
     }
 
     factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithPin(
-        use_service_account_, host_owner_, local_certificate, key_pair_,
-        client_domain_list_, pin_hash_, pairing_registry);
+        use_service_account_, host_owner_, host_owner_email_, local_certificate,
+        key_pair_, client_domain_list_, pin_hash_, pairing_registry);
 
     host_->set_pairing_registry(pairing_registry);
   } else {
@@ -792,8 +792,8 @@
         new TokenValidatorFactoryImpl(third_party_auth_config_, key_pair_,
                                       context_->url_request_context_getter());
     factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithThirdPartyAuth(
-        use_service_account_, host_owner_, local_certificate, key_pair_,
-        client_domain_list_, token_validator_factory);
+        use_service_account_, host_owner_, host_owner_email_, local_certificate,
+        key_pair_, client_domain_list_, token_validator_factory);
   }
 
 #if defined(OS_POSIX)
diff --git a/remoting/protocol/me2me_host_authenticator_factory.cc b/remoting/protocol/me2me_host_authenticator_factory.cc
index 4e140f3d..b36544c1 100644
--- a/remoting/protocol/me2me_host_authenticator_factory.cc
+++ b/remoting/protocol/me2me_host_authenticator_factory.cc
@@ -15,6 +15,7 @@
 #include "remoting/protocol/rejecting_authenticator.h"
 #include "remoting/protocol/token_validator.h"
 #include "remoting/signaling/jid_util.h"
+#include "remoting/signaling/signaling_address.h"
 #include "third_party/libjingle_xmpp/xmllite/xmlelement.h"
 
 namespace remoting {
@@ -25,6 +26,7 @@
 Me2MeHostAuthenticatorFactory::CreateWithPin(
     bool use_service_account,
     const std::string& host_owner,
+    const std::string& host_owner_email,
     const std::string& local_cert,
     scoped_refptr<RsaKeyPair> key_pair,
     std::vector<std::string> required_client_domain_list,
@@ -34,6 +36,7 @@
       new Me2MeHostAuthenticatorFactory());
   result->use_service_account_ = use_service_account;
   result->host_owner_ = host_owner;
+  result->host_owner_email_ = host_owner_email;
   result->local_cert_ = local_cert;
   result->key_pair_ = key_pair;
   result->required_client_domain_list_ = std::move(required_client_domain_list);
@@ -42,12 +45,12 @@
   return std::move(result);
 }
 
-
 // static
 std::unique_ptr<AuthenticatorFactory>
 Me2MeHostAuthenticatorFactory::CreateWithThirdPartyAuth(
     bool use_service_account,
     const std::string& host_owner,
+    const std::string& host_owner_email,
     const std::string& local_cert,
     scoped_refptr<RsaKeyPair> key_pair,
     std::vector<std::string> required_client_domain_list,
@@ -56,6 +59,7 @@
       new Me2MeHostAuthenticatorFactory());
   result->use_service_account_ = use_service_account;
   result->host_owner_ = host_owner;
+  result->host_owner_email_ = host_owner_email;
   result->local_cert_ = local_cert;
   result->key_pair_ = key_pair;
   result->required_client_domain_list_ = std::move(required_client_domain_list);
@@ -83,6 +87,13 @@
       return base::WrapUnique(
           new RejectingAuthenticator(Authenticator::INVALID_CREDENTIALS));
     }
+  } else if (SignalingAddress(local_jid).channel() ==
+                 SignalingAddress::Channel::FTL &&
+             !host_owner_email_.empty()) {
+    // A non-gmail account's |host_owner_| will be a GAIA JID that is different
+    // than its actual email address, which only works for XMPP connections. FTL
+    // always uses the user's actual email.
+    remote_jid_prefix = host_owner_email_;
   } else {
     // TODO(rmsousa): This only works for cases where the JID prefix matches
     // the host owner email. Figure out a way to verify the JID in other cases.
diff --git a/remoting/protocol/me2me_host_authenticator_factory.h b/remoting/protocol/me2me_host_authenticator_factory.h
index 8a9ad782..ce56157 100644
--- a/remoting/protocol/me2me_host_authenticator_factory.h
+++ b/remoting/protocol/me2me_host_authenticator_factory.h
@@ -30,6 +30,7 @@
   static std::unique_ptr<AuthenticatorFactory> CreateWithPin(
       bool use_service_account,
       const std::string& host_owner,
+      const std::string& host_owner_email,
       const std::string& local_cert,
       scoped_refptr<RsaKeyPair> key_pair,
       std::vector<std::string> required_client_domain_list,
@@ -40,6 +41,7 @@
   static std::unique_ptr<AuthenticatorFactory> CreateWithThirdPartyAuth(
       bool use_service_account,
       const std::string& host_owner,
+      const std::string& host_owner_email,
       const std::string& local_cert,
       scoped_refptr<RsaKeyPair> key_pair,
       std::vector<std::string> required_client_domain_list,
@@ -57,6 +59,7 @@
   // Used for all host authenticators.
   bool use_service_account_;
   std::string host_owner_;
+  std::string host_owner_email_;
   std::string local_cert_;
   scoped_refptr<RsaKeyPair> key_pair_;
   std::vector<std::string> required_client_domain_list_;
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb
index 4852a484..7dbf4e4 100644
--- a/remoting/resources/remoting_strings_hi.xtb
+++ b/remoting/resources/remoting_strings_hi.xtb
@@ -39,7 +39,7 @@
 <translation id="195619862187186579">कीबोर्ड लेआउट</translation>
 <translation id="1996161829609978754">Chrome, Chromoting होस्ट इंस्टॉलर को डाउनलोड कर रहा है. डाउनलोड पूरा हो जाने पर, कृपया आगे बढ़ने से पहले इंस्टॉलर चलाएं.</translation>
 <translation id="2009755455353575666">कनेक्‍शन विफल रहा</translation>
-<translation id="2013884659108657024">Chrome, Chrome दूरस्थ डेस्कटॉप होस्ट इंस्टॉलर को डाउनलोड कर रहा है. डाउनलोड पूर्ण हो जाने पर, कृपया आगे बढने से पहले इंस्टॉलर चलाएं.</translation>
+<translation id="2013884659108657024">Chrome, Chrome दूर से किसी डेस्कटॉप होस्ट इंस्टॉलर को डाउनलोड कर रहा है. डाउनलोड पूरा हो जाने पर, कृपया आगे बढ़ने से पहले इंस्टॉलर चलाएं.</translation>
 <translation id="2013996867038862849">सभी युग्मित क्लाइंट हटा दिए गए हैं.</translation>
 <translation id="2038229918502634450">खाते में नीतिगत बदलाव करने के लिए, होस्‍ट फिर चालू हो रहा है.</translation>
 <translation id="2046651113449445291">निम्न क्लाइंट इस कंप्यूटर से युग्मित कर दिए गए हैं और वे PIN प्रदान किए बिना कनेक्ट कर सकते हैं. आप किसी भी समय, अलग-अलग या सभी क्लाइंट के लिए इस अनुमति को निरस्त कर सकते हैं.</translation>
@@ -80,7 +80,7 @@
 <translation id="2647232381348739934">Chromoting सेवा</translation>
 <translation id="2676780859508944670">काम कर रहा है…</translation>
 <translation id="2699970397166997657">Chromoting</translation>
-<translation id="2747641796667576127">सॉफ़्टवेयर अपडेट आमतौर पर स्वचालित रूप से ही होते हैं, लेकिन कुछ दुर्लभ मामलों में वे असफल भी हो सकते हैं. सॉफ़्टवेयर को अपडेट होने में कुछ ही मिनट लगेंगे और इसे अपने कंप्यूटर से दूरस्थ रूप से कनेक्ट रहते हुए भी पूर्ण किया जा सकता है.</translation>
+<translation id="2747641796667576127">सॉफ़्टवेयर आम तौर पर अपने आप ही अपडेट होते हैं, लेकिन कुछ दुर्लभ मामलों में वे असफल भी हो सकते हैं. सॉफ़्टवेयर को अपडेट होने में कुछ ही मिनट लगेंगे और इसे अपने कंप्यूटर से दूर होने पर भी कनेक्ट रहते हुए पूरा किया जा सकता है.</translation>
 <translation id="2758123043070977469">प्रमाणीकरण करते समय कोई समस्या हुई, कृपया फिर से लॉगिन करें.</translation>
 <translation id="2803375539583399270">पिन डालें</translation>
 <translation id="2841013758207633010">समय</translation>
@@ -251,7 +251,7 @@
 <translation id="629730747756840877">खाता</translation>
 <translation id="6304318647555713317">क्लाइंट</translation>
 <translation id="6381670701864002291">कुछ और.</translation>
-<translation id="6398765197997659313">पूर्ण स्क्रीन से बाहर निकलें</translation>
+<translation id="6398765197997659313">फ़ुल स्क्रीन से बाहर निकलें</translation>
 <translation id="6441316101718669559">इस प्लैटफ़ॉर्म पर डेस्‍कटॉप इंटिग्रेशन काम नहीं करता. आप फिर भी ऐप्‍लिकेशन का उपयोग कर सकते हैं लेकिन उपयोगकर्ता अनुभव कम हो जाएगा.</translation>
 <translation id="6502629188777329097">अपना कंप्यूटर सुरक्षित तरीके से एक्सेस करें</translation>
 <translation id="652218476070540101">इस कंप्‍यूटर का पिन अपडेट किया जा रहा है…</translation>
@@ -337,7 +337,7 @@
 <translation id="8445362773033888690">Google Play स्टोर में देखें</translation>
 <translation id="8509907436388546015">डेस्कटॉप एकीकरण प्रोसेस</translation>
 <translation id="8513093439376855948">होस्ट प्रबंधन को दूरस्थ बनाने के लिए स्थानीय संदेश सेवा होस्ट</translation>
-<translation id="8525306231823319788">पूर्ण स्‍क्रीन</translation>
+<translation id="8525306231823319788">फ़ुल स्‍क्रीन</translation>
 <translation id="8548209692293300397">आपने पहले <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) के रूप में साइन इन किया था.  उस खाते में अपने कंप्‍यूटर को एक्‍सेस करने के लिए, उस खाते से <ph name="LINK_BEGIN" />Google Chrome में साइन इन करें<ph name="LINK_END" /> और Chrome रिमोट (दूर के किसी) डेस्‍कटॉप को फिर से इंस्‍टॉल करें.</translation>
 <translation id="8642984861538780905">ठीक</translation>
 <translation id="8705151241155781642">• Android 9.0 Pie के लिए ज़्यादा सुविधा.
diff --git a/remoting/test/ftl_signaling_playground.cc b/remoting/test/ftl_signaling_playground.cc
index 9a6f5f6..3270d73 100644
--- a/remoting/test/ftl_signaling_playground.cc
+++ b/remoting/test/ftl_signaling_playground.cc
@@ -154,11 +154,12 @@
   std::string host_owner = cmd->HasSwitch(kSwitchNameHostOwner)
                                ? cmd->GetSwitchValueASCII(kSwitchNameHostOwner)
                                : user_email;
+  std::string host_owner_email = host_owner;
   HOST_LOG << "Using host owner: " << host_owner;
   bool is_service_account =
       test::TestOAuthTokenGetter::IsServiceAccount(user_email);
   auto factory = protocol::Me2MeHostAuthenticatorFactory::CreateWithPin(
-      is_service_account, host_owner, cert, key_pair,
+      is_service_account, host_owner, host_owner_email, cert, key_pair,
       /* domain_list */ {}, pin_hash, /* pairing_registry */ {});
   session_manager_->set_authenticator_factory(std::move(factory));
   HOST_LOG << "Waiting for incoming session...";
diff --git a/remoting/test/it2me_cli_host.cc b/remoting/test/it2me_cli_host.cc
index eba0ace..f5dfa34 100644
--- a/remoting/test/it2me_cli_host.cc
+++ b/remoting/test/it2me_cli_host.cc
@@ -175,12 +175,12 @@
   } else if (type == kCRDDebugLog) {
     // The It2Me host already prints the log to stdout/stderr.
   } else {
-    LOG(WARNING) << "Unknown message type :" << type;
+    LOG(WARNING) << "Unknown message type: " << type;
   }
 }
 
 void It2MeCliHost::CloseChannel(const std::string& error_message) {
-  LOG(ERROR) << "CRD Host closed channel" << error_message;
+  LOG(ERROR) << "CRD Host closed channel: " << error_message;
   command_awaiting_crd_access_code_ = false;
 
   ShutdownHost();
diff --git a/remoting/test/protocol_perftest.cc b/remoting/test/protocol_perftest.cc
index 52e078b..1491711 100644
--- a/remoting/test/protocol_perftest.cc
+++ b/remoting/test/protocol_perftest.cc
@@ -318,8 +318,8 @@
         protocol::GetSharedSecretHash(kHostId, kHostPin);
     std::unique_ptr<protocol::AuthenticatorFactory> auth_factory =
         protocol::Me2MeHostAuthenticatorFactory::CreateWithPin(
-            true, kHostOwner, host_cert, key_pair, std::vector<std::string>(),
-            host_pin_hash, nullptr);
+            true, kHostOwner, kHostOwner, host_cert, key_pair,
+            std::vector<std::string>(), host_pin_hash, nullptr);
     host_->SetAuthenticatorFactory(std::move(auth_factory));
 
     host_->status_monitor()->AddStatusObserver(this);
diff --git a/remoting/test/test_oauth_token_getter.cc b/remoting/test/test_oauth_token_getter.cc
index 0ddf2c4..e312ae2b 100644
--- a/remoting/test/test_oauth_token_getter.cc
+++ b/remoting/test/test_oauth_token_getter.cc
@@ -27,6 +27,7 @@
 
 constexpr char kChromotingAuthScopeValues[] =
     "https://www.googleapis.com/auth/chromoting "
+    "https://www.googleapis.com/auth/chromoting.remote.support "
     "https://www.googleapis.com/auth/googletalk "
     "https://www.googleapis.com/auth/userinfo.email "
     "https://www.googleapis.com/auth/tachyon";
diff --git a/services/BUILD.gn b/services/BUILD.gn
index 094989d5..0f33ba75 100644
--- a/services/BUILD.gn
+++ b/services/BUILD.gn
@@ -46,8 +46,6 @@
 
   if (use_aura) {
     deps += [
-      "//services/ws:tests",
-      "//services/ws/ime:tests",
       "//services/ws/input_devices:tests",
       "//services/ws/public/cpp/tests",
       "//services/ws/public/mojom:tests",
diff --git a/services/device/BUILD.gn b/services/device/BUILD.gn
index 7d3b0b2..333a8cf 100644
--- a/services/device/BUILD.gn
+++ b/services/device/BUILD.gn
@@ -26,17 +26,17 @@
 
   deps = [
     "//base",
-    "//device/usb/mojo",
-    "//device/usb/public/mojom",
-    "//device/usb/public/mojom:test",
     "//services/device/fingerprint",
     "//services/device/generic_sensor",
     "//services/device/geolocation",
     "//services/device/power_monitor",
     "//services/device/public/cpp:device_features",
     "//services/device/public/mojom",
+    "//services/device/public/mojom:usb",
+    "//services/device/public/mojom:usb_test",
     "//services/device/screen_orientation",
     "//services/device/time_zone_monitor",
+    "//services/device/usb/mojo",
     "//services/device/wake_lock",
     "//services/service_manager/public/cpp",
     "//ui/gfx",
@@ -181,6 +181,7 @@
     deps += [
       ":device_service_jni_headers",
       "//services/device/public/java:geolocation_java_test_support",
+      "//services/device/usb:java",
       "//services/device/vibration/android:vibration_jni_headers",
     ]
   } else {
@@ -208,9 +209,9 @@
       if (!is_ios) {
         sources += [ "hid/hid_connection_unittest.cc" ]
         deps += [
-          "//device:usb_test_gadget",
-          "//device/usb",
+          ":usb_test_gadget",
           "//net:test_support",
+          "//services/device/usb",
         ]
       }
     }
@@ -233,6 +234,40 @@
     ]
   }
 
+  # USB does not compile on iOS.
+  if (!is_ios) {
+    sources += [
+      "public/cpp/usb/usb_utils_unittest.cc",
+      "usb/mojo/device_impl_unittest.cc",
+      "usb/mojo/device_manager_impl_unittest.cc",
+      "usb/usb_descriptors_unittest.cc",
+      "usb/usb_device_handle_unittest.cc",
+      "usb/usb_service_unittest.cc",
+      "usb/webusb_descriptors_unittest.cc",
+    ]
+    deps += [
+      ":usb_test_gadget",
+      "//device/base",
+      "//net:test_support",
+      "//services/device/public/cpp/test:test_support",
+      "//services/device/public/cpp/usb",
+      "//services/device/public/mojom",
+      "//services/device/usb",
+      "//services/device/usb:test_support",
+      "//services/device/usb/mojo",
+    ]
+
+    if (!is_android) {
+      sources += [ "public/cpp/usb/usb_ids_unittest.cc" ]
+    }
+  }
+
+  # UsbContext is a libusb-specific object.
+  if (is_mac || is_win) {
+    sources += [ "usb/usb_context_unittest.cc" ]
+    deps += [ "//third_party/libusb" ]
+  }
+
   if (is_win) {
     # Needed for "generic_sensor/platform_sensor_and_provider_unittest_win.cc"
     libs = [
@@ -302,6 +337,7 @@
       "//services/device/public/mojom:mojom_java",
       "//services/device/screen_orientation:java",
       "//services/device/time_zone_monitor:java",
+      "//services/device/usb:java",
       "//services/device/vibration/android:vibration_manager_java",
       "//services/device/wake_lock/power_save_blocker:java",
       "//services/service_manager/public/java:service_manager_java",
@@ -309,3 +345,19 @@
     ]
   }
 }
+
+source_set("usb_test_gadget") {
+  testonly = true
+
+  sources = [
+    "test/usb_test_gadget.h",
+    "test/usb_test_gadget_impl.cc",
+  ]
+
+  deps = [
+    "//device/base",
+    "//net:test_support",
+    "//services/device/usb",
+    "//tools/usb_gadget",
+  ]
+}
diff --git a/services/device/device_service.h b/services/device/device_service.h
index 35e7535..a6261c13 100644
--- a/services/device/device_service.h
+++ b/services/device/device_service.h
@@ -10,10 +10,6 @@
 
 #include "base/memory/ref_counted.h"
 #include "build/build_config.h"
-#include "device/usb/mojo/device_manager_impl.h"
-#include "device/usb/mojo/device_manager_test.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/public/mojom/device_manager_test.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/device/geolocation/geolocation_provider.h"
 #include "services/device/geolocation/geolocation_provider_impl.h"
@@ -30,8 +26,12 @@
 #include "services/device/public/mojom/sensor_provider.mojom.h"
 #include "services/device/public/mojom/serial.mojom.h"
 #include "services/device/public/mojom/time_zone_monitor.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager_test.mojom.h"
 #include "services/device/public/mojom/vibration_manager.mojom.h"
 #include "services/device/public/mojom/wake_lock_provider.mojom.h"
+#include "services/device/usb/mojo/device_manager_impl.h"
+#include "services/device/usb/mojo/device_manager_test.h"
 #include "services/device/wake_lock/wake_lock_context.h"
 #include "services/device/wake_lock/wake_lock_provider.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
diff --git a/services/device/hid/hid_connection_unittest.cc b/services/device/hid/hid_connection_unittest.cc
index e427016..1c36d49 100644
--- a/services/device/hid/hid_connection_unittest.cc
+++ b/services/device/hid/hid_connection_unittest.cc
@@ -18,11 +18,11 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_io_thread.h"
-#include "device/test/usb_test_gadget.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_service.h"
 #include "services/device/hid/hid_service.h"
 #include "services/device/public/mojom/hid.mojom.h"
+#include "services/device/test/usb_test_gadget.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace device {
diff --git a/services/device/public/cpp/BUILD.gn b/services/device/public/cpp/BUILD.gn
index 6635bfa..55971755 100644
--- a/services/device/public/cpp/BUILD.gn
+++ b/services/device/public/cpp/BUILD.gn
@@ -28,10 +28,10 @@
 
   deps = [
     "//base",
-    "//device/usb/public/mojom",
-    "//device/usb/public/mojom:test",
     "//services/device/public/mojom",
     "//services/device/public/mojom:generic_sensor",
+    "//services/device/public/mojom:usb",
+    "//services/device/public/mojom:usb_test",
     "//services/service_manager/public/cpp",
   ]
 
diff --git a/services/device/public/cpp/manifest.cc b/services/device/public/cpp/manifest.cc
index ff894def..0648ec6 100644
--- a/services/device/public/cpp/manifest.cc
+++ b/services/device/public/cpp/manifest.cc
@@ -5,8 +5,6 @@
 #include "services/device/public/cpp/manifest.h"
 
 #include "base/no_destructor.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/public/mojom/device_manager_test.mojom.h"
 #include "services/device/public/mojom/battery_monitor.mojom.h"
 #include "services/device/public/mojom/bluetooth_system.mojom.h"
 #include "services/device/public/mojom/constants.mojom.h"
@@ -23,6 +21,8 @@
 #include "services/device/public/mojom/sensor_provider.mojom.h"
 #include "services/device/public/mojom/serial.mojom.h"
 #include "services/device/public/mojom/time_zone_monitor.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/public/mojom/usb_manager_test.mojom.h"
 #include "services/device/public/mojom/vibration_manager.mojom.h"
 #include "services/device/public/mojom/wake_lock_provider.mojom.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
diff --git a/services/device/public/cpp/test/BUILD.gn b/services/device/public/cpp/test/BUILD.gn
index adb8901..242f83d 100644
--- a/services/device/public/cpp/test/BUILD.gn
+++ b/services/device/public/cpp/test/BUILD.gn
@@ -10,6 +10,14 @@
     "fake_sensor_and_provider.h",
     "fake_serial_port_manager.cc",
     "fake_serial_port_manager.h",
+    "fake_usb_device.cc",
+    "fake_usb_device.h",
+    "fake_usb_device_info.cc",
+    "fake_usb_device_info.h",
+    "fake_usb_device_manager.cc",
+    "fake_usb_device_manager.h",
+    "mock_usb_mojo_device.cc",
+    "mock_usb_mojo_device.h",
     "scoped_geolocation_overrider.cc",
     "scoped_geolocation_overrider.h",
     "test_wake_lock_provider.cc",
@@ -20,13 +28,17 @@
     "//base",
     "//services/device/public/cpp/generic_sensor",
     "//services/device/public/cpp/geolocation",
+    "//services/device/public/cpp/usb",
     "//services/device/public/mojom",
+    "//services/device/public/mojom:usb",
     "//services/service_manager/public/cpp",
   ]
 
   deps = [
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
+    "//testing/gmock",
     "//testing/gtest",
+    "//url:url",
   ]
 }
diff --git a/device/usb/public/cpp/fake_usb_device.cc b/services/device/public/cpp/test/fake_usb_device.cc
similarity index 97%
rename from device/usb/public/cpp/fake_usb_device.cc
rename to services/device/public/cpp/test/fake_usb_device.cc
index ba0c1b6..6965573b 100644
--- a/device/usb/public/cpp/fake_usb_device.cc
+++ b/services/device/public/cpp/test/fake_usb_device.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 "device/usb/public/cpp/fake_usb_device.h"
+#include "services/device/public/cpp/test/fake_usb_device.h"
 
 #include <algorithm>
 #include <memory>
@@ -14,8 +14,8 @@
 #include "base/callback.h"
 #include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
-#include "device/usb/public/cpp/mock_usb_mojo_device.h"
-#include "device/usb/public/cpp/usb_utils.h"
+#include "services/device/public/cpp/test/mock_usb_mojo_device.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
 
 namespace device {
 
diff --git a/device/usb/public/cpp/fake_usb_device.h b/services/device/public/cpp/test/fake_usb_device.h
similarity index 92%
rename from device/usb/public/cpp/fake_usb_device.h
rename to services/device/public/cpp/test/fake_usb_device.h
index 4c6b35ef..4fa01bc 100644
--- a/device/usb/public/cpp/fake_usb_device.h
+++ b/services/device/public/cpp/test/fake_usb_device.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 DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_H_
-#define DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_H_
+#ifndef SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_H_
+#define SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_H_
 
 #include <stdint.h>
 
@@ -14,9 +14,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace device {
 
@@ -101,4 +101,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_H_
+#endif  // SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_H_
diff --git a/device/usb/public/cpp/fake_usb_device_info.cc b/services/device/public/cpp/test/fake_usb_device_info.cc
similarity index 97%
rename from device/usb/public/cpp/fake_usb_device_info.cc
rename to services/device/public/cpp/test/fake_usb_device_info.cc
index 2f294b66..8143a3ae 100644
--- a/device/usb/public/cpp/fake_usb_device_info.cc
+++ b/services/device/public/cpp/test/fake_usb_device_info.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/public/cpp/fake_usb_device_info.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
 
 #include <utility>
 
 #include "base/guid.h"
 #include "base/strings/utf_string_conversions.h"
-#include "device/usb/public/cpp/usb_utils.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
 
 namespace device {
 
diff --git a/device/usb/public/cpp/fake_usb_device_info.h b/services/device/public/cpp/test/fake_usb_device_info.h
similarity index 90%
rename from device/usb/public/cpp/fake_usb_device_info.h
rename to services/device/public/cpp/test/fake_usb_device_info.h
index c78af25e..9c54283a 100644
--- a/device/usb/public/cpp/fake_usb_device_info.h
+++ b/services/device/public/cpp/test/fake_usb_device_info.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 DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_INFO_H_
-#define DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_INFO_H_
+#ifndef SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_INFO_H_
+#define SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_INFO_H_
 
 #include <stdint.h>
 #include <string>
@@ -12,9 +12,9 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "device/usb/public/cpp/mock_usb_mojo_device.h"
-#include "device/usb/public/mojom/device.mojom.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "services/device/public/cpp/test/mock_usb_mojo_device.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "url/gurl.h"
 
 namespace device {
@@ -88,4 +88,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_INFO_H_
+#endif  // SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_INFO_H_
diff --git a/device/usb/public/cpp/fake_usb_device_manager.cc b/services/device/public/cpp/test/fake_usb_device_manager.cc
similarity index 91%
rename from device/usb/public/cpp/fake_usb_device_manager.cc
rename to services/device/public/cpp/test/fake_usb_device_manager.cc
index bc0acfb..16294af 100644
--- a/device/usb/public/cpp/fake_usb_device_manager.cc
+++ b/services/device/public/cpp/test/fake_usb_device_manager.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 "device/usb/public/cpp/fake_usb_device_manager.h"
+#include "services/device/public/cpp/test/fake_usb_device_manager.h"
 
 #include <string>
 #include <utility>
@@ -10,11 +10,11 @@
 
 #include "base/stl_util.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "device/usb/public/cpp/fake_usb_device.h"
-#include "device/usb/public/cpp/mock_usb_mojo_device.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device.h"
+#include "services/device/public/cpp/test/mock_usb_mojo_device.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
 
 namespace device {
 
diff --git a/device/usb/public/cpp/fake_usb_device_manager.h b/services/device/public/cpp/test/fake_usb_device_manager.h
similarity index 88%
rename from device/usb/public/cpp/fake_usb_device_manager.h
rename to services/device/public/cpp/test/fake_usb_device_manager.h
index a4af434..a7f58c6 100644
--- a/device/usb/public/cpp/fake_usb_device_manager.h
+++ b/services/device/public/cpp/test/fake_usb_device_manager.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 DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_MANAGER_H_
-#define DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_MANAGER_H_
+#ifndef SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_MANAGER_H_
+#define SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_MANAGER_H_
 
 #include <string>
 #include <unordered_map>
@@ -12,11 +12,11 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/optional.h"
 #include "build/build_config.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 
 namespace device {
 
@@ -99,4 +99,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_PUBLIC_CPP_FAKE_USB_DEVICE_MANAGER_H_
+#endif  // SERVICES_DEVICE_PUBLIC_CPP_TEST_FAKE_USB_DEVICE_MANAGER_H_
diff --git a/device/usb/public/cpp/mock_usb_mojo_device.cc b/services/device/public/cpp/test/mock_usb_mojo_device.cc
similarity index 95%
rename from device/usb/public/cpp/mock_usb_mojo_device.cc
rename to services/device/public/cpp/test/mock_usb_mojo_device.cc
index 3a9ac13..25e8bd9 100644
--- a/device/usb/public/cpp/mock_usb_mojo_device.cc
+++ b/services/device/public/cpp/test/mock_usb_mojo_device.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 "device/usb/public/cpp/mock_usb_mojo_device.h"
+#include "services/device/public/cpp/test/mock_usb_mojo_device.h"
 
 #include <utility>
 
diff --git a/device/usb/public/cpp/mock_usb_mojo_device.h b/services/device/public/cpp/test/mock_usb_mojo_device.h
similarity index 95%
rename from device/usb/public/cpp/mock_usb_mojo_device.h
rename to services/device/public/cpp/test/mock_usb_mojo_device.h
index ff37436..3c0df18d 100644
--- a/device/usb/public/cpp/mock_usb_mojo_device.h
+++ b/services/device/public/cpp/test/mock_usb_mojo_device.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 DEVICE_USB_PUBLIC_CPP_MOCK_USB_MOJO_DEVICE_H_
-#define DEVICE_USB_PUBLIC_CPP_MOCK_USB_MOJO_DEVICE_H_
+#ifndef SERVICES_DEVICE_PUBLIC_CPP_TEST_MOCK_USB_MOJO_DEVICE_H_
+#define SERVICES_DEVICE_PUBLIC_CPP_TEST_MOCK_USB_MOJO_DEVICE_H_
 
 #include <stdint.h>
 
@@ -11,7 +11,7 @@
 #include <vector>
 
 #include "base/memory/ref_counted.h"
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace device {
@@ -143,4 +143,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_PUBLIC_CPP_MOCK_USB_MOJO_DEVICE_H_
+#endif  // SERVICES_DEVICE_PUBLIC_CPP_TEST_MOCK_USB_MOJO_DEVICE_H_
diff --git a/services/device/public/cpp/usb/BUILD.gn b/services/device/public/cpp/usb/BUILD.gn
new file mode 100644
index 0000000..55e7c03
--- /dev/null
+++ b/services/device/public/cpp/usb/BUILD.gn
@@ -0,0 +1,40 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_ids = "//third_party/usb_ids/usb.ids"
+generated_ids = "$target_gen_dir/usb_ids_gen.cc"
+
+action("usb_device_ids") {
+  script = "//services/device/public/cpp/usb/tools/usb_ids.py"
+  inputs = [
+    source_ids,
+  ]
+  outputs = [
+    generated_ids,
+  ]
+  args = [
+    "-i",
+    rebase_path(source_ids, root_build_dir),
+    "-o",
+    rebase_path(generated_ids, root_build_dir),
+  ]
+
+  # Only the "usb" target in this file can depend on us.
+  visibility = [ ":usb" ]
+}
+
+source_set("usb") {
+  sources = [
+    "usb_ids.cc",
+    "usb_ids.h",
+    "usb_utils.cc",
+    "usb_utils.h",
+    generated_ids,
+  ]
+
+  deps = [
+    ":usb_device_ids",
+    "//services/device/public/mojom:usb",
+  ]
+}
diff --git a/device/usb/public/tools/usb_ids.py b/services/device/public/cpp/usb/tools/usb_ids.py
similarity index 97%
rename from device/usb/public/tools/usb_ids.py
rename to services/device/public/cpp/usb/tools/usb_ids.py
index f7fdaa9..14ce73f 100644
--- a/device/usb/public/tools/usb_ids.py
+++ b/services/device/public/cpp/usb/tools/usb_ids.py
@@ -93,7 +93,7 @@
 
 #include <stddef.h>
 
-#include "device/usb/public/cpp/usb_ids.h"
+#include "services/device/public/cpp/usb/usb_ids.h"
 
 namespace device {
 
diff --git a/device/usb/public/cpp/usb_ids.cc b/services/device/public/cpp/usb/usb_ids.cc
similarity index 96%
rename from device/usb/public/cpp/usb_ids.cc
rename to services/device/public/cpp/usb/usb_ids.cc
index a799892f..a4592eb8 100644
--- a/device/usb/public/cpp/usb_ids.cc
+++ b/services/device/public/cpp/usb/usb_ids.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 "device/usb/public/cpp/usb_ids.h"
+#include "services/device/public/cpp/usb/usb_ids.h"
 
 #include <stdlib.h>
 
diff --git a/device/usb/public/cpp/usb_ids.h b/services/device/public/cpp/usb/usb_ids.h
similarity index 90%
rename from device/usb/public/cpp/usb_ids.h
rename to services/device/public/cpp/usb/usb_ids.h
index e171051..6a76f71e 100644
--- a/device/usb/public/cpp/usb_ids.h
+++ b/services/device/public/cpp/usb/usb_ids.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 DEVICE_USB_PUBLIC_CPP_USB_IDS_H_
-#define DEVICE_USB_PUBLIC_CPP_USB_IDS_H_
+#ifndef SERVICES_DEVICE_PUBLIC_CPP_USB_USB_IDS_H_
+#define SERVICES_DEVICE_PUBLIC_CPP_USB_USB_IDS_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -56,4 +56,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_PUBLIC_CPP_USB_IDS_H_
+#endif  // SERVICES_DEVICE_PUBLIC_CPP_USB_USB_IDS_H_
diff --git a/device/usb/public/cpp/usb_ids_unittest.cc b/services/device/public/cpp/usb/usb_ids_unittest.cc
similarity index 93%
rename from device/usb/public/cpp/usb_ids_unittest.cc
rename to services/device/public/cpp/usb/usb_ids_unittest.cc
index 9107194..bf36c19 100644
--- a/device/usb/public/cpp/usb_ids_unittest.cc
+++ b/services/device/public/cpp/usb/usb_ids_unittest.cc
@@ -6,7 +6,7 @@
 
 #include <string>
 
-#include "device/usb/public/cpp/usb_ids.h"
+#include "services/device/public/cpp/usb/usb_ids.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
diff --git a/device/usb/public/cpp/usb_utils.cc b/services/device/public/cpp/usb/usb_utils.cc
similarity index 94%
rename from device/usb/public/cpp/usb_utils.cc
rename to services/device/public/cpp/usb/usb_utils.cc
index 6aa4f450..a03ce17b 100644
--- a/device/usb/public/cpp/usb_utils.cc
+++ b/services/device/public/cpp/usb/usb_utils.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/public/cpp/usb_utils.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
 
 #include <utility>
 
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 
 namespace device {
 
diff --git a/device/usb/public/cpp/usb_utils.h b/services/device/public/cpp/usb/usb_utils.h
similarity index 74%
rename from device/usb/public/cpp/usb_utils.h
rename to services/device/public/cpp/usb/usb_utils.h
index 55a1770..023f282 100644
--- a/device/usb/public/cpp/usb_utils.h
+++ b/services/device/public/cpp/usb/usb_utils.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_PUBLIC_CPP_USB_UTILS_H_
-#define DEVICE_USB_PUBLIC_CPP_USB_UTILS_H_
+#ifndef SERVICES_DEVICE_PUBLIC_CPP_USB_USB_UTILS_H_
+#define SERVICES_DEVICE_PUBLIC_CPP_USB_USB_UTILS_H_
 
 #include <vector>
 
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
 
 namespace device {
 
@@ -30,4 +30,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_PUBLIC_CPP_USB_UTILS_H_
+#endif  // SERVICES_DEVICE_PUBLIC_CPP_USB_USB_UTILS_H_
diff --git a/device/usb/public/cpp/usb_utils_unittest.cc b/services/device/public/cpp/usb/usb_utils_unittest.cc
similarity index 96%
rename from device/usb/public/cpp/usb_utils_unittest.cc
rename to services/device/public/cpp/usb/usb_utils_unittest.cc
index 154a843..c79d56c 100644
--- a/device/usb/public/cpp/usb_utils_unittest.cc
+++ b/services/device/public/cpp/usb/usb_utils_unittest.cc
@@ -6,9 +6,9 @@
 
 #include "base/memory/ref_counted.h"
 #include "base/strings/utf_string_conversions.h"
-#include "device/usb/public/cpp/fake_usb_device_info.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/services/device/public/mojom/BUILD.gn b/services/device/public/mojom/BUILD.gn
index 2814beb1..d535302 100644
--- a/services/device/public/mojom/BUILD.gn
+++ b/services/device/public/mojom/BUILD.gn
@@ -113,3 +113,48 @@
   export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
   export_header_blink = "third_party/blink/public/platform/web_common.h"
 }
+
+mojom("usb") {
+  sources = [
+    "usb_device.mojom",
+    "usb_enumeration_options.mojom",
+    "usb_manager.mojom",
+    "usb_manager_client.mojom",
+  ]
+
+  public_deps = [
+    "//mojo/public/mojom/base",
+    "//url/mojom:url_mojom_gurl",
+  ]
+
+  # USB Mojom interfaces are exposed publicly to layout tests which use
+  # prepackaged redistributable JS bindings. It is therefore not desirable to
+  # scramble these messages.
+  scramble_message_ids = false
+
+  # The blink variant of the usb mojom is depended on by the blink platform
+  # target. All blink variant mojoms use WTF types, which are part of the
+  # blink platform component. In order to avoid a dependency cycle, these
+  # targets must be part of that component.
+  export_class_attribute_blink = "BLINK_PLATFORM_EXPORT"
+  export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
+  export_header_blink = "third_party/blink/public/platform/web_common.h"
+
+  visibility_blink = [
+    ":*",
+    "//components/arc/common:common_blink",
+    "//third_party/blink/public/mojom/usb:usb_blink",
+    "//third_party/blink/renderer/modules/webusb",
+    "//chrome/browser/ui/webui/usb_internals:mojo_bindings_blink",
+  ]
+}
+
+mojom("usb_test") {
+  sources = [
+    "usb_manager_test.mojom",
+  ]
+
+  public_deps = [
+    "//url/mojom:url_mojom_gurl",
+  ]
+}
diff --git a/device/usb/public/mojom/device.mojom b/services/device/public/mojom/usb_device.mojom
similarity index 100%
rename from device/usb/public/mojom/device.mojom
rename to services/device/public/mojom/usb_device.mojom
diff --git a/device/usb/public/mojom/device_enumeration_options.mojom b/services/device/public/mojom/usb_enumeration_options.mojom
similarity index 100%
rename from device/usb/public/mojom/device_enumeration_options.mojom
rename to services/device/public/mojom/usb_enumeration_options.mojom
diff --git a/device/usb/public/mojom/device_manager.mojom b/services/device/public/mojom/usb_manager.mojom
similarity index 89%
rename from device/usb/public/mojom/device_manager.mojom
rename to services/device/public/mojom/usb_manager.mojom
index 1ffb2c029..9bdb1fd 100644
--- a/device/usb/public/mojom/device_manager.mojom
+++ b/services/device/public/mojom/usb_manager.mojom
@@ -4,9 +4,9 @@
 
 module device.mojom;
 
-import "device/usb/public/mojom/device.mojom";
-import "device/usb/public/mojom/device_enumeration_options.mojom";
-import "device/usb/public/mojom/device_manager_client.mojom";
+import "services/device/public/mojom/usb_device.mojom";
+import "services/device/public/mojom/usb_enumeration_options.mojom";
+import "services/device/public/mojom/usb_manager_client.mojom";
 import "mojo/public/mojom/base/file.mojom";
 
 interface UsbDeviceManager {
diff --git a/device/usb/public/mojom/device_manager_client.mojom b/services/device/public/mojom/usb_manager_client.mojom
similarity index 88%
rename from device/usb/public/mojom/device_manager_client.mojom
rename to services/device/public/mojom/usb_manager_client.mojom
index 4f33422f..5bc032f 100644
--- a/device/usb/public/mojom/device_manager_client.mojom
+++ b/services/device/public/mojom/usb_manager_client.mojom
@@ -4,7 +4,7 @@
 
 module device.mojom;
 
-import "device/usb/public/mojom/device.mojom";
+import "services/device/public/mojom/usb_device.mojom";
 
 interface UsbDeviceManagerClient {
   // Called when a device is connected to the host.
diff --git a/device/usb/public/mojom/device_manager_test.mojom b/services/device/public/mojom/usb_manager_test.mojom
similarity index 100%
rename from device/usb/public/mojom/device_manager_test.mojom
rename to services/device/public/mojom/usb_manager_test.mojom
diff --git a/services/device/test/DEPS b/services/device/test/DEPS
new file mode 100644
index 0000000..394d081e
--- /dev/null
+++ b/services/device/test/DEPS
@@ -0,0 +1,6 @@
+include_rules = [
+  "+net/base",
+  "+net/proxy_resolution",
+  "+net/traffic_annotation",
+  "+net/url_request",
+]
diff --git a/device/test/usb_test_gadget.h b/services/device/test/usb_test_gadget.h
similarity index 86%
rename from device/test/usb_test_gadget.h
rename to services/device/test/usb_test_gadget.h
index b8a95ca..6b48d21 100644
--- a/device/test/usb_test_gadget.h
+++ b/services/device/test/usb_test_gadget.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 DEVICE_TEST_USB_TEST_GADGET_H_
-#define DEVICE_TEST_USB_TEST_GADGET_H_
+#ifndef SERVICES_DEVICE_TEST_USB_TEST_GADGET_H_
+#define SERVICES_DEVICE_TEST_USB_TEST_GADGET_H_
 
 #include <memory>
 #include <string>
@@ -53,4 +53,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_TEST_USB_TEST_GADGET_H_
+#endif  // SERVICES_DEVICE_TEST_USB_TEST_GADGET_H_
diff --git a/device/test/usb_test_gadget_impl.cc b/services/device/test/usb_test_gadget_impl.cc
similarity index 98%
rename from device/test/usb_test_gadget_impl.cc
rename to services/device/test/usb_test_gadget_impl.cc
index ef381d8..5c043ce 100644
--- a/device/test/usb_test_gadget_impl.cc
+++ b/services/device/test/usb_test_gadget_impl.cc
@@ -28,10 +28,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
-#include "device/test/usb_test_gadget.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_device_handle.h"
-#include "device/usb/usb_service.h"
 #include "net/base/escape.h"
 #include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
@@ -40,6 +36,10 @@
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_builder.h"
 #include "net/url_request/url_request_context_getter.h"
+#include "services/device/test/usb_test_gadget.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_service.h"
 #include "url/gurl.h"
 
 namespace device {
@@ -583,8 +583,8 @@
   int response_code = SimplePOSTRequest(request_context_getter_, url, "");
 
   if (response_code != 200) {
-    LOG(ERROR) << "Unexpected HTTP " << response_code
-               << " from " << config->http_resource << ".";
+    LOG(ERROR) << "Unexpected HTTP " << response_code << " from "
+               << config->http_resource << ".";
     return false;
   }
 
diff --git a/device/usb/BUILD.gn b/services/device/usb/BUILD.gn
similarity index 93%
rename from device/usb/BUILD.gn
rename to services/device/usb/BUILD.gn
index 66928737..677a17ed 100644
--- a/device/usb/BUILD.gn
+++ b/services/device/usb/BUILD.gn
@@ -12,11 +12,10 @@
 }
 
 static_library("usb") {
-  # Only the device_usb_mojo and tests in //device folder can depend on it.
+  # Only targets under //services/device folder can depend on it.
   visibility = [
     ":*",
-    "//device:*",
-    "//device/usb/mojo:*",
+    "//services/device/usb/mojo:*",
     "//services/device:*",
   ]
 
@@ -57,7 +56,7 @@
     "//base/third_party/dynamic_annotations",
     "//components/device_event_log",
     "//device/base",
-    "//device/usb/public/mojom",
+    "//services/device/public/mojom:usb",
   ]
 
   public_deps = [
@@ -76,7 +75,7 @@
   if (is_android) {
     deps += [ ":jni_headers" ]
   } else {
-    deps += [ "//device/usb/public/cpp" ]
+    deps += [ "//services/device/public/cpp/usb" ]
   }
 
   if (is_win || is_mac) {
@@ -172,9 +171,9 @@
   ]
   deps = [
     ":usb",
-    "//device/usb/mojo",
-    "//device/usb/public/mojom",
     "//mojo/public/cpp/bindings",
+    "//services/device/public/mojom:usb",
+    "//services/device/usb/mojo",
   ]
   seed_corpus = "fuzz_corpus"
   libfuzzer_options = [ "max_len=2048" ]
diff --git a/device/usb/DEPS b/services/device/usb/DEPS
similarity index 70%
rename from device/usb/DEPS
rename to services/device/usb/DEPS
index ea3225e..51fbd47 100644
--- a/device/usb/DEPS
+++ b/services/device/usb/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+components/device_event_log",
   "+chromeos",
   "+dbus",
   "+jni",
diff --git a/device/usb/OWNERS b/services/device/usb/OWNERS
similarity index 100%
rename from device/usb/OWNERS
rename to services/device/usb/OWNERS
diff --git a/device/usb/README.md b/services/device/usb/README.md
similarity index 89%
rename from device/usb/README.md
rename to services/device/usb/README.md
index 931c5a58..e0375b8 100644
--- a/device/usb/README.md
+++ b/services/device/usb/README.md
@@ -1,9 +1,9 @@
 # USB
 
-`device/usb` abstracts [Universal Serial Bus](https://en.wikipedia.org/wiki/USB)
+`services/device/usb` abstracts [Universal Serial Bus](https://en.wikipedia.org/wiki/USB)
 concepts across multiple platforms.
 
-Clients should use the [public Mojo interface](/device/usb/public/mojom).
+Clients should use the [public Mojo interface](../public/mojom).
 
 
 ## USB ID Repository
diff --git a/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbConfiguration.java b/services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbConfiguration.java
similarity index 100%
rename from device/usb/android/java/src/org/chromium/device/usb/ChromeUsbConfiguration.java
rename to services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbConfiguration.java
diff --git a/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbConnection.java b/services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbConnection.java
similarity index 100%
rename from device/usb/android/java/src/org/chromium/device/usb/ChromeUsbConnection.java
rename to services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbConnection.java
diff --git a/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbDevice.java b/services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbDevice.java
similarity index 100%
rename from device/usb/android/java/src/org/chromium/device/usb/ChromeUsbDevice.java
rename to services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbDevice.java
diff --git a/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbEndpoint.java b/services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbEndpoint.java
similarity index 100%
rename from device/usb/android/java/src/org/chromium/device/usb/ChromeUsbEndpoint.java
rename to services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbEndpoint.java
diff --git a/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbInterface.java b/services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbInterface.java
similarity index 100%
rename from device/usb/android/java/src/org/chromium/device/usb/ChromeUsbInterface.java
rename to services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbInterface.java
diff --git a/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbService.java b/services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbService.java
similarity index 100%
rename from device/usb/android/java/src/org/chromium/device/usb/ChromeUsbService.java
rename to services/device/usb/android/java/src/org/chromium/device/usb/ChromeUsbService.java
diff --git a/device/usb/fake_usb_device_handle.cc b/services/device/usb/fake_usb_device_handle.cc
similarity index 96%
rename from device/usb/fake_usb_device_handle.cc
rename to services/device/usb/fake_usb_device_handle.cc
index 5f895b3..6b92fde1 100644
--- a/device/usb/fake_usb_device_handle.cc
+++ b/services/device/usb/fake_usb_device_handle.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/fake_usb_device_handle.h"
+#include "services/device/usb/fake_usb_device_handle.h"
 
 #include "base/callback.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted_memory.h"
-#include "device/usb/usb_device.h"
+#include "services/device/usb/usb_device.h"
 
 namespace device {
 
diff --git a/device/usb/fake_usb_device_handle.h b/services/device/usb/fake_usb_device_handle.h
similarity index 93%
rename from device/usb/fake_usb_device_handle.h
rename to services/device/usb/fake_usb_device_handle.h
index 04227dee..86578d3 100644
--- a/device/usb/fake_usb_device_handle.h
+++ b/services/device/usb/fake_usb_device_handle.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_FAKE_USB_DEVICE_HANDLE_H_
-#define DEVICE_USB_FAKE_USB_DEVICE_HANDLE_H_
+#ifndef SERVICES_DEVICE_USB_FAKE_USB_DEVICE_HANDLE_H_
+#define SERVICES_DEVICE_USB_FAKE_USB_DEVICE_HANDLE_H_
 
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 
 namespace device {
 
@@ -77,4 +77,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_FAKE_USB_DEVICE_HANDLE_H_
+#endif  // SERVICES_DEVICE_USB_FAKE_USB_DEVICE_HANDLE_H_
diff --git a/device/usb/fuzz_corpus/descriptor0 b/services/device/usb/fuzz_corpus/descriptor0
similarity index 100%
rename from device/usb/fuzz_corpus/descriptor0
rename to services/device/usb/fuzz_corpus/descriptor0
Binary files differ
diff --git a/device/usb/fuzz_corpus/descriptor1 b/services/device/usb/fuzz_corpus/descriptor1
similarity index 100%
rename from device/usb/fuzz_corpus/descriptor1
rename to services/device/usb/fuzz_corpus/descriptor1
Binary files differ
diff --git a/device/usb/fuzz_corpus/descriptor2 b/services/device/usb/fuzz_corpus/descriptor2
similarity index 100%
rename from device/usb/fuzz_corpus/descriptor2
rename to services/device/usb/fuzz_corpus/descriptor2
Binary files differ
diff --git a/device/usb/fuzz_corpus/descriptor3 b/services/device/usb/fuzz_corpus/descriptor3
similarity index 100%
rename from device/usb/fuzz_corpus/descriptor3
rename to services/device/usb/fuzz_corpus/descriptor3
Binary files differ
diff --git a/device/usb/fuzz_corpus/descriptor4 b/services/device/usb/fuzz_corpus/descriptor4
similarity index 100%
rename from device/usb/fuzz_corpus/descriptor4
rename to services/device/usb/fuzz_corpus/descriptor4
Binary files differ
diff --git a/device/usb/fuzz_corpus/descriptor5 b/services/device/usb/fuzz_corpus/descriptor5
similarity index 100%
rename from device/usb/fuzz_corpus/descriptor5
rename to services/device/usb/fuzz_corpus/descriptor5
Binary files differ
diff --git a/device/usb/fuzz_corpus/descriptor6 b/services/device/usb/fuzz_corpus/descriptor6
similarity index 100%
rename from device/usb/fuzz_corpus/descriptor6
rename to services/device/usb/fuzz_corpus/descriptor6
Binary files differ
diff --git a/device/usb/fuzz_corpus/descriptor7 b/services/device/usb/fuzz_corpus/descriptor7
similarity index 100%
rename from device/usb/fuzz_corpus/descriptor7
rename to services/device/usb/fuzz_corpus/descriptor7
Binary files differ
diff --git a/device/usb/fuzz_corpus/usb_string_descriptors_example b/services/device/usb/fuzz_corpus/usb_string_descriptors_example
similarity index 100%
rename from device/usb/fuzz_corpus/usb_string_descriptors_example
rename to services/device/usb/fuzz_corpus/usb_string_descriptors_example
Binary files differ
diff --git a/device/usb/fuzz_corpus/webusb_descriptors_unittest_example b/services/device/usb/fuzz_corpus/webusb_descriptors_unittest_example
similarity index 100%
rename from device/usb/fuzz_corpus/webusb_descriptors_unittest_example
rename to services/device/usb/fuzz_corpus/webusb_descriptors_unittest_example
Binary files differ
diff --git a/device/usb/mock_usb_device.cc b/services/device/usb/mock_usb_device.cc
similarity index 92%
rename from device/usb/mock_usb_device.cc
rename to services/device/usb/mock_usb_device.cc
index f9921b0..11412a65 100644
--- a/device/usb/mock_usb_device.cc
+++ b/services/device/usb/mock_usb_device.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 "device/usb/mock_usb_device.h"
+#include "services/device/usb/mock_usb_device.h"
 
 #include "base/strings/utf_string_conversions.h"
 
@@ -26,7 +26,8 @@
                 base::UTF8ToUTF16(manufacturer_string),
                 base::UTF8ToUTF16(product_string),
                 base::UTF8ToUTF16(serial_number),
-                0, 0) {} // Bus and port number
+                /*bus_number=*/0,
+                /*port_number=*/0) {}
 
 MockUsbDevice::MockUsbDevice(uint16_t vendor_id,
                              uint16_t product_id,
@@ -44,7 +45,8 @@
                 base::UTF8ToUTF16(manufacturer_string),
                 base::UTF8ToUTF16(product_string),
                 base::UTF8ToUTF16(serial_number),
-                0, 0) { // Bus and port number
+                /*bus_number=*/0,
+                /*port_number=*/0) {
   webusb_landing_page_ = webusb_landing_page;
 }
 
@@ -70,7 +72,8 @@
                 base::string16(),
                 base::string16(),
                 base::string16(),
-                0, 0) { // Bus and port number
+                /*bus_number=*/0,
+                /*port_number=*/0) {
   descriptor_.configurations = configurations;
 }
 
diff --git a/device/usb/mock_usb_device.h b/services/device/usb/mock_usb_device.h
similarity index 88%
rename from device/usb/mock_usb_device.h
rename to services/device/usb/mock_usb_device.h
index ef09b0a1..ed91f43 100644
--- a/device/usb/mock_usb_device.h
+++ b/services/device/usb/mock_usb_device.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_MOCK_USB_DEVICE_H_
-#define DEVICE_USB_MOCK_USB_DEVICE_H_
+#ifndef SERVICES_DEVICE_USB_MOCK_USB_DEVICE_H_
+#define SERVICES_DEVICE_USB_MOCK_USB_DEVICE_H_
 
 #include <stdint.h>
 
 #include <string>
 #include <vector>
 
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_device_handle.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace device {
@@ -59,4 +59,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_MOCK_USB_DEVICE_H_
+#endif  // SERVICES_DEVICE_USB_MOCK_USB_DEVICE_H_
diff --git a/device/usb/mock_usb_device_handle.cc b/services/device/usb/mock_usb_device_handle.cc
similarity index 78%
rename from device/usb/mock_usb_device_handle.cc
rename to services/device/usb/mock_usb_device_handle.cc
index 6b54a2f..321e59b 100644
--- a/device/usb/mock_usb_device_handle.cc
+++ b/services/device/usb/mock_usb_device_handle.cc
@@ -2,14 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/mock_usb_device_handle.h"
+#include "services/device/usb/mock_usb_device_handle.h"
 
-#include "device/usb/usb_device.h"
+#include "services/device/usb/usb_device.h"
 
 namespace device {
 
-MockUsbDeviceHandle::MockUsbDeviceHandle(UsbDevice* device) : device_(device) {
-}
+MockUsbDeviceHandle::MockUsbDeviceHandle(UsbDevice* device) : device_(device) {}
 
 scoped_refptr<UsbDevice> MockUsbDeviceHandle::GetDevice() const {
   return device_;
diff --git a/device/usb/mock_usb_device_handle.h b/services/device/usb/mock_usb_device_handle.h
similarity index 95%
rename from device/usb/mock_usb_device_handle.h
rename to services/device/usb/mock_usb_device_handle.h
index 40a7bf7..25a2c61 100644
--- a/device/usb/mock_usb_device_handle.h
+++ b/services/device/usb/mock_usb_device_handle.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 DEVICE_USB_MOCK_USB_DEVICE_HANDLE_H_
-#define DEVICE_USB_MOCK_USB_DEVICE_HANDLE_H_
+#ifndef SERVICES_DEVICE_USB_MOCK_USB_DEVICE_HANDLE_H_
+#define SERVICES_DEVICE_USB_MOCK_USB_DEVICE_HANDLE_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -11,7 +11,7 @@
 #include <vector>
 
 #include "base/memory/ref_counted_memory.h"
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace device {
@@ -143,4 +143,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_MOCK_USB_DEVICE_HANDLE_H_
+#endif  // SERVICES_DEVICE_USB_MOCK_USB_DEVICE_HANDLE_H_
diff --git a/device/usb/mock_usb_service.cc b/services/device/usb/mock_usb_service.cc
similarity index 87%
rename from device/usb/mock_usb_service.cc
rename to services/device/usb/mock_usb_service.cc
index ebac38ea..6fe1a57 100644
--- a/device/usb/mock_usb_service.cc
+++ b/services/device/usb/mock_usb_service.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/mock_usb_service.h"
+#include "services/device/usb/mock_usb_service.h"
 
 #include <string>
 #include <vector>
 
 #include "base/threading/thread_task_runner_handle.h"
-#include "device/usb/usb_device.h"
+#include "services/device/usb/usb_device.h"
 
 namespace device {
 
diff --git a/device/usb/mock_usb_service.h b/services/device/usb/mock_usb_service.h
similarity index 70%
rename from device/usb/mock_usb_service.h
rename to services/device/usb/mock_usb_service.h
index 90603dae..6518f2e 100644
--- a/device/usb/mock_usb_service.h
+++ b/services/device/usb/mock_usb_service.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_MOCK_USB_SERVICE_H_
-#define DEVICE_USB_MOCK_USB_SERVICE_H_
+#ifndef SERVICES_DEVICE_USB_MOCK_USB_SERVICE_H_
+#define SERVICES_DEVICE_USB_MOCK_USB_SERVICE_H_
 
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_service.h"
 
 #include "testing/gmock/include/gmock/gmock.h"
 
@@ -22,4 +22,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_MOCK_USB_SERVICE_H_
+#endif  // SERVICES_DEVICE_USB_MOCK_USB_SERVICE_H_
diff --git a/device/usb/mojo/BUILD.gn b/services/device/usb/mojo/BUILD.gn
similarity index 77%
rename from device/usb/mojo/BUILD.gn
rename to services/device/usb/mojo/BUILD.gn
index ec9386e..53fab9b 100644
--- a/device/usb/mojo/BUILD.gn
+++ b/services/device/usb/mojo/BUILD.gn
@@ -15,13 +15,12 @@
   ]
 
   deps = [
-    "//device/base",
-    "//device/usb",
-    "//device/usb/public/cpp",
-    "//device/usb/public/mojom",
-    "//device/usb/public/mojom:test",
     "//mojo/public/cpp/bindings",
     "//net",
+    "//services/device/public/cpp/usb",
+    "//services/device/public/mojom:usb",
+    "//services/device/public/mojom:usb_test",
+    "//services/device/usb",
   ]
 
   if (is_chromeos) {
diff --git a/device/usb/mojo/device_impl.cc b/services/device/usb/mojo/device_impl.cc
similarity index 97%
rename from device/usb/mojo/device_impl.cc
rename to services/device/usb/mojo/device_impl.cc
index 49aa637f..d466128f 100644
--- a/device/usb/mojo/device_impl.cc
+++ b/services/device/usb/mojo/device_impl.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 "device/usb/mojo/device_impl.h"
+#include "services/device/usb/mojo/device_impl.h"
 
 #include <stddef.h>
 
@@ -17,10 +17,10 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/stl_util.h"
-#include "device/usb/mojo/type_converters.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/usb/mojo/type_converters.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device.h"
 
 namespace device {
 
diff --git a/device/usb/mojo/device_impl.h b/services/device/usb/mojo/device_impl.h
similarity index 93%
rename from device/usb/mojo/device_impl.h
rename to services/device/usb/mojo/device_impl.h
index e1d9994..e9f65ac3 100644
--- a/device/usb/mojo/device_impl.h
+++ b/services/device/usb/mojo/device_impl.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 DEVICE_USB_MOJO_DEVICE_IMPL_H_
-#define DEVICE_USB_MOJO_DEVICE_IMPL_H_
+#ifndef SERVICES_DEVICE_USB_MOJO_DEVICE_IMPL_H_
+#define SERVICES_DEVICE_USB_MOJO_DEVICE_IMPL_H_
 
 #include <stdint.h>
 #include <vector>
@@ -13,10 +13,10 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_device_handle.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_device_handle.h"
 
 namespace device {
 namespace usb {
@@ -114,4 +114,4 @@
 }  // namespace usb
 }  // namespace device
 
-#endif  // DEVICE_USB_MOJO_DEVICE_IMPL_H_
+#endif  // SERVICES_DEVICE_USB_MOJO_DEVICE_IMPL_H_
diff --git a/device/usb/mojo/device_impl_unittest.cc b/services/device/usb/mojo/device_impl_unittest.cc
similarity index 98%
rename from device/usb/mojo/device_impl_unittest.cc
rename to services/device/usb/mojo/device_impl_unittest.cc
index 0dd2eed..0cd64fc 100644
--- a/device/usb/mojo/device_impl_unittest.cc
+++ b/services/device/usb/mojo/device_impl_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 "device/usb/mojo/device_impl.h"
+#include "services/device/usb/mojo/device_impl.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -22,22 +22,22 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
-#include "device/usb/mock_usb_device.h"
-#include "device/usb/mock_usb_device_handle.h"
-#include "device/usb/mojo/type_converters.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "services/device/usb/mock_usb_device.h"
+#include "services/device/usb/mock_usb_device_handle.h"
+#include "services/device/usb/mojo/type_converters.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using ::testing::Invoke;
 using ::testing::_;
+using ::testing::Invoke;
 
 namespace device {
 
-using mojom::UsbIsochronousPacketPtr;
 using mojom::UsbControlTransferRecipient;
 using mojom::UsbControlTransferType;
 using mojom::UsbDevicePtr;
+using mojom::UsbIsochronousPacketPtr;
 
 namespace usb {
 
diff --git a/device/usb/mojo/device_manager_impl.cc b/services/device/usb/mojo/device_manager_impl.cc
similarity index 92%
rename from device/usb/mojo/device_manager_impl.cc
rename to services/device/usb/mojo/device_manager_impl.cc
index f4615aca..fe912cf 100644
--- a/device/usb/mojo/device_manager_impl.cc
+++ b/services/device/usb/mojo/device_manager_impl.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 "device/usb/mojo/device_manager_impl.h"
+#include "services/device/usb/mojo/device_manager_impl.h"
 
 #include <stddef.h>
 
@@ -13,18 +13,18 @@
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
-#include "device/usb/mojo/device_impl.h"
-#include "device/usb/mojo/type_converters.h"
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_service.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
+#include "services/device/usb/mojo/device_impl.h"
+#include "services/device/usb/mojo/type_converters.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_service.h"
 
 #if defined(OS_CHROMEOS)
 #include "chromeos/dbus/permission_broker/permission_broker_client.h"
-#include "device/usb/usb_device_linux.h"
+#include "services/device/usb/usb_device_linux.h"
 #endif  // defined(OS_CHROMEOS)
 
 namespace device {
diff --git a/device/usb/mojo/device_manager_impl.h b/services/device/usb/mojo/device_manager_impl.h
similarity index 92%
rename from device/usb/mojo/device_manager_impl.h
rename to services/device/usb/mojo/device_manager_impl.h
index af68490..b22c2b4 100644
--- a/device/usb/mojo/device_manager_impl.h
+++ b/services/device/usb/mojo/device_manager_impl.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 DEVICE_USB_MOJO_DEVICE_MANAGER_IMPL_H_
-#define DEVICE_USB_MOJO_DEVICE_MANAGER_IMPL_H_
+#ifndef SERVICES_DEVICE_USB_MOJO_DEVICE_MANAGER_IMPL_H_
+#define SERVICES_DEVICE_USB_MOJO_DEVICE_MANAGER_IMPL_H_
 
 #include <memory>
 #include <queue>
@@ -17,10 +17,10 @@
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
 #include "build/build_config.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/usb_service.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/interface_ptr_set.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/usb/usb_service.h"
 
 namespace device {
 
@@ -106,4 +106,4 @@
 }  // namespace usb
 }  // namespace device
 
-#endif  // DEVICE_USB_MOJO_DEVICE_MANAGER_IMPL_H_
+#endif  // SERVICES_DEVICE_USB_MOJO_DEVICE_MANAGER_IMPL_H_
diff --git a/device/usb/mojo/device_manager_impl_unittest.cc b/services/device/usb/mojo/device_manager_impl_unittest.cc
similarity index 94%
rename from device/usb/mojo/device_manager_impl_unittest.cc
rename to services/device/usb/mojo/device_manager_impl_unittest.cc
index 7dacc36b..3dcea39 100644
--- a/device/usb/mojo/device_manager_impl_unittest.cc
+++ b/services/device/usb/mojo/device_manager_impl_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 "device/usb/mojo/device_manager_impl.h"
+#include "services/device/usb/mojo/device_manager_impl.h"
 
 #include <stddef.h>
 
@@ -17,25 +17,25 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "device/usb/mock_usb_device.h"
-#include "device/usb/mock_usb_device_handle.h"
-#include "device/usb/mock_usb_service.h"
-#include "device/usb/mojo/device_impl.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
-#include "device/usb/public/mojom/device_manager_client.mojom.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
+#include "services/device/public/mojom/usb_manager_client.mojom.h"
+#include "services/device/usb/mock_usb_device.h"
+#include "services/device/usb/mock_usb_device_handle.h"
+#include "services/device/usb/mock_usb_service.h"
+#include "services/device/usb/mojo/device_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using ::testing::Invoke;
 using ::testing::_;
+using ::testing::Invoke;
 
 namespace device {
 
-using mojom::UsbDevicePtr;
 using mojom::UsbDeviceInfoPtr;
 using mojom::UsbDeviceManagerClientPtr;
 using mojom::UsbDeviceManagerPtr;
+using mojom::UsbDevicePtr;
 using mojom::UsbEnumerationOptionsPtr;
 
 namespace usb {
diff --git a/device/usb/mojo/device_manager_test.cc b/services/device/usb/mojo/device_manager_test.cc
similarity index 93%
rename from device/usb/mojo/device_manager_test.cc
rename to services/device/usb/mojo/device_manager_test.cc
index da45e9a..6cbad41 100644
--- a/device/usb/mojo/device_manager_test.cc
+++ b/services/device/usb/mojo/device_manager_test.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 "device/usb/mojo/device_manager_test.h"
+#include "services/device/usb/mojo/device_manager_test.h"
 
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_device_handle.h"
-#include "device/usb/webusb_descriptors.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_device_handle.h"
+#include "services/device/usb/webusb_descriptors.h"
 #include "url/gurl.h"
 
 namespace device {
diff --git a/device/usb/mojo/device_manager_test.h b/services/device/usb/mojo/device_manager_test.h
similarity index 82%
rename from device/usb/mojo/device_manager_test.h
rename to services/device/usb/mojo/device_manager_test.h
index eb23bde9..b7755d0 100644
--- a/device/usb/mojo/device_manager_test.h
+++ b/services/device/usb/mojo/device_manager_test.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_MOJO_DEVICE_MANAGER_TEST_H_
-#define DEVICE_USB_MOJO_DEVICE_MANAGER_TEST_H_
+#ifndef SERVICES_DEVICE_USB_MOJO_DEVICE_MANAGER_TEST_H_
+#define SERVICES_DEVICE_USB_MOJO_DEVICE_MANAGER_TEST_H_
 
 #include <string>
 
 #include "base/macros.h"
-#include "device/usb/public/mojom/device_manager_test.mojom.h"
-#include "device/usb/usb_service.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/device/public/mojom/usb_manager_test.mojom.h"
+#include "services/device/usb/usb_service.h"
 
 namespace device {
 namespace usb {
@@ -45,4 +45,4 @@
 }  // namespace usb
 }  // namespace device
 
-#endif  // DEVICE_USB_MOJO_DEVICE_MANAGER_TEST_H_
+#endif  // SERVICES_DEVICE_USB_MOJO_DEVICE_MANAGER_TEST_H_
diff --git a/device/usb/mojo/type_converters.cc b/services/device/usb/mojo/type_converters.cc
similarity index 96%
rename from device/usb/mojo/type_converters.cc
rename to services/device/usb/mojo/type_converters.cc
index 9f71bf3..c9d047e 100644
--- a/device/usb/mojo/type_converters.cc
+++ b/services/device/usb/mojo/type_converters.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 "device/usb/mojo/type_converters.h"
+#include "services/device/usb/mojo/type_converters.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -10,9 +10,9 @@
 #include <map>
 #include <utility>
 
-#include "device/usb/public/cpp/usb_utils.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device.h"
+#include "services/device/public/cpp/usb/usb_utils.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device.h"
 
 namespace mojo {
 
diff --git a/device/usb/mojo/type_converters.h b/services/device/usb/mojo/type_converters.h
similarity index 88%
rename from device/usb/mojo/type_converters.h
rename to services/device/usb/mojo/type_converters.h
index 219691f2..0fb1b1ad 100644
--- a/device/usb/mojo/type_converters.h
+++ b/services/device/usb/mojo/type_converters.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_MOJO_TYPE_CONVERTERS_H_
-#define DEVICE_USB_MOJO_TYPE_CONVERTERS_H_
+#ifndef SERVICES_DEVICE_USB_MOJO_TYPE_CONVERTERS_H_
+#define SERVICES_DEVICE_USB_MOJO_TYPE_CONVERTERS_H_
 
 #include <vector>
 
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/public/mojom/device_manager.mojom.h"
-#include "device/usb/usb_device_handle.h"
 #include "mojo/public/cpp/bindings/type_converter.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/public/mojom/usb_manager.mojom.h"
+#include "services/device/usb/usb_device_handle.h"
 
 // Type converters to translate between internal device/usb data types and
 // public Mojo interface data types. This must be included by any source file
@@ -21,7 +21,7 @@
 class UsbDevice;
 struct UsbEndpointDescriptor;
 struct UsbInterfaceDescriptor;
-}
+}  // namespace device
 
 namespace mojo {
 
@@ -83,4 +83,4 @@
 
 }  // namespace mojo
 
-#endif  // DEVICE_DEVICES_APP_USB_TYPE_CONVERTERS_H_
+#endif  // SERVICES_DEVICE_USB_MOJO_TYPE_CONVERTERS_H_
diff --git a/device/usb/scoped_libusb_device_handle.cc b/services/device/usb/scoped_libusb_device_handle.cc
similarity index 89%
rename from device/usb/scoped_libusb_device_handle.cc
rename to services/device/usb/scoped_libusb_device_handle.cc
index 4223a81..e61fab32 100644
--- a/device/usb/scoped_libusb_device_handle.cc
+++ b/services/device/usb/scoped_libusb_device_handle.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/scoped_libusb_device_handle.h"
+#include "services/device/usb/scoped_libusb_device_handle.h"
 
-#include "device/usb/usb_context.h"
+#include "services/device/usb/usb_context.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
 namespace device {
diff --git a/device/usb/scoped_libusb_device_handle.h b/services/device/usb/scoped_libusb_device_handle.h
similarity index 84%
rename from device/usb/scoped_libusb_device_handle.h
rename to services/device/usb/scoped_libusb_device_handle.h
index a4eb378..5164aaf8 100644
--- a/device/usb/scoped_libusb_device_handle.h
+++ b/services/device/usb/scoped_libusb_device_handle.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 DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
-#define DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
+#ifndef SERVICES_DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
+#define SERVICES_DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
 
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
@@ -38,4 +38,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
+#endif  // SERVICES_DEVICE_USB_SCOPED_LIBUSB_DEVICE_HANDLE_H_
diff --git a/device/usb/scoped_libusb_device_ref.cc b/services/device/usb/scoped_libusb_device_ref.cc
similarity index 90%
rename from device/usb/scoped_libusb_device_ref.cc
rename to services/device/usb/scoped_libusb_device_ref.cc
index b3ac5e8..5780102 100644
--- a/device/usb/scoped_libusb_device_ref.cc
+++ b/services/device/usb/scoped_libusb_device_ref.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/scoped_libusb_device_ref.h"
+#include "services/device/usb/scoped_libusb_device_ref.h"
 
-#include "device/usb/usb_context.h"
+#include "services/device/usb/usb_context.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
 namespace device {
diff --git a/device/usb/scoped_libusb_device_ref.h b/services/device/usb/scoped_libusb_device_ref.h
similarity index 86%
rename from device/usb/scoped_libusb_device_ref.h
rename to services/device/usb/scoped_libusb_device_ref.h
index 73a3731..d00d513c 100644
--- a/device/usb/scoped_libusb_device_ref.h
+++ b/services/device/usb/scoped_libusb_device_ref.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 DEVICE_USB_SCOPED_LIBUSB_DEVICE_REF_H_
-#define DEVICE_USB_SCOPED_LIBUSB_DEVICE_REF_H_
+#ifndef SERVICES_DEVICE_USB_SCOPED_LIBUSB_DEVICE_REF_H_
+#define SERVICES_DEVICE_USB_SCOPED_LIBUSB_DEVICE_REF_H_
 
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
@@ -42,4 +42,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_SCOPED_LIBUSB_DEVICE_REF_H_
+#endif  // SERVICES_DEVICE_USB_SCOPED_LIBUSB_DEVICE_REF_H_
diff --git a/device/usb/scoped_winusb_handle.cc b/services/device/usb/scoped_winusb_handle.cc
similarity index 86%
rename from device/usb/scoped_winusb_handle.cc
rename to services/device/usb/scoped_winusb_handle.cc
index f574cb3..ac9c0a0 100644
--- a/device/usb/scoped_winusb_handle.cc
+++ b/services/device/usb/scoped_winusb_handle.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 "device/usb/scoped_winusb_handle.h"
+#include "services/device/usb/scoped_winusb_handle.h"
 
 #include <windows.h>
 #include <winusb.h>
diff --git a/device/usb/scoped_winusb_handle.h b/services/device/usb/scoped_winusb_handle.h
similarity index 83%
rename from device/usb/scoped_winusb_handle.h
rename to services/device/usb/scoped_winusb_handle.h
index 04c9215..94e1fcf 100644
--- a/device/usb/scoped_winusb_handle.h
+++ b/services/device/usb/scoped_winusb_handle.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 DEVICE_USB_SCOPED_WINUSB_HANDLE_H_
-#define DEVICE_USB_SCOPED_WINUSB_HANDLE_H_
+#ifndef SERVICES_DEVICE_USB_SCOPED_WINUSB_HANDLE_H_
+#define SERVICES_DEVICE_USB_SCOPED_WINUSB_HANDLE_H_
 
 #include "base/win/scoped_handle.h"
 
@@ -35,4 +35,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_SCOPED_WINUSB_HANDLE_H_
+#endif  // SERVICES_DEVICE_USB_SCOPED_WINUSB_HANDLE_H_
diff --git a/device/usb/usb_configuration_android.cc b/services/device/usb/usb_configuration_android.cc
similarity index 91%
rename from device/usb/usb_configuration_android.cc
rename to services/device/usb/usb_configuration_android.cc
index 5171717..2b99d72 100644
--- a/device/usb/usb_configuration_android.cc
+++ b/services/device/usb/usb_configuration_android.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/usb_configuration_android.h"
+#include "services/device/usb/usb_configuration_android.h"
 
-#include "device/usb/usb_interface_android.h"
 #include "jni/ChromeUsbConfiguration_jni.h"
+#include "services/device/usb/usb_interface_android.h"
 
 using base::android::ScopedJavaLocalRef;
 
diff --git a/device/usb/usb_configuration_android.h b/services/device/usb/usb_configuration_android.h
similarity index 65%
rename from device/usb/usb_configuration_android.h
rename to services/device/usb/usb_configuration_android.h
index e939643..b4515a8 100644
--- a/device/usb/usb_configuration_android.h
+++ b/services/device/usb/usb_configuration_android.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_USB_CONFIGURATION_ANDROID_H_
-#define DEVICE_USB_USB_CONFIGURATION_ANDROID_H_
+#ifndef SERVICES_DEVICE_USB_USB_CONFIGURATION_ANDROID_H_
+#define SERVICES_DEVICE_USB_USB_CONFIGURATION_ANDROID_H_
 
 #include "base/android/scoped_java_ref.h"
-#include "device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_descriptors.h"
 
 namespace device {
 
@@ -19,4 +19,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_CONFIGURATION_ANDROID_H_
+#endif  // SERVICES_DEVICE_USB_USB_CONFIGURATION_ANDROID_H_
diff --git a/device/usb/usb_context.cc b/services/device/usb/usb_context.cc
similarity index 95%
rename from device/usb/usb_context.cc
rename to services/device/usb/usb_context.cc
index 6959fab0..304be8f1 100644
--- a/device/usb/usb_context.cc
+++ b/services/device/usb/usb_context.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/usb_context.h"
+#include "services/device/usb/usb_context.h"
 
 #include "base/atomicops.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/threading/simple_thread.h"
-#include "device/usb/usb_error.h"
+#include "services/device/usb/usb_error.h"
 #include "third_party/libusb/src/libusb/interrupt.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
diff --git a/device/usb/usb_context.h b/services/device/usb/usb_context.h
similarity index 88%
rename from device/usb/usb_context.h
rename to services/device/usb/usb_context.h
index 4c0304a..8e10778 100644
--- a/device/usb/usb_context.h
+++ b/services/device/usb/usb_context.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 DEVICE_USB_USB_CONTEXT_H_
-#define DEVICE_USB_USB_CONTEXT_H_
+#ifndef SERVICES_DEVICE_USB_USB_CONTEXT_H_
+#define SERVICES_DEVICE_USB_USB_CONTEXT_H_
 
 #include <memory>
 
@@ -43,4 +43,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_CONTEXT_H_
+#endif  // SERVICES_DEVICE_USB_USB_CONTEXT_H_
diff --git a/device/usb/usb_context_unittest.cc b/services/device/usb/usb_context_unittest.cc
similarity index 96%
rename from device/usb/usb_context_unittest.cc
rename to services/device/usb/usb_context_unittest.cc
index 1ad9426..a82944c 100644
--- a/device/usb/usb_context_unittest.cc
+++ b/services/device/usb/usb_context_unittest.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "services/device/usb/usb_context.h"
 #include "base/macros.h"
 #include "base/threading/platform_thread.h"
 #include "build/build_config.h"
-#include "device/usb/usb_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
diff --git a/device/usb/usb_descriptors.cc b/services/device/usb/usb_descriptors.cc
similarity index 99%
rename from device/usb/usb_descriptors.cc
rename to services/device/usb/usb_descriptors.cc
index 8a385d8..950f365e 100644
--- a/device/usb/usb_descriptors.cc
+++ b/services/device/usb/usb_descriptors.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 "device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_descriptors.h"
 
 #include <stddef.h>
 
@@ -15,7 +15,7 @@
 #include "base/barrier_closure.h"
 #include "base/bind.h"
 #include "base/memory/ref_counted_memory.h"
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 
 namespace device {
 
diff --git a/device/usb/usb_descriptors.h b/services/device/usb/usb_descriptors.h
similarity index 95%
rename from device/usb/usb_descriptors.h
rename to services/device/usb/usb_descriptors.h
index 6f28f65..ffd168ae1 100644
--- a/device/usb/usb_descriptors.h
+++ b/services/device/usb/usb_descriptors.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 DEVICE_USB_USB_DESCRIPTORS_H_
-#define DEVICE_USB_USB_DESCRIPTORS_H_
+#ifndef SERVICES_DEVICE_USB_USB_DESCRIPTORS_H_
+#define SERVICES_DEVICE_USB_USB_DESCRIPTORS_H_
 
 #include <stdint.h>
 
@@ -14,7 +14,7 @@
 #include "base/callback_forward.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
-#include "device/usb/public/mojom/device.mojom.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
 
 namespace device {
 
@@ -130,4 +130,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DESCRIPTORS_H_
+#endif  // SERVICES_DEVICE_USB_USB_DESCRIPTORS_H_
diff --git a/device/usb/usb_descriptors_fuzzer.cc b/services/device/usb/usb_descriptors_fuzzer.cc
similarity index 75%
rename from device/usb/usb_descriptors_fuzzer.cc
rename to services/device/usb/usb_descriptors_fuzzer.cc
index 32642c0c..ba998f3 100644
--- a/device/usb/usb_descriptors_fuzzer.cc
+++ b/services/device/usb/usb_descriptors_fuzzer.cc
@@ -7,9 +7,9 @@
 
 #include <vector>
 
-#include "device/usb/mojo/type_converters.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/usb_descriptors.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/usb/mojo/type_converters.h"
+#include "services/device/usb/usb_descriptors.h"
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   device::UsbDeviceDescriptor desc;
diff --git a/device/usb/usb_descriptors_unittest.cc b/services/device/usb/usb_descriptors_unittest.cc
similarity index 98%
rename from device/usb/usb_descriptors_unittest.cc
rename to services/device/usb/usb_descriptors_unittest.cc
index 6334f60..be922f17 100644
--- a/device/usb/usb_descriptors_unittest.cc
+++ b/services/device/usb/usb_descriptors_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 "device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_descriptors.h"
 
 #include <stdint.h>
 
@@ -13,7 +13,7 @@
 
 #include "base/bind.h"
 #include "base/strings/utf_string_conversions.h"
-#include "device/usb/mock_usb_device_handle.h"
+#include "services/device/usb/mock_usb_device_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
@@ -36,6 +36,7 @@
   EXPECT_EQ(base::ASCIIToUTF16("String 3"), (*string_map)[3]);
 }
 
+// clang-format off
 const uint8_t kDeviceDescriptor[] = {0x12, 0x01, 0x10, 0x03, 0xFF, 0xFF,
                                      0xFF, 0x09, 0x34, 0x12, 0x78, 0x56,
                                      0x00, 0x01, 0x01, 0x02, 0x03, 0x02};
@@ -69,6 +70,7 @@
     // Endpoint 2 OUT
     0x07, 0x05, 0x02, 0x11, 0x00, 0x04, 0x08,
 };
+// clang-format on
 
 void ExpectConfig1Descriptor(const UsbConfigDescriptor& config) {
   // Config 1
diff --git a/device/usb/usb_device.cc b/services/device/usb/usb_device.cc
similarity index 91%
rename from device/usb/usb_device.cc
rename to services/device/usb/usb_device.cc
index 59e260aa..908044c 100644
--- a/device/usb/usb_device.cc
+++ b/services/device/usb/usb_device.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/usb_device.h"
+#include "services/device/usb/usb_device.h"
 
 #include "base/guid.h"
-#include "device/usb/usb_device_handle.h"
-#include "device/usb/webusb_descriptors.h"
+#include "services/device/usb/usb_device_handle.h"
+#include "services/device/usb/webusb_descriptors.h"
 
 namespace device {
 
@@ -23,7 +23,8 @@
                      const base::string16& manufacturer_string,
                      const base::string16& product_string,
                      const base::string16& serial_number,
-                     uint32_t bus_number, uint32_t port_number)
+                     uint32_t bus_number,
+                     uint32_t port_number)
     : descriptor_(descriptor),
       manufacturer_string_(manufacturer_string),
       product_string_(product_string),
@@ -42,7 +43,8 @@
                      const base::string16& manufacturer_string,
                      const base::string16& product_string,
                      const base::string16& serial_number,
-                     uint32_t bus_number, uint32_t port_number)
+                     uint32_t bus_number,
+                     uint32_t port_number)
     : manufacturer_string_(manufacturer_string),
       product_string_(product_string),
       serial_number_(serial_number),
diff --git a/device/usb/usb_device.h b/services/device/usb/usb_device.h
similarity index 94%
rename from device/usb/usb_device.h
rename to services/device/usb/usb_device.h
index 41a8eb3..aed0de5a 100644
--- a/device/usb/usb_device.h
+++ b/services/device/usb/usb_device.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 DEVICE_USB_USB_DEVICE_H_
-#define DEVICE_USB_USB_DEVICE_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_H_
 
 #include <stdint.h>
 
@@ -17,7 +17,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/observer_list.h"
 #include "base/strings/string16.h"
-#include "device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_descriptors.h"
 #include "url/gurl.h"
 
 namespace device {
@@ -99,7 +99,8 @@
             const base::string16& manufacturer_string,
             const base::string16& product_string,
             const base::string16& serial_number,
-            uint32_t bus_number, uint32_t port_number);
+            uint32_t bus_number,
+            uint32_t port_number);
   UsbDevice(uint16_t usb_version,
             uint8_t device_class,
             uint8_t device_subclass,
@@ -110,7 +111,8 @@
             const base::string16& manufacturer_string,
             const base::string16& product_string,
             const base::string16& serial_number,
-            uint32_t bus_number, uint32_t port_number);
+            uint32_t bus_number,
+            uint32_t port_number);
   virtual ~UsbDevice();
 
   void ActiveConfigurationChanged(int configuration_value);
@@ -161,4 +163,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_H_
diff --git a/device/usb/usb_device_android.cc b/services/device/usb/usb_device_android.cc
similarity index 86%
rename from device/usb/usb_device_android.cc
rename to services/device/usb/usb_device_android.cc
index cd707a2..25fe940 100644
--- a/device/usb/usb_device_android.cc
+++ b/services/device/usb/usb_device_android.cc
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/usb_device_android.h"
+#include "services/device/usb/usb_device_android.h"
 
 #include "base/android/build_info.h"
 #include "base/android/jni_string.h"
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "device/usb/usb_configuration_android.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device_handle_android.h"
-#include "device/usb/usb_interface_android.h"
-#include "device/usb/usb_service_android.h"
-#include "device/usb/webusb_descriptors.h"
 #include "jni/ChromeUsbDevice_jni.h"
+#include "services/device/usb/usb_configuration_android.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device_handle_android.h"
+#include "services/device/usb/usb_interface_android.h"
+#include "services/device/usb/usb_service_android.h"
+#include "services/device/usb/webusb_descriptors.h"
 
 using base::android::ConvertJavaStringToUTF16;
 using base::android::JavaRef;
@@ -97,20 +97,19 @@
   return permission_granted_;
 }
 
-UsbDeviceAndroid::UsbDeviceAndroid(
-    JNIEnv* env,
-    base::WeakPtr<UsbServiceAndroid> service,
-    uint16_t usb_version,
-    uint8_t device_class,
-    uint8_t device_subclass,
-    uint8_t device_protocol,
-    uint16_t vendor_id,
-    uint16_t product_id,
-    uint16_t device_version,
-    const base::string16& manufacturer_string,
-    const base::string16& product_string,
-    const base::string16& serial_number,
-    const JavaRef<jobject>& wrapper)
+UsbDeviceAndroid::UsbDeviceAndroid(JNIEnv* env,
+                                   base::WeakPtr<UsbServiceAndroid> service,
+                                   uint16_t usb_version,
+                                   uint8_t device_class,
+                                   uint8_t device_subclass,
+                                   uint8_t device_protocol,
+                                   uint16_t vendor_id,
+                                   uint16_t product_id,
+                                   uint16_t device_version,
+                                   const base::string16& manufacturer_string,
+                                   const base::string16& product_string,
+                                   const base::string16& serial_number,
+                                   const JavaRef<jobject>& wrapper)
     : UsbDevice(usb_version,
                 device_class,
                 device_subclass,
@@ -125,7 +124,8 @@
                 // UsbDevice class doesn't offer an interface for getting these
                 // values, and nothing on Android seems to require them at this
                 // time (23-Nov-2018)
-                0, 0),
+                0,
+                0),
       device_id_(Java_ChromeUsbDevice_getDeviceId(env, wrapper)),
       service_(service),
       j_object_(wrapper) {
diff --git a/services/device/usb/usb_device_android.h b/services/device/usb/usb_device_android.h
new file mode 100644
index 0000000..3a2bb66
--- /dev/null
+++ b/services/device/usb/usb_device_android.h
@@ -0,0 +1,66 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_ANDROID_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_ANDROID_H_
+
+#include "base/android/scoped_java_ref.h"
+#include "base/memory/weak_ptr.h"
+#include "services/device/usb/usb_device.h"
+
+namespace device {
+
+class UsbServiceAndroid;
+
+class UsbDeviceAndroid : public UsbDevice {
+ public:
+  static scoped_refptr<UsbDeviceAndroid> Create(
+      JNIEnv* env,
+      base::WeakPtr<UsbServiceAndroid> service,
+      const base::android::JavaRef<jobject>& usb_device);
+
+  // UsbDevice:
+  void RequestPermission(ResultCallback callback) override;
+  bool permission_granted() const override;
+  void Open(OpenCallback callback) override;
+
+  jint device_id() const { return device_id_; }
+  void PermissionGranted(JNIEnv* env, bool granted);
+
+ private:
+  UsbDeviceAndroid(JNIEnv* env,
+                   base::WeakPtr<UsbServiceAndroid> service,
+                   uint16_t usb_version,
+                   uint8_t device_class,
+                   uint8_t device_subclass,
+                   uint8_t device_protocol,
+                   uint16_t vendor_id,
+                   uint16_t product_id,
+                   uint16_t device_version,
+                   const base::string16& manufacturer_string,
+                   const base::string16& product_string,
+                   const base::string16& serial_number,
+                   const base::android::JavaRef<jobject>& wrapper);
+  ~UsbDeviceAndroid() override;
+
+  void CallRequestPermissionCallbacks(bool granted);
+  void OnDeviceOpenedToReadDescriptors(
+      scoped_refptr<UsbDeviceHandle> device_handle);
+  void OnReadDescriptors(scoped_refptr<UsbDeviceHandle> device_handle,
+                         std::unique_ptr<UsbDeviceDescriptor> descriptor);
+  void OnReadWebUsbDescriptors(scoped_refptr<UsbDeviceHandle> device_handle,
+                               const GURL& landing_page);
+
+  const jint device_id_;
+  bool permission_granted_ = false;
+  std::list<ResultCallback> request_permission_callbacks_;
+  base::WeakPtr<UsbServiceAndroid> service_;
+
+  // Java object org.chromium.device.usb.ChromeUsbDevice.
+  base::android::ScopedJavaGlobalRef<jobject> j_object_;
+};
+
+}  // namespace device
+
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_ANDROID_H_
diff --git a/device/usb/usb_device_handle.cc b/services/device/usb/usb_device_handle.cc
similarity index 85%
rename from device/usb/usb_device_handle.cc
rename to services/device/usb/usb_device_handle.cc
index b57d99e..e273d5d 100644
--- a/device/usb/usb_device_handle.cc
+++ b/services/device/usb/usb_device_handle.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 "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 
 namespace device {
 
diff --git a/device/usb/usb_device_handle.h b/services/device/usb/usb_device_handle.h
similarity index 93%
rename from device/usb/usb_device_handle.h
rename to services/device/usb/usb_device_handle.h
index d9d2bfe..e2f7d781 100644
--- a/device/usb/usb_device_handle.h
+++ b/services/device/usb/usb_device_handle.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 DEVICE_USB_USB_DEVICE_HANDLE_H_
-#define DEVICE_USB_USB_DEVICE_HANDLE_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -15,8 +15,8 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
-#include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/usb_descriptors.h"
+#include "services/device/public/mojom/usb_device.mojom.h"
+#include "services/device/usb/usb_descriptors.h"
 
 namespace base {
 class RefCountedBytes;
@@ -114,4 +114,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_HANDLE_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_H_
diff --git a/device/usb/usb_device_handle_android.cc b/services/device/usb/usb_device_handle_android.cc
similarity index 91%
rename from device/usb/usb_device_handle_android.cc
rename to services/device/usb/usb_device_handle_android.cc
index c4855709..8f38771 100644
--- a/device/usb/usb_device_handle_android.cc
+++ b/services/device/usb/usb_device_handle_android.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/usb_device_handle_android.h"
+#include "services/device/usb/usb_device_handle_android.h"
 
 #include "base/bind.h"
 #include "base/location.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_service.h"
 #include "jni/ChromeUsbConnection_jni.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_service.h"
 
 using base::android::ScopedJavaLocalRef;
 
diff --git a/device/usb/usb_device_handle_android.h b/services/device/usb/usb_device_handle_android.h
similarity index 71%
rename from device/usb/usb_device_handle_android.h
rename to services/device/usb/usb_device_handle_android.h
index 6e7a51c..01430022 100644
--- a/device/usb/usb_device_handle_android.h
+++ b/services/device/usb/usb_device_handle_android.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 DEVICE_USB_USB_DEVICE_HANDLE_ANDROID_H_
-#define DEVICE_USB_USB_DEVICE_HANDLE_ANDROID_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_ANDROID_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_ANDROID_H_
 
 #include "base/android/scoped_java_ref.h"
 #include "base/memory/ref_counted.h"
-#include "device/usb/usb_device_handle_usbfs.h"
+#include "services/device/usb/usb_device_handle_usbfs.h"
 
 namespace device {
 
@@ -24,10 +24,9 @@
 
  private:
   // |wrapper| is an instance of org.chromium.device.usb.ChromeUsbConnection.
-  UsbDeviceHandleAndroid(
-      scoped_refptr<UsbDevice> device,
-      base::ScopedFD fd,
-      const base::android::JavaRef<jobject>& wrapper);
+  UsbDeviceHandleAndroid(scoped_refptr<UsbDevice> device,
+                         base::ScopedFD fd,
+                         const base::android::JavaRef<jobject>& wrapper);
   ~UsbDeviceHandleAndroid() override;
 
   // UsbDeviceHandleUsbfs:
@@ -41,4 +40,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_HANDLE_ANDROID_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_ANDROID_H_
diff --git a/device/usb/usb_device_handle_impl.cc b/services/device/usb/usb_device_handle_impl.cc
similarity index 98%
rename from device/usb/usb_device_handle_impl.cc
rename to services/device/usb/usb_device_handle_impl.cc
index 2f3d871..7a9c7c9f 100644
--- a/device/usb/usb_device_handle_impl.cc
+++ b/services/device/usb/usb_device_handle_impl.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 "device/usb/usb_device_handle_impl.h"
+#include "services/device/usb/usb_device_handle_impl.h"
 
 #include <algorithm>
 #include <memory>
@@ -22,11 +22,11 @@
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_context.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device_impl.h"
-#include "device/usb/usb_error.h"
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_context.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device_impl.h"
+#include "services/device/usb/usb_error.h"
+#include "services/device/usb/usb_service.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
 namespace device {
diff --git a/device/usb/usb_device_handle_impl.h b/services/device/usb/usb_device_handle_impl.h
similarity index 94%
rename from device/usb/usb_device_handle_impl.h
rename to services/device/usb/usb_device_handle_impl.h
index eafaa224..14db011 100644
--- a/device/usb/usb_device_handle_impl.h
+++ b/services/device/usb/usb_device_handle_impl.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 DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
-#define DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -17,14 +17,14 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequence_checker.h"
-#include "device/usb/scoped_libusb_device_handle.h"
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/scoped_libusb_device_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
 namespace base {
 class RefCountedBytes;
 class SequencedTaskRunner;
-}
+}  // namespace base
 
 namespace device {
 
@@ -162,4 +162,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_IMPL_H_
diff --git a/device/usb/usb_device_handle_unittest.cc b/services/device/usb/usb_device_handle_unittest.cc
similarity index 98%
rename from device/usb/usb_device_handle_unittest.cc
rename to services/device/usb/usb_device_handle_unittest.cc
index a082b46..bfee391 100644
--- a/device/usb/usb_device_handle_unittest.cc
+++ b/services/device/usb/usb_device_handle_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 "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 
 #include <stddef.h>
 
@@ -14,9 +14,9 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_io_thread.h"
-#include "device/test/usb_test_gadget.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_service.h"
+#include "services/device/test/usb_test_gadget.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace device {
diff --git a/device/usb/usb_device_handle_usbfs.cc b/services/device/usb/usb_device_handle_usbfs.cc
similarity index 98%
rename from device/usb/usb_device_handle_usbfs.cc
rename to services/device/usb/usb_device_handle_usbfs.cc
index 7fc1b19..e40ba78 100644
--- a/device/usb/usb_device_handle_usbfs.cc
+++ b/services/device/usb/usb_device_handle_usbfs.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 "device/usb/usb_device_handle_usbfs.h"
+#include "services/device/usb/usb_device_handle_usbfs.h"
 
 #include <linux/usb/ch9.h>
 
@@ -22,7 +22,7 @@
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_device_linux.h"
+#include "services/device/usb/usb_device_linux.h"
 
 namespace device {
 
@@ -377,8 +377,9 @@
     scoped_refptr<base::RefCountedBytes> buffer,
     IsochronousTransferCallback callback)
     : buffer(buffer), isoc_callback(std::move(callback)) {
-  memset(&urb, 0, sizeof(urb) +
-                      sizeof(usbdevfs_iso_packet_desc) * urb.number_of_packets);
+  memset(
+      &urb, 0,
+      sizeof(urb) + sizeof(usbdevfs_iso_packet_desc) * urb.number_of_packets);
   urb.usercontext = this;
   urb.buffer = buffer->front();
 }
@@ -388,8 +389,8 @@
 void* UsbDeviceHandleUsbfs::Transfer::operator new(
     std::size_t size,
     size_t number_of_iso_packets) {
-  void* p = ::operator new(
-      size + sizeof(usbdevfs_iso_packet_desc) * number_of_iso_packets);
+  void* p = ::operator new(size + sizeof(usbdevfs_iso_packet_desc) *
+                                      number_of_iso_packets);
   Transfer* transfer = static_cast<Transfer*>(p);
   transfer->urb.number_of_packets = number_of_iso_packets;
   return p;
diff --git a/device/usb/usb_device_handle_usbfs.h b/services/device/usb/usb_device_handle_usbfs.h
similarity index 96%
rename from device/usb/usb_device_handle_usbfs.h
rename to services/device/usb/usb_device_handle_usbfs.h
index c0e36a02..2458383 100644
--- a/device/usb/usb_device_handle_usbfs.h
+++ b/services/device/usb/usb_device_handle_usbfs.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 DEVICE_USB_USB_DEVICE_HANDLE_USBFS_H_
-#define DEVICE_USB_USB_DEVICE_HANDLE_USBFS_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_USBFS_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_USBFS_H_
 
 #include <list>
 #include <map>
@@ -13,7 +13,7 @@
 #include "base/files/scoped_file.h"
 #include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 
 struct usbdevfs_urb;
 
@@ -146,4 +146,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_HANDLE_USBFS_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_USBFS_H_
diff --git a/device/usb/usb_device_handle_win.cc b/services/device/usb/usb_device_handle_win.cc
similarity index 98%
rename from device/usb/usb_device_handle_win.cc
rename to services/device/usb/usb_device_handle_win.cc
index c4f07b7..9dbd2c3d 100644
--- a/device/usb/usb_device_handle_win.cc
+++ b/services/device/usb/usb_device_handle_win.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 "device/usb/usb_device_handle_win.h"
+#include "services/device/usb/usb_device_handle_win.h"
 
 #include <windows.h>  // Must be in front of other Windows header files.
 
@@ -28,10 +28,10 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/win/object_watcher.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_context.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device_win.h"
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_context.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device_win.h"
+#include "services/device/usb/usb_service.h"
 
 namespace device {
 
diff --git a/device/usb/usb_device_handle_win.h b/services/device/usb/usb_device_handle_win.h
similarity index 91%
rename from device/usb/usb_device_handle_win.h
rename to services/device/usb/usb_device_handle_win.h
index 7b21770bb..2bead587 100644
--- a/device/usb/usb_device_handle_win.h
+++ b/services/device/usb/usb_device_handle_win.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 DEVICE_USB_USB_DEVICE_HANDLE_WIN_H_
-#define DEVICE_USB_USB_DEVICE_HANDLE_WIN_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_WIN_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_WIN_H_
 
 #include <map>
 #include <vector>
@@ -14,13 +14,13 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/win/scoped_handle.h"
-#include "device/usb/scoped_winusb_handle.h"
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/scoped_winusb_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 
 namespace base {
 class RefCountedBytes;
 class SequencedTaskRunner;
-}
+}  // namespace base
 
 namespace device {
 
@@ -130,12 +130,11 @@
       Request* request_ptr,
       DWORD win32_result,
       size_t bytes_transferred);
-  void TransferComplete(
-      TransferCallback callback,
-      scoped_refptr<base::RefCountedBytes> buffer,
-      Request* request_ptr,
-      DWORD win32_result,
-      size_t bytes_transferred);
+  void TransferComplete(TransferCallback callback,
+                        scoped_refptr<base::RefCountedBytes> buffer,
+                        Request* request_ptr,
+                        DWORD win32_result,
+                        size_t bytes_transferred);
   void ReportIsochronousError(const std::vector<uint32_t>& packet_lengths,
                               IsochronousTransferCallback callback,
                               UsbTransferStatus status);
@@ -168,4 +167,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_HANDLE_WIN_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_HANDLE_WIN_H_
diff --git a/device/usb/usb_device_impl.cc b/services/device/usb/usb_device_impl.cc
similarity index 94%
rename from device/usb/usb_device_impl.cc
rename to services/device/usb/usb_device_impl.cc
index 19f64dc..0e66b451 100644
--- a/device/usb/usb_device_impl.cc
+++ b/services/device/usb/usb_device_impl.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 "device/usb/usb_device_impl.h"
+#include "services/device/usb/usb_device_impl.h"
 
 #include <fcntl.h>
 #include <stddef.h>
@@ -19,11 +19,11 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_context.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device_handle_impl.h"
-#include "device/usb/usb_error.h"
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_context.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device_handle_impl.h"
+#include "services/device/usb/usb_error.h"
+#include "services/device/usb/usb_service.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
 namespace device {
diff --git a/device/usb/usb_device_impl.h b/services/device/usb/usb_device_impl.h
similarity index 88%
rename from device/usb/usb_device_impl.h
rename to services/device/usb/usb_device_impl.h
index 9e5dc1a6..7eefece 100644
--- a/device/usb/usb_device_impl.h
+++ b/services/device/usb/usb_device_impl.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 DEVICE_USB_USB_DEVICE_IMPL_H_
-#define DEVICE_USB_USB_DEVICE_IMPL_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_IMPL_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_IMPL_H_
 
 #include <stdint.h>
 
@@ -17,9 +17,9 @@
 #include "base/macros.h"
 #include "base/sequence_checker.h"
 #include "build/build_config.h"
-#include "device/usb/scoped_libusb_device_ref.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device.h"
+#include "services/device/usb/scoped_libusb_device_ref.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device.h"
 
 struct libusb_device_descriptor;
 
@@ -88,4 +88,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_IMPL_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_IMPL_H_
diff --git a/device/usb/usb_device_linux.cc b/services/device/usb/usb_device_linux.cc
similarity index 91%
rename from device/usb/usb_device_linux.cc
rename to services/device/usb/usb_device_linux.cc
index 6085eedb..73345ea8 100644
--- a/device/usb/usb_device_linux.cc
+++ b/services/device/usb/usb_device_linux.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 "device/usb/usb_device_linux.h"
+#include "services/device/usb/usb_device_linux.h"
 
 #include <fcntl.h>
 #include <stddef.h>
@@ -16,13 +16,13 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device_handle_usbfs.h"
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device_handle_usbfs.h"
+#include "services/device/usb/usb_service.h"
 
 #if defined(OS_CHROMEOS)
 #include "chromeos/dbus/permission_broker/permission_broker_client.h"
-#endif                             // defined(OS_CHROMEOS)
+#endif  // defined(OS_CHROMEOS)
 
 namespace device {
 
@@ -32,12 +32,14 @@
                                const std::string& product_string,
                                const std::string& serial_number,
                                uint8_t active_configuration,
-                               uint32_t bus_number, uint32_t port_number)
+                               uint32_t bus_number,
+                               uint32_t port_number)
     : UsbDevice(descriptor,
                 base::UTF8ToUTF16(manufacturer_string),
                 base::UTF8ToUTF16(product_string),
                 base::UTF8ToUTF16(serial_number),
-                bus_number, port_number),
+                bus_number,
+                port_number),
       device_path_(device_path) {
   ActiveConfigurationChanged(active_configuration);
 }
diff --git a/device/usb/usb_device_linux.h b/services/device/usb/usb_device_linux.h
similarity index 88%
rename from device/usb/usb_device_linux.h
rename to services/device/usb/usb_device_linux.h
index 19cfc8ef..935a88f2 100644
--- a/device/usb/usb_device_linux.h
+++ b/services/device/usb/usb_device_linux.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 DEVICE_USB_USB_DEVICE_LINUX_H_
-#define DEVICE_USB_USB_DEVICE_LINUX_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_LINUX_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_LINUX_H_
 
 #include <stdint.h>
 
@@ -14,7 +14,7 @@
 #include "base/macros.h"
 #include "base/sequence_checker.h"
 #include "build/build_config.h"
-#include "device/usb/usb_device.h"
+#include "services/device/usb/usb_device.h"
 
 namespace base {
 class SequencedTaskRunner;
@@ -48,7 +48,8 @@
                  const std::string& product_string,
                  const std::string& serial_number,
                  uint8_t active_configuration,
-                 uint32_t bus_number, uint32_t port_number);
+                 uint32_t bus_number,
+                 uint32_t port_number);
 
   ~UsbDeviceLinux() override;
 
@@ -77,4 +78,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_LINUX_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_LINUX_H_
diff --git a/device/usb/usb_device_win.cc b/services/device/usb/usb_device_win.cc
similarity index 96%
rename from device/usb/usb_device_win.cc
rename to services/device/usb/usb_device_win.cc
index 2f8ab07..c8f5616 100644
--- a/device/usb/usb_device_win.cc
+++ b/services/device/usb/usb_device_win.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 "device/usb/usb_device_win.h"
+#include "services/device/usb/usb_device_win.h"
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
@@ -11,8 +11,8 @@
 #include "base/strings/string_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_device_handle_win.h"
-#include "device/usb/webusb_descriptors.h"
+#include "services/device/usb/usb_device_handle_win.h"
+#include "services/device/usb/webusb_descriptors.h"
 
 #include <windows.h>
 
diff --git a/device/usb/usb_device_win.h b/services/device/usb/usb_device_win.h
similarity index 91%
rename from device/usb/usb_device_win.h
rename to services/device/usb/usb_device_win.h
index aa44a19..a72f3b0c 100644
--- a/device/usb/usb_device_win.h
+++ b/services/device/usb/usb_device_win.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_USB_DEVICE_WIN_H_
-#define DEVICE_USB_USB_DEVICE_WIN_H_
+#ifndef SERVICES_DEVICE_USB_USB_DEVICE_WIN_H_
+#define SERVICES_DEVICE_USB_USB_DEVICE_WIN_H_
 
 #include <string>
 
 #include "base/macros.h"
 #include "base/sequence_checker.h"
-#include "device/usb/usb_device.h"
+#include "services/device/usb/usb_device.h"
 
 namespace device {
 
@@ -67,4 +67,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_DEVICE_WIN_H_
+#endif  // SERVICES_DEVICE_USB_USB_DEVICE_WIN_H_
diff --git a/device/usb/usb_endpoint_android.cc b/services/device/usb/usb_endpoint_android.cc
similarity index 93%
rename from device/usb/usb_endpoint_android.cc
rename to services/device/usb/usb_endpoint_android.cc
index a5eff76c..d0dcc2f 100644
--- a/device/usb/usb_endpoint_android.cc
+++ b/services/device/usb/usb_endpoint_android.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 "device/usb/usb_endpoint_android.h"
+#include "services/device/usb/usb_endpoint_android.h"
 
 #include "jni/ChromeUsbEndpoint_jni.h"
 
diff --git a/device/usb/usb_endpoint_android.h b/services/device/usb/usb_endpoint_android.h
similarity index 66%
rename from device/usb/usb_endpoint_android.h
rename to services/device/usb/usb_endpoint_android.h
index e56e514..44542f3 100644
--- a/device/usb/usb_endpoint_android.h
+++ b/services/device/usb/usb_endpoint_android.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_USB_ENDPOINT_ANDROID_H_
-#define DEVICE_USB_USB_ENDPOINT_ANDROID_H_
+#ifndef SERVICES_DEVICE_USB_USB_ENDPOINT_ANDROID_H_
+#define SERVICES_DEVICE_USB_USB_ENDPOINT_ANDROID_H_
 
 #include "base/android/scoped_java_ref.h"
-#include "device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_descriptors.h"
 
 namespace device {
 
@@ -19,4 +19,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_ENDPOINT_ANDROID_H_
+#endif  // SERVICES_DEVICE_USB_USB_ENDPOINT_ANDROID_H_
diff --git a/device/usb/usb_error.cc b/services/device/usb/usb_error.cc
similarity index 89%
rename from device/usb/usb_error.cc
rename to services/device/usb/usb_error.cc
index 9fadb16..8da0097 100644
--- a/device/usb/usb_error.cc
+++ b/services/device/usb/usb_error.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 "device/usb/usb_error.h"
+#include "services/device/usb/usb_error.h"
 
 #include "third_party/libusb/src/libusb/libusb.h"
 
diff --git a/device/usb/usb_error.h b/services/device/usb/usb_error.h
similarity index 77%
rename from device/usb/usb_error.h
rename to services/device/usb/usb_error.h
index 590c450..c5278ae 100644
--- a/device/usb/usb_error.h
+++ b/services/device/usb/usb_error.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 DEVICE_USB_USB_ERROR_H_
-#define DEVICE_USB_USB_ERROR_H_
+#ifndef SERVICES_DEVICE_USB_USB_ERROR_H_
+#define SERVICES_DEVICE_USB_USB_ERROR_H_
 
 #include <string>
 
@@ -15,4 +15,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_ERROR_H_
+#endif  // SERVICES_DEVICE_USB_USB_ERROR_H_
diff --git a/device/usb/usb_interface_android.cc b/services/device/usb/usb_interface_android.cc
similarity index 93%
rename from device/usb/usb_interface_android.cc
rename to services/device/usb/usb_interface_android.cc
index a3df7041..6e2f347 100644
--- a/device/usb/usb_interface_android.cc
+++ b/services/device/usb/usb_interface_android.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "device/usb/usb_interface_android.h"
+#include "services/device/usb/usb_interface_android.h"
 
 #include "base/android/build_info.h"
-#include "device/usb/usb_endpoint_android.h"
 #include "jni/ChromeUsbInterface_jni.h"
+#include "services/device/usb/usb_endpoint_android.h"
 
 using base::android::ScopedJavaLocalRef;
 
diff --git a/device/usb/usb_interface_android.h b/services/device/usb/usb_interface_android.h
similarity index 66%
rename from device/usb/usb_interface_android.h
rename to services/device/usb/usb_interface_android.h
index 20edd88..1aa9158c 100644
--- a/device/usb/usb_interface_android.h
+++ b/services/device/usb/usb_interface_android.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_USB_INTERFACE_ANDROID_H_
-#define DEVICE_USB_USB_INTERFACE_ANDROID_H_
+#ifndef SERVICES_DEVICE_USB_USB_INTERFACE_ANDROID_H_
+#define SERVICES_DEVICE_USB_USB_INTERFACE_ANDROID_H_
 
 #include "base/android/scoped_java_ref.h"
-#include "device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_descriptors.h"
 
 namespace device {
 
@@ -19,4 +19,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_INTERFACE_ANDROID_H_
+#endif  // SERVICES_DEVICE_USB_USB_INTERFACE_ANDROID_H_
diff --git a/device/usb/usb_service.cc b/services/device/usb/usb_service.cc
similarity index 91%
rename from device/usb/usb_service.cc
rename to services/device/usb/usb_service.cc
index 312586e..f2ce577 100644
--- a/device/usb/usb_service.cc
+++ b/services/device/usb/usb_service.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 "device/usb/usb_service.h"
+#include "services/device/usb/usb_service.h"
 
 #include "base/bind.h"
 #include "base/feature_list.h"
@@ -13,33 +13,30 @@
 #include "build/build_config.h"
 #include "components/device_event_log/device_event_log.h"
 #include "device/base/features.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_device_handle.h"
 
 #if defined(OS_ANDROID)
-#include "device/usb/usb_service_android.h"
+#include "services/device/usb/usb_service_android.h"
 #elif defined(USE_UDEV)
-#include "device/usb/usb_service_linux.h"
+#include "services/device/usb/usb_service_linux.h"
 #else
 #if defined(OS_WIN)
-#include "device/usb/usb_service_win.h"
+#include "services/device/usb/usb_service_win.h"
 #endif
-#include "device/usb/usb_service_impl.h"
+#include "services/device/usb/usb_service_impl.h"
 #endif
 
 namespace device {
 
 UsbService::Observer::~Observer() = default;
 
-void UsbService::Observer::OnDeviceAdded(scoped_refptr<UsbDevice> device) {
-}
+void UsbService::Observer::OnDeviceAdded(scoped_refptr<UsbDevice> device) {}
 
-void UsbService::Observer::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {
-}
+void UsbService::Observer::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {}
 
 void UsbService::Observer::OnDeviceRemovedCleanup(
-    scoped_refptr<UsbDevice> device) {
-}
+    scoped_refptr<UsbDevice> device) {}
 
 void UsbService::Observer::WillDestroyUsbService() {}
 
diff --git a/device/usb/usb_service.h b/services/device/usb/usb_service.h
similarity index 96%
rename from device/usb/usb_service.h
rename to services/device/usb/usb_service.h
index 3a4573f..9574231 100644
--- a/device/usb/usb_service.h
+++ b/services/device/usb/usb_service.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 DEVICE_USB_USB_SERVICE_H_
-#define DEVICE_USB_USB_SERVICE_H_
+#ifndef SERVICES_DEVICE_USB_USB_SERVICE_H_
+#define SERVICES_DEVICE_USB_USB_SERVICE_H_
 
 #include <memory>
 #include <string>
@@ -104,4 +104,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_SERVICE_H_
+#endif  // SERVICES_DEVICE_USB_USB_SERVICE_H_
diff --git a/device/usb/usb_service_android.cc b/services/device/usb/usb_service_android.cc
similarity index 97%
rename from device/usb/usb_service_android.cc
rename to services/device/usb/usb_service_android.cc
index 94c14c8..7a57ca8d 100644
--- a/device/usb/usb_service_android.cc
+++ b/services/device/usb/usb_service_android.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 "device/usb/usb_service_android.h"
+#include "services/device/usb/usb_service_android.h"
 
 #include <string>
 #include <vector>
@@ -11,8 +11,8 @@
 #include "base/location.h"
 #include "base/sequenced_task_runner.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_device_android.h"
 #include "jni/ChromeUsbService_jni.h"
+#include "services/device/usb/usb_device_android.h"
 
 using base::android::AttachCurrentThread;
 using base::android::JavaRef;
diff --git a/device/usb/usb_service_android.h b/services/device/usb/usb_service_android.h
similarity index 89%
rename from device/usb/usb_service_android.h
rename to services/device/usb/usb_service_android.h
index db623e7..6b8df4c 100644
--- a/device/usb/usb_service_android.h
+++ b/services/device/usb/usb_service_android.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 DEVICE_USB_USB_SERVICE_ANDROID_H_
-#define DEVICE_USB_USB_SERVICE_ANDROID_H_
+#ifndef SERVICES_DEVICE_USB_USB_SERVICE_ANDROID_H_
+#define SERVICES_DEVICE_USB_USB_SERVICE_ANDROID_H_
 
 #include <jni.h>
 
@@ -12,7 +12,7 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_service.h"
 
 namespace device {
 
@@ -58,4 +58,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_SERVICE_ANDROID_H_
+#endif  // SERVICES_DEVICE_USB_USB_SERVICE_ANDROID_H_
diff --git a/device/usb/usb_service_impl.cc b/services/device/usb/usb_service_impl.cc
similarity index 98%
rename from device/usb/usb_service_impl.cc
rename to services/device/usb/usb_service_impl.cc
index d9adcd7..d22dd85 100644
--- a/device/usb/usb_service_impl.cc
+++ b/services/device/usb/usb_service_impl.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 "device/usb/usb_service_impl.h"
+#include "services/device/usb/usb_service_impl.h"
 
 #include <stdint.h>
 
@@ -26,9 +26,9 @@
 #include "base/threading/scoped_blocking_call.h"
 #include "build/build_config.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_device_handle.h"
-#include "device/usb/usb_error.h"
-#include "device/usb/webusb_descriptors.h"
+#include "services/device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_error.h"
+#include "services/device/usb/webusb_descriptors.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
 #if defined(OS_WIN)
diff --git a/device/usb/usb_service_impl.h b/services/device/usb/usb_service_impl.h
similarity index 92%
rename from device/usb/usb_service_impl.h
rename to services/device/usb/usb_service_impl.h
index 08dc05a..1a9b11f 100644
--- a/device/usb/usb_service_impl.h
+++ b/services/device/usb/usb_service_impl.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_USB_SERVICE_IMPL_H_
-#define DEVICE_USB_USB_SERVICE_IMPL_H_
+#ifndef SERVICES_DEVICE_USB_USB_SERVICE_IMPL_H_
+#define SERVICES_DEVICE_USB_USB_SERVICE_IMPL_H_
 
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_service.h"
 
 #include <stddef.h>
 
@@ -18,9 +18,9 @@
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "build/build_config.h"
-#include "device/usb/scoped_libusb_device_ref.h"
-#include "device/usb/usb_context.h"
-#include "device/usb/usb_device_impl.h"
+#include "services/device/usb/scoped_libusb_device_ref.h"
+#include "services/device/usb/usb_context.h"
+#include "services/device/usb/usb_device_impl.h"
 #include "third_party/libusb/src/libusb/libusb.h"
 
 #if defined(OS_WIN)
@@ -135,4 +135,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_SERVICE_IMPL_H_
+#endif  // SERVICES_DEVICE_USB_USB_SERVICE_IMPL_H_
diff --git a/device/usb/usb_service_linux.cc b/services/device/usb/usb_service_linux.cc
similarity index 95%
rename from device/usb/usb_service_linux.cc
rename to services/device/usb/usb_service_linux.cc
index 4ef0e09..688f1d46 100644
--- a/device/usb/usb_service_linux.cc
+++ b/services/device/usb/usb_service_linux.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 "device/usb/usb_service_linux.h"
+#include "services/device/usb/usb_service_linux.h"
 
 #include <stdint.h>
 
@@ -25,9 +25,9 @@
 #include "build/build_config.h"
 #include "components/device_event_log/device_event_log.h"
 #include "device/udev_linux/udev_watcher.h"
-#include "device/usb/usb_device_handle.h"
-#include "device/usb/usb_device_linux.h"
-#include "device/usb/webusb_descriptors.h"
+#include "services/device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device_linux.h"
+#include "services/device/usb/webusb_descriptors.h"
 
 namespace device {
 
@@ -231,7 +231,8 @@
                                     const std::string& product,
                                     const std::string& serial_number,
                                     uint8_t active_configuration,
-                                    uint32_t bus_number, uint32_t port_number) {
+                                    uint32_t bus_number,
+                                    uint32_t port_number) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (ContainsKey(devices_by_path_, device_path)) {
@@ -245,10 +246,9 @@
   if (!enumeration_ready())
     ++first_enumeration_countdown_;
 
-  scoped_refptr<UsbDeviceLinux> device(
-      new UsbDeviceLinux(device_path, descriptor, manufacturer, product,
-                         serial_number, active_configuration,
-                         bus_number, port_number));
+  scoped_refptr<UsbDeviceLinux> device(new UsbDeviceLinux(
+      device_path, descriptor, manufacturer, product, serial_number,
+      active_configuration, bus_number, port_number));
   devices_by_path_[device->device_path()] = device;
   if (device->usb_version() >= kUsbVersion2_1) {
     device->Open(
diff --git a/device/usb/usb_service_linux.h b/services/device/usb/usb_service_linux.h
similarity index 88%
rename from device/usb/usb_service_linux.h
rename to services/device/usb/usb_service_linux.h
index 2433ef3..baf1d93 100644
--- a/device/usb/usb_service_linux.h
+++ b/services/device/usb/usb_service_linux.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 DEVICE_USB_USB_SERVICE_LINUX_H_
-#define DEVICE_USB_USB_SERVICE_LINUX_H_
+#ifndef SERVICES_DEVICE_USB_USB_SERVICE_LINUX_H_
+#define SERVICES_DEVICE_USB_USB_SERVICE_LINUX_H_
 
 #include <list>
 #include <memory>
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_service.h"
 
 namespace device {
 
@@ -39,7 +39,8 @@
                      const std::string& product,
                      const std::string& serial_number,
                      uint8_t active_configuration,
-                     uint32_t bus_number, uint32_t port_number);
+                     uint32_t bus_number,
+                     uint32_t port_number);
   void DeviceReady(scoped_refptr<UsbDeviceLinux> device, bool success);
   void OnDeviceRemoved(const std::string& device_path);
   void HelperStarted();
@@ -68,4 +69,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_SERVICE_LINUX_H_
+#endif  // SERVICES_DEVICE_USB_USB_SERVICE_LINUX_H_
diff --git a/device/usb/usb_service_unittest.cc b/services/device/usb/usb_service_unittest.cc
similarity index 92%
rename from device/usb/usb_service_unittest.cc
rename to services/device/usb/usb_service_unittest.cc
index c7bba005..062244de 100644
--- a/device/usb/usb_service_unittest.cc
+++ b/services/device/usb/usb_service_unittest.cc
@@ -10,11 +10,12 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_io_thread.h"
+#include "build/build_config.h"
 #include "device/base/features.h"
-#include "device/test/usb_test_gadget.h"
-#include "device/usb/usb_device.h"
-#include "device/usb/usb_device_handle.h"
-#include "device/usb/usb_service.h"
+#include "services/device/test/usb_test_gadget.h"
+#include "services/device/usb/usb_device.h"
+#include "services/device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace device {
diff --git a/device/usb/usb_service_win.cc b/services/device/usb/usb_service_win.cc
similarity index 97%
rename from device/usb/usb_service_win.cc
rename to services/device/usb/usb_service_win.cc
index 4ba106dd..1905f8b 100644
--- a/device/usb/usb_service_win.cc
+++ b/services/device/usb/usb_service_win.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 "device/usb/usb_service_win.h"
+#include "services/device/usb/usb_service_win.h"
 
 #include <setupapi.h>
 #include <stdint.h>
@@ -24,9 +24,9 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/win/scoped_handle.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_descriptors.h"
-#include "device/usb/usb_device_handle.h"
-#include "device/usb/webusb_descriptors.h"
+#include "services/device/usb/usb_descriptors.h"
+#include "services/device/usb/usb_device_handle.h"
+#include "services/device/usb/webusb_descriptors.h"
 
 namespace device {
 
@@ -83,7 +83,8 @@
 bool GetDeviceInterfaceDetails(HDEVINFO dev_info,
                                SP_DEVICE_INTERFACE_DATA* device_interface_data,
                                std::string* device_path,
-                               uint32_t* bus_number, uint32_t* port_number,
+                               uint32_t* bus_number,
+                               uint32_t* port_number,
                                std::string* parent_instance_id,
                                std::string* service_name) {
   DWORD required_size = 0;
diff --git a/device/usb/usb_service_win.h b/services/device/usb/usb_service_win.h
similarity index 85%
rename from device/usb/usb_service_win.h
rename to services/device/usb/usb_service_win.h
index 816f048..b6a590ed 100644
--- a/device/usb/usb_service_win.h
+++ b/services/device/usb/usb_service_win.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef DEVICE_USB_USB_SERVICE_WIN_H_
-#define DEVICE_USB_USB_SERVICE_WIN_H_
+#ifndef SERVICES_DEVICE_USB_USB_SERVICE_WIN_H_
+#define SERVICES_DEVICE_USB_USB_SERVICE_WIN_H_
 
-#include "device/usb/usb_service.h"
+#include "services/device/usb/usb_service.h"
 
 #include <list>
 #include <unordered_map>
@@ -15,7 +15,7 @@
 #include "base/scoped_observer.h"
 #include "base/sequenced_task_runner.h"
 #include "device/base/device_monitor_win.h"
-#include "device/usb/usb_device_win.h"
+#include "services/device/usb/usb_device_win.h"
 
 namespace device {
 
@@ -41,7 +41,8 @@
   void HelperStarted();
   void CreateDeviceObject(const std::string& device_path,
                           const std::string& hub_path,
-                          uint32_t bus_number, uint32_t port_number,
+                          uint32_t bus_number,
+                          uint32_t port_number,
                           const std::string& driver_name);
 
   void DeviceReady(scoped_refptr<UsbDeviceWin> device, bool success);
@@ -68,4 +69,4 @@
 
 }  // namespace device
 
-#endif  // DEVICE_USB_USB_SERVICE_WIN_H_
+#endif  // SERVICES_DEVICE_USB_USB_SERVICE_WIN_H_
diff --git a/device/usb/usb_string_read_fuzzer.cc b/services/device/usb/usb_string_read_fuzzer.cc
similarity index 91%
rename from device/usb/usb_string_read_fuzzer.cc
rename to services/device/usb/usb_string_read_fuzzer.cc
index 8de9bd1a..0b306d1 100644
--- a/device/usb/usb_string_read_fuzzer.cc
+++ b/services/device/usb/usb_string_read_fuzzer.cc
@@ -8,8 +8,8 @@
 #include "base/bind.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
-#include "device/usb/fake_usb_device_handle.h"
-#include "device/usb/usb_descriptors.h"
+#include "services/device/usb/fake_usb_device_handle.h"
+#include "services/device/usb/usb_descriptors.h"
 
 namespace device {
 
diff --git a/device/usb/webusb_descriptors.cc b/services/device/usb/webusb_descriptors.cc
similarity index 98%
rename from device/usb/webusb_descriptors.cc
rename to services/device/usb/webusb_descriptors.cc
index b229a35..5f2661a 100644
--- a/device/usb/webusb_descriptors.cc
+++ b/services/device/usb/webusb_descriptors.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 "device/usb/webusb_descriptors.h"
+#include "services/device/usb/webusb_descriptors.h"
 
 #include "base/bind.h"
 #include "base/callback.h"
@@ -10,7 +10,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/stl_util.h"
 #include "components/device_event_log/device_event_log.h"
-#include "device/usb/usb_device_handle.h"
+#include "services/device/usb/usb_device_handle.h"
 
 namespace device {
 
diff --git a/device/usb/webusb_descriptors.h b/services/device/usb/webusb_descriptors.h
similarity index 82%
rename from device/usb/webusb_descriptors.h
rename to services/device/usb/webusb_descriptors.h
index 65513bb..86f69e10 100644
--- a/device/usb/webusb_descriptors.h
+++ b/services/device/usb/webusb_descriptors.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 DEVICE_USB_WEBUSB_DESCRIPTORS_H_
-#define DEVICE_USB_WEBUSB_DESCRIPTORS_H_
+#ifndef SERVICES_DEVICE_USB_WEBUSB_DESCRIPTORS_H_
+#define SERVICES_DEVICE_USB_WEBUSB_DESCRIPTORS_H_
 
 #include <stdint.h>
 
@@ -35,6 +35,6 @@
     scoped_refptr<UsbDeviceHandle> device_handle,
     base::OnceCallback<void(const GURL& landing_page)> callback);
 
-}  // device
+}  // namespace device
 
-#endif  // DEVICE_USB_WEBUSB_DESCRIPTORS_H_
+#endif  // SERVICES_DEVICE_USB_WEBUSB_DESCRIPTORS_H_
diff --git a/device/usb/webusb_descriptors_fuzzer.cc b/services/device/usb/webusb_descriptors_fuzzer.cc
similarity index 87%
rename from device/usb/webusb_descriptors_fuzzer.cc
rename to services/device/usb/webusb_descriptors_fuzzer.cc
index 1f8a652..d0f97ca9 100644
--- a/device/usb/webusb_descriptors_fuzzer.cc
+++ b/services/device/usb/webusb_descriptors_fuzzer.cc
@@ -8,8 +8,8 @@
 #include "base/at_exit.h"
 #include "base/bind.h"
 #include "base/i18n/icu_util.h"
-#include "device/usb/fake_usb_device_handle.h"
-#include "device/usb/webusb_descriptors.h"
+#include "services/device/usb/fake_usb_device_handle.h"
+#include "services/device/usb/webusb_descriptors.h"
 
 struct TestCase {
   TestCase() { CHECK(base::i18n::InitializeICU()); }
diff --git a/device/usb/webusb_descriptors_unittest.cc b/services/device/usb/webusb_descriptors_unittest.cc
similarity index 98%
rename from device/usb/webusb_descriptors_unittest.cc
rename to services/device/usb/webusb_descriptors_unittest.cc
index e4e142d4..e4fbf60 100644
--- a/device/usb/webusb_descriptors_unittest.cc
+++ b/services/device/usb/webusb_descriptors_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 "device/usb/webusb_descriptors.h"
+#include "services/device/usb/webusb_descriptors.h"
 
 #include <stdint.h>
 
@@ -11,7 +11,7 @@
 
 #include "base/bind.h"
 #include "base/stl_util.h"
-#include "device/usb/mock_usb_device_handle.h"
+#include "services/device/usb/mock_usb_device_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
diff --git a/services/identity/public/cpp/identity_manager.h b/services/identity/public/cpp/identity_manager.h
index 7359413..dafa6854 100644
--- a/services/identity/public/cpp/identity_manager.h
+++ b/services/identity/public/cpp/identity_manager.h
@@ -98,7 +98,7 @@
     // OnPrimaryAccountCleared() callback is undefined.If this lack of ordering
     // is problematic for your use case, please contact blundell@chromium.org.
     virtual void OnRefreshTokenRemovedForAccount(
-        const std::string& account_id) {}
+        const CoreAccountId& account_id) {}
 
     // Called when the error state of the refresh token for |account_id| has
     // changed. Note: It is always called after
diff --git a/services/identity/public/cpp/identity_manager_unittest.cc b/services/identity/public/cpp/identity_manager_unittest.cc
index abe3516..8f66d57717 100644
--- a/services/identity/public/cpp/identity_manager_unittest.cc
+++ b/services/identity/public/cpp/identity_manager_unittest.cc
@@ -25,6 +25,7 @@
 #include "components/signin/core/browser/signin_switches.h"
 #include "components/signin/core/browser/test_signin_client.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "google_apis/gaia/core_account_id.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "google_apis/gaia/oauth2_token_service_delegate.h"
 #include "services/identity/public/cpp/accounts_cookie_mutator.h"
@@ -74,7 +75,7 @@
       : FakeProfileOAuth2TokenService(user_prefs) {}
 
   void set_on_access_token_invalidated_info(
-      std::string expected_account_id_to_invalidate,
+      CoreAccountId expected_account_id_to_invalidate,
       std::set<std::string> expected_scopes_to_invalidate,
       std::string expected_access_token_to_invalidate,
       base::OnceClosure callback) {
@@ -104,7 +105,7 @@
     }
   }
 
-  std::string expected_account_id_to_invalidate_;
+  CoreAccountId expected_account_id_to_invalidate_;
   std::set<std::string> expected_scopes_to_invalidate_;
   std::string expected_access_token_to_invalidate_;
   base::OnceClosure on_access_token_invalidated_callback_;
@@ -358,7 +359,9 @@
     manager->OnSetAccountsFinished(error);
   }
 
-  std::string primary_account_id() { return primary_account_id_; }
+  const CoreAccountId& primary_account_id() const {
+    return primary_account_id_;
+  }
 
   TestSigninClient* signin_client() { return &signin_client_; }
 
@@ -375,7 +378,7 @@
   std::unique_ptr<TestIdentityManagerObserver> identity_manager_observer_;
   std::unique_ptr<TestIdentityManagerDiagnosticsObserver>
       identity_manager_diagnostics_observer_;
-  std::string primary_account_id_;
+  CoreAccountId primary_account_id_;
 
   DISALLOW_COPY_AND_ASSIGN(IdentityManagerTest);
 };
@@ -408,7 +411,7 @@
   EXPECT_EQ(kTestGaiaId, primary_account_info.gaia);
   EXPECT_EQ(kTestEmail, primary_account_info.email);
 
-  std::string primary_account_id = identity_manager()->GetPrimaryAccountId();
+  CoreAccountId primary_account_id = identity_manager()->GetPrimaryAccountId();
   EXPECT_EQ(primary_account_id, kTestGaiaId);
   EXPECT_EQ(primary_account_id, primary_account_info.account_id);
 }
@@ -435,7 +438,7 @@
   EXPECT_EQ("", primary_account_info.gaia);
   EXPECT_EQ("", primary_account_info.email);
 
-  std::string primary_account_id = identity_manager()->GetPrimaryAccountId();
+  CoreAccountId primary_account_id = identity_manager()->GetPrimaryAccountId();
   EXPECT_EQ("", primary_account_id);
   EXPECT_EQ(primary_account_id, primary_account_info.account_id);
 }
@@ -462,7 +465,7 @@
   EXPECT_EQ(kTestEmail, primary_account_info.email);
   EXPECT_EQ(kTestGaiaId, primary_account_info.account_id);
 
-  std::string primary_account_id = identity_manager()->GetPrimaryAccountId();
+  CoreAccountId primary_account_id = identity_manager()->GetPrimaryAccountId();
   EXPECT_EQ(primary_account_id, kTestGaiaId);
 }
 #endif  // !defined(OS_CHROMEOS)
@@ -520,7 +523,6 @@
 TEST_F(IdentityManagerTest,
        QueryingOfRefreshTokensInteractionWithPrimaryAccount) {
   CoreAccountInfo account_info = identity_manager()->GetPrimaryAccountInfo();
-  std::string account_id = account_info.account_id;
 
   // Should not have a refresh token for the primary account at initialization.
   EXPECT_FALSE(
@@ -553,7 +555,7 @@
 
 TEST_F(IdentityManagerTest, QueryingOfRefreshTokensReflectsEmptyInitialState) {
   CoreAccountInfo account_info = identity_manager()->GetPrimaryAccountInfo();
-  std::string account_id = account_info.account_id;
+  CoreAccountId account_id = account_info.account_id;
 
   EXPECT_FALSE(
       identity_manager()->HasAccountWithRefreshToken(account_info.account_id));
@@ -573,7 +575,7 @@
   // Add a refresh token for a secondary account and check that it shows up in
   // GetAccountsWithRefreshTokens().
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
-  std::string account_id2 =
+  CoreAccountId account_id2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2).account_id;
   SetRefreshTokenForAccount(identity_manager(), account_id2);
 
@@ -588,7 +590,7 @@
   // Add a refresh token for a different secondary account and check that it
   // also shows up in GetAccountsWithRefreshTokens().
   account_tracker()->SeedAccountInfo(kTestGaiaId3, kTestEmail3);
-  std::string account_id3 =
+  CoreAccountId account_id3 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId3).account_id;
   SetRefreshTokenForAccount(identity_manager(), account_id3);
 
@@ -625,7 +627,7 @@
   // Adding a refresh token for a secondary account shouldn't change anything
   // about the primary account
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
-  std::string account_id2 =
+  CoreAccountId account_id2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2).account_id;
   SetRefreshTokenForAccount(identity_manager(), account_id2);
 
@@ -634,7 +636,7 @@
   // Adding a refresh token for a different secondary account should not do so
   // either.
   account_tracker()->SeedAccountInfo(kTestGaiaId3, kTestEmail3);
-  std::string account_id3 =
+  CoreAccountId account_id3 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId3).account_id;
   SetRefreshTokenForAccount(identity_manager(), account_id3);
 
@@ -651,7 +653,7 @@
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
   AccountInfo account_info2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2);
-  std::string account_id2 = account_info2.account_id;
+  CoreAccountId account_id2 = account_info2.account_id;
 
   EXPECT_FALSE(
       identity_manager()->HasAccountWithRefreshToken(account_info2.account_id));
@@ -667,7 +669,7 @@
   account_tracker()->SeedAccountInfo(kTestGaiaId3, kTestEmail3);
   AccountInfo account_info3 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId3);
-  std::string account_id3 = account_info3.account_id;
+  CoreAccountId account_id3 = account_info3.account_id;
 
   EXPECT_TRUE(
       identity_manager()->HasAccountWithRefreshToken(account_info2.account_id));
@@ -698,7 +700,7 @@
   // Add a refresh token for a secondary account and check that it shows up in
   // GetAccountsWithRefreshTokens().
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
-  std::string account_id2 =
+  CoreAccountId account_id2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2).account_id;
   SetRefreshTokenForAccount(identity_manager(), account_id2);
 
@@ -755,7 +757,7 @@
   // Add a refresh token for a secondary account and check that it doesn't
   // impact the above state.
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
-  std::string account_id2 =
+  CoreAccountId account_id2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2).account_id;
   SetRefreshTokenForAccount(identity_manager(), account_id2);
 
@@ -785,7 +787,7 @@
     HasAccountWithRefreshTokenInteractionBetweenPrimaryAndSecondaryAccounts) {
   CoreAccountInfo primary_account_info =
       identity_manager()->GetPrimaryAccountInfo();
-  std::string primary_account_id = primary_account_info.account_id;
+  CoreAccountId primary_account_id = primary_account_info.account_id;
 
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
   AccountInfo account_info2 =
@@ -827,7 +829,7 @@
        CallbackSentOnUpdateToErrorStateOfRefreshTokenForAccount) {
   CoreAccountInfo primary_account_info =
       identity_manager()->GetPrimaryAccountInfo();
-  std::string primary_account_id = primary_account_info.account_id;
+  CoreAccountId primary_account_id = primary_account_info.account_id;
   SetRefreshTokenForPrimaryAccount(identity_manager());
 
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
@@ -881,7 +883,7 @@
 TEST_F(IdentityManagerTest, GetErrorStateOfRefreshTokenForAccount) {
   CoreAccountInfo primary_account_info =
       identity_manager()->GetPrimaryAccountInfo();
-  std::string primary_account_id = primary_account_info.account_id;
+  CoreAccountId primary_account_id = primary_account_info.account_id;
 
   // A primary account without a refresh token should not be in an error
   // state, and setting a refresh token should not affect that.
@@ -905,7 +907,7 @@
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
   AccountInfo account_info2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2);
-  std::string account_id2 = account_info2.account_id;
+  CoreAccountId account_id2 = account_info2.account_id;
   EXPECT_EQ(
       GoogleServiceAuthError::AuthErrorNone(),
       identity_manager()->GetErrorStateOfRefreshTokenForAccount(account_id2));
@@ -1081,7 +1083,7 @@
       ->set_on_access_token_requested_callback(run_loop2.QuitClosure());
 
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
-  std::string account_id2 =
+  CoreAccountId account_id2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2).account_id;
   token_service()->UpdateCredentials(account_id2, "refresh_token");
 
@@ -1208,7 +1210,7 @@
       ->set_on_access_token_request_completed_callback(run_loop.QuitClosure());
 
   account_tracker()->SeedAccountInfo(kTestGaiaId2, kTestEmail2);
-  std::string account_id2 =
+  CoreAccountId account_id2 =
       account_tracker()->FindAccountInfoByGaiaId(kTestGaiaId2).account_id;
   token_service()->UpdateCredentials(account_id2, "refresh_token");
 
@@ -1451,7 +1453,7 @@
   // IdentityManager passes on the callback in this case.
   token_service()->set_all_credentials_loaded_for_testing(false);
 
-  std::string dummy_account_id = "dummy_account";
+  CoreAccountId dummy_account_id("dummy_account");
 
   base::RunLoop run_loop;
   token_service()->RevokeCredentials(dummy_account_id);
@@ -2057,7 +2059,7 @@
 }
 
 TEST_F(IdentityManagerTest, TestPickAccountIdForAccount) {
-  const std::string account_id =
+  const CoreAccountId account_id =
       identity_manager()->PickAccountIdForAccount(kTestGaiaId, kTestEmail);
   const bool account_id_migration_done =
       identity_manager()->GetAccountIdMigrationState() ==
@@ -2092,7 +2094,7 @@
                    .has_value());
 
   // Insert the core account information in the AccountTrackerService.
-  const std::string account_id =
+  const CoreAccountId account_id =
       account_tracker()->SeedAccountInfo(kTestGaiaId, kTestEmail);
   ASSERT_EQ(account_info.account_id, account_id);
 
diff --git a/services/identity/public/cpp/primary_account_mutator_unittest.cc b/services/identity/public/cpp/primary_account_mutator_unittest.cc
index 420d7fa4..cb3fbe0 100644
--- a/services/identity/public/cpp/primary_account_mutator_unittest.cc
+++ b/services/identity/public/cpp/primary_account_mutator_unittest.cc
@@ -68,7 +68,8 @@
     on_primary_account_cleared_.Run(account_info);
   }
 
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override {
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override {
     on_refresh_token_removed_.Run(account_id);
   }
 
diff --git a/services/identity/public/cpp/test_identity_manager_observer.cc b/services/identity/public/cpp/test_identity_manager_observer.cc
index 9c2f9a6..b43aa18 100644
--- a/services/identity/public/cpp/test_identity_manager_observer.cc
+++ b/services/identity/public/cpp/test_identity_manager_observer.cc
@@ -70,7 +70,7 @@
   on_refresh_token_removed_callback_ = std::move(callback);
 }
 
-const std::string&
+const CoreAccountId&
 TestIdentityManagerObserver::AccountIdFromRefreshTokenRemovedCallback() {
   return account_from_refresh_token_removed_callback_;
 }
@@ -116,7 +116,7 @@
 
 // Each element represents all the changes from an individual batch that has
 // occurred, with the elements ordered from oldest to newest batch occurrence.
-const std::vector<std::vector<std::string>>&
+const std::vector<std::vector<CoreAccountId>>&
 TestIdentityManagerObserver::BatchChangeRecords() const {
   return batch_change_records_;
 }
@@ -148,7 +148,7 @@
 }
 
 void TestIdentityManagerObserver::OnRefreshTokenRemovedForAccount(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   if (!is_inside_batch_)
     StartBatchOfRefreshTokenStateChanges();
 
@@ -201,7 +201,7 @@
   is_inside_batch_ = true;
 
   // Start a new batch.
-  batch_change_records_.emplace_back(std::vector<std::string>());
+  batch_change_records_.emplace_back(std::vector<CoreAccountId>());
 }
 
 void TestIdentityManagerObserver::OnEndBatchOfRefreshTokenStateChanges() {
diff --git a/services/identity/public/cpp/test_identity_manager_observer.h b/services/identity/public/cpp/test_identity_manager_observer.h
index 91b6f8b..b050dae 100644
--- a/services/identity/public/cpp/test_identity_manager_observer.h
+++ b/services/identity/public/cpp/test_identity_manager_observer.h
@@ -39,7 +39,7 @@
   ErrorFromErrorStateOfRefreshTokenUpdatedCallback() const;
 
   void SetOnRefreshTokenRemovedCallback(base::OnceClosure callback);
-  const std::string& AccountIdFromRefreshTokenRemovedCallback();
+  const CoreAccountId& AccountIdFromRefreshTokenRemovedCallback();
 
   void SetOnRefreshTokensLoadedCallback(base::OnceClosure callback);
 
@@ -57,7 +57,7 @@
 
   // Each element represents all the changes from an individual batch that has
   // occurred, with the elements ordered from oldest to newest batch occurrence.
-  const std::vector<std::vector<std::string>>& BatchChangeRecords() const;
+  const std::vector<std::vector<CoreAccountId>>& BatchChangeRecords() const;
 
  private:
   // IdentityManager::Observer:
@@ -67,7 +67,8 @@
       const CoreAccountInfo& previous_primary_account_info) override;
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override;
   void OnErrorStateOfRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info,
       const GoogleServiceAuthError& error) override;
@@ -101,7 +102,7 @@
       error_from_error_state_of_refresh_token_updated_callback_;
 
   base::OnceClosure on_refresh_token_removed_callback_;
-  std::string account_from_refresh_token_removed_callback_;
+  CoreAccountId account_from_refresh_token_removed_callback_;
 
   base::OnceClosure on_refresh_tokens_loaded_callback_;
 
@@ -116,7 +117,7 @@
 
   bool is_inside_batch_ = false;
   bool was_called_account_removed_with_info_callback_ = false;
-  std::vector<std::vector<std::string>> batch_change_records_;
+  std::vector<std::vector<CoreAccountId>> batch_change_records_;
 
   DISALLOW_COPY_AND_ASSIGN(TestIdentityManagerObserver);
 };
diff --git a/services/identity/public/objc/identity_manager_observer_bridge.h b/services/identity/public/objc/identity_manager_observer_bridge.h
index 4e5e3b0d..57d5bee 100644
--- a/services/identity/public/objc/identity_manager_observer_bridge.h
+++ b/services/identity/public/objc/identity_manager_observer_bridge.h
@@ -53,7 +53,8 @@
       const CoreAccountInfo& previous_primary_account_info) override;
   void OnRefreshTokenUpdatedForAccount(
       const CoreAccountInfo& account_info) override;
-  void OnRefreshTokenRemovedForAccount(const std::string& account_id) override;
+  void OnRefreshTokenRemovedForAccount(
+      const CoreAccountId& account_id) override;
   void OnRefreshTokensLoaded() override;
   void OnAccountsInCookieUpdated(
       const identity::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
diff --git a/services/identity/public/objc/identity_manager_observer_bridge.mm b/services/identity/public/objc/identity_manager_observer_bridge.mm
index 59aaea8d..2becda5 100644
--- a/services/identity/public/objc/identity_manager_observer_bridge.mm
+++ b/services/identity/public/objc/identity_manager_observer_bridge.mm
@@ -44,10 +44,10 @@
 }
 
 void IdentityManagerObserverBridge::OnRefreshTokenRemovedForAccount(
-    const std::string& account_id) {
+    const CoreAccountId& account_id) {
   if ([delegate_
           respondsToSelector:@selector(onRefreshTokenRemovedForAccount:)]) {
-    [delegate_ onRefreshTokenRemovedForAccount:account_id];
+    [delegate_ onRefreshTokenRemovedForAccount:account_id.id];
   }
 }
 
diff --git a/services/metrics/public/cpp/metrics_utils.cc b/services/metrics/public/cpp/metrics_utils.cc
index 3b5d86a3..7514c05 100644
--- a/services/metrics/public/cpp/metrics_utils.cc
+++ b/services/metrics/public/cpp/metrics_utils.cc
@@ -26,6 +26,18 @@
   return GetExponentialBucketMin(sample, 2.0);
 }
 
+int64_t GetExponentialBucketMinForCounts1000(int64_t sample) {
+  return GetExponentialBucketMin(sample, 1.15);
+}
+
+int64_t GetExponentialBucketMinForBytes(int64_t sample) {
+  return GetExponentialBucketMin(sample, 1.3);
+}
+
+int64_t GetExponentialBucketMinForBytesUnder1KB(int64_t sample) {
+  return GetExponentialBucketMin(sample, 1.15);
+}
+
 int64_t GetLinearBucketMin(int64_t sample, int32_t bucket_size) {
   DCHECK(bucket_size > 0);
   // Round down to the nearest multiple of |bucket_size| (for negative samples,
diff --git a/services/metrics/public/cpp/metrics_utils.h b/services/metrics/public/cpp/metrics_utils.h
index cf19cb6b6..0919da15 100644
--- a/services/metrics/public/cpp/metrics_utils.h
+++ b/services/metrics/public/cpp/metrics_utils.h
@@ -21,6 +21,15 @@
 // timing user actions.
 int64_t METRICS_EXPORT GetExponentialBucketMinForUserTiming(int64_t sample);
 
+// Like GetExponentialBucketMin but uses a standard bucket_spacing of 1.15.
+int64_t METRICS_EXPORT GetExponentialBucketMinForCounts1000(int64_t sample);
+
+// Like GetExponentialBucketMin but uses a standard bucket_spacing of 1.3.
+int64_t METRICS_EXPORT GetExponentialBucketMinForBytes(int64_t sample);
+
+// Like GetExponentialBucketMin but uses a standard bucket_spacing of 1.15.
+int64_t METRICS_EXPORT GetExponentialBucketMinForBytesUnder1KB(int64_t sample);
+
 // Calculates the linear bucket |sample| falls in and returns the lower
 // threshold of that bucket (i.e., rounding down to the nearest multiple of
 // |bucket_size|). Negative sample values will be rounded down as well (away
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index 66a4e206..a3fd130 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -830,9 +830,8 @@
     loader_count += context->GatherActiveLoaderCount();
   }
   UMA_HISTOGRAM_COUNTS_10000("Net.Cors.PreflightCacheTotalEntries", cache_size);
-  UMA_HISTOGRAM_COUNTS_10000(
-      "Net.Cors.PreflightCacheTotalMemoryPressureInBytes",
-      memory_pressure_in_bytes);
+  UMA_HISTOGRAM_COUNTS_10M("Net.Cors.PreflightCacheTotalMemoryPressureInBytes",
+                           memory_pressure_in_bytes);
   UMA_HISTOGRAM_COUNTS_1000("Net.Cors.ActiveLoaderCount", loader_count);
 }
 
diff --git a/services/network/network_service_network_delegate.cc b/services/network/network_service_network_delegate.cc
index f8418773..097ac9a 100644
--- a/services/network/network_service_network_delegate.cc
+++ b/services/network/network_service_network_delegate.cc
@@ -205,8 +205,7 @@
     const net::HttpResponseHeaders* original_response_headers) {
   DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
   DCHECK(request);
-  if (!original_response_headers ||
-      !network_context_->network_service()->client())
+  if (!original_response_headers || !network_context_->client())
     return net::OK;
 
   URLLoader* url_loader = URLLoader::ForRequest(*request);
@@ -218,7 +217,7 @@
                                                       &header_value))
     return net::OK;
 
-  network_context_->network_service()->client()->OnClearSiteData(
+  network_context_->client()->OnClearSiteData(
       url_loader->GetProcessId(), url_loader->GetRenderFrameId(),
       request->url(), header_value, request->load_flags(),
       base::BindOnce(&NetworkServiceNetworkDelegate::FinishedClearSiteData,
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc
index f6858114..adf6e60 100644
--- a/services/network/network_service_unittest.cc
+++ b/services/network/network_service_unittest.cc
@@ -43,6 +43,7 @@
 #include "services/network/public/cpp/network_switches.h"
 #include "services/network/public/mojom/net_log.mojom.h"
 #include "services/network/public/mojom/network_change_manager.mojom.h"
+#include "services/network/public/mojom/network_context.mojom.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "services/network/test/test_network_service_client.h"
 #include "services/network/test/test_url_loader_client.h"
@@ -1411,30 +1412,23 @@
   DISALLOW_COPY_AND_ASSIGN(NetworkServiceNetworkDelegateTest);
 };
 
-class ClearSiteDataNetworkServiceClient : public TestNetworkServiceClient {
+class ClearSiteDataNetworkContextClient : public mojom::NetworkContextClient {
  public:
-  explicit ClearSiteDataNetworkServiceClient(
-      mojom::NetworkServiceClientRequest request)
-      : TestNetworkServiceClient(std::move(request)) {}
-  ~ClearSiteDataNetworkServiceClient() override = default;
+  explicit ClearSiteDataNetworkContextClient(
+      mojom::NetworkContextClientRequest request)
+      : binding_(this, std::move(request)) {}
+  ~ClearSiteDataNetworkContextClient() override = default;
 
-  // Needed these two cookie overrides to avoid NOTREACHED().
-  void OnCookiesRead(int process_id,
-                     int routing_id,
-                     const GURL& url,
-                     const GURL& first_party_url,
-                     const net::CookieList& cookie_list,
-                     bool blocked_by_policy) override {}
+  void OnCanSendReportingReports(
+      const std::vector<url::Origin>& origins,
+      OnCanSendReportingReportsCallback callback) override {}
 
-  void OnCookieChange(int process_id,
-                      int routing_id,
-                      const GURL& url,
-                      const GURL& first_party_url,
-                      const net::CanonicalCookie& cookie,
-                      bool blocked_by_policy) override {}
+  void OnCanSendDomainReliabilityUpload(
+      const GURL& origin,
+      OnCanSendDomainReliabilityUploadCallback callback) override {}
 
-  void OnClearSiteData(int process_id,
-                       int routing_id,
+  void OnClearSiteData(uint32_t process_id,
+                       int32_t routing_id,
                        const GURL& url,
                        const std::string& header_value,
                        int load_flags,
@@ -1445,6 +1439,7 @@
   }
 
   int on_clear_site_data_counter() const { return on_clear_site_data_counter_; }
+
   const std::string& last_on_clear_site_data_header_value() const {
     return last_on_clear_site_data_header_value_;
   }
@@ -1457,29 +1452,28 @@
  private:
   int on_clear_site_data_counter_ = 0;
   std::string last_on_clear_site_data_header_value_;
+  mojo::Binding<mojom::NetworkContextClient> binding_;
 };
 
 // Check that |NetworkServiceNetworkDelegate| handles Clear-Site-Data header
-// w/ and w/o |NetworkServiceCient|.
-TEST_F(NetworkServiceNetworkDelegateTest, ClearSiteDataNetworkServiceCient) {
+// w/ and w/o |NetworkContextCient|.
+TEST_F(NetworkServiceNetworkDelegateTest, ClearSiteDataNetworkContextCient) {
   const char kClearCookiesHeader[] = "Clear-Site-Data: \"cookies\"";
   CreateNetworkContext();
 
-  // Null |NetworkServiceCient|. The request should complete without being
+  // Null |NetworkContextCient|. The request should complete without being
   // deferred.
-  EXPECT_EQ(nullptr, service()->client());
   GURL url = https_server()->GetURL("/foo");
   url = AddQuery(url, "header", kClearCookiesHeader);
   LoadURL(url);
   EXPECT_EQ(net::OK, client()->completion_status().error_code);
 
-  // With |NetworkServiceCient|. The request should go through
-  // |ClearSiteDataNetworkServiceClient| and complete.
-  mojom::NetworkServiceClientPtr client_ptr;
-  auto client_impl = std::make_unique<ClearSiteDataNetworkServiceClient>(
+  // With |NetworkContextCient|. The request should go through
+  // |ClearSiteDataNetworkContextClient| and complete.
+  mojom::NetworkContextClientPtr client_ptr;
+  auto client_impl = std::make_unique<ClearSiteDataNetworkContextClient>(
       mojo::MakeRequest(&client_ptr));
-  service()->SetClient(std::move(client_ptr),
-                       network::mojom::NetworkServiceParams::New());
+  network_context_->SetClient(std::move(client_ptr));
   url = https_server()->GetURL("/bar");
   url = AddQuery(url, "header", kClearCookiesHeader);
   EXPECT_EQ(0, client_impl->on_clear_site_data_counter());
@@ -1494,11 +1488,10 @@
   const char kClearCookiesHeader[] = "Clear-Site-Data: \"cookies\"";
   CreateNetworkContext();
 
-  mojom::NetworkServiceClientPtr client_ptr;
-  auto client_impl = std::make_unique<ClearSiteDataNetworkServiceClient>(
+  mojom::NetworkContextClientPtr client_ptr;
+  auto client_impl = std::make_unique<ClearSiteDataNetworkContextClient>(
       mojo::MakeRequest(&client_ptr));
-  service()->SetClient(std::move(client_ptr),
-                       network::mojom::NetworkServiceParams::New());
+  network_context_->SetClient(std::move(client_ptr));
 
   // |passed_header_value| are only checked if |should_call_client| is true.
   const struct TestCase {
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index d2c1688..ae63eaa 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -19,14 +19,13 @@
 // Enables the network service.
 const base::Feature kNetworkService {
   "NetworkService",
-#if defined(OS_WIN) || defined(OS_MACOSX) || \
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_FUCHSIA) || \
     (defined(OS_LINUX) && !defined(IS_CHROMECAST))
       base::FEATURE_ENABLED_BY_DEFAULT
-};
 #else
       base::FEATURE_DISABLED_BY_DEFAULT
-};
 #endif
+};
 
 // Out of Blink CORS
 const base::Feature kOutOfBlinkCors{"OutOfBlinkCors",
diff --git a/services/network/public/cpp/network_switches.cc b/services/network/public/cpp/network_switches.cc
index 7505008b..8a52522b7 100644
--- a/services/network/public/cpp/network_switches.cc
+++ b/services/network/public/cpp/network_switches.cc
@@ -40,6 +40,16 @@
 // user data directory.
 const char kLogNetLog[] = "log-net-log";
 
+// Sets the granularity of events to capture in the network log. The mode can be
+// set to one of the following values:
+//   "Default"
+//   "IncludeCookiesAndCredentials"
+//   "IncludeSocketBytes"
+//
+// See the functions of the corresponding name in net_log_capture_mode.h for a
+// description of their meaning.
+const char kNetLogCaptureMode[] = "net-log-capture-mode";
+
 // Causes SSL key material to be logged to the specified file for debugging
 // purposes. See
 // https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format
diff --git a/services/network/public/cpp/network_switches.h b/services/network/public/cpp/network_switches.h
index 42de65482..5093899 100644
--- a/services/network/public/cpp/network_switches.h
+++ b/services/network/public/cpp/network_switches.h
@@ -18,6 +18,7 @@
 extern const char kIgnoreCertificateErrorsSPKIList[];
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kIgnoreUrlFetcherCertRequests[];
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kLogNetLog[];
+COMPONENT_EXPORT(NETWORK_CPP) extern const char kNetLogCaptureMode[];
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kSSLKeyLogFile[];
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kNoReferrers[];
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kExplicitlyAllowedPorts[];
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
index 60966ed..482ec3c 100644
--- a/services/network/public/mojom/network_context.mojom
+++ b/services/network/public/mojom/network_context.mojom
@@ -494,6 +494,17 @@
 
   // Checks if a Domain Reliability report can be uploaded for the given origin.
   OnCanSendDomainReliabilityUpload(url.mojom.Url origin) => (bool allowed);
+
+  // Called when the Clear-Site-Data header has been received. The callback
+  // should be run after the data is deleted.
+  // https://www.w3.org/TR/clear-site-data/
+  // TODO(crbug.com/876931): We might want to move header parsing work to
+  // Network Service for security concerns (e.g. |header_value| => booleans).
+  OnClearSiteData(uint32 process_id,
+                  int32 routing_id,
+                  url.mojom.Url url,
+                  string header_value,
+                  int32 load_flags) => ();
 };
 
 // Represents a distinct context for making network requests, with its own
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom
index b722dc0..82068141 100644
--- a/services/network/public/mojom/network_service.mojom
+++ b/services/network/public/mojom/network_service.mojom
@@ -148,17 +148,6 @@
   // receive the next update.
   OnLoadingStateUpdate(array<LoadInfo> infos) => ();
 
-  // Called when the Clear-Site-Data header has been received. The callback
-  // should be run after the data is deleted.
-  // https://www.w3.org/TR/clear-site-data/
-  // TODO(crbug.com/876931): We might want to move header parsing work to
-  // Network Service for security concerns (e.g. |header_value| => booleans).
-  OnClearSiteData(int32 process_id,
-                  int32 routing_id,
-                  url.mojom.Url url,
-                  string header_value,
-                  int32 load_flags) => ();
-
   // Called on every request completion to update the network traffic annotation
   // ID, and the total bytes received and sent.
   // |network_traffic_annotation_id_hash| represents the hash of unique tag that
diff --git a/services/network/test/test_network_service_client.cc b/services/network/test/test_network_service_client.cc
index b9fe2172..7261926 100644
--- a/services/network/test/test_network_service_client.cc
+++ b/services/network/test/test_network_service_client.cc
@@ -112,16 +112,6 @@
     std::vector<mojom::LoadInfoPtr> infos,
     OnLoadingStateUpdateCallback callback) {}
 
-void TestNetworkServiceClient::OnClearSiteData(
-    int process_id,
-    int routing_id,
-    const GURL& url,
-    const std::string& header_value,
-    int load_flags,
-    OnClearSiteDataCallback callback) {
-  NOTREACHED();
-}
-
 void TestNetworkServiceClient::OnDataUseUpdate(
     int32_t network_traffic_annotation_id_hash,
     int64_t recv_bytes,
diff --git a/services/network/test/test_network_service_client.h b/services/network/test/test_network_service_client.h
index 18418802..04d1aac 100644
--- a/services/network/test/test_network_service_client.h
+++ b/services/network/test/test_network_service_client.h
@@ -73,12 +73,6 @@
                              OnFileUploadRequestedCallback callback) override;
   void OnLoadingStateUpdate(std::vector<mojom::LoadInfoPtr> infos,
                             OnLoadingStateUpdateCallback callback) override;
-  void OnClearSiteData(int process_id,
-                       int routing_id,
-                       const GURL& url,
-                       const std::string& header_value,
-                       int load_flags,
-                       OnClearSiteDataCallback callback) override;
   void OnDataUseUpdate(int32_t network_traffic_annotation_id_hash,
                        int64_t recv_bytes,
                        int64_t sent_bytes) override;
diff --git a/services/service_manager/sandbox/BUILD.gn b/services/service_manager/sandbox/BUILD.gn
index 01afbd4b..032035d 100644
--- a/services/service_manager/sandbox/BUILD.gn
+++ b/services/service_manager/sandbox/BUILD.gn
@@ -111,6 +111,8 @@
       "//third_party/fuchsia-sdk/sdk:fonts",
       "//third_party/fuchsia-sdk/sdk:logger",
       "//third_party/fuchsia-sdk/sdk:mediacodec",
+      "//third_party/fuchsia-sdk/sdk:net",
+      "//third_party/fuchsia-sdk/sdk:netstack",
       "//third_party/fuchsia-sdk/sdk:sysmem",
       "//third_party/fuchsia-sdk/sdk:ui_scenic",
     ]
diff --git a/services/service_manager/sandbox/fuchsia/sandbox_policy_fuchsia.cc b/services/service_manager/sandbox/fuchsia/sandbox_policy_fuchsia.cc
index c50e70d6..83b4624c 100644
--- a/services/service_manager/sandbox/fuchsia/sandbox_policy_fuchsia.cc
+++ b/services/service_manager/sandbox/fuchsia/sandbox_policy_fuchsia.cc
@@ -11,6 +11,8 @@
 #include <fuchsia/fonts/cpp/fidl.h>
 #include <fuchsia/logger/cpp/fidl.h>
 #include <fuchsia/mediacodec/cpp/fidl.h>
+#include <fuchsia/net/cpp/fidl.h>
+#include <fuchsia/netstack/cpp/fidl.h>
 #include <fuchsia/sysmem/cpp/fidl.h>
 #include <fuchsia/ui/scenic/cpp/fidl.h>
 #include <memory>
@@ -61,27 +63,33 @@
         // Services directory is passed by calling SetServiceDirectory().
         base::span<const char* const>(),
 
-        // kCloneJob: context process needs to be able to spawn child processes.
-        // kProvideVulkanResources: Vulkan access is required to delegate to the
-        // GPU process. kProvideSslConfig: Context process is responsible for
-        // cert verification.
+        // kCloneJob: Allow Contexts to launch child processes.
+        // kProvideVulkanResources: Context delegates this to the GPU process.
+        // kProvideSslConfig: Context delegates this to the NetworkService.
         kCloneJob | kProvideVulkanResources | kProvideSslConfig |
             kUseServiceDirectoryOverride,
     },
     {
-        SANDBOX_TYPE_RENDERER,
-        base::make_span(
-            (const char* const[]){fuchsia::fonts::Provider::Name_,
-                                  fuchsia::mediacodec::CodecFactory::Name_}),
-        0,
-    },
-    {
         SANDBOX_TYPE_GPU,
         base::make_span((const char* const[]){
             fuchsia::ui::scenic::Scenic::Name_,
             fuchsia::sysmem::Allocator::Name_, "fuchsia.vulkan.loader.Loader"}),
         kProvideVulkanResources,
     },
+    {
+        SANDBOX_TYPE_NETWORK,
+        base::make_span(
+            (const char* const[]){fuchsia::net::SocketProvider::Name_,
+                                  fuchsia::netstack::Netstack::Name_}),
+        kProvideSslConfig,
+    },
+    {
+        SANDBOX_TYPE_RENDERER,
+        base::make_span(
+            (const char* const[]){fuchsia::fonts::Provider::Name_,
+                                  fuchsia::mediacodec::CodecFactory::Name_}),
+        0,
+    },
 };
 
 constexpr SandboxConfig kDefaultConfig = {
diff --git a/services/service_manager/sandbox/mac/nacl_loader.sb b/services/service_manager/sandbox/mac/nacl_loader.sb
index 96776174..c8618da7 100644
--- a/services/service_manager/sandbox/mac/nacl_loader.sb
+++ b/services/service_manager/sandbox/mac/nacl_loader.sb
@@ -36,3 +36,10 @@
   (global-name "com.apple.PowerManagement.control")
   (global-name "com.apple.system.notification_center")
 )
+
+(if (>= os-version 1014)
+  ; Ordering of these tcsm sysctls matters. See: https://crbug.com/964353
+  (allow sysctl-read (sysctl-name "kern.tcsm_enable"))
+  (allow sysctl-write (sysctl-name "kern.tcsm_enable"))
+  (allow sysctl-read (sysctl-name "kern.tcsm_available"))
+)
diff --git a/services/service_manager/sandbox/mac/renderer.sb b/services/service_manager/sandbox/mac/renderer.sb
index 26da9a5..932c6ec3 100644
--- a/services/service_manager/sandbox/mac/renderer.sb
+++ b/services/service_manager/sandbox/mac/renderer.sb
@@ -95,7 +95,9 @@
 
 ; For V8 to use in thread calculations.
 (if (>= os-version 1014)
-  (allow sysctl-read (sysctl-name "kern.tcsm_available"))
+  ; Ordering of these tcsm sysctls matters. See: https://crbug.com/964353
   (allow sysctl-read (sysctl-name "kern.tcsm_enable"))
   (allow sysctl-write (sysctl-name "kern.tcsm_enable"))
+  (allow sysctl-read (sysctl-name "kern.tcsm_available"))
+
 )
diff --git a/services/tracing/perfetto/producer_host.cc b/services/tracing/perfetto/producer_host.cc
index 12da7a6..5eb84331 100644
--- a/services/tracing/perfetto/producer_host.cc
+++ b/services/tracing/perfetto/producer_host.cc
@@ -11,7 +11,6 @@
 #include "services/tracing/perfetto/perfetto_service.h"
 #include "services/tracing/public/cpp/perfetto/producer_client.h"
 #include "services/tracing/public/cpp/perfetto/shared_memory.h"
-#include "services/tracing/public/cpp/tracing_features.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/commit_data_request.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/data_source_descriptor.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/trace_config.h"
@@ -47,12 +46,9 @@
   //   hence we avoid any deadlocking occurring from trace events emitted from
   //   the Perfetto sequence filling up the SMB and stalling while waiting for
   //   Perfetto to free the chunks.
-  if (!base::FeatureList::IsEnabled(
-          features::kPerfettoForceOutOfProcessProducer)) {
-    base::ProcessId pid;
-    if (PerfettoService::ParsePidFromProducerName(name, &pid)) {
-      is_in_process_ = (pid == base::Process::Current().Pid());
-    }
+  base::ProcessId pid;
+  if (PerfettoService::ParsePidFromProducerName(name, &pid)) {
+    is_in_process_ = (pid == base::Process::Current().Pid());
   }
 
   // TODO(oysteine): Figure out an uid once we need it.
diff --git a/services/tracing/public/cpp/tracing_features.cc b/services/tracing/public/cpp/tracing_features.cc
index 9a20fc78..43a19ec 100644
--- a/services/tracing/public/cpp/tracing_features.cc
+++ b/services/tracing/public/cpp/tracing_features.cc
@@ -24,10 +24,6 @@
 const base::Feature kBackgroundTracingProtoOutput{
     "BackgroundTracingProtoOutput", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Causes Perfetto to run in-process mode for in-process tracing producers.
-const base::Feature kPerfettoForceOutOfProcessProducer{
-    "PerfettoForceOutOfProcessProducer", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Runs the tracing service as an in-process browser service.
 const base::Feature kTracingServiceInProcess {
   "TracingServiceInProcess",
diff --git a/services/tracing/public/cpp/tracing_features.h b/services/tracing/public/cpp/tracing_features.h
index ef0bbe8..4d282d6e 100644
--- a/services/tracing/public/cpp/tracing_features.h
+++ b/services/tracing/public/cpp/tracing_features.h
@@ -24,9 +24,6 @@
 extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
     kBackgroundTracingProtoOutput;
 
-extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
-    kPerfettoForceOutOfProcessProducer;
-
 }  // namespace features
 
 namespace tracing {
diff --git a/services/ws/BUILD.gn b/services/ws/BUILD.gn
deleted file mode 100644
index ee84cb40..0000000
--- a/services/ws/BUILD.gn
+++ /dev/null
@@ -1,258 +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("//build/config/ui.gni")
-import("//mojo/public/tools/bindings/mojom.gni")
-import("//testing/test.gni")
-
-component("lib") {
-  friend = [
-    ":tests",
-    ":test_support",
-
-    # It's ok for tests to depend upon private code.
-    "//ash:ash_unittests",
-  ]
-  public = [
-    "event_queue.h",
-    "ids.h",
-    "top_level_proxy_window.h",
-    "window_delegate_impl.h",
-    "window_manager_interface.h",
-    "window_properties.h",
-    "window_service.h",
-    "window_service_delegate.h",
-    "window_service_observer.h",
-    "window_tree.h",
-    "window_tree_binding.h",
-    "window_tree_factory.h",
-    "window_utils.h",
-  ]
-  sources = [
-    "client_change.cc",
-    "client_change.h",
-    "client_change_tracker.cc",
-    "client_change_tracker.h",
-    "client_root.cc",
-    "client_root.h",
-    "drag_drop_delegate.cc",
-    "drag_drop_delegate.h",
-    "embedding.cc",
-    "embedding.h",
-    "event_injector.cc",
-    "event_injector.h",
-    "event_observer_helper.cc",
-    "event_observer_helper.h",
-    "event_queue.cc",
-    "focus_handler.cc",
-    "focus_handler.h",
-    "injected_event_handler.cc",
-    "injected_event_handler.h",
-    "proxy_window.cc",
-    "proxy_window.h",
-    "remoting_event_injector.cc",
-    "remoting_event_injector.h",
-    "screen_provider.cc",
-    "screen_provider.h",
-    "top_level_proxy_window_impl.cc",
-    "top_level_proxy_window_impl.h",
-    "topmost_window_observer.cc",
-    "topmost_window_observer.h",
-    "user_activity_monitor.cc",
-    "user_activity_monitor.h",
-    "window_delegate_impl.cc",
-    "window_occlusion_change_builder.cc",
-    "window_occlusion_change_builder.h",
-    "window_properties.cc",
-    "window_server_test_impl.cc",
-    "window_server_test_impl.h",
-    "window_service.cc",
-    "window_service_delegate.cc",
-    "window_tree.cc",
-    "window_tree_binding.cc",
-    "window_tree_factory.cc",
-    "window_utils.cc",
-  ]
-
-  configs += [ "//build/config/compiler:wexit_time_destructors" ]
-
-  public_deps = [
-    "//components/discardable_memory/public/interfaces",
-    "//components/viz/host",
-    "//services/service_manager/public/cpp",
-    "//services/ws/common",
-    "//services/ws/ime:lib",
-    "//services/ws/input_devices",
-    "//services/ws/public/mojom",
-    "//ui/aura",
-    "//ui/aura_extra:window_position_in_root_monitor",
-    "//ui/base/ime/mojo",
-    "//ui/base/mojo:lib",
-    "//ui/wm",
-    "//ui/wm/public",
-  ]
-
-  deps = [
-    "//components/viz/common",
-    "//services/ws/public/cpp",
-    "//services/ws/public/cpp/host",
-    "//skia",
-  ]
-
-  if (use_ozone) {
-    deps += [ "//ui/ozone" ]
-  }
-
-  defines = [ "IS_WINDOW_SERVICE_IMPL" ]
-}
-
-source_set("host") {
-  public = [
-    "host_context_factory.h",
-  ]
-  sources = [
-    "host_context_factory.cc",
-  ]
-
-  configs += [ "//build/config/compiler:wexit_time_destructors" ]
-
-  deps = [
-    ":lib",
-    "//cc/mojo_embedder",
-    "//components/viz/client",
-    "//components/viz/common",
-    "//components/viz/host",
-    "//services/viz/privileged/interfaces/compositing",
-    "//services/viz/public/interfaces",
-    "//services/ws/public/cpp",
-    "//services/ws/public/cpp/gpu",
-    "//ui/compositor",
-    "//ui/compositor/host",
-  ]
-}
-
-static_library("test_support") {
-  testonly = true
-
-  sources = [
-    "client_root_test_helper.cc",
-    "client_root_test_helper.h",
-    "event_queue_test_helper.cc",
-    "event_queue_test_helper.h",
-    "event_test_utils.cc",
-    "event_test_utils.h",
-    "proxy_window_test_helper.cc",
-    "proxy_window_test_helper.h",
-    "test_change_tracker.cc",
-    "test_change_tracker.h",
-    "test_screen_provider_observer.cc",
-    "test_screen_provider_observer.h",
-    "test_window_service_delegate.cc",
-    "test_window_service_delegate.h",
-    "test_window_tree_client.cc",
-    "test_window_tree_client.h",
-    "window_server_service_test_base.cc",
-    "window_server_service_test_base.h",
-    "window_service_test_helper.cc",
-    "window_service_test_helper.h",
-    "window_service_test_setup.cc",
-    "window_service_test_setup.h",
-    "window_tree_test_helper.cc",
-    "window_tree_test_helper.h",
-  ]
-
-  deps = [
-    ":lib",
-    "//base",
-    "//base/test:test_support",
-    "//components/viz/test:test_support",
-    "//mojo/public/cpp/bindings:bindings",
-    "//services/service_manager/public/cpp",
-    "//services/service_manager/public/cpp/test:test_support",
-    "//services/viz/public/cpp:manifest",
-    "//services/ws/common",
-    "//services/ws/public/cpp",
-    "//services/ws/public/cpp/host",
-    "//services/ws/public/mojom",
-    "//services/ws/test_ws:manifest",
-    "//testing/gtest",
-    "//ui/aura",
-    "//ui/aura:test_support",
-    "//ui/compositor:test_support",
-    "//ui/display:test_support",
-    "//ui/events:test_support",
-    "//ui/gfx/geometry/mojo",
-    "//ui/gl",
-    "//ui/gl:test_support",
-    "//ui/wm",
-  ]
-
-  data_deps = [
-    "//services/viz",
-    "//services/ws/ime/test_ime_driver",
-  ]
-}
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "client_root_unittest.cc",
-    "drag_drop_delegate_unittest.cc",
-    "embedding_unittest.cc",
-    "event_injector_unittest.cc",
-    "event_queue_unittest.cc",
-    "focus_handler_unittest.cc",
-    "injected_event_handler_unittest.cc",
-    "proxy_window_unittest.cc",
-    "screen_provider_unittest.cc",
-    "topmost_window_observer_unittest.cc",
-    "user_activity_monitor_unittest.cc",
-    "window_delegate_impl_unittest.cc",
-    "window_service_observer_unittest.cc",
-    "window_service_unittest.cc",
-    "window_tree_client_unittest.cc",
-    "window_tree_unittest.cc",
-  ]
-
-  deps = [
-    ":lib",
-    ":test_mojom",
-    ":test_support",
-    "//base",
-    "//base/test:test_support",
-    "//components/viz/common",
-    "//components/viz/test:test_support",
-    "//mojo/public/cpp/bindings",
-    "//services/service_manager/public/cpp/test:test_support",
-    "//services/service_manager/public/mojom",
-    "//services/ws/common:task_runner_test_base",
-    "//services/ws/gpu_host:tests",
-    "//services/ws/public/cpp",
-    "//services/ws/public/cpp/host",
-    "//services/ws/public/mojom",
-    "//testing/gtest",
-    "//third_party/mesa_headers",
-    "//ui/aura:test_support",
-    "//ui/events:test_support",
-    "//ui/platform_window",
-    "//ui/wm",
-  ]
-
-  data_deps = [
-    "//services/ws/test_ws",
-  ]
-
-  if (toolkit_views) {
-    deps += [ "//services/ws/remote_view_host:tests" ]
-  }
-}
-
-mojom("test_mojom") {
-  testonly = true
-
-  sources = [
-    "test_wm.mojom",
-  ]
-}
diff --git a/services/ws/OWNERS b/services/ws/OWNERS
deleted file mode 100644
index 6aec85b..0000000
--- a/services/ws/OWNERS
+++ /dev/null
@@ -1,14 +0,0 @@
-# COMPONENT: Internals>Services>WindowService
-
-msw@chromium.org
-mukai@chromium.org
-sadrul@chromium.org
-sky@chromium.org
-xiyuan@chromium.org
-
-per-file *_type_converter*.*=set noparent
-per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS
-
-
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/README.md b/services/ws/README.md
deleted file mode 100644
index 7f75b01..0000000
--- a/services/ws/README.md
+++ /dev/null
@@ -1,105 +0,0 @@
-This directory contains the code for building a Window Service
-implementation on top of an existing Aura hierarchy.
-
-Each client is managed by an instance of WindowTree. In this directory, a client
-generally means a unique connection to the WindowService. More specifically a
-client is an implementation of ws::mojom::WindowTreeClient.
-WindowTree implements the ws::mojom::WindowTree implementation that is
-passed to the client. WindowTree creates a ClientRoot for the window the client
-is embedded in, as well as a ClientRoot for all top-level window requests.
-
-Clients establish a connection to the WindowService by configuring Aura with a
-mode of MUS. See aura::Env::Mode for details.
-
-The WindowService provides a way for one client to embed another client in a
-specific window (application composition). Embedding establishes a connection
-to a new client and provides the embedded client with a window to use. See the
-mojom for more details.
-
-For example, on Chrome OS, Ash uses the WindowService to enable separate
-processes, such as the tap_visualizer, to connect to the WindowService. The
-tap_visualizer is a client of the WindowService. The tap_visualizer uses the
-WindowService to create and manage windows, receive events, and ultimately
-draw to the screen (using Viz). This is mostly seamless to the tap_visualizer.
-The tap_visualizer configures Views to use Mus, which results in Views and Aura,
-using the WindowService.
-
-## Ids
-
-Each client connected to the Window Service is assigned a unique id inside the
-Window Service. This id is a monotonically increasing uint32_t. This is often
-referred to as the client_id.
-
-As clients do not know their id, they always supply 0 as the client id in the
-mojom related functions. Internally the Window Service maps 0 to the real client
-id.
-
-Windows have a couple of different (related) ids.
-
-### ClientWindowId
-
-ClientWindowId is a uint64_t pairing of a client_id and a window_id. The
-window_id is a uint32_t assigned by the client, and should be unique within that
-client's scope. When communicating with the Window Service, clients may use 0 as
-the client_id to refer to their own windows. The Window Service maps 0 to the
-real client_id. In Window Service code the id from the client is typically
-referred to as the transport_window_id. Mojom functions that receive the
-transport_window_id map it to a ClientWindowId. ClientWindowId is a real class
-that provides type safety.
-
-When a client is embedded in an existing window, the embedded client is given
-visibility to a Window created by the embedder. In this case the Window Service
-supplies the ClientWindowId to the embedded client and uses the ClientWindowId
-at the time the Window was created (the ClientWindowId actually comes from the
-FrameSinkId, see below for details on FrameSinkId). In other words, both the
-embedder and embedded client use the same ClientWindowId for the Window. See
-discussion on FrameSinkId for more details.
-
-For a client to establish an embed root, it first calls
-ScheduleEmbedForExistingClient(), so it can provide a window_id that is unique
-within its own scope. That client then passes the returned token to what will
-become its embedder to call EmbedUsingToken(). In this case, the embedder and
-embedded client do not use the same ClientWindowId for the Window.
-
-ClientWindowId is globally unique, but a Window may have multiple
-ClientWindowIds associated with it.
-
-### FrameSinkId
-
-Each Window has a FrameSinkId that is needed for both hit-testing and
-embedding. The FrameSinkId is initialized to the ClientWindowId of the client
-creating the Window, but it changes during an embedding. In particular, when a
-client calls Embed() the FrameSinkId of the Window changes such that the
-client_id of the FrameSinkId matches the client_id of the client being
-embedded and the sink_id is set to 0. The embedder is informed of this by way of
-OnFrameSinkIdAllocated(). The embedded client is informed of the original
-FrameSinkId (the client_id of the FrameSinkId matches the embedder's client_id).
-In client code the embedded client ends up *always* using a client_id of 0 for
-the FrameSinkId. This works because Viz knows the real client_id and handles
-mapping 0 to the real client_id.
-
-The FrameSinkId of top-level windows is set to the ClientWindowId from the
-client requesting the top-level (top-levels are created and owned by the Window
-Manager). The Window Manager is told the updated FrameSinkId when it is asked
-to create the top-level (WmCreateTopLevelWindow()).
-
-The FrameSinkId of an embed root's Window is set to the ClientWindowId of the
-embed root's Window from the embedded client.
-
-### LocalSurfaceId
-
-The LocalSurfaceId (which contains unguessable) is necessary if the client wants
-to submit a compositor-frame for the Window (it wants to show something on
-screen), and not needed if the client only wants to submit a hit-test region.
-The LocalSurfaceId may be assigned when the bounds and/or device-scale-factor
-changes. The LocalSurfaceId can change at other times as well (perhaps to
-synchronize an effect with the embedded client). The LocalSurfaceId is intended
-to allow for smooth resizes and ensures at embed points the CompositorFrame from
-both clients match. Client code supplies a LocalSurfaceId for windows that have
-another client embedded in them as well as windows with a LayerTreeFrameSink.
-The LocalSurfaceId comes from the owner of the window. The embedded client is
-told of changes to the LocalSurfaceId by way of OnWindowBoundsChanged(). This is
-still very much a work in progress.
-
-FrameSinkId is derived from the embedded client, where as LocalSurfaceId
-comes from the embedder.
diff --git a/services/ws/client_change.cc b/services/ws/client_change.cc
deleted file mode 100644
index 3b91cc6..0000000
--- a/services/ws/client_change.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "services/ws/client_change.h"
-
-#include <utility>
-
-#include "services/ws/client_change_tracker.h"
-#include "ui/aura/window.h"
-
-namespace ws {
-
-ClientChange::ClientChange(ClientChangeTracker* tracker,
-                           aura::Window* window,
-                           ClientChangeType type,
-                           const void* property_key)
-    : tracker_(tracker), type_(type), property_key_(property_key) {
-  DCHECK(!tracker_->current_change_);
-  tracker_->current_change_ = this;
-  if (window)
-    window_tracker_.Add(window);
-}
-
-ClientChange::~ClientChange() {
-  DCHECK_EQ(this, tracker_->current_change_);
-  tracker_->current_change_ = nullptr;
-}
-
-}  // namespace ws
diff --git a/services/ws/client_change.h b/services/ws/client_change.h
deleted file mode 100644
index c32af7f7..0000000
--- a/services/ws/client_change.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_CLIENT_CHANGE_H_
-#define SERVICES_WS_CLIENT_CHANGE_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "ui/aura/window_tracker.h"
-
-namespace aura {
-class Window;
-}
-
-namespace ws {
-
-class ClientChangeTracker;
-
-// Describes the type of the change. Maps to the incoming change from the
-// client.
-enum class ClientChangeType {
-  // Used for WindowTree::SetWindowBounds().
-  kBounds,
-  // Used for WindowTree::SetCapture() and WindowTree::ReleaseCapture().
-  kCapture,
-  // Used for WindowTree::SetFocus().
-  kFocus,
-  // Used for WindowTree::SetWindowProperty().
-  kProperty,
-  // Used for WindowTree::SetWindowVisibility().
-  kVisibility,
-};
-
-// ClientChange represents an incoming request from a WindowTreeClient. For
-// example, SetWindowBounds() is a request to change the kBounds property of
-// the window.
-class COMPONENT_EXPORT(WINDOW_SERVICE) ClientChange {
- public:
-  // |property_key| is only used for changes of type kProperty.
-  ClientChange(ClientChangeTracker* tracker,
-               aura::Window* window,
-               ClientChangeType type,
-               const void* property_key = nullptr);
-  ~ClientChange();
-
-  // The window the changes associated with. Is null if the window has been
-  // destroyed during processing.
-  aura::Window* window() {
-    return const_cast<aura::Window*>(
-        const_cast<const ClientChange*>(this)->window());
-  }
-
-  const aura::Window* window() const {
-    return !window_tracker_.windows().empty() ? window_tracker_.windows()[0]
-                                              : nullptr;
-  }
-
-  ClientChangeType type() const { return type_; }
-  const void* property_key() const { return property_key_; }
-
- private:
-  ClientChangeTracker* tracker_;
-  aura::WindowTracker window_tracker_;
-  const ClientChangeType type_;
-  const void* property_key_;
-
-  DISALLOW_COPY_AND_ASSIGN(ClientChange);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_CLIENT_CHANGE_H_
diff --git a/services/ws/client_change_tracker.cc b/services/ws/client_change_tracker.cc
deleted file mode 100644
index c100a1fa..0000000
--- a/services/ws/client_change_tracker.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "services/ws/client_change_tracker.h"
-
-#include "services/ws/client_change.h"
-
-namespace ws {
-
-ClientChangeTracker::ClientChangeTracker() = default;
-
-ClientChangeTracker::~ClientChangeTracker() = default;
-
-bool ClientChangeTracker::IsProcessingChangeForWindow(
-    aura::Window* window,
-    ClientChangeType type) const {
-  return DoesCurrentChangeEqual(window, type, nullptr);
-}
-
-bool ClientChangeTracker::IsProcessingPropertyChangeForWindow(
-    aura::Window* window,
-    const void* property_key) const {
-  return DoesCurrentChangeEqual(window, ClientChangeType::kProperty,
-                                property_key);
-}
-
-bool ClientChangeTracker::DoesCurrentChangeEqual(
-    aura::Window* window,
-    ClientChangeType type,
-    const void* property_key) const {
-  return current_change_ && current_change_->window() == window &&
-         current_change_->type() == type &&
-         current_change_->property_key() == property_key;
-}
-
-}  // namespace ws
diff --git a/services/ws/client_change_tracker.h b/services/ws/client_change_tracker.h
deleted file mode 100644
index c510ee44..0000000
--- a/services/ws/client_change_tracker.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_CLIENT_CHANGE_TRACKER_H_
-#define SERVICES_WS_CLIENT_CHANGE_TRACKER_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-
-namespace aura {
-class Window;
-}
-
-namespace ws {
-
-class ClientChange;
-
-enum class ClientChangeType;
-
-// Tracks the active change from the client. There is at most one change from a
-// client at a time.
-class COMPONENT_EXPORT(WINDOW_SERVICE) ClientChangeTracker {
- public:
-  ClientChangeTracker();
-  ~ClientChangeTracker();
-
-  bool IsProcessingChangeForWindow(aura::Window* window,
-                                   ClientChangeType type) const;
-  bool IsProcessingPropertyChangeForWindow(aura::Window* window,
-                                           const void* property_key) const;
-
- private:
-  friend class ClientChange;
-
-  bool DoesCurrentChangeEqual(aura::Window* window,
-                              ClientChangeType type,
-                              const void* property_key) const;
-
-  // Owned by the caller that created the ClientChange. This is set in
-  // ClientChange's constructor and reset in the destructor.
-  ClientChange* current_change_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(ClientChangeTracker);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_CLIENT_CHANGE_TRACKER_H_
diff --git a/services/ws/client_root.cc b/services/ws/client_root.cc
deleted file mode 100644
index 71ae8234..0000000
--- a/services/ws/client_root.cc
+++ /dev/null
@@ -1,513 +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.
-
-#include "services/ws/client_root.h"
-
-#include "base/bind.h"
-#include "base/callback_forward.h"
-#include "base/command_line.h"
-#include "base/memory/ptr_util.h"
-#include "base/trace_event/trace_event.h"
-#include "components/viz/common/surfaces/surface_info.h"
-#include "components/viz/host/host_frame_sink_manager.h"
-#include "services/ws/client_change.h"
-#include "services/ws/client_change_tracker.h"
-#include "services/ws/common/switches.h"
-#include "services/ws/proxy_window.h"
-#include "services/ws/top_level_proxy_window.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/env.h"
-#include "ui/aura/mus/client_surface_embedder.h"
-#include "ui/aura/mus/property_converter.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/aura_extra/window_position_in_root_monitor.h"
-#include "ui/base/layout.h"
-#include "ui/compositor/compositor.h"
-#include "ui/compositor/dip_util.h"
-#include "ui/compositor/property_change_reason.h"
-#include "ui/display/display.h"
-#include "ui/display/screen.h"
-#include "ui/gfx/geometry/point_conversions.h"
-#include "ui/wm/core/coordinate_conversion.h"
-
-namespace ws {
-namespace {
-
-bool ShouldAssignLocalSurfaceIdImpl(aura::Window* window, bool is_top_level) {
-  // The window service assigns LocalSurfaceIds in two cases:
-  // . Top-levels. This is because the window service is the one creating the
-  //   Window, and effectively embedding the client.
-  // . An embedding created by a WindowTree that was not itself embedded. This
-  //   scenario is similar to top-levels, where the Window is not itself
-  //   embedded in another window. An example of this is the app-list embedding
-  //   a Window that contains a WebContents, where the app-list runs in process
-  //   (not using the window-service APIs).
-  if (is_top_level)
-    return true;
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  return proxy_window->owning_window_tree() == nullptr;
-}
-
-// Returns the bounds of the |window| in screen coordinate, without affect of
-// the gfx::Transform. aura::Window::GetBoundsInScreen() is affected by
-// Transform and may return wrong origin on overview mode, which may confuse
-// locations of transient clients or tooltip windows. See
-// https://crbug.com/931161.
-gfx::Rect GetBoundsToSend(aura::Window* window) {
-  gfx::Rect bounds = window->bounds();
-  // Window may not have the root window in some tests, so use the topmost
-  // window in the hierarchy for root window.
-  aura::Window* root = window;
-  for (auto* w = window->parent(); w; w = w->parent()) {
-    bounds += w->bounds().OffsetFromOrigin();
-    root = w;
-  }
-  // Typically root window bounds should be (0, 0), but it's not on some tests.
-  bounds += (root->GetBoundsInScreen().origin() - root->bounds().origin());
-  return bounds;
-}
-
-// Converts the size of the window to pixels. This function must match that used
-// by WindowTreeHostMus (otherwise this code may not generate a new
-// LocalSurfaceId when the client believes one should be generated). See
-// https://crbug.com/952095 for more details.
-gfx::Size ConvertWindowSizeToPixels(aura::Window* window) {
-  return gfx::ScaleToCeiledSize(window->bounds().size(),
-                                window->layer()->device_scale_factor());
-}
-
-}  // namespace
-
-ClientRoot::ClientRoot(WindowTree* window_tree,
-                       aura::Window* window,
-                       bool is_top_level)
-    : window_tree_(window_tree),
-      window_(window),
-      is_top_level_(is_top_level),
-      last_bounds_(GetBoundsToSend(window)),
-      last_visible_(!is_top_level && window->IsVisible()),
-      last_display_id_(display::kInvalidDisplayId) {
-  window_->AddObserver(this);
-  if (window_->GetHost())
-    window->GetHost()->AddObserver(this);
-  display::Screen::GetScreen()->AddObserver(this);
-  client_surface_embedder_ =
-      std::make_unique<aura::ClientSurfaceEmbedder>(window_);
-  if (ShouldAssignLocalSurfaceIdImpl(window, is_top_level_))
-    parent_local_surface_id_allocator_.emplace();
-  // Ensure there is a valid LocalSurfaceId (if necessary).
-  GenerateLocalSurfaceIdIfNecessary();
-  if (!is_top_level) {
-    root_position_monitor_ =
-        std::make_unique<aura_extra::WindowPositionInRootMonitor>(
-            window, base::BindRepeating(&ClientRoot::OnPositionInRootChanged,
-                                        base::Unretained(this)));
-  }
-}
-
-ClientRoot::~ClientRoot() {
-  if (force_visible_)
-    force_visible_->OnClientRootDestroyed();
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window_);
-  window_->RemoveObserver(this);
-  if (window_->GetHost())
-    window_->GetHost()->RemoveObserver(this);
-  display::Screen::GetScreen()->RemoveObserver(this);
-
-  viz::HostFrameSinkManager* host_frame_sink_manager =
-      aura::Env::GetInstance()
-          ->context_factory_private()
-          ->GetHostFrameSinkManager();
-  host_frame_sink_manager->InvalidateFrameSinkId(proxy_window->frame_sink_id());
-}
-
-void ClientRoot::RegisterVizEmbeddingSupport() {
-  // This function should only be called once.
-  viz::HostFrameSinkManager* host_frame_sink_manager =
-      aura::Env::GetInstance()
-          ->context_factory_private()
-          ->GetHostFrameSinkManager();
-  viz::FrameSinkId frame_sink_id =
-      ProxyWindow::GetMayBeNull(window_)->frame_sink_id();
-  // This code only needs first-surface-activation for tests.
-  const bool wants_first_surface_activation =
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kUseTestConfig);
-  host_frame_sink_manager->RegisterFrameSinkId(
-      frame_sink_id, this,
-      wants_first_surface_activation ? viz::ReportFirstSurfaceActivation::kYes
-                                     : viz::ReportFirstSurfaceActivation::kNo);
-  window_->SetEmbedFrameSinkId(frame_sink_id);
-
-  UpdateLocalSurfaceIdAndClientSurfaceEmbedder();
-}
-
-void ClientRoot::OnForceVisibleDestroyed() {
-  force_visible_ = nullptr;
-  NotifyClientOfVisibilityChange();
-}
-
-void ClientRoot::GenerateLocalSurfaceIdIfNecessary() {
-  if (!ShouldAssignLocalSurfaceId())
-    return;
-
-  gfx::Size size_in_pixels = ConvertWindowSizeToPixels(window_);
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window_);
-  // It's expected by cc code that any time the size changes a new
-  // LocalSurfaceId is used.
-  if (last_surface_size_in_pixels_ != size_in_pixels ||
-      !proxy_window->local_surface_id_allocation().has_value() ||
-      last_device_scale_factor_ != window_->layer()->device_scale_factor()) {
-    parent_local_surface_id_allocator_->GenerateId();
-    UpdateSurfacePropertiesCache();
-  }
-}
-
-void ClientRoot::UpdateSurfacePropertiesCache() {
-  ProxyWindow::GetMayBeNull(window_)->set_local_surface_id_allocation(
-      parent_local_surface_id_allocator_->GetCurrentLocalSurfaceIdAllocation());
-  last_device_scale_factor_ = window_->layer()->device_scale_factor();
-  last_surface_size_in_pixels_ = ConvertWindowSizeToPixels(window_);
-}
-
-bool ClientRoot::SetBoundsInScreenFromClient(
-    const gfx::Rect& bounds,
-    const base::Optional<viz::LocalSurfaceIdAllocation>& allocation) {
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window_);
-  const base::Optional<viz::LocalSurfaceIdAllocation> starting_allocation =
-      proxy_window->local_surface_id_allocation();
-  {
-    base::AutoReset<bool> resetter(&setting_bounds_from_client_, true);
-    display::Display dst_display =
-        display::Screen::GetScreen()->GetDisplayMatching(bounds);
-    window_->SetBoundsInScreen(bounds, dst_display);
-  }
-  if (allocation)
-    parent_local_surface_id_allocator_->UpdateFromChild(*allocation);
-
-  const bool needs_new_surface_id =
-      !allocation || bounds.size() != window_->bounds().size();
-  if (needs_new_surface_id)
-    parent_local_surface_id_allocator_->GenerateId();
-  UpdateSurfacePropertiesCache();
-
-  if (starting_allocation != proxy_window->local_surface_id_allocation())
-    UpdateLocalSurfaceIdAndClientSurfaceEmbedder();
-
-  const bool succeeded = bounds == GetBoundsToSend(window_);
-  // The bounds and id form a unique pair, so that if either differ from what
-  // the client requested, the client needs to be notified by way of
-  // NotifyClientOfNewBounds().
-  if (!succeeded || needs_new_surface_id)
-    NotifyClientOfNewBounds();
-  return succeeded;
-}
-
-void ClientRoot::UpdateLocalSurfaceIdFromChild(
-    const viz::LocalSurfaceIdAllocation& local_surface_id_allocation) {
-  if (!parent_local_surface_id_allocator_->UpdateFromChild(
-          local_surface_id_allocation)) {
-    return;
-  }
-
-  UpdateSurfacePropertiesCache();
-
-  UpdateLocalSurfaceIdAndClientSurfaceEmbedder();
-}
-
-void ClientRoot::OnLocalSurfaceIdChanged() {
-  if (ShouldAssignLocalSurfaceId())
-    return;
-
-  HandleBoundsOrScaleFactorChange();
-}
-
-void ClientRoot::AllocateLocalSurfaceIdAndNotifyClient() {
-  if (!ShouldAssignLocalSurfaceId())
-    return;
-
-  // Setting a null LocalSurfaceIdAllocation forces allocating a new one.
-  ProxyWindow::GetMayBeNull(window_)->set_local_surface_id_allocation(
-      base::nullopt);
-  UpdateLocalSurfaceIdAndClientSurfaceEmbedder();
-  NotifyClientOfNewBounds();
-}
-
-void ClientRoot::AttachChildFrameSinkId(ProxyWindow* proxy_window) {
-  DCHECK(proxy_window->attached_frame_sink_id().is_valid());
-  DCHECK(ProxyWindow::GetMayBeNull(window_)->frame_sink_id().is_valid());
-  viz::HostFrameSinkManager* host_frame_sink_manager =
-      aura::Env::GetInstance()
-          ->context_factory_private()
-          ->GetHostFrameSinkManager();
-  const viz::FrameSinkId& frame_sink_id =
-      proxy_window->attached_frame_sink_id();
-  if (host_frame_sink_manager->IsFrameSinkIdRegistered(frame_sink_id)) {
-    host_frame_sink_manager->RegisterFrameSinkHierarchy(
-        ProxyWindow::GetMayBeNull(window_)->frame_sink_id(), frame_sink_id);
-  }
-}
-
-void ClientRoot::UnattachChildFrameSinkId(ProxyWindow* proxy_window) {
-  DCHECK(proxy_window->attached_frame_sink_id().is_valid());
-  DCHECK(ProxyWindow::GetMayBeNull(window_)->frame_sink_id().is_valid());
-  viz::HostFrameSinkManager* host_frame_sink_manager =
-      aura::Env::GetInstance()
-          ->context_factory_private()
-          ->GetHostFrameSinkManager();
-  const viz::FrameSinkId& root_frame_sink_id =
-      ProxyWindow::GetMayBeNull(window_)->frame_sink_id();
-  const viz::FrameSinkId& window_frame_sink_id =
-      proxy_window->attached_frame_sink_id();
-  if (host_frame_sink_manager->IsFrameSinkHierarchyRegistered(
-          root_frame_sink_id, window_frame_sink_id)) {
-    host_frame_sink_manager->UnregisterFrameSinkHierarchy(root_frame_sink_id,
-                                                          window_frame_sink_id);
-  }
-}
-
-void ClientRoot::AttachChildFrameSinkIdRecursive(ProxyWindow* proxy_window) {
-  if (proxy_window->attached_frame_sink_id().is_valid())
-    AttachChildFrameSinkId(proxy_window);
-
-  for (aura::Window* child : proxy_window->window()->children()) {
-    ProxyWindow* child_proxy_window = ProxyWindow::GetMayBeNull(child);
-    if (child_proxy_window->owning_window_tree() == window_tree_)
-      AttachChildFrameSinkIdRecursive(child_proxy_window);
-  }
-}
-
-void ClientRoot::UnattachChildFrameSinkIdRecursive(ProxyWindow* proxy_window) {
-  if (proxy_window->attached_frame_sink_id().is_valid())
-    UnattachChildFrameSinkId(proxy_window);
-
-  for (aura::Window* child : proxy_window->window()->children()) {
-    ProxyWindow* child_proxy_window = ProxyWindow::GetMayBeNull(child);
-    if (child_proxy_window->owning_window_tree() == window_tree_)
-      UnattachChildFrameSinkIdRecursive(child_proxy_window);
-  }
-}
-
-std::unique_ptr<ScopedForceVisible> ClientRoot::ForceWindowVisible() {
-  // At this time there is only a need for a single force visible.
-  DCHECK(!force_visible_);
-  // Use WrapUnique() as constructor is private.
-  std::unique_ptr<ScopedForceVisible> force_visible =
-      base::WrapUnique(new ScopedForceVisible(this));
-  force_visible_ = force_visible.get();
-  NotifyClientOfVisibilityChange();
-  return force_visible;
-}
-
-void ClientRoot::OnWindowTreeHostDisplayIdChanged() {
-  if (last_display_id_ != window_->GetHost()->GetDisplayId())
-    NotifyClientOfDisplayIdChange();
-}
-
-void ClientRoot::UpdateLocalSurfaceIdAndClientSurfaceEmbedder() {
-  GenerateLocalSurfaceIdIfNecessary();
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window_);
-  if (!proxy_window->local_surface_id_allocation().has_value())
-    return;
-
-  const viz::SurfaceId surface_id(
-      window_->GetFrameSinkId(),
-      proxy_window->local_surface_id_allocation()->local_surface_id());
-  const bool surface_id_changed =
-      surface_id != client_surface_embedder_->GetSurfaceId();
-  client_surface_embedder_->SetSurfaceId(surface_id);
-
-  // This triggers holding events until the frame has been activated. This
-  // ensures smooth resizes.
-  if (surface_id_changed && ShouldAssignLocalSurfaceId() && window_->GetHost())
-    window_->GetHost()->compositor()->OnChildResizing();
-}
-
-void ClientRoot::CheckForScaleFactorChange() {
-  if (!ShouldAssignLocalSurfaceId() ||
-      last_device_scale_factor_ == window_->layer()->device_scale_factor()) {
-    return;
-  }
-
-  HandleBoundsOrScaleFactorChange();
-}
-
-void ClientRoot::HandleBoundsOrScaleFactorChange() {
-  if (setting_bounds_from_client_)
-    return;
-
-  UpdateLocalSurfaceIdAndClientSurfaceEmbedder();
-  NotifyClientOfNewBounds();
-}
-
-void ClientRoot::NotifyClientOfNewBounds() {
-  last_bounds_ = GetBoundsToSend(window_);
-  auto id = ProxyWindow::GetMayBeNull(window_)->local_surface_id_allocation();
-  TRACE_EVENT_WITH_FLOW0("ui", "ClientRoot::NotifyClientOfNewBounds",
-                         id->local_surface_id().hash(),
-                         TRACE_EVENT_FLAG_FLOW_OUT);
-  window_tree_->window_tree_client_->OnWindowBoundsChanged(
-      window_tree_->TransportIdForWindow(window_), last_bounds_,
-      window_->GetProperty(aura::client::kShowStateKey),
-      ProxyWindow::GetMayBeNull(window_)->local_surface_id_allocation());
-}
-
-void ClientRoot::NotifyClientOfVisibilityChange(base::Optional<bool> visible) {
-  const bool new_value = visible.has_value() ? *visible : IsWindowVisible();
-  if (last_visible_ == new_value)
-    return;
-
-  last_visible_ = new_value;
-  if (!window_tree_->property_change_tracker_->IsProcessingChangeForWindow(
-          window_, ClientChangeType::kVisibility)) {
-    window_tree_->window_tree_client_->OnWindowVisibilityChanged(
-        window_tree_->TransportIdForWindow(window_), last_visible_);
-  }
-}
-
-void ClientRoot::NotifyClientOfDisplayIdChange() {
-  last_display_id_ = window_->GetHost()->GetDisplayId();
-  window_tree_->window_tree_client_->OnWindowDisplayChanged(
-      window_tree_->TransportIdForWindow(window_), last_display_id_);
-}
-
-void ClientRoot::OnPositionInRootChanged() {
-  DCHECK(!is_top_level_);
-  gfx::Rect bounds_in_screen = GetBoundsToSend(window_);
-  if (bounds_in_screen.origin() != last_bounds_.origin())
-    NotifyClientOfNewBounds();
-}
-
-bool ClientRoot::IsWindowVisible() {
-  if (force_visible_)
-    return true;
-
-  return is_top_level_ ? window_->TargetVisibility() : window_->IsVisible();
-}
-
-void ClientRoot::OnWindowPropertyChanged(aura::Window* window,
-                                         const void* key,
-                                         intptr_t old) {
-  if (window_tree_->property_change_tracker_
-          ->IsProcessingPropertyChangeForWindow(window, key)) {
-    // Do not send notifications for changes intiated by the client.
-    return;
-  }
-  std::string transport_name;
-  std::unique_ptr<std::vector<uint8_t>> transport_value;
-  if (window_tree_->window_service()
-          ->property_converter()
-          ->ConvertPropertyForTransport(window, key, &transport_name,
-                                        &transport_value)) {
-    base::Optional<std::vector<uint8_t>> transport_value_mojo;
-    if (transport_value)
-      transport_value_mojo.emplace(std::move(*transport_value));
-    window_tree_->window_tree_client_->OnWindowSharedPropertyChanged(
-        window_tree_->TransportIdForWindow(window), transport_name,
-        transport_value_mojo);
-  }
-}
-
-void ClientRoot::OnWindowBoundsChanged(aura::Window* window,
-                                       const gfx::Rect& old_bounds,
-                                       const gfx::Rect& new_bounds,
-                                       ui::PropertyChangeReason reason) {
-  if (setting_bounds_from_client_)
-    return;
-
-  // Early out when a top level is in middle of moving to a new display.
-  // Bounds change will be sent after it is added to the new root window.
-  if (is_top_level_ && is_moving_across_displays_)
-    return;
-
-  HandleBoundsOrScaleFactorChange();
-}
-
-void ClientRoot::OnWindowAddedToRootWindow(aura::Window* window) {
-  DCHECK_EQ(window, window_);
-  DCHECK(window->GetHost());
-  window->GetHost()->AddObserver(this);
-
-  is_moving_across_displays_ = false;
-  NotifyClientOfDisplayIdChange();
-
-  // When added to a new root window, the window bounds in screen may have
-  // changed even though its bounds in the root window remain the same.
-  if (is_top_level_)
-    HandleBoundsOrScaleFactorChange();
-  else
-    CheckForScaleFactorChange();
-
-  NotifyClientOfVisibilityChange();
-}
-
-void ClientRoot::OnWindowRemovingFromRootWindow(aura::Window* window,
-                                                aura::Window* new_root) {
-  DCHECK_EQ(window, window_);
-  DCHECK(window->GetHost());
-  window->GetHost()->RemoveObserver(this);
-  if (new_root) {
-    DCHECK(!is_moving_across_displays_);
-    is_moving_across_displays_ = true;
-  } else {
-    NotifyClientOfVisibilityChange(false);
-  }
-}
-
-void ClientRoot::OnWindowVisibilityChanged(aura::Window* window, bool visible) {
-  NotifyClientOfVisibilityChange();
-}
-
-void ClientRoot::OnHostResized(aura::WindowTreeHost* host) {
-  // This function is also called when the device-scale-factor changes too.
-  CheckForScaleFactorChange();
-}
-
-void ClientRoot::OnDisplayMetricsChanged(const display::Display& display,
-                                         uint32_t changed_metrics) {
-  // WindowTreeHost display id should be updated before OnDisplayMetricsChanged.
-  // Early out if the changed display is not relevant.
-  if (!window_->GetHost() || window_->GetHost()->GetDisplayId() != display.id())
-    return;
-
-  // Only handle changes that could change the origin of the ClientRoot.
-  if (!(changed_metrics & (DISPLAY_METRIC_BOUNDS | DISPLAY_METRIC_ROTATION)))
-    return;
-
-  // Size or device-scale-factor change is handled in OnHostResized.
-  const gfx::Rect new_bounds = GetBoundsToSend(window_);
-  if (last_bounds_.size() != new_bounds.size() ||
-      last_device_scale_factor_ != ui::GetScaleFactorForNativeView(window_)) {
-    return;
-  }
-
-  if (last_bounds_ != new_bounds)
-    NotifyClientOfNewBounds();
-}
-
-void ClientRoot::OnFirstSurfaceActivation(
-    const viz::SurfaceInfo& surface_info) {
-  // NOTE: this function is only called if kUseTestConfig is supplied. See
-  // call to RegisterFrameSinkId().
-  if (window_tree_->client_name().empty())
-    return;
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window_);
-  // OnFirstSurfaceActivation() should only be called after
-  // AttachCompositorFrameSink().
-  DCHECK(proxy_window->attached_compositor_frame_sink());
-  window_tree_->window_service()->OnFirstSurfaceActivation(
-      window_tree_->client_name());
-}
-
-void ClientRoot::OnFrameTokenChanged(uint32_t frame_token) {
-  // TODO: this needs to call through to WindowTreeClient.
-  // https://crbug.com/848022.
-}
-
-}  // namespace ws
diff --git a/services/ws/client_root.h b/services/ws/client_root.h
deleted file mode 100644
index 0048c98..0000000
--- a/services/ws/client_root.h
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_CLIENT_ROOT_H_
-#define SERVICES_WS_CLIENT_ROOT_H_
-
-#include <memory>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "base/optional.h"
-#include "components/viz/common/surfaces/local_surface_id.h"
-#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
-#include "components/viz/host/host_frame_sink_client.h"
-#include "ui/aura/window_observer.h"
-#include "ui/aura/window_tree_host_observer.h"
-#include "ui/display/display_observer.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace aura {
-class ClientSurfaceEmbedder;
-class Window;
-}  // namespace aura
-
-namespace aura_extra {
-class WindowPositionInRootMonitor;
-}
-
-namespace viz {
-class LocalSurfaceIdAllocation;
-class SurfaceInfo;
-}
-
-namespace ws {
-
-class ProxyWindow;
-class ScopedForceVisible;
-class WindowTree;
-
-// WindowTree creates a ClientRoot for each window the client is embedded in. A
-// ClientRoot is created as the result of another client using Embed(), or this
-// client requesting a top-level window. ClientRoot is responsible for
-// maintaining state associated with the root, as well as notifying the client
-// of any changes to the root Window.
-class COMPONENT_EXPORT(WINDOW_SERVICE) ClientRoot
-    : public aura::WindowObserver,
-      public aura::WindowTreeHostObserver,
-      public display::DisplayObserver,
-      public viz::HostFrameSinkClient {
- public:
-  ClientRoot(WindowTree* window_tree, aura::Window* window, bool is_top_level);
-  ~ClientRoot() override;
-
-  // Registers the necessary state needed for embedding in viz.
-  void RegisterVizEmbeddingSupport();
-
-  aura::Window* window() { return window_; }
-
-  bool is_top_level() const { return is_top_level_; }
-
-  // Sets the bounds from a client.
-  bool SetBoundsInScreenFromClient(
-      const gfx::Rect& bounds,
-      const base::Optional<viz::LocalSurfaceIdAllocation>& allocation);
-
-  // Updates the LocalSurfaceIdAllocation from the client.
-  void UpdateLocalSurfaceIdFromChild(
-      const viz::LocalSurfaceIdAllocation& local_surface_id_allocation);
-
-  // Called when the LocalSurfaceId of the embedder changes.
-  void OnLocalSurfaceIdChanged();
-
-  void AllocateLocalSurfaceIdAndNotifyClient();
-
-  // Attaches/unattaches proxy_window->attached_frame_sink_id() to the
-  // HostFrameSinkManager.
-  void AttachChildFrameSinkId(ProxyWindow* proxy_window);
-  void UnattachChildFrameSinkId(ProxyWindow* proxy_window);
-
-  // Recurses through all descendants with the same WindowTree calling
-  // AttachChildFrameSinkId()/UnattachChildFrameSinkId().
-  void AttachChildFrameSinkIdRecursive(ProxyWindow* proxy_window);
-  void UnattachChildFrameSinkIdRecursive(ProxyWindow* proxy_window);
-
-  // Returns true if the WindowService should assign the LocalSurfaceId. A value
-  // of false means the client is expected to providate the LocalSurfaceId.
-  bool ShouldAssignLocalSurfaceId() const {
-    return parent_local_surface_id_allocator_.has_value();
-  }
-
-  // See TopLevelProxyWindow::ForceWindowVisible() for details.
-  std::unique_ptr<ScopedForceVisible> ForceWindowVisible();
-
-  // Called when the WindowTreeHost containing this ClientRoot has changed its
-  // display id.
-  void OnWindowTreeHostDisplayIdChanged();
-
- private:
-  friend class ClientRootTestHelper;
-  friend class ScopedForceVisible;
-
-  void OnForceVisibleDestroyed();
-
-  // If necessary, this generates a new LocalSurfaceId. Generally you should
-  // call UpdateLocalSurfaceIdAndClientSurfaceEmbedder(), not this. If you call
-  // this, you need to ensure the ClientSurfaceEmbedder is updated.
-  void GenerateLocalSurfaceIdIfNecessary();
-
-  // Updates cached state specific to the current LocalSurfaceId. This is called
-  // any time |parent_local_surface_id_allocator_| has a new id.
-  void UpdateSurfacePropertiesCache();
-
-  // Calls GenerateLocalSurfaceIdIfNecessary() and if the current LocalSurfaceId
-  // is valid, updates ClientSurfaceEmbedder.
-  void UpdateLocalSurfaceIdAndClientSurfaceEmbedder();
-
-  // Calls HandleBoundsOrScaleFactorChange() it the scale factor has changed.
-  void CheckForScaleFactorChange();
-
-  // Called when the bounds or scale factor changes.
-  void HandleBoundsOrScaleFactorChange();
-
-  void NotifyClientOfNewBounds();
-
-  // If necessary, notifies the client that the visibility changes. If |visible|
-  // has a value, it is used as the visibility, otherwise IsWindowVisible() is
-  // used.
-  void NotifyClientOfVisibilityChange(
-      base::Optional<bool> visible = base::nullopt);
-
-  // Called when the display id changes.
-  void NotifyClientOfDisplayIdChange();
-
-  // Callback when the position of |window_|, relative to the root, changes.
-  // This is *only* called for non-top-levels.
-  void OnPositionInRootChanged();
-
-  bool IsWindowVisible();
-
-  // aura::WindowObserver:
-  void OnWindowPropertyChanged(aura::Window* window,
-                               const void* key,
-                               intptr_t old) override;
-  void OnWindowBoundsChanged(aura::Window* window,
-                             const gfx::Rect& old_bounds,
-                             const gfx::Rect& new_bounds,
-                             ui::PropertyChangeReason reason) override;
-  void OnWindowAddedToRootWindow(aura::Window* window) override;
-  void OnWindowRemovingFromRootWindow(aura::Window* window,
-                                      aura::Window* new_root) override;
-  void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
-
-  // aura::WindowTreeHostObserver:
-  void OnHostResized(aura::WindowTreeHost* host) override;
-
-  // display::DisplayObsever:
-  void OnDisplayMetricsChanged(const display::Display& display,
-                               uint32_t changed_metrics) override;
-
-  // viz::HostFrameSinkClient:
-  void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
-  void OnFrameTokenChanged(uint32_t frame_token) override;
-
-  WindowTree* window_tree_;
-  aura::Window* window_;
-  const bool is_top_level_;
-
-  // |last_surface_size_in_pixels_| and |last_device_scale_factor_| are only
-  // used if a LocalSurfaceId is needed for the window. They represent the size
-  // and device scale factor at the time the LocalSurfaceId was generated.
-  gfx::Size last_surface_size_in_pixels_;
-  float last_device_scale_factor_ = 1.0f;
-
-  std::unique_ptr<aura::ClientSurfaceEmbedder> client_surface_embedder_;
-
-  // Set to true in OnWindowRemovingFromRootWindow() when |window_| is moving
-  // to a new root window and reset to false in OnWindowAddedToRootWindow().
-  bool is_moving_across_displays_ = false;
-
-  // Used for non-top-levels to watch for changes in screen coordinates.
-  std::unique_ptr<aura_extra::WindowPositionInRootMonitor>
-      root_position_monitor_;
-
-  // Last bounds sent to the client.
-  gfx::Rect last_bounds_;
-
-  // Last visibility value sent to the client. This is not used for top-levels.
-  bool last_visible_;
-
-  // Last display id sent to the client.
-  int64_t last_display_id_;
-
-  // If true, SetBoundsInScreenFromClient() is setting the window bounds.
-  bool setting_bounds_from_client_ = false;
-
-  // Only used if ShouldAssignLocalSurfaceId() returns true. This is used
-  // instead of the ParentLocalSurfaceIdAllocator maintained by
-  // WindowPortLocal as ClientRoot needs to control when the allocations happen,
-  // and avoid allocations in the case of resizes and clients supplying their
-  // own LocalSurfaceId.
-  base::Optional<viz::ParentLocalSurfaceIdAllocator>
-      parent_local_surface_id_allocator_;
-
-  // If non-null the client is told the window is visible, regardless of
-  // whether the window is actually visible.
-  ScopedForceVisible* force_visible_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(ClientRoot);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_CLIENT_ROOT_H_
diff --git a/services/ws/client_root_test_helper.cc b/services/ws/client_root_test_helper.cc
deleted file mode 100644
index 20963b7..0000000
--- a/services/ws/client_root_test_helper.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "services/ws/client_root_test_helper.h"
-
-#include "services/ws/client_root.h"
-
-namespace ws {
-
-ClientRootTestHelper::ClientRootTestHelper(ClientRoot* client_root)
-    : client_root_(client_root) {}
-
-ClientRootTestHelper::~ClientRootTestHelper() = default;
-
-aura::ClientSurfaceEmbedder* ClientRootTestHelper::GetClientSurfaceEmbedder() {
-  return client_root_->client_surface_embedder_.get();
-}
-
-bool ClientRootTestHelper::IsWindowForcedVisible() {
-  return client_root_->force_visible_ != nullptr;
-}
-
-}  // namespace ws
diff --git a/services/ws/client_root_test_helper.h b/services/ws/client_root_test_helper.h
deleted file mode 100644
index 250d099..0000000
--- a/services/ws/client_root_test_helper.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_CLIENT_ROOT_TEST_HELPER_H_
-#define SERVICES_WS_CLIENT_ROOT_TEST_HELPER_H_
-
-#include "base/macros.h"
-#include "ui/events/event.h"
-
-namespace aura {
-class ClientSurfaceEmbedder;
-}
-
-namespace ws {
-
-class ClientRoot;
-
-// Used for accessing private members of ClientRoot in tests.
-class ClientRootTestHelper {
- public:
-  explicit ClientRootTestHelper(ClientRoot* client_root);
-  ~ClientRootTestHelper();
-
-  aura::ClientSurfaceEmbedder* GetClientSurfaceEmbedder();
-
-  bool IsWindowForcedVisible();
-
- private:
-  ClientRoot* client_root_;
-
-  DISALLOW_COPY_AND_ASSIGN(ClientRootTestHelper);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_CLIENT_ROOT_TEST_HELPER_H_
diff --git a/services/ws/client_root_unittest.cc b/services/ws/client_root_unittest.cc
deleted file mode 100644
index ee4c5ed..0000000
--- a/services/ws/client_root_unittest.cc
+++ /dev/null
@@ -1,325 +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.
-
-#include "services/ws/client_root.h"
-
-#include <string>
-#include <vector>
-
-#include "base/command_line.h"
-#include "services/ws/proxy_window.h"
-#include "services/ws/public/cpp/property_type_converters.h"
-#include "services/ws/public/mojom/window_manager.mojom.h"
-#include "services/ws/top_level_proxy_window.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/mus/property_converter.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_observer.h"
-#include "ui/aura/window_tracker.h"
-#include "ui/display/display_switches.h"
-#include "ui/gfx/geometry/vector2d_conversions.h"
-#include "ui/gfx/transform.h"
-
-namespace ws {
-namespace {
-
-// WindowObserver that changes a property (|aura::client::kNameKey|) from
-// OnWindowPropertyChanged(). This mirrors ash changing a property when applying
-// a property change from a client.
-class CascadingPropertyTestHelper : public aura::WindowObserver {
- public:
-  explicit CascadingPropertyTestHelper(aura::Window* window) : window_(window) {
-    window_->AddObserver(this);
-  }
-  ~CascadingPropertyTestHelper() override { window_->RemoveObserver(this); }
-
-  bool did_set_property() const { return did_set_property_; }
-
-  // WindowObserver:
-  void OnWindowPropertyChanged(aura::Window* window,
-                               const void* key,
-                               intptr_t old) override {
-    if (!did_set_property_) {
-      did_set_property_ = true;
-      window->SetProperty(aura::client::kNameKey, new std::string("TEST"));
-    }
-  }
-
- private:
-  aura::Window* window_;
-  bool did_set_property_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(CascadingPropertyTestHelper);
-};
-
-// Verifies a property change that occurs while servicing a property change from
-// the client results in notifying the client of the new property.
-TEST(ClientRootTest, CascadingPropertyChange) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  setup.changes()->clear();
-  CascadingPropertyTestHelper property_helper(top_level);
-
-  // Apply a change from a client.
-  aura::PropertyConverter::PrimitiveType client_value = true;
-  std::vector<uint8_t> client_transport_value =
-      mojo::ConvertTo<std::vector<uint8_t>>(client_value);
-  setup.window_tree_test_helper()->SetWindowProperty(
-      top_level, mojom::WindowManager::kAlwaysOnTop_Property,
-      client_transport_value, 2);
-
-  // CascadingPropertyTestHelper should have gotten the change *and* changed
-  // another property.
-  EXPECT_TRUE(property_helper.did_set_property());
-  ASSERT_FALSE(setup.changes()->empty());
-
-  // The client should be notified of the new value.
-  EXPECT_EQ(CHANGE_TYPE_PROPERTY_CHANGED, (*setup.changes())[0].type);
-  EXPECT_EQ(mojom::WindowManager::kName_Property,
-            (*setup.changes())[0].property_key);
-  setup.changes()->erase(setup.changes()->begin());
-
-  // And the initial change should be acked with completed.
-  EXPECT_EQ("ChangeCompleted id=2 success=true",
-            SingleChangeToDescription(*setup.changes()));
-  EXPECT_TRUE(top_level->GetProperty(aura::client::kAlwaysOnTopKey));
-}
-
-// Verifies embedded clients are notified of changes in screen bounds.
-TEST(ClientRootTest, EmbedBoundsInScreen) {
-  WindowServiceTestSetup setup;
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  embed_window->SetBounds(gfx::Rect(1, 2, 3, 4));
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(embed_window);
-  embedding_helper->window_tree_client.set_track_root_bounds_changes(true);
-  ASSERT_TRUE(embedding_helper);
-  embedding_helper->changes()->clear();
-  window->AddChild(embed_window);
-  EXPECT_TRUE(embedding_helper->changes()->empty());
-  top_level->AddChild(window);
-  std::vector<Change>* embedding_changes = embedding_helper->changes();
-  // Screen bounds of |embed_window| is the same as its initial bounds. Hence
-  // no bounds change fired.
-  embedding_changes->clear();
-
-  window->SetBounds(gfx::Rect(11, 12, 100, 100));
-  auto iter =
-      FirstChangeOfType(*embedding_changes, CHANGE_TYPE_NODE_BOUNDS_CHANGED);
-  ASSERT_NE(iter, embedding_changes->end());
-  EXPECT_EQ(gfx::Rect(12, 14, 3, 4), iter->bounds);
-  embedding_changes->clear();
-
-  top_level->SetBounds(gfx::Rect(100, 50, 100, 100));
-  iter = FirstChangeOfType(*embedding_changes, CHANGE_TYPE_NODE_BOUNDS_CHANGED);
-  ASSERT_NE(iter, embedding_changes->end());
-  EXPECT_EQ(gfx::Rect(112, 64, 3, 4), iter->bounds);
-}
-
-TEST(ClientRootTest, EmbedWindowServerVisibilityChanges) {
-  WindowServiceTestSetup setup;
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  embed_window->SetBounds(gfx::Rect(1, 2, 3, 4));
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(embed_window);
-  ASSERT_TRUE(embedding_helper);
-  window->AddChild(embed_window);
-  top_level->AddChild(window);
-  std::vector<Change>* embedding_changes = embedding_helper->changes();
-  embedding_changes->clear();
-  embed_window->Show();
-  // As |top_level| isn't shown, no change yet.
-  EXPECT_TRUE(embedding_changes->empty());
-  top_level->Show();
-  EXPECT_TRUE(embedding_changes->empty());
-
-  // As all ancestor are visible, showing the window should notify the client.
-  window->Show();
-  ASSERT_EQ(1u, embedding_changes->size());
-  {
-    const Change& show_change = (*embedding_changes)[0];
-    EXPECT_EQ(CHANGE_TYPE_NODE_VISIBILITY_CHANGED, show_change.type);
-    EXPECT_TRUE(show_change.bool_value);
-    EXPECT_EQ(embedding_helper->window_tree_test_helper->TransportIdForWindow(
-                  embed_window),
-              show_change.window_id);
-  }
-  embedding_changes->clear();
-
-  // Hiding an ancestor should trigger hiding the window.
-  top_level->Hide();
-  ASSERT_EQ(1u, embedding_changes->size());
-  {
-    const Change& hide_change = (*embedding_changes)[0];
-    EXPECT_EQ(CHANGE_TYPE_NODE_VISIBILITY_CHANGED, hide_change.type);
-    EXPECT_FALSE(hide_change.bool_value);
-    EXPECT_EQ(embedding_helper->window_tree_test_helper->TransportIdForWindow(
-                  embed_window),
-              hide_change.window_id);
-  }
-  embedding_changes->clear();
-
-  // Showing an ancestor should trigger showing the window.
-  top_level->Show();
-  ASSERT_EQ(1u, embedding_changes->size());
-  {
-    const Change& show_change = (*embedding_changes)[0];
-    EXPECT_EQ(CHANGE_TYPE_NODE_VISIBILITY_CHANGED, show_change.type);
-    EXPECT_TRUE(show_change.bool_value);
-    EXPECT_EQ(embedding_helper->window_tree_test_helper->TransportIdForWindow(
-                  embed_window),
-              show_change.window_id);
-  }
-  embedding_changes->clear();
-
-  // Removing an ancestor from the WindowTreeHost implicitly hides the window.
-  top_level->RemoveChild(window);
-  ASSERT_EQ(1u, embedding_changes->size());
-  {
-    const Change& hide_change = (*embedding_changes)[0];
-    EXPECT_EQ(CHANGE_TYPE_NODE_VISIBILITY_CHANGED, hide_change.type);
-    EXPECT_FALSE(hide_change.bool_value);
-    EXPECT_EQ(embedding_helper->window_tree_test_helper->TransportIdForWindow(
-                  embed_window),
-              hide_change.window_id);
-  }
-  embedding_changes->clear();
-
-  // Adding an ancestor to the WindowTreeHost implicitly shows the window.
-  top_level->AddChild(window);
-  {
-    auto iter = FirstChangeOfType(*embedding_changes,
-                                  CHANGE_TYPE_NODE_VISIBILITY_CHANGED);
-    ASSERT_NE(iter, embedding_changes->end());
-    const Change& show_change = *iter;
-    EXPECT_EQ(CHANGE_TYPE_NODE_VISIBILITY_CHANGED, show_change.type);
-    EXPECT_TRUE(show_change.bool_value);
-    EXPECT_EQ(embedding_helper->window_tree_test_helper->TransportIdForWindow(
-                  embed_window),
-              show_change.window_id);
-  }
-  embedding_changes->clear();
-
-  embed_window->Hide();
-  ASSERT_EQ(1u, embedding_changes->size());
-  {
-    const Change& hide_change = (*embedding_changes)[0];
-    EXPECT_EQ(CHANGE_TYPE_NODE_VISIBILITY_CHANGED, hide_change.type);
-    EXPECT_FALSE(hide_change.bool_value);
-    EXPECT_EQ(embedding_helper->window_tree_test_helper->TransportIdForWindow(
-                  embed_window),
-              hide_change.window_id);
-  }
-}
-
-TEST(ClientRootTest, EmbedWindowClientVisibilityChanges) {
-  WindowServiceTestSetup setup;
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  embed_window->SetBounds(gfx::Rect(1, 2, 3, 4));
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(embed_window);
-  ASSERT_TRUE(embedding_helper);
-  window->AddChild(embed_window);
-  top_level->AddChild(window);
-  std::vector<Change>* embedding_changes = embedding_helper->changes();
-  embedding_changes->clear();
-
-  // Changes initiated by the client should not callback to the client.
-  embedding_helper->window_tree_test_helper->SetWindowVisibility(embed_window,
-                                                                 true);
-  EXPECT_TRUE(embed_window->TargetVisibility());
-  EXPECT_TRUE(embedding_changes->empty());
-
-  embedding_helper->window_tree_test_helper->SetWindowVisibility(embed_window,
-                                                                 false);
-  EXPECT_FALSE(embed_window->TargetVisibility());
-  EXPECT_TRUE(embedding_changes->empty());
-}
-
-TEST(ClientRootTest, ForceVisible) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  EXPECT_FALSE(window->IsVisible());
-
-  {
-    // Verify calling ForceWindowVisible() results in notifying the client the
-    // window is visible (even though the underlying aura::Window is not).
-    auto force = setup.window_tree()
-                     ->GetClientRootForWindow(window)
-                     ->ForceWindowVisible();
-    EXPECT_FALSE(window->IsVisible());
-    EXPECT_EQ("VisibilityChanged window=0,1 visible=true",
-              SingleChangeToDescription(*setup.changes()));
-    setup.changes()->clear();
-  }
-
-  // Destroying |force| should notify the client the window is hidden.
-  EXPECT_FALSE(window->IsVisible());
-  EXPECT_EQ("VisibilityChanged window=0,1 visible=false",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(ClientRootTest, TransformShouldntAffectBounds) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  top_level->SetBounds(gfx::Rect(50, 60, 100, 200));
-  gfx::Transform transform;
-  gfx::Vector2dF translate(20, 30);
-  transform.Translate(translate);
-  top_level->SetTransform(transform);
-  top_level->Show();
-
-  setup.changes()->clear();
-  gfx::Rect new_bounds(100, 120, 100, 200);
-  top_level->SetBounds(new_bounds);
-  EXPECT_EQ(new_bounds + gfx::ToFlooredVector2d(translate),
-            top_level->GetBoundsInScreen());
-  auto iter =
-      FirstChangeOfType(*setup.changes(), CHANGE_TYPE_NODE_BOUNDS_CHANGED);
-  ASSERT_NE(iter, setup.changes()->end());
-  EXPECT_EQ(new_bounds, iter->bounds);
-  setup.changes()->clear();
-
-  top_level->SetTransform(gfx::Transform());
-  EXPECT_EQ(new_bounds, top_level->GetBoundsInScreen());
-  EXPECT_EQ(
-      setup.changes()->end(),
-      FirstChangeOfType(*setup.changes(), CHANGE_TYPE_NODE_BOUNDS_CHANGED));
-}
-
-TEST(ClientRootTest, SurfaceIdGeneratedWhenSizeChangesWithFractionalScale) {
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kForceDeviceScaleFactor, ".9");
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  top_level->SetBounds(gfx::Rect(50, 60, 500, 200));
-  ProxyWindow* top_level_proxy_window = ProxyWindow::GetMayBeNull(top_level);
-  ASSERT_TRUE(top_level_proxy_window->local_surface_id_allocation());
-  auto initial_lsi = *top_level_proxy_window->local_surface_id_allocation();
-  top_level->SetBounds(gfx::Rect(50, 60, 501, 200));
-  ASSERT_TRUE(top_level_proxy_window->local_surface_id_allocation());
-  EXPECT_NE(*top_level_proxy_window->local_surface_id_allocation(),
-            initial_lsi);
-}
-
-}  // namespace
-}  // namespace ws
diff --git a/services/ws/common/BUILD.gn b/services/ws/common/BUILD.gn
deleted file mode 100644
index 7d619af..0000000
--- a/services/ws/common/BUILD.gn
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ui.gni")
-import("//testing/test.gni")
-
-# TODO(sky): move everything but switches to services/ws/public/cpp
-source_set("common") {
-  sources = [
-    "switches.cc",
-    "switches.h",
-    "types.h",
-    "util.h",
-  ]
-}
-
-source_set("task_runner_test_base") {
-  testonly = true
-
-  sources = [
-    "task_runner_test_base.cc",
-    "task_runner_test_base.h",
-  ]
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/services/ws/common/DEPS b/services/ws/common/DEPS
deleted file mode 100644
index 562f91be..0000000
--- a/services/ws/common/DEPS
+++ /dev/null
@@ -1,8 +0,0 @@
-include_rules = [
-  "+gpu/config",
-  "+gpu/command_buffer",
-  "+gpu/ipc/client",
-  "+gpu/ipc/common",
-  "+gpu/ipc/host",
-  "+services/viz/privileged/interfaces",
-]
diff --git a/services/ws/common/OWNERS b/services/ws/common/OWNERS
deleted file mode 100644
index 12dcf13..0000000
--- a/services/ws/common/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-per-file *_type_converter*.*=set noparent
-per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS
-per-file *gpu*.*=fsamuel@chromium.org
-per-file *gpu*.*=sadrul@chromium.org
diff --git a/services/ws/common/switches.cc b/services/ws/common/switches.cc
deleted file mode 100644
index 1bb38a1..0000000
--- a/services/ws/common/switches.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/common/switches.h"
-
-namespace ws {
-namespace switches {
-
-// Initializes X11 in threaded mode, and sets the |override_redirect| flag when
-// creating X11 windows. Also, exposes the WindowServerTest interface to clients
-// when launched with this flag.
-// NOTE: if you use this, you *must* add a data dep on
-// "//services/ws/ime/test_ime_driver".
-const char kUseTestConfig[] = "use-test-config";
-
-}  // namespace switches
-}  // namespace ws
diff --git a/services/ws/common/switches.h b/services/ws/common/switches.h
deleted file mode 100644
index b7e1ab7..0000000
--- a/services/ws/common/switches.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_COMMON_SWITCHES_H_
-#define SERVICES_WS_COMMON_SWITCHES_H_
-
-namespace ws {
-namespace switches {
-
-// All args in alphabetical order. The switches should be documented
-// alongside the definition of their values in the .cc file.
-extern const char kUseTestConfig[];
-
-}  // namespace switches
-}  // namespace ws
-
-#endif  // SERVICES_WS_COMMON_SWITCHES_H_
diff --git a/services/ws/common/task_runner_test_base.cc b/services/ws/common/task_runner_test_base.cc
deleted file mode 100644
index 0b2fe45..0000000
--- a/services/ws/common/task_runner_test_base.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/common/task_runner_test_base.h"
-
-namespace ws {
-
-TaskRunnerTestBase::TaskRunnerTestBase() {}
-
-TaskRunnerTestBase::~TaskRunnerTestBase() {}
-
-void TaskRunnerTestBase::RunUntilIdle() {
-  task_runner_->RunUntilIdle();
-}
-
-void TaskRunnerTestBase::RunTasksForNext(base::TimeDelta delta) {
-  task_runner_->FastForwardBy(delta);
-}
-
-void TaskRunnerTestBase::RunAllTasks() {
-  task_runner_->FastForwardUntilNoTasksRemain();
-}
-
-void TaskRunnerTestBase::SetUp() {
-  task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>(
-      base::Time::Now(), base::TimeTicks::Now());
-  message_loop_.SetTaskRunner(task_runner_);
-}
-
-}  // namespace ws
diff --git a/services/ws/common/task_runner_test_base.h b/services/ws/common/task_runner_test_base.h
deleted file mode 100644
index f38f838..0000000
--- a/services/ws/common/task_runner_test_base.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_COMMON_TASK_RUNNER_TEST_BASE_H_
-#define SERVICES_WS_COMMON_TASK_RUNNER_TEST_BASE_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/test/test_mock_time_task_runner.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace ws {
-
-// Test base with a TaskRunner. The test implementation should not create its
-// own MessageLoop, as this creates a MessageLoop and sets a TaskRunner. Useful
-// for testing Mojo interfaces, or anything else where the test needs to wait
-// for asynchronous calls to happen before checking side effects.
-class TaskRunnerTestBase : public testing::Test {
- public:
-  TaskRunnerTestBase();
-  ~TaskRunnerTestBase() override;
-
-  base::TestMockTimeTaskRunner* task_runner() { return task_runner_.get(); }
-
-  // Run all tasks that are scheduled to start immediately.
-  void RunUntilIdle();
-
-  // Run all tasks that are scheduled to start within |delta| and forward clock
-  // by |delta|.
-  void RunTasksForNext(base::TimeDelta delta);
-
-  // Run all scheduled tasks and forward clock to last task start time.
-  void RunAllTasks();
-
-  // testing::Test:
-  void SetUp() override;
-
- private:
-  base::MessageLoop message_loop_{base::MessageLoop::TYPE_UI};
-
-  // Added as the task runner for message loop.
-  scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskRunnerTestBase);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_COMMON_TASK_RUNNER_TEST_BASE_H_
diff --git a/services/ws/common/types.h b/services/ws/common/types.h
deleted file mode 100644
index d98a6b6..0000000
--- a/services/ws/common/types.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_COMMON_TYPES_H_
-#define SERVICES_WS_COMMON_TYPES_H_
-
-#include <stdint.h>
-
-// Typedefs for the transport types. These typedefs match that of the mojom
-// file, see it for specifics.
-
-namespace ws {
-
-// Used to identify windows and change ids.
-using Id = uint64_t;
-
-// Used to identify a client as well as a client-specific window id. For
-// example, the Id for a window consists of the ClientSpecificId of the client
-// and the ClientSpecificId of the window.
-using ClientSpecificId = uint32_t;
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_COMMON_TYPES_H_
diff --git a/services/ws/common/util.h b/services/ws/common/util.h
deleted file mode 100644
index 4c2c6576..0000000
--- a/services/ws/common/util.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_COMMON_UTIL_H_
-#define SERVICES_WS_COMMON_UTIL_H_
-
-#include <stdint.h>
-
-#include "services/ws/common/types.h"
-
-namespace ws {
-
-inline ClientSpecificId ClientIdFromTransportId(Id id) {
-  return static_cast<ClientSpecificId>((id >> 32) & 0xFFFFFFFF);
-}
-
-inline ClientSpecificId ClientWindowIdFromTransportId(Id id) {
-  return static_cast<ClientSpecificId>(id & 0xFFFFFFFF);
-}
-
-inline Id BuildTransportId(ClientSpecificId connection_id,
-                           ClientSpecificId window_id) {
-  return (static_cast<Id>(connection_id) << 32) | static_cast<Id>(window_id);
-}
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_COMMON_UTIL_H_
diff --git a/services/ws/drag_drop_delegate.cc b/services/ws/drag_drop_delegate.cc
deleted file mode 100644
index c0f9991..0000000
--- a/services/ws/drag_drop_delegate.cc
+++ /dev/null
@@ -1,104 +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.
-
-#include "services/ws/drag_drop_delegate.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/strings/string16.h"
-#include "mojo/public/cpp/bindings/map.h"
-#include "services/ws/window_tree.h"
-#include "ui/base/dragdrop/drop_target_event.h"
-#include "ui/base/dragdrop/file_info.h"
-#include "ui/gfx/geometry/point_f.h"
-#include "url/gurl.h"
-
-namespace ws {
-
-DragDropDelegate::DragDropDelegate(WindowTree* window_tree,
-                                   mojom::WindowTreeClient* window_tree_client,
-                                   aura::Window* window,
-                                   Id transport_window_id)
-    : window_tree_(window_tree),
-      tree_client_(window_tree_client),
-      window_(window),
-      transport_window_id_(transport_window_id) {}
-
-DragDropDelegate::~DragDropDelegate() {
-  if (in_drag_)
-    EndDrag();
-}
-
-void DragDropDelegate::OnDragEntered(const ui::DropTargetEvent& event) {
-  StartDrag(event);
-
-  tree_client_->OnDragEnter(
-      transport_window_id_, event.flags(), GetRootLocation(event),
-      event.location_f(), event.source_operations(),
-      base::BindOnce(&DragDropDelegate::UpdateDragOperations,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
-int DragDropDelegate::OnDragUpdated(const ui::DropTargetEvent& event) {
-  DCHECK(in_drag_);
-
-  tree_client_->OnDragOver(
-      transport_window_id_, event.flags(), GetRootLocation(event),
-      event.location_f(), event.source_operations(),
-      base::BindOnce(&DragDropDelegate::UpdateDragOperations,
-                     weak_ptr_factory_.GetWeakPtr()));
-  return last_drag_operations_;
-}
-
-void DragDropDelegate::OnDragExited() {
-  DCHECK(in_drag_);
-
-  tree_client_->OnDragLeave(transport_window_id_);
-  EndDrag();
-}
-
-int DragDropDelegate::OnPerformDrop(const ui::DropTargetEvent& event) {
-  DCHECK(in_drag_);
-
-  tree_client_->OnCompleteDrop(transport_window_id_, event.flags(),
-                               GetRootLocation(event), event.location_f(),
-                               event.source_operations(), base::DoNothing());
-
-  EndDrag();
-
-  // Returns a drop action derived from |last_drag_operations_| because it is
-  // not safe to hold the stack and wait for the mojo to return the actual one.
-  if (last_drag_operations_ == ui::DragDropTypes::DRAG_NONE)
-    return ui::DragDropTypes::DRAG_NONE;
-
-  return (last_drag_operations_ & ui::DragDropTypes::DRAG_MOVE)
-             ? ui::DragDropTypes::DRAG_MOVE
-             : ui::DragDropTypes::DRAG_COPY;
-}
-
-void DragDropDelegate::StartDrag(const ui::DropTargetEvent& event) {
-  DCHECK(!in_drag_);
-
-  in_drag_ = true;
-  tree_client_->OnDragDropStart({});
-}
-
-void DragDropDelegate::EndDrag() {
-  DCHECK(in_drag_);
-
-  in_drag_ = false;
-  tree_client_->OnDragDropDone();
-}
-
-void DragDropDelegate::UpdateDragOperations(uint32_t drag_operations) {
-  last_drag_operations_ = drag_operations;
-}
-
-gfx::PointF DragDropDelegate::GetRootLocation(
-    const ui::DropTargetEvent& event) {
-  return window_tree_->ConvertRootLocationForClient(window_,
-                                                    event.root_location_f());
-}
-
-}  // namespace ws
diff --git a/services/ws/drag_drop_delegate.h b/services/ws/drag_drop_delegate.h
deleted file mode 100644
index e8af7b25..0000000
--- a/services/ws/drag_drop_delegate.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_DRAG_DROP_DELEGATE_H_
-#define SERVICES_WS_DRAG_DROP_DELEGATE_H_
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "services/ws/ids.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "ui/aura/client/drag_drop_delegate.h"
-#include "ui/base/dragdrop/drag_drop_types.h"
-
-namespace gfx {
-class PointF;
-}
-
-namespace ws {
-
-class WindowTree;
-
-// A delegate to forward drag and drop events to a remote client window via
-// mojom::WindowTreeClient.
-class DragDropDelegate : public aura::client::DragDropDelegate {
- public:
-  DragDropDelegate(WindowTree* window_tree,
-                   mojom::WindowTreeClient* window_tree_client,
-                   aura::Window* window,
-                   Id transport_window_id);
-  ~DragDropDelegate() override;
-
-  // aura::client::DragDropDelegate:
-  void OnDragEntered(const ui::DropTargetEvent& event) override;
-  int OnDragUpdated(const ui::DropTargetEvent& event) override;
-  void OnDragExited() override;
-  int OnPerformDrop(const ui::DropTargetEvent& event) override;
-
- private:
-  void StartDrag(const ui::DropTargetEvent& event);
-  void EndDrag();
-
-  // Callback invoked to update |last_drag_operations_|.
-  void UpdateDragOperations(uint32_t drag_operations);
-
-  // Returns the location to use as the root_location for the client.
-  gfx::PointF GetRootLocation(const ui::DropTargetEvent& event);
-
-  WindowTree* window_tree_;
-  mojom::WindowTreeClient* const tree_client_;
-  aura::Window* const window_;
-  const Id transport_window_id_;
-
-  // Whether a drag is over |window_|.
-  bool in_drag_ = false;
-
-  // Cached drag operations as a workaround to return drag operations for
-  // synchronous OnDragUpdated.
-  uint32_t last_drag_operations_ = ui::DragDropTypes::DRAG_NONE;
-
-  base::WeakPtrFactory<DragDropDelegate> weak_ptr_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(DragDropDelegate);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_DRAG_DROP_DELEGATE_H_
diff --git a/services/ws/drag_drop_delegate_unittest.cc b/services/ws/drag_drop_delegate_unittest.cc
deleted file mode 100644
index 2ec6dc3..0000000
--- a/services/ws/drag_drop_delegate_unittest.cc
+++ /dev/null
@@ -1,169 +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.
-
-#include "services/ws/drag_drop_delegate.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "mojo/public/cpp/bindings/map.h"
-#include "services/ws/test_change_tracker.h"
-#include "services/ws/window_service_test_setup.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/client/drag_drop_client.h"
-#include "ui/aura/window.h"
-#include "ui/base/dragdrop/drop_target_event.h"
-#include "ui/base/dragdrop/file_info.h"
-#include "ui/base/dragdrop/os_exchange_data.h"
-#include "ui/wm/core/coordinate_conversion.h"
-#include "ui/wm/core/default_screen_position_client.h"
-#include "url/gurl.h"
-
-namespace ws {
-
-class DragDropDelegateTest : public testing::Test {
- public:
-  DragDropDelegateTest() = default;
-  ~DragDropDelegateTest() override = default;
-
-  // testing::Test
-  void SetUp() override {
-    window_ = window_tree_test_helper()->NewTopLevelWindow();
-
-    aura::client::SetScreenPositionClient(window_->GetRootWindow(),
-                                          &screen_position_client_);
-  }
-
-  void SetCanAcceptDrops(bool accepts_drops) {
-    window_tree_test_helper()->window_tree()->SetCanAcceptDrops(
-        window_tree_test_helper()->TransportIdForWindow(window_),
-        accepts_drops);
-  }
-
-  // Simulates drag starts with |data| at given |location| in |window_|. The
-  // drag is updated in UpdateDrag call before and should be completed with
-  // either PerformDrop or CancelDrag.
-  void StartDrag(const ui::OSExchangeData& data, const gfx::Point& location) {
-    DCHECK_EQ(nullptr, drag_data_);
-    drag_data_ = &data;
-
-    delegate()->OnDragEntered(ui::DropTargetEvent(
-        *drag_data_, gfx::PointF(location), gfx::PointF(location),
-        ui::DragDropTypes::DRAG_MOVE));
-  }
-
-  // Simulates drag moves at given |location| in |window_|.
-  void UpdateDrag(const gfx::Point& location) {
-    DCHECK_NE(nullptr, drag_data_);
-
-    delegate()->OnDragUpdated(ui::DropTargetEvent(
-        *drag_data_, gfx::PointF(location), gfx::PointF(location),
-        ui::DragDropTypes::DRAG_MOVE));
-  }
-
-  // Simulates drag finished with a drop at |location|.
-  void PerformDrop(const gfx::Point& location) {
-    DCHECK_NE(nullptr, drag_data_);
-
-    delegate()->OnPerformDrop(ui::DropTargetEvent(
-        *drag_data_, gfx::PointF(location), gfx::PointF(location),
-        ui::DragDropTypes::DRAG_MOVE));
-    drag_data_ = nullptr;
-  }
-
-  // Simulates a drag is canceled.
-  void EndDrag() {
-    DCHECK_NE(nullptr, drag_data_);
-
-    delegate()->OnDragExited();
-    drag_data_ = nullptr;
-  }
-
-  aura::client::DragDropDelegate* delegate() {
-    return aura::client::GetDragDropDelegate(window_);
-  }
-
-  aura::Window* window() { return window_; }
-
-  WindowTreeTestHelper* window_tree_test_helper() {
-    return setup_.window_tree_test_helper();
-  }
-
-  std::vector<Change>* changes() { return setup_.changes(); }
-
- private:
-  wm::DefaultScreenPositionClient screen_position_client_;
-  WindowServiceTestSetup setup_;
-
-  aura::Window* window_ = nullptr;
-  const ui::OSExchangeData* drag_data_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(DragDropDelegateTest);
-};
-
-// Tests that DragDropDelegate is created when window can accept drops and
-// destroyed otherwise.
-TEST_F(DragDropDelegateTest, CreateAndReset) {
-  // No DragDropDelegate by default.
-  EXPECT_FALSE(delegate());
-
-  // DragDropDelegate is created when the window accepts drops.
-  SetCanAcceptDrops(true);
-  EXPECT_TRUE(delegate());
-
-  // DragDropDelegate is gone when the window accepts drops.
-  SetCanAcceptDrops(false);
-  EXPECT_FALSE(delegate());
-}
-
-// Tests the window tree client sequence of drag enter and exit.
-TEST_F(DragDropDelegateTest, EnterAndExit) {
-  SetCanAcceptDrops(true);
-
-  ui::OSExchangeData data;
-  data.SetString(base::ASCIIToUTF16("dragged string"));
-
-  // A point in |window()|'s coordinates.
-  gfx::Point point = gfx::Rect(window()->bounds().size()).CenterPoint();
-
-  changes()->clear();
-  StartDrag(data, point);
-  UpdateDrag(point);
-  EndDrag();
-
-  EXPECT_EQ(
-      std::vector<std::string>({"DragDropStart", "DragEnter window_id=0,1",
-                                "DragOver window_id=0,1",
-                                "DragLeave window_id=0,1", "DragDropDone"}),
-      ChangesToDescription1(*changes()));
-}
-
-// Tests the window tree client sequence of drag enter and drop.
-TEST_F(DragDropDelegateTest, EnterAndDrop) {
-  SetCanAcceptDrops(true);
-
-  ui::OSExchangeData data;
-  data.SetString(base::ASCIIToUTF16("dragged string"));
-
-  // A point in |window()|'s coordinates.
-  gfx::Point point = gfx::Rect(window()->bounds().size()).CenterPoint();
-
-  changes()->clear();
-  StartDrag(data, point);
-  UpdateDrag(point);
-  PerformDrop(point);
-
-  EXPECT_EQ(
-      std::vector<std::string>({"DragDropStart", "DragEnter window_id=0,1",
-                                "DragOver window_id=0,1",
-                                "CompleteDrop window_id=0,1", "DragDropDone"}),
-      ChangesToDescription1(*changes()));
-}
-
-}  // namespace ws
diff --git a/services/ws/embedding.cc b/services/ws/embedding.cc
deleted file mode 100644
index 8914581..0000000
--- a/services/ws/embedding.cc
+++ /dev/null
@@ -1,47 +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.
-
-#include "services/ws/embedding.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_binding.h"
-#include "ui/aura/window.h"
-
-namespace ws {
-
-Embedding::Embedding(WindowTree* embedding_tree,
-                     aura::Window* window,
-                     bool embedding_tree_intercepts_events)
-    : embedding_tree_(embedding_tree),
-      window_(window),
-      embedding_tree_intercepts_events_(embedding_tree_intercepts_events) {
-  DCHECK(window_);
-  DCHECK(!embedding_tree_intercepts_events_ || embedding_tree_);
-}
-
-Embedding::~Embedding() {
-  if (!binding_ && embedded_tree_)
-    embedded_tree_->OnEmbeddingDestroyed(this);
-}
-
-void Embedding::Init(WindowService* window_service,
-                     mojom::WindowTreeClientPtr window_tree_client_ptr,
-                     mojom::WindowTreeClient* window_tree_client,
-                     base::OnceClosure connection_lost_callback) {
-  binding_ = std::make_unique<WindowTreeBinding>();
-  binding_->InitForEmbed(window_service, std::move(window_tree_client_ptr),
-                         window_tree_client, window_,
-                         std::move(connection_lost_callback));
-  embedded_tree_ = binding_->window_tree();
-}
-
-void Embedding::InitForEmbedInExistingTree(WindowTree* embedded_tree) {
-  embedded_tree_ = embedded_tree;
-}
-
-}  // namespace ws
diff --git a/services/ws/embedding.h b/services/ws/embedding.h
deleted file mode 100644
index 2db6715..0000000
--- a/services/ws/embedding.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_EMBEDDING_H_
-#define SERVICES_WS_EMBEDDING_H_
-
-#include <memory>
-
-#include "base/callback_forward.h"
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-
-namespace aura {
-class Window;
-}
-
-namespace ws {
-
-class WindowService;
-class WindowTree;
-class WindowTreeBinding;
-
-// Embedding is created any time a client calls Embed() or EmbedUsingToken()
-// (Embedding is not created for top-levels). Embedding has two distinct
-// configurations:
-// . The Embedding does not own the embedded WindowTree. This happens if
-//   ScheduleEmbedForExistingClient() was used.
-// . In all other cases Embedding owns the embedded WindowTree.
-//
-// Embedding is owned by the Window associated with the embedding.
-class COMPONENT_EXPORT(WINDOW_SERVICE) Embedding {
- public:
-  Embedding(WindowTree* embedding_tree,
-            aura::Window* window,
-            bool embedding_tree_intercepts_events);
-  ~Embedding();
-
-  void Init(WindowService* window_service,
-            mojom::WindowTreeClientPtr window_tree_client_ptr,
-            mojom::WindowTreeClient* window_tree_client,
-            base::OnceClosure connection_lost_callback);
-
-  // Initializes the Embedding as the result of
-  // ScheduleEmbedForExistingClient().
-  void InitForEmbedInExistingTree(WindowTree* embedded_tree);
-
-  WindowTree* embedding_tree() { return embedding_tree_; }
-
-  bool embedding_tree_intercepts_events() const {
-    return embedding_tree_intercepts_events_;
-  }
-
-  // Used during destruction to ensure the |embedded_tree_| is not notified.
-  void clear_embedded_tree() { embedded_tree_ = nullptr; }
-  WindowTree* embedded_tree() { return embedded_tree_; }
-
-  aura::Window* window() { return window_; }
-
-  WindowTreeBinding* binding() { return binding_.get(); }
-
- private:
-  // The client that initiated the embedding. This is null if the embedding
-  // was completed locally (by way of ScheduleEmbedForExistingClient()).
-  WindowTree* embedding_tree_;
-
-  // The window the embedding is in.
-  aura::Window* window_;
-
-  // If true, all events that would normally target the embedded tree are
-  // instead sent to the tree that created the embedding. For example, consider
-  // the Window hierarchy A1->B1->C2 where tree 1 created A1 and B1, tree 1
-  // embedded tree 2 in window B1, and tree 2 created C2. If an event occurs
-  // that would normally target C2, then the event is instead sent to tree 1.
-  // Embedded trees can always observe pointer events, regardless of this value.
-  const bool embedding_tree_intercepts_events_;
-
-  // |binding_| is created if the Embedding owns the embedded WindowTree.
-  std::unique_ptr<WindowTreeBinding> binding_;
-
-  // The embedded WindowTree. If |binding_| is non-null, this comes from the
-  // WindowTreeBinding. If |binding_| is null, this is the value supplied to
-  // InitForEmbedInExistingTree().
-  WindowTree* embedded_tree_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(Embedding);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_EMBEDDING_H_
diff --git a/services/ws/embedding_unittest.cc b/services/ws/embedding_unittest.cc
deleted file mode 100644
index 53c6b29..0000000
--- a/services/ws/embedding_unittest.cc
+++ /dev/null
@@ -1,46 +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.
-
-#include "services/ws/embedding.h"
-
-#include <stdint.h>
-
-#include <memory>
-#include <queue>
-
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tracker.h"
-
-namespace ws {
-namespace {
-
-TEST(EmbeddingTest, DestroyingRootDestroysEmbedding) {
-  WindowServiceTestSetup setup;
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(embed_window);
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(embed_window);
-  ASSERT_TRUE(embedding_helper);
-  aura::Window* embed_child_window =
-      embedding_helper->window_tree_test_helper->NewWindow();
-  ASSERT_TRUE(embed_child_window);
-  aura::WindowTracker tracker;
-  tracker.Add(embed_child_window);
-
-  setup.window_tree_test_helper()->DeleteWindow(embed_window);
-  // Deleting the |embed_window| deletes the embedded client and anything it
-  // created, which is |embed_child_window|.
-  EXPECT_TRUE(tracker.windows().empty());
-  // Deleting |embed_window| should delete the embedding. Reset |embedding|
-  // to prevent EmbeddingHelper from attempting to delete the Embedding too.
-  embedding_helper->embedding = nullptr;
-}
-
-}  // namespace
-}  // namespace ws
diff --git a/services/ws/event_injector.cc b/services/ws/event_injector.cc
deleted file mode 100644
index b0502ba..0000000
--- a/services/ws/event_injector.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/event_injector.h"
-
-#include "base/bind.h"
-#include "base/stl_util.h"
-#include "services/ws/event_queue.h"
-#include "services/ws/injected_event_handler.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_delegate.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/events/event.h"
-#include "ui/events/event_sink.h"
-
-namespace ws {
-
-struct EventInjector::EventAndHost {
-  std::unique_ptr<ui::Event> event;
-  aura::WindowTreeHost* host = nullptr;
-};
-
-struct EventInjector::HandlerAndCallback {
-  std::unique_ptr<InjectedEventHandler> handler;
-  // |callback| is the callback supplied by the client.
-  EventInjector::InjectEventCallback callback;
-};
-
-struct EventInjector::QueuedEvent {
-  base::WeakPtr<aura::WindowTreeHost> host;  // May be destroyed while queued.
-  EventInjector::InjectEventCallback callback;  // Supplied by the client.
-  std::unique_ptr<ui::Event> event;
-};
-
-EventInjector::EventInjector(WindowService* window_service)
-    : window_service_(window_service) {
-  DCHECK(window_service_);
-}
-
-EventInjector::~EventInjector() {
-  for (auto& handler_and_callback : handlers_)
-    std::move(handler_and_callback->callback).Run(false);
-
-  for (auto& queued_event : queued_events_)
-    std::move(queued_event.callback).Run(false);
-}
-
-void EventInjector::AddBinding(mojom::EventInjectorRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void EventInjector::OnEventDispatched(InjectedEventHandler* handler) {
-  for (auto iter = handlers_.begin(); iter != handlers_.end(); ++iter) {
-    auto& handler_and_callback = *iter;
-    if (handler_and_callback->handler.get() == handler) {
-      std::move(handler_and_callback->callback).Run(true);
-      handlers_.erase(iter);
-      return;
-    }
-  }
-  NOTREACHED();
-}
-
-EventInjector::EventAndHost EventInjector::DetermineEventAndHost(
-    int64_t display_id,
-    std::unique_ptr<ui::Event> event) {
-  EventAndHost event_and_host;
-  aura::Window* window =
-      window_service_->delegate()->GetRootWindowForDisplayId(display_id);
-  event_and_host.host = window ? window->GetHost() : nullptr;
-  if (!event_and_host.host) {
-    DVLOG(1) << "InjectEvent(): invalid or destroyed display " << display_id;
-    return event_and_host;
-  }
-
-  if (event->IsLocatedEvent()) {
-    ui::LocatedEvent* located_event = event->AsLocatedEvent();
-    if (located_event->root_location_f() != located_event->location_f()) {
-      DVLOG(1) << "InjectEvent(): root_location and location must match";
-      return event_and_host;
-    }
-
-    located_event->UpdateForRootTransform(
-        event_and_host.host->GetRootTransform(),
-        event_and_host.host->GetRootTransformForLocalEventCoordinates());
-
-    // NOTE: this does not correctly account for coordinates with capture
-    // across displays. If needed, the implementation should match something
-    // like:
-    // https://chromium.googlesource.com/chromium/src/+/ae087c53f5ce4557bfb0b92a13651342336fe18a/services/ws/event_injector.cc#22
-  }
-
-  event_and_host.event = std::move(event);
-  return event_and_host;
-}
-
-void EventInjector::DispatchNextQueuedEvent() {
-  DCHECK(!queued_events_.empty());
-  QueuedEvent queued_event = std::move(queued_events_.front());
-  queued_events_.pop_front();
-
-  if (!queued_event.host) {
-    std::move(queued_event.callback).Run(false);
-    return;
-  }
-
-  std::unique_ptr<HandlerAndCallback> handler_and_callback =
-      std::make_unique<HandlerAndCallback>();
-  handler_and_callback->callback = std::move(queued_event.callback);
-  handler_and_callback->handler = std::make_unique<InjectedEventHandler>(
-      window_service_, queued_event.host.get());
-  InjectedEventHandler* handler = handler_and_callback->handler.get();
-  handlers_.push_back(std::move(handler_and_callback));
-  auto callback = base::BindOnce(&EventInjector::OnEventDispatched,
-                                 base::Unretained(this), handler);
-  handler->Inject(std::move(queued_event.event), std::move(callback));
-}
-
-void EventInjector::InjectEventNoAckImpl(int64_t display_id,
-                                         std::unique_ptr<ui::Event> event,
-                                         bool honor_rewriters) {
-  EventAndHost event_and_host =
-      DetermineEventAndHost(display_id, std::move(event));
-  if (!event_and_host.host || !event_and_host.event)
-    return;
-
-  // Reset the latency time. This way telemetry doesn't include the time from
-  // browser to ash.
-  base::TimeTicks event_time = base::TimeTicks::Now();
-  ui::Event::DispatcherApi dispatcher_api(event_and_host.event.get());
-  dispatcher_api.set_time_stamp(event_time);
-  ui::LatencyInfo latency_info;
-  latency_info.AddLatencyNumberWithTimestamp(
-      ui::INPUT_EVENT_LATENCY_UI_COMPONENT, event_time, 1);
-  event_and_host.event->set_latency(latency_info);
-
-  // SendEventToSink send events through rewriters; DeliverEventToSink does not.
-  // The event may be queued before actually being delivered to the EventSink.
-  if (honor_rewriters)
-    event_and_host.host->SendEventToSink(event_and_host.event.get());
-  else
-    event_and_host.host->DeliverEventToSink(event_and_host.event.get());
-}
-
-void EventInjector::InjectEvent(int64_t display_id,
-                                std::unique_ptr<ui::Event> event,
-                                InjectEventCallback cb) {
-  EventAndHost event_and_host =
-      DetermineEventAndHost(display_id, std::move(event));
-  if (!event_and_host.host || !event_and_host.event) {
-    std::move(cb).Run(false);
-    return;
-  }
-
-  QueuedEvent queued_event;
-  queued_event.host = event_and_host.host->GetWeakPtr();
-  queued_event.event = std::move(event_and_host.event);
-  queued_event.callback = std::move(cb);
-  queued_events_.push_back(std::move(queued_event));
-
-  // Both EventQueue and |this| are owned by WindowService, so Unretained() is
-  // safe.
-  window_service_->event_queue()->NotifyWhenReadyToDispatch(base::BindOnce(
-      &EventInjector::DispatchNextQueuedEvent, base::Unretained(this)));
-}
-
-void EventInjector::InjectEventNoAck(int64_t display_id,
-                                     std::unique_ptr<ui::Event> event) {
-  InjectEventNoAckImpl(display_id, std::move(event), /*honor_rewriters*/ true);
-}
-
-void EventInjector::InjectEventNoAckNoRewriters(
-    int64_t display_id,
-    std::unique_ptr<ui::Event> event) {
-  InjectEventNoAckImpl(display_id, std::move(event), /*honor_rewriters*/ false);
-}
-
-}  // namespace ws
diff --git a/services/ws/event_injector.h b/services/ws/event_injector.h
deleted file mode 100644
index a3abed0..0000000
--- a/services/ws/event_injector.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_EVENT_INJECTOR_H_
-#define SERVICES_WS_EVENT_INJECTOR_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/containers/circular_deque.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "services/ws/public/mojom/event_injector.mojom.h"
-
-namespace aura {
-class WindowTreeHost;
-}
-
-namespace ws {
-
-class InjectedEventHandler;
-class WindowService;
-
-// See description in mojom for details on this.
-class COMPONENT_EXPORT(WINDOW_SERVICE) EventInjector
-    : public mojom::EventInjector {
- public:
-  explicit EventInjector(WindowService* window_service);
-  ~EventInjector() override;
-
-  void AddBinding(mojom::EventInjectorRequest request);
-
-  // Returns true if any injected events have been queued for dispatch.
-  bool HasQueuedEvents() const { return !queued_events_.empty(); }
-
- private:
-  struct EventAndHost;
-  struct QueuedEvent;
-  struct HandlerAndCallback;
-
-  void OnEventDispatched(InjectedEventHandler* handler);
-
-  // Determines the target WindowTreeHost and provides an mapping on |event|
-  // before dispatch. If the returned EventAndHost has a null |host|, there was
-  // a problem in conversion and the event should not be dispatched.
-  EventAndHost DetermineEventAndHost(int64_t display_id,
-                                     std::unique_ptr<ui::Event> event);
-
-  void DispatchNextQueuedEvent();
-
-  // Both InjectEventNoAck() implementations call to this.
-  void InjectEventNoAckImpl(int64_t display_id,
-                            std::unique_ptr<ui::Event> event,
-                            bool honor_rewriters);
-
-  // mojom::EventInjector:
-  void InjectEvent(int64_t display_id,
-                   std::unique_ptr<ui::Event> event,
-                   InjectEventCallback cb) override;
-  void InjectEventNoAck(int64_t display_id,
-                        std::unique_ptr<ui::Event> event) override;
-  void InjectEventNoAckNoRewriters(int64_t display_id,
-                                   std::unique_ptr<ui::Event> event) override;
-
-  WindowService* window_service_;
-
-  // Each call to InjectEvent() results in creating and adding a new handler to
-  // |handlers_|. The callback in HandlerAndCallback is the callback supplied by
-  // the client. The handlers are removed once the event is processed.
-  std::vector<std::unique_ptr<HandlerAndCallback>> handlers_;
-
-  mojo::BindingSet<mojom::EventInjector> bindings_;
-
-  base::circular_deque<QueuedEvent> queued_events_;
-
-  DISALLOW_COPY_AND_ASSIGN(EventInjector);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_EVENT_INJECTOR_H_
diff --git a/services/ws/event_injector_unittest.cc b/services/ws/event_injector_unittest.cc
deleted file mode 100644
index 1030a56..0000000
--- a/services/ws/event_injector_unittest.cc
+++ /dev/null
@@ -1,206 +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.
-
-#include "services/ws/event_injector.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind_helpers.h"
-#include "services/ws/event_injector.h"
-#include "services/ws/injected_event_handler.h"
-#include "services/ws/window_delegate_impl.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_helper.h"
-#include "services/ws/window_service_test_setup.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/test/aura_test_helper.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/display/display.h"
-#include "ui/display/screen.h"
-#include "ui/events/event_source.h"
-#include "ui/events/test/test_event_rewriter.h"
-
-namespace ws {
-namespace {
-
-std::unique_ptr<ui::Event> CreateMouseTestEvent() {
-  return std::make_unique<ui::MouseEvent>(
-      ui::ET_MOUSE_PRESSED, gfx::Point(100, 100), gfx::Point(100, 100),
-      base::TimeTicks::Now(), ui::EF_NONE, ui::EF_NONE);
-}
-
-std::unique_ptr<ui::Event> CreateTouchTestEvent() {
-  return std::make_unique<ui::TouchEvent>(
-      ui::ET_TOUCH_PRESSED, gfx::Point(100, 100), base::TimeTicks::Now(),
-      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
-}
-
-gfx::Transform GetPrimaryDisplayRotationTransform(
-    const display::Display::Rotation& rotation) {
-  gfx::Transform rotate_transform;
-  display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay();
-  switch (rotation) {
-    case display::Display::ROTATE_0:
-      break;
-    case display::Display::ROTATE_90:
-      rotate_transform.Translate(display.bounds().height(), 0);
-      rotate_transform.Rotate(90);
-      break;
-    case display::Display::ROTATE_180:
-      rotate_transform.Translate(display.bounds().width(),
-                                 display.bounds().height());
-      rotate_transform.Rotate(180);
-      break;
-    case display::Display::ROTATE_270:
-      rotate_transform.Translate(0, display.bounds().width());
-      rotate_transform.Rotate(270);
-      break;
-  }
-  return rotate_transform;
-}
-
-}  // namespace
-
-TEST(EventInjectorTest, NoAck) {
-  WindowServiceTestSetup test_setup;
-  test_setup.service()->OnStart();
-  auto* event_source = test_setup.root()->GetHost()->GetEventSource();
-  ui::test::TestEventRewriter test_event_rewriter;
-  event_source->AddEventRewriter(&test_event_rewriter);
-
-  EventInjector* event_injector =
-      WindowServiceTestHelper(test_setup.service()).event_injector();
-  mojom::EventInjector* mojom_event_injector =
-      static_cast<mojom::EventInjector*>(event_injector);
-  auto display_id = display::Screen::GetScreen()->GetPrimaryDisplay().id();
-  mojom_event_injector->InjectEventNoAck(display_id, CreateMouseTestEvent());
-  EXPECT_EQ(1, test_event_rewriter.events_seen());
-  EXPECT_FALSE(event_injector->HasQueuedEvents());
-  test_event_rewriter.clear_events_seen();
-
-  // Repeat, using the API that circumvents rewriters.
-  mojom_event_injector->InjectEventNoAckNoRewriters(display_id,
-                                                    CreateMouseTestEvent());
-  EXPECT_EQ(0, test_event_rewriter.events_seen());
-  EXPECT_FALSE(event_injector->HasQueuedEvents());
-  event_source->RemoveEventRewriter(&test_event_rewriter);
-}
-
-// Test that the event's coordinates are set correctly when the screen is
-// rotated at a degree of 90. 180 and 270.
-TEST(EventInjectorTest, EventLocationRootTransformRotation) {
-  WindowServiceTestSetup test_setup;
-  test_setup.service()->OnStart();
-  auto* event_source = test_setup.root()->GetHost()->GetEventSource();
-  ui::test::TestEventRewriter test_event_rewriter;
-  event_source->AddEventRewriter(&test_event_rewriter);
-
-  EventInjector* event_injector =
-      WindowServiceTestHelper(test_setup.service()).event_injector();
-  mojom::EventInjector* mojom_event_injector =
-      static_cast<mojom::EventInjector*>(event_injector);
-
-  auto display_id = display::Screen::GetScreen()->GetPrimaryDisplay().id();
-
-  // Inject a touch press event without rotating the screen.
-  mojom_event_injector->InjectEventNoAck(display_id, CreateTouchTestEvent());
-  EXPECT_EQ(1, test_event_rewriter.events_seen());
-  const ui::Event* last_event = test_event_rewriter.last_event();
-  ASSERT_TRUE(last_event);
-  gfx::Point location(100, 100);
-  EXPECT_EQ(ui::ET_TOUCH_PRESSED, last_event->type());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->location());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->root_location());
-  test_event_rewriter.ResetLastEvent();
-
-  // Set the screen rotation degreen to 90 and inject a touch press event.
-  test_setup.root()->GetHost()->SetRootTransform(
-      GetPrimaryDisplayRotationTransform(display::Display::ROTATE_90));
-  mojom_event_injector->InjectEventNoAck(display_id, CreateTouchTestEvent());
-  EXPECT_EQ(2, test_event_rewriter.events_seen());
-  last_event = test_event_rewriter.last_event();
-  ASSERT_TRUE(last_event);
-  location = gfx::Point(500, 100);
-  EXPECT_EQ(ui::ET_TOUCH_PRESSED, last_event->type());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->location());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->root_location());
-  test_event_rewriter.ResetLastEvent();
-
-  // Set the screen rotation degreen to 180 and inject a touch press event.
-  test_setup.root()->GetHost()->SetRootTransform(
-      GetPrimaryDisplayRotationTransform(display::Display::ROTATE_180));
-  mojom_event_injector->InjectEventNoAck(display_id, CreateTouchTestEvent());
-  EXPECT_EQ(3, test_event_rewriter.events_seen());
-  last_event = test_event_rewriter.last_event();
-  ASSERT_TRUE(last_event);
-  location = gfx::Point(500, 700);
-  EXPECT_EQ(ui::ET_TOUCH_PRESSED, last_event->type());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->location());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->root_location());
-  test_event_rewriter.ResetLastEvent();
-
-  // Set the screen rotation degreen to 270 and inject a mouse press event.
-  test_setup.root()->GetHost()->SetRootTransform(
-      GetPrimaryDisplayRotationTransform(display::Display::ROTATE_270));
-  mojom_event_injector->InjectEventNoAck(display_id, CreateMouseTestEvent());
-  EXPECT_EQ(4, test_event_rewriter.events_seen());
-  last_event = test_event_rewriter.last_event();
-  ASSERT_TRUE(last_event);
-  location = gfx::Point(100, 700);
-  EXPECT_EQ(ui::ET_MOUSE_PRESSED, last_event->type());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->location());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->root_location());
-  test_event_rewriter.ResetLastEvent();
-  event_source->RemoveEventRewriter(&test_event_rewriter);
-}
-
-// Test that the event's coordinates are set correctly when the screen is
-// rotated at a degree of 90 and applied a scale factor of 2.
-TEST(EventInjectorTest, EventLocationRootTransformRotationScale) {
-  WindowServiceTestSetup test_setup;
-  test_setup.service()->OnStart();
-  auto* event_source = test_setup.root()->GetHost()->GetEventSource();
-  ui::test::TestEventRewriter test_event_rewriter;
-  event_source->AddEventRewriter(&test_event_rewriter);
-
-  EventInjector* event_injector =
-      WindowServiceTestHelper(test_setup.service()).event_injector();
-  mojom::EventInjector* mojom_event_injector =
-      static_cast<mojom::EventInjector*>(event_injector);
-
-  display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay();
-
-  // Inject a touch press event without rotating the screen and scaling.
-  mojom_event_injector->InjectEventNoAck(display.id(), CreateTouchTestEvent());
-  EXPECT_EQ(1, test_event_rewriter.events_seen());
-  const ui::Event* last_event = test_event_rewriter.last_event();
-  ASSERT_TRUE(last_event);
-  gfx::Point location(100, 100);
-  EXPECT_EQ(ui::ET_TOUCH_PRESSED, last_event->type());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->location());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->root_location());
-  test_event_rewriter.ResetLastEvent();
-
-  // Inject a touch press event when the screen rotation degreen is 90 and the
-  // scale factor is 2.
-  gfx::Transform transform;
-  transform.Scale(2, 2);
-  transform.Translate(display.bounds().height(), 0);
-  transform.Rotate(90);
-  test_setup.root()->GetHost()->SetRootTransform(transform);
-  mojom_event_injector->InjectEventNoAck(display.id(), CreateTouchTestEvent());
-  EXPECT_EQ(2, test_event_rewriter.events_seen());
-  last_event = test_event_rewriter.last_event();
-  ASSERT_TRUE(last_event);
-  location = gfx::Point(1000, 200);
-  EXPECT_EQ(ui::ET_TOUCH_PRESSED, last_event->type());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->location());
-  EXPECT_EQ(location, last_event->AsLocatedEvent()->root_location());
-  test_event_rewriter.ResetLastEvent();
-  event_source->RemoveEventRewriter(&test_event_rewriter);
-}
-
-}  // namespace ws
diff --git a/services/ws/event_observer_helper.cc b/services/ws/event_observer_helper.cc
deleted file mode 100644
index d6ba03e..0000000
--- a/services/ws/event_observer_helper.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "services/ws/event_observer_helper.h"
-
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window_event_dispatcher.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/events/event.h"
-
-namespace ws {
-
-EventObserverHelper::EventObserverHelper(WindowTree* tree) : tree_(tree) {
-  tree->window_service()->env()->AddWindowEventDispatcherObserver(this);
-}
-
-EventObserverHelper::~EventObserverHelper() {
-  tree_->window_service()->env()->RemoveWindowEventDispatcherObserver(this);
-}
-
-bool EventObserverHelper::DoesEventMatch(const ui::Event& event) const {
-  return types_.find(event.type()) != types_.end();
-}
-
-void EventObserverHelper::ClearPendingEvent() {
-  pending_event_.reset();
-}
-
-void EventObserverHelper::OnWindowEventDispatcherStartedProcessing(
-    aura::WindowEventDispatcher* dispatcher,
-    const ui::Event& event) {
-  // See |pending_event_|'s comment for why the event isn't sent immediately.
-  if (DoesEventMatch(event))
-    pending_event_ = ui::Event::Clone(event);
-}
-
-void EventObserverHelper::OnWindowEventDispatcherFinishedProcessingEvent(
-    aura::WindowEventDispatcher* dispatcher) {
-  if (pending_event_) {
-    tree_->SendObservedEventToClient(dispatcher->host()->GetDisplayId(),
-                                     std::move(pending_event_));
-  }
-}
-
-}  // namespace ws
diff --git a/services/ws/event_observer_helper.h b/services/ws/event_observer_helper.h
deleted file mode 100644
index dde5983..0000000
--- a/services/ws/event_observer_helper.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_EVENT_OBSERVER_HELPER_H_
-#define SERVICES_WS_EVENT_OBSERVER_HELPER_H_
-
-#include <memory>
-#include <set>
-
-#include "base/macros.h"
-#include "ui/aura/window_event_dispatcher_observer.h"
-#include "ui/events/event_constants.h"
-
-namespace ws {
-
-class WindowTree;
-
-// EventObserverHelper is used when a client has requested to observe events
-// that the client would not normally receive. This class observes events by way
-// of aura::WindowEventDispatcherObserver and forwards them to the client.
-// See mojom::WindowTree::ObserveEventTypes() for more information.
-class EventObserverHelper : public aura::WindowEventDispatcherObserver {
- public:
-  explicit EventObserverHelper(WindowTree* tree);
-  ~EventObserverHelper() override;
-
-  // Returns true if |event| is listed in the set of requested |types_|.
-  bool DoesEventMatch(const ui::Event& event) const;
-
-  void set_types(const std::set<ui::EventType>& types) { types_ = types; }
-
-  // See comment above |pending_event_| for details.
-  void ClearPendingEvent();
-
- private:
-  // aura::WindowEventDispatcherObserver:
-  void OnWindowEventDispatcherStartedProcessing(
-      aura::WindowEventDispatcher* dispatcher,
-      const ui::Event& event) override;
-  void OnWindowEventDispatcherFinishedProcessingEvent(
-      aura::WindowEventDispatcher* dispatcher) override;
-
-  // The requested types of events to be observed.
-  std::set<ui::EventType> types_;
-
-  WindowTree* tree_;
-
-  // Events matching the requested |types_| are processed in two phases:
-  // . In OnWindowEventDispatcherStartedProcessing() if the event should be
-  //   sent to the client, it's stored in |pending_event_|.
-  // . In OnWindowEventDispatcherFinishedProcessingEvent() if |pending_event_|
-  //   is non-null, |pending_event_| is sent to the client.
-  // During event processing if the event targets the client, then
-  // |pending_event_| is reset. This is done to avoid sending the event twice.
-  // WindowTreeClient::OnWindowInputEvent() indicates if the event matched an
-  // event observer.
-  std::unique_ptr<ui::Event> pending_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(EventObserverHelper);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_EVENT_OBSERVER_HELPER_H_
diff --git a/services/ws/event_queue.cc b/services/ws/event_queue.cc
deleted file mode 100644
index f6b480c..0000000
--- a/services/ws/event_queue.cc
+++ /dev/null
@@ -1,136 +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.
-
-#include "services/ws/event_queue.h"
-
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_event_dispatcher.h"
-#include "ui/aura/window_targeter.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/events/event.h"
-
-namespace ws {
-namespace {
-
-constexpr base::TimeDelta kEventAckTimeout =
-#if defined(NDEBUG)
-    base::TimeDelta::FromMilliseconds(100);
-#else
-    base::TimeDelta::FromMilliseconds(1000);
-#endif
-
-bool IsQueableEvent(const ui::Event& event) {
-  return event.IsKeyEvent();
-}
-
-}  // namespace
-
-struct EventQueue::QueuedEvent {
-  base::WeakPtr<aura::WindowTreeHost> host;  // May be destroyed while queued.
-  std::unique_ptr<ui::Event> event;
-  base::OnceClosure callback;
-};
-
-EventQueue::EventQueue(WindowService* service) : window_service_(service) {
-  window_service_->AddObserver(this);
-}
-
-EventQueue::~EventQueue() {
-  window_service_->RemoveObserver(this);
-}
-
-base::Optional<ui::EventDispatchDetails> EventQueue::DeliverOrQueueEvent(
-    aura::WindowTreeHost* host,
-    ui::Event* event) {
-  if (!ShouldQueueEvent(host, *event))
-    return host->GetEventSink()->OnEventFromSource(event);
-
-  QueueEvent(host, *event);
-  return base::nullopt;
-}
-
-void EventQueue::NotifyWhenReadyToDispatch(base::OnceClosure closure) {
-  if (!in_flight_event_.has_value()) {
-    std::move(closure).Run();
-  } else {
-    std::unique_ptr<QueuedEvent> queued_event = std::make_unique<QueuedEvent>();
-    queued_event->callback = std::move(closure);
-    queued_events_.push_back(std::move(queued_event));
-  }
-}
-
-bool EventQueue::ShouldQueueEvent(aura::WindowTreeHost* host,
-                                  const ui::Event& event) {
-  if (!in_flight_event_ || !IsQueableEvent(event))
-    return false;
-  aura::WindowTargeter* targeter = host->window()->targeter();
-  if (!targeter)
-    targeter = host->dispatcher()->event_targeter();
-  DCHECK(targeter);
-  aura::Window* target = targeter->FindTargetForKeyEvent(host->window());
-  return target && WindowService::IsProxyWindow(target);
-}
-
-void EventQueue::QueueEvent(aura::WindowTreeHost* host,
-                            const ui::Event& event) {
-  DCHECK(ShouldQueueEvent(host, event));
-  std::unique_ptr<QueuedEvent> queued_event = std::make_unique<QueuedEvent>();
-  queued_event->host = host->GetWeakPtr();
-  queued_event->event = ui::Event::Clone(event);
-  queued_events_.push_back(std::move(queued_event));
-}
-
-void EventQueue::DispatchNextQueuedEvent() {
-  while (!queued_events_.empty() && !in_flight_event_) {
-    std::unique_ptr<QueuedEvent> queued_event =
-        std::move(*queued_events_.begin());
-    queued_events_.pop_front();
-    if (queued_event->callback) {
-      DCHECK(!queued_event->event) << "Running callback and ignoring event";
-      std::move(queued_event->callback).Run();
-    } else if (queued_event->host) {
-      ignore_result(queued_event->host->GetEventSink()->OnEventFromSource(
-          queued_event->event.get()));
-    }
-  }
-}
-
-void EventQueue::OnClientTookTooLongToAckEvent() {
-  DVLOG(1) << "Client took too long to respond to event";
-  DCHECK(in_flight_event_);
-  OnClientAckedEvent(in_flight_event_->client_id, in_flight_event_->event_id);
-}
-
-void EventQueue::OnWillSendEventToClient(ClientSpecificId client_id,
-                                         uint32_t event_id,
-                                         const ui::Event& event) {
-  if (IsQueableEvent(event)) {
-    DCHECK(!in_flight_event_);
-    in_flight_event_ = InFlightEvent();
-    in_flight_event_->client_id = client_id;
-    in_flight_event_->event_id = event_id;
-    ack_timer_.Start(FROM_HERE, kEventAckTimeout, this,
-                     &EventQueue::OnClientTookTooLongToAckEvent);
-  }
-}
-
-void EventQueue::OnClientAckedEvent(ClientSpecificId client_id,
-                                    uint32_t event_id) {
-  if (!in_flight_event_ || in_flight_event_->client_id != client_id ||
-      in_flight_event_->event_id != event_id) {
-    return;
-  }
-  in_flight_event_.reset();
-  ack_timer_.Stop();
-  DispatchNextQueuedEvent();
-}
-
-void EventQueue::OnWillDestroyClient(ClientSpecificId client_id) {
-  if (in_flight_event_ && in_flight_event_->client_id == client_id)
-    OnClientAckedEvent(client_id, in_flight_event_->event_id);
-}
-
-}  // namespace ws
diff --git a/services/ws/event_queue.h b/services/ws/event_queue.h
deleted file mode 100644
index 0fe3972..0000000
--- a/services/ws/event_queue.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_EVENT_QUEUE_H_
-#define SERVICES_WS_EVENT_QUEUE_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/callback_forward.h"
-#include "base/component_export.h"
-#include "base/containers/circular_deque.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/timer/timer.h"
-#include "services/ws/ids.h"
-#include "services/ws/window_service_observer.h"
-
-namespace aura {
-class WindowTreeHost;
-}
-
-namespace ui {
-class Event;
-struct EventDispatchDetails;
-}
-
-namespace ws {
-
-class WindowService;
-
-// EventQueue handles queueing, waiting, and delivering events to event sinks.
-// EventQueue tracks the dispatch by way of being a WindowServiceObserver.
-// EventQueue also supports queueing callbacks run in order with queued events.
-class COMPONENT_EXPORT(WINDOW_SERVICE) EventQueue
-    : public WindowServiceObserver {
- public:
-  explicit EventQueue(WindowService* service);
-  ~EventQueue() override;
-
-  // Queue the event if needed, or deliver it directly to the host's event sink.
-  // Call WindowTreeHost::SendEventToSink instead, if the event should be passed
-  // through the host's EventRewriters; that calls through here after rewriting.
-  base::Optional<ui::EventDispatchDetails> DeliverOrQueueEvent(
-      aura::WindowTreeHost* host,
-      ui::Event* event);
-
-  // Notifies |closure| when this EventQueue is ready to dispatch an event,
-  // which may be immediately.
-  void NotifyWhenReadyToDispatch(base::OnceClosure closure);
-
- private:
-  friend class EventQueueTestHelper;
-
-  struct QueuedEvent;
-
-  // Tracks an event that was sent to a client.
-  struct InFlightEvent {
-    ClientSpecificId client_id = 0u;
-    uint32_t event_id = 0u;
-  };
-
-  // Returns true if |event| should be queued at this time for the given |host|.
-  bool ShouldQueueEvent(aura::WindowTreeHost* host, const ui::Event& event);
-
-  // Adds |event| to |queued_events_| for delivery to |host|.
-  void QueueEvent(aura::WindowTreeHost* host, const ui::Event& event);
-
-  // Called by |ack_timer_| if the client does not respond to the event in a
-  // timely manner.
-  void OnClientTookTooLongToAckEvent();
-
-  // Processes QueuedEvents until |queued_events_| is empty, or there is an
-  // event sent to a client.
-  void DispatchNextQueuedEvent();
-
-  // WindowServiceObserver:
-  void OnWillSendEventToClient(ClientSpecificId client_id,
-                               uint32_t event_id,
-                               const ui::Event& event) override;
-  void OnClientAckedEvent(ClientSpecificId client_id,
-                          uint32_t event_id) override;
-  void OnWillDestroyClient(ClientSpecificId client_id) override;
-
-  WindowService* window_service_;
-
-  base::circular_deque<std::unique_ptr<QueuedEvent>> queued_events_;
-
-  // Set when an event has been sent to a client.
-  base::Optional<InFlightEvent> in_flight_event_;
-
-  base::OneShotTimer ack_timer_;
-
-  // Because of destruction order HostEventQueues may outlive this.
-  base::WeakPtrFactory<EventQueue> weak_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(EventQueue);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_EVENT_QUEUE_H_
diff --git a/services/ws/event_queue_test_helper.cc b/services/ws/event_queue_test_helper.cc
deleted file mode 100644
index 3cac5bf..0000000
--- a/services/ws/event_queue_test_helper.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "services/ws/event_queue_test_helper.h"
-
-#include "services/ws/event_queue.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_test_helper.h"
-
-namespace ws {
-
-EventQueueTestHelper::EventQueueTestHelper(EventQueue* event_queue)
-    : event_queue_(event_queue) {}
-
-EventQueueTestHelper::~EventQueueTestHelper() = default;
-
-bool EventQueueTestHelper::HasInFlightEvent() const {
-  return event_queue_->in_flight_event_.has_value();
-}
-
-void EventQueueTestHelper::AckInFlightEvent() {
-  DCHECK(HasInFlightEvent());
-  for (WindowTree* window_tree :
-       event_queue_->window_service_->window_trees()) {
-    if (window_tree->client_id() == event_queue_->in_flight_event_->client_id) {
-      WindowTreeTestHelper(window_tree)
-          .OnWindowInputEventAck(event_queue_->in_flight_event_->event_id,
-                                 mojom::EventResult::HANDLED);
-      return;
-    }
-  }
-  NOTREACHED();
-}
-
-void EventQueueTestHelper::RunAckTimer() {
-  event_queue_->ack_timer_.FireNow();
-}
-
-}  // namespace ws
diff --git a/services/ws/event_queue_test_helper.h b/services/ws/event_queue_test_helper.h
deleted file mode 100644
index a05e1a79..0000000
--- a/services/ws/event_queue_test_helper.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_EVENT_QUEUE_TEST_HELPER_H_
-#define SERVICES_WS_EVENT_QUEUE_TEST_HELPER_H_
-
-#include "base/macros.h"
-
-namespace ws {
-
-class EventQueue;
-
-// Used for accessing private members of EventQueue in tests.
-class EventQueueTestHelper {
- public:
-  explicit EventQueueTestHelper(EventQueue* event_queue);
-  ~EventQueueTestHelper();
-
-  bool HasInFlightEvent() const;
-
-  void AckInFlightEvent();
-
-  // Forces |EventQueue::ack_timer_| to run now.
-  void RunAckTimer();
-
- private:
-  EventQueue* event_queue_;
-
-  DISALLOW_COPY_AND_ASSIGN(EventQueueTestHelper);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_EVENT_QUEUE_TEST_HELPER_H_
diff --git a/services/ws/event_queue_unittest.cc b/services/ws/event_queue_unittest.cc
deleted file mode 100644
index 6aa22c8..0000000
--- a/services/ws/event_queue_unittest.cc
+++ /dev/null
@@ -1,188 +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.
-
-#include "services/ws/event_queue.h"
-
-#include <string>
-
-#include "base/test/bind_test_util.h"
-#include "services/ws/event_queue.h"
-#include "services/ws/event_queue_test_helper.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/mus/property_converter.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_observer.h"
-#include "ui/aura/window_tracker.h"
-#include "ui/events/event.h"
-#include "ui/events/test/event_generator.h"
-
-namespace ws {
-namespace {
-
-TEST(EventQueueTest, DontQueueEventsToLocalWindow) {
-  WindowServiceTestSetup setup;
-  setup.set_ack_events_immediately(false);
-
-  aura::Window* window = new aura::Window(nullptr);
-  window->Init(ui::LAYER_NOT_DRAWN);
-  setup.root()->AddChild(window);
-  window->Show();
-  window->Focus();
-  EXPECT_TRUE(window->HasFocus());
-
-  setup.changes()->clear();
-  EventQueueTestHelper event_queue_test_helper(setup.service()->event_queue());
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  EXPECT_FALSE(event_queue_test_helper.HasInFlightEvent());
-}
-
-TEST(EventQueueTest, Basic) {
-  WindowServiceTestSetup setup;
-  setup.set_ack_events_immediately(false);
-
-  // Events are only queued if they target a window with a remote client.
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->Focus();
-  EXPECT_TRUE(top_level->HasFocus());
-
-  // Generate a single key event.
-  setup.changes()->clear();
-  EventQueueTestHelper event_queue_test_helper(setup.service()->event_queue());
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  EXPECT_TRUE(event_queue_test_helper.HasInFlightEvent());
-  ASSERT_EQ(1u, setup.changes()->size());
-  EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, (*setup.changes())[0].type);
-  setup.changes()->clear();
-
-  // Generate another key event. As the client has not yet responded to the
-  // first event, this event should be queued.
-  event_generator.PressKey(ui::VKEY_B, ui::EF_NONE);
-  EXPECT_TRUE(event_queue_test_helper.HasInFlightEvent());
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Ack the first event, which should then send the second.
-  event_queue_test_helper.AckInFlightEvent();
-  EXPECT_TRUE(event_queue_test_helper.HasInFlightEvent());
-  ASSERT_EQ(1u, setup.changes()->size());
-  EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, (*setup.changes())[0].type);
-  setup.changes()->clear();
-
-  // Acking the second should mean no more in flight events.
-  event_queue_test_helper.AckInFlightEvent();
-  EXPECT_FALSE(event_queue_test_helper.HasInFlightEvent());
-  EXPECT_TRUE(setup.changes()->empty());
-}
-
-TEST(EventQueueTest, NotifyWhenReadyToDispatch) {
-  WindowServiceTestSetup setup;
-  setup.set_ack_events_immediately(false);
-
-  bool was_dispatch_closure_run = false;
-  setup.service()->event_queue()->NotifyWhenReadyToDispatch(
-      base::BindLambdaForTesting([&]() { was_dispatch_closure_run = true; }));
-  EXPECT_TRUE(was_dispatch_closure_run);
-  was_dispatch_closure_run = false;
-
-  // Events are only queued if they target a window with a remote client.
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->Focus();
-  EXPECT_TRUE(top_level->HasFocus());
-
-  // Generate a single key event.
-  EventQueueTestHelper event_queue_test_helper(setup.service()->event_queue());
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  EXPECT_TRUE(event_queue_test_helper.HasInFlightEvent());
-
-  // Set another closure. The closure should not be run immediately.
-  setup.service()->event_queue()->NotifyWhenReadyToDispatch(
-      base::BindLambdaForTesting([&]() { was_dispatch_closure_run = true; }));
-  EXPECT_FALSE(was_dispatch_closure_run);
-
-  // Ack the event, which should notify the closure.
-  event_queue_test_helper.AckInFlightEvent();
-  EXPECT_TRUE(was_dispatch_closure_run);
-}
-
-TEST(EventQueueTest, Timeout) {
-  WindowServiceTestSetup setup;
-  setup.set_ack_events_immediately(false);
-
-  // Events are only queued if they target a window with a remote client.
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->Focus();
-  EXPECT_TRUE(top_level->HasFocus());
-
-  // Generate a single key event.
-  EventQueueTestHelper event_queue_test_helper(setup.service()->event_queue());
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  EXPECT_TRUE(event_queue_test_helper.HasInFlightEvent());
-
-  // Add a closure to be run when the event is acked, or the timeout occurs.
-  bool was_dispatch_closure_run = false;
-  setup.service()->event_queue()->NotifyWhenReadyToDispatch(
-      base::BindLambdaForTesting([&]() { was_dispatch_closure_run = true; }));
-  EXPECT_FALSE(was_dispatch_closure_run);
-
-  event_queue_test_helper.RunAckTimer();
-  EXPECT_TRUE(was_dispatch_closure_run);
-}
-
-TEST(EventQueueTest, HostDestroyedWhileEventQueued) {
-  WindowServiceTestSetup setup;
-  setup.set_ack_events_immediately(false);
-
-  // Events are only queued if they target a window with a remote client.
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->Focus();
-  EXPECT_TRUE(top_level->HasFocus());
-
-  // Generate a single key event.
-  setup.changes()->clear();
-  EventQueueTestHelper event_queue_test_helper(setup.service()->event_queue());
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  EXPECT_TRUE(event_queue_test_helper.HasInFlightEvent());
-  ASSERT_EQ(1u, setup.changes()->size());
-  EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, (*setup.changes())[0].type);
-  setup.changes()->clear();
-
-  // Generate another key event. As the client has not yet responded to the
-  // first event, this event should be queued.
-  event_generator.PressKey(ui::VKEY_B, ui::EF_NONE);
-  EXPECT_TRUE(event_queue_test_helper.HasInFlightEvent());
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Destroy the window and its host.
-  setup.window_tree_test_helper()->DeleteWindow(top_level);
-  setup.changes()->clear();
-
-  // Ack the first event, the second event should be safely ignored.
-  event_queue_test_helper.AckInFlightEvent();
-  EXPECT_FALSE(event_queue_test_helper.HasInFlightEvent());
-  auto iter = FirstChangeOfType(*setup.changes(), CHANGE_TYPE_INPUT_EVENT);
-  EXPECT_EQ(iter, setup.changes()->end());
-}
-
-}  // namespace
-}  // namespace ws
diff --git a/services/ws/event_test_utils.cc b/services/ws/event_test_utils.cc
deleted file mode 100644
index 7736bc2..0000000
--- a/services/ws/event_test_utils.cc
+++ /dev/null
@@ -1,51 +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.
-
-#include "services/ws/event_test_utils.h"
-
-#include "ui/events/event.h"
-#include "ui/events/event_constants.h"
-#include "ui/events/event_utils.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace ws {
-
-std::string EventToEventType(const ui::Event* event) {
-  if (!event)
-    return "<null>";
-
-  // TODO(sky): convert to using EventTypeName() is ui/events.h.
-  switch (event->type()) {
-    case ui::ET_CANCEL_MODE:
-      return "CANCEL_MODE";
-
-    case ui::ET_KEY_PRESSED:
-      return "KEY_PRESSED";
-
-    case ui::ET_MOUSE_DRAGGED:
-      return "MOUSE_DRAGGED";
-    case ui::ET_MOUSE_ENTERED:
-      return "MOUSE_ENTERED";
-    case ui::ET_MOUSE_MOVED:
-      return "MOUSE_MOVED";
-    case ui::ET_MOUSE_PRESSED:
-      return "MOUSE_PRESSED";
-    case ui::ET_MOUSE_RELEASED:
-      return "MOUSE_RELEASED";
-    default:
-      break;
-  }
-  return std::string(EventTypeName(event->type()));
-}
-
-std::string LocatedEventToEventTypeAndLocation(const ui::Event* event) {
-  if (!event)
-    return "<null>";
-  if (!event->IsLocatedEvent())
-    return "<not-located-event>";
-  return EventToEventType(event) + " " +
-         event->AsLocatedEvent()->location().ToString();
-}
-
-}  // namespace ws
diff --git a/services/ws/event_test_utils.h b/services/ws/event_test_utils.h
deleted file mode 100644
index 7a0337e7..0000000
--- a/services/ws/event_test_utils.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_EVENT_TEST_UTILS_H_
-#define SERVICES_WS_EVENT_TEST_UTILS_H_
-
-#include <string>
-
-namespace ui {
-class Event;
-}
-
-namespace ws {
-
-// Returns a string description of event->type(), or "<null>" if |event| is
-// null.
-std::string EventToEventType(const ui::Event* event);
-
-// If |event| is a LocatedEvent, returns the type as a string (using
-// EventToEventType()) and the location.
-std::string LocatedEventToEventTypeAndLocation(const ui::Event* event);
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_EVENT_TEST_UTILS_H_
diff --git a/services/ws/focus_handler.cc b/services/ws/focus_handler.cc
deleted file mode 100644
index ad9ad5d..0000000
--- a/services/ws/focus_handler.cc
+++ /dev/null
@@ -1,160 +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.
-
-#include "services/ws/focus_handler.h"
-
-#include "services/ws/client_change.h"
-#include "services/ws/client_change_tracker.h"
-#include "services/ws/proxy_window.h"
-#include "services/ws/window_properties.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_delegate.h"
-#include "services/ws/window_tree.h"
-#include "ui/aura/client/focus_client.h"
-#include "ui/wm/public/activation_client.h"
-
-namespace ws {
-
-FocusHandler::FocusHandler(WindowTree* window_tree)
-    : window_tree_(window_tree) {
-  window_tree_->window_service_->focus_client()->AddObserver(this);
-}
-
-FocusHandler::~FocusHandler() {
-  window_tree_->window_service_->focus_client()->RemoveObserver(this);
-}
-
-bool FocusHandler::SetFocus(aura::Window* window) {
-  if (window && !IsFocusableWindow(window)) {
-    DVLOG(1) << "SetFocus failed (access denied or invalid window)";
-    return false;
-  }
-
-  // The client shouldn't set focus with nullptr. When window is giving up its
-  // focus (like closing or hiding), the client should reset the focus within
-  // the client but the reset shouldn't be propagated to the server. The window
-  // server will pick up a new focused window meanwhile, on other hooks like
-  // visibility change or window state change. See https://crbug.com/897875.
-  if (!window) {
-    DVLOG(1) << "SetFocus failed (nullptr)";
-    return false;
-  }
-
-  aura::client::FocusClient* focus_client =
-      window_tree_->window_service_->focus_client();
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  if (window == focus_client->GetFocusedWindow()) {
-    if (proxy_window->focus_owner() != window_tree_) {
-      // The focused window didn't change, but the client that owns focus did
-      // (see |ProxyWindow::focus_owner_| for details on this). Notify the
-      // current owner that it lost focus.
-      if (proxy_window->focus_owner()) {
-        proxy_window->focus_owner()->window_tree_client_->OnWindowFocused(
-            kInvalidTransportId);
-      }
-      proxy_window->set_focus_owner(window_tree_);
-    }
-    return true;
-  }
-
-  ClientChange change(window_tree_->property_change_tracker_.get(), window,
-                      ClientChangeType::kFocus);
-
-  // FocusController has a special API to reset focus inside the active window,
-  // which happens when a view requests focus (e.g. the find bar).
-  // https://crbug.com/880533
-  wm::ActivationClient* activation_client =
-      wm::GetActivationClient(window->GetRootWindow());
-  if (activation_client) {
-    aura::Window* active_window = activation_client->GetActiveWindow();
-    if (active_window && active_window->Contains(window)) {
-      focus_client->ResetFocusWithinActiveWindow(window);
-      if (focus_client->GetFocusedWindow() != window) {
-        DVLOG(1) << "SetFocus failed (FocusClient::ResetFocusWithinActiveWindow"
-                 << " failed for " << window->GetName() << ")";
-        return false;
-      }
-      if (proxy_window)
-        proxy_window->set_focus_owner(window_tree_);
-      return true;
-    }
-  }
-
-  focus_client->FocusWindow(window);
-  if (focus_client->GetFocusedWindow() != window) {
-    DVLOG(1) << "SetFocus failed (FocusClient::FocusWindow call failed for "
-             << window->GetName() << ")";
-    return false;
-  }
-
-  if (proxy_window)
-    proxy_window->set_focus_owner(window_tree_);
-  return true;
-}
-
-void FocusHandler::SetCanFocus(aura::Window* window, bool can_focus) {
-  if (window && (window_tree_->IsClientCreatedWindow(window) ||
-                 window_tree_->IsClientRootWindow(window))) {
-    window->SetProperty(kCanFocus, can_focus);
-  } else {
-    DVLOG(1) << "SetCanFocus failed (invalid or unknown window)";
-  }
-}
-
-bool FocusHandler::IsFocusableWindow(aura::Window* window) const {
-  if (!window)
-    return true;  // Used to clear focus.
-
-  if (!window->IsVisible() || !window->GetRootWindow())
-    return false;  // The window must be drawn and attached to a root.
-
-  return (window_tree_->IsClientCreatedWindow(window) ||
-          window_tree_->IsClientRootWindow(window));
-}
-
-bool FocusHandler::IsEmbeddedClient(ProxyWindow* proxy_window) const {
-  return proxy_window->embedded_window_tree() == window_tree_;
-}
-
-bool FocusHandler::IsOwningClient(ProxyWindow* proxy_window) const {
-  return proxy_window->owning_window_tree() == window_tree_;
-}
-
-void FocusHandler::OnWindowFocused(aura::Window* gained_focus,
-                                   aura::Window* lost_focus) {
-  ClientChangeTracker* change_tracker =
-      window_tree_->property_change_tracker_.get();
-  if (change_tracker->IsProcessingChangeForWindow(lost_focus,
-                                                  ClientChangeType::kFocus) ||
-      change_tracker->IsProcessingChangeForWindow(gained_focus,
-                                                  ClientChangeType::kFocus)) {
-    // The client initiated the change, don't notify the client.
-    return;
-  }
-
-  // The client did not request the focus change. Update state appropriately.
-  // Prefer the embedded client over the owning client.
-  bool notified_gained = false;
-  if (gained_focus) {
-    ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(gained_focus);
-    if (proxy_window && (IsEmbeddedClient(proxy_window) ||
-                         (!proxy_window->embedded_window_tree() &&
-                          IsOwningClient(proxy_window)))) {
-      proxy_window->set_focus_owner(window_tree_);
-      window_tree_->window_tree_client_->OnWindowFocused(
-          window_tree_->TransportIdForWindow(gained_focus));
-      notified_gained = true;
-    }
-  }
-
-  if (lost_focus && !notified_gained) {
-    ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(lost_focus);
-    if (proxy_window && proxy_window->focus_owner() == window_tree_) {
-      proxy_window->set_focus_owner(nullptr);
-      window_tree_->window_tree_client_->OnWindowFocused(kInvalidTransportId);
-    }
-  }
-}
-
-}  // namespace ws
diff --git a/services/ws/focus_handler.h b/services/ws/focus_handler.h
deleted file mode 100644
index f53a92f..0000000
--- a/services/ws/focus_handler.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_FOCUS_HANDLER_H_
-#define SERVICES_WS_FOCUS_HANDLER_H_
-
-#include "base/macros.h"
-#include "ui/aura/client/focus_change_observer.h"
-
-namespace aura {
-class Window;
-}
-
-namespace ws {
-
-class ProxyWindow;
-class WindowTree;
-
-// FocusHandler handles focus requests from the client, as well as notifying
-// the client when focus changes.
-class FocusHandler : public aura::client::FocusChangeObserver {
- public:
-  explicit FocusHandler(WindowTree* window_tree);
-  ~FocusHandler() override;
-
-  // Sets focus to |window| (which may be null). Returns true on success.
-  bool SetFocus(aura::Window* window);
-
-  // Sets whether |window| can be focused.
-  void SetCanFocus(aura::Window* window, bool can_focus);
-
- private:
-  // Returns true if |window| can be focused.
-  bool IsFocusableWindow(aura::Window* window) const;
-
-  bool IsEmbeddedClient(ProxyWindow* proxy_window) const;
-  bool IsOwningClient(ProxyWindow* proxy_window) const;
-
-  // aura::client::FocusChangeObserver:
-  void OnWindowFocused(aura::Window* gained_focus,
-                       aura::Window* lost_focus) override;
-
-  WindowTree* window_tree_;
-
-  DISALLOW_COPY_AND_ASSIGN(FocusHandler);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_FOCUS_HANDLER_H_
diff --git a/services/ws/focus_handler_unittest.cc b/services/ws/focus_handler_unittest.cc
deleted file mode 100644
index e166fb2..0000000
--- a/services/ws/focus_handler_unittest.cc
+++ /dev/null
@@ -1,223 +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.
-
-#include "services/ws/focus_handler.h"
-
-#include <stdint.h>
-
-#include <memory>
-#include <queue>
-
-#include "services/ws/event_test_utils.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/layout_manager.h"
-#include "ui/aura/window.h"
-#include "ui/events/event_constants.h"
-#include "ui/events/keycodes/keyboard_codes.h"
-#include "ui/events/test/event_generator.h"
-#include "ui/wm/core/focus_controller.h"
-
-namespace ws {
-namespace {
-
-TEST(FocusHandlerTest, FocusTopLevel) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-
-  // SetFocus() should fail as |top_level| isn't visible.
-  EXPECT_FALSE(setup.window_tree_test_helper()->SetFocus(top_level));
-
-  top_level->Show();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(top_level));
-  EXPECT_TRUE(top_level->HasFocus());
-}
-
-// This test simulates the typical sequence of a client closing a window Hide().
-// Note that SetFocus(nullptr) shouldn't happen.
-TEST(FocusHandlerTest, FocusChangesAfterHide) {
-  // Create two top-levels and focus the second.
-  WindowServiceTestSetup setup;
-  aura::Window* top_level1 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level1);
-  top_level1->Show();
-  aura::Window* top_level2 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level2);
-  top_level2->Show();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(top_level2));
-  EXPECT_TRUE(top_level2->HasFocus());
-
-  // Hiding |top_level2| should focus |top_level1|.
-  setup.changes()->clear();
-  top_level2->Hide();
-  EXPECT_FALSE(top_level2->HasFocus());
-  EXPECT_TRUE(top_level1->HasFocus());
-  EXPECT_TRUE(ContainsChange(*setup.changes(), "Focused id=0,1"));
-}
-
-TEST(FocusHandlerTest, FocusChild) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-
-  // SetFocus() should fail as |window| isn't parented yet.
-  EXPECT_FALSE(setup.window_tree_test_helper()->SetFocus(window));
-
-  top_level->AddChild(window);
-  // SetFocus() should still fail as |window| isn't visible.
-  EXPECT_FALSE(setup.window_tree_test_helper()->SetFocus(window));
-  setup.window_tree_test_helper()->SetCanFocus(window, false);
-  window->Show();
-
-  // SetFocus() should fail as SetCanFocus(false) was called.
-  EXPECT_FALSE(setup.window_tree_test_helper()->SetFocus(window));
-
-  setup.window_tree_test_helper()->SetCanFocus(window, true);
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(window));
-}
-
-// Regression test for https://crbug.com/880533
-TEST(FocusHandlerTest, FocusChildOfActiveWindow) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  top_level->Show();
-  setup.focus_controller()->ActivateWindow(top_level);
-  EXPECT_EQ(top_level, setup.focus_controller()->GetActiveWindow());
-
-  aura::Window* child = setup.window_tree_test_helper()->NewWindow();
-  top_level->AddChild(child);
-  child->Show();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(child));
-  EXPECT_TRUE(child->HasFocus());
-}
-
-TEST(FocusHandlerTest, NotifyOnFocusChange) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  aura::Window* window1 = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window1);
-  top_level->AddChild(window1);
-  window1->Show();
-  aura::Window* window2 = setup.window_tree_test_helper()->NewWindow(4);
-  ASSERT_TRUE(window2);
-  top_level->AddChild(window2);
-  window2->Show();
-  setup.changes()->clear();
-
-  // Window is parented and visible, so SetFocus() should succeed.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(window1));
-  // As the client originated the request it is not notified of the change.
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Focus |window2| locally (not from the client), which should result in
-  // notifying the client.
-  window2->Focus();
-  EXPECT_TRUE(window2->HasFocus());
-  EXPECT_EQ("Focused id=0,4", SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(FocusHandlerTest, FocusChangeFromEmbedded) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(embed_window);
-  top_level->AddChild(embed_window);
-  embed_window->Show();
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(embed_window);
-  setup.changes()->clear();
-  embedding_helper->changes()->clear();
-
-  // Set focus from the embedded client.
-  EXPECT_TRUE(
-      embedding_helper->window_tree_test_helper->SetFocus(embed_window));
-  EXPECT_TRUE(embed_window->HasFocus());
-  EXPECT_TRUE(setup.changes()->empty());
-  EXPECT_TRUE(embedding_helper->changes()->empty());
-
-  // Send an event, the embedded client should get it.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  EXPECT_TRUE(setup.changes()->empty());
-  EXPECT_EQ(
-      "KEY_PRESSED",
-      EventToEventType(
-          embedding_helper->window_tree_client.PopInputEvent().event.get()));
-  EXPECT_TRUE(embedding_helper->window_tree_client.input_events().empty());
-  embedding_helper->changes()->clear();
-
-  // Set focus from the parent. The embedded client should lose focus.
-  setup.window_tree_test_helper()->SetFocus(embed_window);
-  EXPECT_TRUE(embed_window->HasFocus());
-  EXPECT_TRUE(setup.changes()->empty());
-  EXPECT_EQ("Focused id=null",
-            SingleChangeToDescription(*embedding_helper->changes()));
-  embedding_helper->changes()->clear();
-
-  // And events should now target the parent.
-  event_generator.PressKey(ui::VKEY_B, ui::EF_NONE);
-  EXPECT_EQ("KEY_PRESSED",
-            EventToEventType(
-                setup.window_tree_client()->PopInputEvent().event.get()));
-  EXPECT_TRUE(embedding_helper->changes()->empty());
-}
-
-TEST(FocusHandlerTest, EmbedderGetsInterceptedKeyEvents) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(embed_window);
-  top_level->AddChild(embed_window);
-  embed_window->Show();
-
-  std::unique_ptr<EmbeddingHelper> embedding_helper = setup.CreateEmbedding(
-      embed_window, mojom::kEmbedFlagEmbedderInterceptsEvents);
-  ASSERT_TRUE(embedding_helper);
-  aura::Window* embed_child_window =
-      embedding_helper->window_tree_test_helper->NewWindow();
-  ASSERT_TRUE(embed_child_window);
-  embed_child_window->Show();
-  embed_window->AddChild(embed_child_window);
-  setup.changes()->clear();
-  embedding_helper->changes()->clear();
-
-  // Set focus from the embedded client.
-  EXPECT_TRUE(
-      embedding_helper->window_tree_test_helper->SetFocus(embed_child_window));
-  EXPECT_TRUE(embed_child_window->HasFocus());
-
-  // Generate a key-press. Even though focus is on a window in the embedded
-  // client, the event goes to the embedder because it intercepts events.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  EXPECT_TRUE(embedding_helper->changes()->empty());
-  EXPECT_TRUE(embedding_helper->window_tree_client.input_events().empty());
-  EXPECT_EQ("KEY_PRESSED",
-            EventToEventType(
-                setup.window_tree_client()->PopInputEvent().event.get()));
-}
-
-}  // namespace
-}  // namespace ws
diff --git a/services/ws/gpu_host/BUILD.gn b/services/ws/gpu_host/BUILD.gn
index 20253ff..3eb8ae4d 100644
--- a/services/ws/gpu_host/BUILD.gn
+++ b/services/ws/gpu_host/BUILD.gn
@@ -100,7 +100,6 @@
     "//services/service_manager/public/mojom",
     "//services/ws/common",
     "//services/ws/common:task_runner_test_base",
-    "//services/ws/public/cpp",
     "//services/ws/public/mojom",
     "//testing/gtest",
     "//third_party/mesa_headers",
diff --git a/services/ws/host_context_factory.cc b/services/ws/host_context_factory.cc
deleted file mode 100644
index 90876748..0000000
--- a/services/ws/host_context_factory.cc
+++ /dev/null
@@ -1,102 +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.
-
-#include "services/ws/host_context_factory.h"
-
-#include "base/bind.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/gpu/raster_context_provider.h"
-#include "components/viz/host/host_frame_sink_manager.h"
-#include "services/ws/ids.h"
-#include "services/ws/public/cpp/gpu/context_provider_command_buffer.h"
-#include "services/ws/public/cpp/gpu/gpu.h"
-#include "ui/compositor/host/host_context_factory_private.h"
-
-namespace ws {
-
-// NOTE: resize_task_runner needs to be specialized on mac.
-HostContextFactory::HostContextFactory(
-    Gpu* gpu,
-    viz::HostFrameSinkManager* host_frame_sink_manager)
-    : gpu_(gpu),
-      context_factory_private_(std::make_unique<ui::HostContextFactoryPrivate>(
-          kWindowServerClientId,
-          host_frame_sink_manager,
-          base::ThreadTaskRunnerHandle::Get())),
-      weak_ptr_factory_(this) {}
-
-HostContextFactory::~HostContextFactory() = default;
-
-ui::ContextFactoryPrivate* HostContextFactory::GetContextFactoryPrivate() {
-  return context_factory_private_.get();
-}
-
-void HostContextFactory::OnEstablishedGpuChannel(
-    base::WeakPtr<ui::Compositor> compositor,
-    scoped_refptr<gpu::GpuChannelHost> gpu_channel) {
-  if (!compositor)
-    return;
-
-  scoped_refptr<ws::ContextProviderCommandBuffer> context_provider =
-      gpu_->CreateContextProvider(std::move(gpu_channel));
-  // If the binding fails, then we need to return early since the compositor
-  // expects a successfully initialized/bound provider.
-  if (context_provider->BindToCurrentThread() != gpu::ContextResult::kSuccess) {
-    // TODO(danakj): We should retry if the result was not kFatalFailure.
-    return;
-  }
-  context_factory_private_->ConfigureCompositor(
-      compositor.get(), std::move(context_provider), nullptr);
-}
-
-void HostContextFactory::CreateLayerTreeFrameSink(
-    base::WeakPtr<ui::Compositor> compositor) {
-  gpu_->EstablishGpuChannel(
-      base::BindOnce(&HostContextFactory::OnEstablishedGpuChannel,
-                     weak_ptr_factory_.GetWeakPtr(), compositor));
-}
-
-scoped_refptr<viz::ContextProvider>
-HostContextFactory::SharedMainThreadContextProvider() {
-  if (!shared_main_thread_context_provider_) {
-    scoped_refptr<gpu::GpuChannelHost> gpu_channel =
-        gpu_->EstablishGpuChannelSync();
-    shared_main_thread_context_provider_ =
-        gpu_->CreateContextProvider(std::move(gpu_channel));
-    if (shared_main_thread_context_provider_->BindToCurrentThread() !=
-        gpu::ContextResult::kSuccess)
-      shared_main_thread_context_provider_ = nullptr;
-  }
-  return shared_main_thread_context_provider_;
-}
-
-scoped_refptr<viz::RasterContextProvider>
-HostContextFactory::SharedMainThreadRasterContextProvider() {
-  // Exo is currently the only client requesting this context provider.
-  // Exo does not request this context in the Window Service.
-  SharedMainThreadContextProvider();
-  DCHECK(!shared_main_thread_context_provider_ ||
-         shared_main_thread_context_provider_->RasterInterface());
-  return shared_main_thread_context_provider_;
-}
-
-void HostContextFactory::RemoveCompositor(ui::Compositor* compositor) {
-  context_factory_private_->UnconfigureCompositor(compositor);
-}
-
-gpu::GpuMemoryBufferManager* HostContextFactory::GetGpuMemoryBufferManager() {
-  return gpu_->gpu_memory_buffer_manager();
-}
-
-cc::TaskGraphRunner* HostContextFactory::GetTaskGraphRunner() {
-  return raster_thread_helper_.task_graph_runner();
-}
-
-bool HostContextFactory::SyncTokensRequiredForDisplayCompositor() {
-  // This runs out-of-process, so must be using a different context from the
-  // UI compositor, and requires synchronization between them.
-  return true;
-}
-
-}  // namespace ws
diff --git a/services/ws/host_context_factory.h b/services/ws/host_context_factory.h
deleted file mode 100644
index 54990bb4..0000000
--- a/services/ws/host_context_factory.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_HOST_CONTEXT_FACTORY_H_
-#define SERVICES_WS_HOST_CONTEXT_FACTORY_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "components/viz/common/display/renderer_settings.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/gpu/raster_context_provider.h"
-#include "services/ws/public/cpp/raster_thread_helper.h"
-#include "ui/compositor/compositor.h"
-
-namespace gpu {
-class GpuChannelHost;
-}
-
-namespace ui {
-class HostContextFactoryPrivate;
-}  // namespace ui
-
-namespace ws {
-
-class ContextProviderCommandBuffer;
-class Gpu;
-
-// ui::ContextFactory used when the WindowService is acting as the viz host.
-// Internally this creates a ui::HostContextFactoryPrivate for the
-// ui::ContextFactoryPrivate implementation.
-class HostContextFactory : public ui::ContextFactory {
- public:
-  HostContextFactory(Gpu* gpu,
-                     viz::HostFrameSinkManager* host_frame_sink_manager);
-  ~HostContextFactory() override;
-
-  ui::ContextFactoryPrivate* GetContextFactoryPrivate();
-
- private:
-  // Callback function for Gpu::EstablishGpuChannel().
-  void OnEstablishedGpuChannel(base::WeakPtr<ui::Compositor> compositor,
-                               scoped_refptr<gpu::GpuChannelHost> gpu_channel);
-
-  // ContextFactory:
-  void CreateLayerTreeFrameSink(
-      base::WeakPtr<ui::Compositor> compositor) override;
-  scoped_refptr<viz::ContextProvider> SharedMainThreadContextProvider()
-      override;
-  scoped_refptr<viz::RasterContextProvider>
-  SharedMainThreadRasterContextProvider() override;
-  void RemoveCompositor(ui::Compositor* compositor) override;
-  gpu::GpuMemoryBufferManager* GetGpuMemoryBufferManager() override;
-  cc::TaskGraphRunner* GetTaskGraphRunner() override;
-  void AddObserver(ui::ContextFactoryObserver* observer) override {}
-  void RemoveObserver(ui::ContextFactoryObserver* observer) override {}
-  bool SyncTokensRequiredForDisplayCompositor() override;
-
-  RasterThreadHelper raster_thread_helper_;
-  Gpu* gpu_;
-  scoped_refptr<ws::ContextProviderCommandBuffer>
-      shared_main_thread_context_provider_;
-
-  std::unique_ptr<ui::HostContextFactoryPrivate> context_factory_private_;
-
-  base::WeakPtrFactory<HostContextFactory> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(HostContextFactory);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_HOST_CONTEXT_FACTORY_H_
diff --git a/services/ws/ids.h b/services/ws/ids.h
deleted file mode 100644
index 6619e74..0000000
--- a/services/ws/ids.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_IDS_H_
-#define SERVICES_WS_IDS_H_
-
-#include <stdint.h>
-
-#include "components/viz/common/surfaces/frame_sink_id.h"
-#include "services/ws/common/types.h"
-
-namespace ws {
-
-// A client id used to indicate no client. That is, no WindowTree ever gets this
-// id.
-constexpr ClientSpecificId kInvalidClientId = 0;
-
-constexpr Id kInvalidTransportId = 0;
-
-// A client id used to indicate WindowServer.
-constexpr ClientSpecificId kWindowServerClientId = 1;
-
-// The initial id assigned to window service clients, incremented thereafter.
-constexpr ClientSpecificId kInitialClientId = 2;
-
-// The initial id assigned to window service clients in a decrementing mode.
-// Used when Chrome hosts Ash in the browser process; in that configuration,
-// Content connects directly to Viz and assigns incrementing FrameSinkIds to
-// renderers, so the window service uses decrementing ids to avoid conflicts.
-constexpr ClientSpecificId kInitialClientIdDecrement =
-    std::numeric_limits<ClientSpecificId>::max();
-
-// Used for ids assigned by the client.
-using ClientWindowId = viz::FrameSinkId;
-
-using ClientWindowIdHash = viz::FrameSinkIdHash;
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_IDS_H_
diff --git a/services/ws/ime/BUILD.gn b/services/ws/ime/BUILD.gn
deleted file mode 100644
index aedf2209..0000000
--- a/services/ws/ime/BUILD.gn
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//testing/test.gni")
-
-source_set("lib") {
-  sources = [
-    "ime_driver_bridge.cc",
-    "ime_driver_bridge.h",
-    "ime_registrar_impl.cc",
-    "ime_registrar_impl.h",
-  ]
-
-  deps = [
-    "//base",
-    "//mojo/public/cpp/bindings",
-    "//services/service_manager/public/cpp",
-    "//services/ws/public/mojom",
-  ]
-}
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "ime_unittest.cc",
-  ]
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//services/service_manager/public/cpp",
-    "//services/service_manager/public/cpp/test:test_support",
-    "//services/viz/public/cpp:manifest",
-    "//services/ws/ime/test_ime_driver/public/cpp:manifest",
-    "//services/ws/ime/test_ime_driver/public/mojom",
-    "//services/ws/public/mojom",
-    "//services/ws/test_ws:manifest",
-    "//testing/gtest",
-  ]
-
-  data_deps = [
-    "//services/viz",
-    "//services/ws/ime/test_ime_driver",
-    "//services/ws/test_ws",
-  ]
-}
diff --git a/services/ws/ime/ime_driver_bridge.cc b/services/ws/ime/ime_driver_bridge.cc
deleted file mode 100644
index 4c0b6d6..0000000
--- a/services/ws/ime/ime_driver_bridge.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/ime/ime_driver_bridge.h"
-
-#include "services/service_manager/public/cpp/connector.h"
-#include "services/ws/ime/ime_registrar_impl.h"
-
-namespace ws {
-
-struct IMEDriverBridge::Request {
-  Request() = default;
-  Request(Request&& other) = default;
-  Request(mojom::InputMethodRequest input_method_request,
-          mojom::TextInputClientPtr client,
-          mojom::SessionDetailsPtr details)
-      : input_method_request(std::move(input_method_request)),
-        client(std::move(client)),
-        details(std::move(details)) {}
-  ~Request() = default;
-
-  mojom::InputMethodRequest input_method_request;
-  mojom::TextInputClientPtr client;
-  mojom::SessionDetailsPtr details;
-};
-
-IMEDriverBridge::IMEDriverBridge() = default;
-IMEDriverBridge::~IMEDriverBridge() = default;
-
-void IMEDriverBridge::AddBinding(mojom::IMEDriverRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void IMEDriverBridge::SetDriver(mojom::IMEDriverPtr driver) {
-  // TODO(moshayedi): crbug.com/669681. Handle switching drivers properly. For
-  // now we only register the first driver to avoid clients of the previous
-  // driver from hanging.
-  if (driver_)
-    return;
-
-  driver_ = std::move(driver);
-
-  while (!pending_requests_.empty()) {
-    auto& request = pending_requests_.front();
-    driver_->StartSession(std::move(request.input_method_request),
-                          std::move(request.client),
-                          std::move(request.details));
-    pending_requests_.pop();
-  }
-}
-
-void IMEDriverBridge::StartSession(
-    mojom::InputMethodRequest input_method_request,
-    mojom::TextInputClientPtr client,
-    mojom::SessionDetailsPtr details) {
-  if (driver_.get()) {
-    // TODO(moshayedi): crbug.com/634431. This will forward all calls from
-    // clients to the driver as they are. We may need to check |caret_bounds|
-    // parameter of InputMethod::OnCaretBoundsChanged() here and limit them to
-    // client's focused window.
-    driver_->StartSession(std::move(input_method_request), std::move(client),
-                          std::move(details));
-  } else {
-    pending_requests_.push(Request(std::move(input_method_request),
-                                   std::move(client), std::move(details)));
-  }
-}
-
-}  // namespace ws
diff --git a/services/ws/ime/ime_driver_bridge.h b/services/ws/ime/ime_driver_bridge.h
deleted file mode 100644
index 4d9ee4f..0000000
--- a/services/ws/ime/ime_driver_bridge.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_IME_IME_DRIVER_BRIDGE_H_
-#define SERVICES_WS_IME_IME_DRIVER_BRIDGE_H_
-
-#include <utility>
-
-#include "base/containers/queue.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-
-namespace ws {
-
-class IMEDriverBridge : public mojom::IMEDriver {
- public:
-  IMEDriverBridge();
-  ~IMEDriverBridge() override;
-
-  void AddBinding(mojom::IMEDriverRequest request);
-  void SetDriver(mojom::IMEDriverPtr driver);
-
- private:
-  // Holds the params to start an IME session.
-  struct Request;
-
-  // mojom::IMEDriver:
-  void StartSession(mojom::InputMethodRequest input_method_request,
-                    mojom::TextInputClientPtr client,
-                    mojom::SessionDetailsPtr details) override;
-
-  mojo::BindingSet<mojom::IMEDriver> bindings_;
-  mojom::IMEDriverPtr driver_;
-
-  base::queue<Request> pending_requests_;
-
-  DISALLOW_COPY_AND_ASSIGN(IMEDriverBridge);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_IME_IME_DRIVER_BRIDGE_H_
diff --git a/services/ws/ime/ime_registrar_impl.cc b/services/ws/ime/ime_registrar_impl.cc
deleted file mode 100644
index 8154f2e..0000000
--- a/services/ws/ime/ime_registrar_impl.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/ime/ime_registrar_impl.h"
-
-namespace ws {
-
-IMERegistrarImpl::IMERegistrarImpl(IMEDriverBridge* ime_driver_bridge)
-    : ime_driver_bridge_(ime_driver_bridge) {}
-
-IMERegistrarImpl::~IMERegistrarImpl() {}
-
-void IMERegistrarImpl::AddBinding(mojom::IMERegistrarRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void IMERegistrarImpl::RegisterDriver(mojom::IMEDriverPtr driver) {
-  // TODO(moshayedi): crbug.com/634441. IMERegistrarImpl currently identifies
-  // the last registered driver as the current driver. Rethink this once we
-  // have more usecases.
-  ime_driver_bridge_->SetDriver(std::move(driver));
-}
-}  // namespace ws
diff --git a/services/ws/ime/ime_registrar_impl.h b/services/ws/ime/ime_registrar_impl.h
deleted file mode 100644
index 594342f8..0000000
--- a/services/ws/ime/ime_registrar_impl.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_IME_IME_REGISTRAR_IMPL_H_
-#define SERVICES_WS_IME_IME_REGISTRAR_IMPL_H_
-
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "services/ws/ime/ime_driver_bridge.h"
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-
-namespace ws {
-
-class IMERegistrarImpl : public mojom::IMERegistrar {
- public:
-  explicit IMERegistrarImpl(IMEDriverBridge* ime_driver_bridge);
-  ~IMERegistrarImpl() override;
-
-  void AddBinding(mojom::IMERegistrarRequest request);
-
- private:
-  // mojom::IMERegistrar:
-  void RegisterDriver(mojom::IMEDriverPtr driver) override;
-
-  mojo::BindingSet<mojom::IMERegistrar> bindings_;
-  IMEDriverBridge* ime_driver_bridge_;
-
-  DISALLOW_COPY_AND_ASSIGN(IMERegistrarImpl);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_IME_IME_REGISTRAR_IMPL_H_
diff --git a/services/ws/ime/ime_unittest.cc b/services/ws/ime/ime_unittest.cc
deleted file mode 100644
index d18d889..0000000
--- a/services/ws/ime/ime_unittest.cc
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/test/scoped_task_environment.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "services/service_manager/public/cpp/manifest_builder.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_binding.h"
-#include "services/service_manager/public/cpp/test/test_service_manager.h"
-#include "services/viz/public/cpp/manifest.h"
-#include "services/ws/ime/test_ime_driver/public/cpp/manifest.h"
-#include "services/ws/ime/test_ime_driver/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-#include "services/ws/test_ws/test_manifest.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/events/event.h"
-#include "ui/events/keycodes/dom/dom_code.h"
-
-class TestTextInputClient : public ws::mojom::TextInputClient {
- public:
-  explicit TestTextInputClient(ws::mojom::TextInputClientRequest request)
-      : binding_(this, std::move(request)) {}
-
-  std::unique_ptr<ui::Event> WaitUntilInsertChar() {
-    if (!receieved_event_) {
-      run_loop_.reset(new base::RunLoop);
-      run_loop_->Run();
-      run_loop_.reset();
-    }
-
-    return std::move(receieved_event_);
-  }
-
- private:
-  void SetCompositionText(const ui::CompositionText& composition) override {}
-  void ConfirmCompositionText() override {}
-  void ClearCompositionText() override {}
-  void InsertText(const base::string16& text) override {}
-  void InsertChar(std::unique_ptr<ui::Event> event) override {
-    receieved_event_ = std::move(event);
-    if (run_loop_)
-      run_loop_->Quit();
-  }
-  void DispatchKeyEventPostIME(
-      std::unique_ptr<ui::Event> event,
-      DispatchKeyEventPostIMECallback callback) override {
-    std::move(callback).Run(false, false);
-  }
-  void EnsureCaretNotInRect(const gfx::Rect& rect) override {}
-  void SetEditableSelectionRange(const gfx::Range& range) override {}
-  void DeleteRange(const gfx::Range& range) override {}
-  void OnInputMethodChanged() override {}
-  void ChangeTextDirectionAndLayoutAlignment(
-      base::i18n::TextDirection direction) override {}
-  void ExtendSelectionAndDelete(uint32_t before, uint32_t after) override {}
-
-  mojo::Binding<ws::mojom::TextInputClient> binding_;
-  std::unique_ptr<base::RunLoop> run_loop_;
-  std::unique_ptr<ui::Event> receieved_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestTextInputClient);
-};
-
-const char kTestServiceName[] = "ime_unittests";
-
-class IMEAppTest : public testing::Test {
- public:
-  IMEAppTest()
-      : test_service_manager_(
-            {test_ws::GetManifest(), test_ime_driver::GetManifest(),
-             viz::GetManifest(),
-             service_manager::ManifestBuilder()
-                 .WithServiceName(kTestServiceName)
-                 .RequireCapability(ws::mojom::kServiceName, "app")
-                 .RequireCapability(test_ime_driver::mojom::kServiceName, "")
-                 .Build()}),
-        test_service_binding_(
-            &test_service_,
-            test_service_manager_.RegisterTestInstance(kTestServiceName)) {
-    // test_ime_driver will register itself as the current IMEDriver.
-    // TODO(https://crbug.com/904148): This should not use |WarmService()|.
-    connector()->WarmService(service_manager::ServiceFilter::ByName(
-        test_ime_driver::mojom::kServiceName));
-    connector()->BindInterface(ws::mojom::kServiceName, &ime_driver_);
-  }
-
-  ~IMEAppTest() override {}
-
-  service_manager::Connector* connector() {
-    return test_service_binding_.GetConnector();
-  }
-
-  bool ProcessKeyEvent(ws::mojom::InputMethodPtr* input_method,
-                       std::unique_ptr<ui::Event> event) {
-    (*input_method)
-        ->ProcessKeyEvent(std::move(event),
-                          base::Bind(&IMEAppTest::ProcessKeyEventCallback,
-                                     base::Unretained(this)));
-
-    run_loop_.reset(new base::RunLoop);
-    run_loop_->Run();
-    run_loop_.reset();
-
-    return handled_;
-  }
-
- protected:
-  void ProcessKeyEventCallback(bool handled) {
-    handled_ = handled;
-    run_loop_->Quit();
-  }
-
-  base::test::ScopedTaskEnvironment task_environment_;
-  service_manager::TestServiceManager test_service_manager_;
-  service_manager::Service test_service_;
-  service_manager::ServiceBinding test_service_binding_;
-
-  ws::mojom::IMEDriverPtr ime_driver_;
-  std::unique_ptr<base::RunLoop> run_loop_;
-  bool handled_;
-
-  DISALLOW_COPY_AND_ASSIGN(IMEAppTest);
-};
-
-// Tests sending a KeyEvent to the IMEDriver through the Mus IMEDriver.
-TEST_F(IMEAppTest, ProcessKeyEvent) {
-  ws::mojom::InputMethodPtr input_method;
-  ws::mojom::SessionDetailsPtr details = ws::mojom::SessionDetails::New();
-  details->state = ws::mojom::TextInputState::New(ui::TEXT_INPUT_TYPE_TEXT,
-                                                  ui::TEXT_INPUT_MODE_DEFAULT,
-                                                  base::i18n::LEFT_TO_RIGHT, 0);
-  details->data = ws::mojom::TextInputClientData::New();
-  ws::mojom::TextInputClientPtr client_ptr;
-  TestTextInputClient client(MakeRequest(&client_ptr));
-  ime_driver_->StartSession(MakeRequest(&input_method), std::move(client_ptr),
-                            std::move(details));
-
-  // Send character key event.
-  ui::KeyEvent char_event('A', ui::VKEY_A, ui::DomCode::NONE, 0);
-  EXPECT_TRUE(ProcessKeyEvent(&input_method, ui::Event::Clone(char_event)));
-
-  std::unique_ptr<ui::Event> received_event = client.WaitUntilInsertChar();
-  ASSERT_TRUE(received_event && received_event->IsKeyEvent());
-
-  ui::KeyEvent* received_key_event = received_event->AsKeyEvent();
-  EXPECT_EQ(ui::ET_KEY_PRESSED, received_key_event->type());
-  EXPECT_TRUE(received_key_event->is_char());
-  EXPECT_EQ(char_event.GetCharacter(), received_key_event->GetCharacter());
-
-  // Send non-character key event.
-  ui::KeyEvent nonchar_event(ui::ET_KEY_PRESSED, ui::VKEY_LEFT, 0);
-  EXPECT_FALSE(ProcessKeyEvent(&input_method, ui::Event::Clone(nonchar_event)));
-}
diff --git a/services/ws/ime/test_ime_driver/BUILD.gn b/services/ws/ime/test_ime_driver/BUILD.gn
deleted file mode 100644
index 9331693f..0000000
--- a/services/ws/ime/test_ime_driver/BUILD.gn
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//services/service_manager/public/cpp/service_executable.gni")
-import("//testing/test.gni")
-
-source_set("lib") {
-  sources = [
-    "test_ime_application.cc",
-    "test_ime_application.h",
-    "test_ime_driver.cc",
-    "test_ime_driver.h",
-  ]
-
-  deps = [
-    "//base",
-    "//services/service_manager/public/cpp",
-    "//services/ws/public/mojom",
-  ]
-}
-
-service_executable("test_ime_driver") {
-  sources = [
-    "main.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//base",
-    "//services/service_manager/public/cpp",
-    "//services/ws/public/mojom",
-  ]
-}
diff --git a/services/ws/ime/test_ime_driver/OWNERS b/services/ws/ime/test_ime_driver/OWNERS
deleted file mode 100644
index e69de29..0000000
--- a/services/ws/ime/test_ime_driver/OWNERS
+++ /dev/null
diff --git a/services/ws/ime/test_ime_driver/main.cc b/services/ws/ime/test_ime_driver/main.cc
deleted file mode 100644
index 49a6a99..0000000
--- a/services/ws/ime/test_ime_driver/main.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop.h"
-#include "services/service_manager/public/cpp/service_executable/service_main.h"
-#include "services/ws/ime/test_ime_driver/test_ime_application.h"
-
-void ServiceMain(service_manager::mojom::ServiceRequest request) {
-  base::MessageLoop message_loop;
-  ws::test::TestIMEApplication(std::move(request)).RunUntilTermination();
-}
diff --git a/services/ws/ime/test_ime_driver/public/cpp/BUILD.gn b/services/ws/ime/test_ime_driver/public/cpp/BUILD.gn
deleted file mode 100644
index e574d09..0000000
--- a/services/ws/ime/test_ime_driver/public/cpp/BUILD.gn
+++ /dev/null
@@ -1,17 +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.
-
-source_set("manifest") {
-  sources = [
-    "manifest.cc",
-    "manifest.h",
-  ]
-
-  deps = [
-    "//base",
-    "//services/service_manager/public/cpp",
-    "//services/ws/ime/test_ime_driver/public/mojom",
-    "//services/ws/public/mojom",
-  ]
-}
diff --git a/services/ws/ime/test_ime_driver/public/cpp/OWNERS b/services/ws/ime/test_ime_driver/public/cpp/OWNERS
deleted file mode 100644
index 6faeaa47..0000000
--- a/services/ws/ime/test_ime_driver/public/cpp/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-per-file manifest.cc=set noparent
-per-file manifest.cc=file://ipc/SECURITY_OWNERS
-per-file manifest.h=set noparent
-per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/ime/test_ime_driver/public/cpp/manifest.cc b/services/ws/ime/test_ime_driver/public/cpp/manifest.cc
deleted file mode 100644
index 96660f2..0000000
--- a/services/ws/ime/test_ime_driver/public/cpp/manifest.cc
+++ /dev/null
@@ -1,25 +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 "services/ws/ime/test_ime_driver/public/cpp/manifest.h"
-
-#include "base/no_destructor.h"
-#include "services/service_manager/public/cpp/manifest_builder.h"
-#include "services/ws/ime/test_ime_driver/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-
-namespace test_ime_driver {
-
-const service_manager::Manifest& GetManifest() {
-  static base::NoDestructor<service_manager::Manifest> manifest{
-      service_manager::ManifestBuilder()
-          .WithServiceName(mojom::kServiceName)
-          .WithDisplayName("Test IME Driver")
-          .ExposeCapability("ime:test_ime_driver", {})
-          .RequireCapability(ws::mojom::kServiceName, "ime_registrar")
-          .Build()};
-  return *manifest;
-}
-
-}  // namespace test_ime_driver
diff --git a/services/ws/ime/test_ime_driver/public/cpp/manifest.h b/services/ws/ime/test_ime_driver/public/cpp/manifest.h
deleted file mode 100644
index 8e45ef0..0000000
--- a/services/ws/ime/test_ime_driver/public/cpp/manifest.h
+++ /dev/null
@@ -1,16 +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 SERVICES_WS_IME_TEST_IME_DRIVER_PUBLIC_CPP_MANIFEST_H_
-#define SERVICES_WS_IME_TEST_IME_DRIVER_PUBLIC_CPP_MANIFEST_H_
-
-#include "services/service_manager/public/cpp/manifest.h"
-
-namespace test_ime_driver {
-
-const service_manager::Manifest& GetManifest();
-
-}  // namespace test_ime_driver
-
-#endif  // SERVICES_WS_IME_TEST_IME_DRIVER_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/ws/ime/test_ime_driver/public/mojom/BUILD.gn b/services/ws/ime/test_ime_driver/public/mojom/BUILD.gn
deleted file mode 100644
index 97d6cd4..0000000
--- a/services/ws/ime/test_ime_driver/public/mojom/BUILD.gn
+++ /dev/null
@@ -1,11 +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("//mojo/public/tools/bindings/mojom.gni")
-
-mojom("mojom") {
-  sources = [
-    "constants.mojom",
-  ]
-}
diff --git a/services/ws/ime/test_ime_driver/public/mojom/OWNERS b/services/ws/ime/test_ime_driver/public/mojom/OWNERS
deleted file mode 100644
index 08850f4..0000000
--- a/services/ws/ime/test_ime_driver/public/mojom/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/ime/test_ime_driver/public/mojom/constants.mojom b/services/ws/ime/test_ime_driver/public/mojom/constants.mojom
deleted file mode 100644
index f8d00062..0000000
--- a/services/ws/ime/test_ime_driver/public/mojom/constants.mojom
+++ /dev/null
@@ -1,7 +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.
-
-module test_ime_driver.mojom;
-
-const string kServiceName = "test_ime_driver";
diff --git a/services/ws/ime/test_ime_driver/test_ime_application.cc b/services/ws/ime/test_ime_driver/test_ime_application.cc
deleted file mode 100644
index 33067a0d..0000000
--- a/services/ws/ime/test_ime_driver/test_ime_application.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/ime/test_ime_driver/test_ime_application.h"
-
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "services/service_manager/public/cpp/connector.h"
-#include "services/ws/ime/test_ime_driver/test_ime_driver.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-
-namespace ws {
-namespace test {
-
-TestIMEApplication::TestIMEApplication(
-    service_manager::mojom::ServiceRequest request)
-    : service_binding_(this, std::move(request)) {}
-
-TestIMEApplication::~TestIMEApplication() = default;
-
-void TestIMEApplication::OnStart() {
-  mojom::IMEDriverPtr ime_driver_ptr;
-  mojo::MakeStrongBinding(std::make_unique<TestIMEDriver>(),
-                          MakeRequest(&ime_driver_ptr));
-
-  mojom::IMERegistrarPtr ime_registrar;
-  service_binding_.GetConnector()->BindInterface(mojom::kServiceName,
-                                                 &ime_registrar);
-  ime_registrar->RegisterDriver(std::move(ime_driver_ptr));
-}
-
-}  // namespace test
-}  // namespace ws
diff --git a/services/ws/ime/test_ime_driver/test_ime_application.h b/services/ws/ime/test_ime_driver/test_ime_application.h
deleted file mode 100644
index f61f041..0000000
--- a/services/ws/ime/test_ime_driver/test_ime_application.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_IME_TEST_IME_DRIVER_TEST_IME_APPLICATION_H_
-#define SERVICES_WS_IME_TEST_IME_DRIVER_TEST_IME_APPLICATION_H_
-
-#include "base/macros.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_binding.h"
-#include "services/service_manager/public/mojom/service.mojom.h"
-
-namespace ws {
-namespace test {
-
-class TestIMEApplication : public service_manager::Service {
- public:
-  explicit TestIMEApplication(service_manager::mojom::ServiceRequest request);
-  ~TestIMEApplication() override;
-
- private:
-  // service_manager::Service:
-  void OnStart() override;
-
-  service_manager::ServiceBinding service_binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestIMEApplication);
-};
-
-}  // namespace test
-}  // namespace ws
-
-#endif  // SERVICES_WS_IME_TEST_IME_DRIVER_TEST_IME_APPLICATION_H_
diff --git a/services/ws/ime/test_ime_driver/test_ime_driver.cc b/services/ws/ime/test_ime_driver/test_ime_driver.cc
deleted file mode 100644
index bc946a9..0000000
--- a/services/ws/ime/test_ime_driver/test_ime_driver.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/ime/test_ime_driver/test_ime_driver.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-
-namespace ws {
-namespace test {
-
-class TestInputMethod : public mojom::InputMethod {
- public:
-  explicit TestInputMethod(mojom::TextInputClientPtr client)
-      : client_(std::move(client)) {}
-  ~TestInputMethod() override = default;
-
- private:
-  // mojom::InputMethod:
-  void OnTextInputStateChanged(
-      ws::mojom::TextInputStatePtr text_input_state) override {
-    NOTIMPLEMENTED_LOG_ONCE();
-  }
-  void OnCaretBoundsChanged(const gfx::Rect& caret_bounds) override {
-    NOTIMPLEMENTED_LOG_ONCE();
-  }
-  void OnTextInputClientDataChanged(
-      ws::mojom::TextInputClientDataPtr data) override {
-    NOTIMPLEMENTED();
-  }
-  void ProcessKeyEvent(std::unique_ptr<ui::Event> key_event,
-                       ProcessKeyEventCallback callback) override {
-    DCHECK(key_event->IsKeyEvent());
-
-    std::unique_ptr<ui::Event> cloned_event = ui::Event::Clone(*key_event);
-
-    // Using base::Unretained is safe because |client_| is owned by this class.
-    client_->DispatchKeyEventPostIME(
-        std::move(key_event),
-        base::BindOnce(&TestInputMethod::PostProcessKeyEvent,
-                       base::Unretained(this), std::move(cloned_event),
-                       std::move(callback)));
-  }
-  void CancelComposition() override { NOTIMPLEMENTED_LOG_ONCE(); }
-  void ShowVirtualKeyboardIfEnabled() override { NOTIMPLEMENTED_LOG_ONCE(); }
-
-  void PostProcessKeyEvent(std::unique_ptr<ui::Event> key_event,
-                           ProcessKeyEventCallback callback,
-                           bool handled,
-                           bool stopped_propagation) {
-    // Ignore any events with modifiers set. This is useful for running things
-    // like ash_shell_with_content and having accelerators (such as control-n)
-    // work.
-    if (!stopped_propagation && key_event->type() == ui::ET_KEY_PRESSED &&
-        (key_event->flags() &
-         (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN)) == 0 &&
-        (key_event->AsKeyEvent()->is_char() ||
-         key_event->AsKeyEvent()->GetDomKey().IsCharacter())) {
-      client_->InsertChar(std::move(key_event));
-      std::move(callback).Run(true);
-    } else {
-      std::move(callback).Run(false);
-    }
-  }
-
-  mojom::TextInputClientPtr client_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestInputMethod);
-};
-
-TestIMEDriver::TestIMEDriver() {}
-
-TestIMEDriver::~TestIMEDriver() {}
-
-void TestIMEDriver::StartSession(mojom::InputMethodRequest input_method_request,
-                                 mojom::TextInputClientPtr client,
-                                 mojom::SessionDetailsPtr details) {
-  mojo::MakeStrongBinding(std::make_unique<TestInputMethod>(std::move(client)),
-                          std::move(input_method_request));
-}
-
-}  // namespace test
-}  // namespace ws
diff --git a/services/ws/ime/test_ime_driver/test_ime_driver.h b/services/ws/ime/test_ime_driver/test_ime_driver.h
deleted file mode 100644
index 90bf7d8a..0000000
--- a/services/ws/ime/test_ime_driver/test_ime_driver.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_IME_TEST_IME_DRIVER_TEST_IME_DRIVER_H_
-#define SERVICES_WS_IME_TEST_IME_DRIVER_TEST_IME_DRIVER_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-
-namespace ws {
-namespace test {
-
-class TestIMEDriver : public mojom::IMEDriver {
- public:
-  TestIMEDriver();
-  ~TestIMEDriver() override;
-
- private:
-  // mojom::IMEDriver:
-  void StartSession(mojom::InputMethodRequest input_method_request,
-                    mojom::TextInputClientPtr client,
-                    mojom::SessionDetailsPtr details) override;
-
-  DISALLOW_COPY_AND_ASSIGN(TestIMEDriver);
-};
-
-}  // namespace test
-}  // namespace ws
-
-#endif  // SERVICES_WS_IME_TEST_IME_DRIVER_TEST_IME_DRIVER_H_
diff --git a/services/ws/injected_event_handler.cc b/services/ws/injected_event_handler.cc
deleted file mode 100644
index 315e116..0000000
--- a/services/ws/injected_event_handler.cc
+++ /dev/null
@@ -1,156 +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.
-
-#include "services/ws/injected_event_handler.h"
-
-#include "base/memory/ptr_util.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_delegate.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_event_dispatcher.h"
-#include "ui/aura/window_tree_host.h"
-
-namespace ws {
-
-// RAII style class whose constructor adds a pre-target handler, and destructor
-// removes it.
-class InjectedEventHandler::ScopedPreTargetRegister {
- public:
-  ScopedPreTargetRegister(ui::EventTarget* target, ui::EventHandler* handler)
-      : target_(target), handler_(handler) {
-    target->AddPreTargetHandler(handler,
-                                ui::EventTarget::Priority::kAccessibility);
-  }
-
-  ~ScopedPreTargetRegister() { target_->RemovePreTargetHandler(handler_); }
-
- private:
-  ui::EventTarget* target_;
-  ui::EventHandler* handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedPreTargetRegister);
-};
-
-InjectedEventHandler::InjectedEventHandler(
-    WindowService* window_service,
-    aura::WindowTreeHost* window_tree_host)
-    : window_service_(window_service), window_tree_host_(window_tree_host) {
-  window_service_->AddObserver(this);
-  window_tree_host_->window()->AddObserver(this);
-  aura::Env::GetInstance()->AddWindowEventDispatcherObserver(this);
-}
-
-InjectedEventHandler::~InjectedEventHandler() {
-  RemoveObservers();
-}
-
-void InjectedEventHandler::Inject(std::unique_ptr<ui::Event> event,
-                                  ResultCallback result_callback) {
-  DCHECK(window_service_);  // Inject() can only be called once.
-  DCHECK(!result_callback_);
-  result_callback_ = std::move(result_callback);
-  DCHECK(result_callback_);
-
-  auto this_ref = weak_factory_.GetWeakPtr();
-  pre_target_register_ = std::make_unique<ScopedPreTargetRegister>(
-      window_service_->delegate()->GetGlobalEventTarget(), this);
-  auto result = window_tree_host_->SendEventToSink(event.get());
-  if (!this_ref)
-    return;
-  // |pre_target_register_| needs to be a member to ensure it's destroyed
-  // if |this| is destroyed.
-  pre_target_register_.reset();
-
-  if (result.event_discarded) {
-    DCHECK(!event_id_);
-    NotifyCallback();
-  }
-}
-
-void InjectedEventHandler::NotifyCallback() {
-  RemoveObservers();
-  std::move(result_callback_).Run();
-}
-
-void InjectedEventHandler::RemoveObservers() {
-  if (!window_service_)
-    return;
-
-  aura::Env::GetInstance()->RemoveWindowEventDispatcherObserver(this);
-  window_tree_host_->window()->RemoveObserver(this);
-  window_service_->RemoveObserver(this);
-  window_service_ = nullptr;
-}
-
-void InjectedEventHandler::OnWindowEventDispatcherFinishedProcessingEvent(
-    aura::WindowEventDispatcher* dispatcher) {
-  // Note that |dispatcher| might be different from the dispatcher in
-  // |window_tree_host_| because event capture allows handling events in a
-  // different dispatcher from the source. See also
-  // WindowServiceDelegateImplTest.MultiDisplayEventInjector test case.
-  if (!event_id_ && event_dispatched_) {
-    // The WindowEventDispatcher finished processing and the event was not sent
-    // to a remote client, notify the callback. This happens here rather than
-    // OnEvent() as during OnEvent() we don't yet know if the event is going to
-    // a remote client.
-    NotifyCallback();
-  }
-}
-
-void InjectedEventHandler::OnWindowEventDispatcherDispatchedHeldEvents(
-    aura::WindowEventDispatcher* dispatcher) {
-  if (!event_id_)
-    NotifyCallback();
-}
-
-void InjectedEventHandler::OnWindowEventDispatcherIgnoredEvent(
-    aura::WindowEventDispatcher* dispatcher) {
-  // The event turns out to be invalid, no event processing happens anymore.
-  // It's okay to notify the callback.
-  DCHECK(!event_id_);
-  if (dispatcher->host() == window_tree_host_)
-    NotifyCallback();
-}
-
-void InjectedEventHandler::OnWindowDestroying(aura::Window* window) {
-  // This is called when the WindowTreeHost has been destroyed. Assume we won't
-  // be getting an ack from the client.
-  NotifyCallback();
-}
-
-void InjectedEventHandler::OnWillSendEventToClient(ClientSpecificId client_id,
-                                                   uint32_t event_id,
-                                                   const ui::Event& event) {
-  if (event_id_)
-    return;  // Already waiting.
-
-  event_id_ = std::make_unique<EventId>();
-  event_id_->client_id = client_id;
-  event_id_->event_id = event_id;
-}
-
-void InjectedEventHandler::OnClientAckedEvent(ClientSpecificId client_id,
-                                              uint32_t event_id) {
-  if (event_id_ && event_id_->client_id == client_id &&
-      event_id_->event_id == event_id) {
-    NotifyCallback();
-  }
-}
-
-void InjectedEventHandler::OnWillDestroyClient(ClientSpecificId client_id) {
-  // If the client this is waiting on is being destroyed, an ack will never be
-  // received.
-  if (event_id_ && event_id_->client_id == client_id)
-    NotifyCallback();
-}
-
-void InjectedEventHandler::OnEvent(ui::Event* event) {
-  // This is called if the event is actually going to be delivered to a target
-  // (not held by WindowEventDispatcher). Don't call NotifyCallback() yet, as we
-  // don't yet know if the event is going to a remote client.
-  event_dispatched_ = true;
-}
-
-}  // namespace ws
diff --git a/services/ws/injected_event_handler.h b/services/ws/injected_event_handler.h
deleted file mode 100644
index 02f3b98..0000000
--- a/services/ws/injected_event_handler.h
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_INJECTED_EVENT_HANDLER_H_
-#define SERVICES_WS_INJECTED_EVENT_HANDLER_H_
-
-#include <memory>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "services/ws/window_service_observer.h"
-#include "ui/aura/window_event_dispatcher_observer.h"
-#include "ui/aura/window_observer.h"
-#include "ui/events/event_handler.h"
-
-namespace aura {
-class WindowTreeHost;
-}
-
-namespace ui {
-
-class Event;
-}
-
-namespace ws {
-
-class WindowService;
-
-// InjectedEventHandler is responsible for injecting a single event from a
-// remote client and notifying a callback when the client acks the event (or
-// it is determined the client will never ack the event).
-//
-// Implementation note: an event may be handled in any of the following
-// ways:
-// . It may be dispatched to a remote client. This is detected by way of
-//   OnWillSendEventToClient().
-// . It may be handled locally.
-// . It may be held and processed later on. This happens if pointer events are
-//   being held if WindowEventDispatcher. See
-//   WindowEventDispatcher::HoldPointerMoves() for details.
-// . It may be discarded by an EventRewriter.
-// For the case of the event being sent to a remote client this has to ensure
-// if the remote client, or WindowTreeHost is destroyed, then no ack is
-// received.
-//
-// Exported for tests.
-class COMPONENT_EXPORT(WINDOW_SERVICE) InjectedEventHandler
-    : public aura::WindowEventDispatcherObserver,
-      public WindowServiceObserver,
-      public aura::WindowObserver,
-      public ui::EventHandler {
- public:
-  using ResultCallback = base::OnceClosure;
-
-  InjectedEventHandler(WindowService* window_service,
-                       aura::WindowTreeHost* window_tree_host);
-  ~InjectedEventHandler() override;
-
-  // Injects the event. This should be called only once. This synchronously
-  // dispatches the event. If the event is completely processed synchronously,
-  // then |result_callback| is run immediately. Otherwise |result_callback| is
-  // run when the client acks the event, or it's known that the client will
-  // never ack event event. If the InjectedEventHandler is destroyed before the
-  // ack, then |result_callback| is never run.
-  void Inject(std::unique_ptr<ui::Event> event, ResultCallback result_callback);
-
- private:
-  class ScopedPreTargetRegister;
-
-  // Tracks the client and identifier for an event that this object is waiting
-  // on.
-  struct EventId {
-    // Uniquely identifies the client.
-    ClientSpecificId client_id = 0u;
-
-    // Assigned by the WindowTree whose id matches |client_id| for the event.
-    uint32_t event_id = 0u;
-  };
-
-  // Called when the event has been acked, or it's known an event will never be
-  // received.
-  void NotifyCallback();
-
-  // Removes the observers installed in the constructor. This is called when
-  // its known this object no longer is waiting for the event to be acked.
-  void RemoveObservers();
-
-  // aura::WindowEventDispatcherObserver:
-  void OnWindowEventDispatcherFinishedProcessingEvent(
-      aura::WindowEventDispatcher* dispatcher) override;
-  void OnWindowEventDispatcherDispatchedHeldEvents(
-      aura::WindowEventDispatcher* dispatcher) override;
-  void OnWindowEventDispatcherIgnoredEvent(
-      aura::WindowEventDispatcher* dispatcher) override;
-
-  // aura::WindowObserver:
-  void OnWindowDestroying(aura::Window* window) override;
-
-  // WindowServiceObserver:
-  void OnWillSendEventToClient(ClientSpecificId client_id,
-                               uint32_t event_id,
-                               const ui::Event& event) override;
-  void OnClientAckedEvent(ClientSpecificId client_id,
-                          uint32_t event_id) override;
-  void OnWillDestroyClient(ClientSpecificId client_id) override;
-
-  // EventHandler:
-  void OnEvent(ui::Event* event) override;
-
-  WindowService* window_service_;
-  aura::WindowTreeHost* window_tree_host_;
-  ResultCallback result_callback_;
-
-  // Non-null if waiting on an ack from a client.
-  std::unique_ptr<EventId> event_id_;
-
-  bool event_dispatched_ = false;
-
-  std::unique_ptr<ScopedPreTargetRegister> pre_target_register_;
-
-  base::WeakPtrFactory<InjectedEventHandler> weak_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(InjectedEventHandler);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_INJECTED_EVENT_HANDLER_H_
diff --git a/services/ws/injected_event_handler_unittest.cc b/services/ws/injected_event_handler_unittest.cc
deleted file mode 100644
index d92ca2e..0000000
--- a/services/ws/injected_event_handler_unittest.cc
+++ /dev/null
@@ -1,200 +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.
-
-#include "services/ws/injected_event_handler.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "services/service_manager/public/cpp/connector.h"
-#include "services/service_manager/public/cpp/test/test_connector_factory.h"
-#include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/test/window_event_dispatcher_test_api.h"
-#include "ui/aura/window.h"
-#include "ui/events/event.h"
-#include "ui/events/event_rewriter.h"
-#include "ui/events/keycodes/dom/dom_code.h"
-#include "ui/platform_window/platform_window_init_properties.h"
-
-namespace ws {
-
-TEST(InjectedEventHandlerTest, SyncDispatch) {
-  WindowServiceTestSetup test_setup;
-
-  bool was_callback_run = false;
-  InjectedEventHandler injected_event_handler(test_setup.service(),
-                                              test_setup.root()->GetHost());
-
-  // Inject the event, the callback should be run immediately as the location is
-  // not over a client's window.
-  std::unique_ptr<ui::Event> event = std::make_unique<ui::MouseEvent>(
-      ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), base::TimeTicks::Now(),
-      /* flags */ 0, /*changed_button_flags*/ 0);
-  injected_event_handler.Inject(
-      std::move(event),
-      base::BindOnce([](bool* foo) { *foo = true; }, &was_callback_run));
-  EXPECT_TRUE(was_callback_run);
-}
-
-TEST(InjectedEventHandlerTest, OverRemoteWindow) {
-  WindowServiceTestSetup test_setup;
-  aura::Window* top_level =
-      test_setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  top_level->Show();
-
-  bool was_callback_run = false;
-  InjectedEventHandler injected_event_handler(test_setup.service(),
-                                              test_setup.root()->GetHost());
-
-  // Inject the event, the callback should not be run immediately as the
-  // location is over a client's window.
-  std::unique_ptr<ui::Event> event = std::make_unique<ui::MouseEvent>(
-      ui::ET_MOUSE_PRESSED, gfx::Point(10, 10), gfx::Point(10, 10),
-      base::TimeTicks::Now(),
-      /* flags */ 0, /*changed_button_flags*/ 0);
-  injected_event_handler.Inject(
-      std::move(event), base::BindOnce([](bool* was_run) { *was_run = true; },
-                                       &was_callback_run));
-  EXPECT_FALSE(was_callback_run);
-
-  // Ack the event, which should trigger running the callback.
-  test_setup.window_tree_client()->AckFirstEvent(test_setup.window_tree(),
-                                                 mojom::EventResult::HANDLED);
-  EXPECT_TRUE(was_callback_run);
-}
-
-TEST(InjectedEventHandlerTest, WindowTreeHostDeletedWhileWaiting) {
-  WindowServiceTestSetup test_setup;
-
-  // Create a new WindowTreeHost.
-  std::unique_ptr<aura::WindowTreeHost> second_host =
-      aura::WindowTreeHost::Create(
-          ui::PlatformWindowInitProperties{gfx::Rect(20, 30, 100, 50)});
-  second_host->InitHost();
-  second_host->window()->Show();
-
-  // Create a top-level in |second_host|.
-  test_setup.delegate()->set_top_level_parent(second_host->window());
-  aura::Window* top_level =
-      test_setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  top_level->Show();
-
-  // Send an event to the top-level.
-  bool was_callback_run = false;
-  InjectedEventHandler injected_event_handler(test_setup.service(),
-                                              second_host.get());
-
-  // Inject the event, the callback should not be run immediately as the
-  // location is over a client's window.
-  std::unique_ptr<ui::Event> event = std::make_unique<ui::MouseEvent>(
-      ui::ET_MOUSE_PRESSED, gfx::Point(10, 10), gfx::Point(10, 10),
-      base::TimeTicks::Now(),
-      /* flags */ 0, /*changed_button_flags*/ 0);
-  injected_event_handler.Inject(
-      std::move(event), base::BindOnce([](bool* was_run) { *was_run = true; },
-                                       &was_callback_run));
-  EXPECT_FALSE(was_callback_run);
-
-  // Deleting the host should trigger notifying running the callback.
-  second_host.reset();
-  EXPECT_TRUE(was_callback_run);
-}
-
-TEST(InjectedEventHandlerTest, HeldEvent) {
-  WindowServiceTestSetup test_setup;
-  aura::Window* top_level =
-      test_setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  top_level->Show();
-
-  bool was_callback_run = false;
-  InjectedEventHandler injected_event_handler(test_setup.service(),
-                                              test_setup.root()->GetHost());
-
-  test_setup.root()->GetHost()->dispatcher()->HoldPointerMoves();
-
-  // Inject the event, the callback should not be run immediately as moves are
-  // being held (ET_MOUSE_DRAGGED triggers the event holding logic in
-  // WindowEventDispatcher).
-  std::unique_ptr<ui::Event> event = std::make_unique<ui::MouseEvent>(
-      ui::ET_MOUSE_DRAGGED, gfx::Point(10, 10), gfx::Point(10, 10),
-      base::TimeTicks::Now(),
-      /* flags */ 0, /*changed_button_flags*/ 0);
-  injected_event_handler.Inject(
-      std::move(event), base::BindOnce([](bool* was_run) { *was_run = true; },
-                                       &was_callback_run));
-  EXPECT_FALSE(was_callback_run);
-
-  // Releasing the move should run the callback.
-  test_setup.root()->GetHost()->dispatcher()->ReleasePointerMoves();
-  aura::test::WindowEventDispatcherTestApi(
-      test_setup.root()->GetHost()->dispatcher())
-      .WaitUntilPointerMovesDispatched();
-  EXPECT_TRUE(was_callback_run);
-}
-
-class DiscardingEventRewriter : public ui::EventRewriter {
- public:
-  DiscardingEventRewriter() = default;
-  ~DiscardingEventRewriter() override = default;
-
-  bool got_rewrite_event() const { return got_rewrite_event_; }
-
-  // ui::EventRewriter:
-  ui::EventDispatchDetails RewriteEvent(
-      const ui::Event& event,
-      const Continuation continuation) override {
-    got_rewrite_event_ = true;
-    return DiscardEvent(continuation);
-  }
-
- private:
-  bool got_rewrite_event_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(DiscardingEventRewriter);
-};
-
-TEST(InjectedEventHandlerTest, RewriterDiscards) {
-  // Create a single window and give it focus.
-  DiscardingEventRewriter rewriter;
-  WindowServiceTestSetup test_setup;
-  test_setup.aura_test_helper()->root_window()->GetHost()->AddEventRewriter(
-      &rewriter);
-  aura::Window* top_level =
-      test_setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  top_level->Show();
-  top_level->Focus();
-  EXPECT_TRUE(top_level->HasFocus());
-
-  // Dispatch an event. Because the rewriter discards the event, the callback
-  // should be run immediately.
-  bool was_callback_run = false;
-  InjectedEventHandler injected_event_handler(test_setup.service(),
-                                              test_setup.root()->GetHost());
-
-  ui::KeyEvent char_event('A', ui::VKEY_A, ui::DomCode::NONE, 0);
-  injected_event_handler.Inject(
-      ui::Event::Clone(char_event),
-      base::BindOnce([](bool* was_run) { *was_run = true; },
-                     &was_callback_run));
-  EXPECT_TRUE(was_callback_run);
-  EXPECT_TRUE(rewriter.got_rewrite_event());
-}
-
-}  // namespace ws
diff --git a/services/ws/proxy_window.cc b/services/ws/proxy_window.cc
deleted file mode 100644
index 45b3f8c..0000000
--- a/services/ws/proxy_window.cc
+++ /dev/null
@@ -1,602 +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.
-
-#include "services/ws/proxy_window.h"
-
-#include <utility>
-
-#include "base/containers/flat_map.h"
-#include "components/viz/host/host_frame_sink_manager.h"
-#include "services/ws/client_root.h"
-#include "services/ws/drag_drop_delegate.h"
-#include "services/ws/embedding.h"
-#include "services/ws/top_level_proxy_window_impl.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_utils.h"
-#include "ui/aura/client/capture_client_observer.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_observer.h"
-#include "ui/aura/window_targeter.h"
-#include "ui/compositor/compositor.h"
-#include "ui/events/event_handler.h"
-#include "ui/wm/core/capture_controller.h"
-#include "ui/wm/core/window_modality_controller.h"
-
-DEFINE_UI_CLASS_PROPERTY_TYPE(ws::ProxyWindow*)
-
-namespace ws {
-namespace {
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(ProxyWindow, kProxyWindowKey, nullptr)
-
-bool IsPointerPressedEvent(const ui::Event& event) {
-  return event.type() == ui::ET_MOUSE_PRESSED ||
-         event.type() == ui::ET_TOUCH_PRESSED;
-}
-
-bool IsPointerEvent(const ui::Event& event) {
-  return event.IsMouseEvent() || event.IsTouchEvent();
-}
-
-bool IsLastMouseButtonRelease(const ui::Event& event) {
-  return event.type() == ui::ET_MOUSE_RELEASED &&
-         event.AsMouseEvent()->button_flags() ==
-             event.AsMouseEvent()->changed_button_flags();
-}
-
-bool IsPointerReleased(const ui::Event& event) {
-  return IsLastMouseButtonRelease(event) ||
-         event.type() == ui::ET_TOUCH_RELEASED;
-}
-
-ui::PointerId GetPointerId(const ui::Event& event) {
-  if (event.IsMouseEvent())
-    return ui::MouseEvent::kMousePointerId;
-  DCHECK(event.IsTouchEvent());
-  return event.AsTouchEvent()->pointer_details().id;
-}
-
-// ProxyWindowEventHandler is used to forward events to the client.
-// ProxyWindowEventHandler adds itself to the pre-phase to ensure it's
-// considered before the Window's delegate (or other EventHandlers).
-class ProxyWindowEventHandler : public ui::EventHandler {
- public:
-  explicit ProxyWindowEventHandler(ProxyWindow* proxy_window)
-      : proxy_window_(proxy_window) {
-    // Use |kDefault| so as not to conflict with other important pre-target
-    // handlers (such as laser pointer).
-    window()->AddPreTargetHandler(this, ui::EventTarget::Priority::kDefault);
-  }
-  ~ProxyWindowEventHandler() override {
-    window()->RemovePreTargetHandler(this);
-  }
-
-  ProxyWindow* proxy_window() { return proxy_window_; }
-  aura::Window* window() { return proxy_window_->window(); }
-
-  // ui::EventHandler:
-  void OnEvent(ui::Event* event) override {
-    if (event->phase() != ui::EP_PRETARGET) {
-      // All work is done in the pre-phase. If this branch is hit, it means
-      // event propagation was not stopped, and normal processing should
-      // continue. Early out to avoid sending the event to the client again.
-      return;
-    }
-
-    if (HandleInterceptedEvent(event) || ShouldIgnoreEvent(*event))
-      return;
-
-    auto* owning = proxy_window_->owning_window_tree();
-    auto* embedded = proxy_window_->embedded_window_tree();
-    WindowTree* target_client = nullptr;
-    if (proxy_window_->DoesOwnerInterceptEvents()) {
-      // A client that intercepts events, always gets the event regardless of
-      // focus/capture.
-      target_client = owning;
-    } else if (event->IsKeyEvent()) {
-      if (!proxy_window_->focus_owner())
-        return;  // The local environment is going to process the event.
-      target_client = proxy_window_->focus_owner();
-    } else if (proxy_window()->capture_owner()) {
-      target_client = proxy_window()->capture_owner();
-    } else {
-      // Prefer embedded over owner.
-      target_client = !embedded ? owning : embedded;
-    }
-    DCHECK(target_client);
-
-    // Don't send located events to the client during a move loop. Normally
-    // the client shouldn't be the target at this point, but it's entirely
-    // possible for held events to be released, triggering a spurious call.
-    if (event->IsLocatedEvent() && target_client->IsMovingWindow())
-      return;
-
-    target_client->SendEventToClient(window(), *event);
-
-    // The event was forwarded to the remote client. We don't want it handled
-    // locally too.
-    if (event->cancelable())
-      event->StopPropagation();
-  }
-
- protected:
-  // Returns true if the event is a pinch event generated from the touchpad.
-  bool IsPinchEventOnTouchpad(const ui::Event& event) {
-    return event.IsPinchEvent() &&
-           event.AsGestureEvent()->details().device_type() ==
-               ui::GestureDeviceType::DEVICE_TOUCHPAD;
-  }
-
-  // Returns true if the event should be ignored (not forwarded to the client).
-  bool ShouldIgnoreEvent(const ui::Event& event) {
-    // It's assumed clients do their own gesture recognizition, which means
-    // GestureEvents should not be forwarded to clients. Pinch events are
-    // exceptional since they aren't created through gesture recognition but
-    // from the touchpad directly. See https://crbug.com/933985.
-    if (event.IsGestureEvent() && !IsPinchEventOnTouchpad(event))
-      return true;
-
-    if (static_cast<aura::Window*>(event.target()) != window()) {
-      // As ProxyWindow is a EP_PRETARGET EventHandler it gets events *before*
-      // descendants. Ignore all such events, and only process when
-      // window() is the the target.
-      return true;
-    }
-    if (wm::GetModalTransient(window()))
-      return true;  // Do not send events to clients blocked by a modal window.
-    return ShouldIgnoreEventType(event.type());
-  }
-
-  bool ShouldIgnoreEventType(ui::EventType type) const {
-    // WindowTreeClient takes care of sending ET_MOUSE_CAPTURE_CHANGED at the
-    // right point. The enter events are effectively synthetic, and indirectly
-    // generated in the client as the result of a move event.
-    switch (type) {
-      case ui::ET_MOUSE_CAPTURE_CHANGED:
-      case ui::ET_MOUSE_ENTERED:
-        return true;
-      default:
-        break;
-    }
-    return false;
-  }
-
-  // If |window| identifies an embedding and the owning client intercepts
-  // events, this forwards to the owner and returns true. Otherwise returns
-  // false.
-  bool HandleInterceptedEvent(ui::Event* event) {
-    if (ShouldIgnoreEventType(event->type()))
-      return false;
-
-    // KeyEvents, and events when there is capture, do not go through through
-    // ProxyWindowTargeter. As a result ProxyWindowEventHandler has to check
-    // for a client intercepting events.
-    if (proxy_window_->DoesOwnerInterceptEvents()) {
-      proxy_window_->owning_window_tree()->SendEventToClient(window(), *event);
-      if (event->cancelable())
-        event->StopPropagation();
-      return true;
-    }
-    return false;
-  }
-
- private:
-  ProxyWindow* const proxy_window_;
-
-  DISALLOW_COPY_AND_ASSIGN(ProxyWindowEventHandler);
-};
-
-class TopLevelEventHandler;
-
-// PointerPressHandler is used to track state while a pointer is down.
-// PointerPressHandler is typically destroyed when the pointer is released, but
-// it may be destroyed at other times, such as when capture changes.
-class PointerPressHandler : public aura::client::CaptureClientObserver,
-                            public aura::WindowObserver {
- public:
-  PointerPressHandler(TopLevelEventHandler* top_level_event_handler,
-                      ui::PointerId pointer_id,
-                      const gfx::Point& location);
-  ~PointerPressHandler() override;
-
-  bool in_non_client_area() const { return in_non_client_area_; }
-
- private:
-  // aura::client::CaptureClientObserver:
-  void OnCaptureChanged(aura::Window* lost_capture,
-                        aura::Window* gained_capture) override;
-
-  // aura::WindowObserver:
-  void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
-
-  TopLevelEventHandler* top_level_event_handler_;
-
-  // True if the pointer down occurred in the non-client area.
-  const bool in_non_client_area_;
-
-  // Id of the pointer the handler was created for.
-  const ui::PointerId pointer_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(PointerPressHandler);
-};
-
-// ui::EventHandler used for top-levels. Some events that target the non-client
-// area are not sent to the client, instead are handled locally. For example,
-// if a press occurs in the non-client area, then the event is not sent to
-// the client, it's handled locally.
-class TopLevelEventHandler : public ProxyWindowEventHandler {
- public:
-  explicit TopLevelEventHandler(ProxyWindow* proxy_window)
-      : ProxyWindowEventHandler(proxy_window) {
-    // Top-levels should always have an owning_window_tree().
-    // OnEvent() assumes this.
-    DCHECK(proxy_window->owning_window_tree());
-  }
-
-  ~TopLevelEventHandler() override = default;
-
-  void DestroyPointerPressHandler(ui::PointerId id) {
-    pointer_press_handlers_.erase(id);
-  }
-
-  // Returns true if the pointer with |pointer_id| was pressed over the
-  // top-level. If this returns true, TopLevelEventHandler is waiting on a
-  // release to reset state.
-  bool IsHandlingPointerPress(ui::PointerId pointer_id) const {
-    return pointer_press_handlers_.count(pointer_id) > 0;
-  }
-
-  // Called when the capture owner changes.
-  void OnCaptureOwnerChanged() {
-    // Changing the capture owner toggles between local and the client getting
-    // the event. The |pointer_press_handlers_| are no longer applicable
-    // (because the target is purely dicatated by capture owner).
-    pointer_press_handlers_.clear();
-  }
-
-  // ProxyWindowEventHandler:
-  void OnEvent(ui::Event* event) override {
-    if (event->phase() != ui::EP_PRETARGET) {
-      // All work is done in the pre-phase. If this branch is hit, it means
-      // event propagation was not stopped, and normal processing should
-      // continue. Early out to avoid sending the event to the client again.
-      return;
-    }
-
-    if (HandleInterceptedEvent(event))
-      return;
-
-    if (!event->IsLocatedEvent()) {
-      ProxyWindowEventHandler::OnEvent(event);
-      return;
-    }
-
-    // When the gesture-end happens in the server side, the gesture state
-    // is cleaned up there; this state should be synchronized with the client.
-    if (event->type() == ui::ET_GESTURE_END &&
-        event->AsGestureEvent()->details().touch_points() == 1) {
-      proxy_window()->owning_window_tree()->CleanupGestureState(window());
-      return;
-    }
-
-    if (ShouldIgnoreEvent(*event))
-      return;
-
-    // If there is capture, send the event to the client that owns it. A null
-    // capture owner means the local environment should handle the event.
-    if (wm::CaptureController::Get()->GetCaptureWindow()) {
-      if (proxy_window()->capture_owner()) {
-        proxy_window()->capture_owner()->SendEventToClient(window(), *event);
-        if (event->cancelable())
-          event->StopPropagation();
-        return;
-      }
-      return;
-    }
-
-    // This code has two specific behaviors. It's used to ensure events go to
-    // the right target (either local, or the remote client).
-    // . a press-release sequence targets only one. If in non-client area then
-    //   local, otherwise remote client.
-    // . mouse-moves (not drags) go to both targets.
-    bool stop_propagation = false;
-    if (proxy_window()->HasNonClientArea() && IsPointerEvent(*event)) {
-      const ui::PointerId pointer_id = GetPointerId(*event);
-      if (!pointer_press_handlers_.count(pointer_id)) {
-        if (IsPointerPressedEvent(*event)) {
-          std::unique_ptr<PointerPressHandler> handler_ptr =
-              std::make_unique<PointerPressHandler>(
-                  this, pointer_id, event->AsLocatedEvent()->location());
-          PointerPressHandler* handler = handler_ptr.get();
-          pointer_press_handlers_[pointer_id] = std::move(handler_ptr);
-          if (handler->in_non_client_area())
-            return;  // Don't send presses in non-client area to client.
-          stop_propagation = true;
-        }
-      } else {
-        // Currently handling a pointer press and waiting on release.
-        PointerPressHandler* handler =
-            pointer_press_handlers_[pointer_id].get();
-        const bool was_press_in_non_client_area = handler->in_non_client_area();
-        if (IsPointerReleased(*event))
-          pointer_press_handlers_.erase(pointer_id);
-        if (was_press_in_non_client_area)
-          return;  // Don't send release to client since press didn't go there.
-        stop_propagation = true;
-      }
-    }
-    proxy_window()->owning_window_tree()->SendEventToClient(window(), *event);
-    if (stop_propagation && event->cancelable())
-      event->StopPropagation();
-  }
-
- private:
-  // Non-null while in a pointer press press-drag-release cycle. Maps from
-  // pointer-id of the pointer that is down to the handler.
-  base::flat_map<ui::PointerId, std::unique_ptr<PointerPressHandler>>
-      pointer_press_handlers_;
-
-  DISALLOW_COPY_AND_ASSIGN(TopLevelEventHandler);
-};
-
-PointerPressHandler::PointerPressHandler(
-    TopLevelEventHandler* top_level_event_handler,
-    ui::PointerId pointer_id,
-    const gfx::Point& location)
-    : top_level_event_handler_(top_level_event_handler),
-      in_non_client_area_(
-          IsLocationInNonClientArea(top_level_event_handler->window(),
-                                    location)),
-      pointer_id_(pointer_id) {
-  wm::CaptureController::Get()->AddObserver(this);
-  top_level_event_handler_->window()->AddObserver(this);
-}
-
-PointerPressHandler::~PointerPressHandler() {
-  top_level_event_handler_->window()->RemoveObserver(this);
-  wm::CaptureController::Get()->RemoveObserver(this);
-}
-
-void PointerPressHandler::OnCaptureChanged(aura::Window* lost_capture,
-                                           aura::Window* gained_capture) {
-  if (gained_capture != top_level_event_handler_->window())
-    top_level_event_handler_->DestroyPointerPressHandler(pointer_id_);
-}
-
-void PointerPressHandler::OnWindowVisibilityChanged(aura::Window* window,
-                                                    bool visible) {
-  if (!top_level_event_handler_->window()->IsVisible())
-    top_level_event_handler_->DestroyPointerPressHandler(pointer_id_);
-}
-
-}  // namespace
-
-// WindowTargeter used for ProxyWindows. This is used for three purposes:
-// . If the location is in the non-client area, then child Windows are not
-//   considered. This is done to ensure the delegate of the window (which is
-//   local) sees the event.
-// . To ensure |WindowTree::intercepts_events_| is honored.
-// . To support custom shaped windows through SetShape().
-class ProxyWindow::ProxyWindowTargeter : public aura::WindowTargeter {
- public:
-  explicit ProxyWindowTargeter(ProxyWindow* proxy_window)
-      : proxy_window_(proxy_window) {}
-  ~ProxyWindowTargeter() override = default;
-
-  void SetShape(const std::vector<gfx::Rect>& shape) { shape_ = shape; }
-
-  // aura::WindowTargeter:
-  bool SubtreeShouldBeExploredForEvent(aura::Window* window,
-                                       const ui::LocatedEvent& event) override {
-    // It's okay to check only when the window is the proxy_window. Any
-    // descendants should pass this condition once it passes with proxy_window.
-    if (window == proxy_window_->window() && !IsLocationInShape(event))
-      return false;
-
-    // If the top-level does not have insets, then forward the call to the
-    // parent's WindowTargeter. This is necessary for targeters such as
-    // EasyResizeWindowTargeter to work correctly.
-    if (mouse_extend().IsEmpty() && touch_extend().IsEmpty() &&
-        proxy_window_->IsTopLevel() && window->parent()) {
-      aura::WindowTargeter* parent_targeter =
-          static_cast<WindowTargeter*>(window->parent()->targeter());
-      if (parent_targeter)
-        return parent_targeter->SubtreeShouldBeExploredForEvent(window, event);
-    }
-    return aura::WindowTargeter::SubtreeShouldBeExploredForEvent(window, event);
-  }
-
-  ui::EventTarget* FindTargetForEvent(ui::EventTarget* event_target,
-                                      ui::Event* event) override {
-    aura::Window* window = static_cast<aura::Window*>(event_target);
-    DCHECK_EQ(window, proxy_window_->window());
-    if (proxy_window_->DoesOwnerInterceptEvents()) {
-      // If the owner intercepts events, then don't recurse (otherwise events
-      // would go to a descendant).
-      return event_target->CanAcceptEvent(*event) ? window : nullptr;
-    }
-
-    // Ensure events in the non-client area target the top-level window.
-    // TopLevelEventHandler will ensure these are routed correctly.
-    if (event->IsLocatedEvent() &&
-        IsLocationInNonClientArea(window,
-                                  event->AsLocatedEvent()->location())) {
-      return window;
-    }
-    return aura::WindowTargeter::FindTargetForEvent(event_target, event);
-  }
-
- private:
-  bool IsLocationInShape(const ui::LocatedEvent& event) {
-    // If |shape_| is empty, the handling of custom shapes are not used. Always
-    // return true.
-    if (shape_.empty())
-      return true;
-
-    gfx::Point location = event.root_location();
-    aura::Window::ConvertPointToTarget(proxy_window_->window()->GetRootWindow(),
-                                       proxy_window_->window(), &location);
-    for (const auto& rect : shape_) {
-      if (rect.Contains(location))
-        return true;
-    }
-    return false;
-  }
-
-  ProxyWindow* const proxy_window_;
-  std::vector<gfx::Rect> shape_;
-
-  DISALLOW_COPY_AND_ASSIGN(ProxyWindowTargeter);
-};
-
-ProxyWindow::~ProxyWindow() {
-  // WindowTree/ClientRoot should have reset |attached_frame_sink_id_| before
-  // the Window is destroyed.
-  DCHECK(!attached_frame_sink_id_.is_valid());
-}
-
-// static
-ProxyWindow* ProxyWindow::Create(aura::Window* window,
-                                 WindowTree* tree,
-                                 const viz::FrameSinkId& frame_sink_id,
-                                 bool is_top_level) {
-  DCHECK(!GetMayBeNull(window));
-  // Owned by |window|.
-  ProxyWindow* proxy_window =
-      new ProxyWindow(window, tree, frame_sink_id, is_top_level);
-  return proxy_window;
-}
-
-// static
-const ProxyWindow* ProxyWindow::GetMayBeNull(const aura::Window* window) {
-  return window ? window->GetProperty(kProxyWindowKey) : nullptr;
-}
-
-void ProxyWindow::Destroy() {
-  // This should only be called for windows created locally for an embedding
-  // (not created by a remote client). Such windows do not have an owner.
-  DCHECK(!owning_window_tree_);
-  // static_cast is needed to determine which function SetProperty() applies
-  // to.
-  window_->SetProperty(kProxyWindowKey, static_cast<ProxyWindow*>(nullptr));
-}
-
-WindowTree* ProxyWindow::embedded_window_tree() {
-  return embedding_ ? embedding_->embedded_tree() : nullptr;
-}
-
-const WindowTree* ProxyWindow::embedded_window_tree() const {
-  return embedding_ ? embedding_->embedded_tree() : nullptr;
-}
-
-void ProxyWindow::SetClientArea(
-    const gfx::Insets& insets,
-    const std::vector<gfx::Rect>& additional_client_areas) {
-  if (client_area_ == insets &&
-      additional_client_areas == additional_client_areas_) {
-    return;
-  }
-
-  additional_client_areas_ = additional_client_areas;
-  client_area_ = insets;
-}
-
-void ProxyWindow::SetHitTestInsets(const gfx::Insets& mouse,
-                                   const gfx::Insets& touch) {
-  window_targeter_->SetInsets(mouse, touch);
-}
-
-void ProxyWindow::SetShape(const std::vector<gfx::Rect>& shape) {
-  window_targeter_->SetShape(shape);
-}
-
-void ProxyWindow::SetCaptureOwner(WindowTree* owner) {
-  capture_owner_ = owner;
-  if (!IsTopLevel())
-    return;
-
-  static_cast<TopLevelEventHandler*>(event_handler_.get())
-      ->OnCaptureOwnerChanged();
-}
-
-void ProxyWindow::StoreCursor(const ui::Cursor& cursor) {
-  cursor_ = cursor;
-}
-
-bool ProxyWindow::DoesOwnerInterceptEvents() const {
-  return embedding_ && embedding_->embedding_tree_intercepts_events();
-}
-
-void ProxyWindow::SetEmbedding(std::unique_ptr<Embedding> embedding) {
-  embedding_ = std::move(embedding);
-}
-
-bool ProxyWindow::HasNonClientArea() const {
-  return owning_window_tree_ && owning_window_tree_->IsTopLevel(window_) &&
-         (!client_area_.IsEmpty() || !additional_client_areas_.empty());
-}
-
-bool ProxyWindow::IsTopLevel() const {
-  return owning_window_tree_ && owning_window_tree_->IsTopLevel(window_);
-}
-
-void ProxyWindow::AttachCompositorFrameSink(
-    viz::mojom::CompositorFrameSinkRequest compositor_frame_sink,
-    viz::mojom::CompositorFrameSinkClientPtr client) {
-  attached_compositor_frame_sink_ = true;
-  viz::HostFrameSinkManager* host_frame_sink_manager =
-      aura::Env::GetInstance()
-          ->context_factory_private()
-          ->GetHostFrameSinkManager();
-  host_frame_sink_manager->CreateCompositorFrameSink(
-      frame_sink_id_, std::move(compositor_frame_sink), std::move(client));
-}
-
-void ProxyWindow::SetDragDropDelegate(
-    std::unique_ptr<DragDropDelegate> drag_drop_delegate) {
-  drag_drop_delegate_ = std::move(drag_drop_delegate);
-}
-
-void ProxyWindow::SetTopLevelProxyWindow(
-    std::unique_ptr<TopLevelProxyWindowImpl> window) {
-  top_level_proxy_window_ = std::move(window);
-}
-
-std::string ProxyWindow::GetIdForDebugging() {
-  return owning_window_tree_
-             ? owning_window_tree_->ClientWindowIdForWindow(window_).ToString()
-             : frame_sink_id_.ToString();
-}
-
-ProxyWindow::ProxyWindow(aura::Window* window,
-                         WindowTree* tree,
-                         const viz::FrameSinkId& frame_sink_id,
-                         bool is_top_level)
-    : window_(window),
-      owning_window_tree_(tree),
-      frame_sink_id_(frame_sink_id) {
-  window_->SetProperty(kProxyWindowKey, this);
-  if (is_top_level)
-    event_handler_ = std::make_unique<TopLevelEventHandler>(this);
-  else
-    event_handler_ = std::make_unique<ProxyWindowEventHandler>(this);
-  auto proxy_window_targeter = std::make_unique<ProxyWindowTargeter>(this);
-  window_targeter_ = proxy_window_targeter.get();
-  window_->SetEventTargeter(std::move(proxy_window_targeter));
-  // In order for a window to receive events it must have a target_handler()
-  // (see Window::CanAcceptEvent()). Normally the delegate is the TargetHandler,
-  // but if the delegate is null, then so is the target_handler(). Set
-  // |event_handler_| as the target_handler() to force the Window to accept
-  // events.
-  if (!window_->delegate())
-    window_->SetTargetHandler(event_handler_.get());
-}
-
-bool ProxyWindow::IsHandlingPointerPressForTesting(ui::PointerId pointer_id) {
-  DCHECK(IsTopLevel());
-  return static_cast<TopLevelEventHandler*>(event_handler_.get())
-      ->IsHandlingPointerPress(pointer_id);
-}
-
-}  // namespace ws
diff --git a/services/ws/proxy_window.h b/services/ws/proxy_window.h
deleted file mode 100644
index 4fcfc40..0000000
--- a/services/ws/proxy_window.h
+++ /dev/null
@@ -1,230 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_PROXY_WINDOW_H_
-#define SERVICES_WS_PROXY_WINDOW_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "base/optional.h"
-#include "components/viz/common/surfaces/frame_sink_id.h"
-#include "components/viz/common/surfaces/local_surface_id_allocation.h"
-#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
-#include "services/ws/ids.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/events/event.h"
-#include "ui/gfx/geometry/insets.h"
-#include "ui/gfx/geometry/rect.h"
-
-namespace aura {
-class Window;
-}  // namespace aura
-
-namespace ui {
-class EventHandler;
-}
-
-namespace ws {
-
-class DragDropDelegate;
-class Embedding;
-class TopLevelProxyWindowImpl;
-class WindowTree;
-
-// Tracks any state associated with an aura::Window for the WindowService.
-// ProxyWindow is created for every window created at the request of a client,
-// including the root window of ClientRoots.
-class COMPONENT_EXPORT(WINDOW_SERVICE) ProxyWindow {
- public:
-  ~ProxyWindow();
-
-  // Creates a new ProxyWindow. The lifetime of the ProxyWindow is tied to
-  // that of the Window (the Window ends up owning the ProxyWindow).
-  // |is_top_level| is true if the window represents a top-level window.
-  static ProxyWindow* Create(aura::Window* window,
-                             WindowTree* tree,
-                             const viz::FrameSinkId& frame_sink_id,
-                             bool is_top_level);
-
-  // Returns the ProxyWindow associated with a window, null if not created yet.
-  static ProxyWindow* GetMayBeNull(aura::Window* window) {
-    return const_cast<ProxyWindow*>(
-        GetMayBeNull(const_cast<const aura::Window*>(window)));
-  }
-  static const ProxyWindow* GetMayBeNull(const aura::Window* window);
-
-  // Explicitly deletes this ProxyWindow. This should very rarely be called.
-  // The typical use case is ProxyWindow is owned by the aura::Window, and
-  // deleted when the associated window is deleted.
-  void Destroy();
-
-  aura::Window* window() { return window_; }
-
-  WindowTree* owning_window_tree() { return owning_window_tree_; }
-  const WindowTree* owning_window_tree() const { return owning_window_tree_; }
-
-  WindowTree* embedded_window_tree();
-  const WindowTree* embedded_window_tree() const;
-
-  void set_frame_sink_id(const viz::FrameSinkId& frame_sink_id) {
-    frame_sink_id_ = frame_sink_id;
-  }
-  const viz::FrameSinkId& frame_sink_id() const { return frame_sink_id_; }
-
-  const std::vector<gfx::Rect>& additional_client_areas() const {
-    return additional_client_areas_;
-  }
-  const gfx::Insets& client_area() const { return client_area_; }
-  void SetClientArea(const gfx::Insets& insets,
-                     const std::vector<gfx::Rect>& additional_client_areas);
-
-  void SetHitTestInsets(const gfx::Insets& mouse, const gfx::Insets& touch);
-
-  void SetShape(const std::vector<gfx::Rect>& shape);
-
-  void set_attached_frame_sink_id(const viz::FrameSinkId& id) {
-    attached_frame_sink_id_ = id;
-  }
-  const viz::FrameSinkId& attached_frame_sink_id() const {
-    return attached_frame_sink_id_;
-  }
-
-  void SetCaptureOwner(WindowTree* owner);
-  WindowTree* capture_owner() const { return capture_owner_; }
-
-  void set_focus_owner(WindowTree* owner) { focus_owner_ = owner; }
-  WindowTree* focus_owner() const { return focus_owner_; }
-
-  // Save |cursor| in |cursor_|. Since this does not update the active cursor,
-  // and to avoid confusion, the function is not called set_cursor().
-  void StoreCursor(const ui::Cursor& cursor);
-  const ui::Cursor& cursor() const { return cursor_; }
-
-  // Returns true if the window has an embedding, and the owning client
-  // intercepts events that would normally target descendants.
-  bool DoesOwnerInterceptEvents() const;
-
-  // Returns true if this window has a client embedded in it.
-  bool HasEmbedding() const { return embedding_.get() != nullptr; }
-  void SetEmbedding(std::unique_ptr<Embedding> embedding);
-  Embedding* embedding() { return embedding_.get(); }
-
-  // Returns true if the window is a top-level window and there is at least some
-  // non-client area.
-  bool HasNonClientArea() const;
-
-  bool IsTopLevel() const;
-
-  void AttachCompositorFrameSink(
-      viz::mojom::CompositorFrameSinkRequest compositor_frame_sink,
-      viz::mojom::CompositorFrameSinkClientPtr client);
-  bool attached_compositor_frame_sink() const {
-    return attached_compositor_frame_sink_;
-  }
-
-  void set_local_surface_id_allocation(
-      const base::Optional<viz::LocalSurfaceIdAllocation>&
-          local_surface_id_allocation) {
-    local_surface_id_allocation_ = local_surface_id_allocation;
-  }
-  const base::Optional<viz::LocalSurfaceIdAllocation>&
-  local_surface_id_allocation() const {
-    return local_surface_id_allocation_;
-  }
-
-  bool HasDragDropDelegate() const {
-    return drag_drop_delegate_.get() != nullptr;
-  }
-  void SetDragDropDelegate(
-      std::unique_ptr<DragDropDelegate> drag_drop_delegate);
-
-  void SetTopLevelProxyWindow(std::unique_ptr<TopLevelProxyWindowImpl> window);
-  TopLevelProxyWindowImpl* top_level_proxy_window() {
-    return top_level_proxy_window_.get();
-  }
-
-  // Returns an id useful for debugging. This returns the id from the client
-  // that created the window, otherwise |frame_sink_id_|.
-  std::string GetIdForDebugging();
-
- private:
-  friend class ProxyWindowTestHelper;
-  class ProxyWindowTargeter;
-
-  ProxyWindow(aura::Window*,
-              WindowTree* tree,
-              const viz::FrameSinkId& frame_sink_id,
-              bool is_top_level);
-
-  // Forwards to TopLevelEventHandler, see it for details.
-  // NOTE: this is only applicable to top-levels.
-  bool IsHandlingPointerPressForTesting(ui::PointerId pointer_id);
-
-  aura::Window* window_;
-
-  // Tree that created the window. Null if the window was not created at the
-  // request of a client. Generally this is null for first level embedding,
-  // otherwise non-null. A first level embedding is one where local code
-  // calls InitForEmbed() on a Window not associated with any other clients.
-  WindowTree* owning_window_tree_;
-
-  // Non-null if there is an embedding in this window.
-  std::unique_ptr<Embedding> embedding_;
-
-  // This is initially the id supplied by the client (for locally created
-  // windows it is kWindowServerClientId for the high part and low part an ever
-  // increasing number). If the window is used as the embed root, then it
-  // changes to high part = id of client being embedded in and low part 0. If
-  // used as a top-level, it's changed to the id passed by the client
-  // requesting the top-level.
-  viz::FrameSinkId frame_sink_id_;
-
-  // Together |client_area_| and |additional_client_areas_| are used to specify
-  // the client area. See SetClientArea() in mojom for details.
-  gfx::Insets client_area_;
-  std::vector<gfx::Rect> additional_client_areas_;
-
-  ProxyWindowTargeter* window_targeter_ = nullptr;
-
-  std::unique_ptr<ui::EventHandler> event_handler_;
-
-  // When a window has capture there are two possible clients that can get the
-  // events, either the embedder or the embedded client. When |window_| has
-  // capture this indicates which client gets the events. If null and |window_|
-  // has capture, then events are not sent to a client and not handled by the
-  // WindowService (meaning ui/events and aura's event processing continues).
-  // For example, a mouse press in the non-client area of a top-level results
-  // in views setting capture.
-  WindowTree* capture_owner_ = nullptr;
-
-  // This serves the same purpose as |capture_owner_|, but is used for focus.
-  // See |capture_owner_| for details.
-  WindowTree* focus_owner_ = nullptr;
-
-  base::Optional<viz::LocalSurfaceIdAllocation> local_surface_id_allocation_;
-
-  std::unique_ptr<DragDropDelegate> drag_drop_delegate_;
-
-  // The last cursor that the client has requested. This is only set for embed
-  // roots. For top level windows, see WmNativeWidgetAura.
-  ui::Cursor cursor_;
-
-  // Set to true once AttachCompositorFrameSink() has been called.
-  bool attached_compositor_frame_sink_ = false;
-
-  // FrameSinkId set by way of mojom::WindowTree::AttachFrameSinkId().
-  viz::FrameSinkId attached_frame_sink_id_;
-
-  std::unique_ptr<TopLevelProxyWindowImpl> top_level_proxy_window_;
-
-  DISALLOW_COPY_AND_ASSIGN(ProxyWindow);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_PROXY_WINDOW_H_
diff --git a/services/ws/proxy_window_test_helper.cc b/services/ws/proxy_window_test_helper.cc
deleted file mode 100644
index b2dea707..0000000
--- a/services/ws/proxy_window_test_helper.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "services/ws/proxy_window_test_helper.h"
-
-#include "services/ws/proxy_window.h"
-
-namespace ws {
-
-ProxyWindowTestHelper::ProxyWindowTestHelper(ProxyWindow* proxy_window)
-    : proxy_window_(proxy_window) {}
-
-ProxyWindowTestHelper::~ProxyWindowTestHelper() = default;
-
-bool ProxyWindowTestHelper::IsHandlingPointerPress(ui::PointerId pointer_id) {
-  return proxy_window_->IsHandlingPointerPressForTesting(pointer_id);
-}
-
-}  // namespace ws
diff --git a/services/ws/proxy_window_test_helper.h b/services/ws/proxy_window_test_helper.h
deleted file mode 100644
index ca3d7380..0000000
--- a/services/ws/proxy_window_test_helper.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_PROXY_WINDOW_TEST_HELPER_H_
-#define SERVICES_WS_PROXY_WINDOW_TEST_HELPER_H_
-
-#include "base/macros.h"
-#include "ui/events/event.h"
-
-namespace ws {
-
-class ProxyWindow;
-
-// Used for accessing private members of ProxyWindow in tests.
-class ProxyWindowTestHelper {
- public:
-  explicit ProxyWindowTestHelper(ProxyWindow* proxy_window);
-  ~ProxyWindowTestHelper();
-
-  bool IsHandlingPointerPress(ui::PointerId pointer_id);
-
- private:
-  ProxyWindow* proxy_window_;
-
-  DISALLOW_COPY_AND_ASSIGN(ProxyWindowTestHelper);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_PROXY_WINDOW_TEST_HELPER_H_
diff --git a/services/ws/proxy_window_unittest.cc b/services/ws/proxy_window_unittest.cc
deleted file mode 100644
index 49f4be6..0000000
--- a/services/ws/proxy_window_unittest.cc
+++ /dev/null
@@ -1,177 +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.
-
-#include "services/ws/proxy_window.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/run_loop.h"
-#include "services/ws/client_root_test_helper.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/mus/client_surface_embedder.h"
-#include "ui/events/event.h"
-#include "ui/events/event_constants.h"
-#include "ui/events/test/event_generator.h"
-#include "ui/wm/core/easy_resize_window_targeter.h"
-
-namespace ws {
-
-class ProxyWindowTest : public testing::Test {
- public:
-  ProxyWindowTest() = default;
-  ~ProxyWindowTest() override = default;
-
- protected:
-  WindowServiceTestSetup* setup() { return &setup_; }
-  WindowTreeTestHelper* helper() { return setup_.window_tree_test_helper(); }
-
-  ui::EventTarget* FindTargetFor(const gfx::Point& location) {
-    ui::MouseEvent mouse_event(ui::ET_MOUSE_PRESSED, location, location,
-                               base::TimeTicks::Now(),
-                               /* flags */ 0,
-                               /* changed_button_flags_ */ 0);
-    return setup_.root()->targeter()->FindTargetForEvent(setup_.root(),
-                                                         &mouse_event);
-  }
-
- private:
-  WindowServiceTestSetup setup_;
-
-  DISALLOW_COPY_AND_ASSIGN(ProxyWindowTest);
-};
-
-TEST_F(ProxyWindowTest, FindTargetForWindowWithEasyResizeTargeter) {
-  std::unique_ptr<wm::EasyResizeWindowTargeter> easy_resize_window_targeter =
-      std::make_unique<wm::EasyResizeWindowTargeter>(
-          gfx::Insets(-10, -10, -10, -10), gfx::Insets(-10, -10, -10, -10));
-  setup()->root()->SetEventTargeter(std::move(easy_resize_window_targeter));
-  aura::Window* top_level = helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->SetBounds(gfx::Rect(100, 200, 200, 200));
-  top_level->Show();
-
-  // Even though the mouse is not over |top_level| it should be returned as the
-  // target because EasyResizeWindowTargeter enlarges the hit area.
-  EXPECT_EQ(top_level, FindTargetFor(gfx::Point(105, 195)));
-
-  // Repeat with a location outside the extended hit region and ensure
-  // |top_level| is not returned.
-  EXPECT_NE(top_level, FindTargetFor(gfx::Point(5, 5)));
-}
-
-TEST_F(ProxyWindowTest, FindTargetForWindowWithResizeInset) {
-  aura::Window* top_level = helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  const gfx::Rect top_level_bounds(100, 200, 200, 200);
-  top_level->SetBounds(top_level_bounds);
-  top_level->Show();
-
-  aura::Window* child_window = helper()->NewWindow();
-  ASSERT_TRUE(child_window);
-  top_level->AddChild(child_window);
-  child_window->SetBounds(gfx::Rect(top_level_bounds.size()));
-  child_window->Show();
-
-  const int kInset = 4;
-  // Target an event at the resize inset area.
-  gfx::Point click_point =
-      top_level_bounds.left_center() + gfx::Vector2d(kInset / 2, 0);
-  // With no resize inset set yet, the event should go to the child window.
-  EXPECT_EQ(child_window, FindTargetFor(click_point));
-
-  // With the resize inset, the event should go to the toplevel.
-  top_level->SetProperty(aura::client::kResizeHandleInset, kInset);
-  EXPECT_EQ(top_level, FindTargetFor(click_point));
-}
-
-TEST_F(ProxyWindowTest, SetShapeShouldLimitWindowTargeting) {
-  aura::Window* top_level = helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  const gfx::Rect top_level_bounds(100, 200, 200, 200);
-  top_level->SetBounds(top_level_bounds);
-  top_level->Show();
-
-  aura::Window* child_window = helper()->NewWindow();
-  ASSERT_TRUE(child_window);
-  top_level->AddChild(child_window);
-  child_window->SetBounds(gfx::Rect(top_level_bounds.size()));
-  child_window->Show();
-
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(110, 210)));
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(200, 300)));
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(290, 210)));
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(290, 390)));
-
-  std::vector<gfx::Rect> shape = {
-      gfx::Rect(50, 50, 100, 100),
-      gfx::Rect(150, 150, 50, 50),
-  };
-  helper()->SetShape(top_level, shape);
-
-  EXPECT_NE(child_window, FindTargetFor(gfx::Point(110, 210)));
-  EXPECT_NE(top_level, FindTargetFor(gfx::Point(110, 210)));
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(200, 300)));
-  EXPECT_NE(child_window, FindTargetFor(gfx::Point(290, 210)));
-  EXPECT_NE(top_level, FindTargetFor(gfx::Point(290, 210)));
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(290, 390)));
-
-  // Empty cleas the shape API.
-  shape.clear();
-  helper()->SetShape(top_level, shape);
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(110, 210)));
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(200, 300)));
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(290, 210)));
-  EXPECT_EQ(child_window, FindTargetFor(gfx::Point(290, 390)));
-}
-
-TEST_F(ProxyWindowTest, ShouldSendPinchEventFromTouchpads) {
-  aura::Window* top_level = helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  const gfx::Rect top_level_bounds(100, 200, 200, 200);
-  top_level->SetBounds(top_level_bounds);
-  top_level->Show();
-
-  setup()->changes()->clear();
-
-  ui::test::EventGenerator event_generator(top_level->GetRootWindow());
-
-  // The pinch zoom from touchscreen -- that shouldn't be sent; the gesture
-  // recognition in the client will create them.
-  const gfx::Point points[] = {gfx::Point(110, 210), gfx::Point(190, 290)};
-  const gfx::Vector2d deltas[] = {gfx::Vector2d(20, 20),
-                                  gfx::Vector2d(-20, -20)};
-  const int delay_fingers[] = {0, 10};
-  event_generator.GestureMultiFingerScrollWithDelays(
-      2, points, deltas, delay_fingers, delay_fingers, 0, 10);
-  bool has_input_event = false;
-  for (auto& c : *setup()->changes()) {
-    if (c.type != CHANGE_TYPE_INPUT_EVENT)
-      continue;
-    has_input_event = true;
-    EXPECT_LE(ui::ET_TOUCH_RELEASED, c.event_action);
-    EXPECT_GE(ui::ET_TOUCH_CANCELLED, c.event_action);
-  }
-  EXPECT_TRUE(has_input_event);
-
-  setup()->changes()->clear();
-
-  // The pinch event from touchpad, this should be sent since the gesture
-  // recognition isn't involved.
-  ui::GestureEventDetails details(ui::ET_GESTURE_PINCH_BEGIN);
-  details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHPAD);
-  ui::GestureEvent pinch_event(110, 220, 0 /* flags */, base::TimeTicks::Now(),
-                               details);
-  ignore_result(setup()->aura_test_helper()->event_sink()->OnEventFromSource(
-      &pinch_event));
-  auto iter = FirstChangeOfType(*setup()->changes(), CHANGE_TYPE_INPUT_EVENT);
-  ASSERT_NE(iter, setup()->changes()->end());
-  EXPECT_EQ(ui::ET_GESTURE_PINCH_BEGIN, iter->event_action);
-}
-
-}  // namespace ws
diff --git a/services/ws/public/cpp/BUILD.gn b/services/ws/public/cpp/BUILD.gn
deleted file mode 100644
index d715ec2..0000000
--- a/services/ws/public/cpp/BUILD.gn
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ui.gni")
-
-# This is the public target. It contains only the public headers. The
-# implementation (and private headers) are in 'internal'.
-source_set("cpp") {
-  sources = [
-    "property_type_converters.h",
-    "raster_thread_helper.h",
-  ]
-
-  configs += [ "//build/config/compiler:wexit_time_destructors" ]
-
-  public_deps = [
-    "//base",
-    "//cc",
-    "//components/viz/common",
-    "//mojo/public/cpp/bindings",
-    "//services/service_manager/public/mojom",
-    "//services/ws/common",
-    "//services/ws/public/cpp/gpu",
-    "//services/ws/public/mojom",
-  ]
-
-  deps = [
-    ":internal",
-    "//gpu/command_buffer/client:gles2_cmd_helper",
-    "//gpu/command_buffer/client:gles2_interface",
-    "//services/service_manager/public/cpp",
-    "//services/ws/public/mojom",
-    "//ui/display",
-    "//ui/events",
-    "//ui/gfx/geometry",
-  ]
-
-  defines = [ "GL_GLEXT_PROTOTYPES" ]
-
-  allow_circular_includes_from = [ ":internal" ]
-}
-
-source_set("internal") {
-  # This target is an implementation detail and is intended only to be used by
-  # the 'cpp' target.
-  visibility = [ ":cpp" ]
-
-  sources = [
-    "property_type_converters.cc",
-    "raster_thread_helper.cc",
-  ]
-
-  configs += [ "//build/config/compiler:wexit_time_destructors" ]
-
-  deps = [
-    "//base",
-    "//cc",
-    "//components/viz/common",
-    "//mojo/public/cpp/bindings",
-    "//services/service_manager/public/cpp",
-    "//services/service_manager/public/mojom",
-    "//services/ws/common",
-    "//services/ws/public/cpp/gpu",
-    "//services/ws/public/mojom",
-    "//skia/public/interfaces",
-    "//ui/display",
-    "//ui/events",
-    "//ui/gfx/geometry",
-  ]
-
-  defines = [ "GL_GLEXT_PROTOTYPES" ]
-
-  if (use_ozone) {
-    deps += [ "//ui/ozone" ]
-  }
-}
-
-source_set("manifest") {
-  sources = [
-    "manifest.cc",
-    "manifest.h",
-  ]
-
-  deps = [
-    "//base",
-    "//components/discardable_memory/public/interfaces",
-    "//services/service_manager/public/cpp",
-    "//services/ws/public/mojom",
-    "//services/ws/public/mojom/ime",
-    "//services/ws/public/mojom/input_devices",
-    "//ui/base/mojo",
-  ]
-
-  if (use_ozone) {
-    deps += [ "//ui/ozone/public/interfaces" ]
-  }
-}
diff --git a/services/ws/public/cpp/manifest.cc b/services/ws/public/cpp/manifest.cc
deleted file mode 100644
index 0a1dfee..0000000
--- a/services/ws/public/cpp/manifest.cc
+++ /dev/null
@@ -1,105 +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 "services/ws/public/cpp/manifest.h"
-
-#include "base/no_destructor.h"
-#include "build/build_config.h"
-#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h"
-#include "services/service_manager/public/cpp/manifest_builder.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/event_injector.mojom.h"
-#include "services/ws/public/mojom/gpu.mojom.h"
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-#include "services/ws/public/mojom/input_devices/input_device_server.mojom.h"
-#include "services/ws/public/mojom/remoting_event_injector.mojom.h"
-#include "services/ws/public/mojom/user_activity_monitor.mojom.h"
-#include "services/ws/public/mojom/window_server_test.mojom.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "ui/base/mojo/clipboard.mojom.h"
-
-#if defined(OS_CHROMEOS)
-#include "services/ws/public/mojom/arc_gpu.mojom.h"
-#include "services/ws/public/mojom/input_devices/input_device_controller.mojom.h"
-#endif
-
-#if defined(USE_OZONE)
-#include "ui/ozone/public/interfaces/device_cursor.mojom.h"
-#include "ui/ozone/public/interfaces/drm_device.mojom.h"
-#endif
-
-namespace ws {
-
-const service_manager::Manifest& GetManifest() {
-  static base::NoDestructor<service_manager::Manifest> manifest {
-    service_manager::ManifestBuilder()
-        .WithServiceName(mojom::kServiceName)
-        .WithDisplayName("UI Service")
-        .WithOptions(service_manager::ManifestOptionsBuilder()
-                         .WithSandboxType("none")
-                         .WithInstanceSharingPolicy(
-                             service_manager::Manifest::InstanceSharingPolicy::
-                                 kSingleton)
-                         .Build())
-        .ExposeCapability(
-            "app",
-            service_manager::Manifest::InterfaceList<
-                discardable_memory::mojom::DiscardableSharedMemoryManager,
-                ui::mojom::ClipboardHost, mojom::Gpu, mojom::IMEDriver,
-                mojom::InputDeviceServer, mojom::WindowTreeFactory>())
-        .ExposeCapability(
-            "discardable_memory",
-            service_manager::Manifest::InterfaceList<
-                discardable_memory::mojom::DiscardableSharedMemoryManager>())
-        .ExposeCapability(
-            "gpu_client",
-            service_manager::Manifest::InterfaceList<mojom::Gpu>())
-#if defined(USE_OZONE)
-        // TODO(crbug.com/912221): When viz is run in-process inside window
-        // service, window service should provide ozone interfaces; otherwise,
-        // viz service provides them itself. Remove this when the in-process viz
-        // codepath is removed.
-        .ExposeCapability(
-            "ozone",
-            service_manager::Manifest::InterfaceList<
-                ui::ozone::mojom::DeviceCursor, ui::ozone::mojom::DrmDevice>())
-#endif
-        .ExposeCapability(
-            "test",
-            service_manager::Manifest::InterfaceList<mojom::EventInjector,
-                                                     mojom::WindowServerTest>())
-        .ExposeCapability(
-            "ime_registrar",
-            service_manager::Manifest::InterfaceList<mojom::IMERegistrar>())
-        .ExposeCapability(
-            "privileged",
-            service_manager::Manifest::InterfaceList<
-                mojom::EventInjector, mojom::RemotingEventInjector>())
-        .ExposeCapability(
-            "window_manager",
-            service_manager::Manifest::InterfaceList<
-#if defined(OS_CHROMEOS)
-                mojom::InputDeviceController,
-#endif
-                discardable_memory::mojom::DiscardableSharedMemoryManager,
-                mojom::EventInjector, mojom::Gpu, mojom::IMEDriver,
-                mojom::InputDeviceServer, mojom::UserActivityMonitor>())
-#if defined(OS_CHROMEOS)
-        .ExposeCapability(
-            "arc_manager",
-            service_manager::Manifest::InterfaceList<mojom::ArcGpu>())
-        .ExposeCapability("input_device_controller",
-                          service_manager::Manifest::InterfaceList<
-                              mojom::InputDeviceController>())
-#endif
-        .RequireCapability("*", "app")
-        .RequireCapability("ui", "ozone")
-        .RequireCapability("viz", "viz_host")
-
-        .Build()
-  };
-  return *manifest;
-}
-
-}  // namespace ws
diff --git a/services/ws/public/cpp/manifest.h b/services/ws/public/cpp/manifest.h
deleted file mode 100644
index ac22cba..0000000
--- a/services/ws/public/cpp/manifest.h
+++ /dev/null
@@ -1,16 +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 SERVICES_WS_PUBLIC_CPP_MANIFEST_H_
-#define SERVICES_WS_PUBLIC_CPP_MANIFEST_H_
-
-#include "services/service_manager/public/cpp/manifest.h"
-
-namespace ws {
-
-const service_manager::Manifest& GetManifest();
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/ws/public/cpp/property_type_converters.cc b/services/ws/public/cpp/property_type_converters.cc
deleted file mode 100644
index f720009..0000000
--- a/services/ws/public/cpp/property_type_converters.cc
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/public/cpp/property_type_converters.h"
-
-#include <stdint.h>
-
-#include "base/strings/utf_string_conversions.h"
-#include "base/unguessable_token.h"
-#include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
-#include "mojo/public/mojom/base/unguessable_token.mojom.h"
-#include "skia/public/interfaces/bitmap.mojom.h"
-#include "skia/public/interfaces/bitmap_skbitmap_struct_traits.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/geometry/size_f.h"
-
-namespace mojo {
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, gfx::Rect>::Convert(
-    const gfx::Rect& input) {
-  std::vector<uint8_t> vec(16);
-  vec[0] = (input.x() >> 24) & 0xFF;
-  vec[1] = (input.x() >> 16) & 0xFF;
-  vec[2] = (input.x() >> 8) & 0xFF;
-  vec[3] = input.x() & 0xFF;
-  vec[4] = (input.y() >> 24) & 0xFF;
-  vec[5] = (input.y() >> 16) & 0xFF;
-  vec[6] = (input.y() >> 8) & 0xFF;
-  vec[7] = input.y() & 0xFF;
-  vec[8] = (input.width() >> 24) & 0xFF;
-  vec[9] = (input.width() >> 16) & 0xFF;
-  vec[10] = (input.width() >> 8) & 0xFF;
-  vec[11] = input.width() & 0xFF;
-  vec[12] = (input.height() >> 24) & 0xFF;
-  vec[13] = (input.height() >> 16) & 0xFF;
-  vec[14] = (input.height() >> 8) & 0xFF;
-  vec[15] = input.height() & 0xFF;
-  return vec;
-}
-
-// static
-gfx::Rect TypeConverter<gfx::Rect, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  if (input.size() != 16)
-    return gfx::Rect();
-
-  return gfx::Rect(
-      input[0] << 24 | input[1] << 16 | input[2] << 8 | input[3],
-      input[4] << 24 | input[5] << 16 | input[6] << 8 | input[7],
-      input[8] << 24 | input[9] << 16 | input[10] << 8 | input[11],
-      input[12] << 24 | input[13] << 16 | input[14] << 8 | input[15]);
-}
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, gfx::Size>::Convert(
-    const gfx::Size& input) {
-  std::vector<uint8_t> vec(8);
-  vec[0] = (input.width() >> 24) & 0xFF;
-  vec[1] = (input.width() >> 16) & 0xFF;
-  vec[2] = (input.width() >> 8) & 0xFF;
-  vec[3] = input.width() & 0xFF;
-  vec[4] = (input.height() >> 24) & 0xFF;
-  vec[5] = (input.height() >> 16) & 0xFF;
-  vec[6] = (input.height() >> 8) & 0xFF;
-  vec[7] = input.height() & 0xFF;
-  return vec;
-}
-
-namespace {
-
-union float2bytes {
-  float f;
-  uint32_t i;
-};
-
-}  // namespace
-
-// static
-gfx::SizeF TypeConverter<gfx::SizeF, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  if (input.size() != 8)
-    return gfx::SizeF();
-
-  float2bytes width, height;
-  width.i = input[0] << 24 | input[1] << 16 | input[2] << 8 | input[3];
-  height.i = input[4] << 24 | input[5] << 16 | input[6] << 8 | input[7];
-  return gfx::SizeF(width.f, height.f);
-}
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, gfx::SizeF>::Convert(
-    const gfx::SizeF& input) {
-  std::vector<uint8_t> vec(8);
-  float2bytes width, height;
-  width.f = input.width();
-  height.f = input.height();
-  vec[0] = (width.i >> 24) & 0xFF;
-  vec[1] = (width.i >> 16) & 0xFF;
-  vec[2] = (width.i >> 8) & 0xFF;
-  vec[3] = width.i & 0xFF;
-  vec[4] = (height.i >> 24) & 0xFF;
-  vec[5] = (height.i >> 16) & 0xFF;
-  vec[6] = (height.i >> 8) & 0xFF;
-  vec[7] = height.i & 0xFF;
-  return vec;
-}
-
-// static
-gfx::Size TypeConverter<gfx::Size, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  if (input.size() != 8)
-    return gfx::Size();
-
-  return gfx::Size(input[0] << 24 | input[1] << 16 | input[2] << 8 | input[3],
-                   input[4] << 24 | input[5] << 16 | input[6] << 8 | input[7]);
-}
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, int32_t>::Convert(
-    const int32_t& input) {
-  std::vector<uint8_t> vec(4);
-  vec[0] = (input >> 24) & 0xFF;
-  vec[1] = (input >> 16) & 0xFF;
-  vec[2] = (input >> 8) & 0xFF;
-  vec[3] = input & 0xFF;
-  return vec;
-}
-
-// static
-int32_t TypeConverter<int32_t, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  if (input.size() != 4)
-    return 0;
-
-  return input[0] << 24 | input[1] << 16 | input[2] << 8 | input[3];
-}
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, int64_t>::Convert(
-    const int64_t& input) {
-  std::vector<uint8_t> vec(8);
-  vec[0] = (input >> 56) & 0xFF;
-  vec[1] = (input >> 48) & 0xFF;
-  vec[2] = (input >> 40) & 0xFF;
-  vec[3] = (input >> 32) & 0xFF;
-  vec[4] = (input >> 24) & 0xFF;
-  vec[5] = (input >> 16) & 0xFF;
-  vec[6] = (input >> 8) & 0xFF;
-  vec[7] = input & 0xFF;
-  return vec;
-}
-
-// static
-int64_t TypeConverter<int64_t, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  if (input.size() != 8)
-    return 0;
-
-  return static_cast<int64_t>(input[0]) << 56 |
-         static_cast<int64_t>(input[1]) << 48 |
-         static_cast<int64_t>(input[2]) << 40 |
-         static_cast<int64_t>(input[3]) << 32 |
-         static_cast<int64_t>(input[4]) << 24 |
-         static_cast<int64_t>(input[5]) << 16 |
-         static_cast<int64_t>(input[6]) << 8 | static_cast<int64_t>(input[7]);
-}
-
-// static
-std::vector<uint8_t>
-TypeConverter<std::vector<uint8_t>, base::string16>::Convert(
-    const base::string16& input) {
-  return ConvertTo<std::vector<uint8_t>>(base::UTF16ToUTF8(input));
-}
-
-// static
-base::string16 TypeConverter<base::string16, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  return base::UTF8ToUTF16(ConvertTo<std::string>(input));
-}
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, std::string>::Convert(
-    const std::string& input) {
-  return std::vector<uint8_t>(input.begin(), input.end());
-}
-
-// static
-std::string TypeConverter<std::string, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  return std::string(input.begin(), input.end());
-}
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, SkBitmap>::Convert(
-    const SkBitmap& input) {
-  return skia::mojom::InlineBitmap::Serialize(&input);
-}
-
-// static
-SkBitmap TypeConverter<SkBitmap, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  SkBitmap output;
-  return skia::mojom::InlineBitmap::Deserialize(input, &output) ? output
-                                                                : SkBitmap();
-}
-
-// static
-std::vector<uint8_t>
-TypeConverter<std::vector<uint8_t>, base::UnguessableToken>::Convert(
-    const base::UnguessableToken& input) {
-  if (input.is_empty())
-    return std::vector<uint8_t>();
-
-  return mojo_base::mojom::UnguessableToken::Serialize(&input);
-}
-
-// static
-base::UnguessableToken
-TypeConverter<base::UnguessableToken, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  if (input.empty())
-    return base::UnguessableToken();
-
-  base::UnguessableToken output;
-  return mojo_base::mojom::UnguessableToken::Deserialize(input, &output)
-             ? output
-             : base::UnguessableToken();
-}
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, bool>::Convert(
-    bool input) {
-  std::vector<uint8_t> vec(1);
-  vec[0] = input ? 1 : 0;
-  return vec;
-}
-
-// static
-bool TypeConverter<bool, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  // Empty vectors are interpreted as false.
-  return !input.empty() && (input[0] == 1);
-}
-
-// static
-std::vector<uint8_t> TypeConverter<std::vector<uint8_t>, uint64_t>::Convert(
-    uint64_t input) {
-  return TypeConverter<std::vector<uint8_t>, int64_t>::Convert(
-      static_cast<int64_t>(input));
-}
-
-// static
-ws::Id TypeConverter<uint64_t, std::vector<uint8_t>>::Convert(
-    const std::vector<uint8_t>& input) {
-  return static_cast<uint64_t>(
-      TypeConverter<int64_t, std::vector<uint8_t>>::Convert(input));
-}
-
-}  // namespace mojo
diff --git a/services/ws/public/cpp/property_type_converters.h b/services/ws/public/cpp/property_type_converters.h
deleted file mode 100644
index 6c39ca70..0000000
--- a/services/ws/public/cpp/property_type_converters.h
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_PUBLIC_CPP_PROPERTY_TYPE_CONVERTERS_H_
-#define SERVICES_WS_PUBLIC_CPP_PROPERTY_TYPE_CONVERTERS_H_
-
-#include <stdint.h>
-#include <vector>
-
-#include "base/strings/string16.h"
-#include "mojo/public/cpp/bindings/type_converter.h"
-#include "services/ws/common/types.h"
-
-class SkBitmap;
-
-namespace base {
-class UnguessableToken;
-}
-
-namespace gfx {
-class Rect;
-class Size;
-class SizeF;
-}  // namespace gfx
-
-namespace mojo {
-
-// TODO(beng): these methods serialize types used for standard properties
-//             to vectors of bytes used by Window::SetSharedProperty().
-//             replace this with serialization code generated @ bindings.
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, gfx::Rect> {
-  static std::vector<uint8_t> Convert(const gfx::Rect& input);
-};
-template <>
-struct TypeConverter<gfx::Rect, std::vector<uint8_t>> {
-  static gfx::Rect Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, gfx::Size> {
-  static std::vector<uint8_t> Convert(const gfx::Size& input);
-};
-template <>
-struct TypeConverter<gfx::Size, std::vector<uint8_t>> {
-  static gfx::Size Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, gfx::SizeF> {
-  static std::vector<uint8_t> Convert(const gfx::SizeF& input);
-};
-template <>
-struct TypeConverter<gfx::SizeF, std::vector<uint8_t>> {
-  static gfx::SizeF Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, int32_t> {
-  static std::vector<uint8_t> Convert(const int32_t& input);
-};
-template <>
-struct TypeConverter<int32_t, std::vector<uint8_t>> {
-  static int32_t Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, int64_t> {
-  static std::vector<uint8_t> Convert(const int64_t& input);
-};
-template <>
-struct TypeConverter<int64_t, std::vector<uint8_t>> {
-  static int64_t Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, base::string16> {
-  static std::vector<uint8_t> Convert(const base::string16& input);
-};
-template <>
-struct TypeConverter<base::string16, std::vector<uint8_t>> {
-  static base::string16 Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, std::string> {
-  static std::vector<uint8_t> Convert(const std::string& input);
-};
-template <>
-struct TypeConverter<std::string, std::vector<uint8_t>> {
-  static std::string Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, SkBitmap> {
-  static std::vector<uint8_t> Convert(const SkBitmap& input);
-};
-template <>
-struct TypeConverter<SkBitmap, std::vector<uint8_t>> {
-  static SkBitmap Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, bool> {
-  static std::vector<uint8_t> Convert(bool input);
-};
-template <>
-struct TypeConverter<bool, std::vector<uint8_t>> {
-  static bool Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, base::UnguessableToken> {
-  static std::vector<uint8_t> Convert(const base::UnguessableToken& input);
-};
-template <>
-struct TypeConverter<base::UnguessableToken, std::vector<uint8_t>> {
-  static base::UnguessableToken Convert(const std::vector<uint8_t>& input);
-};
-
-template <>
-struct TypeConverter<std::vector<uint8_t>, uint64_t> {
-  static std::vector<uint8_t> Convert(uint64_t input);
-};
-template <>
-struct TypeConverter<uint64_t, std::vector<uint8_t>> {
-  static uint64_t Convert(const std::vector<uint8_t>& input);
-};
-
-}  // namespace mojo
-
-#endif  // SERVICES_WS_PUBLIC_CPP_PROPERTY_TYPE_CONVERTERS_H_
diff --git a/services/ws/public/cpp/raster_thread_helper.cc b/services/ws/public/cpp/raster_thread_helper.cc
deleted file mode 100644
index 658749f..0000000
--- a/services/ws/public/cpp/raster_thread_helper.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/public/cpp/raster_thread_helper.h"
-
-#include "base/logging.h"
-#include "base/threading/simple_thread.h"
-#include "cc/raster/single_thread_task_graph_runner.h"
-
-namespace ws {
-
-RasterThreadHelper::RasterThreadHelper()
-    : task_graph_runner_(new cc::SingleThreadTaskGraphRunner) {
-  task_graph_runner_->Start("CompositorTileWorker1",
-                            base::SimpleThread::Options());
-}
-
-RasterThreadHelper::~RasterThreadHelper() {
-  task_graph_runner_->Shutdown();
-}
-
-cc::TaskGraphRunner* RasterThreadHelper::task_graph_runner() {
-  return task_graph_runner_.get();
-}
-
-}  // namespace ws
diff --git a/services/ws/public/cpp/raster_thread_helper.h b/services/ws/public/cpp/raster_thread_helper.h
deleted file mode 100644
index 0817728..0000000
--- a/services/ws/public/cpp/raster_thread_helper.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_PUBLIC_CPP_RASTER_THREAD_HELPER_H_
-#define SERVICES_WS_PUBLIC_CPP_RASTER_THREAD_HELPER_H_
-
-#include <memory>
-
-#include "base/macros.h"
-
-namespace cc {
-class TaskGraphRunner;
-class SingleThreadTaskGraphRunner;
-}  // namespace cc
-
-namespace ws {
-
-class RasterThreadHelper {
- public:
-  RasterThreadHelper();
-  ~RasterThreadHelper();
-
-  cc::TaskGraphRunner* task_graph_runner();
-
- private:
-  std::unique_ptr<cc::SingleThreadTaskGraphRunner> task_graph_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(RasterThreadHelper);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_PUBLIC_CPP_RASTER_THREAD_HELPER_H_
diff --git a/services/ws/public/cpp/tests/BUILD.gn b/services/ws/public/cpp/tests/BUILD.gn
index 85a47c2..1ce9c7a 100644
--- a/services/ws/public/cpp/tests/BUILD.gn
+++ b/services/ws/public/cpp/tests/BUILD.gn
@@ -10,7 +10,6 @@
 
   sources = [
     "gpu_unittest.cc",
-    "property_type_converters_unittest.cc",
   ]
 
   deps = [
@@ -19,7 +18,7 @@
     "//mojo/core/embedder",
     "//mojo/public/cpp/system",
     "//services/service_manager/public/cpp",
-    "//services/ws/public/cpp",
+    "//services/ws/public/cpp/gpu",
     "//testing/gtest",
     "//ui/gfx:test_support",
     "//ui/gfx/geometry",
diff --git a/services/ws/public/cpp/tests/property_type_converters_unittest.cc b/services/ws/public/cpp/tests/property_type_converters_unittest.cc
deleted file mode 100644
index 1967ae6729..0000000
--- a/services/ws/public/cpp/tests/property_type_converters_unittest.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/public/cpp/property_type_converters.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/gfx/skia_util.h"
-
-namespace mojo {
-namespace {
-
-// Tests round-trip serializing and deserializing an SkBitmap.
-TEST(PropertyTypeConvertersTest, SkBitmapRoundTrip) {
-  SkBitmap bitmap;
-  bitmap.allocN32Pixels(16, 32);
-  bitmap.eraseARGB(255, 11, 22, 33);
-  EXPECT_FALSE(bitmap.isNull());
-  auto bytes = TypeConverter<std::vector<uint8_t>, SkBitmap>::Convert(bitmap);
-  SkBitmap out = TypeConverter<SkBitmap, std::vector<uint8_t>>::Convert(bytes);
-  EXPECT_TRUE(gfx::BitmapsAreEqual(bitmap, out));
-}
-
-TEST(PropertyTypeConvertersTest, Rectangle) {
-  const gfx::Rect rect(1, 2, 3, 4);
-  const auto encoded = mojo::ConvertTo<std::vector<uint8_t>>(rect);
-  const gfx::Rect decoded = mojo::ConvertTo<gfx::Rect>(encoded);
-  EXPECT_EQ(rect, decoded);
-
-  // Verify a vector with an invalid size results in an empty rect.
-  EXPECT_EQ(gfx::Rect(), mojo::ConvertTo<gfx::Rect>(std::vector<uint8_t>()));
-}
-
-TEST(PropertyTypeConvertersTest, Size) {
-  const gfx::Size size(121, 987);
-  const auto encoded = mojo::ConvertTo<std::vector<uint8_t>>(size);
-  const gfx::Size decoded = mojo::ConvertTo<gfx::Size>(encoded);
-  EXPECT_EQ(size, decoded);
-
-  // Verify a vector with an invalid size results in an empty size.
-  EXPECT_EQ(gfx::Size(), mojo::ConvertTo<gfx::Size>(std::vector<uint8_t>()));
-}
-
-TEST(PropertyTypeConvertersTest, Int32) {
-  const int32_t value = 0xFEDCBA90;
-  const auto encoded = mojo::ConvertTo<std::vector<uint8_t>>(value);
-  const int32_t decoded = mojo::ConvertTo<int32_t>(encoded);
-  EXPECT_EQ(value, decoded);
-
-  // Verify a vector with an invalid size results in 0.
-  EXPECT_EQ(0, mojo::ConvertTo<int32_t>(std::vector<uint8_t>()));
-  EXPECT_EQ(0, mojo::ConvertTo<int32_t>(std::vector<uint8_t>(1, 1)));
-  EXPECT_EQ(0, mojo::ConvertTo<int32_t>(std::vector<uint8_t>(2, 1)));
-  EXPECT_EQ(0, mojo::ConvertTo<int32_t>(std::vector<uint8_t>(5, 1)));
-}
-
-TEST(PropertyTypeConvertersTest, Int64) {
-  const int64_t value = 0xFEDCBA0123456789;
-  const auto encoded = mojo::ConvertTo<std::vector<uint8_t>>(value);
-  const int64_t decoded = mojo::ConvertTo<int64_t>(encoded);
-  EXPECT_EQ(value, decoded);
-
-  // Verify a vector with an invalid size results in 0.
-  EXPECT_EQ(0, mojo::ConvertTo<int64_t>(std::vector<uint8_t>()));
-  EXPECT_EQ(0, mojo::ConvertTo<int64_t>(std::vector<uint8_t>(1, 1)));
-  EXPECT_EQ(0, mojo::ConvertTo<int64_t>(std::vector<uint8_t>(2, 1)));
-  EXPECT_EQ(0, mojo::ConvertTo<int64_t>(std::vector<uint8_t>(10, 1)));
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/services/ws/remote_view_host/BUILD.gn b/services/ws/remote_view_host/BUILD.gn
deleted file mode 100644
index a5f7770..0000000
--- a/services/ws/remote_view_host/BUILD.gn
+++ /dev/null
@@ -1,48 +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.
-
-source_set("remote_view_host") {
-  public = [
-    "server_remote_view_host.h",
-  ]
-  sources = [
-    "server_remote_view_host.cc",
-  ]
-
-  public_deps = [
-    "//base",
-    "//services/ws:lib",
-    "//ui/aura",
-    "//ui/views",
-  ]
-
-  deps = []
-  if (is_chromeos) {
-    deps += [ "//ui/wm" ]
-  }
-}
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "server_remote_view_host_unittest.cc",
-  ]
-
-  deps = [
-    ":remote_view_host",
-    "//base",
-    "//base/test:test_support",
-    "//services/ws:lib",
-    "//services/ws:test_support",
-    "//testing/gtest",
-    "//ui/aura:test_support",
-    "//ui/views",
-    "//ui/views:test_support",
-  ]
-
-  data_deps = [
-    "//services/ws/test_ws",
-  ]
-}
diff --git a/services/ws/remote_view_host/server_remote_view_host.cc b/services/ws/remote_view_host/server_remote_view_host.cc
deleted file mode 100644
index 4fc93684..0000000
--- a/services/ws/remote_view_host/server_remote_view_host.cc
+++ /dev/null
@@ -1,71 +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.
-
-#include "services/ws/remote_view_host/server_remote_view_host.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "services/ws/window_service.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/window.h"
-
-#if defined(OS_CHROMEOS)
-#include "ui/wm/core/ime_util_chromeos.h"
-#endif
-
-namespace ws {
-
-ServerRemoteViewHost::ServerRemoteViewHost(WindowService* window_service)
-    : window_service_(window_service),
-      embedding_root_(
-          std::make_unique<aura::Window>(nullptr,
-                                         aura::client::WINDOW_TYPE_UNKNOWN)) {
-  embedding_root_->set_owned_by_parent(false);
-  embedding_root_->SetName("ServerRemoteViewHostWindow");
-  embedding_root_->SetType(aura::client::WINDOW_TYPE_CONTROL);
-  embedding_root_->Init(ui::LAYER_NOT_DRAWN);
-
-#if defined(OS_CHROMEOS)
-  helper_ =
-      std::make_unique<wm::EnsureWindowNotInRectHelper>(embedding_root_.get());
-#endif
-}
-
-ServerRemoteViewHost::~ServerRemoteViewHost() = default;
-
-void ServerRemoteViewHost::EmbedUsingToken(
-    const base::UnguessableToken& embed_token,
-    int embed_flags,
-    EmbedCallback callback) {
-  embed_token_ = embed_token;
-  embed_flags_ = embed_flags;
-  embed_callback_ = std::move(callback);
-
-  // TODO(sky): having to wait for being parented is a bit of a hassle. Fix
-  // this.
-  if (GetWidget())
-    EmbedImpl();
-}
-
-const char* ServerRemoteViewHost::GetClassName() const {
-  return "ServerRemoteViewHost";
-}
-
-void ServerRemoteViewHost::EmbedImpl() {
-  DCHECK(IsEmbedPending());
-  const bool result = window_service_->CompleteScheduleEmbedForExistingClient(
-      embedding_root_.get(), embed_token_, embed_flags_);
-  std::move(embed_callback_).Run(result);
-}
-
-void ServerRemoteViewHost::AddedToWidget() {
-  if (native_view())
-    return;
-  Attach(embedding_root_.get());
-  if (IsEmbedPending())
-    EmbedImpl();
-}
-
-}  // namespace ws
diff --git a/services/ws/remote_view_host/server_remote_view_host.h b/services/ws/remote_view_host/server_remote_view_host.h
deleted file mode 100644
index 6411afde..0000000
--- a/services/ws/remote_view_host/server_remote_view_host.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_REMOTE_VIEW_HOST_SERVER_REMOTE_VIEW_HOST_H_
-#define SERVICES_WS_REMOTE_VIEW_HOST_SERVER_REMOTE_VIEW_HOST_H_
-
-#include <memory>
-
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "base/unguessable_token.h"
-#include "ui/views/controls/native/native_view_host.h"
-
-namespace aura {
-class Window;
-}
-
-namespace wm {
-class EnsureWindowNotInRectHelper;
-}
-
-namespace ws {
-
-class WindowService;
-
-// A view the owner of the WindowService may use for embedding. This class
-// is specifically designed to work with clients that have scheduled an
-// embedding (ScheduleEmbedForExistingClient()) and then passed the token
-// to the owner of the WindowService.
-//
-// Typical usage:
-// 1. remote client creates views::RemoteViewProvider with window.
-// 2. remote client calls RemoveViewProvider::GetEmbedToken().
-// 3. remote client passes token to owner of WindowService over another mojo
-//    connection.
-// 4. owner of WindowService creates ServerRemoveViewHost and calls
-//    EmbedUsingToken() with the token supplied in step 3.
-class ServerRemoteViewHost : public views::NativeViewHost {
- public:
-  explicit ServerRemoteViewHost(WindowService* window_service);
-  ~ServerRemoteViewHost() override;
-
-  // Embeds the remote contents after this view is added to a widget.
-  // |embed_token| is the token obtained from the WindowTree embed API
-  // (ScheduleEmbed/ForExistingClient). |embed_flags| are the embedding flags
-  // (see window_tree_constants.mojom). |callback| is an optional callback
-  // invoked with the embed result.
-  // Note that |callback| should not be used to add the view to a widget because
-  // the actual embedding only happens after the view is added.
-  using EmbedCallback = base::OnceCallback<void(bool success)>;
-  void EmbedUsingToken(const base::UnguessableToken& embed_token,
-                       int embed_flags,
-                       EmbedCallback callback);
-
-  const char* GetClassName() const override;
-
-  aura::Window* embedding_root() { return embedding_root_.get(); }
-
- private:
-  bool IsEmbedPending() const { return !embed_token_.is_empty(); }
-
-  void EmbedImpl();
-
-  // views::NativeViewHost:
-  void AddedToWidget() override;
-
-  WindowService* window_service_;
-  base::UnguessableToken embed_token_;
-  int embed_flags_ = 0;
-  EmbedCallback embed_callback_;
-
-  const std::unique_ptr<aura::Window> embedding_root_;
-#if defined(OS_CHROMEOS)
-  std::unique_ptr<wm::EnsureWindowNotInRectHelper> helper_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(ServerRemoteViewHost);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_REMOTE_VIEW_HOST_SERVER_REMOTE_VIEW_HOST_H_
diff --git a/services/ws/remote_view_host/server_remote_view_host_unittest.cc b/services/ws/remote_view_host/server_remote_view_host_unittest.cc
deleted file mode 100644
index 172d1fa..0000000
--- a/services/ws/remote_view_host/server_remote_view_host_unittest.cc
+++ /dev/null
@@ -1,68 +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.
-
-#include "services/ws/remote_view_host/server_remote_view_host.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/window.h"
-#include "ui/views/test/test_views_delegate.h"
-
-namespace ws {
-
-TEST(ServerRemoteViewHostTest, EmbedUsingToken) {
-  // Use |setup| to configure aura and other state.
-  WindowServiceTestSetup setup;
-  views::TestViewsDelegate views_delegate;
-
-  // Schedule an embed in the tree created by |setup|.
-  base::UnguessableToken token;
-  const uint32_t window_id_in_child = 149;
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->ScheduleEmbedForExistingClient(
-          window_id_in_child,
-          base::BindOnce(
-              [](base::UnguessableToken* token,
-                 const base::UnguessableToken& actual_token) {
-                *token = actual_token;
-              },
-              &token));
-  EXPECT_FALSE(token.is_empty());
-
-  // Create the widget and ServerRemoteViewHost. ServerRemoteViewHost currently
-  // won't embed until contained in a Widget.
-  // |widget| is deleted by CloseNow() call below.
-  views::Widget* widget = views::Widget::CreateWindowWithContext(
-      nullptr, setup.aura_test_helper()->root_window());
-  // Owned by |widget|.
-  ServerRemoteViewHost* remote_view_host =
-      new ServerRemoteViewHost(setup.service());
-  bool embed_result = false;
-  bool embed_result_called = false;
-  remote_view_host->EmbedUsingToken(
-      token, /* embed_flags */ 0,
-      base::BindOnce(
-          [](bool* embed_result, bool* embed_result_called,
-             bool actual_result) {
-            *embed_result = actual_result;
-            *embed_result_called = true;
-          },
-          &embed_result, &embed_result_called));
-  // Binding does not happen immediately, only when in a valid Widget.
-  EXPECT_FALSE(embed_result_called);
-
-  // Add to the widget, which should trigger the actual embedding.
-  widget->GetRootView()->AddChildView(remote_view_host);
-  EXPECT_TRUE(embed_result);
-  EXPECT_TRUE(embed_result_called);
-  widget->CloseNow();
-}
-
-}  // namespace ws
diff --git a/services/ws/remoting_event_injector.cc b/services/ws/remoting_event_injector.cc
deleted file mode 100644
index edd6dd9..0000000
--- a/services/ws/remoting_event_injector.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/remoting_event_injector.h"
-
-#include "ui/events/keycodes/dom/keycode_converter.h"
-#include "ui/events/system_input_injector.h"
-
-namespace ws {
-namespace {
-
-// Converts an InjectedMouseButtonTypeToEventFlags to EventFlags, which is what
-// SystemInputInjector expects.
-ui::EventFlags InjectedMouseButtonTypeToEventFlags(
-    mojom::InjectedMouseButtonType type) {
-  switch (type) {
-    case mojom::InjectedMouseButtonType::kLeft:
-      return ui::EF_LEFT_MOUSE_BUTTON;
-    case mojom::InjectedMouseButtonType::kMiddle:
-      return ui::EF_MIDDLE_MOUSE_BUTTON;
-    case mojom::InjectedMouseButtonType::kRight:
-      return ui::EF_MIDDLE_MOUSE_BUTTON;
-  }
-  NOTREACHED();
-  return ui::EF_NONE;
-}
-
-}  // namespace
-
-RemotingEventInjector::RemotingEventInjector(
-    ui::SystemInputInjector* system_injector)
-    : system_injector_(system_injector) {}
-
-RemotingEventInjector::~RemotingEventInjector() = default;
-
-void RemotingEventInjector::AddBinding(
-    mojom::RemotingEventInjectorRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void RemotingEventInjector::MoveCursorToLocationInPixels(
-    const gfx::PointF& location) {
-  system_injector_->MoveCursorTo(location);
-}
-
-void RemotingEventInjector::InjectMousePressOrRelease(
-    mojom::InjectedMouseButtonType button,
-    bool down) {
-  system_injector_->InjectMouseButton(
-      InjectedMouseButtonTypeToEventFlags(button), down);
-}
-
-void RemotingEventInjector::InjectMouseWheelInPixels(int32_t delta_x,
-                                                     int32_t delta_y) {
-  system_injector_->InjectMouseWheel(delta_x, delta_y);
-}
-
-void RemotingEventInjector::InjectKeyEvent(int32_t native_key_code,
-                                           bool down,
-                                           bool suppress_auto_repeat) {
-  system_injector_->InjectKeyEvent(
-      ui::KeycodeConverter::NativeKeycodeToDomCode(native_key_code), down,
-      suppress_auto_repeat);
-}
-
-}  // namespace ws
diff --git a/services/ws/remoting_event_injector.h b/services/ws/remoting_event_injector.h
deleted file mode 100644
index 170f48b..0000000
--- a/services/ws/remoting_event_injector.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_REMOTING_EVENT_INJECTOR_H_
-#define SERVICES_WS_REMOTING_EVENT_INJECTOR_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "services/ws/public/mojom/remoting_event_injector.mojom.h"
-
-namespace ui {
-class SystemInputInjector;
-}
-
-namespace ws {
-
-// See description in mojom for details on this. This trivially forwards to
-// SystemInputInjector.
-class RemotingEventInjector : public mojom::RemotingEventInjector {
- public:
-  explicit RemotingEventInjector(ui::SystemInputInjector* system_injector);
-  ~RemotingEventInjector() override;
-
-  void AddBinding(mojom::RemotingEventInjectorRequest request);
-
- private:
-  // mojom::RemotingEventInjector:
-  void MoveCursorToLocationInPixels(const gfx::PointF& location) override;
-  void InjectMousePressOrRelease(mojom::InjectedMouseButtonType button,
-                                 bool down) override;
-  void InjectMouseWheelInPixels(int32_t delta_x, int32_t delta_y) override;
-  void InjectKeyEvent(int32_t native_key_code,
-                      bool down,
-                      bool suppress_auto_repeat) override;
-
-  ui::SystemInputInjector* system_injector_;
-
-  mojo::BindingSet<mojom::RemotingEventInjector> bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(RemotingEventInjector);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_REMOTING_EVENT_INJECTOR_H_
diff --git a/services/ws/screen_provider.cc b/services/ws/screen_provider.cc
deleted file mode 100644
index 0ae36f1..0000000
--- a/services/ws/screen_provider.cc
+++ /dev/null
@@ -1,108 +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.
-
-#include "services/ws/screen_provider.h"
-
-#include "ui/display/display_observer.h"
-#include "ui/display/screen.h"
-
-using display::Display;
-using display::Screen;
-
-namespace ws {
-namespace {
-
-int64_t GetPrimaryDisplayId() {
-  return Screen::GetScreen()->GetPrimaryDisplay().id();
-}
-
-int64_t GetInternalDisplayId() {
-  return Display::HasInternalDisplay() ? Display::InternalDisplayId()
-                                       : display::kInvalidDisplayId;
-}
-
-}  // namespace
-
-ScreenProvider::ScreenProvider() {
-  Screen::GetScreen()->AddObserver(this);
-}
-
-ScreenProvider::~ScreenProvider() {
-  Screen::GetScreen()->RemoveObserver(this);
-}
-
-void ScreenProvider::AddObserver(mojom::ScreenProviderObserver* observer) {
-  observers_.AddObserver(observer);
-  NotifyObserver(observer);
-}
-
-void ScreenProvider::RemoveObserver(mojom::ScreenProviderObserver* observer) {
-  observers_.RemoveObserver(observer);
-}
-
-void ScreenProvider::SetFrameDecorationValues(
-    const gfx::Insets& client_area_insets,
-    int max_title_bar_button_width) {
-  client_area_insets_ = client_area_insets;
-  max_title_bar_button_width_ = max_title_bar_button_width;
-}
-
-void ScreenProvider::SetDisplayForNewWindows(int64_t display_id) {
-  if (display_id == display_id_for_new_windows_)
-    return;
-  display_id_for_new_windows_ = display_id;
-  NotifyAllObservers();
-}
-
-void ScreenProvider::DisplayMetricsChanged(const display::Display& display,
-                                           uint32_t changed_metrics) {
-  if ((changed_metrics &
-       display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR) != 0) {
-    NotifyAllObservers();
-  }
-}
-
-void ScreenProvider::OnDidProcessDisplayChanges() {
-  // Display changes happen in batches, so notify observers after the batch is
-  // complete, rather than on every add/remove/metrics change.
-  NotifyAllObservers();
-}
-
-void ScreenProvider::NotifyAllObservers() {
-  for (mojom::ScreenProviderObserver& observer : observers_)
-    NotifyObserver(&observer);
-}
-
-void ScreenProvider::NotifyObserver(mojom::ScreenProviderObserver* observer) {
-  observer->OnDisplaysChanged(GetAllDisplays(), GetPrimaryDisplayId(),
-                              GetInternalDisplayId(),
-                              display_id_for_new_windows_);
-}
-
-std::vector<mojom::WsDisplayPtr> ScreenProvider::GetAllDisplays() {
-  std::vector<Display> displays = Screen::GetScreen()->GetAllDisplays();
-
-  std::vector<mojom::WsDisplayPtr> ws_displays;
-  ws_displays.reserve(displays.size());
-
-  for (const Display& display : displays) {
-    mojom::WsDisplayPtr ws_display = mojom::WsDisplay::New();
-    ws_display->display = display;
-    ws_display->frame_decoration_values = GetFrameDecorationValues();
-    ws_displays.push_back(std::move(ws_display));
-  }
-
-  return ws_displays;
-}
-
-mojom::FrameDecorationValuesPtr ScreenProvider::GetFrameDecorationValues() {
-  mojom::FrameDecorationValuesPtr values = mojom::FrameDecorationValues::New();
-  // TODO(jamescook): These insets are always the same. Collapse them.
-  values->normal_client_area_insets = client_area_insets_;
-  values->maximized_client_area_insets = client_area_insets_;
-  values->max_title_bar_button_width = max_title_bar_button_width_;
-  return values;
-}
-
-}  // namespace ws
diff --git a/services/ws/screen_provider.h b/services/ws/screen_provider.h
deleted file mode 100644
index fdfe97d0..0000000
--- a/services/ws/screen_provider.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_SCREEN_PROVIDER_H_
-#define SERVICES_WS_SCREEN_PROVIDER_H_
-
-#include <stdint.h>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "base/observer_list.h"
-#include "services/ws/public/mojom/screen_provider_observer.mojom.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "ui/display/display_observer.h"
-#include "ui/display/types/display_constants.h"
-#include "ui/gfx/geometry/insets.h"
-
-namespace display {
-class Display;
-}
-
-namespace ws {
-
-// Provides information about displays to window service clients.
-// display::Screen must outlive this object. Exported for test.
-class COMPONENT_EXPORT(WINDOW_SERVICE) ScreenProvider
-    : public display::DisplayObserver {
- public:
-  ScreenProvider();
-  ~ScreenProvider() override;
-
-  void AddObserver(mojom::ScreenProviderObserver* observer);
-  void RemoveObserver(mojom::ScreenProviderObserver* observer);
-
-  // Sets the window frame metrics.
-  void SetFrameDecorationValues(const gfx::Insets& client_area_insets,
-                                int max_title_bar_button_width);
-
-  // See WindowService documentation.
-  void SetDisplayForNewWindows(int64_t display_id);
-
-  // See comment in WindowService as to why this is special cased.
-  void DisplayMetricsChanged(const display::Display& display,
-                             uint32_t changed_metrics);
-
-  // display::DisplayObserver:
-  void OnDidProcessDisplayChanges() override;
-
- private:
-  void NotifyAllObservers();
-
-  void NotifyObserver(mojom::ScreenProviderObserver* observer);
-
-  std::vector<mojom::WsDisplayPtr> GetAllDisplays();
-
-  // Returns the window frame metrics as a mojo struct.
-  mojom::FrameDecorationValuesPtr GetFrameDecorationValues();
-
-  // See mojom::FrameDecorationValuesPtr documentation.
-  gfx::Insets client_area_insets_;
-  int max_title_bar_button_width_ = 0;
-
-  int64_t display_id_for_new_windows_ = display::kInvalidDisplayId;
-
-  base::ObserverList<mojom::ScreenProviderObserver>::Unchecked observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScreenProvider);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_SCREEN_PROVIDER_H_
diff --git a/services/ws/screen_provider_unittest.cc b/services/ws/screen_provider_unittest.cc
deleted file mode 100644
index 5138ae16..0000000
--- a/services/ws/screen_provider_unittest.cc
+++ /dev/null
@@ -1,173 +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.
-
-#include "services/ws/screen_provider.h"
-
-#include <stdint.h>
-
-#include "base/run_loop.h"
-#include "services/service_manager/public/cpp/test/test_connector_factory.h"
-#include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/screen_provider_observer.mojom.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/test_screen_provider_observer.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_setup.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/display/display.h"
-#include "ui/display/screen_base.h"
-
-using display::Display;
-using display::DisplayList;
-using display::DisplayObserver;
-
-namespace ws {
-namespace {
-
-// A testing screen that generates the OnDidProcessDisplayChanges() notification
-// similar to production code.
-class TestScreen : public display::ScreenBase {
- public:
-  TestScreen() { display::Screen::SetScreenInstance(this); }
-
-  ~TestScreen() override { display::Screen::SetScreenInstance(nullptr); }
-
-  void AddDisplay(const Display& display, DisplayList::Type type) {
-    display_list().AddDisplay(display, type);
-    for (DisplayObserver& observer : *display_list().observers())
-      observer.OnDidProcessDisplayChanges();
-  }
-
-  void UpdateDisplay(const Display& display, DisplayList::Type type) {
-    display_list().UpdateDisplay(display, type);
-    for (DisplayObserver& observer : *display_list().observers())
-      observer.OnDidProcessDisplayChanges();
-  }
-
-  void RemoveDisplay(int64_t display_id) {
-    display_list().RemoveDisplay(display_id);
-    for (DisplayObserver& observer : *display_list().observers())
-      observer.OnDidProcessDisplayChanges();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestScreen);
-};
-
-TEST(ScreenProviderTest, AddRemoveDisplay) {
-  TestScreen screen;
-  screen.AddDisplay(Display(111, gfx::Rect(0, 0, 640, 480)),
-                    DisplayList::Type::PRIMARY);
-  Display::SetInternalDisplayId(111);
-
-  ScreenProvider screen_provider;
-  TestScreenProviderObserver observer;
-
-  // Adding an observer triggers an update.
-  screen_provider.AddObserver(&observer);
-  EXPECT_EQ("111", observer.display_ids());
-  EXPECT_EQ(111, observer.primary_display_id());
-  EXPECT_EQ(111, observer.internal_display_id());
-  observer.display_ids().clear();
-
-  // Adding a display triggers an update.
-  screen.AddDisplay(Display(222, gfx::Rect(640, 0, 640, 480)),
-                    DisplayList::Type::NOT_PRIMARY);
-  EXPECT_EQ("111 222", observer.display_ids());
-  EXPECT_EQ(111, observer.primary_display_id());
-  observer.display_ids().clear();
-
-  // Updating which display is primary triggers an update.
-  screen.UpdateDisplay(Display(222, gfx::Rect(640, 0, 800, 600)),
-                       DisplayList::Type::PRIMARY);
-  EXPECT_EQ("111 222", observer.display_ids());
-  EXPECT_EQ(222, observer.primary_display_id());
-  observer.display_ids().clear();
-
-  // Removing a display triggers an update.
-  screen.RemoveDisplay(111);
-  EXPECT_EQ("222", observer.display_ids());
-  EXPECT_EQ(222, observer.primary_display_id());
-}
-
-TEST(ScreenProviderTest, SetDisplayForNewWindows) {
-  // Set up 2 displays.
-  constexpr int64_t kDisplayId1 = 111;
-  constexpr int64_t kDisplayId2 = 222;
-  TestScreen screen;
-  screen.AddDisplay(Display(kDisplayId1), DisplayList::Type::PRIMARY);
-  screen.AddDisplay(Display(kDisplayId2), DisplayList::Type::NOT_PRIMARY);
-
-  // Set the display for new windows to the second display.
-  ScreenProvider screen_provider;
-  screen_provider.SetDisplayForNewWindows(kDisplayId2);
-
-  TestScreenProviderObserver observer;
-  screen_provider.AddObserver(&observer);
-
-  // The screen information includes the display for new windows.
-  EXPECT_EQ(kDisplayId2, observer.display_id_for_new_windows());
-}
-
-TEST(ScreenProviderTest, SetFrameDecorationValues) {
-  // Set up a single display.
-  TestScreen screen;
-  screen.AddDisplay(Display(111, gfx::Rect(0, 0, 640, 480)),
-                    DisplayList::Type::PRIMARY);
-
-  // Set up custom frame decoration values.
-  ScreenProvider screen_provider;
-  screen_provider.SetFrameDecorationValues(gfx::Insets(1, 2, 3, 4), 55u);
-
-  // Add an observer to the screen provider.
-  TestScreenProviderObserver observer;
-  screen_provider.AddObserver(&observer);
-
-  // The screen information contains the frame decoration values.
-  ASSERT_EQ(1u, observer.displays().size());
-  const mojom::FrameDecorationValuesPtr& values =
-      observer.displays()[0]->frame_decoration_values;
-  EXPECT_EQ(gfx::Insets(1, 2, 3, 4), values->normal_client_area_insets);
-  EXPECT_EQ(gfx::Insets(1, 2, 3, 4), values->maximized_client_area_insets);
-  EXPECT_EQ(55u, values->max_title_bar_button_width);
-}
-
-TEST(ScreenProviderTest, DisplaysSentOnConnection) {
-  // Use |test_setup| to configure aura and other state.
-  WindowServiceTestSetup test_setup;
-
-  // Create another WindowService.
-  TestWindowServiceDelegate test_window_service_delegate;
-  WindowService window_service(&test_window_service_delegate, nullptr,
-                               test_setup.focus_controller());
-
-  service_manager::TestConnectorFactory factory;
-  window_service.BindServiceRequest(
-      factory.RegisterInstance(mojom::kServiceName));
-
-  // Connect to |window_service| and ask for a new WindowTree.
-  mojom::WindowTreeFactoryPtr window_tree_factory;
-  factory.GetDefaultConnector()->BindInterface(mojom::kServiceName,
-                                               &window_tree_factory);
-  mojom::WindowTreePtr window_tree;
-  mojom::WindowTreeClientPtr client;
-  mojom::WindowTreeClientRequest client_request = MakeRequest(&client);
-  window_tree_factory->CreateWindowTree(MakeRequest(&window_tree),
-                                        std::move(client));
-
-  TestWindowTreeClient window_tree_client;
-  mojo::Binding<mojom::WindowTreeClient> binding(&window_tree_client);
-  binding.Bind(std::move(client_request));
-
-  // Wait for all mojo messages to be processed.
-  base::RunLoop().RunUntilIdle();
-
-  // Should have gotten display information.
-  EXPECT_FALSE(
-      window_tree_client.screen_provider_observer()->display_ids().empty());
-}
-
-}  // namespace
-}  // namespace ws
diff --git a/services/ws/test_change_tracker.cc b/services/ws/test_change_tracker.cc
deleted file mode 100644
index 3f8e056..0000000
--- a/services/ws/test_change_tracker.cc
+++ /dev/null
@@ -1,663 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/test_change_tracker.h"
-
-#include <stddef.h>
-
-#include "base/strings/pattern.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "mojo/public/cpp/bindings/map.h"
-#include "services/ws/common/util.h"
-#include "services/ws/ids.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/gfx/geometry/point_conversions.h"
-
-namespace ws {
-
-std::string WindowIdToString(Id id) {
-  return (id == 0) ? "null"
-                   : base::StringPrintf("%" PRIu32 ",%" PRIu32,
-                                        ClientIdFromTransportId(id),
-                                        ClientWindowIdFromTransportId(id));
-}
-
-namespace {
-
-std::string DirectionToString(mojom::OrderDirection direction) {
-  return direction == mojom::OrderDirection::ABOVE ? "above" : "below";
-}
-
-std::string OcclusionStateToString(
-    const base::Optional<mojom::OcclusionState>& occlusion_state) {
-  if (!occlusion_state.has_value()) {
-    NOTREACHED();
-    return "(null)";
-  }
-
-  switch (occlusion_state.value()) {
-    case mojom::OcclusionState::kUnknown:
-      return "UNKNOWN";
-    case mojom::OcclusionState::kVisible:
-      return "VISIBLE";
-    case mojom::OcclusionState::kOccluded:
-      return "OCCLUDED";
-    case mojom::OcclusionState::kHidden:
-      return "HIDDEN";
-  }
-
-  NOTREACHED();
-  return "UNKNOWN";
-}
-
-std::string OcclusionChangesToString(
-    const base::flat_map<Id, mojom::OcclusionState>& changes) {
-  std::string ret("{");
-  bool first = true;
-  for (const auto& change : changes) {
-    if (!first)
-      ret += ", ";
-
-    ret += std::string("{window_id=") + WindowIdToString(change.first) +
-           ", state=" + OcclusionStateToString(change.second) + "}";
-    first = false;
-  }
-  ret += "}";
-  return ret;
-}
-
-enum class ChangeDescriptionType { ONE, TWO };
-
-std::string ChangeToDescription(const Change& change,
-                                ChangeDescriptionType type) {
-  switch (change.type) {
-    case CHANGE_TYPE_EMBED:
-      if (type == ChangeDescriptionType::ONE)
-        return "OnEmbed";
-      return base::StringPrintf("OnEmbed drawn=%s",
-                                change.bool_value ? "true" : "false");
-
-    case CHANGE_TYPE_EMBED_FROM_TOKEN:
-      return base::StringPrintf("OnEmbedFromToken");
-
-    case CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED:
-      return base::StringPrintf("OnEmbeddedAppDisconnected window=%s",
-                                WindowIdToString(change.window_id).c_str());
-
-    case CHANGE_TYPE_UNEMBED:
-      return base::StringPrintf("OnUnembed window=%s",
-                                WindowIdToString(change.window_id).c_str());
-
-    case CHANGE_TYPE_CAPTURE_CHANGED:
-      return base::StringPrintf("OnCaptureChanged new_window=%s old_window=%s",
-                                WindowIdToString(change.window_id).c_str(),
-                                WindowIdToString(change.window_id2).c_str());
-
-    case CHANGE_TYPE_FRAME_SINK_ID_ALLOCATED:
-      return base::StringPrintf("OnFrameSinkIdAllocated window=%s %s",
-                                WindowIdToString(change.window_id).c_str(),
-                                change.frame_sink_id.ToString().c_str());
-
-    case CHANGE_TYPE_NODE_ADD_TRANSIENT_WINDOW:
-      return base::StringPrintf("AddTransientWindow parent = %s child = %s",
-                                WindowIdToString(change.window_id).c_str(),
-                                WindowIdToString(change.window_id2).c_str());
-
-    case CHANGE_TYPE_NODE_BOUNDS_CHANGED:
-      return base::StringPrintf(
-          "BoundsChanged window=%s bounds=%s "
-          "local_surface_id=%s",
-          WindowIdToString(change.window_id).c_str(),
-          change.bounds.ToString().c_str(),
-          change.local_surface_id_allocation
-              ? change.local_surface_id_allocation->local_surface_id()
-                    .ToString()
-                    .c_str()
-              : "(none)");
-
-    case CHANGE_TYPE_NODE_HIERARCHY_CHANGED:
-      return base::StringPrintf(
-          "HierarchyChanged window=%s old_parent=%s new_parent=%s",
-          WindowIdToString(change.window_id).c_str(),
-          WindowIdToString(change.window_id2).c_str(),
-          WindowIdToString(change.window_id3).c_str());
-
-    case CHANGE_TYPE_NODE_REMOVE_TRANSIENT_WINDOW_FROM_PARENT:
-      return base::StringPrintf(
-          "RemoveTransientWindowFromParent parent = %s child = %s",
-          WindowIdToString(change.window_id).c_str(),
-          WindowIdToString(change.window_id2).c_str());
-
-    case CHANGE_TYPE_NODE_REORDERED:
-      return base::StringPrintf("Reordered window=%s relative=%s direction=%s",
-                                WindowIdToString(change.window_id).c_str(),
-                                WindowIdToString(change.window_id2).c_str(),
-                                DirectionToString(change.direction).c_str());
-
-    case CHANGE_TYPE_NODE_DELETED:
-      return base::StringPrintf("WindowDeleted window=%s",
-                                WindowIdToString(change.window_id).c_str());
-
-    case CHANGE_TYPE_NODE_VISIBILITY_CHANGED:
-      return base::StringPrintf("VisibilityChanged window=%s visible=%s",
-                                WindowIdToString(change.window_id).c_str(),
-                                change.bool_value ? "true" : "false");
-
-    case CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED:
-      return base::StringPrintf("DrawnStateChanged window=%s drawn=%s",
-                                WindowIdToString(change.window_id).c_str(),
-                                change.bool_value ? "true" : "false");
-
-    case CHANGE_TYPE_INPUT_EVENT: {
-      std::string result = base::StringPrintf(
-          "InputEvent window=%s event_action=%d",
-          WindowIdToString(change.window_id).c_str(), change.event_action);
-      if (change.matches_event_observer)
-        result += " matches_event_observer";
-      return result;
-    }
-
-    case CHANGE_TYPE_OBSERVED_EVENT:
-      return base::StringPrintf("ObservedEvent event_action=%d",
-                                change.event_action);
-
-    case CHANGE_TYPE_PROPERTY_CHANGED:
-      return base::StringPrintf("PropertyChanged window=%s key=%s value=%s",
-                                WindowIdToString(change.window_id).c_str(),
-                                change.property_key.c_str(),
-                                change.property_value.c_str());
-
-    case CHANGE_TYPE_FOCUSED:
-      return base::StringPrintf("Focused id=%s",
-                                WindowIdToString(change.window_id).c_str());
-
-    case CHANGE_TYPE_CURSOR_CHANGED:
-      return base::StringPrintf("CursorChanged id=%s cursor_type=%d",
-                                WindowIdToString(change.window_id).c_str(),
-                                static_cast<int>(change.cursor_type));
-    case CHANGE_TYPE_ON_CHANGE_COMPLETED:
-      return base::StringPrintf("ChangeCompleted id=%d success=%s",
-                                change.change_id,
-                                change.bool_value ? "true" : "false");
-
-    case CHANGE_TYPE_ON_TOP_LEVEL_CREATED:
-      return base::StringPrintf("TopLevelCreated id=%d window_id=%s drawn=%s",
-                                change.change_id,
-                                WindowIdToString(change.window_id).c_str(),
-                                change.bool_value ? "true" : "false");
-    case CHANGE_TYPE_REQUEST_CLOSE:
-      return "RequestClose";
-    case CHANGE_TYPE_TRANSFORM_CHANGED:
-      return base::StringPrintf("TransformChanged window_id=%s",
-                                WindowIdToString(change.window_id).c_str());
-    case CHANGE_TYPE_DISPLAY_CHANGED:
-      return base::StringPrintf(
-          "DisplayChanged window_id=%s display_id=%s",
-          WindowIdToString(change.window_id).c_str(),
-          base::NumberToString(change.display_id).c_str());
-    case CHANGE_TYPE_DRAG_DROP_START:
-      return "DragDropStart";
-    case CHANGE_TYPE_DRAG_ENTER:
-      return base::StringPrintf("DragEnter window_id=%s",
-                                WindowIdToString(change.window_id).c_str());
-    case CHANGE_TYPE_DRAG_OVER:
-      return base::StringPrintf("DragOver window_id=%s",
-                                WindowIdToString(change.window_id).c_str());
-    case CHANGE_TYPE_DRAG_LEAVE:
-      return base::StringPrintf("DragLeave window_id=%s",
-                                WindowIdToString(change.window_id).c_str());
-    case CHANGE_TYPE_COMPLETE_DROP:
-      return base::StringPrintf("CompleteDrop window_id=%s",
-                                WindowIdToString(change.window_id).c_str());
-    case CHANGE_TYPE_DRAG_DROP_DONE:
-      return "DragDropDone";
-    case CHANGE_TYPE_TOPMOST_WINDOW_CHANGED:
-      return base::StringPrintf(
-          "TopmostWindowChanged window_id=%s window_id2=%s",
-          WindowIdToString(change.window_id).c_str(),
-          WindowIdToString(change.window_id2).c_str());
-    case CHANGE_TYPE_ON_PERFORM_DRAG_DROP_COMPLETED:
-      return base::StringPrintf(
-          "OnPerformDragDropCompleted id=%d success=%s action=%d",
-          change.change_id, change.bool_value ? "true" : "false",
-          change.drag_drop_action);
-    case CHANGE_TYPE_ON_OCCLUSION_STATES_CHANGED:
-      return base::StringPrintf(
-          "OnOcclusionStatesChanged %s",
-          OcclusionChangesToString(change.occlusion_changes).c_str());
-  }
-  return std::string();
-}
-
-std::string SingleChangeToDescriptionImpl(const std::vector<Change>& changes,
-                                          ChangeDescriptionType change_type) {
-  std::string result;
-  for (auto& change : changes) {
-    if (!result.empty())
-      result += "\n";
-    result += ChangeToDescription(change, change_type);
-  }
-  return result;
-}
-
-}  // namespace
-
-std::string ChangeToDescription(const Change& change) {
-  return ChangeToDescription(change, ChangeDescriptionType::ONE);
-}
-
-std::vector<std::string> ChangesToDescription1(
-    const std::vector<Change>& changes) {
-  std::vector<std::string> strings(changes.size());
-  for (size_t i = 0; i < changes.size(); ++i)
-    strings[i] = ChangeToDescription(changes[i], ChangeDescriptionType::ONE);
-  return strings;
-}
-
-std::string SingleChangeToDescription(const std::vector<Change>& changes) {
-  return SingleChangeToDescriptionImpl(changes, ChangeDescriptionType::ONE);
-}
-
-std::string SingleChangeToDescription2(const std::vector<Change>& changes) {
-  return SingleChangeToDescriptionImpl(changes, ChangeDescriptionType::TWO);
-}
-
-std::string SingleWindowDescription(const std::vector<TestWindow>& windows) {
-  if (windows.empty())
-    return "no windows";
-  std::string result;
-  for (const TestWindow& window : windows)
-    result += window.ToString();
-  return result;
-}
-
-std::string ChangeWindowDescription(const std::vector<Change>& changes) {
-  if (changes.size() != 1)
-    return std::string();
-  std::vector<std::string> window_strings(changes[0].windows.size());
-  for (size_t i = 0; i < changes[0].windows.size(); ++i)
-    window_strings[i] = "[" + changes[0].windows[i].ToString() + "]";
-  return base::JoinString(window_strings, ",");
-}
-
-TestWindow WindowDataToTestWindow(const mojom::WindowDataPtr& data) {
-  TestWindow window;
-  window.parent_id = data->parent_id;
-  window.window_id = data->window_id;
-  window.visible = data->visible;
-  window.properties = mojo::FlatMapToMap(data->properties);
-  window.bounds = data->bounds;
-  return window;
-}
-
-void WindowDatasToTestWindows(const std::vector<mojom::WindowDataPtr>& data,
-                              std::vector<TestWindow>* test_windows) {
-  for (size_t i = 0; i < data.size(); ++i)
-    test_windows->push_back(WindowDataToTestWindow(data[i]));
-}
-
-bool ContainsChange(const std::vector<Change>& changes,
-                    const std::string& change_description) {
-  for (auto& change : changes) {
-    if (base::MatchPattern(ChangeToDescription(change), change_description))
-      return true;
-  }
-  return false;
-}
-
-std::vector<Change>::const_iterator FirstChangeOfType(
-    const std::vector<Change>& changes,
-    ChangeType type) {
-  return std::find_if(
-      changes.begin(), changes.end(),
-      [&type](const Change& change) { return type == change.type; });
-}
-
-Change::Change() = default;
-
-Change::Change(const Change& other) = default;
-
-Change::~Change() = default;
-
-TestChangeTracker::TestChangeTracker() : delegate_(nullptr) {}
-
-TestChangeTracker::~TestChangeTracker() = default;
-
-void TestChangeTracker::OnEmbed(mojom::WindowDataPtr root, bool drawn) {
-  Change change;
-  change.type = CHANGE_TYPE_EMBED;
-  change.bool_value = drawn;
-  change.windows.push_back(WindowDataToTestWindow(root));
-  AddChange(change);
-}
-
-void TestChangeTracker::OnEmbedFromToken(
-    mojom::WindowDataPtr root,
-    int64_t display_id,
-    const base::Optional<viz::LocalSurfaceId>& local_surface_id) {
-  Change change;
-  change.type = CHANGE_TYPE_EMBED_FROM_TOKEN;
-  change.display_id = display_id;
-  change.windows.push_back(WindowDataToTestWindow(root));
-  AddChange(change);
-}
-
-void TestChangeTracker::OnEmbeddedAppDisconnected(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowBoundsChanged(
-    Id window_id,
-    const gfx::Rect& new_bounds,
-    ui::WindowShowState new_state,
-    const base::Optional<viz::LocalSurfaceIdAllocation>&
-        local_surface_id_allocation) {
-  Change change;
-  change.type = CHANGE_TYPE_NODE_BOUNDS_CHANGED;
-  change.window_id = window_id;
-  change.bounds = new_bounds;
-  change.state = new_state;
-  change.local_surface_id_allocation = local_surface_id_allocation;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowTransformChanged(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_TRANSFORM_CHANGED;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnUnembed(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_UNEMBED;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnTransientWindowAdded(Id window_id,
-                                               Id transient_window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_NODE_ADD_TRANSIENT_WINDOW;
-  change.window_id = window_id;
-  change.window_id2 = transient_window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnTransientWindowRemoved(Id window_id,
-                                                 Id transient_window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_NODE_REMOVE_TRANSIENT_WINDOW_FROM_PARENT;
-  change.window_id = window_id;
-  change.window_id2 = transient_window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnCaptureChanged(Id new_capture_window_id,
-                                         Id old_capture_window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_CAPTURE_CHANGED;
-  change.window_id = new_capture_window_id;
-  change.window_id2 = old_capture_window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnFrameSinkIdAllocated(
-    Id window_id,
-    const viz::FrameSinkId& frame_sink_id) {
-  Change change;
-  change.type = CHANGE_TYPE_FRAME_SINK_ID_ALLOCATED;
-  change.window_id = window_id;
-  change.frame_sink_id = frame_sink_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowHierarchyChanged(
-    Id window_id,
-    Id old_parent_id,
-    Id new_parent_id,
-    std::vector<mojom::WindowDataPtr> windows) {
-  Change change;
-  change.type = CHANGE_TYPE_NODE_HIERARCHY_CHANGED;
-  change.window_id = window_id;
-  change.window_id2 = old_parent_id;
-  change.window_id3 = new_parent_id;
-  WindowDatasToTestWindows(windows, &change.windows);
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowReordered(Id window_id,
-                                          Id relative_window_id,
-                                          mojom::OrderDirection direction) {
-  Change change;
-  change.type = CHANGE_TYPE_NODE_REORDERED;
-  change.window_id = window_id;
-  change.window_id2 = relative_window_id;
-  change.direction = direction;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowDeleted(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_NODE_DELETED;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowVisibilityChanged(Id window_id, bool visible) {
-  Change change;
-  change.type = CHANGE_TYPE_NODE_VISIBILITY_CHANGED;
-  change.window_id = window_id;
-  change.bool_value = visible;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowDisplayChanged(Id window_id,
-                                               int64_t display_id) {
-  Change change;
-  change.type = CHANGE_TYPE_DISPLAY_CHANGED;
-  change.window_id = window_id;
-  change.display_id = display_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowParentDrawnStateChanged(Id window_id,
-                                                        bool drawn) {
-  Change change;
-  change.type = CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED;
-  change.window_id = window_id;
-  change.bool_value = drawn;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowInputEvent(Id window_id,
-                                           const ui::Event& event,
-                                           int64_t display_id,
-                                           bool matches_event_observer) {
-  Change change;
-  change.type = CHANGE_TYPE_INPUT_EVENT;
-  change.window_id = window_id;
-  change.event_action = static_cast<int32_t>(event.type());
-  change.matches_event_observer = matches_event_observer;
-  change.display_id = display_id;
-  if (event.IsLocatedEvent())
-    change.location1 = event.AsLocatedEvent()->root_location();
-  if (event.IsKeyEvent() && event.AsKeyEvent()->properties())
-    change.key_event_properties = *event.AsKeyEvent()->properties();
-  AddChange(change);
-}
-
-void TestChangeTracker::OnObservedInputEvent(const ui::Event& event) {
-  Change change;
-  change.type = CHANGE_TYPE_OBSERVED_EVENT;
-  change.event_action = static_cast<int32_t>(event.type());
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowSharedPropertyChanged(
-    Id window_id,
-    const std::string& name,
-    const base::Optional<std::vector<uint8_t>>& data) {
-  Change change;
-  change.type = CHANGE_TYPE_PROPERTY_CHANGED;
-  change.window_id = window_id;
-  change.property_key = name;
-  if (!data)
-    change.property_value = "NULL";
-  else
-    change.property_value = base::HexEncode(data->data(), data->size());
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowFocused(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_FOCUSED;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnWindowCursorChanged(Id window_id,
-                                              const ui::Cursor& cursor) {
-  Change change;
-  change.type = CHANGE_TYPE_CURSOR_CHANGED;
-  change.window_id = window_id;
-  change.cursor_type = cursor.native_type();
-  AddChange(change);
-}
-
-void TestChangeTracker::OnChangeCompleted(uint32_t change_id, bool success) {
-  Change change;
-  change.type = CHANGE_TYPE_ON_CHANGE_COMPLETED;
-  change.change_id = change_id;
-  change.bool_value = success;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnTopLevelCreated(
-    uint32_t change_id,
-    mojom::WindowDataPtr window_data,
-    int64_t display_id,
-    bool drawn,
-    const viz::LocalSurfaceIdAllocation& local_surface_id_allocation) {
-  Change change;
-  change.type = CHANGE_TYPE_ON_TOP_LEVEL_CREATED;
-  change.change_id = change_id;
-  change.window_id = window_data->window_id;
-  change.display_id = display_id;
-  change.bool_value = drawn;
-  change.local_surface_id_allocation = local_surface_id_allocation;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnDragDropStart(
-    const base::flat_map<std::string, std::vector<uint8_t>>& drag_data) {
-  Change change;
-  change.type = CHANGE_TYPE_DRAG_DROP_START;
-  change.drag_data = drag_data;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnDragEnter(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_DRAG_ENTER;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnDragOver(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_DRAG_OVER;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnDragLeave(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_DRAG_LEAVE;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnCompleteDrop(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_COMPLETE_DROP;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnDragDropDone() {
-  Change change;
-  change.type = CHANGE_TYPE_DRAG_DROP_DONE;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnTopmostWindowChanged(
-    const std::vector<Id>& topmost_ids) {
-  DCHECK_LE(topmost_ids.size(), 2u);
-  Change change;
-  change.type = CHANGE_TYPE_TOPMOST_WINDOW_CHANGED;
-  change.window_id =
-      (topmost_ids.size() > 0) ? topmost_ids[0] : kInvalidTransportId;
-  change.window_id2 =
-      (topmost_ids.size() > 1) ? topmost_ids[1] : kInvalidTransportId;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnPerformDragDropCompleted(uint32_t change_id,
-                                                   bool success,
-                                                   uint32_t action_taken) {
-  Change change;
-  change.type = CHANGE_TYPE_ON_PERFORM_DRAG_DROP_COMPLETED;
-  change.change_id = change_id;
-  change.bool_value = success;
-  change.drag_drop_action = action_taken;
-  AddChange(change);
-}
-
-void TestChangeTracker::RequestClose(Id window_id) {
-  Change change;
-  change.type = CHANGE_TYPE_REQUEST_CLOSE;
-  change.window_id = window_id;
-  AddChange(change);
-}
-
-void TestChangeTracker::OnOcclusionStatesChanged(
-    const base::flat_map<Id, mojom::OcclusionState>& occlusion_changes) {
-  Change change;
-  change.type = CHANGE_TYPE_ON_OCCLUSION_STATES_CHANGED;
-  change.occlusion_changes = occlusion_changes;
-  AddChange(change);
-}
-
-void TestChangeTracker::AddChange(const Change& change) {
-  changes_.push_back(change);
-  if (delegate_)
-    delegate_->OnChangeAdded();
-}
-
-TestWindow::TestWindow() = default;
-
-TestWindow::TestWindow(const TestWindow& other) = default;
-
-TestWindow::~TestWindow() = default;
-
-std::string TestWindow::ToString() const {
-  return base::StringPrintf("window=%s parent=%s",
-                            WindowIdToString(window_id).c_str(),
-                            WindowIdToString(parent_id).c_str());
-}
-
-std::string TestWindow::ToString2() const {
-  return base::StringPrintf(
-      "window=%s parent=%s visible=%s", WindowIdToString(window_id).c_str(),
-      WindowIdToString(parent_id).c_str(), visible ? "true" : "false");
-}
-
-}  // namespace ws
diff --git a/services/ws/test_change_tracker.h b/services/ws/test_change_tracker.h
deleted file mode 100644
index cf6be0e..0000000
--- a/services/ws/test_change_tracker.h
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TEST_CHANGE_TRACKER_H_
-#define SERVICES_WS_TEST_CHANGE_TRACKER_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/containers/flat_map.h"
-#include "base/macros.h"
-#include "base/optional.h"
-#include "services/ws/common/types.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "ui/gfx/geometry/mojo/geometry.mojom.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/point_f.h"
-
-namespace ws {
-
-enum ChangeType {
-  CHANGE_TYPE_CAPTURE_CHANGED,
-  CHANGE_TYPE_FRAME_SINK_ID_ALLOCATED,
-  CHANGE_TYPE_EMBED,
-  CHANGE_TYPE_EMBED_FROM_TOKEN,
-  CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED,
-  CHANGE_TYPE_UNEMBED,
-  // TODO(sky): nuke NODE.
-  CHANGE_TYPE_NODE_ADD_TRANSIENT_WINDOW,
-  CHANGE_TYPE_NODE_BOUNDS_CHANGED,
-  CHANGE_TYPE_NODE_HIERARCHY_CHANGED,
-  CHANGE_TYPE_NODE_REMOVE_TRANSIENT_WINDOW_FROM_PARENT,
-  CHANGE_TYPE_NODE_REORDERED,
-  CHANGE_TYPE_NODE_VISIBILITY_CHANGED,
-  CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED,
-  CHANGE_TYPE_NODE_DELETED,
-  CHANGE_TYPE_INPUT_EVENT,
-  CHANGE_TYPE_OBSERVED_EVENT,
-  CHANGE_TYPE_PROPERTY_CHANGED,
-  CHANGE_TYPE_FOCUSED,
-  CHANGE_TYPE_CURSOR_CHANGED,
-  CHANGE_TYPE_ON_CHANGE_COMPLETED,
-  CHANGE_TYPE_ON_TOP_LEVEL_CREATED,
-  CHANGE_TYPE_REQUEST_CLOSE,
-  CHANGE_TYPE_TRANSFORM_CHANGED,
-  CHANGE_TYPE_DISPLAY_CHANGED,
-  CHANGE_TYPE_DRAG_DROP_START,
-  CHANGE_TYPE_DRAG_ENTER,
-  CHANGE_TYPE_DRAG_OVER,
-  CHANGE_TYPE_DRAG_LEAVE,
-  CHANGE_TYPE_COMPLETE_DROP,
-  CHANGE_TYPE_DRAG_DROP_DONE,
-  CHANGE_TYPE_TOPMOST_WINDOW_CHANGED,
-  CHANGE_TYPE_ON_PERFORM_DRAG_DROP_COMPLETED,
-  CHANGE_TYPE_ON_OCCLUSION_STATES_CHANGED,
-};
-
-// TODO(sky): consider nuking and converting directly to WindowData.
-struct TestWindow {
-  TestWindow();
-  TestWindow(const TestWindow& other);
-  ~TestWindow();
-
-  // Returns a string description of this.
-  std::string ToString() const;
-
-  // Returns a string description that includes visible and drawn.
-  std::string ToString2() const;
-
-  Id parent_id = 0;
-  Id window_id = 0;
-  bool visible = false;
-  gfx::Rect bounds;
-  std::map<std::string, std::vector<uint8_t>> properties;
-};
-
-// Tracks a call to WindowTreeClient. See the individual functions for the
-// fields that are used.
-struct Change {
-  Change();
-  Change(const Change& other);
-  ~Change();
-
-  ChangeType type = CHANGE_TYPE_EMBED;
-  std::vector<TestWindow> windows;
-  Id window_id = 0;
-  Id window_id2 = 0;
-  Id window_id3 = 0;
-  gfx::Rect bounds;
-  ui::WindowShowState state;
-  viz::FrameSinkId frame_sink_id;
-  base::Optional<viz::LocalSurfaceIdAllocation> local_surface_id_allocation;
-  int32_t event_action = 0;
-  bool matches_event_observer = false;
-  std::string embed_url;
-  mojom::OrderDirection direction;
-  bool bool_value = false;
-  std::string property_key;
-  std::string property_value;
-  ui::CursorType cursor_type = ui::CursorType::kNull;
-  uint32_t change_id = 0u;
-  gfx::Transform transform;
-  // Set in OnWindowInputEvent() if the event is a KeyEvent.
-  base::flat_map<std::string, std::vector<uint8_t>> key_event_properties;
-  int64_t display_id = 0;
-  gfx::Point location1;
-  base::flat_map<std::string, std::vector<uint8_t>> drag_data;
-  uint32_t drag_drop_action = 0u;
-  base::flat_map<Id, mojom::OcclusionState> occlusion_changes;
-};
-
-// The ChangeToDescription related functions convert a Change into a string.
-// To avoid updating all tests as more descriptive strings are added, new
-// variants are added and identified with a numeric suffix. Differences
-// between versions:
-// 1 and no suffix is the original version.
-// 2: OnEmbed() includes the boolean value supplied to OnEmbed().
-
-std::string ChangeToDescription(const Change& change);
-
-// Converts Changes to string descriptions.
-std::vector<std::string> ChangesToDescription1(
-    const std::vector<Change>& changes);
-
-// Convenience for returning the description of the first item in |changes|.
-// Returns an empty string if |changes| has something other than one entry.
-std::string SingleChangeToDescription(const std::vector<Change>& changes);
-
-std::string SingleChangeToDescription2(const std::vector<Change>& changes);
-
-// Convenience for returning the description of the first item in |windows|.
-// Returns an empty string if |windows| has something other than one entry.
-std::string SingleWindowDescription(const std::vector<TestWindow>& windows);
-
-// Returns a string description of |changes[0].windows|. Returns an empty string
-// if change.size() != 1.
-std::string ChangeWindowDescription(const std::vector<Change>& changes);
-
-// Converts WindowDatas to TestWindows.
-void WindowDatasToTestWindows(const std::vector<mojom::WindowDataPtr>& data,
-                              std::vector<TestWindow>* test_windows);
-
-// Returns true if |changes| contains a Change matching |change_description|.
-// |change_description| is a pattern which should be compared with
-// base::MatchPattern (see base/strings/pattern.h for the details).
-bool ContainsChange(const std::vector<Change>& changes,
-                    const std::string& change_description);
-
-std::vector<Change>::const_iterator FirstChangeOfType(
-    const std::vector<Change>& changes,
-    ChangeType type);
-
-// TestChangeTracker is used to record WindowTreeClient functions. It notifies
-// a delegate any time a change is added.
-class TestChangeTracker {
- public:
-  // Used to notify the delegate when a change is added. A change corresponds to
-  // a single WindowTreeClient function.
-  class Delegate {
-   public:
-    virtual void OnChangeAdded() = 0;
-
-   protected:
-    virtual ~Delegate() {}
-  };
-
-  TestChangeTracker();
-  ~TestChangeTracker();
-
-  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
-
-  std::vector<Change>* changes() { return &changes_; }
-
-  // Each of these functions generate a Change. There is one per
-  // WindowTreeClient function.
-  void OnEmbed(mojom::WindowDataPtr root, bool drawn);
-  void OnEmbedFromToken(
-      mojom::WindowDataPtr root,
-      int64_t display_id,
-      const base::Optional<viz::LocalSurfaceId>& local_surface_id);
-  void OnEmbeddedAppDisconnected(Id window_id);
-  void OnUnembed(Id window_id);
-  void OnCaptureChanged(Id new_capture_window_id, Id old_capture_window_id);
-  void OnFrameSinkIdAllocated(Id window_id,
-                              const viz::FrameSinkId& frame_sink_id);
-  void OnTransientWindowAdded(Id window_id, Id transient_window_id);
-  void OnTransientWindowRemoved(Id window_id, Id transient_window_id);
-  void OnWindowBoundsChanged(
-      Id window_id,
-      const gfx::Rect& new_bounds,
-      ui::WindowShowState state,
-      const base::Optional<viz::LocalSurfaceIdAllocation>&
-          local_surface_id_allocation);
-  void OnWindowTransformChanged(Id window_id);
-  void OnWindowHierarchyChanged(Id window_id,
-                                Id old_parent_id,
-                                Id new_parent_id,
-                                std::vector<mojom::WindowDataPtr> windows);
-  void OnWindowReordered(Id window_id,
-                         Id relative_window_id,
-                         mojom::OrderDirection direction);
-  void OnWindowDeleted(Id window_id);
-  void OnWindowVisibilityChanged(Id window_id, bool visible);
-  void OnWindowDisplayChanged(Id window_id, int64_t display_id);
-  void OnWindowParentDrawnStateChanged(Id window_id, bool drawn);
-  void OnWindowInputEvent(Id window_id,
-                          const ui::Event& event,
-                          int64_t display_id,
-                          bool matches_event_observer);
-  void OnObservedInputEvent(const ui::Event& event);
-  void OnPointerEventObserved(const ui::Event& event, Id window_id);
-  void OnWindowSharedPropertyChanged(
-      Id window_id,
-      const std::string& name,
-      const base::Optional<std::vector<uint8_t>>& data);
-  void OnWindowFocused(Id window_id);
-  void OnWindowCursorChanged(Id window_id, const ui::Cursor& cursor);
-  void OnChangeCompleted(uint32_t change_id, bool success);
-  void OnTopLevelCreated(
-      uint32_t change_id,
-      mojom::WindowDataPtr window_data,
-      int64_t display_id,
-      bool drawn,
-      const viz::LocalSurfaceIdAllocation& local_surface_id_allocation);
-  void OnDragDropStart(
-      const base::flat_map<std::string, std::vector<uint8_t>>& drag_data);
-  void OnDragEnter(Id window_id);
-  void OnDragOver(Id window_id);
-  void OnDragLeave(Id widnow_id);
-  void OnCompleteDrop(Id window_id);
-  void OnDragDropDone();
-  void OnTopmostWindowChanged(const std::vector<Id>& topmost_ids);
-  void OnPerformDragDropCompleted(uint32_t change_id,
-                                  bool success,
-                                  uint32_t action_taken);
-  void RequestClose(Id window_id);
-  void OnOcclusionStatesChanged(
-      const base::flat_map<Id, mojom::OcclusionState>& occlusion_changes);
-
- private:
-  void AddChange(const Change& change);
-
-  Delegate* delegate_;
-  std::vector<Change> changes_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestChangeTracker);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_TEST_CHANGE_TRACKER_H_
diff --git a/services/ws/test_screen_provider_observer.cc b/services/ws/test_screen_provider_observer.cc
deleted file mode 100644
index 929daf1..0000000
--- a/services/ws/test_screen_provider_observer.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "services/ws/test_screen_provider_observer.h"
-
-#include "base/strings/string_number_conversions.h"
-
-namespace ws {
-namespace {
-
-std::string DisplayIdsToString(
-    const std::vector<mojom::WsDisplayPtr>& wm_displays) {
-  std::string display_ids;
-  for (const auto& wm_display : wm_displays) {
-    if (!display_ids.empty())
-      display_ids += " ";
-    display_ids += base::NumberToString(wm_display->display.id());
-  }
-  return display_ids;
-}
-
-}  // namespace
-
-TestScreenProviderObserver::TestScreenProviderObserver() = default;
-
-TestScreenProviderObserver::~TestScreenProviderObserver() = default;
-
-void TestScreenProviderObserver::OnDisplaysChanged(
-    std::vector<mojom::WsDisplayPtr> displays,
-    int64_t primary_display_id,
-    int64_t internal_display_id,
-    int64_t display_id_for_new_windows) {
-  displays_ = std::move(displays);
-  display_ids_ = DisplayIdsToString(displays_);
-  primary_display_id_ = primary_display_id;
-  internal_display_id_ = internal_display_id;
-  display_id_for_new_windows_ = display_id_for_new_windows;
-}
-
-}  // namespace ws
diff --git a/services/ws/test_screen_provider_observer.h b/services/ws/test_screen_provider_observer.h
deleted file mode 100644
index b26113d4..0000000
--- a/services/ws/test_screen_provider_observer.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TEST_SCREEN_PROVIDER_OBSERVER_H_
-#define SERVICES_WS_TEST_SCREEN_PROVIDER_OBSERVER_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "services/ws/public/mojom/screen_provider_observer.mojom.h"
-#include "services/ws/window_service_delegate.h"
-#include "ui/display/types/display_constants.h"
-#include "ui/events/event.h"
-
-namespace ws {
-
-// Test implementation of ScreenProviderObserver. Tracks most recent call to
-// OnDisplaysChanged().
-class TestScreenProviderObserver : public mojom::ScreenProviderObserver {
- public:
-  TestScreenProviderObserver();
-  ~TestScreenProviderObserver() override;
-
-  std::vector<mojom::WsDisplayPtr>& displays() { return displays_; }
-  std::string& display_ids() { return display_ids_; }
-  int64_t primary_display_id() const { return primary_display_id_; }
-  int64_t internal_display_id() const { return internal_display_id_; }
-  int64_t display_id_for_new_windows() const {
-    return display_id_for_new_windows_;
-  }
-
-  // mojom::ScreenProviderObserver:
-  void OnDisplaysChanged(std::vector<mojom::WsDisplayPtr> displays,
-                         int64_t primary_display_id,
-                         int64_t internal_display_id,
-                         int64_t display_id_for_new_windows) override;
-
- private:
-  std::vector<mojom::WsDisplayPtr> displays_;
-  std::string display_ids_;
-  int64_t primary_display_id_ = display::kInvalidDisplayId;
-  int64_t internal_display_id_ = display::kInvalidDisplayId;
-  int64_t display_id_for_new_windows_ = display::kInvalidDisplayId;
-
-  DISALLOW_COPY_AND_ASSIGN(TestScreenProviderObserver);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_TEST_SCREEN_PROVIDER_OBSERVER_H_
diff --git a/services/ws/test_window_service_delegate.cc b/services/ws/test_window_service_delegate.cc
deleted file mode 100644
index 3b387d18..0000000
--- a/services/ws/test_window_service_delegate.cc
+++ /dev/null
@@ -1,103 +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.
-
-#include "services/ws/test_window_service_delegate.h"
-
-#include "ui/aura/mus/property_converter.h"
-#include "ui/aura/window.h"
-#include "ui/display/screen.h"
-
-namespace ws {
-
-TestWindowServiceDelegate::TestWindowServiceDelegate(
-    aura::Window* top_level_parent)
-    : top_level_parent_(top_level_parent) {}
-
-TestWindowServiceDelegate::~TestWindowServiceDelegate() = default;
-
-WindowServiceDelegate::DoneCallback
-TestWindowServiceDelegate::TakeMoveLoopCallback() {
-  return std::move(move_loop_callback_);
-}
-
-WindowServiceDelegate::DragDropCompletedCallback
-TestWindowServiceDelegate::TakeDragLoopCallback() {
-  return std::move(drag_loop_callback_);
-}
-
-std::unique_ptr<aura::Window> TestWindowServiceDelegate::NewTopLevel(
-    TopLevelProxyWindow* top_level_proxy_window,
-    aura::PropertyConverter* property_converter,
-    const base::flat_map<std::string, std::vector<uint8_t>>& properties) {
-  std::unique_ptr<aura::Window> window =
-      std::make_unique<aura::Window>(delegate_for_next_top_level_);
-  delegate_for_next_top_level_ = nullptr;
-  window->Init(ui::LAYER_NOT_DRAWN);
-  if (top_level_parent_)
-    top_level_parent_->AddChild(window.get());
-  for (auto property : properties) {
-    property_converter->SetPropertyFromTransportValue(
-        window.get(), property.first, &property.second);
-  }
-  return window;
-}
-
-void TestWindowServiceDelegate::OnUnhandledKeyEvent(
-    const ui::KeyEvent& key_event) {
-  unhandled_key_events_.push_back(key_event);
-}
-
-void TestWindowServiceDelegate::RunWindowMoveLoop(aura::Window* window,
-                                                  mojom::MoveLoopSource source,
-                                                  const gfx::Point& cursor,
-                                                  int window_component,
-                                                  DoneCallback callback) {
-  move_loop_callback_ = std::move(callback);
-}
-
-void TestWindowServiceDelegate::CancelWindowMoveLoop() {
-  cancel_window_move_loop_called_ = true;
-}
-
-void TestWindowServiceDelegate::RunDragLoop(
-    aura::Window* window,
-    const ui::OSExchangeData& data,
-    const gfx::Point& screen_location,
-    uint32_t drag_operation,
-    ui::DragDropTypes::DragEventSource source,
-    DragDropCompletedCallback callback) {
-  drag_loop_callback_ = std::move(callback);
-}
-
-void TestWindowServiceDelegate::CancelDragLoop(aura::Window* window) {
-  cancel_drag_loop_called_ = true;
-}
-
-ui::EventTarget* TestWindowServiceDelegate::GetGlobalEventTarget() {
-  return top_level_parent_->GetRootWindow();
-}
-
-aura::Window* TestWindowServiceDelegate::GetRootWindowForDisplayId(
-    int64_t display_id) {
-  if (display::Screen::GetScreen()->GetAllDisplays().size() > 1)
-    NOTIMPLEMENTED_LOG_ONCE() << "Add test support for multiple displays.";
-  return top_level_parent_->GetRootWindow();
-}
-
-aura::Window* TestWindowServiceDelegate::GetTopmostWindowAtPoint(
-    const gfx::Point& location_in_screen,
-    const std::set<aura::Window*>& ignore,
-    aura::Window** real_topmost) {
-  if (real_topmost)
-    *real_topmost = real_topmost_;
-  return topmost_;
-}
-
-void TestWindowServiceDelegate::ConnectToImeEngine(
-    ime::mojom::ImeEngineRequest engine_request,
-    ime::mojom::ImeEngineClientPtr client) {
-  ime_engine_connected_ = true;
-}
-
-}  // namespace ws
diff --git a/services/ws/test_window_service_delegate.h b/services/ws/test_window_service_delegate.h
deleted file mode 100644
index c27d046..0000000
--- a/services/ws/test_window_service_delegate.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TEST_WINDOW_SERVICE_DELEGATE_H_
-#define SERVICES_WS_TEST_WINDOW_SERVICE_DELEGATE_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "services/ws/window_service_delegate.h"
-#include "ui/events/event.h"
-
-namespace aura {
-class WindowDelegate;
-}
-
-namespace ws {
-
-class TestWindowServiceDelegate : public WindowServiceDelegate {
- public:
-  // |top_level_parent| is the parent of new top-levels. If null, top-levels
-  // have no parent.
-  explicit TestWindowServiceDelegate(aura::Window* top_level_parent = nullptr);
-  ~TestWindowServiceDelegate() override;
-
-  void set_top_level_parent(aura::Window* parent) {
-    top_level_parent_ = parent;
-  }
-
-  void set_delegate_for_next_top_level(aura::WindowDelegate* delegate) {
-    delegate_for_next_top_level_ = delegate;
-  }
-
-  std::vector<ui::KeyEvent>* unhandled_key_events() {
-    return &unhandled_key_events_;
-  }
-
-  bool cancel_window_move_loop_called() const {
-    return cancel_window_move_loop_called_;
-  }
-
-  DoneCallback TakeMoveLoopCallback();
-
-  bool cancel_drag_loop_called() const { return cancel_drag_loop_called_; }
-
-  void set_topmost(aura::Window* window) { topmost_ = window; }
-  void set_real_topmost(aura::Window* window) { real_topmost_ = window; }
-
-  bool ime_engine_connected() const { return ime_engine_connected_; }
-
-  DragDropCompletedCallback TakeDragLoopCallback();
-
-  // WindowServiceDelegate:
-  std::unique_ptr<aura::Window> NewTopLevel(
-      TopLevelProxyWindow* top_level_proxy_window,
-      aura::PropertyConverter* property_converter,
-      const base::flat_map<std::string, std::vector<uint8_t>>& properties)
-      override;
-  void OnUnhandledKeyEvent(const ui::KeyEvent& key_event) override;
-  void RunWindowMoveLoop(aura::Window* window,
-                         mojom::MoveLoopSource source,
-                         const gfx::Point& cursor,
-                         int window_component,
-                         DoneCallback callback) override;
-  void CancelWindowMoveLoop() override;
-  void RunDragLoop(aura::Window* window,
-                   const ui::OSExchangeData& data,
-                   const gfx::Point& screen_location,
-                   uint32_t drag_operation,
-                   ui::DragDropTypes::DragEventSource source,
-                   DragDropCompletedCallback callback) override;
-  void CancelDragLoop(aura::Window* window) override;
-  ui::EventTarget* GetGlobalEventTarget() override;
-  aura::Window* GetRootWindowForDisplayId(int64_t display_id) override;
-  aura::Window* GetTopmostWindowAtPoint(const gfx::Point& location_in_screen,
-                                        const std::set<aura::Window*>& ignore,
-                                        aura::Window** real_topmost) override;
-  void ConnectToImeEngine(ime::mojom::ImeEngineRequest engine_request,
-                          ime::mojom::ImeEngineClientPtr client) override;
-
- private:
-  aura::Window* top_level_parent_;
-  aura::WindowDelegate* delegate_for_next_top_level_ = nullptr;
-
-  // Callback supplied to RunWindowMoveLoop() is set here.
-  DoneCallback move_loop_callback_;
-
-  // Callback supplied to RunDragLoop() is set here.
-  DragDropCompletedCallback drag_loop_callback_;
-
-  // Events passed to OnUnhandledKeyEvent() are added here.
-  std::vector<ui::KeyEvent> unhandled_key_events_;
-
-  bool cancel_window_move_loop_called_ = false;
-  bool cancel_drag_loop_called_ = false;
-
-  aura::Window* topmost_ = nullptr;
-  aura::Window* real_topmost_ = nullptr;
-
-  bool ime_engine_connected_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(TestWindowServiceDelegate);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_TEST_WINDOW_SERVICE_DELEGATE_H_
diff --git a/services/ws/test_window_tree_client.cc b/services/ws/test_window_tree_client.cc
deleted file mode 100644
index 838300b..0000000
--- a/services/ws/test_window_tree_client.cc
+++ /dev/null
@@ -1,301 +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.
-
-#include "services/ws/test_window_tree_client.h"
-
-#include <utility>
-
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "ui/aura/window.h"
-#include "ui/gfx/geometry/rect.h"
-
-namespace ws {
-
-TestWindowTreeClient::InputEvent::InputEvent() = default;
-
-TestWindowTreeClient::InputEvent::InputEvent(InputEvent&& other) = default;
-
-TestWindowTreeClient::InputEvent::~InputEvent() = default;
-
-TestWindowTreeClient::TestWindowTreeClient() {
-  tracker_.set_delegate(this);
-}
-
-TestWindowTreeClient::~TestWindowTreeClient() = default;
-
-TestWindowTreeClient::InputEvent TestWindowTreeClient::PopInputEvent() {
-  if (input_events_.empty())
-    return InputEvent();
-
-  InputEvent event = std::move(input_events_.front());
-  input_events_.pop();
-  return event;
-}
-
-void TestWindowTreeClient::ClearInputEvents() {
-  input_events_ = std::queue<InputEvent>();
-}
-
-std::unique_ptr<ui::Event> TestWindowTreeClient::PopObservedEvent() {
-  if (observed_events_.empty())
-    return nullptr;
-
-  std::unique_ptr<ui::Event> event = std::move(observed_events_.front());
-  observed_events_.pop();
-  return event;
-}
-
-void TestWindowTreeClient::SetWindowTree(mojom::WindowTreePtr tree) {
-  DCHECK(!tree_);
-  tree_ = std::move(tree);
-}
-
-bool TestWindowTreeClient::AckFirstEvent(WindowTree* tree,
-                                         mojom::EventResult result) {
-  if (input_events_.empty())
-    return false;
-  InputEvent input_event = PopInputEvent();
-  WindowTreeTestHelper(tree).OnWindowInputEventAck(input_event.event_id,
-                                                   result);
-  return true;
-}
-
-void TestWindowTreeClient::OnChangeAdded() {}
-
-void TestWindowTreeClient::OnClientId(uint32_t client_id) {}
-
-void TestWindowTreeClient::OnEmbed(
-    mojom::WindowDataPtr root,
-    mojom::WindowTreePtr tree,
-    int64_t display_id,
-    Id focused_window_id,
-    bool drawn,
-    const base::Optional<viz::LocalSurfaceIdAllocation>&
-        local_surface_id_allocation) {
-  root_window_id_ = root->window_id;
-  tree_ = std::move(tree);
-  tracker_.OnEmbed(std::move(root), drawn);
-}
-
-void TestWindowTreeClient::OnEmbedFromToken(
-    const base::UnguessableToken& token,
-    mojom::WindowDataPtr root,
-    int64_t display_id,
-    const base::Optional<viz::LocalSurfaceIdAllocation>&
-        local_surface_id_allocation) {
-  tracker_.OnEmbedFromToken(
-      std::move(root), display_id,
-      local_surface_id_allocation
-          ? local_surface_id_allocation->local_surface_id()
-          : viz::LocalSurfaceId());
-}
-
-void TestWindowTreeClient::OnEmbeddedAppDisconnected(Id window_id) {
-  tracker_.OnEmbeddedAppDisconnected(window_id);
-}
-
-void TestWindowTreeClient::OnUnembed(Id window_id) {
-  tracker_.OnUnembed(window_id);
-}
-
-void TestWindowTreeClient::OnCaptureChanged(Id new_capture_window_id,
-                                            Id old_capture_window_id) {
-  tracker_.OnCaptureChanged(new_capture_window_id, old_capture_window_id);
-}
-
-void TestWindowTreeClient::OnFrameSinkIdAllocated(
-    Id window_id,
-    const viz::FrameSinkId& frame_sink_id) {
-  tracker_.OnFrameSinkIdAllocated(window_id, frame_sink_id);
-}
-
-void TestWindowTreeClient::OnTopLevelCreated(
-    uint32_t change_id,
-    mojom::WindowDataPtr data,
-    int64_t display_id,
-    bool drawn,
-    const viz::LocalSurfaceIdAllocation& local_surface_id_allocation) {
-  tracker_.OnTopLevelCreated(change_id, std::move(data), display_id, drawn,
-                             local_surface_id_allocation);
-}
-
-void TestWindowTreeClient::OnWindowBoundsChanged(
-    Id window_id,
-    const gfx::Rect& new_bounds,
-    ui::WindowShowState state,
-    const base::Optional<viz::LocalSurfaceIdAllocation>&
-        local_surface_id_allocation) {
-  // The bounds of the root may change during startup on Android at random
-  // times. As this doesn't matter, and shouldn't impact test exepctations,
-  // it is ignored.
-  if (window_id == root_window_id_ && !track_root_bounds_changes_)
-    return;
-  tracker_.OnWindowBoundsChanged(window_id, new_bounds, state,
-                                 local_surface_id_allocation);
-}
-
-void TestWindowTreeClient::OnWindowTransformChanged(
-    Id window_id,
-    const gfx::Transform& new_transform) {
-  tracker_.OnWindowTransformChanged(window_id);
-}
-
-void TestWindowTreeClient::OnTransientWindowAdded(Id window_id,
-                                                  Id transient_window_id) {
-  tracker_.OnTransientWindowAdded(window_id, transient_window_id);
-}
-
-void TestWindowTreeClient::OnTransientWindowRemoved(Id window_id,
-                                                    Id transient_window_id) {
-  tracker_.OnTransientWindowRemoved(window_id, transient_window_id);
-}
-
-void TestWindowTreeClient::OnWindowHierarchyChanged(
-    Id window,
-    Id old_parent,
-    Id new_parent,
-    std::vector<mojom::WindowDataPtr> windows) {
-  tracker_.OnWindowHierarchyChanged(window, old_parent, new_parent,
-                                    std::move(windows));
-}
-
-void TestWindowTreeClient::OnWindowReordered(Id window_id,
-                                             Id relative_window_id,
-                                             mojom::OrderDirection direction) {
-  tracker_.OnWindowReordered(window_id, relative_window_id, direction);
-}
-
-void TestWindowTreeClient::OnWindowDeleted(Id window) {
-  tracker_.OnWindowDeleted(window);
-}
-
-void TestWindowTreeClient::OnWindowVisibilityChanged(Id window, bool visible) {
-  tracker_.OnWindowVisibilityChanged(window, visible);
-}
-
-void TestWindowTreeClient::OnWindowDisplayChanged(Id window_id,
-                                                  int64_t display_id) {
-  tracker_.OnWindowDisplayChanged(window_id, display_id);
-}
-
-void TestWindowTreeClient::OnWindowParentDrawnStateChanged(Id window,
-                                                           bool drawn) {
-  tracker_.OnWindowParentDrawnStateChanged(window, drawn);
-}
-
-void TestWindowTreeClient::OnWindowInputEvent(uint32_t event_id,
-                                              Id window_id,
-                                              int64_t display_id,
-                                              std::unique_ptr<ui::Event> event,
-                                              bool matches_event_observer) {
-  tracker_.OnWindowInputEvent(window_id, *event, display_id,
-                              matches_event_observer);
-
-  InputEvent input_event;
-  input_event.event_id = event_id;
-  input_event.window_id = window_id;
-  input_event.display_id = display_id;
-  input_event.event = std::move(event);
-  input_event.matches_event_observer = matches_event_observer;
-  input_events_.push(std::move(input_event));
-
-  if (tree_)
-    tree_->OnWindowInputEventAck(event_id, mojom::EventResult::HANDLED);
-}
-
-void TestWindowTreeClient::OnObservedInputEvent(
-    std::unique_ptr<ui::Event> event) {
-  tracker_.OnObservedInputEvent(*event);
-  observed_events_.push(std::move(event));
-}
-
-void TestWindowTreeClient::OnWindowSharedPropertyChanged(
-    Id window,
-    const std::string& name,
-    const base::Optional<std::vector<uint8_t>>& new_data) {
-  tracker_.OnWindowSharedPropertyChanged(window, name, new_data);
-}
-
-void TestWindowTreeClient::OnWindowFocused(Id focused_window_id) {
-  tracker_.OnWindowFocused(focused_window_id);
-}
-
-void TestWindowTreeClient::OnWindowCursorChanged(Id window_id,
-                                                 ui::Cursor cursor) {
-  tracker_.OnWindowCursorChanged(window_id, cursor);
-}
-
-void TestWindowTreeClient::OnDragDropStart(
-    const base::flat_map<std::string, std::vector<uint8_t>>& drag_data) {
-  tracker_.OnDragDropStart(drag_data);
-}
-
-void TestWindowTreeClient::OnDragEnter(Id window,
-                                       uint32_t key_state,
-                                       const gfx::PointF& location_in_root,
-                                       const gfx::PointF& location,
-                                       uint32_t effect_bitmask,
-                                       OnDragEnterCallback callback) {
-  tracker_.OnDragEnter(window);
-}
-
-void TestWindowTreeClient::OnDragOver(Id window,
-                                      uint32_t key_state,
-                                      const gfx::PointF& location_in_root,
-                                      const gfx::PointF& location,
-                                      uint32_t effect_bitmask,
-                                      OnDragOverCallback callback) {
-  tracker_.OnDragOver(window);
-}
-
-void TestWindowTreeClient::OnDragLeave(Id window) {
-  tracker_.OnDragLeave(window);
-}
-
-void TestWindowTreeClient::OnCompleteDrop(Id window,
-                                          uint32_t key_state,
-                                          const gfx::PointF& location_in_root,
-                                          const gfx::PointF& location,
-                                          uint32_t effect_bitmask,
-                                          OnCompleteDropCallback callback) {
-  tracker_.OnCompleteDrop(window);
-}
-
-void TestWindowTreeClient::OnPerformDragDropCompleted(uint32_t change_id,
-                                                      bool success,
-                                                      uint32_t action_taken) {
-  tracker_.OnPerformDragDropCompleted(change_id, success, action_taken);
-}
-
-void TestWindowTreeClient::OnDragDropDone() {
-  tracker_.OnDragDropDone();
-}
-
-void TestWindowTreeClient::OnTopmostWindowChanged(
-    const std::vector<Id>& topmost_ids) {
-  tracker_.OnTopmostWindowChanged(topmost_ids);
-}
-
-void TestWindowTreeClient::OnChangeCompleted(uint32_t change_id, bool success) {
-  tracker_.OnChangeCompleted(change_id, success);
-}
-
-void TestWindowTreeClient::RequestClose(Id window_id) {
-  tracker_.RequestClose(window_id);
-}
-
-void TestWindowTreeClient::GetScreenProviderObserver(
-    mojom::ScreenProviderObserverAssociatedRequest observer) {
-  screen_provider_observer_binding_.Bind(std::move(observer));
-}
-
-void TestWindowTreeClient::OnOcclusionStatesChanged(
-    const base::flat_map<Id, mojom::OcclusionState>& occlusion_changes) {
-  tracker_.OnOcclusionStatesChanged(occlusion_changes);
-}
-
-void TestWindowTreeClient::CleanupGestureState(Id window_id) {}
-
-}  // namespace ws
diff --git a/services/ws/test_window_tree_client.h b/services/ws/test_window_tree_client.h
deleted file mode 100644
index 3707a11..0000000
--- a/services/ws/test_window_tree_client.h
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TEST_WINDOW_TREE_CLIENT_H_
-#define SERVICES_WS_TEST_WINDOW_TREE_CLIENT_H_
-
-#include <stdint.h>
-
-#include <queue>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/test_change_tracker.h"
-#include "services/ws/test_screen_provider_observer.h"
-
-namespace ws {
-
-class WindowTree;
-
-// WindowTreeClient implementation that logs all changes to a tracker.
-class TestWindowTreeClient : public mojom::WindowTreeClient,
-                             public TestChangeTracker::Delegate {
- public:
-  // Created every time OnWindowInputEvent() is called.
-  struct InputEvent {
-    InputEvent();
-    InputEvent(InputEvent&& other);
-    ~InputEvent();
-
-    uint32_t event_id;
-    Id window_id;
-    int64_t display_id;
-    std::unique_ptr<ui::Event> event;
-    bool matches_event_observer;
-  };
-
-  TestWindowTreeClient();
-  ~TestWindowTreeClient() override;
-
-  std::queue<InputEvent>& input_events() { return input_events_; }
-
-  // Returns the oldest InputEvent that was received by OnWindowInputEvent().
-  // If no events have been received, |event| in the returned object is null.
-  InputEvent PopInputEvent();
-
-  // Removes all InputEvents from |input_events_|.
-  void ClearInputEvents();
-
-  std::queue<std::unique_ptr<ui::Event>>& observed_events() {
-    return observed_events_;
-  }
-
-  // Returns the oldest event received by OnObservedInputEvent(), or null.
-  std::unique_ptr<ui::Event> PopObservedEvent();
-
-  // Sets the mojom::WindowTree for this client. Used when creating a client
-  // using mojom::WindowTreeFactory.
-  void SetWindowTree(mojom::WindowTreePtr tree);
-
-  mojom::WindowTree* tree() { return tree_.get(); }
-  TestChangeTracker* tracker() { return &tracker_; }
-  Id root_window_id() const { return root_window_id_; }
-
-  // Sets whether changes to the bounds of the root should be tracked. Normally
-  // they are ignored (as during startup we often times get random size
-  // changes).
-  void set_track_root_bounds_changes(bool value) {
-    track_root_bounds_changes_ = value;
-  }
-
-  // Acks the first InputEvent that was received, and removes it. Returns true
-  // if there was an event.
-  bool AckFirstEvent(WindowTree* tree, mojom::EventResult result);
-
-  TestScreenProviderObserver* screen_provider_observer() {
-    return &screen_provider_observer_;
-  }
-
-  // TestChangeTracker::Delegate:
-  void OnChangeAdded() override;
-
-  // mojom::WindowTreeClient:
-  void OnClientId(uint32_t client_id) override;
-  void OnEmbed(mojom::WindowDataPtr root,
-               mojom::WindowTreePtr tree,
-               int64_t display_id,
-               Id focused_window_id,
-               bool drawn,
-               const base::Optional<viz::LocalSurfaceIdAllocation>&
-                   local_surface_id_allocation) override;
-  void OnEmbedFromToken(const base::UnguessableToken& token,
-                        mojom::WindowDataPtr root,
-                        int64_t display_id,
-                        const base::Optional<viz::LocalSurfaceIdAllocation>&
-                            local_surface_id_allocation) override;
-  void OnEmbeddedAppDisconnected(Id window_id) override;
-  void OnUnembed(Id window_id) override;
-  void OnCaptureChanged(Id new_capture_window_id,
-                        Id old_capture_window_id) override;
-  void OnFrameSinkIdAllocated(Id window_id,
-                              const viz::FrameSinkId& frame_sink_id) override;
-  void OnTopLevelCreated(uint32_t change_id,
-                         mojom::WindowDataPtr data,
-                         int64_t display_id,
-                         bool drawn,
-                         const viz::LocalSurfaceIdAllocation&
-                             local_surface_id_allocation) override;
-  void OnWindowBoundsChanged(
-      Id window_id,
-      const gfx::Rect& new_bounds,
-      ui::WindowShowState state,
-      const base::Optional<viz::LocalSurfaceIdAllocation>&
-          local_surface_id_allocation) override;
-  void OnWindowTransformChanged(Id window_id,
-                                const gfx::Transform& new_transform) override;
-  void OnTransientWindowAdded(Id window_id, Id transient_window_id) override;
-  void OnTransientWindowRemoved(Id window_id, Id transient_window_id) override;
-  void OnWindowHierarchyChanged(
-      Id window,
-      Id old_parent,
-      Id new_parent,
-      std::vector<mojom::WindowDataPtr> windows) override;
-  void OnWindowReordered(Id window_id,
-                         Id relative_window_id,
-                         mojom::OrderDirection direction) override;
-  void OnWindowDeleted(Id window) override;
-  void OnWindowVisibilityChanged(Id window, bool visible) override;
-  void OnWindowDisplayChanged(Id window_id, int64_t display_id) override;
-  void OnWindowParentDrawnStateChanged(Id window, bool drawn) override;
-  void OnWindowInputEvent(uint32_t event_id,
-                          Id window_id,
-                          int64_t display_id,
-                          std::unique_ptr<ui::Event> event,
-                          bool matches_event_observer) override;
-  void OnObservedInputEvent(std::unique_ptr<ui::Event> event) override;
-  void OnWindowSharedPropertyChanged(
-      Id window,
-      const std::string& name,
-      const base::Optional<std::vector<uint8_t>>& new_data) override;
-  void OnWindowFocused(Id focused_window_id) override;
-  void OnWindowCursorChanged(Id window_id, ui::Cursor cursor) override;
-  void OnDragDropStart(const base::flat_map<std::string, std::vector<uint8_t>>&
-                           drag_data) override;
-  void OnDragEnter(Id window,
-                   uint32_t key_state,
-                   const gfx::PointF& location_in_root,
-                   const gfx::PointF& location,
-                   uint32_t effect_bitmask,
-                   OnDragEnterCallback callback) override;
-  void OnDragOver(Id window,
-                  uint32_t key_state,
-                  const gfx::PointF& location_in_root,
-                  const gfx::PointF& location,
-                  uint32_t effect_bitmask,
-                  OnDragOverCallback callback) override;
-  void OnDragLeave(Id window) override;
-  void OnCompleteDrop(Id window,
-                      uint32_t key_state,
-                      const gfx::PointF& location_in_root,
-                      const gfx::PointF& location,
-                      uint32_t effect_bitmask,
-                      OnCompleteDropCallback callback) override;
-  void OnPerformDragDropCompleted(uint32_t change_id,
-                                  bool success,
-                                  uint32_t action_taken) override;
-  void OnDragDropDone() override;
-  void OnTopmostWindowChanged(const std::vector<Id>& topmost_ids) override;
-  void OnChangeCompleted(uint32_t change_id, bool success) override;
-  void RequestClose(Id window_id) override;
-  void GetScreenProviderObserver(
-      mojom::ScreenProviderObserverAssociatedRequest observer) override;
-  void OnOcclusionStatesChanged(const base::flat_map<Id, mojom::OcclusionState>&
-                                    occlusion_changes) override;
-  void CleanupGestureState(Id window_id) override;
-  void OnWindowResizeLoopStarted(uint64_t window_id) override {}
-  void OnWindowResizeLoopEnded(uint64_t window_id) override {}
-
- protected:
-  TestChangeTracker tracker_;
-  mojom::WindowTreePtr tree_;
-  Id root_window_id_ = 0;
-  bool track_root_bounds_changes_ = false;
-  std::queue<InputEvent> input_events_;
-  std::queue<std::unique_ptr<ui::Event>> observed_events_;
-  TestScreenProviderObserver screen_provider_observer_;
-  mojo::AssociatedBinding<mojom::ScreenProviderObserver>
-      screen_provider_observer_binding_{&screen_provider_observer_};
-
-  DISALLOW_COPY_AND_ASSIGN(TestWindowTreeClient);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_TEST_WINDOW_TREE_CLIENT_H_
diff --git a/services/ws/test_wm.mojom b/services/ws/test_wm.mojom
deleted file mode 100644
index 8c6868a..0000000
--- a/services/ws/test_wm.mojom
+++ /dev/null
@@ -1,9 +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.
-
-module ws.test.mojom;
-
-interface TestWm {
-  DoIt();
-};
diff --git a/services/ws/test_ws/BUILD.gn b/services/ws/test_ws/BUILD.gn
deleted file mode 100644
index d5c7f76f..0000000
--- a/services/ws/test_ws/BUILD.gn
+++ /dev/null
@@ -1,77 +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("//mojo/public/tools/bindings/mojom.gni")
-import("//services/service_manager/public/cpp/service_executable.gni")
-
-service_executable("test_ws") {
-  testonly = true
-  sources = [
-    "test_ws.cc",
-  ]
-
-  deps = [
-    ":lib",
-    "//base",
-    "//services/service_manager/public/cpp",
-    "//ui/base",
-  ]
-}
-
-source_set("lib") {
-  testonly = true
-
-  sources = [
-    "test_drag_drop_client.cc",
-    "test_drag_drop_client.h",
-    "test_gpu_interface_provider.cc",
-    "test_gpu_interface_provider.h",
-    "test_window_service.cc",
-    "test_window_service.h",
-    "test_window_service_factory.cc",
-    "test_window_service_factory.h",
-  ]
-
-  deps = [
-    ":mojom",
-    "//base",
-    "//components/discardable_memory/service",
-    "//mojo/public/cpp/bindings",
-    "//services/service_manager/public/cpp",
-    "//services/service_manager/public/mojom",
-    "//services/ws:lib",
-    "//services/ws:test_support",
-    "//services/ws/gpu_host",
-    "//services/ws/public/cpp",
-    "//services/ws/public/cpp/host",
-    "//services/ws/public/mojom",
-    "//ui/aura",
-    "//ui/aura:test_support",
-    "//ui/compositor:test_support",
-    "//ui/gl:test_support",
-  ]
-}
-
-source_set("manifest") {
-  testonly = true
-  sources = [
-    "test_manifest.cc",
-    "test_manifest.h",
-  ]
-  deps = [
-    ":mojom",
-    "//base",
-    "//services/service_manager/public/cpp",
-    "//services/viz/public/interfaces:constants",
-    "//services/ws/public/cpp:manifest",
-  ]
-}
-
-mojom("mojom") {
-  testonly = true
-
-  sources = [
-    "test_ws.mojom",
-  ]
-}
diff --git a/services/ws/test_ws/OWNERS b/services/ws/test_ws/OWNERS
deleted file mode 100644
index 045c0ba..0000000
--- a/services/ws/test_ws/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-per-file manifest.json=set noparent
-per-file manifest.json=file://ipc/SECURITY_OWNERS
-
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/test_ws/README.md b/services/ws/test_ws/README.md
deleted file mode 100644
index c07d70c..0000000
--- a/services/ws/test_ws/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory contains an implementation of the ws::mojom::WindowTree
-related interfaces on top of the window service library. This code is
-intended for tests.
diff --git a/services/ws/test_ws/test_drag_drop_client.cc b/services/ws/test_ws/test_drag_drop_client.cc
deleted file mode 100644
index da2e7164..0000000
--- a/services/ws/test_ws/test_drag_drop_client.cc
+++ /dev/null
@@ -1,150 +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.
-
-#include "services/ws/test_ws/test_drag_drop_client.h"
-
-#include "base/logging.h"
-#include "ui/aura/client/drag_drop_delegate.h"
-#include "ui/aura/window.h"
-#include "ui/base/dragdrop/drop_target_event.h"
-
-namespace ws {
-namespace test {
-
-TestDragDropClient::TestDragDropClient() = default;
-TestDragDropClient::~TestDragDropClient() = default;
-
-int TestDragDropClient::StartDragAndDrop(
-    const ui::OSExchangeData& data,
-    aura::Window* root_window,
-    aura::Window* source_window,
-    const gfx::Point& screen_location,
-    int operation,
-    ui::DragDropTypes::DragEventSource source) {
-  if (IsDragDropInProgress())
-    return ui::DragDropTypes::DRAG_NONE;
-
-  DCHECK(!root_window_);
-
-  root_window_ = root_window;
-  root_window_->AddObserver(this);
-  root_window_->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem);
-
-  drag_data_ = &data;
-  drag_operation_ = operation;
-
-  drag_loop_ = std::make_unique<base::RunLoop>(
-      base::RunLoop::Type::kNestableTasksAllowed);
-  drag_loop_->Run();
-  drag_loop_.reset();
-
-  if (root_window_) {
-    root_window_->RemovePreTargetHandler(this);
-    root_window_->RemoveObserver(this);
-    root_window_ = nullptr;
-  }
-
-  return drag_operation_;
-}
-
-void TestDragDropClient::DragCancel() {
-  if (!IsDragDropInProgress())
-    return;
-
-  drag_operation_ = ui::DragDropTypes::DRAG_NONE;
-  drag_loop_->Quit();
-}
-
-bool TestDragDropClient::IsDragDropInProgress() {
-  return !!drag_loop_;
-}
-
-void TestDragDropClient::OnWindowDestroyed(aura::Window* window) {
-  DCHECK_EQ(root_window_, window);
-  root_window_ = nullptr;
-  DragCancel();
-}
-
-void TestDragDropClient::OnMouseEvent(ui::MouseEvent* event) {
-  DCHECK(IsDragDropInProgress());
-  DCHECK(root_window_);
-
-  aura::Window* target =
-      root_window_->GetEventHandlerForPoint(event->location());
-  if (!target) {
-    NOTREACHED() << "No target found for drag and drop mouse event.";
-    event->StopPropagation();
-    return;
-  }
-
-  event->ConvertLocationToTarget(root_window_, target);
-  switch (event->type()) {
-    case ui::ET_MOUSE_DRAGGED:
-      DragUpdate(target, *event);
-      break;
-    case ui::ET_MOUSE_RELEASED:
-      Drop(target, *event);
-      break;
-    default:
-      break;
-  }
-  event->StopPropagation();
-}
-
-void TestDragDropClient::DragUpdate(aura::Window* target,
-                                    const ui::LocatedEvent& event) {
-  if (target != drag_window_) {
-    if (drag_window_) {
-      aura::client::DragDropDelegate* delegate =
-          aura::client::GetDragDropDelegate(drag_window_);
-      if (delegate)
-        delegate->OnDragExited();
-    }
-
-    drag_window_ = target;
-
-    if (drag_window_) {
-      aura::client::DragDropDelegate* delegate =
-          aura::client::GetDragDropDelegate(drag_window_);
-      if (delegate) {
-        ui::DropTargetEvent e(*drag_data_, event.location_f(),
-                              event.root_location_f(), drag_operation_);
-        e.set_flags(event.flags());
-        ui::Event::DispatcherApi(&e).set_target(target);
-        delegate->OnDragEntered(e);
-      }
-    }
-  } else {
-    aura::client::DragDropDelegate* delegate =
-        aura::client::GetDragDropDelegate(drag_window_);
-    if (delegate) {
-      ui::DropTargetEvent e(*drag_data_, event.location_f(),
-                            event.root_location_f(), drag_operation_);
-      e.set_flags(event.flags());
-      ui::Event::DispatcherApi(&e).set_target(target);
-      delegate->OnDragUpdated(e);
-    }
-  }
-}
-
-void TestDragDropClient::Drop(aura::Window* target,
-                              const ui::LocatedEvent& event) {
-  if (target != drag_window_)
-    DragUpdate(target, event);
-
-  aura::client::DragDropDelegate* delegate =
-      aura::client::GetDragDropDelegate(target);
-  if (delegate) {
-    ui::DropTargetEvent e(*drag_data_, event.location_f(),
-                          event.root_location_f(), drag_operation_);
-    e.set_flags(event.flags());
-    ui::Event::DispatcherApi(&e).set_target(target);
-    drag_operation_ = delegate->OnPerformDrop(e);
-  }
-
-  drag_loop_->Quit();
-}
-
-}  // namespace test
-}  // namespace ws
diff --git a/services/ws/test_ws/test_drag_drop_client.h b/services/ws/test_ws/test_drag_drop_client.h
deleted file mode 100644
index 31b3556f..0000000
--- a/services/ws/test_ws/test_drag_drop_client.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TEST_WS_TEST_DRAG_DROP_CLIENT_H_
-#define SERVICES_WS_TEST_WS_TEST_DRAG_DROP_CLIENT_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "ui/aura/client/drag_drop_client.h"
-#include "ui/aura/window_observer.h"
-#include "ui/base/dragdrop/drag_drop_types.h"
-#include "ui/events/event.h"
-#include "ui/events/event_handler.h"
-
-namespace ws {
-namespace test {
-
-// Drives drag and drop loop in a single root window for test. The logic is
-// based on ash::DragDropController.
-class TestDragDropClient : public aura::client::DragDropClient,
-                           public aura::WindowObserver,
-                           public ui::EventHandler {
- public:
-  TestDragDropClient();
-  ~TestDragDropClient() override;
-
-  // aura::client::DragDropClient
-  int StartDragAndDrop(const ui::OSExchangeData& data,
-                       aura::Window* root_window,
-                       aura::Window* source_window,
-                       const gfx::Point& screen_location,
-                       int operation,
-                       ui::DragDropTypes::DragEventSource source) override;
-  void DragCancel() override;
-  bool IsDragDropInProgress() override;
-  void AddObserver(aura::client::DragDropClientObserver* observer) override {}
-  void RemoveObserver(aura::client::DragDropClientObserver* observer) override {
-  }
-
-  // aura::WindowObserer
-  void OnWindowDestroyed(aura::Window* window) override;
-
-  // ui::EventHandler
-  void OnMouseEvent(ui::MouseEvent* event) override;
-
- private:
-  void DragUpdate(aura::Window* target, const ui::LocatedEvent& event);
-  void Drop(aura::Window* target, const ui::LocatedEvent& event);
-
-  // The root window where drag and drop happens.
-  aura::Window* root_window_ = nullptr;
-
-  // The window that is under the drag cursor.
-  aura::Window* drag_window_ = nullptr;
-
-  const ui::OSExchangeData* drag_data_ = nullptr;
-  int drag_operation_ = ui::DragDropTypes::DRAG_NONE;
-
-  std::unique_ptr<base::RunLoop> drag_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestDragDropClient);
-};
-
-}  // namespace test
-}  // namespace ws
-
-#endif  // SERVICES_WS_TEST_WS_TEST_DRAG_DROP_CLIENT_H_
diff --git a/services/ws/test_ws/test_gpu_interface_provider.cc b/services/ws/test_ws/test_gpu_interface_provider.cc
deleted file mode 100644
index a0b683e1..0000000
--- a/services/ws/test_ws/test_gpu_interface_provider.cc
+++ /dev/null
@@ -1,65 +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.
-
-#include "services/ws/test_ws/test_gpu_interface_provider.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "components/discardable_memory/service/discardable_shared_memory_manager.h"
-#include "services/service_manager/public/cpp/bind_source_info.h"
-#include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/ws/gpu_host/gpu_host.h"
-
-namespace ws {
-namespace test {
-
-TestGpuInterfaceProvider::TestGpuInterfaceProvider(
-    gpu_host::GpuHost* gpu_host,
-    discardable_memory::DiscardableSharedMemoryManager*
-        discardable_shared_memory_manager)
-    : gpu_host_(gpu_host),
-      discardable_shared_memory_manager_(discardable_shared_memory_manager) {}
-
-TestGpuInterfaceProvider::~TestGpuInterfaceProvider() = default;
-
-void TestGpuInterfaceProvider::RegisterGpuInterfaces(
-    service_manager::BinderRegistry* registry) {
-  registry->AddInterface(base::BindRepeating(
-      &TestGpuInterfaceProvider::BindDiscardableSharedMemoryManagerRequest,
-      base::Unretained(this)));
-  registry->AddInterface(base::BindRepeating(
-      &TestGpuInterfaceProvider::BindGpuRequest, base::Unretained(this)));
-}
-
-#if defined(USE_OZONE)
-void TestGpuInterfaceProvider::BindOzoneGpuInterface(
-    const std::string& interface_name,
-    mojo::ScopedMessagePipeHandle handle) {}
-#endif
-
-void TestGpuInterfaceProvider::BindDiscardableSharedMemoryManagerRequest(
-    discardable_memory::mojom::DiscardableSharedMemoryManagerRequest request) {
-  // |discardable_shared_memory_manager_| could be null. See test_ws.cc for
-  // details.
-  if (!discardable_shared_memory_manager_) {
-    NOTIMPLEMENTED_LOG_ONCE();
-    return;
-  }
-
-  discardable_shared_memory_manager_->Bind(std::move(request),
-                                           service_manager::BindSourceInfo());
-}
-
-void TestGpuInterfaceProvider::BindGpuRequest(mojom::GpuRequest request) {
-  // |gpu_host_| could be null. See test_ws.cc for details.
-  if (!gpu_host_) {
-    NOTIMPLEMENTED_LOG_ONCE();
-    return;
-  }
-
-  gpu_host_->Add(std::move(request));
-}
-
-}  // namespace test
-}  // namespace ws
diff --git a/services/ws/test_ws/test_gpu_interface_provider.h b/services/ws/test_ws/test_gpu_interface_provider.h
deleted file mode 100644
index 9edd69d..0000000
--- a/services/ws/test_ws/test_gpu_interface_provider.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TEST_WS_TEST_GPU_INTERFACE_PROVIDER_H_
-#define SERVICES_WS_TEST_WS_TEST_GPU_INTERFACE_PROVIDER_H_
-
-#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h"
-#include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/public/mojom/gpu.mojom.h"
-
-namespace discardable_memory {
-class DiscardableSharedMemoryManager;
-}
-
-namespace ws {
-
-namespace gpu_host {
-class GpuHost;
-}
-
-namespace test {
-
-// TestGpuInterfaceProvider used by test_ws.
-class TestGpuInterfaceProvider : public GpuInterfaceProvider {
- public:
-  TestGpuInterfaceProvider(gpu_host::GpuHost* gpu_host,
-                           discardable_memory::DiscardableSharedMemoryManager*
-                               discardable_shared_memory_manager);
-  ~TestGpuInterfaceProvider() override;
-
-  // GpuInterfaceProvider:
-  void RegisterGpuInterfaces(
-      service_manager::BinderRegistry* registry) override;
-#if defined(USE_OZONE)
-  void BindOzoneGpuInterface(const std::string& interface_name,
-                             mojo::ScopedMessagePipeHandle handle) override;
-#endif
-
- private:
-  void BindDiscardableSharedMemoryManagerRequest(
-      discardable_memory::mojom::DiscardableSharedMemoryManagerRequest request);
-  void BindGpuRequest(mojom::GpuRequest request);
-
-  gpu_host::GpuHost* const gpu_host_;
-  discardable_memory::DiscardableSharedMemoryManager* const
-      discardable_shared_memory_manager_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestGpuInterfaceProvider);
-};
-
-}  // namespace test
-}  // namespace ws
-
-#endif  // SERVICES_WS_TEST_WS_TEST_GPU_INTERFACE_PROVIDER_H_
diff --git a/services/ws/test_ws/test_manifest.cc b/services/ws/test_ws/test_manifest.cc
deleted file mode 100644
index 7b103558..0000000
--- a/services/ws/test_ws/test_manifest.cc
+++ /dev/null
@@ -1,31 +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 "services/ws/test_ws/test_manifest.h"
-
-#include "base/no_destructor.h"
-#include "services/service_manager/public/cpp/manifest_builder.h"
-#include "services/viz/public/interfaces/constants.mojom.h"
-#include "services/ws/public/cpp/manifest.h"
-#include "services/ws/test_ws/test_ws.mojom.h"
-
-namespace test_ws {
-
-const service_manager::Manifest& GetManifest() {
-  static base::NoDestructor<service_manager::Manifest> manifest{
-      service_manager::ManifestBuilder()
-          .WithServiceName(mojom::kServiceName)
-          .WithDisplayName("Test Window Service")
-          .WithOptions(service_manager::ManifestOptionsBuilder()
-                           .WithSandboxType("none")
-                           .Build())
-          .ExposeCapability(
-              "test", service_manager::Manifest::InterfaceList<mojom::TestWs>())
-          .RequireCapability(viz::mojom::kVizServiceName, "viz_host")
-          .PackageService(ws::GetManifest())
-          .Build()};
-  return *manifest;
-}
-
-}  // namespace test_ws
diff --git a/services/ws/test_ws/test_manifest.h b/services/ws/test_ws/test_manifest.h
deleted file mode 100644
index a9115db..0000000
--- a/services/ws/test_ws/test_manifest.h
+++ /dev/null
@@ -1,16 +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 SERVICES_WS_TEST_WS_TEST_MANIFEST_H_
-#define SERVICES_WS_TEST_WS_TEST_MANIFEST_H_
-
-#include "services/service_manager/public/cpp/manifest.h"
-
-namespace test_ws {
-
-const service_manager::Manifest& GetManifest();
-
-}  // namespace test_ws
-
-#endif  // SERVICES_WS_TEST_WS_TEST_MANIFEST_H_
diff --git a/services/ws/test_ws/test_window_service.cc b/services/ws/test_ws/test_window_service.cc
deleted file mode 100644
index 66e62e7..0000000
--- a/services/ws/test_ws/test_window_service.cc
+++ /dev/null
@@ -1,266 +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.
-
-#include "services/ws/test_ws/test_window_service.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "mojo/public/cpp/bindings/map.h"
-#include "services/service_manager/public/cpp/connector.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/test_ws/test_gpu_interface_provider.h"
-#include "services/ws/window_service.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/env.h"
-#include "ui/aura/mus/property_utils.h"
-#include "ui/aura/window_tracker.h"
-#include "ui/compositor/test/test_context_factories.h"
-#include "ui/display/screen.h"
-#include "ui/events/event.h"
-#include "ui/events/event_sink.h"
-#include "ui/gl/test/gl_surface_test_support.h"
-#include "ui/wm/core/window_util.h"
-
-namespace ws {
-namespace test {
-
-class TestWindowService::VisibilitySynchronizer : public aura::WindowTracker {
- public:
-  VisibilitySynchronizer() = default;
-  ~VisibilitySynchronizer() override = default;
-
- private:
-  // aura::WindowObserver:
-  void OnWindowPropertyChanged(aura::Window* window,
-                               const void* key,
-                               intptr_t old) override {
-    if (key == aura::client::kShowStateKey) {
-      if (wm::WindowStateIs(window, ui::SHOW_STATE_MINIMIZED))
-        window->Hide();
-      else
-        window->Show();
-    }
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(VisibilitySynchronizer);
-};
-
-TestWindowService::TestWindowService(
-    service_manager::mojom::ServiceRequest request)
-    : service_binding_(this, std::move(request)) {}
-
-TestWindowService::~TestWindowService() {
-  Shutdown(base::NullCallback());
-}
-
-void TestWindowService::InitForInProcess(
-    ui::ContextFactory* context_factory,
-    ui::ContextFactoryPrivate* context_factory_private,
-    std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider) {
-  is_in_process_ = true;
-  aura_test_helper_ =
-      std::make_unique<aura::test::AuraTestHelper>(aura::Env::CreateInstance());
-  SetupAuraTestHelper(context_factory, context_factory_private);
-
-  gpu_interface_provider_ = std::move(gpu_interface_provider);
-  visibility_synchronizer_ = std::make_unique<VisibilitySynchronizer>();
-}
-
-void TestWindowService::InitForOutOfProcess() {
-  visibility_synchronizer_ = std::make_unique<VisibilitySynchronizer>();
-#if defined(OS_CHROMEOS)
-  // Use gpu service only for ChromeOS to run content_browsertests in mash.
-  //
-  // To use this code path for all platforms, we need to fix the following
-  // flaky failure on Win7 bot:
-  //   gl_surface_egl.cc:
-  //     EGL Driver message (Critical) eglInitialize: No available renderers
-  //   gl_initializer_win.cc:
-  //     GLSurfaceEGL::InitializeOneOff failed.
-  CreateGpuHost();
-#else
-  gl::GLSurfaceTestSupport::InitializeOneOff();
-  CreateAuraTestHelper();
-#endif  // defined(OS_CHROMEOS)
-}
-
-std::unique_ptr<aura::Window> TestWindowService::NewTopLevel(
-    TopLevelProxyWindow* top_level_proxy_window,
-    aura::PropertyConverter* property_converter,
-    const base::flat_map<std::string, std::vector<uint8_t>>& properties) {
-  std::unique_ptr<aura::Window> top_level = std::make_unique<aura::Window>(
-      nullptr, aura::client::WINDOW_TYPE_UNKNOWN);
-  aura::SetWindowType(top_level.get(), aura::GetWindowTypeFromProperties(
-                                           mojo::FlatMapToMap(properties)));
-  top_level->Init(ui::LAYER_NOT_DRAWN);
-  aura_test_helper_->root_window()->AddChild(top_level.get());
-  for (auto property : properties) {
-    property_converter->SetPropertyFromTransportValue(
-        top_level.get(), property.first, &property.second);
-  }
-  if (maximize_next_window_) {
-    top_level->SetProperty(aura::client::kShowStateKey,
-                           ui::SHOW_STATE_MAXIMIZED);
-    maximize_next_window_ = false;
-  }
-  visibility_synchronizer_->Add(top_level.get());
-  return top_level;
-}
-
-void TestWindowService::RunWindowMoveLoop(aura::Window* window,
-                                          mojom::MoveLoopSource source,
-                                          const gfx::Point& cursor,
-                                          int window_component,
-                                          DoneCallback callback) {
-  window_move_done_callback_ = std::move(callback);
-}
-void TestWindowService::CancelWindowMoveLoop() {
-  CHECK(!window_move_done_callback_.is_null());
-  std::move(window_move_done_callback_).Run(false);
-}
-
-void TestWindowService::RunDragLoop(aura::Window* window,
-                                    const ui::OSExchangeData& data,
-                                    const gfx::Point& screen_location,
-                                    uint32_t drag_operation,
-                                    ui::DragDropTypes::DragEventSource source,
-                                    DragDropCompletedCallback callback) {
-  std::move(callback).Run(drag_drop_client_.StartDragAndDrop(
-      data, window->GetRootWindow(), window, screen_location, drag_operation,
-      source));
-}
-
-void TestWindowService::CancelDragLoop(aura::Window* window) {
-  drag_drop_client_.DragCancel();
-}
-
-ui::EventTarget* TestWindowService::GetGlobalEventTarget() {
-  return aura_test_helper_->root_window();
-}
-
-aura::Window* TestWindowService::GetRootWindowForDisplayId(int64_t display_id) {
-  if (display::Screen::GetScreen()->GetAllDisplays().size() > 1)
-    NOTIMPLEMENTED_LOG_ONCE() << "Add test support for multiple displays.";
-  return aura_test_helper_->root_window();
-}
-
-void TestWindowService::OnStart() {
-  CHECK(!started_);
-  started_ = true;
-
-  registry_.AddInterface(base::BindRepeating(&TestWindowService::BindTestWs,
-                                             base::Unretained(this)));
-
-  if (!is_in_process_) {
-    DCHECK(!aura_test_helper_);
-    InitForOutOfProcess();
-  }
-}
-
-void TestWindowService::OnBindInterface(
-    const service_manager::BindSourceInfo& source_info,
-    const std::string& interface_name,
-    mojo::ScopedMessagePipeHandle interface_pipe) {
-  registry_.BindInterface(interface_name, std::move(interface_pipe));
-}
-
-void TestWindowService::CreatePackagedServiceInstance(
-    const std::string& name,
-    mojo::PendingReceiver<service_manager::mojom::Service> receiver,
-    CreatePackagedServiceInstanceCallback callback) {
-  DCHECK_EQ(name, mojom::kServiceName);
-
-  // Defer the operation if |aura_test_helper_| is not created.
-  if (!aura_test_helper_) {
-    DCHECK(!pending_create_service_);
-    pending_create_service_ = base::BindOnce(
-        &TestWindowService::CreatePackagedServiceInstance,
-        base::Unretained(this), name, std::move(receiver), std::move(callback));
-    return;
-  }
-
-  DCHECK(!ui_service_created_);
-  ui_service_created_ = true;
-
-  window_service_ = std::make_unique<WindowService>(
-      this, std::move(gpu_interface_provider_),
-      aura_test_helper_->focus_client(), /*decrement_client_ids=*/false,
-      aura_test_helper_->GetEnv());
-  window_service_->BindServiceRequest(std::move(receiver));
-  std::move(callback).Run(base::GetCurrentProcId());
-}
-
-void TestWindowService::OnGpuServiceInitialized() {
-  CreateAuraTestHelper();
-
-  if (pending_create_service_)
-    std::move(pending_create_service_).Run();
-}
-
-void TestWindowService::MaximizeNextWindow(MaximizeNextWindowCallback cb) {
-  maximize_next_window_ = true;
-  std::move(cb).Run();
-}
-
-void TestWindowService::Shutdown(
-    test_ws::mojom::TestWs::ShutdownCallback callback) {
-  // WindowService depends upon Screen, which is owned by AuraTestHelper.
-  window_service_.reset();
-
-  // |aura_test_helper_| could be null when exiting before fully initialized.
-  if (aura_test_helper_) {
-    aura::client::SetScreenPositionClient(aura_test_helper_->root_window(),
-                                          nullptr);
-    // AuraTestHelper expects TearDown() to be called.
-    aura_test_helper_->TearDown();
-    aura_test_helper_.reset();
-  }
-
-  context_factories_.reset();
-
-  if (callback)
-    std::move(callback).Run();
-}
-
-void TestWindowService::BindTestWs(test_ws::mojom::TestWsRequest request) {
-  test_ws_bindings_.AddBinding(this, std::move(request));
-}
-
-void TestWindowService::CreateGpuHost() {
-  discardable_shared_memory_manager_ =
-      std::make_unique<discardable_memory::DiscardableSharedMemoryManager>();
-
-  gpu_host_ = std::make_unique<gpu_host::GpuHost>(
-      this, discardable_shared_memory_manager_.get());
-
-  gpu_interface_provider_ = std::make_unique<TestGpuInterfaceProvider>(
-      gpu_host_.get(), discardable_shared_memory_manager_.get());
-
-  // |aura_test_helper_| is created later in OnGpuServiceInitialized.
-}
-
-void TestWindowService::CreateAuraTestHelper() {
-  DCHECK(!aura_test_helper_);
-
-  const bool enable_pixel_output = false;
-  context_factories_ =
-      std::make_unique<ui::TestContextFactories>(enable_pixel_output);
-  aura_test_helper_ = std::make_unique<aura::test::AuraTestHelper>();
-  SetupAuraTestHelper(context_factories_->GetContextFactory(),
-                      context_factories_->GetContextFactoryPrivate());
-}
-
-void TestWindowService::SetupAuraTestHelper(
-    ui::ContextFactory* context_factory,
-    ui::ContextFactoryPrivate* context_factory_private) {
-  aura_test_helper_->SetUp(context_factory, context_factory_private);
-
-  aura::client::SetScreenPositionClient(aura_test_helper_->root_window(),
-                                        &screen_position_client_);
-}
-
-}  // namespace test
-}  // namespace ws
diff --git a/services/ws/test_ws/test_window_service.h b/services/ws/test_ws/test_window_service.h
deleted file mode 100644
index 7e85eb1..0000000
--- a/services/ws/test_ws/test_window_service.h
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TEST_WS_TEST_WINDOW_SERVICE_H_
-#define SERVICES_WS_TEST_WS_TEST_WINDOW_SERVICE_H_
-
-#include <memory>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "components/discardable_memory/service/discardable_shared_memory_manager.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_binding.h"
-#include "services/service_manager/public/mojom/service.mojom.h"
-#include "services/ws/gpu_host/gpu_host.h"
-#include "services/ws/gpu_host/gpu_host_delegate.h"
-#include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/test_ws/test_drag_drop_client.h"
-#include "services/ws/test_ws/test_ws.mojom.h"
-#include "services/ws/window_service_delegate.h"
-#include "ui/aura/test/aura_test_helper.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/wm/core/default_screen_position_client.h"
-
-namespace ui {
-class ContextFactory;
-class ContextFactoryPrivate;
-class TestContextFactories;
-}  // namespace ui
-
-namespace ws {
-
-class WindowService;
-
-namespace test {
-
-// Service implementation that brings up the Window Service on top of aura.
-// Uses ws::WindowService to provide the Window Service.
-class TestWindowService : public service_manager::Service,
-                          public gpu_host::GpuHostDelegate,
-                          public WindowServiceDelegate,
-                          public test_ws::mojom::TestWs {
- public:
-  explicit TestWindowService(service_manager::mojom::ServiceRequest request);
-  ~TestWindowService() override;
-
-  void InitForInProcess(
-      ui::ContextFactory* context_factory,
-      ui::ContextFactoryPrivate* context_factory_private,
-      std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider);
-
- private:
-  class VisibilitySynchronizer;
-
-  void InitForOutOfProcess();
-
-  // WindowServiceDelegate:
-  std::unique_ptr<aura::Window> NewTopLevel(
-      TopLevelProxyWindow* top_level_proxy_window,
-      aura::PropertyConverter* property_converter,
-      const base::flat_map<std::string, std::vector<uint8_t>>& properties)
-      override;
-  void RunWindowMoveLoop(aura::Window* window,
-                         mojom::MoveLoopSource source,
-                         const gfx::Point& cursor,
-                         int window_component,
-                         DoneCallback callback) override;
-  void CancelWindowMoveLoop() override;
-  void RunDragLoop(aura::Window* window,
-                   const ui::OSExchangeData& data,
-                   const gfx::Point& screen_location,
-                   uint32_t drag_operation,
-                   ui::DragDropTypes::DragEventSource source,
-                   DragDropCompletedCallback callback) override;
-  void CancelDragLoop(aura::Window* window) override;
-  ui::EventTarget* GetGlobalEventTarget() override;
-  aura::Window* GetRootWindowForDisplayId(int64_t display_id) override;
-
-  // service_manager::Service:
-  void OnStart() override;
-  void OnBindInterface(const service_manager::BindSourceInfo& source_info,
-                       const std::string& interface_name,
-                       mojo::ScopedMessagePipeHandle interface_pipe) override;
-  void CreatePackagedServiceInstance(
-      const std::string& name,
-      mojo::PendingReceiver<service_manager::mojom::Service> receiver,
-      CreatePackagedServiceInstanceCallback callback) override;
-
-  // gpu_host::GpuHostDelegate:
-  void OnGpuServiceInitialized() override;
-
-  // test_ws::mojom::TestWs:
-  void MaximizeNextWindow(MaximizeNextWindowCallback cb) override;
-  void Shutdown(test_ws::mojom::TestWs::ShutdownCallback callback) override;
-
-  void BindTestWs(test_ws::mojom::TestWsRequest request);
-
-  void CreateGpuHost();
-
-  void CreateAuraTestHelper();
-  void SetupAuraTestHelper(ui::ContextFactory* context_factory,
-                           ui::ContextFactoryPrivate* context_factory_private);
-
-  service_manager::ServiceBinding service_binding_;
-  service_manager::BinderRegistry registry_;
-
-  mojo::BindingSet<test_ws::mojom::TestWs> test_ws_bindings_;
-
-  std::unique_ptr<WindowService> window_service_;
-
-  std::unique_ptr<ui::TestContextFactories> context_factories_;
-  std::unique_ptr<aura::test::AuraTestHelper> aura_test_helper_;
-
-  std::unique_ptr<discardable_memory::DiscardableSharedMemoryManager>
-      discardable_shared_memory_manager_;
-  std::unique_ptr<gpu_host::GpuHost> gpu_host_;
-
-  // For drag and drop code to convert to/from screen coordinates.
-  wm::DefaultScreenPositionClient screen_position_client_;
-
-  DoneCallback window_move_done_callback_;
-
-  TestDragDropClient drag_drop_client_;
-
-  bool started_ = false;
-  bool ui_service_created_ = false;
-  bool maximize_next_window_ = false;
-
-  base::OnceClosure pending_create_service_;
-
-  // GpuInterfaceProvider that is passed to WindowService when creating it.
-  std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider_;
-
-  // Whether the service is used in process. Not using features because it
-  // is used in service_unittests where ui features is not used there.
-  bool is_in_process_ = false;
-
-  std::unique_ptr<VisibilitySynchronizer> visibility_synchronizer_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestWindowService);
-};
-
-}  // namespace test
-}  // namespace ws
-
-#endif  // SERVICES_WS_TEST_WS_TEST_WINDOW_SERVICE_H_
diff --git a/services/ws/test_ws/test_window_service_factory.cc b/services/ws/test_ws/test_window_service_factory.cc
deleted file mode 100644
index ddf9b374..0000000
--- a/services/ws/test_ws/test_window_service_factory.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "services/ws/test_ws/test_window_service_factory.h"
-
-#include <utility>
-
-#include "services/service_manager/public/cpp/service.h"
-#include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/test_ws/test_window_service.h"
-
-namespace ws {
-namespace test {
-
-std::unique_ptr<service_manager::Service> CreateInProcessWindowService(
-    ui::ContextFactory* context_factory,
-    ui::ContextFactoryPrivate* context_factory_private,
-    std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider,
-    service_manager::mojom::ServiceRequest request) {
-  auto window_service = std::make_unique<TestWindowService>(std::move(request));
-  window_service->InitForInProcess(context_factory, context_factory_private,
-                                   std::move(gpu_interface_provider));
-  return window_service;
-}
-
-std::unique_ptr<service_manager::Service> CreateOutOfProcessWindowService(
-    service_manager::mojom::ServiceRequest request) {
-  return std::make_unique<TestWindowService>(std::move(request));
-}
-
-}  // namespace test
-}  // namespace ws
diff --git a/services/ws/test_ws/test_window_service_factory.h b/services/ws/test_ws/test_window_service_factory.h
deleted file mode 100644
index b3990e2..0000000
--- a/services/ws/test_ws/test_window_service_factory.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TEST_WS_TEST_WINDOW_SERVICE_FACTORY_H_
-#define SERVICES_WS_TEST_WS_TEST_WINDOW_SERVICE_FACTORY_H_
-
-#include <memory>
-
-#include "services/service_manager/public/mojom/service.mojom.h"
-
-namespace service_manager {
-class Service;
-}  // namespace service_manager
-
-namespace ui {
-class ContextFactory;
-class ContextFactoryPrivate;
-}  // namespace ui
-
-namespace ws {
-class GpuInterfaceProvider;
-}  // namespace ws
-
-namespace ws {
-namespace test {
-
-std::unique_ptr<service_manager::Service> CreateInProcessWindowService(
-    ui::ContextFactory* context_factory,
-    ui::ContextFactoryPrivate* context_factory_private,
-    std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider,
-    service_manager::mojom::ServiceRequest request);
-
-std::unique_ptr<service_manager::Service> CreateOutOfProcessWindowService(
-    service_manager::mojom::ServiceRequest request);
-
-}  // namespace test
-}  // namespace ws
-
-#endif  // SERVICES_WS_TEST_WS_TEST_WINDOW_SERVICE_FACTORY_H_
diff --git a/services/ws/test_ws/test_ws.cc b/services/ws/test_ws/test_ws.cc
deleted file mode 100644
index e43c021..0000000
--- a/services/ws/test_ws/test_ws.cc
+++ /dev/null
@@ -1,16 +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.
-
-#include "base/message_loop/message_loop.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_executable/service_main.h"
-#include "services/ws/test_ws/test_window_service_factory.h"
-#include "ui/base/ui_base_paths.h"
-
-void ServiceMain(service_manager::mojom::ServiceRequest request) {
-  ui::RegisterPathProvider();
-  base::MessageLoop message_loop(base::MessageLoop::TYPE_UI);
-  auto service = ws::test::CreateOutOfProcessWindowService(std::move(request));
-  service->RunUntilTermination();
-}
diff --git a/services/ws/test_ws/test_ws.mojom b/services/ws/test_ws/test_ws.mojom
deleted file mode 100644
index 7af604a5..0000000
--- a/services/ws/test_ws/test_ws.mojom
+++ /dev/null
@@ -1,19 +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.
-
-module test_ws.mojom;
-
-const string kServiceName = "test_ws";
-
-// Implemented by TestWindowService.
-interface TestWs {
-  // Requests that the window service create the next top-level window with
-  // show state maximized.
-  MaximizeNextWindow() => ();
-
-  // Used when caller needs to explicitly shutdown the window service hosted
-  // in test_ws. Callback is provided so that caller can resume its shutdown
-  // sequence.
-  Shutdown() => ();
-};
diff --git a/services/ws/top_level_proxy_window.h b/services/ws/top_level_proxy_window.h
deleted file mode 100644
index 695760ae..0000000
--- a/services/ws/top_level_proxy_window.h
+++ /dev/null
@@ -1,57 +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 SERVICES_WS_TOP_LEVEL_PROXY_WINDOW_H_
-#define SERVICES_WS_TOP_LEVEL_PROXY_WINDOW_H_
-
-#include <memory>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "ui/aura/window_tracker.h"
-
-namespace ws {
-
-class ClientRoot;
-class ScopedForceVisible;
-
-// Interface exposed to clients to interact with top-level windows. This is
-// indirectly owned by the aura::Window the TopLevelProxyWindow is associated
-// with.
-class COMPONENT_EXPORT(WINDOW_SERVICE) TopLevelProxyWindow {
- public:
-  // See mojom for details on these. The functions effectively call to the
-  // client.
-  virtual void OnWindowResizeLoopStarted() = 0;
-  virtual void OnWindowResizeLoopEnded() = 0;
-  virtual void RequestClose() = 0;
-
-  // Forces the client to think the window is visible while the return value is
-  // valid.
-  virtual std::unique_ptr<ScopedForceVisible> ForceVisible() = 0;
-
- protected:
-  virtual ~TopLevelProxyWindow() {}
-};
-
-// See ForceVisible for details.
-class COMPONENT_EXPORT(WINDOW_SERVICE) ScopedForceVisible {
- public:
-  ~ScopedForceVisible();
-
- private:
-  friend class ClientRoot;
-
-  explicit ScopedForceVisible(ClientRoot* client_root);
-
-  void OnClientRootDestroyed();
-
-  ClientRoot* client_root_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedForceVisible);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_TOP_LEVEL_PROXY_WINDOW_H_
diff --git a/services/ws/top_level_proxy_window_impl.cc b/services/ws/top_level_proxy_window_impl.cc
deleted file mode 100644
index f43e853..0000000
--- a/services/ws/top_level_proxy_window_impl.cc
+++ /dev/null
@@ -1,48 +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 "services/ws/top_level_proxy_window_impl.h"
-
-#include "services/ws/client_root.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-
-namespace ws {
-
-TopLevelProxyWindowImpl::TopLevelProxyWindowImpl(
-    mojom::WindowTreeClient* window_tree_client,
-    Id window_transport_id)
-    : window_tree_client_(window_tree_client),
-      window_transport_id_(window_transport_id) {}
-
-TopLevelProxyWindowImpl::~TopLevelProxyWindowImpl() {}
-
-void TopLevelProxyWindowImpl::OnWindowResizeLoopStarted() {
-  window_tree_client_->OnWindowResizeLoopStarted(window_transport_id_);
-}
-
-void TopLevelProxyWindowImpl::OnWindowResizeLoopEnded() {
-  window_tree_client_->OnWindowResizeLoopEnded(window_transport_id_);
-}
-
-void TopLevelProxyWindowImpl::RequestClose() {
-  window_tree_client_->RequestClose(window_transport_id_);
-}
-
-std::unique_ptr<ScopedForceVisible> TopLevelProxyWindowImpl::ForceVisible() {
-  return client_root_->ForceWindowVisible();
-}
-
-ScopedForceVisible::~ScopedForceVisible() {
-  if (client_root_)
-    client_root_->OnForceVisibleDestroyed();
-}
-
-ScopedForceVisible::ScopedForceVisible(ClientRoot* client_root)
-    : client_root_(client_root) {}
-
-void ScopedForceVisible::OnClientRootDestroyed() {
-  client_root_ = nullptr;
-}
-
-}  // namespace ws
diff --git a/services/ws/top_level_proxy_window_impl.h b/services/ws/top_level_proxy_window_impl.h
deleted file mode 100644
index a1b4ff69..0000000
--- a/services/ws/top_level_proxy_window_impl.h
+++ /dev/null
@@ -1,47 +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 SERVICES_WS_TOP_LEVEL_PROXY_WINDOW_IMPL_H_
-#define SERVICES_WS_TOP_LEVEL_PROXY_WINDOW_IMPL_H_
-
-#include <memory>
-
-#include "services/ws/common/types.h"
-#include "services/ws/top_level_proxy_window.h"
-
-namespace ws {
-
-class ClientRoot;
-
-namespace mojom {
-class WindowTreeClient;
-}
-
-// See superclass for details. This mostly just forwards calls to the remote
-// client.
-class TopLevelProxyWindowImpl : public TopLevelProxyWindow {
- public:
-  TopLevelProxyWindowImpl(mojom::WindowTreeClient* window_tree_client,
-                          Id window_transport_id);
-  ~TopLevelProxyWindowImpl() override;
-
-  void set_client_root(ClientRoot* client_root) { client_root_ = client_root; }
-
-  // TopLevelProxyWindowImpl:
-  void OnWindowResizeLoopStarted() override;
-  void OnWindowResizeLoopEnded() override;
-  void RequestClose() override;
-  std::unique_ptr<ScopedForceVisible> ForceVisible() override;
-
- private:
-  mojom::WindowTreeClient* window_tree_client_;
-  const Id window_transport_id_;
-  ClientRoot* client_root_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(TopLevelProxyWindowImpl);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_TOP_LEVEL_PROXY_WINDOW_IMPL_H_
diff --git a/services/ws/topmost_window_observer.cc b/services/ws/topmost_window_observer.cc
deleted file mode 100644
index aef7dbd..0000000
--- a/services/ws/topmost_window_observer.cc
+++ /dev/null
@@ -1,120 +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.
-
-#include "services/ws/topmost_window_observer.h"
-
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_delegate.h"
-#include "services/ws/window_tree.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_event_dispatcher.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/events/event.h"
-#include "ui/events/gestures/gesture_recognizer.h"
-#include "ui/gfx/geometry/point_f.h"
-#include "ui/wm/core/coordinate_conversion.h"
-
-namespace ws {
-
-TopmostWindowObserver::TopmostWindowObserver(WindowTree* window_tree,
-                                             mojom::MoveLoopSource source,
-                                             aura::Window* initial_target)
-    : window_tree_(window_tree), source_(source), last_target_(initial_target) {
-  std::set<ui::EventType> types;
-  aura::Env* env = aura::Env::GetInstance();
-  if (source == mojom::MoveLoopSource::MOUSE) {
-    types.insert(ui::ET_MOUSE_MOVED);
-    types.insert(ui::ET_MOUSE_DRAGGED);
-    last_location_ = env->last_mouse_location();
-  } else {
-    types.insert(ui::ET_TOUCH_MOVED);
-    gfx::PointF point;
-    ui::GestureRecognizer* gesture_recognizer = env->gesture_recognizer();
-    if (gesture_recognizer->GetLastTouchPointForTarget(last_target_, &point))
-      last_location_ = gfx::Point(point.x(), point.y());
-    ::wm::ConvertPointToScreen(last_target_, &last_location_);
-  }
-  env->AddEventObserver(this, env, types);
-  UpdateTopmostWindows();
-}
-
-TopmostWindowObserver::~TopmostWindowObserver() {
-  aura::Env::GetInstance()->RemoveEventObserver(this);
-  if (topmost_)
-    topmost_->RemoveObserver(this);
-  if (real_topmost_ && topmost_ != real_topmost_)
-    real_topmost_->RemoveObserver(this);
-}
-
-void TopmostWindowObserver::OnEvent(const ui::Event& event) {
-  CHECK(event.IsLocatedEvent());
-  last_target_ = static_cast<aura::Window*>(event.target());
-  last_location_ = event.AsLocatedEvent()->location();
-  ::wm::ConvertPointToScreen(last_target_, &last_location_);
-  UpdateTopmostWindows();
-}
-
-void TopmostWindowObserver::OnWindowVisibilityChanged(aura::Window* window,
-                                                      bool visible) {
-  if (visible)
-    return;
-  if (!window->Contains(topmost_) && !window->Contains(real_topmost_))
-    return;
-  UpdateTopmostWindows();
-}
-
-void TopmostWindowObserver::OnWindowHierarchyChanged(
-    const HierarchyChangeParams& params) {
-  UpdateTopmostWindows();
-}
-
-void TopmostWindowObserver::OnWindowBoundsChanged(
-    aura::Window* window,
-    const gfx::Rect& old_bounds,
-    const gfx::Rect& new_bounds,
-    ui::PropertyChangeReason reason) {
-  gfx::Rect screen_bounds = new_bounds;
-  ::wm::ConvertRectToScreen(window->parent(), &screen_bounds);
-  if (!screen_bounds.Contains(last_location_))
-    UpdateTopmostWindows();
-}
-
-void TopmostWindowObserver::UpdateTopmostWindows() {
-  std::set<aura::Window*> ignore;
-  ignore.insert(last_target_);
-  aura::Window* real_topmost = nullptr;
-  aura::Window* topmost =
-      window_tree_->window_service()->delegate()->GetTopmostWindowAtPoint(
-          last_location_, ignore, &real_topmost);
-
-  if (topmost == topmost_ && real_topmost == real_topmost_)
-    return;
-
-  // Since |topmost_| and |real_topmost_| could be same, updating observation
-  // for those windows is really complicated. To simplify the logic, here always
-  // removes this from the old windows and then adds to the new windows. This
-  // means removing and adding can happen on the same window when |topmost_| or
-  // |real_topmost_| are same. See topmost_window_observer_unittest.cc for the
-  // corner cases of the updates.
-  if (topmost_)
-    topmost_->RemoveObserver(this);
-  if (real_topmost_ && real_topmost_ != topmost_)
-    real_topmost_->RemoveObserver(this);
-  topmost_ = topmost;
-  real_topmost_ = real_topmost;
-  if (topmost_)
-    topmost_->AddObserver(this);
-  if (real_topmost_ && real_topmost_ != topmost_)
-    real_topmost_->AddObserver(this);
-
-  std::vector<aura::Window*> windows;
-  if (real_topmost_)
-    windows.push_back(real_topmost_);
-  if (topmost_ && topmost_ != real_topmost_)
-    windows.push_back(topmost_);
-  window_tree_->SendTopmostWindows(windows);
-}
-
-}  // namespace ws
diff --git a/services/ws/topmost_window_observer.h b/services/ws/topmost_window_observer.h
deleted file mode 100644
index 19a1497..0000000
--- a/services/ws/topmost_window_observer.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_TOPMOST_WINDOW_OBSERVER_H_
-#define SERVICES_WS_TOPMOST_WINDOW_OBSERVER_H_
-
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "ui/aura/window_observer.h"
-#include "ui/events/event_observer.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace aura {
-class Window;
-}
-
-namespace ws {
-class WindowTree;
-
-// TopmostWindowObserver is used to track the topmost window under the cursor or
-// touch. It watches a type of located events (mouse or touch) and checks the
-// windows under the mouse cursor or touch location.
-
-// TODO(mukai): support multiple displays.
-class COMPONENT_EXPORT(WINDOW_SERVICE) TopmostWindowObserver
-    : public ui::EventObserver,
-      public aura::WindowObserver {
- public:
-  // |source| determines the type of the event, and |initial_target| is the
-  // initial target of the event. This will report the topmost window under the
-  // cursor to |window_tree|.
-  TopmostWindowObserver(WindowTree* window_tree,
-                        mojom::MoveLoopSource source,
-                        aura::Window* initial_target);
-  ~TopmostWindowObserver() override;
-
- private:
-  friend class TopmostWindowObserverTest;
-
-  // ui::EventObserver:
-  void OnEvent(const ui::Event& event) override;
-
-  // aura::WindowObserver:
-  void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
-  void OnWindowHierarchyChanged(const HierarchyChangeParams& params) override;
-  void OnWindowBoundsChanged(aura::Window* window,
-                             const gfx::Rect& old_bounds,
-                             const gfx::Rect& new_bounds,
-                             ui::PropertyChangeReason reason) override;
-
-  // Looks up the windows at |location_in_screen| and sends the windows to the
-  // client if it's updated.
-  void UpdateTopmostWindows();
-
-  WindowTree* window_tree_;
-
-  // The type of the events which should be obsered.
-  mojom::MoveLoopSource source_;
-
-  // The last target of the event. This is remembered since sometimes the client
-  // wants to see the topmost window excluding the event target (i.e. dragging
-  // window).
-  aura::Window* last_target_;
-
-  // The last location of the event.
-  gfx::Point last_location_;
-
-  // The topmost window excluding |last_target_| under the cursor/touch.
-  aura::Window* topmost_ = nullptr;
-
-  // The topmost window (including |last_target_|) under the cursor/touch.
-  aura::Window* real_topmost_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(TopmostWindowObserver);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_TOPMOST_WINDOW_OBSERVER_H_
diff --git a/services/ws/topmost_window_observer_unittest.cc b/services/ws/topmost_window_observer_unittest.cc
deleted file mode 100644
index 950970a..0000000
--- a/services/ws/topmost_window_observer_unittest.cc
+++ /dev/null
@@ -1,248 +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.
-
-#include "services/ws/topmost_window_observer.h"
-
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/client/screen_position_client.h"
-#include "ui/aura/window.h"
-#include "ui/wm/core/default_screen_position_client.h"
-
-namespace ws {
-
-// This class primarily tests observation of TopmostWindowObserver class.
-// The actual logic of observing topmosts needs to be tested with Ash, so those
-// tests are done in ash/ws/window_service_delegate_impl_unittest.cc.
-class TopmostWindowObserverTest : public testing::Test {
- public:
-  TopmostWindowObserverTest() = default;
-
-  void SetUp() override {
-    aura::client::SetScreenPositionClient(setup_.root(),
-                                          &screen_position_client_);
-  }
-  void TearDown() override {
-    aura::client::SetScreenPositionClient(setup_.root(), nullptr);
-  }
-
- protected:
-  aura::Window* NewWindow() {
-    aura::Window* window = setup_.window_tree_test_helper()->NewWindow();
-    setup_.root()->AddChild(window);
-    return window;
-  }
-  void SetupTopmosts(aura::Window* topmost, aura::Window* real_topmost) {
-    setup_.delegate()->set_topmost(topmost);
-    setup_.delegate()->set_real_topmost(real_topmost);
-  }
-  std::unique_ptr<TopmostWindowObserver> CreateTopmostWindowObserver(
-      aura::Window* window) {
-    return std::make_unique<TopmostWindowObserver>(
-        setup_.window_tree(), mojom::MoveLoopSource::MOUSE, window);
-  }
-  void UpdateTopmostWindows(TopmostWindowObserver* observer) {
-    observer->UpdateTopmostWindows();
-  }
-  void DeleteWindow(aura::Window* window) {
-    Id id = setup_.window_tree_test_helper()->TransportIdForWindow(window);
-    static_cast<mojom::WindowTree*>(setup_.window_tree())->DeleteWindow(1, id);
-  }
-
- private:
-  WindowServiceTestSetup setup_;
-  wm::DefaultScreenPositionClient screen_position_client_;
-
-  DISALLOW_COPY_AND_ASSIGN(TopmostWindowObserverTest);
-};
-
-TEST_F(TopmostWindowObserverTest, BasicObserving) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w2);
-  auto observer = CreateTopmostWindowObserver(w2);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, RealTopmostIsNull) {
-  aura::Window* w1 = NewWindow();
-  SetupTopmosts(w1, nullptr);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, TopmostIsNull) {
-  aura::Window* w1 = NewWindow();
-  SetupTopmosts(nullptr, w1);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, UpdateTopmost) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w2);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-
-  aura::Window* w3 = NewWindow();
-  SetupTopmosts(w3, w2);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_FALSE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-  EXPECT_TRUE(w3->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, UpdateRealTopmost) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w2);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-
-  aura::Window* w3 = NewWindow();
-  SetupTopmosts(w1, w3);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_FALSE(w2->HasObserver(observer.get()));
-  EXPECT_TRUE(w3->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, ToSameTopmost) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w2);
-  auto observer = CreateTopmostWindowObserver(w2);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-
-  SetupTopmosts(w1, w1);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_FALSE(w2->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, ToSameRealTopmost) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w2);
-  auto observer = CreateTopmostWindowObserver(w2);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-
-  SetupTopmosts(w2, w2);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_FALSE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, SameToDifferent) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w1);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_FALSE(w2->HasObserver(observer.get()));
-
-  SetupTopmosts(w1, w2);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, SameToDifferent2) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w1);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_FALSE(w2->HasObserver(observer.get()));
-
-  SetupTopmosts(w2, w1);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, SameToDifferent3) {
-  aura::Window* w1 = NewWindow();
-  SetupTopmosts(w1, w1);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-
-  aura::Window* w2 = NewWindow();
-  aura::Window* w3 = NewWindow();
-
-  SetupTopmosts(w2, w3);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_FALSE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-  EXPECT_TRUE(w3->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, SameToSame) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w1);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_FALSE(w2->HasObserver(observer.get()));
-
-  SetupTopmosts(w2, w2);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_FALSE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, SwapObservingWindows) {
-  aura::Window* w1 = NewWindow();
-  aura::Window* w2 = NewWindow();
-  SetupTopmosts(w1, w2);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-
-  SetupTopmosts(w2, w1);
-  UpdateTopmostWindows(observer.get());
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-  EXPECT_TRUE(w2->HasObserver(observer.get()));
-}
-
-TEST_F(TopmostWindowObserverTest, WindowDestroying) {
-  aura::Window* w1 = NewWindow();
-  SetupTopmosts(nullptr, w1);
-  auto observer = CreateTopmostWindowObserver(w1);
-
-  EXPECT_TRUE(w1->HasObserver(observer.get()));
-
-  SetupTopmosts(nullptr, nullptr);
-  DeleteWindow(w1);
-}
-
-}  // namespace ws
diff --git a/services/ws/user_activity_monitor.cc b/services/ws/user_activity_monitor.cc
deleted file mode 100644
index 3befcfb..0000000
--- a/services/ws/user_activity_monitor.cc
+++ /dev/null
@@ -1,140 +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.
-
-#include "services/ws/user_activity_monitor.h"
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/time/default_tick_clock.h"
-#include "ui/aura/env.h"
-
-namespace ws {
-
-UserActivityMonitor::UserActivityMonitor(
-    aura::Env* env,
-    std::unique_ptr<const base::TickClock> clock)
-    : env_(env), now_clock_(std::move(clock)) {
-  if (!now_clock_)
-    now_clock_ = std::make_unique<base::DefaultTickClock>();
-  last_activity_ = now_clock_->NowTicks();
-
-  env_->AddPreTargetHandler(this);
-}
-
-UserActivityMonitor::~UserActivityMonitor() {
-  env_->RemovePreTargetHandler(this);
-}
-
-void UserActivityMonitor::AddBinding(
-    mojom::UserActivityMonitorRequest request) {
-  bindings_.AddBinding(this, std::move(request));
-}
-
-void UserActivityMonitor::AddUserActivityObserver(
-    uint32_t delay_between_notify_secs,
-    mojom::UserActivityObserverPtr observer) {
-  ActivityObserverInfo info;
-  info.delay = base::TimeDelta::FromSeconds(delay_between_notify_secs);
-  observer.set_connection_error_handler(
-      base::BindRepeating(&UserActivityMonitor::OnActivityObserverDisconnected,
-                          base::Unretained(this), observer.get()));
-  activity_observers_.push_back(std::make_pair(info, std::move(observer)));
-}
-
-void UserActivityMonitor::AddUserIdleObserver(
-    uint32_t idleness_in_minutes,
-    mojom::UserIdleObserverPtr observer) {
-  IdleObserverInfo info;
-  info.idle_duration = base::TimeDelta::FromMinutes(idleness_in_minutes);
-  base::TimeTicks now = now_clock_->NowTicks();
-  DCHECK(!last_activity_.is_null());
-  bool user_is_active = (now - last_activity_ < info.idle_duration);
-  info.idle_state = user_is_active ? mojom::UserIdleObserver::IdleState::ACTIVE
-                                   : mojom::UserIdleObserver::IdleState::IDLE;
-  info.last_idle_state_notification = now;
-  observer->OnUserIdleStateChanged(info.idle_state);
-  observer.set_connection_error_handler(
-      base::BindRepeating(&UserActivityMonitor::OnIdleObserverDisconnected,
-                          base::Unretained(this), observer.get()));
-  idle_observers_.push_back(std::make_pair(info, std::move(observer)));
-  if (user_is_active)
-    ActivateIdleTimer();
-}
-
-void UserActivityMonitor::OnEvent(ui::Event* event) {
-  base::TimeTicks now = now_clock_->NowTicks();
-  for (auto& pair : activity_observers_) {
-    ActivityObserverInfo* info = &(pair.first);
-    if (info->last_activity_notification.is_null() ||
-        (now - info->last_activity_notification) > info->delay) {
-      pair.second->OnUserActivity();
-      info->last_activity_notification = now;
-    }
-  }
-
-  // Wake up all the 'idle' observers.
-  for (auto& pair : idle_observers_) {
-    IdleObserverInfo* info = &(pair.first);
-    if (info->idle_state == mojom::UserIdleObserver::IdleState::ACTIVE)
-      continue;
-    info->last_idle_state_notification = now;
-    info->idle_state = mojom::UserIdleObserver::IdleState::ACTIVE;
-    pair.second->OnUserIdleStateChanged(info->idle_state);
-  }
-
-  last_activity_ = now;
-
-  // Restart the timer if there are some idle observers.
-  if (idle_timer_.IsRunning())
-    idle_timer_.Reset();
-}
-
-void UserActivityMonitor::ActivateIdleTimer() {
-  if (idle_timer_.IsRunning())
-    return;
-  idle_timer_.Start(FROM_HERE, base::TimeDelta::FromMinutes(1), this,
-                    &UserActivityMonitor::OnMinuteTimer);
-}
-
-void UserActivityMonitor::OnMinuteTimer() {
-  base::TimeTicks now = now_clock_->NowTicks();
-  bool active_observer = false;
-  for (auto& pair : idle_observers_) {
-    IdleObserverInfo* info = &(pair.first);
-    if (info->idle_state == mojom::UserIdleObserver::IdleState::IDLE)
-      continue;
-    if (now - info->last_idle_state_notification < info->idle_duration) {
-      active_observer = true;
-      continue;
-    }
-    info->last_idle_state_notification = now;
-    info->idle_state = mojom::UserIdleObserver::IdleState::IDLE;
-    pair.second->OnUserIdleStateChanged(info->idle_state);
-  }
-  // All observers are already notified of IDLE. No point running the timer
-  // anymore.
-  if (!active_observer)
-    idle_timer_.Stop();
-}
-
-void UserActivityMonitor::OnActivityObserverDisconnected(
-    mojom::UserActivityObserver* observer) {
-  activity_observers_.erase(std::remove_if(
-      activity_observers_.begin(), activity_observers_.end(),
-      [observer](
-          const std::pair<ActivityObserverInfo, mojom::UserActivityObserverPtr>&
-              pair) { return pair.second.get() == observer; }));
-}
-
-void UserActivityMonitor::OnIdleObserverDisconnected(
-    mojom::UserIdleObserver* observer) {
-  idle_observers_.erase(std::remove_if(
-      idle_observers_.begin(), idle_observers_.end(),
-      [observer](
-          const std::pair<IdleObserverInfo, mojom::UserIdleObserverPtr>& pair) {
-        return pair.second.get() == observer;
-      }));
-}
-
-}  // namespace ws
diff --git a/services/ws/user_activity_monitor.h b/services/ws/user_activity_monitor.h
deleted file mode 100644
index 319e8a1..0000000
--- a/services/ws/user_activity_monitor.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_USER_ACTIVITY_MONITOR_H_
-#define SERVICES_WS_USER_ACTIVITY_MONITOR_H_
-
-#include "base/component_export.h"
-#include "base/time/tick_clock.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_ptr_set.h"
-#include "services/ws/public/mojom/user_activity_monitor.mojom.h"
-#include "ui/events/event_handler.h"
-
-namespace aura {
-class Env;
-}
-
-namespace ws {
-
-namespace test {
-class UserActivityMonitorTestApi;
-}
-
-// Monitors user interaction by installing itself as a PreTargetHandler on
-// ui::aura::Env, and updates observers accordingly. Exported for test.
-class COMPONENT_EXPORT(WINDOW_SERVICE) UserActivityMonitor
-    : public mojom::UserActivityMonitor,
-      public ui::EventHandler {
- public:
-  // |now_clock| is used to get the timestamp. If |now_clock| is nullptr, then
-  // DefaultTickClock is used.
-  explicit UserActivityMonitor(
-      aura::Env* env,
-      std::unique_ptr<const base::TickClock> now_clock = nullptr);
-  ~UserActivityMonitor() override;
-
-  // Provides an implementation for the remote request.
-  void AddBinding(mojom::UserActivityMonitorRequest request);
-
-  // mojom::UserActivityMonitor:
-  void AddUserActivityObserver(
-      uint32_t delay_between_notify_secs,
-      mojom::UserActivityObserverPtr observer) override;
-  void AddUserIdleObserver(uint32_t idleness_in_minutes,
-                           mojom::UserIdleObserverPtr observer) override;
-
-  // ui::EventHandler:
-  void OnEvent(ui::Event* event) override;
-
- private:
-  friend class test::UserActivityMonitorTestApi;
-
-  // Makes sure the idle timer is running.
-  void ActivateIdleTimer();
-
-  // Called every minute when |idle_timer_| is active.
-  void OnMinuteTimer();
-
-  void OnActivityObserverDisconnected(mojom::UserActivityObserver* observer);
-  void OnIdleObserverDisconnected(mojom::UserIdleObserver* observer);
-
-  aura::Env* env_;
-
-  mojo::BindingSet<mojom::UserActivityMonitor> bindings_;
-  std::unique_ptr<const base::TickClock> now_clock_;
-
-  struct ActivityObserverInfo {
-    base::TimeTicks last_activity_notification;
-    base::TimeDelta delay;
-  };
-  std::vector<std::pair<ActivityObserverInfo, mojom::UserActivityObserverPtr>>
-      activity_observers_;
-
-  struct IdleObserverInfo {
-    base::TimeTicks last_idle_state_notification;
-    base::TimeDelta idle_duration;
-    mojom::UserIdleObserver::IdleState idle_state;
-  };
-  std::vector<std::pair<IdleObserverInfo, mojom::UserIdleObserverPtr>>
-      idle_observers_;
-  // Timer used to determine user's idleness. The timer is run only when at
-  // least one of the idle-observers are notified ACTIVE.
-  base::RepeatingTimer idle_timer_;
-  base::TimeTicks last_activity_;
-
-  DISALLOW_COPY_AND_ASSIGN(UserActivityMonitor);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_USER_ACTIVITY_MONITOR_H_
diff --git a/services/ws/user_activity_monitor_unittest.cc b/services/ws/user_activity_monitor_unittest.cc
deleted file mode 100644
index 3f64049..0000000
--- a/services/ws/user_activity_monitor_unittest.cc
+++ /dev/null
@@ -1,230 +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.
-
-#include "services/ws/user_activity_monitor.h"
-
-#include "base/run_loop.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "base/test/test_mock_time_task_runner.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "services/ws/common/task_runner_test_base.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/env.h"
-
-namespace ws {
-
-using mojom::UserIdleObserver;
-
-namespace test {
-
-class UserActivityMonitorTestApi {
- public:
-  explicit UserActivityMonitorTestApi(UserActivityMonitor* monitor)
-      : monitor_(monitor) {}
-
-  void SetTimerTaskRunner(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-    monitor_->idle_timer_.SetTaskRunner(task_runner);
-  }
-
- private:
-  UserActivityMonitor* monitor_;
-  DISALLOW_COPY_AND_ASSIGN(UserActivityMonitorTestApi);
-};
-
-class TestUserActivityObserver : public mojom::UserActivityObserver {
- public:
-  TestUserActivityObserver() : binding_(this) {}
-  ~TestUserActivityObserver() override {}
-
-  mojom::UserActivityObserverPtr GetPtr() {
-    mojom::UserActivityObserverPtr ptr;
-    binding_.Bind(mojo::MakeRequest(&ptr));
-    return ptr;
-  }
-
-  bool GetAndResetReceivedUserActivity() {
-    bool val = received_user_activity_;
-    received_user_activity_ = false;
-    return val;
-  }
-
- private:
-  // mojom::UserActivityObserver:
-  void OnUserActivity() override { received_user_activity_ = true; }
-
-  mojo::Binding<mojom::UserActivityObserver> binding_;
-  bool received_user_activity_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(TestUserActivityObserver);
-};
-
-class TestUserIdleObserver : public mojom::UserIdleObserver {
- public:
-  TestUserIdleObserver() : binding_(this) {}
-  ~TestUserIdleObserver() override {}
-
-  mojom::UserIdleObserverPtr GetPtr() {
-    mojom::UserIdleObserverPtr ptr;
-    binding_.Bind(mojo::MakeRequest(&ptr));
-    return ptr;
-  }
-
-  bool GetAndResetIdleState(UserIdleObserver::IdleState* state) {
-    if (!received_idle_state_)
-      return false;
-    received_idle_state_ = false;
-    *state = idle_state_;
-    return true;
-  }
-
- private:
-  // mojom::UserIdleObserver:
-  void OnUserIdleStateChanged(UserIdleObserver::IdleState new_state) override {
-    received_idle_state_ = true;
-    idle_state_ = new_state;
-  }
-
-  mojo::Binding<mojom::UserIdleObserver> binding_;
-  bool received_idle_state_ = false;
-  UserIdleObserver::IdleState idle_state_ = UserIdleObserver::IdleState::ACTIVE;
-
-  DISALLOW_COPY_AND_ASSIGN(TestUserIdleObserver);
-};
-
-class Ws2UserActivityMonitorTest : public TaskRunnerTestBase {
- public:
-  Ws2UserActivityMonitorTest() {}
-  ~Ws2UserActivityMonitorTest() override {}
-
-  UserActivityMonitor* monitor() { return monitor_.get(); }
-
- private:
-  // testing::Test:
-  void SetUp() override {
-    env_ = aura::Env::CreateInstance();
-    TaskRunnerTestBase::SetUp();
-    monitor_ = std::make_unique<UserActivityMonitor>(
-        env_.get(), task_runner()->DeprecatedGetMockTickClock());
-  }
-
-  std::unique_ptr<aura::Env> env_;
-  std::unique_ptr<UserActivityMonitor> monitor_;
-
-  DISALLOW_COPY_AND_ASSIGN(Ws2UserActivityMonitorTest);
-};
-
-TEST_F(Ws2UserActivityMonitorTest, UserActivityObserver) {
-  TestUserActivityObserver first_observer, second_observer;
-  monitor()->AddUserActivityObserver(3, first_observer.GetPtr());
-  monitor()->AddUserActivityObserver(4, second_observer.GetPtr());
-
-  // The first activity should notify both observers.
-  monitor()->OnEvent(nullptr);
-  RunUntilIdle();
-  EXPECT_TRUE(first_observer.GetAndResetReceivedUserActivity());
-  EXPECT_TRUE(second_observer.GetAndResetReceivedUserActivity());
-
-  // The next activity after just one second should not notify either observer.
-  RunTasksForNext(base::TimeDelta::FromSeconds(1));
-  monitor()->OnEvent(nullptr);
-  RunUntilIdle();
-  EXPECT_FALSE(first_observer.GetAndResetReceivedUserActivity());
-  EXPECT_FALSE(second_observer.GetAndResetReceivedUserActivity());
-
-  RunTasksForNext(base::TimeDelta::FromMilliseconds(2001));
-  monitor()->OnEvent(nullptr);
-  RunUntilIdle();
-  EXPECT_TRUE(first_observer.GetAndResetReceivedUserActivity());
-  EXPECT_FALSE(second_observer.GetAndResetReceivedUserActivity());
-
-  RunTasksForNext(base::TimeDelta::FromSeconds(1));
-  monitor()->OnEvent(nullptr);
-  RunUntilIdle();
-  EXPECT_FALSE(first_observer.GetAndResetReceivedUserActivity());
-  EXPECT_TRUE(second_observer.GetAndResetReceivedUserActivity());
-}
-
-// Tests that idleness observers receive the correct notification upon
-// connection.
-TEST_F(Ws2UserActivityMonitorTest, UserIdleObserverConnectNotification) {
-  UserIdleObserver::IdleState idle_state;
-
-  // If an observer is added without any user activity, then it still receives
-  // an ACTIVE notification immediately.
-  TestUserIdleObserver first_observer;
-  monitor()->AddUserIdleObserver(1, first_observer.GetPtr());
-  RunUntilIdle();
-  EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state);
-
-  // If an observer is added without any user activity and the system has been
-  // idle, then the observer receives an IDLE notification immediately.
-  RunTasksForNext(base::TimeDelta::FromMinutes(5));
-  TestUserIdleObserver second_observer;
-  monitor()->AddUserIdleObserver(4, second_observer.GetPtr());
-  RunUntilIdle();
-  EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state);
-  EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state);
-
-  // If an observer is added after some user activity, then it receives an
-  // immediate ACTIVE notification.
-  monitor()->OnEvent(nullptr);
-  TestUserIdleObserver third_observer;
-  monitor()->AddUserIdleObserver(1, third_observer.GetPtr());
-  RunUntilIdle();
-  EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state);
-  EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state);
-  EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state);
-
-  RunTasksForNext(base::TimeDelta::FromMinutes(10));
-  TestUserIdleObserver fourth_observer;
-  monitor()->AddUserIdleObserver(1, fourth_observer.GetPtr());
-  RunUntilIdle();
-  EXPECT_TRUE(fourth_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state);
-  EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state);
-  EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state);
-  EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state);
-
-  // All observers are idle. These should not receive any IDLE notifications as
-  // more time passes by.
-  RunTasksForNext(base::TimeDelta::FromMinutes(100));
-  RunUntilIdle();
-  EXPECT_FALSE(first_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_FALSE(second_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_FALSE(third_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_FALSE(fourth_observer.GetAndResetIdleState(&idle_state));
-
-  // Some activity would notify ACTIVE to all observers.
-  monitor()->OnEvent(nullptr);
-  RunUntilIdle();
-  EXPECT_TRUE(fourth_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state);
-  EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state);
-  EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state);
-  EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state);
-
-  // Yet more activity should not send any notifications.
-  monitor()->OnEvent(nullptr);
-  RunUntilIdle();
-  EXPECT_FALSE(first_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_FALSE(second_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_FALSE(third_observer.GetAndResetIdleState(&idle_state));
-  EXPECT_FALSE(fourth_observer.GetAndResetIdleState(&idle_state));
-}
-
-}  // namespace test
-}  // namespace ws
diff --git a/services/ws/window_delegate_impl.cc b/services/ws/window_delegate_impl.cc
deleted file mode 100644
index 986ed1c3..0000000
--- a/services/ws/window_delegate_impl.cc
+++ /dev/null
@@ -1,97 +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.
-
-#include "services/ws/window_delegate_impl.h"
-
-#include "services/ws/embedding.h"
-#include "services/ws/proxy_window.h"
-#include "services/ws/window_properties.h"
-#include "ui/aura/window.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/base/hit_test.h"
-#include "ui/gfx/native_widget_types.h"
-
-namespace ws {
-
-WindowDelegateImpl::WindowDelegateImpl() = default;
-
-gfx::Size WindowDelegateImpl::GetMinimumSize() const {
-  return gfx::Size();
-}
-
-gfx::Size WindowDelegateImpl::GetMaximumSize() const {
-  return gfx::Size();
-}
-
-void WindowDelegateImpl::OnBoundsChanged(const gfx::Rect& old_bounds,
-                                         const gfx::Rect& new_bounds) {}
-
-gfx::NativeCursor WindowDelegateImpl::GetCursor(const gfx::Point& point) {
-  // Find the cursor of the embed root for an embedded Window, or the toplevel
-  // if it's not an embedded client. This is done to match the behavior of Aura,
-  // which sets the cursor on the root.
-  for (ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window_);
-       proxy_window; proxy_window = ProxyWindow::GetMayBeNull(
-                         proxy_window->window()->parent())) {
-    if (proxy_window->IsTopLevel()) {
-      if (proxy_window->window() == window_)
-        return proxy_window->cursor();
-      gfx::Point toplevel_point = point;
-      aura::Window::ConvertPointToTarget(window_, proxy_window->window(),
-                                         &toplevel_point);
-      return proxy_window->window()->delegate()->GetCursor(toplevel_point);
-    }
-
-    // Assume that if the embedder is intercepting events, it's also responsible
-    // for the cursor (which is the case with content embeddings).
-    if (proxy_window->HasEmbedding() &&
-        !proxy_window->embedding()->embedding_tree_intercepts_events()) {
-      return proxy_window->cursor();
-    }
-  }
-
-  // TODO(sky): there should be a NOTREACHED() here, but we're hitting this on
-  // asan builder. Figure out. https://crbug.com/855767.
-  return gfx::kNullCursor;
-}
-
-int WindowDelegateImpl::GetNonClientComponent(const gfx::Point& point) const {
-  return HTNOWHERE;
-}
-
-bool WindowDelegateImpl::ShouldDescendIntoChildForEventHandling(
-    aura::Window* child,
-    const gfx::Point& location) {
-  return true;
-}
-
-bool WindowDelegateImpl::CanFocus() {
-  return window_->GetProperty(kCanFocus);
-}
-
-void WindowDelegateImpl::OnCaptureLost() {}
-
-void WindowDelegateImpl::OnPaint(const ui::PaintContext& context) {}
-
-void WindowDelegateImpl::OnDeviceScaleFactorChanged(
-    float old_device_scale_factor,
-    float new_device_scale_factor) {}
-
-void WindowDelegateImpl::OnWindowDestroying(aura::Window* window) {}
-
-void WindowDelegateImpl::OnWindowDestroyed(aura::Window* window) {
-  delete this;
-}
-
-void WindowDelegateImpl::OnWindowTargetVisibilityChanged(bool visible) {}
-
-bool WindowDelegateImpl::HasHitTestMask() const {
-  return false;
-}
-
-void WindowDelegateImpl::GetHitTestMask(SkPath* mask) const {}
-
-WindowDelegateImpl::~WindowDelegateImpl() = default;
-
-}  // namespace ws
diff --git a/services/ws/window_delegate_impl.h b/services/ws/window_delegate_impl.h
deleted file mode 100644
index e26224e..0000000
--- a/services/ws/window_delegate_impl.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_DELEGATE_IMPL_H_
-#define SERVICES_WS_WINDOW_DELEGATE_IMPL_H_
-
-#include "base/component_export.h"
-#include "ui/aura/window_delegate.h"
-
-namespace ws {
-
-// The aura::WindowDelegate implementation used by Windows created by the
-// WindowService. The local environment may create its own WindowDelegate for
-// top-level windows (by way of WindowServiceDelegate::NewTopLevel()).
-//
-// WindowDelegateImpl deletes itself when the associated window is deleted.
-class COMPONENT_EXPORT(WINDOW_SERVICE) WindowDelegateImpl
-    : public aura::WindowDelegate {
- public:
-  WindowDelegateImpl();
-
-  // This must be set right after creating WindowDelegateImpl (it can't be
-  // passed to the constructor because Window's constructor takes
-  // WindowDelegate).
-  void set_window(aura::Window* window) { window_ = window; }
-
-  // aura::WindowDelegate:
-  gfx::Size GetMinimumSize() const override;
-  gfx::Size GetMaximumSize() const override;
-  void OnBoundsChanged(const gfx::Rect& old_bounds,
-                       const gfx::Rect& new_bounds) override;
-  gfx::NativeCursor GetCursor(const gfx::Point& point) override;
-  int GetNonClientComponent(const gfx::Point& point) const override;
-  bool ShouldDescendIntoChildForEventHandling(
-      aura::Window* child,
-      const gfx::Point& location) override;
-  bool CanFocus() override;
-  void OnCaptureLost() override;
-  void OnPaint(const ui::PaintContext& context) override;
-  void OnDeviceScaleFactorChanged(float old_device_scale_factor,
-                                  float new_device_scale_factor) override;
-  void OnWindowDestroying(aura::Window* window) override;
-  void OnWindowDestroyed(aura::Window* window) override;
-  void OnWindowTargetVisibilityChanged(bool visible) override;
-  bool HasHitTestMask() const override;
-  void GetHitTestMask(SkPath* mask) const override;
-
- private:
-  ~WindowDelegateImpl() override;
-
-  aura::Window* window_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowDelegateImpl);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_DELEGATE_IMPL_H_
diff --git a/services/ws/window_delegate_impl_unittest.cc b/services/ws/window_delegate_impl_unittest.cc
deleted file mode 100644
index 09fe7e95..0000000
--- a/services/ws/window_delegate_impl_unittest.cc
+++ /dev/null
@@ -1,92 +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.
-
-#include "services/ws/window_delegate_impl.h"
-
-#include "services/ws/embedding.h"
-#include "services/ws/test_window_service_delegate.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/window.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/base/cursor/cursor_type.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace ws {
-
-TEST(WindowDeleteImplTest, GetCursorTopLevel) {
-  WindowServiceTestSetup setup;
-  // WindowDelegateImpl deletes itself when the window is deleted.
-  WindowDelegateImpl* delegate = new WindowDelegateImpl();
-  setup.delegate()->set_delegate_for_next_top_level(delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  delegate->set_window(top_level);
-  // Verify no crash when no cursor has been set.
-  top_level->GetCursor(gfx::Point());
-
-  // Set a cursor and ensure we get it back.
-  const ui::Cursor help_cursor(ui::CursorType::kHelp);
-  setup.window_tree_test_helper()->SetCursor(top_level, help_cursor);
-  EXPECT_EQ(help_cursor.native_type(),
-            top_level->GetCursor(gfx::Point()).native_type());
-}
-
-TEST(WindowDeleteImplTest, GetCursorForEmbedding) {
-  WindowServiceTestSetup setup;
-  // WindowDelegateImpl deletes itself when the window is deleted.
-  WindowDelegateImpl* delegate = new WindowDelegateImpl();
-  setup.delegate()->set_delegate_for_next_top_level(delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  delegate->set_window(top_level);
-
-  // Create an embedding.
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(embed_window);
-  top_level->AddChild(embed_window);
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(embed_window);
-
-  // Set a cursor on the embedded window from the embedded client and ensure we
-  // get it back.
-  const ui::Cursor help_cursor(ui::CursorType::kHelp);
-  embedding_helper->window_tree_test_helper->SetCursor(embed_window,
-                                                       help_cursor);
-  EXPECT_EQ(help_cursor.native_type(),
-            embed_window->GetCursor(gfx::Point()).native_type());
-}
-
-TEST(WindowDeleteImplTest, GetCursorForEmbeddingInterceptsEvents) {
-  WindowServiceTestSetup setup;
-  // WindowDelegateImpl deletes itself when the window is deleted.
-  WindowDelegateImpl* delegate = new WindowDelegateImpl();
-  setup.delegate()->set_delegate_for_next_top_level(delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  delegate->set_window(top_level);
-
-  // Set a cursor on |top_level|.
-  const ui::Cursor help_cursor(ui::CursorType::kHelp);
-  setup.window_tree_test_helper()->SetCursor(top_level, help_cursor);
-
-  // Create an embedding.
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(embed_window);
-  top_level->AddChild(embed_window);
-  std::unique_ptr<EmbeddingHelper> embedding_helper = setup.CreateEmbedding(
-      embed_window, mojom::kEmbedFlagEmbedderInterceptsEvents);
-
-  // Set a cursor on the embedding. Because the embedding was created with
-  // kEmbedFlagEmbedderInterceptsEvents the cursor should come from the parent
-  // (|top_level|).
-  const ui::Cursor ibeam_cursor(ui::CursorType::kIBeam);
-  embedding_helper->window_tree_test_helper->SetCursor(embed_window,
-                                                       ibeam_cursor);
-  EXPECT_EQ(help_cursor.native_type(),
-            embed_window->GetCursor(gfx::Point()).native_type());
-}
-
-}  // namespace ws
diff --git a/services/ws/window_manager_interface.h b/services/ws/window_manager_interface.h
deleted file mode 100644
index 72b920e..0000000
--- a/services/ws/window_manager_interface.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_MANAGER_INTERFACE_H_
-#define SERVICES_WS_WINDOW_MANAGER_INTERFACE_H_
-
-#include "base/component_export.h"
-#include "base/macros.h"
-
-namespace ws {
-
-// Used for any associated interfaces that the local environment exposes to
-// clients.
-class COMPONENT_EXPORT(WINDOW_SERVICE) WindowManagerInterface {
- public:
-  WindowManagerInterface() {}
-  virtual ~WindowManagerInterface() {}
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_MANAGER_INTERFACE_H_
diff --git a/services/ws/window_occlusion_change_builder.cc b/services/ws/window_occlusion_change_builder.cc
deleted file mode 100644
index 703f38ca..0000000
--- a/services/ws/window_occlusion_change_builder.cc
+++ /dev/null
@@ -1,47 +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.
-
-#include "services/ws/window_occlusion_change_builder.h"
-
-#include <map>
-#include <set>
-
-#include "services/ws/proxy_window.h"
-#include "services/ws/window_tree.h"
-
-namespace ws {
-
-WindowOcclusionChangeBuilder::WindowOcclusionChangeBuilder()
-    : inner_(aura::WindowOcclusionChangeBuilder::Create()) {}
-
-WindowOcclusionChangeBuilder::~WindowOcclusionChangeBuilder() {
-  // Apply occlusion changes.
-  inner_.reset();
-
-  // Get remote windows and group them based on owning trees.
-  std::map<WindowTree*, std::set<aura::Window*>> changes;
-  while (!windows_.windows().empty()) {
-    aura::Window* window = windows_.Pop();
-
-    ProxyWindow* const proxy_window = ProxyWindow::GetMayBeNull(window);
-    if (!proxy_window || !proxy_window->owning_window_tree())
-      continue;
-
-    changes[proxy_window->owning_window_tree()].insert(window);
-  }
-
-  // Send out changes on a per-tree basis.
-  for (auto& change : changes)
-    change.first->SendOcclusionStates(change.second);
-}
-
-void WindowOcclusionChangeBuilder::Add(
-    aura::Window* window,
-    aura::Window::OcclusionState occlusion_state,
-    SkRegion occluded_region) {
-  windows_.Add(window);
-  inner_->Add(window, occlusion_state, occluded_region);
-}
-
-}  // namespace ws
diff --git a/services/ws/window_occlusion_change_builder.h b/services/ws/window_occlusion_change_builder.h
deleted file mode 100644
index b03a2e6..0000000
--- a/services/ws/window_occlusion_change_builder.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_OCCLUSION_CHANGE_BUILDER_H_
-#define SERVICES_WS_WINDOW_OCCLUSION_CHANGE_BUILDER_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "ui/aura/window_occlusion_change_builder.h"
-#include "ui/aura/window_tracker.h"
-
-namespace ws {
-
-// Group and send occlusion change to corresponding WindowTree in batches.
-class WindowOcclusionChangeBuilder : public aura::WindowOcclusionChangeBuilder {
- public:
-  WindowOcclusionChangeBuilder();
-  ~WindowOcclusionChangeBuilder() override;
-
- private:
-  // WindowOcclusionChangeBuilder:
-  void Add(aura::Window* window,
-           aura::Window::OcclusionState occlusion_state,
-           SkRegion occluded_region) override;
-
-  // Inner builder to apply the changes to windows at Window Service side.
-  std::unique_ptr<aura::WindowOcclusionChangeBuilder> inner_;
-
-  // Tracks live windows that has a change.
-  aura::WindowTracker windows_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowOcclusionChangeBuilder);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_OCCLUSION_CHANGE_BUILDER_H_
diff --git a/services/ws/window_properties.cc b/services/ws/window_properties.cc
deleted file mode 100644
index 029937a..0000000
--- a/services/ws/window_properties.cc
+++ /dev/null
@@ -1,13 +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.
-
-#include "services/ws/window_properties.h"
-
-#include "ui/aura/window.h"
-
-namespace ws {
-
-DEFINE_UI_CLASS_PROPERTY_KEY(bool, kCanFocus, true)
-
-}  // namespace ws
diff --git a/services/ws/window_properties.h b/services/ws/window_properties.h
deleted file mode 100644
index 0a84b80..0000000
--- a/services/ws/window_properties.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_PROPERTIES_H_
-#define SERVICES_WS_WINDOW_PROPERTIES_H_
-
-#include "base/component_export.h"
-#include "ui/base/class_property.h"
-
-namespace aura {
-template <typename T>
-using WindowProperty = ui::ClassProperty<T>;
-}  // namespace aura
-
-namespace ws {
-
-// This property is set from WindowTree::SetCanFocus(). The value of this
-// property influeces activation as well. In particular, if this is false and
-// set on a top-level, then the top-level can not be activated.
-COMPONENT_EXPORT(WINDOW_SERVICE)
-extern const aura::WindowProperty<bool>* const kCanFocus;
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_PROPERTIES_H_
diff --git a/services/ws/window_server_service_test_base.cc b/services/ws/window_server_service_test_base.cc
deleted file mode 100644
index 102336f..0000000
--- a/services/ws/window_server_service_test_base.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/window_server_service_test_base.h"
-
-#include <memory>
-
-#include "base/command_line.h"
-#include "base/memory/ptr_util.h"
-#include "services/service_manager/public/cpp/manifest_builder.h"
-#include "services/viz/public/cpp/manifest.h"
-#include "services/ws/common/switches.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/test_ws/test_manifest.h"
-#include "ui/gl/gl_switches.h"
-
-namespace ws {
-
-namespace {
-
-const char kTestAppName[] = "ui_ws2_service_unittests";
-
-void EnsureCommandLineSwitch(const std::string& name) {
-  base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
-  if (!cmd_line->HasSwitch(name))
-    cmd_line->AppendSwitch(name);
-}
-
-}  // namespace
-
-WindowServerServiceTestBase::WindowServerServiceTestBase()
-    : test_service_manager_(
-          {test_ws::GetManifest(), viz::GetManifest(),
-           service_manager::ManifestBuilder()
-               .WithServiceName(kTestAppName)
-               .ExposeCapability("ui:window_tree_client",
-                                 service_manager::Manifest::InterfaceList<
-                                     ws::mojom::WindowTreeClient>())
-               .RequireCapability(kTestAppName, "ui:window_tree_client")
-               .RequireCapability(ws::mojom::kServiceName, "app")
-               .RequireCapability("viz", "viz_host")
-               .Build()}),
-      test_service_binding_(
-          this,
-          test_service_manager_.RegisterTestInstance(kTestAppName)) {
-  EnsureCommandLineSwitch(switches::kUseTestConfig);
-  EnsureCommandLineSwitch(::switches::kOverrideUseSoftwareGLForTests);
-}
-
-WindowServerServiceTestBase::~WindowServerServiceTestBase() = default;
-
-const char* WindowServerServiceTestBase::test_name() const {
-  return kTestAppName;
-}
-
-}  // namespace ws
diff --git a/services/ws/window_server_service_test_base.h b/services/ws/window_server_service_test_base.h
deleted file mode 100644
index 17a2a14..0000000
--- a/services/ws/window_server_service_test_base.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_SERVER_SERVICE_TEST_BASE_H_
-#define SERVICES_WS_WINDOW_SERVER_SERVICE_TEST_BASE_H_
-
-#include "base/macros.h"
-#include "base/test/scoped_task_environment.h"
-#include "services/service_manager/public/cpp/connector.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_binding.h"
-#include "services/service_manager/public/cpp/test/test_service_manager.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace ws {
-
-// Base class for all window manager service tests to perform some common setup.
-// This fixture brings up a test Service Manager and acts as a service instance
-// which identifies as the service named "ui_ws2_service_unittests". Subclasses
-// can implement |OnBindInterface()| to handle interface requests targeting that
-// instance in tests.
-class WindowServerServiceTestBase : public testing::Test,
-                                    public service_manager::Service {
- public:
-  WindowServerServiceTestBase();
-  ~WindowServerServiceTestBase() override;
-
-  service_manager::Connector* connector() {
-    return test_service_binding_.GetConnector();
-  }
-
-  const char* test_name() const;
-
- private:
-  base::test::ScopedTaskEnvironment task_environment_;
-  service_manager::TestServiceManager test_service_manager_;
-  service_manager::ServiceBinding test_service_binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowServerServiceTestBase);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_SERVER_SERVICE_TEST_BASE_H_
diff --git a/services/ws/window_server_test_impl.cc b/services/ws/window_server_test_impl.cc
deleted file mode 100644
index 0fc8818..0000000
--- a/services/ws/window_server_test_impl.cc
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/window_server_test_impl.h"
-
-#include <set>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "components/viz/common/frame_sinks/copy_output_request.h"
-#include "services/ws/client_root.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree.h"
-#include "ui/aura/window.h"
-
-namespace ws {
-
-namespace {
-
-// Returns true if bitmap contains more than 5 different colors.
-bool SanityCheckOutputSkBitmap(const SkBitmap& bitmap) {
-  DCHECK_EQ(bitmap.info().colorType(), kN32_SkColorType);
-
-  const uint32_t* packed_pixels =
-      reinterpret_cast<uint32_t*>(bitmap.getPixels());
-  if (!packed_pixels)
-    return false;
-
-  constexpr size_t kMaxColors = 5;
-  std::set<uint32_t> colors;
-  for (size_t i = 0; i < bitmap.computeByteSize(); i += 4) {
-    // Get the color ignoring alpha.
-    uint32_t c = SkColorSetA(packed_pixels[i >> 2], 0);
-    if (colors.find(c) != colors.end())
-      continue;
-
-    colors.insert(c);
-    if (colors.size() >= kMaxColors)
-      return true;
-  }
-
-  return false;
-}
-
-}  // namespace
-
-WindowServerTestImpl::WindowServerTestImpl(WindowService* window_service)
-    : window_service_(window_service) {}
-
-WindowServerTestImpl::~WindowServerTestImpl() = default;
-
-WindowTree* WindowServerTestImpl::GetWindowTreeWithClientName(
-    const std::string& name) {
-  for (WindowTree* window_tree : window_service_->window_trees()) {
-    if (window_tree->client_name() == name)
-      return window_tree;
-  }
-  return nullptr;
-}
-
-void WindowServerTestImpl::OnSurfaceActivated(
-    const std::string& desired_client_name,
-    EnsureClientHasDrawnWindowCallback cb,
-    const std::string& actual_client_name) {
-  if (desired_client_name == actual_client_name) {
-    RequestWindowContents(desired_client_name, /*retry_count=*/0,
-                          std::move(cb));
-  } else {
-    // No tree with the given name, or it hasn't painted yet. Install a callback
-    // for the next time a client creates a CompositorFramesink.
-    InstallCallback(desired_client_name, std::move(cb));
-  }
-}
-
-void WindowServerTestImpl::InstallCallback(
-    const std::string& client_name,
-    EnsureClientHasDrawnWindowCallback cb) {
-  window_service_->SetSurfaceActivationCallback(
-      base::BindOnce(&WindowServerTestImpl::OnSurfaceActivated,
-                     base::Unretained(this), client_name, std::move(cb)));
-}
-
-void WindowServerTestImpl::RequestWindowContents(
-    const std::string& client_name,
-    int retry_count,
-    EnsureClientHasDrawnWindowCallback cb) {
-  ClientRoot* client_root = GetWindowTreeWithClientName(client_name)
-                                ->GetFirstRootWithCompositorFrameSink();
-  if (!client_root || client_root->window()->bounds().IsEmpty()) {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(&WindowServerTestImpl::RequestWindowContents,
-                                  base::Unretained(this), client_name,
-                                  retry_count, std::move(cb)));
-    return;
-  }
-
-  auto copy_output_request = std::make_unique<viz::CopyOutputRequest>(
-      viz::CopyOutputRequest::ResultFormat::RGBA_BITMAP,
-      base::BindOnce(&WindowServerTestImpl::OnWindowContentsCaptured,
-                     base::Unretained(this), client_name, retry_count,
-                     std::move(cb)));
-  aura::Window* window = client_root->window();
-  copy_output_request->set_area(gfx::Rect(window->bounds().size()));
-  window->layer()->RequestCopyOfOutput(std::move(copy_output_request));
-}
-
-void WindowServerTestImpl::OnWindowContentsCaptured(
-    const std::string& client_name,
-    int retry_count,
-    EnsureClientHasDrawnWindowCallback cb,
-    std::unique_ptr<viz::CopyOutputResult> result) {
-  if (!result->IsEmpty() && SanityCheckOutputSkBitmap(result->AsSkBitmap())) {
-    std::move(cb).Run(/*success=*/true);
-    return;
-  }
-
-  // Arbitrary retry params.
-  constexpr int kMaxRetry = 3;
-  constexpr base::TimeDelta kRetryDelay = base::TimeDelta::FromSeconds(1);
-
-  ++retry_count;
-  if (retry_count == kMaxRetry) {
-    std::move(cb).Run(/*success=*/false);
-    return;
-  }
-
-  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&WindowServerTestImpl::RequestWindowContents,
-                     base::Unretained(this), client_name, retry_count,
-                     std::move(cb)),
-      kRetryDelay);
-}
-
-void WindowServerTestImpl::EnsureClientHasDrawnWindow(
-    const std::string& client_name,
-    EnsureClientHasDrawnWindowCallback callback) {
-  WindowTree* tree = GetWindowTreeWithClientName(client_name);
-  if (tree && tree->GetFirstRootWithCompositorFrameSink()) {
-    RequestWindowContents(client_name, /*retry_count=*/0, std::move(callback));
-    return;
-  }
-  InstallCallback(client_name, std::move(callback));
-}
-
-}  // namespace ws
diff --git a/services/ws/window_server_test_impl.h b/services/ws/window_server_test_impl.h
deleted file mode 100644
index e7cdaa2..0000000
--- a/services/ws/window_server_test_impl.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_SERVER_TEST_IMPL_H_
-#define SERVICES_WS_WINDOW_SERVER_TEST_IMPL_H_
-
-#include <memory>
-
-#include "services/ws/public/mojom/window_server_test.mojom.h"
-
-namespace viz {
-class CopyOutputResult;
-}
-
-namespace ws {
-
-class WindowService;
-class WindowTree;
-
-// Used to detect when a client (as identified by a name) has drawn at least
-// once to screen.
-class WindowServerTestImpl : public mojom::WindowServerTest {
- public:
-  explicit WindowServerTestImpl(WindowService* server);
-  ~WindowServerTestImpl() override;
-
- private:
-  WindowTree* GetWindowTreeWithClientName(const std::string& name);
-
-  // Callback when a surface is activated. |desired_client_name| is the name of
-  // the client that was requested, |actual_client_name| is the name of the
-  // client that actually painted.
-  void OnSurfaceActivated(const std::string& desired_client_name,
-                          EnsureClientHasDrawnWindowCallback cb,
-                          const std::string& actual_client_name);
-
-  // Installs a callback that calls OnSurfaceActivated() the next time a client
-  // creates a compositor frame.
-  void InstallCallback(const std::string& name,
-                       EnsureClientHasDrawnWindowCallback cb);
-
-  // Request to capture the window contents of the client and invoke the
-  // callback with sanity check result of the captured pixels.
-  void RequestWindowContents(const std::string& client_name,
-                             int retry_count,
-                             EnsureClientHasDrawnWindowCallback cb);
-  void OnWindowContentsCaptured(const std::string& client_name,
-                                int retry_count,
-                                EnsureClientHasDrawnWindowCallback cb,
-                                std::unique_ptr<viz::CopyOutputResult> result);
-
-  // mojom::WindowServerTest:
-  void EnsureClientHasDrawnWindow(
-      const std::string& client_name,
-      EnsureClientHasDrawnWindowCallback callback) override;
-
-  WindowService* window_service_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowServerTestImpl);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_SERVER_TEST_IMPL_H_
diff --git a/services/ws/window_service.cc b/services/ws/window_service.cc
deleted file mode 100644
index 6cf3307..0000000
--- a/services/ws/window_service.cc
+++ /dev/null
@@ -1,392 +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.
-
-#include "services/ws/window_service.h"
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "services/service_manager/public/cpp/bind_source_info.h"
-#include "services/ws/common/switches.h"
-#include "services/ws/common/util.h"
-#include "services/ws/embedding.h"
-#include "services/ws/event_injector.h"
-#include "services/ws/event_queue.h"
-#include "services/ws/proxy_window.h"
-#include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/public/mojom/window_manager.mojom.h"
-#include "services/ws/remoting_event_injector.h"
-#include "services/ws/screen_provider.h"
-#include "services/ws/user_activity_monitor.h"
-#include "services/ws/window_occlusion_change_builder.h"
-#include "services/ws/window_server_test_impl.h"
-#include "services/ws/window_service_delegate.h"
-#include "services/ws/window_service_observer.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_factory.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window_occlusion_tracker.h"
-#include "ui/base/mojo/clipboard_host.h"
-#include "ui/wm/core/shadow_types.h"
-
-namespace ws {
-
-namespace {
-
-// Returns true if |window| is a proxy window and marked as has-content.
-bool IsOpaqueProxyWindow(const aura::Window* window) {
-  return WindowService::IsProxyWindow(window) &&
-         window->GetProperty(aura::client::kWindowLayerDrawn);
-}
-
-// Factory to create ws::WindowOcclusionChangeBuilder that dispatches occlusion
-// change per WindowTree in a single mojo call.
-std::unique_ptr<aura::WindowOcclusionChangeBuilder>
-CreateOcclusionChangeBuilder() {
-  return std::make_unique<ws::WindowOcclusionChangeBuilder>();
-}
-
-}  // namespace
-
-WindowService::WindowService(
-    WindowServiceDelegate* delegate,
-    std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider,
-    aura::client::FocusClient* focus_client,
-    bool decrement_client_ids,
-    aura::Env* env)
-    : delegate_(delegate),
-      env_(env ? env : aura::Env::GetInstance()),
-      gpu_interface_provider_(std::move(gpu_interface_provider)),
-      screen_provider_(std::make_unique<ScreenProvider>()),
-      focus_client_(focus_client),
-      user_activity_monitor_(std::make_unique<UserActivityMonitor>(env_)),
-      next_client_id_(decrement_client_ids ? kInitialClientIdDecrement
-                                           : kInitialClientId),
-      decrement_client_ids_(decrement_client_ids),
-      ime_registrar_(&ime_driver_),
-      event_queue_(std::make_unique<EventQueue>(this)) {
-  DCHECK(focus_client);  // A |focus_client| must be provided.
-  input_device_server_.RegisterAsObserver();
-
-  // This property should be registered by the PropertyConverter constructor,
-  // but that would create a dependency cycle between ui/wm and ui/aura.
-  property_converter_.RegisterPrimitiveProperty(
-      ::wm::kShadowElevationKey,
-      mojom::WindowManager::kShadowElevation_Property,
-      aura::PropertyConverter::CreateAcceptAnyValueCallback());
-
-  // Extends WindowOcclusionTracker to check whether remote window has content.
-  auto* occlusion_tracker = env_->GetWindowOcclusionTracker();
-  DCHECK(occlusion_tracker);
-  occlusion_tracker->set_window_has_content_callback(
-      base::BindRepeating(&IsOpaqueProxyWindow));
-
-  // Makes WindowOcclusionTracker to use ws::WindowOcclusionChangeBuilder.
-  occlusion_tracker->set_occlusion_change_builder_factory(
-      base::BindRepeating(&CreateOcclusionChangeBuilder));
-}
-
-WindowService::~WindowService() {
-  // WindowTreeFactory owns WindowTrees created by way of WindowTreeFactory.
-  // Deleting it should ensure there are no WindowTrees left. Additionally,
-  // WindowTree makes use of ScreenProvider, so we need to ensure all the
-  // WindowTrees are destroyed before ScreenProvider.
-  window_tree_factory_.reset();
-  DCHECK(window_trees_.empty());
-}
-
-void WindowService::BindServiceRequest(
-    service_manager::mojom::ServiceRequest request) {
-  DCHECK(!service_binding_.is_bound());
-  service_binding_.Bind(std::move(request));
-}
-
-ProxyWindow* WindowService::GetProxyWindowForWindowCreateIfNecessary(
-    aura::Window* window) {
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  if (proxy_window)
-    return proxy_window;
-
-  const viz::FrameSinkId frame_sink_id =
-      ClientWindowId(kWindowServerClientId, next_window_id_++);
-  CHECK_NE(0u, next_window_id_);
-  const bool is_top_level = false;
-  return ProxyWindow::Create(window, nullptr, frame_sink_id, is_top_level);
-}
-
-std::unique_ptr<WindowTree> WindowService::CreateWindowTree(
-    mojom::WindowTreeClient* window_tree_client,
-    const std::string& client_name) {
-  const ClientSpecificId client_id =
-      decrement_client_ids_ ? next_client_id_-- : next_client_id_++;
-  CHECK_NE(kInvalidClientId, next_client_id_);
-  CHECK_NE(kWindowServerClientId, next_client_id_);
-  auto window_tree = std::make_unique<WindowTree>(
-      this, client_id, window_tree_client, client_name);
-  window_trees_.insert(window_tree.get());
-  return window_tree;
-}
-
-void WindowService::SetFrameDecorationValues(
-    const gfx::Insets& client_area_insets,
-    int max_title_bar_button_width) {
-  screen_provider_->SetFrameDecorationValues(client_area_insets,
-                                             max_title_bar_button_width);
-}
-
-void WindowService::SetDisplayForNewWindows(int64_t display_id) {
-  screen_provider_->SetDisplayForNewWindows(display_id);
-}
-
-// static
-bool WindowService::IsProxyWindow(const aura::Window* window) {
-  return ProxyWindow::GetMayBeNull(window);
-}
-
-// static
-bool WindowService::IsTopLevelWindow(const aura::Window* window) {
-  const ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  return proxy_window && proxy_window->IsTopLevel();
-}
-
-aura::Window* WindowService::GetWindowByClientId(Id transport_id) {
-  const ClientSpecificId client_id = ClientIdFromTransportId(transport_id);
-  WindowTree* window_tree = GetTreeById(client_id);
-  return window_tree ? window_tree->GetWindowByTransportId(transport_id)
-                     : nullptr;
-}
-
-Id WindowService::GetCompleteTransportIdForWindow(aura::Window* window) {
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  if (!proxy_window)
-    return kInvalidTransportId;
-  WindowTree* tree = proxy_window->owning_window_tree()
-                         ? proxy_window->owning_window_tree()
-                         : proxy_window->embedded_window_tree();
-  if (!tree)
-    return kInvalidTransportId;
-  // NOTE: WindowTree::TransportIdForWindow() is the id sent to the client,
-  // which has the client_id portion set to 0. This function wants to see the
-  // real client_id, so it has to build it.
-  return BuildTransportId(
-      tree->client_id(),
-      ClientWindowIdFromTransportId(tree->TransportIdForWindow(window)));
-}
-
-WindowService::TreeAndWindowId
-WindowService::FindTreeWithScheduleEmbedForExistingClient(
-    const base::UnguessableToken& embed_token) {
-  for (WindowTree* tree : window_trees_) {
-    ClientWindowId client_window_id =
-        tree->RemoveScheduledEmbedUsingExistingClient(embed_token);
-    if (client_window_id.is_valid()) {
-      TreeAndWindowId tree_and_id;
-      tree_and_id.id = client_window_id;
-      tree_and_id.tree = tree;
-      return tree_and_id;
-    }
-  }
-  return TreeAndWindowId();
-}
-
-bool WindowService::CompleteScheduleEmbedForExistingClient(
-    aura::Window* window,
-    const base::UnguessableToken& embed_token,
-    int embed_flags) {
-  DCHECK(window);
-  const TreeAndWindowId tree_and_id =
-      FindTreeWithScheduleEmbedForExistingClient(embed_token);
-  if (!tree_and_id.tree)
-    return false;
-
-  // Event interception is not supported for embedding without a client.
-  DCHECK(!(embed_flags & mojom::kEmbedFlagEmbedderInterceptsEvents));
-  const bool owner_intercept_events = false;
-
-  ProxyWindow* proxy_window = GetProxyWindowForWindowCreateIfNecessary(window);
-  // Allow |window| to replace an existing embed by destroying the old one now.
-  proxy_window->SetEmbedding(nullptr);
-  tree_and_id.tree->CompleteScheduleEmbedForExistingClient(
-      window, tree_and_id.id, embed_token);
-  std::unique_ptr<Embedding> embedding =
-      std::make_unique<Embedding>(nullptr, window, owner_intercept_events);
-  embedding->InitForEmbedInExistingTree(tree_and_id.tree);
-  proxy_window->SetEmbedding(std::move(embedding));
-  return true;
-}
-
-void WindowService::AddObserver(WindowServiceObserver* observer) {
-  observers_.AddObserver(observer);
-}
-
-void WindowService::RemoveObserver(WindowServiceObserver* observer) {
-  observers_.RemoveObserver(observer);
-}
-
-void WindowService::OnFirstSurfaceActivation(const std::string& client_name) {
-  if (surface_activation_callback_)
-    std::move(surface_activation_callback_).Run(client_name);
-}
-
-void WindowService::OnWillDestroyWindowTree(WindowTree* tree) {
-  for (WindowServiceObserver& observer : observers_)
-    observer.OnWillDestroyClient(tree->client_id());
-
-  window_trees_.erase(tree);
-}
-
-bool WindowService::RequestClose(aura::Window* window) {
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  if (!proxy_window || !proxy_window->IsTopLevel())
-    return false;
-
-  proxy_window->owning_window_tree()->RequestClose(proxy_window);
-  return true;
-}
-
-void WindowService::OnDisplayMetricsChanged(const display::Display& display,
-                                            uint32_t changed_metrics) {
-  screen_provider_->DisplayMetricsChanged(display, changed_metrics);
-}
-
-void WindowService::OnWindowTreeHostsDisplayIdChanged(
-    const std::set<aura::Window*>& root_windows) {
-  for (WindowTree* tree : window_trees_)
-    tree->OnWindowTreeHostsDisplayIdChanged(root_windows);
-}
-
-std::string WindowService::GetIdForDebugging(aura::Window* window) {
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  if (!proxy_window)
-    return std::string();
-  return proxy_window->GetIdForDebugging();
-}
-
-void WindowService::OnStart() {
-  test_config_ = base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kUseTestConfig);
-
-  event_injector_ = std::make_unique<EventInjector>(this);
-
-  window_tree_factory_ = std::make_unique<WindowTreeFactory>(this);
-
-  registry_.AddInterface(base::BindRepeating(
-      &WindowService::BindClipboardHostRequest, base::Unretained(this)));
-  registry_.AddInterface(base::BindRepeating(
-      &EventInjector::AddBinding, base::Unretained(event_injector_.get())));
-  registry_.AddInterface(base::BindRepeating(
-      &WindowService::BindImeRegistrarRequest, base::Unretained(this)));
-  registry_.AddInterface(base::BindRepeating(
-      &WindowService::BindImeDriverRequest, base::Unretained(this)));
-  registry_.AddInterface(base::BindRepeating(
-      &WindowService::BindInputDeviceServerRequest, base::Unretained(this)));
-  registry_.AddInterface(
-      base::BindRepeating(&WindowService::BindRemotingEventInjectorRequest,
-                          base::Unretained(this)));
-  registry_.AddInterface(base::BindRepeating(
-      &WindowService::BindUserActivityMonitorRequest, base::Unretained(this)));
-
-  registry_with_source_info_.AddInterface<mojom::WindowTreeFactory>(
-      base::BindRepeating(&WindowService::BindWindowTreeFactoryRequest,
-                          base::Unretained(this)));
-
-  // |gpu_interface_provider_| may be null in tests.
-  if (gpu_interface_provider_) {
-    gpu_interface_provider_->RegisterGpuInterfaces(&registry_);
-  }
-
-  if (test_config_) {
-    registry_.AddInterface<mojom::WindowServerTest>(base::BindRepeating(
-        &WindowService::BindWindowServerTestRequest, base::Unretained(this)));
-  }
-}
-
-void WindowService::OnBindInterface(
-    const service_manager::BindSourceInfo& remote_info,
-    const std::string& interface_name,
-    mojo::ScopedMessagePipeHandle handle) {
-  if (registry_with_source_info_.TryBindInterface(interface_name, &handle,
-                                                  remote_info) ||
-      registry_.TryBindInterface(interface_name, &handle)) {
-    return;
-  }
-
-#if defined(USE_OZONE)
-  gpu_interface_provider_->BindOzoneGpuInterface(interface_name,
-                                                 std::move(handle));
-#else
-  NOTREACHED();
-#endif
-}
-
-WindowTree* WindowService::GetTreeById(ClientSpecificId id) {
-  for (WindowTree* tree : window_trees_) {
-    if (tree->client_id() == id)
-      return tree;
-  }
-  return nullptr;
-}
-
-void WindowService::SetSurfaceActivationCallback(
-    base::OnceCallback<void(const std::string&)> callback) {
-  // Surface activation callbacks are expensive, and allowed only in tests.
-  DCHECK(test_config_);
-  DCHECK(surface_activation_callback_.is_null() || callback.is_null());
-  surface_activation_callback_ = std::move(callback);
-}
-
-void WindowService::BindClipboardHostRequest(
-    ui::mojom::ClipboardHostRequest request) {
-  if (!clipboard_host_)
-    clipboard_host_ = std::make_unique<ui::ClipboardHost>();
-  clipboard_host_->AddBinding(std::move(request));
-}
-
-void WindowService::BindImeRegistrarRequest(
-    mojom::IMERegistrarRequest request) {
-  ime_registrar_.AddBinding(std::move(request));
-}
-
-void WindowService::BindImeDriverRequest(mojom::IMEDriverRequest request) {
-  ime_driver_.AddBinding(std::move(request));
-}
-
-void WindowService::BindInputDeviceServerRequest(
-    mojom::InputDeviceServerRequest request) {
-  input_device_server_.AddBinding(std::move(request));
-}
-
-void WindowService::BindRemotingEventInjectorRequest(
-    mojom::RemotingEventInjectorRequest request) {
-  if (!remoting_event_injector_ && delegate_->GetSystemInputInjector()) {
-    remoting_event_injector_ = std::make_unique<RemotingEventInjector>(
-        delegate_->GetSystemInputInjector());
-  }
-  if (remoting_event_injector_)
-    remoting_event_injector_->AddBinding(std::move(request));
-}
-
-void WindowService::BindUserActivityMonitorRequest(
-    mojom::UserActivityMonitorRequest request) {
-  user_activity_monitor_->AddBinding(std::move(request));
-}
-
-void WindowService::BindWindowServerTestRequest(
-    mojom::WindowServerTestRequest request) {
-  if (!test_config_)
-    return;
-  mojo::MakeStrongBinding(std::make_unique<WindowServerTestImpl>(this),
-                          std::move(request));
-}
-
-void WindowService::BindWindowTreeFactoryRequest(
-    mojom::WindowTreeFactoryRequest request,
-    const service_manager::BindSourceInfo& source_info) {
-  window_tree_factory_->AddBinding(std::move(request),
-                                   source_info.identity.name());
-}
-
-}  // namespace ws
diff --git a/services/ws/window_service.h b/services/ws/window_service.h
deleted file mode 100644
index b7e10df9..0000000
--- a/services/ws/window_service.h
+++ /dev/null
@@ -1,295 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_SERVICE_H_
-#define SERVICES_WS_WINDOW_SERVICE_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <set>
-#include <string>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "base/observer_list.h"
-#include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_binding.h"
-#include "services/service_manager/public/mojom/service.mojom.h"
-#include "services/ws/ids.h"
-#include "services/ws/ime/ime_driver_bridge.h"
-#include "services/ws/ime/ime_registrar_impl.h"
-#include "services/ws/input_devices/input_device_server.h"
-#include "services/ws/public/mojom/event_injector.mojom.h"
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-#include "services/ws/public/mojom/remoting_event_injector.mojom.h"
-#include "services/ws/public/mojom/user_activity_monitor.mojom.h"
-#include "services/ws/public/mojom/window_server_test.mojom.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "ui/aura/mus/property_converter.h"
-#include "ui/base/mojo/clipboard.mojom.h"
-
-namespace aura {
-class Env;
-class Window;
-namespace client {
-class FocusClient;
-}
-}  // namespace aura
-
-namespace base {
-class UnguessableToken;
-}
-
-namespace display {
-class Display;
-}
-
-namespace gfx {
-class Insets;
-}
-
-namespace ui {
-class ClipboardHost;
-}
-
-namespace ws {
-
-class EventInjector;
-class EventQueue;
-class GpuInterfaceProvider;
-class RemotingEventInjector;
-class ScreenProvider;
-class ProxyWindow;
-class UserActivityMonitor;
-class WindowServiceDelegate;
-class WindowServiceObserver;
-class WindowTree;
-class WindowTreeFactory;
-
-namespace mojom {
-class WindowTreeClient;
-}
-
-// WindowService is the entry point into providing an implementation of
-// the mojom::WindowTree related mojoms on top of an aura Window hierarchy.
-// A WindowTree is created for each client.
-class COMPONENT_EXPORT(WINDOW_SERVICE) WindowService
-    : public service_manager::Service {
- public:
-  WindowService(WindowServiceDelegate* delegate,
-                std::unique_ptr<GpuInterfaceProvider> gpu_support,
-                aura::client::FocusClient* focus_client,
-                bool decrement_client_ids = false,
-                aura::Env* env = nullptr);
-  ~WindowService() override;
-
-  // Binds this WindowService instance to a ServiceRequest from the Service
-  // Manger.
-  void BindServiceRequest(service_manager::mojom::ServiceRequest request);
-
-  // Gets the ProxyWindow for |window|, creating if necessary.
-  ProxyWindow* GetProxyWindowForWindowCreateIfNecessary(aura::Window* window);
-
-  // Creates a new WindowTree, caller must call one of the Init() functions on
-  // the returned object.
-  std::unique_ptr<WindowTree> CreateWindowTree(
-      mojom::WindowTreeClient* window_tree_client,
-      const std::string& client_name = std::string());
-
-  // Sets the window frame metrics.
-  void SetFrameDecorationValues(const gfx::Insets& client_area_insets,
-                                int max_title_bar_button_width);
-
-  // Sets the display to use for new windows. The window server broadcasts this
-  // over mojo to all remote clients.
-  void SetDisplayForNewWindows(int64_t display_id);
-
-  // Returns true if |window| is a proxy window.
-  static bool IsProxyWindow(const aura::Window* window);
-
-  // Returns true if |window| hosts a remote client and is a toplevel window.
-  static bool IsTopLevelWindow(const aura::Window* window);
-
-  // Returns the window representing the specified id.
-  aura::Window* GetWindowByClientId(Id transport_id);
-
-  // Returns the transport-id for the specified |window|. If |window| was
-  // not created by a client, returns kInvalidTransportId.
-  // NOTE: this function returns an id with the client_id portion set to the
-  // id of the client that created it. The client that created the window
-  // generally uses a client_id of 0 for Windows it creates. If you need to
-  // correlate this with a WindowMus you will most likely need to set the
-  // client_id to 0. See documentation of ClientWindowId in README.md
-  // for more details.
-  Id GetCompleteTransportIdForWindow(aura::Window* window);
-
-  struct TreeAndWindowId {
-    ClientWindowId id;
-    WindowTree* tree = nullptr;
-  };
-  // Returns the WindowTree that previously made a call to
-  // ScheduleEmbedForExistingClient(). If a WindowTree made a call to
-  // ScheduleEmbedForExistingClient() the |id| supplied by the client is
-  // returned.
-  TreeAndWindowId FindTreeWithScheduleEmbedForExistingClient(
-      const base::UnguessableToken& embed_token);
-
-  // Completes a previous call to ScheduleEmbedForExistingClient(). |window|
-  // is the Window to perform the embedding in. This replaces any pre-existing
-  // embedding in |window|. Returns true on success. See the mojom for details
-  // on |embed_flags| and |embed_token|.
-  bool CompleteScheduleEmbedForExistingClient(
-      aura::Window* window,
-      const base::UnguessableToken& embed_token,
-      int embed_flags);
-
-  void AddObserver(WindowServiceObserver* observer);
-  void RemoveObserver(WindowServiceObserver* observer);
-  base::ObserverList<WindowServiceObserver>::Unchecked& observers() {
-    return observers_;
-  }
-
-  // Called when the surface of |client_name| is first activated.
-  void OnFirstSurfaceActivation(const std::string& client_name);
-
-  // Called when a WindowServiceClient is about to be destroyed.
-  void OnWillDestroyWindowTree(WindowTree* tree);
-
-  // Asks the client that created |window| to close |window|. Returns true if
-  // |window| is a top-level created by a remote client, false otherwise.
-  bool RequestClose(aura::Window* window);
-
-  // Called when the metrics of a display changes. It is expected the local
-  // environment call this *before* the change is applied to any
-  // WindowTreeHosts. This is necessary to ensure clients are notified of the
-  // change before the client is notified of a bounds change. To do otherwise
-  // results in the client applying bounds change with the wrong scale factor.
-  // |changed_metrics| is a bitmask of the DisplayObserver::DisplayMetric.
-  void OnDisplayMetricsChanged(const display::Display& display,
-                               uint32_t changed_metrics);
-
-  // Called after WindowTreeHosts have changed display ids. |root_windows| is
-  // the set of root windows of the changed WindowTreeHosts. Clients that have
-  // windows contained by the root windows needs to be updated with the new
-  // display ids.
-  void OnWindowTreeHostsDisplayIdChanged(
-      const std::set<aura::Window*>& root_windows);
-
-  // Returns an id useful for debugging. See ProxyWindow::GetIdForDebugging()
-  // for details.
-  std::string GetIdForDebugging(aura::Window* window);
-
-  aura::Env* env() { return env_; }
-
-  ScreenProvider* screen_provider() { return screen_provider_.get(); }
-
-  WindowServiceDelegate* delegate() { return delegate_; }
-
-  aura::PropertyConverter* property_converter() { return &property_converter_; }
-
-  aura::client::FocusClient* focus_client() { return focus_client_; }
-
-  const std::set<WindowTree*>& window_trees() const { return window_trees_; }
-
-  service_manager::BinderRegistry* registry() { return &registry_; }
-
-  EventQueue* event_queue() { return event_queue_.get(); }
-
-  // service_manager::Service:
-  void OnStart() override;
-  void OnBindInterface(const service_manager::BindSourceInfo& remote_info,
-                       const std::string& interface_name,
-                       mojo::ScopedMessagePipeHandle handle) override;
-
- private:
-  friend class WindowServerTestImpl;
-  friend class WindowServiceTestHelper;
-
-  WindowTree* GetTreeById(ClientSpecificId id);
-
-  // Sets a callback to be called whenever a surface is activated. This
-  // corresponds to a client submitting a new CompositorFrame for a Window. This
-  // should only be called in a test configuration.
-  void SetSurfaceActivationCallback(
-      base::OnceCallback<void(const std::string&)> callback);
-
-  void BindClipboardHostRequest(ui::mojom::ClipboardHostRequest request);
-  void BindImeRegistrarRequest(mojom::IMERegistrarRequest request);
-  void BindImeDriverRequest(mojom::IMEDriverRequest request);
-  void BindInputDeviceServerRequest(mojom::InputDeviceServerRequest request);
-  void BindRemotingEventInjectorRequest(
-      mojom::RemotingEventInjectorRequest request);
-  void BindUserActivityMonitorRequest(
-      mojom::UserActivityMonitorRequest request);
-  void BindWindowServerTestRequest(mojom::WindowServerTestRequest request);
-
-  void BindWindowTreeFactoryRequest(
-      mojom::WindowTreeFactoryRequest request,
-      const service_manager::BindSourceInfo& source_info);
-
-  WindowServiceDelegate* delegate_;
-
-  aura::Env* env_;
-
-  service_manager::ServiceBinding service_binding_{this};
-
-  // GpuInterfaceProvider may be null in tests.
-  std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider_;
-
-  std::unique_ptr<ScreenProvider> screen_provider_;
-
-  aura::client::FocusClient* focus_client_;
-
-  service_manager::BinderRegistryWithArgs<
-      const service_manager::BindSourceInfo&>
-      registry_with_source_info_;
-  service_manager::BinderRegistry registry_;
-
-  std::unique_ptr<UserActivityMonitor> user_activity_monitor_;
-
-  std::unique_ptr<WindowTreeFactory> window_tree_factory_;
-
-  // Helper used to serialize and deserialize window properties.
-  aura::PropertyConverter property_converter_;
-
-  // Provides info to InputDeviceClient users, via InputDeviceManager.
-  InputDeviceServer input_device_server_;
-
-  std::unique_ptr<EventInjector> event_injector_;
-  std::unique_ptr<RemotingEventInjector> remoting_event_injector_;
-
-  std::unique_ptr<ui::ClipboardHost> clipboard_host_;
-
-  // Id for the next WindowTree.
-  ClientSpecificId next_client_id_;
-
-  // If true, client ids are decremented, not incremented; the default is false.
-  const bool decrement_client_ids_;
-
-  // Id used for the next window created locally that is exposed to clients.
-  ClientSpecificId next_window_id_ = 1;
-
-  IMERegistrarImpl ime_registrar_;
-  IMEDriverBridge ime_driver_;
-
-  // All WindowTrees created by the WindowService.
-  std::set<WindowTree*> window_trees_;
-
-  base::ObserverList<WindowServiceObserver>::Unchecked observers_;
-
-  // Returns true if various test interfaces are exposed.
-  bool test_config_ = false;
-
-  std::unique_ptr<EventQueue> event_queue_;
-
-  base::OnceCallback<void(const std::string&)> surface_activation_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowService);
-};
-
-}  // namespace ui
-
-#endif  // SERVICES_WS_WINDOW_SERVICE_H_
diff --git a/services/ws/window_service_delegate.cc b/services/ws/window_service_delegate.cc
deleted file mode 100644
index 4324648..0000000
--- a/services/ws/window_service_delegate.cc
+++ /dev/null
@@ -1,53 +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.
-
-#include "services/ws/window_service_delegate.h"
-
-#include "services/ws/window_manager_interface.h"
-
-namespace ws {
-
-bool WindowServiceDelegate::StoreAndSetCursor(aura::Window* window,
-                                              ui::Cursor cursor) {
-  return false;
-}
-
-void WindowServiceDelegate::RunWindowMoveLoop(aura::Window* window,
-                                              mojom::MoveLoopSource source,
-                                              const gfx::Point& cursor,
-                                              int window_component,
-                                              DoneCallback callback) {
-  std::move(callback).Run(false);
-}
-
-void WindowServiceDelegate::RunDragLoop(
-    aura::Window* window,
-    const ui::OSExchangeData& data,
-    const gfx::Point& screen_location,
-    uint32_t drag_operation,
-    ui::DragDropTypes::DragEventSource source,
-    DragDropCompletedCallback callback) {
-  std::move(callback).Run(ui::DragDropTypes::DRAG_NONE);
-}
-
-ui::SystemInputInjector* WindowServiceDelegate::GetSystemInputInjector() {
-  return nullptr;
-}
-
-aura::Window* WindowServiceDelegate::GetTopmostWindowAtPoint(
-    const gfx::Point& location_in_screen,
-    const std::set<aura::Window*>& ignore,
-    aura::Window** real_topmost) {
-  return nullptr;
-}
-
-std::unique_ptr<WindowManagerInterface>
-WindowServiceDelegate::CreateWindowManagerInterface(
-    WindowTree* window_tree,
-    const std::string& name,
-    mojo::ScopedInterfaceEndpointHandle handle) {
-  return nullptr;
-}
-
-}  // namespace ws
diff --git a/services/ws/window_service_delegate.h b/services/ws/window_service_delegate.h
deleted file mode 100644
index c9ce7db..0000000
--- a/services/ws/window_service_delegate.h
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_SERVICE_DELEGATE_H_
-#define SERVICES_WS_WINDOW_SERVICE_DELEGATE_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback_forward.h"
-#include "base/component_export.h"
-#include "base/containers/flat_map.h"
-#include "services/ws/public/mojom/ime/ime.mojom.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/base/dragdrop/drag_drop_types.h"
-#include "ui/base/ime/mojo/ime.mojom.h"
-#include "ui/base/ui_base_types.h"
-
-namespace aura {
-class PropertyConverter;
-class Window;
-}  // namespace aura
-
-namespace gfx {
-class Point;
-}
-
-namespace mojo {
-class ScopedInterfaceEndpointHandle;
-}
-
-namespace ui {
-class EventTarget;
-class KeyEvent;
-class OSExchangeData;
-class SystemInputInjector;
-}  // namespace ui
-
-namespace ws {
-
-class TopLevelProxyWindow;
-class WindowManagerInterface;
-class WindowTree;
-
-// A delegate used by the WindowService for context-specific operations.
-class COMPONENT_EXPORT(WINDOW_SERVICE) WindowServiceDelegate {
- public:
-  // A client requested a new top-level window. Implementations should create a
-  // new window, parenting it in the appropriate container. Return null to
-  // reject the request.
-  // |top_level_proxy_window| is owned by the WindowService and may be used by
-  // the delegate to perform operations specific to the window. See
-  // TopLevelProxyWindow for details.
-  // NOTE: it is recommended that when clients create a new window they use
-  // WindowDelegateImpl as the WindowDelegate of the Window (this must be done
-  // by the WindowServiceDelegate, as the Window's delegate can not be changed
-  // after creation).
-  virtual std::unique_ptr<aura::Window> NewTopLevel(
-      TopLevelProxyWindow* top_level_proxy_window,
-      aura::PropertyConverter* property_converter,
-      const base::flat_map<std::string, std::vector<uint8_t>>& properties) = 0;
-
-  // Called for KeyEvents the client does not handle.
-  virtual void OnUnhandledKeyEvent(const ui::KeyEvent& key_event) {}
-
-  // Sets the cursor for |window| to |cursor|. This will immediately change the
-  // actual on-screen cursor if the pointer is hovered over |window|. Also store
-  // |cursor| on the widget for |window| if there is one. The return value
-  // indicates whether the cursor was stored for |window|.
-  virtual bool StoreAndSetCursor(aura::Window* window, ui::Cursor cursor);
-
-  // Called to start a move operation on |window|. When done, |callback| should
-  // be run with the result (true if the move was successful). If a move is not
-  // allowed, the delegate should run |callback| immediately.
-  using DoneCallback = base::OnceCallback<void(bool)>;
-  virtual void RunWindowMoveLoop(aura::Window* window,
-                                 mojom::MoveLoopSource source,
-                                 const gfx::Point& cursor,
-                                 int window_component,
-                                 DoneCallback callback);
-
-  // Called to cancel an in-progress window move loop that was started by
-  // RunWindowMoveLoop().
-  virtual void CancelWindowMoveLoop() {}
-
-  // Called to run a drag loop for |window|. When done, |callback| should be
-  // invoked with the |drag_result|. |drag_result| == DRAG_NONE means drag
-  // failed or is canceled. Otherwise, it the final drag operation applied at
-  // the end. If a drag is not allowed, the delegate should run |callback|
-  // immediately. Note this call blocks until the drag operation is finished or
-  // canceled.
-  using DragDropCompletedCallback = base::OnceCallback<void(int drag_result)>;
-  virtual void RunDragLoop(aura::Window* window,
-                           const ui::OSExchangeData& data,
-                           const gfx::Point& screen_location,
-                           uint32_t drag_operation,
-                           ui::DragDropTypes::DragEventSource source,
-                           DragDropCompletedCallback callback);
-
-  // Called to cancel an in-progress drag loop that was started by RunDragLoop.
-  virtual void CancelDragLoop(aura::Window* window) {}
-
-  // Called to update resize shadow for the window.
-  virtual void SetWindowResizeShadow(aura::Window* window,
-                                     int window_component) {}
-
-  // Called to update the text input state of the PlatformWindow associated with
-  // |window|. It is a no-op if |window| is not focused.
-  virtual void UpdateTextInputState(aura::Window* window,
-                                    ui::mojom::TextInputStatePtr state) {}
-
-  // Called to update the IME visibility and text input state of the
-  // PlatformWindow associated with |window|. It is a no-op if |window| is not
-  // focused.
-  virtual void UpdateImeVisibility(aura::Window* window,
-                                   bool visible,
-                                   ui::mojom::TextInputStatePtr state) {}
-
-  // Called to set the window's modal type; may reparent the window.
-  virtual void SetModalType(aura::Window* window, ui::ModalType type) {}
-
-  // Returns the SystemInputInjector to use when processing events from a
-  // remote client. A return value of null (the default) results in disallowing
-  // injection.
-  virtual ui::SystemInputInjector* GetSystemInputInjector();
-
-  // Returns the EventTarget which can process all of the events on the system.
-  virtual ui::EventTarget* GetGlobalEventTarget() = 0;
-
-  virtual aura::Window* GetRootWindowForDisplayId(int64_t display_id) = 0;
-
-  // Returns the topmost visible window at the location in screen coordinate,
-  // excluding |ignore|. |real_topmost| is updated to the topmost visible window
-  // at the location without excluding |ignore|.
-  virtual aura::Window* GetTopmostWindowAtPoint(
-      const gfx::Point& location_in_screen,
-      const std::set<aura::Window*>& ignore,
-      aura::Window** real_topmost);
-
-  // Creates and binds a request for an interface provided by the local
-  // environment. The interface request originated from the client associated
-  // with |tree|. |name| is the name of the requested interface. The return
-  // value is owned by |tree|. Return null if |name| is not the name of a known
-  // interface.
-  // The following shows how to bind |handle|:
-  // TestWmInterface* wm_interface_impl = ...;
-  // mojo::AssociatedBindingTestWmInterface> binding(
-  //   wm_interface_impl,
-  //   mojo::AssociatedInterfaceRequest<TestWmInterface>(std::move(handle)));
-  virtual std::unique_ptr<WindowManagerInterface> CreateWindowManagerInterface(
-      WindowTree* tree,
-      const std::string& name,
-      mojo::ScopedInterfaceEndpointHandle handle);
-
-  // Connects a particular client to the active input-method engine.
-  // This is called when a client that has the active focus requests the
-  // input-method engine (which typically happens every time focus changes).
-  virtual void ConnectToImeEngine(ime::mojom::ImeEngineRequest engine_request,
-                                  ime::mojom::ImeEngineClientPtr client) {}
-
- protected:
-  virtual ~WindowServiceDelegate() = default;
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_SERVICE_DELEGATE_H_
diff --git a/services/ws/window_service_observer.h b/services/ws/window_service_observer.h
deleted file mode 100644
index a9817dc..0000000
--- a/services/ws/window_service_observer.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_SERVICE_OBSERVER_H_
-#define SERVICES_WS_WINDOW_SERVICE_OBSERVER_H_
-
-#include <stdint.h>
-
-#include "base/component_export.h"
-#include "services/ws/common/types.h"
-
-namespace ui {
-class Event;
-}
-
-namespace ws {
-
-class COMPONENT_EXPORT(WINDOW_SERVICE) WindowServiceObserver {
- public:
-  // Called when an event is sent to the client identified by |client_id|.
-  // |event_id| is a unique identifier for the event. Once the client responds
-  // to the event OnClientAckedEvent() is called.
-  virtual void OnWillSendEventToClient(ClientSpecificId client_id,
-                                       uint32_t event_id,
-                                       const ui::Event& event) {}
-
-  // Called when the client identified by |client_id| responds to an event. See
-  // OnWillSendEventToClient() for more details.
-  virtual void OnClientAckedEvent(ClientSpecificId client_id,
-                                  uint32_t event_id) {}
-
-  // Client when the connection to a client is about to be destroyed.
-  virtual void OnWillDestroyClient(ClientSpecificId client_id) {}
-
- protected:
-  virtual ~WindowServiceObserver() {}
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_SERVICE_OBSERVER_H_
diff --git a/services/ws/window_service_observer_unittest.cc b/services/ws/window_service_observer_unittest.cc
deleted file mode 100644
index a282897..0000000
--- a/services/ws/window_service_observer_unittest.cc
+++ /dev/null
@@ -1,140 +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.
-
-#include "services/ws/window_service_observer.h"
-
-#include <stdint.h>
-
-#include <queue>
-
-#include "services/ws/test_window_tree_client.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/window.h"
-#include "ui/events/test/event_generator.h"
-
-namespace ws {
-namespace {
-
-class TestWindowServiceObserver : public WindowServiceObserver {
- public:
-  TestWindowServiceObserver() = default;
-  ~TestWindowServiceObserver() override = default;
-
-  void Reset() {
-    last_ack_event_id_ = last_send_event_id_ = 0u;
-    last_client_id_ = 0u;
-    send_count_ = ack_count_ = 0;
-    last_destroyed_client_id_ = 0u;
-  }
-
-  uint32_t last_send_event_id() const { return last_send_event_id_; }
-  uint32_t last_ack_event_id() const { return last_ack_event_id_; }
-  int send_count() const { return send_count_; }
-  int ack_count() const { return ack_count_; }
-  ClientSpecificId last_client_id() const { return last_client_id_; }
-  ClientSpecificId last_destroyed_client_id() const {
-    return last_destroyed_client_id_;
-  }
-
-  // WindowServiceObserver:
-  void OnWillSendEventToClient(ClientSpecificId client_id,
-                               uint32_t event_id,
-                               const ui::Event& event) override {
-    // For the current tests only a single client_id is needed.
-    if (send_count_ == 0)
-      last_client_id_ = client_id;
-    else
-      EXPECT_EQ(last_client_id_, client_id);
-    last_send_event_id_ = event_id;
-    send_count_++;
-  }
-  void OnClientAckedEvent(ClientSpecificId client_id,
-                          uint32_t event_id) override {
-    EXPECT_EQ(last_client_id_, client_id);
-    last_ack_event_id_ = event_id;
-    ack_count_++;
-  }
-  void OnWillDestroyClient(ClientSpecificId client_id) override {
-    last_destroyed_client_id_ = client_id;
-  }
-
- private:
-  // Ids supplied to OnWillSendEventToClient() and OnClientAckedEvent().
-  uint32_t last_send_event_id_ = 0u;
-  uint32_t last_ack_event_id_ = 0u;
-
-  // Number of times OnWillSendEventToClient() was called.
-  int send_count_ = 0;
-
-  // Number of times OnClientAckedEvent() was called.
-  int ack_count_ = 0;
-
-  // Client id supplied to OnWillSendEventToClient().
-  ClientSpecificId last_client_id_ = 0u;
-
-  // Client id supplied to last call to OnWillDestroyClient().
-  ClientSpecificId last_destroyed_client_id_ = 0u;
-
-  DISALLOW_COPY_AND_ASSIGN(TestWindowServiceObserver);
-};
-
-TEST(WindowServiceObserverTest, EventRelatedFunctions) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-
-  TestWindowServiceObserver window_service_observer;
-  setup.service()->AddObserver(&window_service_observer);
-
-  // Move the mouse, but don't ack. This should result in a call to
-  // OnWillSendEventToClient().
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(50, 50);
-  EXPECT_EQ(1, window_service_observer.send_count());
-  EXPECT_EQ(0, window_service_observer.ack_count());
-
-  // Ack the event, which should call the OnClientAckedEvent().
-  EXPECT_TRUE(setup.window_tree_client()->AckFirstEvent(
-      setup.window_tree(), mojom::EventResult::UNHANDLED));
-  EXPECT_EQ(1, window_service_observer.send_count());
-  EXPECT_EQ(1, window_service_observer.ack_count());
-  EXPECT_EQ(window_service_observer.last_send_event_id(),
-            window_service_observer.last_ack_event_id());
-
-  EXPECT_EQ(setup.window_tree()->client_id(),
-            window_service_observer.last_client_id());
-
-  setup.service()->RemoveObserver(&window_service_observer);
-}
-
-TEST(WindowServiceObserverTest, OnWillDestroyClient) {
-  TestWindowServiceObserver window_service_observer;
-  WindowServiceTestSetup setup;
-  setup.service()->AddObserver(&window_service_observer);
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-
-  // Create a new WindowTree.
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(window);
-  ASSERT_TRUE(embedding_helper);
-  ClientSpecificId embedded_client_id =
-      embedding_helper->window_tree->client_id();
-
-  // Deleting the WindowTree should trigger notifying the delegate.
-  embedding_helper.reset();
-  EXPECT_EQ(embedded_client_id,
-            window_service_observer.last_destroyed_client_id());
-  setup.service()->RemoveObserver(&window_service_observer);
-}
-
-}  // namespace
-}  // namespace ws
diff --git a/services/ws/window_service_test_helper.cc b/services/ws/window_service_test_helper.cc
deleted file mode 100644
index 6c8b8890..0000000
--- a/services/ws/window_service_test_helper.cc
+++ /dev/null
@@ -1,16 +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.
-
-#include "services/ws/window_service_test_helper.h"
-
-#include "services/ws/window_service.h"
-
-namespace ws {
-
-WindowServiceTestHelper::WindowServiceTestHelper(WindowService* window_service)
-    : window_service_(window_service) {}
-
-WindowServiceTestHelper::~WindowServiceTestHelper() = default;
-
-}  // namespace ws
diff --git a/services/ws/window_service_test_helper.h b/services/ws/window_service_test_helper.h
deleted file mode 100644
index a06a149..0000000
--- a/services/ws/window_service_test_helper.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_SERVICE_TEST_HELPER_H_
-#define SERVICES_WS_WINDOW_SERVICE_TEST_HELPER_H_
-
-#include "base/macros.h"
-#include "services/ws/window_service.h"
-
-namespace ws {
-
-// Used for accessing private members of WindowService in tests.
-class WindowServiceTestHelper {
- public:
-  explicit WindowServiceTestHelper(WindowService* window_service);
-  ~WindowServiceTestHelper();
-
-  EventInjector* event_injector() {
-    return window_service_->event_injector_.get();
-  }
-
- private:
-  WindowService* window_service_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowServiceTestHelper);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_SERVICE_TEST_HELPER_H_
diff --git a/services/ws/window_service_test_setup.cc b/services/ws/window_service_test_setup.cc
deleted file mode 100644
index a81114ea..0000000
--- a/services/ws/window_service_test_setup.cc
+++ /dev/null
@@ -1,202 +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.
-
-#include "services/ws/window_service_test_setup.h"
-
-#include "base/bind.h"
-#include "services/ws/embedding.h"
-#include "services/ws/event_queue.h"
-#include "services/ws/event_queue_test_helper.h"
-#include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_binding.h"
-#include "ui/aura/env.h"
-#include "ui/aura/test/event_generator_delegate_aura.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/compositor/test/test_context_factories.h"
-#include "ui/display/screen.h"
-#include "ui/events/event_target_iterator.h"
-#include "ui/gl/test/gl_surface_test_support.h"
-#include "ui/wm/core/base_focus_rules.h"
-#include "ui/wm/core/capture_controller.h"
-#include "ui/wm/public/activation_client.h"
-
-namespace ws {
-namespace {
-
-class TestFocusRules : public wm::BaseFocusRules {
- public:
-  TestFocusRules() = default;
-  ~TestFocusRules() override = default;
-
-  // wm::BaseFocusRules:
-  bool SupportsChildActivation(const aura::Window* window) const override {
-    return window == window->GetRootWindow();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestFocusRules);
-};
-
-// An EventSource that mimics AshWindowTreeHostPlatform's EventQueue usage.
-class EventSourceWithQueue : public ui::EventSource {
- public:
-  explicit EventSourceWithQueue(WindowServiceTestSetup* test_setup,
-                                aura::Window* root)
-      : test_setup_(test_setup), root_(root) {}
-  ~EventSourceWithQueue() override = default;
-
-  // ui::EventSource:
-  ui::EventSink* GetEventSink() override {
-    return root_->GetHost()->GetEventSink();
-  }
-  ui::EventDispatchDetails DeliverEventToSink(ui::Event* event) override {
-    auto* queue = test_setup_->service()->event_queue();
-    // Queue the event if needed, or deliver it directly to the sink.
-    auto result = queue->DeliverOrQueueEvent(root_->GetHost(), event);
-    if (test_setup_->ack_events_immediately() &&
-        EventQueueTestHelper(queue).HasInFlightEvent()) {
-      EventQueueTestHelper(queue).AckInFlightEvent();
-    }
-
-    return result.value_or(ui::EventDispatchDetails());
-  }
-
- private:
-  WindowServiceTestSetup* test_setup_;
-  aura::Window* root_;
-
-  DISALLOW_COPY_AND_ASSIGN(EventSourceWithQueue);
-};
-
-// EventGeneratorDelegate implementation for mus.
-class EventGeneratorDelegateWs : public aura::test::EventGeneratorDelegateAura {
- public:
-  explicit EventGeneratorDelegateWs(WindowServiceTestSetup* test_setup,
-                                    aura::Window* root)
-      : root_(root), event_source_(test_setup, root) {}
-  ~EventGeneratorDelegateWs() override = default;
-
-  // EventGeneratorDelegateAura:
-  ui::EventTarget* GetTargetAt(const gfx::Point& location) override {
-    return root_;
-  }
-  ui::EventSource* GetEventSource(ui::EventTarget* target) override {
-    return target == root_ ? &event_source_
-                           : EventGeneratorDelegateAura::GetEventSource(target);
-  }
-  gfx::Point CenterOfTarget(const ui::EventTarget* target) const override {
-    if (target != root_)
-      return EventGeneratorDelegateAura::CenterOfTarget(target);
-    return display::Screen::GetScreen()
-        ->GetPrimaryDisplay()
-        .bounds()
-        .CenterPoint();
-  }
-  void ConvertPointFromTarget(const ui::EventTarget* target,
-                              gfx::Point* point) const override {
-    if (target != root_)
-      EventGeneratorDelegateAura::ConvertPointFromTarget(target, point);
-  }
-  void ConvertPointToTarget(const ui::EventTarget* target,
-                            gfx::Point* point) const override {
-    if (target != root_)
-      EventGeneratorDelegateAura::ConvertPointToTarget(target, point);
-  }
-  void ConvertPointFromHost(const ui::EventTarget* hosted_target,
-                            gfx::Point* point) const override {
-    if (hosted_target != root_)
-      EventGeneratorDelegateAura::ConvertPointFromHost(hosted_target, point);
-  }
-
- private:
-  aura::Window* root_;
-  EventSourceWithQueue event_source_;
-
-  DISALLOW_COPY_AND_ASSIGN(EventGeneratorDelegateWs);
-};
-
-std::unique_ptr<ui::test::EventGeneratorDelegate> CreateEventGeneratorDelegate(
-    WindowServiceTestSetup* test_setup,
-    ui::test::EventGenerator* owner,
-    aura::Window* root_window,
-    aura::Window* window) {
-  DCHECK(root_window);
-  DCHECK(root_window->GetHost());
-  return std::make_unique<EventGeneratorDelegateWs>(test_setup, root_window);
-}
-
-}  // namespace
-
-WindowServiceTestSetup::WindowServiceTestSetup()
-    // FocusController takes ownership of TestFocusRules.
-    : focus_controller_(new TestFocusRules()) {
-  DCHECK_EQ(gl::kGLImplementationNone, gl::GetGLImplementation());
-  gl::GLSurfaceTestSupport::InitializeOneOff();
-
-  const bool enable_pixel_output = false;
-  context_factories_ =
-      std::make_unique<ui::TestContextFactories>(enable_pixel_output);
-  aura_test_helper_.SetUp(context_factories_->GetContextFactory(),
-                          context_factories_->GetContextFactoryPrivate());
-  // The resize throttle may interfere with tests, so disable it. If specific
-  // tests want the throttle, they can enable it.
-  aura::Env::GetInstance()->set_throttle_input_on_resize_for_testing(false);
-  scoped_capture_client_ = std::make_unique<wm::ScopedCaptureClient>(
-      aura_test_helper_.root_window());
-  service_ =
-      std::make_unique<WindowService>(&delegate_, nullptr, focus_controller());
-  aura::client::SetFocusClient(root(), focus_controller());
-  wm::SetActivationClient(root(), focus_controller());
-  delegate_.set_top_level_parent(aura_test_helper_.root_window());
-
-  window_tree_ = service_->CreateWindowTree(&window_tree_client_);
-  window_tree_->InitFromFactory();
-  window_tree_test_helper_ =
-      std::make_unique<WindowTreeTestHelper>(window_tree_.get());
-
-  ui::test::EventGeneratorDelegate::SetFactoryFunction(
-      base::BindRepeating(&CreateEventGeneratorDelegate, this));
-}
-
-WindowServiceTestSetup::~WindowServiceTestSetup() {
-  window_tree_test_helper_.reset();
-  window_tree_.reset();
-  service_.reset();
-  scoped_capture_client_.reset();
-  aura::client::SetFocusClient(root(), nullptr);
-  aura_test_helper_.TearDown();
-  context_factories_.reset();
-  gl::GLSurfaceTestSupport::ShutdownGL();
-  ui::test::EventGeneratorDelegate::SetFactoryFunction(
-      ui::test::EventGeneratorDelegate::FactoryFunction());
-}
-
-std::unique_ptr<EmbeddingHelper> WindowServiceTestSetup::CreateEmbedding(
-    aura::Window* embed_root,
-    uint32_t flags) {
-  auto embedding_helper = std::make_unique<EmbeddingHelper>();
-  embedding_helper->embedding = window_tree_test_helper_->Embed(
-      embed_root, nullptr, &embedding_helper->window_tree_client, flags);
-  if (!embedding_helper->embedding)
-    return nullptr;
-  embedding_helper->window_tree = embedding_helper->embedding->embedded_tree();
-  embedding_helper->window_tree_test_helper =
-      std::make_unique<WindowTreeTestHelper>(embedding_helper->window_tree);
-  embedding_helper->parent_window_tree =
-      embedding_helper->embedding->embedding_tree();
-  return embedding_helper;
-}
-
-EmbeddingHelper::EmbeddingHelper() = default;
-
-EmbeddingHelper::~EmbeddingHelper() {
-  if (!embedding)
-    return;
-
-  WindowTreeTestHelper(parent_window_tree).DestroyEmbedding(embedding);
-}
-
-}  // namespace ws
diff --git a/services/ws/window_service_test_setup.h b/services/ws/window_service_test_setup.h
deleted file mode 100644
index e7cb8b0..0000000
--- a/services/ws/window_service_test_setup.h
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_SERVICE_TEST_SETUP_H_
-#define SERVICES_WS_WINDOW_SERVICE_TEST_SETUP_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/test/scoped_task_environment.h"
-#include "services/ws/test_window_service_delegate.h"
-#include "services/ws/test_window_tree_client.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "ui/aura/test/aura_test_helper.h"
-#include "ui/wm/core/focus_controller.h"
-
-namespace ui {
-class TestContextFactories;
-}
-
-namespace wm {
-class ScopedCaptureClient;
-}
-
-namespace ws {
-
-class WindowService;
-class WindowTree;
-class WindowTreeTestHelper;
-
-struct EmbeddingHelper;
-
-// Helper to setup state needed for WindowService tests.
-class WindowServiceTestSetup {
- public:
-  WindowServiceTestSetup();
-  ~WindowServiceTestSetup();
-
-  // |flags| mirrors that from mojom::WindowTree::Embed(), see it for
-  // details.
-  std::unique_ptr<EmbeddingHelper> CreateEmbedding(aura::Window* embed_root,
-                                                   uint32_t flags = 0);
-
-  void set_ack_events_immediately(bool value) {
-    ack_events_immediately_ = value;
-  }
-  bool ack_events_immediately() const { return ack_events_immediately_; }
-
-  aura::Window* root() { return aura_test_helper_.root_window(); }
-  TestWindowServiceDelegate* delegate() { return &delegate_; }
-  TestWindowTreeClient* window_tree_client() { return &window_tree_client_; }
-  WindowTreeTestHelper* window_tree_test_helper() {
-    return window_tree_test_helper_.get();
-  }
-  wm::FocusController* focus_controller() { return &focus_controller_; }
-
-  std::vector<Change>* changes() {
-    return window_tree_client_.tracker()->changes();
-  }
-
-  WindowTree* window_tree() { return window_tree_.get(); }
-
-  WindowService* service() { return service_.get(); }
-
-  aura::test::AuraTestHelper* aura_test_helper() { return &aura_test_helper_; }
-
- private:
-  base::test::ScopedTaskEnvironment task_environment_{
-      base::test::ScopedTaskEnvironment::MainThreadType::UI};
-  wm::FocusController focus_controller_;
-  std::unique_ptr<ui::TestContextFactories> context_factories_;
-  aura::test::AuraTestHelper aura_test_helper_;
-  std::unique_ptr<wm::ScopedCaptureClient> scoped_capture_client_;
-  TestWindowServiceDelegate delegate_;
-  std::unique_ptr<WindowService> service_;
-  TestWindowTreeClient window_tree_client_;
-  std::unique_ptr<WindowTree> window_tree_;
-  std::unique_ptr<WindowTreeTestHelper> window_tree_test_helper_;
-
-  // If true, any events that are sent to clients are acked immediately.
-  bool ack_events_immediately_ = true;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowServiceTestSetup);
-};
-
-// EmbeddingHelper contains the object necessary for an embedding. This is
-// created by way of WindowServiceTestSetup::CreateEmbedding().
-struct EmbeddingHelper {
-  EmbeddingHelper();
-  ~EmbeddingHelper();
-
-  std::vector<Change>* changes() {
-    return window_tree_client.tracker()->changes();
-  }
-
-  // The Embedding. This is owned by the window the embedding was created on.
-  Embedding* embedding = nullptr;
-
-  TestWindowTreeClient window_tree_client;
-
-  // The client Embed() was called on.
-  WindowTree* parent_window_tree = nullptr;
-
-  // NOTE: this is owned by |parent_window_tree|.
-  WindowTree* window_tree = nullptr;
-
-  std::unique_ptr<WindowTreeTestHelper> window_tree_test_helper;
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_SERVICE_TEST_SETUP_H_
diff --git a/services/ws/window_service_unittest.cc b/services/ws/window_service_unittest.cc
deleted file mode 100644
index 0ac9d4fa..0000000
--- a/services/ws/window_service_unittest.cc
+++ /dev/null
@@ -1,321 +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.
-
-#include "services/ws/window_service.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/run_loop.h"
-#include "services/service_manager/public/cpp/connector.h"
-#include "services/service_manager/public/cpp/test/test_connector_factory.h"
-#include "services/ws/public/cpp/host/gpu_interface_provider.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/window_manager.mojom.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/test_wm.mojom.h"
-#include "services/ws/window_manager_interface.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace ws {
-namespace {
-
-// Used as callback from ScheduleEmbed().
-void ScheduleEmbedCallback(base::UnguessableToken* result_token,
-                           const base::UnguessableToken& actual_token) {
-  *result_token = actual_token;
-}
-
-}  // namespace
-
-TEST(WindowServiceTest, DeleteWithClients) {
-  // Use |test_setup| to configure aura and other state.
-  WindowServiceTestSetup test_setup;
-
-  // Create another WindowService.
-  TestWindowServiceDelegate test_window_service_delegate;
-  WindowService window_service(&test_window_service_delegate, nullptr,
-                               test_setup.focus_controller());
-  service_manager::TestConnectorFactory factory;
-  window_service.BindServiceRequest(
-      factory.RegisterInstance(mojom::kServiceName));
-
-  // Connect to |window_service| and ask for a new WindowTree.
-  mojom::WindowTreeFactoryPtr window_tree_factory;
-  factory.GetDefaultConnector()->BindInterface(mojom::kServiceName,
-                                               &window_tree_factory);
-  mojom::WindowTreePtr window_tree;
-  mojom::WindowTreeClientPtr client;
-  mojom::WindowTreeClientRequest client_request = MakeRequest(&client);
-  window_tree_factory->CreateWindowTree(MakeRequest(&window_tree),
-                                        std::move(client));
-
-  // Use FlushForTesting() to ensure WindowService processes the request.
-  window_tree_factory.FlushForTesting();
-
-  // There should be at least one WindowTree.
-  EXPECT_FALSE(window_service.window_trees().empty());
-
-  // Destroying the |window_service| should remove all the WindowTrees and
-  // ensure a DCHECK isn't hit in ~WindowTree.
-}
-
-// Implementation of mojom::TestWm that sets a boolean when DoIt() is called.
-class TestWm : public WindowManagerInterface, public test::mojom::TestWm {
- public:
-  TestWm(mojo::ScopedInterfaceEndpointHandle handle, bool* do_it_called)
-      : binding_(this,
-                 mojo::AssociatedInterfaceRequest<test::mojom::TestWm>(
-                     std::move(handle))),
-        do_it_called_(do_it_called) {}
-
-  // test::mojom::TestWm:
-  void DoIt() override { *do_it_called_ = true; }
-
- private:
-  mojo::AssociatedBinding<test::mojom::TestWm> binding_;
-  bool* do_it_called_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestWm);
-};
-
-// Subclass os TestWindowServiceDelegate that creates TestWm.
-class TestWindowServiceDelegateWithInterface
-    : public TestWindowServiceDelegate {
- public:
-  TestWindowServiceDelegateWithInterface() = default;
-  ~TestWindowServiceDelegateWithInterface() override = default;
-
-  bool do_it_called() const { return do_it_called_; }
-
-  // TestWindowServiceDelegate:
-  std::unique_ptr<WindowManagerInterface> CreateWindowManagerInterface(
-      WindowTree* window_tree,
-      const std::string& name,
-      mojo::ScopedInterfaceEndpointHandle handle) override {
-    if (name != test::mojom::TestWm::Name_)
-      return nullptr;
-
-    return std::make_unique<TestWm>(std::move(handle), &do_it_called_);
-  }
-
- private:
-  bool do_it_called_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(TestWindowServiceDelegateWithInterface);
-};
-
-class TestImeEngineClient : public ime::mojom::ImeEngineClient {
- public:
-  TestImeEngineClient() : binding_(this) {}
-  ~TestImeEngineClient() override = default;
-
-  ime::mojom::ImeEngineClientPtr BindInterface() {
-    ime::mojom::ImeEngineClientPtr ptr;
-    binding_.Bind(mojo::MakeRequest(&ptr));
-    return ptr;
-  }
-
- private:
-  // ime::mojom::ImeEngineClient:
-  void CommitText(const std::string& text) override {}
-  void UpdateCompositionText(const ui::CompositionText& composition,
-                             uint32_t cursor_pos,
-                             bool visible) override {}
-  void DeleteSurroundingText(int32_t offset, uint32_t length) override {}
-  void SendKeyEvent(std::unique_ptr<ui::Event> key_event) override {}
-  void Reconnect() override {}
-
-  mojo::Binding<ime::mojom::ImeEngineClient> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestImeEngineClient);
-};
-
-TEST(WindowServiceTest, GetWindowManagerInterface) {
-  // Use |test_setup| to configure aura and other state.
-  WindowServiceTestSetup test_setup;
-
-  // Create another WindowService.
-  TestWindowServiceDelegateWithInterface test_window_service_delegate;
-  WindowService window_service(&test_window_service_delegate, nullptr,
-                               test_setup.focus_controller());
-  service_manager::TestConnectorFactory factory;
-  window_service.BindServiceRequest(
-      factory.RegisterInstance(mojom::kServiceName));
-
-  // Connect to |window_service| and ask for a new WindowTree.
-  mojom::WindowTreeFactoryPtr window_tree_factory;
-  factory.GetDefaultConnector()->BindInterface(mojom::kServiceName,
-                                               &window_tree_factory);
-  mojom::WindowTreePtr window_tree;
-  mojom::WindowTreeClientPtr client;
-  mojom::WindowTreeClientRequest client_request = MakeRequest(&client);
-  window_tree_factory->CreateWindowTree(MakeRequest(&window_tree),
-                                        std::move(client));
-
-  // Request the TestWm interface and call a function on it.
-  mojom::WindowManagerAssociatedPtr wm;
-  window_tree->BindWindowManagerInterface(test::mojom::TestWm::Name_,
-                                          MakeRequest(&wm));
-  test::mojom::TestWmAssociatedPtr test_wm(
-      mojo::AssociatedInterfacePtrInfo<test::mojom::TestWm>(
-          wm.PassInterface().PassHandle(), test::mojom::TestWm::Version_));
-  test_wm->DoIt();
-  test_wm.FlushForTesting();
-  EXPECT_TRUE(test_window_service_delegate.do_it_called());
-}
-
-// Test client ids assigned to window trees that connect to the window service.
-TEST(WindowServiceTest, ClientIds) {
-  // Use |test_setup| to configure aura and other state.
-  WindowServiceTestSetup test_setup;
-
-  // Create another WindowService.
-  TestWindowServiceDelegate test_window_service_delegate;
-  WindowService window_service(&test_window_service_delegate, nullptr,
-                               test_setup.focus_controller());
-
-  // The first window tree should have the initial client id.
-  auto tree = window_service.CreateWindowTree(nullptr);
-  EXPECT_EQ(kInitialClientId, WindowTreeTestHelper(tree.get()).client_id());
-
-  // The second window tree should have an incremented client id.
-  tree = window_service.CreateWindowTree(nullptr);
-  EXPECT_EQ(kInitialClientId + 1, WindowTreeTestHelper(tree.get()).client_id());
-}
-
-// Test client ids assigned to window trees in the decrementing mode.
-TEST(WindowServiceTest, ClientIdsDecrement) {
-  // Use |test_setup| to configure aura and other state.
-  WindowServiceTestSetup test_setup;
-
-  // Create another WindowService that decrements window ids.
-  const bool decrement = true;
-  TestWindowServiceDelegate test_window_service_delegate;
-  WindowService window_service(&test_window_service_delegate, nullptr,
-                               test_setup.focus_controller(), decrement);
-
-  // The first window tree should have the initial decrementing client id.
-  auto tree = window_service.CreateWindowTree(nullptr);
-  EXPECT_EQ(kInitialClientIdDecrement,
-            WindowTreeTestHelper(tree.get()).client_id());
-
-  // The second window tree should have a decremented client id.
-  tree = window_service.CreateWindowTree(nullptr);
-  EXPECT_EQ(kInitialClientIdDecrement - 1,
-            WindowTreeTestHelper(tree.get()).client_id());
-}
-
-TEST(WindowServiceTest, ScheduleEmbedForExistingClientUsingLocalWindow) {
-  WindowServiceTestSetup setup;
-  // Schedule an embed in the tree created by |setup|.
-  base::UnguessableToken token;
-  const uint32_t window_id_in_child = 149;
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->ScheduleEmbedForExistingClient(
-          window_id_in_child, base::BindOnce(&ScheduleEmbedCallback, &token));
-  EXPECT_FALSE(token.is_empty());
-
-  // Create a window that will serve as the parent for the remote window and
-  // complete the embedding.
-  auto local_window = std::make_unique<aura::Window>(nullptr);
-  local_window->Init(ui::LAYER_NOT_DRAWN);
-  ASSERT_TRUE(setup.service()->CompleteScheduleEmbedForExistingClient(
-      local_window.get(), token, /* embed_flags */ 0));
-  EXPECT_TRUE(WindowService::IsProxyWindow(local_window.get()));
-}
-
-TEST(WindowServiceTest, ScheduleEmbedForExistingClientTwice) {
-  WindowServiceTestSetup setup;
-  // Schedule an embed in the tree created by |setup|.
-  base::UnguessableToken token_1;
-  const uint32_t window_id_in_child_1 = 149;
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->ScheduleEmbedForExistingClient(
-          window_id_in_child_1,
-          base::BindOnce(&ScheduleEmbedCallback, &token_1));
-  EXPECT_FALSE(token_1.is_empty());
-
-  // Create a window that will serve as the parent for the remote window and
-  // complete the embedding.
-  auto local_window = std::make_unique<aura::Window>(nullptr);
-  local_window->Init(ui::LAYER_NOT_DRAWN);
-  ASSERT_TRUE(setup.service()->CompleteScheduleEmbedForExistingClient(
-      local_window.get(), token_1, /* embed_flags */ 0));
-  EXPECT_TRUE(WindowService::IsProxyWindow(local_window.get()));
-
-  // Embedding again should replace the existing embed with the new one.
-  base::UnguessableToken token_2;
-  const uint32_t window_id_in_child_2 = 150;
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->ScheduleEmbedForExistingClient(
-          window_id_in_child_2,
-          base::BindOnce(&ScheduleEmbedCallback, &token_2));
-  EXPECT_FALSE(token_2.is_empty());
-  ASSERT_TRUE(setup.service()->CompleteScheduleEmbedForExistingClient(
-      local_window.get(), token_2, /* embed_flags */ 0));
-  EXPECT_TRUE(WindowService::IsProxyWindow(local_window.get()));
-}
-
-TEST(WindowServiceTest,
-     ScheduleEmbedForExistingClientUsingLocalWindowResetOnTreeDeleted) {
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient window_tree_client2;
-  std::unique_ptr<WindowTree> window_tree2 =
-      setup.service()->CreateWindowTree(&window_tree_client2);
-  window_tree2->InitFromFactory();
-
-  // Schedule an embed in |window_tree2|.
-  base::UnguessableToken token;
-  const uint32_t window_id_in_child = 212;
-  WindowTreeTestHelper(window_tree2.get())
-      .window_tree()
-      ->ScheduleEmbedForExistingClient(
-          window_id_in_child, base::BindOnce(&ScheduleEmbedCallback, &token));
-  EXPECT_FALSE(token.is_empty());
-
-  // Create a window that will serve as the parent for the remote window and
-  // complete the embedding.
-  auto local_window = std::make_unique<aura::Window>(nullptr);
-  local_window->Init(ui::LAYER_NOT_DRAWN);
-  ASSERT_TRUE(setup.service()->CompleteScheduleEmbedForExistingClient(
-      local_window.get(), token, /* embed_flags */ 0));
-  EXPECT_TRUE(WindowService::IsProxyWindow(local_window.get()));
-
-  // Deleting |window_tree2| should make |local_window| no longer a proxy.
-  window_tree2.reset();
-  EXPECT_FALSE(WindowService::IsProxyWindow(local_window.get()));
-}
-
-TEST(WindowServiceTest, ConnectToImeEngine) {
-  // Use |test_setup| to configure aura and other state.
-  WindowServiceTestSetup test_setup;
-
-  aura::Window* top_level =
-      test_setup.window_tree_test_helper()->NewTopLevelWindow();
-  top_level->Show();
-
-  // Verifies only the focused window tree can connect to ime engine.
-  ime::mojom::ImeEnginePtr engine;
-  TestImeEngineClient engine_client1;
-  test_setup.window_tree_test_helper()->ConnectToImeEngine(
-      MakeRequest(&engine), engine_client1.BindInterface());
-  ASSERT_FALSE(test_setup.delegate()->ime_engine_connected());
-
-  test_setup.window_tree_test_helper()->SetFocus(top_level);
-
-  engine.reset();
-  TestImeEngineClient engine_client2;
-  test_setup.window_tree_test_helper()->ConnectToImeEngine(
-      MakeRequest(&engine), engine_client2.BindInterface());
-  ASSERT_TRUE(test_setup.delegate()->ime_engine_connected());
-}
-
-}  // namespace ws
diff --git a/services/ws/window_tree.cc b/services/ws/window_tree.cc
deleted file mode 100644
index ce77401..0000000
--- a/services/ws/window_tree.cc
+++ /dev/null
@@ -1,2423 +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.
-
-#include "services/ws/window_tree.h"
-
-#include <algorithm>
-
-#include "base/auto_reset.h"
-#include "base/bind.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/trace_event/trace_event.h"
-#include "base/unguessable_token.h"
-#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
-#include "components/viz/common/surfaces/surface_info.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/map.h"
-#include "services/ws/client_change.h"
-#include "services/ws/client_change_tracker.h"
-#include "services/ws/client_root.h"
-#include "services/ws/common/util.h"
-#include "services/ws/drag_drop_delegate.h"
-#include "services/ws/embedding.h"
-#include "services/ws/event_observer_helper.h"
-#include "services/ws/proxy_window.h"
-#include "services/ws/public/cpp/property_type_converters.h"
-#include "services/ws/top_level_proxy_window_impl.h"
-#include "services/ws/topmost_window_observer.h"
-#include "services/ws/window_delegate_impl.h"
-#include "services/ws/window_manager_interface.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_delegate.h"
-#include "services/ws/window_service_observer.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/client/focus_client.h"
-#include "ui/aura/client/transient_window_client.h"
-#include "ui/aura/client/window_parenting_client.h"
-#include "ui/aura/env.h"
-#include "ui/aura/mus/property_converter.h"
-#include "ui/aura/mus/property_utils.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_observer.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/base/dragdrop/drag_drop_types.h"
-#include "ui/base/dragdrop/os_exchange_data.h"
-#include "ui/base/hit_test.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/layer_type.h"
-#include "ui/display/display.h"
-#include "ui/display/screen.h"
-#include "ui/events/event_utils.h"
-#include "ui/events/gestures/gesture_recognizer.h"
-#include "ui/events/mojo/event_struct_traits.h"
-#include "ui/gfx/image/image_skia.h"
-#include "ui/wm/core/capture_controller.h"
-#include "ui/wm/core/window_modality_controller.h"
-#include "ui/wm/core/window_util.h"
-#include "ui/wm/public/activation_client.h"
-
-#if defined(USE_OZONE)
-#include "ui/ozone/public/cursor_factory_ozone.h"
-#endif
-
-namespace ws {
-namespace {
-
-// Max number of event we let a client queue before pruning. In general only
-// bad (or buggy) clients should hit this cap.
-#if defined(NDEBUG)
-constexpr size_t kMaxQueuedEvents = 100;
-#else
-constexpr size_t kMaxQueuedEvents = 1000;
-#endif
-
-uint32_t GenerateEventAckId() {
-  // We do not want to create a sequential id for each event, because that can
-  // leak some information to the client. So instead, manufacture the id
-  // randomly.
-  return 0x1000000 | (rand() & 0xffffff);
-}
-
-gfx::Insets MakeInsetsPositive(const gfx::Insets& insets) {
-  return gfx::Insets(std::max(0, insets.top()), std::max(0, insets.left()),
-                     std::max(0, insets.bottom()), std::max(0, insets.right()));
-}
-
-}  // namespace
-
-// Used to track events sent to the client.
-struct WindowTree::InFlightEvent {
-  // Unique identifier for the event. It is expected that the client respond
-  // with this id.
-  uint32_t id;
-
-  // Only used for KeyEvents sent to the client. If a KeyEvent is not handled
-  // by the client, it's processed locally for accelerators.
-  std::unique_ptr<ui::Event> event;
-};
-
-WindowTree::KnownWindow::KnownWindow() = default;
-WindowTree::KnownWindow::~KnownWindow() = default;
-
-WindowTree::WindowTree(WindowService* window_service,
-                       ClientSpecificId client_id,
-                       mojom::WindowTreeClient* client,
-                       const std::string& client_name)
-    : window_service_(window_service),
-      client_id_(client_id),
-      client_name_(client_name),
-      window_tree_client_(client),
-      property_change_tracker_(std::make_unique<ClientChangeTracker>()) {
-  wm::CaptureController::Get()->AddObserver(this);
-}
-
-WindowTree::~WindowTree() {
-  wm::CaptureController::Get()->RemoveObserver(this);
-
-  // Delete the embeddings first, that way we don't attempt to notify the client
-  // when the windows the client created are deleted.
-  while (!client_roots_.empty()) {
-    DeleteClientRoot(client_roots_.begin()->get(),
-                     DeleteClientRootReason::kDestructor);
-  }
-
-  while (FindFirstClientCreatedWindow()) {
-    // RemoveWindowFromKnownWindows() should make it such that the Window is no
-    // longer recognized as being created (owned) by this client.
-    const bool delete_if_owned = true;
-    RemoveWindowFromKnownWindows(FindFirstClientCreatedWindow(),
-                                 delete_if_owned);
-  }
-
-  window_service_->OnWillDestroyWindowTree(this);
-}
-
-void WindowTree::InitForEmbed(aura::Window* root,
-                              mojom::WindowTreePtr window_tree_ptr) {
-  // Force ProxyWindow to be created for |root|.
-  ProxyWindow* proxy_window =
-      window_service_->GetProxyWindowForWindowCreateIfNecessary(root);
-  const ClientWindowId client_window_id = proxy_window->frame_sink_id();
-  AddWindowToKnownWindows(root, client_window_id, nullptr);
-  const bool is_top_level = false;
-  ClientRoot* client_root = CreateClientRoot(root, is_top_level);
-
-  const int64_t display_id =
-      display::Screen::GetScreen()->GetDisplayNearestWindow(root).id();
-  const ClientWindowId focused_window_id =
-      root->HasFocus() ? ClientWindowIdForWindow(root) : ClientWindowId();
-  const bool drawn = root->IsVisible() && root->GetHost();
-  window_tree_client_->OnEmbed(
-      WindowToWindowData(root), std::move(window_tree_ptr), display_id,
-      ClientWindowIdToTransportId(focused_window_id), drawn,
-      proxy_window->local_surface_id_allocation());
-
-  // Reset the frame sink id locally (after calling OnEmbed()). This is
-  // needed so that the id used by the client matches the id used locally.
-  proxy_window->set_frame_sink_id(ClientWindowId(client_id_, 0));
-
-  client_root->RegisterVizEmbeddingSupport();
-}
-
-void WindowTree::InitFromFactory() {
-  connection_type_ = ConnectionType::kOther;
-}
-
-void WindowTree::SendEventToClient(aura::Window* window,
-                                   const ui::Event& event) {
-  // As gesture recognition runs in the client, GestureEvents should not be
-  // forwarded. ProxyWindow's event processing should ensure no GestureEvents
-  // are sent. Some pinch events are allowed.
-  DCHECK(!event.IsGestureEvent() || event.IsPinchEvent());
-
-  const uint32_t event_id = GenerateEventAckId();
-  auto* in_flight_event_queue =
-      event.IsKeyEvent() ? &in_flight_key_events_ : &in_flight_other_events_;
-  if (in_flight_event_queue->size() < kMaxQueuedEvents) {
-    std::unique_ptr<InFlightEvent> in_flight_event =
-        std::make_unique<InFlightEvent>();
-    in_flight_event->id = event_id;
-    if (event.type() == ui::ET_KEY_PRESSED ||
-        event.type() == ui::ET_KEY_RELEASED) {
-      in_flight_event->event = ui::Event::Clone(event);
-    }
-    in_flight_event_queue->push(std::move(in_flight_event));
-  } else {
-    DVLOG(1) << "client not responding to events in a timely manner, "
-             << "dropping event";
-  }
-
-  // Events should only come to windows connected to displays.
-  DCHECK(window->GetHost());
-  const int64_t display_id = window->GetHost()->GetDisplayId();
-  const bool matches_event_observer =
-      event_observer_helper_ && event_observer_helper_->DoesEventMatch(event);
-  if (event_observer_helper_)
-    event_observer_helper_->ClearPendingEvent();
-
-  for (WindowServiceObserver& observer : window_service_->observers())
-    observer.OnWillSendEventToClient(client_id_, event_id, event);
-
-  std::unique_ptr<ui::Event> event_to_send = ui::Event::Clone(event);
-  if (event.IsLocatedEvent()) {
-    ui::LocatedEvent* located_event = event_to_send->AsLocatedEvent();
-    // Translate the root location for located events. Event's root location
-    // should be in the coordinate of the root window, however the root for the
-    // target window in the client can be different from the one in the server,
-    // thus the root location needs to be converted from the original coordinate
-    // to the one used in the client. See also 'WindowTreeTest.EventLocation'
-    // test case.
-    located_event->set_root_location_f(
-        ConvertRootLocationForClient(window, located_event->root_location_f()));
-  }
-  DVLOG(4) << "SendEventToClient window="
-           << ProxyWindow::GetMayBeNull(window)->GetIdForDebugging()
-           << " event_type=" << ui::EventTypeName(event.type())
-           << " event_id=" << event_id;
-  TRACE_EVENT_ASYNC_BEGIN1("ui", "WindowTree::SendEventToClient", event_id,
-                           "event_type",
-                           ui::EventTypeName(event_to_send->type()));
-  window_tree_client_->OnWindowInputEvent(
-      event_id, TransportIdForWindow(window), display_id,
-      std::move(event_to_send), matches_event_observer);
-}
-
-void WindowTree::SendObservedEventToClient(int64_t display_id,
-                                           std::unique_ptr<ui::Event> event) {
-  if (event->IsLocatedEvent()) {
-    // Send event locations in screen coordinates, since the client will have no
-    // knowledge of the event's target window.
-    ui::LocatedEvent* located_event = event->AsLocatedEvent();
-    gfx::PointF location = located_event->root_location_f();
-    display::Display display;
-    if (located_event->target()) {
-      location = located_event->target()->GetScreenLocationF(*located_event);
-    } else if (display::Screen::GetScreen()->GetDisplayWithDisplayId(
-                   display_id, &display)) {
-      location += display.bounds().OffsetFromOrigin();
-    }
-    located_event->set_location_f(location);
-    located_event->set_root_location_f(location);
-  }
-  DVLOG(4) << "SendObservedEventToClient event_type="
-           << ui::EventTypeName(event->type());
-  window_tree_client_->OnObservedInputEvent(std::move(event));
-}
-
-bool WindowTree::IsTopLevel(aura::Window* window) {
-  auto iter = FindClientRootWithRoot(window);
-  return iter != client_roots_.end() && (*iter)->is_top_level();
-}
-
-aura::Window* WindowTree::GetWindowByTransportId(Id transport_window_id) {
-  return GetWindowByClientId(MakeClientWindowId(transport_window_id));
-}
-
-void WindowTree::RequestClose(ProxyWindow* window) {
-  DCHECK(window->IsTopLevel());
-  DCHECK_EQ(this, window->owning_window_tree());
-  window_tree_client_->RequestClose(TransportIdForWindow(window->window()));
-}
-
-void WindowTree::OnEmbeddingDestroyed(Embedding* embedding) {
-  DVLOG(3) << "OnEmbeddingDestroyed client=" << client_id_
-           << " window=" << ClientWindowIdForWindow(embedding->window());
-  auto iter = FindClientRootWithRoot(embedding->window());
-  DCHECK(iter != client_roots_.end());
-  window_tree_client_->OnWindowDeleted(
-      TransportIdForWindow(embedding->window()));
-  DeleteClientRoot(iter->get(), DeleteClientRootReason::kDeleted);
-}
-
-ClientWindowId WindowTree::RemoveScheduledEmbedUsingExistingClient(
-    const base::UnguessableToken& embed_token) {
-  auto iter = scheduled_embeds_for_existing_client_.find(embed_token);
-  if (iter == scheduled_embeds_for_existing_client_.end())
-    return ClientWindowId();
-
-  const ClientWindowId client_window_id = MakeClientWindowId(iter->second);
-  if (!IsValidIdForNewWindow(client_window_id)) {
-    DVLOG(1) << "EmbedUsingToken failed (access denied)";
-    return ClientWindowId();
-  }
-  return client_window_id;
-}
-
-void WindowTree::CompleteScheduleEmbedForExistingClient(
-    aura::Window* window,
-    const ClientWindowId& id,
-    const base::UnguessableToken& token) {
-  AddWindowToKnownWindows(window, id, nullptr);
-  const bool is_top_level = false;
-  ClientRoot* client_root = CreateClientRoot(window, is_top_level);
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  // It's expected we only get here if a ProxyWindow exists for |window|.
-  DCHECK(proxy_window);
-
-  const int64_t display_id =
-      display::Screen::GetScreen()->GetDisplayNearestWindow(window).id();
-  window_tree_client_->OnEmbedFromToken(
-      token, WindowToWindowData(window), display_id,
-      proxy_window->local_surface_id_allocation());
-
-  // Reset the frame sink id locally (after calling OnEmbedFromToken()). This is
-  // needed so that the id used by the client matches the id used locally.
-  proxy_window->set_frame_sink_id(id);
-
-  client_root->RegisterVizEmbeddingSupport();
-}
-
-ClientRoot* WindowTree::GetFirstRootWithCompositorFrameSink() {
-  for (auto& client_root : client_roots_) {
-    if (ProxyWindow::GetMayBeNull(client_root->window())
-            ->attached_compositor_frame_sink()) {
-      return client_root.get();
-    }
-  }
-  return nullptr;
-}
-
-bool WindowTree::IsWindowKnown(aura::Window* window) const {
-  return window && known_windows_map_.count(window) > 0u;
-}
-
-Id WindowTree::TransportIdForWindow(aura::Window* window) const {
-  DCHECK(IsWindowKnown(window));
-  return ClientWindowIdToTransportId(ClientWindowIdForWindow(window));
-}
-
-ClientWindowId WindowTree::ClientWindowIdForWindow(aura::Window* window) const {
-  auto iter = known_windows_map_.find(window);
-  return iter == known_windows_map_.end() ? ClientWindowId()
-                                          : iter->second.client_window_id;
-}
-
-ClientRoot* WindowTree::GetClientRootForWindow(aura::Window* window) {
-  auto iter = FindClientRootWithRoot(window);
-  return iter == client_roots_.end() ? nullptr : iter->get();
-}
-
-gfx::PointF WindowTree::ConvertRootLocationForClient(
-    aura::Window* window,
-    const gfx::PointF& root_location) {
-  ClientRoot* client_root = FindClientRootContaining(window);
-  // The |client_root| may have been removed on shutdown.
-  if (!client_root)
-    return root_location;
-  gfx::PointF client_root_location = root_location;
-  aura::Window::ConvertPointToTarget(
-      window->GetRootWindow(), client_root->window(), &client_root_location);
-  return client_root_location;
-}
-
-void WindowTree::CleanupGestureState(aura::Window* window) {
-  DCHECK(IsWindowKnown(window));
-  window_tree_client_->CleanupGestureState(TransportIdForWindow(window));
-}
-
-ClientRoot* WindowTree::CreateClientRoot(aura::Window* window,
-                                         bool is_top_level) {
-  DCHECK(window);
-
-  // Only one client may be embedded in a window at a time.
-  ProxyWindow* proxy_window =
-      window_service_->GetProxyWindowForWindowCreateIfNecessary(window);
-  if (proxy_window->embedded_window_tree()) {
-    proxy_window->embedded_window_tree()->DeleteClientRootWithRoot(window);
-    DCHECK(!proxy_window->embedded_window_tree());
-  }
-
-  // Because a new client is being embedded all existing children are removed.
-  // This is because this client is no longer able to add children to |window|
-  // (until the embedding is removed).
-  while (!window->children().empty())
-    window->RemoveChild(window->children().front());
-
-  client_roots_.push_back(
-      std::make_unique<ClientRoot>(this, window, is_top_level));
-  return client_roots_.back().get();
-}
-
-void WindowTree::DeleteClientRoot(ClientRoot* client_root,
-                                  DeleteClientRootReason reason) {
-  aura::Window* window = client_root->window();
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  client_root->UnattachChildFrameSinkIdRecursive(proxy_window);
-  if (proxy_window->capture_owner() == this) {
-    // This client will no longer know about |window|, so it should not receive
-    // any events sent to the client.
-    proxy_window->SetCaptureOwner(nullptr);
-  }
-
-  // Delete the ClientRoot first, so that we don't attempt to spam the
-  // client with a bunch of notifications.
-  auto iter = FindClientRootWithRoot(client_root->window());
-  DCHECK(iter != client_roots_.end());
-  client_roots_.erase(iter);
-  client_root = nullptr;  // |client_root| has been deleted.
-
-  const Id client_window_id = TransportIdForWindow(window);
-
-  if (reason == DeleteClientRootReason::kEmbed) {
-    // This case happens when another client is embedded in the window this
-    // client is embedded in. A window can have at most one client embedded in
-    // it. Inform the client of this by way of OnUnembed() and OnWindowDeleted()
-    // because the window is no longer known to this client.
-    //
-    // TODO(sky): consider simplifying this case and just deleting |this|. This
-    // is because at this point the client can't do anything useful (the client
-    // is unable to reattach to a Window in a display at this point).
-    window_tree_client_->OnUnembed(client_window_id);
-    window_tree_client_->OnWindowDeleted(client_window_id);
-  }
-
-  // This client no longer knows about |window|. Unparent any windows that
-  // were created by this client and parented to windows in |window|. Recursion
-  // should stop at windows created by this client because the client always
-  // knows about such windows, and that never changes. Only windows created by
-  // other clients may be removed from the set of known windows.
-  std::vector<aura::Window*> created_windows;
-  RemoveWindowFromKnownWindowsRecursive(window, &created_windows);
-  for (aura::Window* created_window : created_windows) {
-    if (created_window != window && created_window->parent())
-      created_window->parent()->RemoveChild(created_window);
-  }
-
-  if (reason == DeleteClientRootReason::kUnembed ||
-      reason == DeleteClientRootReason::kDestructor) {
-    // Notify the owner of the window it no longer has a client embedded in it.
-    ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-    if (proxy_window->owning_window_tree() &&
-        proxy_window->owning_window_tree() != this) {
-      // ClientRoots always trigger creation of a ProxyWindow, so
-      // |proxy_window| must exist at this point.
-      DCHECK(proxy_window);
-      proxy_window->owning_window_tree()
-          ->window_tree_client_->OnEmbeddedAppDisconnected(
-              proxy_window->owning_window_tree()->TransportIdForWindow(window));
-    }
-    if (proxy_window->embedding())
-      proxy_window->embedding()->clear_embedded_tree();
-    // Only reset the embedding if it's for an existing tree. To do otherwise
-    // results in trying to delete this.
-    if (proxy_window->embedding() && !proxy_window->embedding()->binding()) {
-      proxy_window->SetEmbedding(nullptr);
-      if (!proxy_window->owning_window_tree())
-        proxy_window->Destroy();
-    }
-  }
-}
-
-void WindowTree::DeleteClientRootWithRoot(aura::Window* window) {
-  auto iter = FindClientRootWithRoot(window);
-  if (iter == client_roots_.end())
-    return;
-
-  DeleteClientRoot(iter->get(), DeleteClientRootReason::kEmbed);
-}
-
-aura::Window* WindowTree::GetWindowByClientId(const ClientWindowId& id) {
-  auto iter = client_window_id_to_window_map_.find(id);
-  return iter == client_window_id_to_window_map_.end() ? nullptr : iter->second;
-}
-
-bool WindowTree::IsClientCreatedWindow(aura::Window* window) {
-  auto iter = known_windows_map_.find(window);
-  return iter == known_windows_map_.end() ? false
-                                          : iter->second.is_client_created;
-}
-
-bool WindowTree::IsClientRootWindow(aura::Window* window) {
-  return window && FindClientRootWithRoot(window) != client_roots_.end();
-}
-
-ClientRoot* WindowTree::FindClientRootContaining(aura::Window* window) {
-  if (!window)
-    return nullptr;
-  auto iter = FindClientRootWithRoot(window);
-  if (iter != client_roots_.end())
-    return iter->get();
-  return FindClientRootContaining(window->parent());
-}
-
-WindowTree::ClientRoots::iterator WindowTree::FindClientRootWithRoot(
-    aura::Window* window) {
-  if (!window)
-    return client_roots_.end();
-  for (auto iter = client_roots_.begin(); iter != client_roots_.end(); ++iter) {
-    if (iter->get()->window() == window)
-      return iter;
-  }
-  return client_roots_.end();
-}
-
-bool WindowTree::IsWindowRootOfAnotherClient(aura::Window* window) const {
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  return proxy_window && proxy_window->embedded_window_tree() != nullptr &&
-         proxy_window->embedded_window_tree() != this;
-}
-
-bool WindowTree::DoesAnyAncestorInterceptEvents(ProxyWindow* window) {
-  if (window->embedding() && window->embedding()->embedding_tree() != this &&
-      window->embedding()->embedding_tree_intercepts_events()) {
-    return true;
-  }
-  ProxyWindow* parent = ProxyWindow::GetMayBeNull(window->window()->parent());
-  return parent && DoesAnyAncestorInterceptEvents(parent);
-}
-
-void WindowTree::OnCaptureLost(aura::Window* lost_capture) {
-  DCHECK(IsWindowKnown(lost_capture));
-  window_tree_client_->OnCaptureChanged(kInvalidTransportId,
-                                        TransportIdForWindow(lost_capture));
-}
-
-void WindowTree::OnPerformWindowMoveDone(uint32_t change_id, bool result) {
-  window_moving_ = nullptr;
-  window_tree_client_->OnChangeCompleted(change_id, result);
-}
-
-void WindowTree::DoPerformDragDrop(
-    uint32_t change_id,
-    Id source_window_id,
-    const gfx::Point& screen_location,
-    const base::flat_map<std::string, std::vector<uint8_t>>& drag_data,
-    const gfx::ImageSkia& drag_image,
-    const gfx::Vector2d& drag_image_offset,
-    uint32_t drag_operation,
-    ::ui::mojom::PointerKind source) {
-  if (pending_drag_source_window_id_ != source_window_id) {
-    // Pending drag is canceled before DoPerformDragDrop runs.
-    window_tree_client_->OnPerformDragDropCompleted(change_id, false,
-                                                    mojom::kDropEffectNone);
-    return;
-  }
-
-  aura::Window* source_window = GetWindowByTransportId(source_window_id);
-  if (!source_window) {
-    DVLOG(1) << "PerformDragDrop failed (no window)";
-    OnPerformDragDropDone(change_id, mojom::kDropEffectNone);
-    return;
-  }
-  if (!IsClientCreatedWindow(source_window)) {
-    DVLOG(1) << "PerformDragDrop failed (access denied)";
-    OnPerformDragDropDone(change_id, mojom::kDropEffectNone);
-    return;
-  }
-
-  ui::OSExchangeData data;
-
-  window_service_->delegate()->RunDragLoop(
-      source_window, data, screen_location, drag_operation,
-      source == ::ui::mojom::PointerKind::MOUSE
-          ? ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE
-          : ui::DragDropTypes::DRAG_EVENT_SOURCE_TOUCH,
-      base::BindOnce(&WindowTree::OnPerformDragDropDone,
-                     weak_factory_.GetWeakPtr(), change_id));
-}
-
-void WindowTree::OnPerformDragDropDone(uint32_t change_id, int drag_result) {
-  pending_drag_source_window_id_ = kInvalidTransportId;
-  window_tree_client_->OnPerformDragDropCompleted(
-      change_id, drag_result != ui::DragDropTypes::DRAG_NONE, drag_result);
-}
-
-aura::Window* WindowTree::FindFirstClientCreatedWindow() {
-  for (auto& pair : known_windows_map_) {
-    if (pair.second.is_client_created)
-      return pair.first;
-  }
-  return nullptr;
-}
-
-aura::Window* WindowTree::AddClientCreatedWindow(
-    const ClientWindowId& id,
-    bool is_top_level,
-    std::unique_ptr<aura::Window> window_ptr) {
-  aura::Window* window = window_ptr.get();
-  ProxyWindow::Create(window, this, id, is_top_level);
-  AddWindowToKnownWindows(window, id, std::move(window_ptr));
-  return window;
-}
-
-void WindowTree::AddWindowToKnownWindows(
-    aura::Window* window,
-    const ClientWindowId& id,
-    std::unique_ptr<aura::Window> owned_window) {
-  DCHECK(!IsWindowKnown(window));
-  KnownWindow& known_window = known_windows_map_[window];
-  known_window.client_window_id = id;
-  known_window.is_client_created = owned_window.get() != nullptr;
-  known_window.owned_window = std::move(owned_window);
-
-  DCHECK(IsWindowKnown(window));
-  client_window_id_to_window_map_[id] = window;
-  if (IsClientCreatedWindow(window))
-    window->AddObserver(this);
-}
-
-void WindowTree::RemoveWindowFromKnownWindows(aura::Window* window,
-                                              bool delete_if_owned) {
-  DCHECK(IsWindowKnown(window));
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  ClientRoot* client_root = FindClientRootContaining(window);
-  if (client_root)
-    client_root->UnattachChildFrameSinkIdRecursive(proxy_window);
-
-  proxy_window->set_attached_frame_sink_id(viz::FrameSinkId());
-
-  auto iter = known_windows_map_.find(window);
-  DCHECK(iter != known_windows_map_.end());
-  if (iter->second.owned_window) {
-    window->RemoveObserver(this);
-    if (!delete_if_owned) {
-      // |window| is in the process of being deleted, release() to avoid double
-      // deletion.
-      iter->second.owned_window.release();
-    }
-    iter->second.owned_window.reset();
-  }
-  // Sanity check to make sure deletion didn't result in removal
-  DCHECK(iter == known_windows_map_.find(window));
-
-  // Remove from these maps after destruction. This is necessary as destruction
-  // may end up expecting to find a ProxyWindow.
-  DCHECK(iter != known_windows_map_.end());
-  client_window_id_to_window_map_.erase(iter->second.client_window_id);
-  known_windows_map_.erase(iter);
-}
-
-void WindowTree::RemoveWindowFromKnownWindowsRecursive(
-    aura::Window* window,
-    std::vector<aura::Window*>* created_windows) {
-  if (IsClientCreatedWindow(window)) {
-    // Stop iterating at windows created by this client. We assume the client
-    // will keep seeing any descendants.
-    if (created_windows)
-      created_windows->push_back(window);
-    return;
-  }
-
-  if (IsWindowKnown(window)) {
-    const bool delete_if_owned = true;
-    RemoveWindowFromKnownWindows(window, delete_if_owned);
-  }
-
-  for (aura::Window* child : window->children())
-    RemoveWindowFromKnownWindowsRecursive(child, created_windows);
-}
-
-bool WindowTree::IsValidIdForNewWindow(const ClientWindowId& id) const {
-  return client_window_id_to_window_map_.count(id) == 0u &&
-         base::checked_cast<ClientSpecificId>(id.client_id()) == client_id_;
-}
-
-Id WindowTree::ClientWindowIdToTransportId(
-    const ClientWindowId& client_window_id) const {
-  if (client_window_id.client_id() == client_id_)
-    return client_window_id.sink_id();
-  const Id client_id = client_window_id.client_id();
-  return (client_id << 32) | client_window_id.sink_id();
-}
-
-ClientWindowId WindowTree::MakeClientWindowId(Id transport_window_id) const {
-  if (!ClientIdFromTransportId(transport_window_id))
-    return ClientWindowId(client_id_, transport_window_id);
-  return ClientWindowId(ClientIdFromTransportId(transport_window_id),
-                        ClientWindowIdFromTransportId(transport_window_id));
-}
-
-std::vector<mojom::WindowDataPtr> WindowTree::WindowsToWindowDatas(
-    const std::vector<aura::Window*>& windows) {
-  std::vector<mojom::WindowDataPtr> array(windows.size());
-  for (size_t i = 0; i < windows.size(); ++i)
-    array[i] = WindowToWindowData(windows[i]);
-  return array;
-}
-
-mojom::WindowDataPtr WindowTree::WindowToWindowData(aura::Window* window) {
-  aura::Window* parent = window->parent();
-  aura::Window* transient_parent =
-      aura::client::GetTransientWindowClient()->GetTransientParent(window);
-
-  // If a window isn't known, it means it is not known to the client and should
-  // not be sent over.
-  if (!IsWindowKnown(parent))
-    parent = nullptr;
-  if (!IsWindowKnown(transient_parent))
-    transient_parent = nullptr;
-  const bool is_top_level = IsTopLevel(window);
-  mojom::WindowDataPtr window_data(mojom::WindowData::New());
-  window_data->parent_id =
-      parent ? TransportIdForWindow(parent) : kInvalidTransportId;
-  window_data->window_id =
-      window ? TransportIdForWindow(window) : kInvalidTransportId;
-  window_data->transient_parent_id =
-      transient_parent ? TransportIdForWindow(transient_parent)
-                       : kInvalidTransportId;
-  window_data->bounds =
-      is_top_level ? window->GetBoundsInScreen() : window->bounds();
-  window_data->state = is_top_level
-                           ? window->GetProperty(aura::client::kShowStateKey)
-                           : ui::SHOW_STATE_DEFAULT;
-  window_data->properties =
-      window_service_->property_converter()->GetTransportProperties(window);
-  window_data->visible = (!IsClientRootWindow(window) || is_top_level)
-                             ? window->TargetVisibility()
-                             : window->IsVisible();
-  return window_data;
-}
-
-mojom::WindowTreeClientPtr
-WindowTree::GetAndRemoveScheduledEmbedWindowTreeClient(
-    const base::UnguessableToken& token,
-    std::set<WindowTree*>* visited_trees) {
-  if (visited_trees->count(this))
-    return nullptr;
-
-  auto iter = scheduled_embeds_.find(token);
-  if (iter != scheduled_embeds_.end()) {
-    mojom::WindowTreeClientPtr client = std::move(iter->second);
-    scheduled_embeds_.erase(iter);
-    return client;
-  }
-
-  visited_trees->insert(this);
-  for (auto& client_root : client_roots_) {
-    ProxyWindow* root_window = ProxyWindow::GetMayBeNull(client_root->window());
-    DCHECK(root_window);  // There should always be a ProxyWindow for a root.
-    WindowTree* owning_tree = root_window->owning_window_tree();
-    if (owning_tree) {
-      auto result = owning_tree->GetAndRemoveScheduledEmbedWindowTreeClient(
-          token, visited_trees);
-      if (result)
-        return result;
-    }
-  }
-  return nullptr;
-}
-
-void WindowTree::SendTopmostWindows(
-    const std::vector<aura::Window*>& topmosts) {
-  DCHECK_NE(connection_type_, ConnectionType::kEmbedding);
-  std::vector<Id> topmost_ids;
-  for (auto* window : topmosts) {
-    topmost_ids.push_back(IsWindowKnown(window) ? TransportIdForWindow(window)
-                                                : kInvalidTransportId);
-  }
-  window_tree_client_->OnTopmostWindowChanged(topmost_ids);
-}
-
-void WindowTree::SendOcclusionStates(const std::set<aura::Window*>& windows) {
-  base::flat_map<ws::Id, ws::mojom::OcclusionState> occlusion_changes;
-  for (auto* window : windows) {
-    DCHECK(IsWindowKnown(window));
-
-    // TODO(crbug.com/900568): Send occluded region.
-    occlusion_changes[TransportIdForWindow(window)] =
-        aura::WindowOcclusionStateToMojom(window->occlusion_state());
-  }
-  window_tree_client_->OnOcclusionStatesChanged(occlusion_changes);
-}
-
-void WindowTree::OnWindowTreeHostsDisplayIdChanged(
-    const std::set<aura::Window*>& root_windows) {
-  for (auto& client_root : client_roots_) {
-    aura::Window* root_window = client_root->window()->GetRootWindow();
-    if (root_windows.find(root_window) == root_windows.end())
-      continue;
-
-    client_root->OnWindowTreeHostDisplayIdChanged();
-  }
-}
-
-bool WindowTree::NewWindowImpl(
-    const ClientWindowId& client_window_id,
-    const std::map<std::string, std::vector<uint8_t>>& properties) {
-  DVLOG(3) << "new window client=" << client_id_
-           << " window_id=" << client_window_id.ToString();
-  if (!IsValidIdForNewWindow(client_window_id)) {
-    DVLOG(1) << "NewWindow failed (id is not valid for client)";
-    return false;
-  }
-  const bool is_top_level = false;
-  // WindowDelegateImpl deletes itself when |window| is destroyed.
-  WindowDelegateImpl* window_delegate = new WindowDelegateImpl();
-  std::unique_ptr<aura::Window> window_ptr = std::make_unique<aura::Window>(
-      window_delegate, aura::client::WINDOW_TYPE_UNKNOWN);
-  window_delegate->set_window(window_ptr.get());
-  aura::Window* window = AddClientCreatedWindow(client_window_id, is_top_level,
-                                                std::move(window_ptr));
-
-  SetWindowType(window, aura::GetWindowTypeFromProperties(properties));
-  for (auto& pair : properties) {
-    window_service_->property_converter()->SetPropertyFromTransportValue(
-        window, pair.first, &pair.second);
-  }
-  window->Init(ui::LAYER_NOT_DRAWN);
-  // Windows created by the client should only be destroyed by the client.
-  window->set_owned_by_parent(false);
-  return true;
-}
-
-bool WindowTree::DeleteWindowImpl(const ClientWindowId& window_id) {
-  aura::Window* window = GetWindowByClientId(window_id);
-  DVLOG(3) << "deleting window client=" << client_id_
-           << " client window_id=" << window_id.ToString();
-  if (!window) {
-    DVLOG(1) << "DeleteWindow: no window, returning true anyway";
-    // Even though there is no window, return true. This way, if both sides
-    // try to delete the window at the same time, there is no race. Deletion
-    // at the same should generally only happen for embed roots, but shutdown
-    // paths (in Ash) may also trigger deletion.
-    return true;
-  }
-
-  const bool is_client_created_window = IsClientCreatedWindow(window);
-  auto iter = FindClientRootWithRoot(window);
-  if (iter != client_roots_.end()) {
-    DeleteClientRoot(iter->get(), DeleteClientRootReason::kUnembed);
-    if (!is_client_created_window)
-      return true;
-    // If client created, fall through to delete window.
-  } else if (!is_client_created_window) {
-    DVLOG(1) << "DeleteWindow failed (client did not create window)";
-    return false;
-  }
-
-  const bool delete_if_owned = true;
-  RemoveWindowFromKnownWindows(window, delete_if_owned);
-  return true;
-}
-
-bool WindowTree::SetCaptureImpl(const ClientWindowId& window_id) {
-  DVLOG(3) << "SetCapture window_id=" << window_id;
-  aura::Window* window = GetWindowByClientId(window_id);
-  if (!window) {
-    DVLOG(1) << "SetCapture failed (no window)";
-    return false;
-  }
-
-  if ((!IsClientCreatedWindow(window) && !IsClientRootWindow(window)) ||
-      !window->IsVisible() || !window->GetRootWindow()) {
-    DVLOG(1) << "SetCapture failed (access denied or invalid window)";
-    return false;
-  }
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-
-  if (DoesAnyAncestorInterceptEvents(proxy_window)) {
-    // If an ancestor is intercepting events, than the descendants are not
-    // allowed to set capture. This is primarily to prevent renderers from
-    // setting capture.
-    DVLOG(1) << "SetCapture failed (ancestor intercepts events)";
-    return false;
-  }
-
-  wm::CaptureController* capture_controller = wm::CaptureController::Get();
-  DCHECK(capture_controller);
-
-  if (capture_controller->GetCaptureWindow() == window) {
-    if (proxy_window->capture_owner() != this) {
-      // The capture window didn't change, but the client that owns capture
-      // changed (see |ProxyWindow::capture_owner_| for details on this).
-      // Notify the current owner that it lost capture.
-      if (proxy_window->capture_owner())
-        proxy_window->capture_owner()->OnCaptureLost(window);
-      proxy_window->SetCaptureOwner(this);
-    }
-    return true;
-  }
-
-  ClientChange change(property_change_tracker_.get(), window,
-                      ClientChangeType::kCapture);
-  proxy_window->SetCaptureOwner(this);
-  capture_controller->SetCapture(window);
-  return capture_controller->GetCaptureWindow() == window;
-}
-
-bool WindowTree::ReleaseCaptureImpl(const ClientWindowId& window_id) {
-  DVLOG(3) << "ReleaseCapture window_id=" << window_id;
-  aura::Window* window = GetWindowByClientId(window_id);
-  if (!window) {
-    DVLOG(1) << "ReleaseCapture failed (no window)";
-    return false;
-  }
-
-  if (!IsClientCreatedWindow(window) && !IsClientRootWindow(window)) {
-    DVLOG(1) << "ReleaseCapture failed (access denied)";
-    return false;
-  }
-
-  wm::CaptureController* capture_controller = wm::CaptureController::Get();
-  DCHECK(capture_controller);
-
-  if (!capture_controller->GetCaptureWindow())
-    return true;  // Capture window is already null.
-
-  if (capture_controller->GetCaptureWindow() != window) {
-    DVLOG(1) << "ReleaseCapture failed (supplied window does not have capture)";
-    return false;
-  }
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  if (proxy_window->capture_owner() && proxy_window->capture_owner() != this) {
-    // This client is trying to release capture, but it doesn't own capture.
-    DVLOG(1) << "ReleaseCapture failed (client did not request capture)";
-    return false;
-  }
-  proxy_window->SetCaptureOwner(nullptr);
-
-  ClientChange change(property_change_tracker_.get(), window,
-                      ClientChangeType::kCapture);
-  capture_controller->ReleaseCapture(window);
-  return capture_controller->GetCaptureWindow() != window;
-}
-
-bool WindowTree::AddWindowImpl(const ClientWindowId& parent_id,
-                               const ClientWindowId& child_id) {
-  aura::Window* parent = GetWindowByClientId(parent_id);
-  aura::Window* child = GetWindowByClientId(child_id);
-  DVLOG(3) << "add window client=" << client_id_
-           << " client parent window_id=" << parent_id.ToString()
-           << " client child window_id=" << child_id.ToString();
-  if (!parent) {
-    DVLOG(1) << "AddWindow failed (no parent)";
-    return false;
-  }
-  if (!child) {
-    DVLOG(1) << "AddWindow failed (no child)";
-    return false;
-  }
-  if (child->parent() == parent) {
-    DVLOG(1) << "AddWindow failed (already has parent)";
-    return false;
-  }
-  if (child->Contains(parent)) {
-    DVLOG(1) << "AddWindow failed (child contains parent)";
-    return false;
-  }
-  if (IsClientCreatedWindow(child) && !IsTopLevel(child) &&
-      (IsClientRootWindow(parent) || (IsClientCreatedWindow(parent) &&
-                                      !IsWindowRootOfAnotherClient(parent)))) {
-    parent->AddChild(child);
-    return true;
-  }
-  DVLOG(1) << "AddWindow failed (access denied)";
-  return false;
-}
-
-bool WindowTree::RemoveWindowFromParentImpl(
-    const ClientWindowId& client_window_id) {
-  aura::Window* window = GetWindowByClientId(client_window_id);
-  DVLOG(3) << "removing window from parent client=" << client_id_
-           << " client window_id=" << client_window_id;
-  if (!window) {
-    DVLOG(1) << "RemoveWindowFromParent failed (invalid window id="
-             << client_window_id.ToString() << ")";
-    return false;
-  }
-  if (!window->parent()) {
-    DVLOG(1) << "RemoveWindowFromParent failed (no parent id="
-             << client_window_id.ToString() << ")";
-    return false;
-  }
-  if (IsClientCreatedWindow(window) && !IsClientRootWindow(window)) {
-    window->parent()->RemoveChild(window);
-    return true;
-  }
-  DVLOG(1) << "RemoveWindowFromParent failed (access policy disallowed id="
-           << client_window_id.ToString() << ")";
-  return false;
-}
-
-bool WindowTree::AddTransientWindowImpl(const ClientWindowId& parent_id,
-                                        const ClientWindowId& transient_id) {
-  DVLOG(3) << "adding transient window client=" << client_id_
-           << " parent_id=" << parent_id << " transient_id=" << transient_id;
-  aura::Window* parent = GetWindowByClientId(parent_id);
-  aura::Window* transient = GetWindowByClientId(transient_id);
-  if (!parent || !transient) {
-    DVLOG(1) << "AddTransientWindow failed (invalid window parent_id="
-             << parent_id << " transient_id=" << transient_id << ")";
-    return false;
-  }
-
-  if (parent->Contains(transient)) {
-    DVLOG(1) << "AddTransientWindow failed (parent contains transient"
-             << " parent_id=" << parent_id << " transient_id=" << transient_id
-             << ")";
-    return false;
-  }
-
-  if (!IsClientCreatedWindow(parent) || !IsClientCreatedWindow(transient)) {
-    DVLOG(1) << "SetModalType failed (access policy disallowed parent_id="
-             << parent_id << " transient_id=" << transient_id << ")";
-    return false;
-  }
-
-  ::wm::AddTransientChild(parent, transient);
-
-  // Transients are placed in a container by way of the WindowParentingClient.
-  // This code is simular to NativeWidgetAura, where it calls to
-  // ParentWindowWithContext().
-  if (IsTopLevel(parent) && parent->GetRootWindow() && IsTopLevel(transient) &&
-      transient->GetRootWindow()) {
-    aura::client::WindowParentingClient* client =
-        aura::client::GetWindowParentingClient(parent);
-    aura::Window* default_parent =
-        client->GetDefaultParent(transient, transient->GetBoundsInScreen());
-    if (default_parent && transient->parent() != default_parent)
-      default_parent->AddChild(transient);
-  }
-  return true;
-}
-
-bool WindowTree::RemoveTransientWindowFromParentImpl(
-    const ClientWindowId& transient_id) {
-  DVLOG(3) << "removing transient window from parent client=" << client_id_
-           << " transient_id=" << transient_id;
-  aura::Window* transient = GetWindowByClientId(transient_id);
-  aura::Window* parent = ::wm::GetTransientParent(transient);
-  if (!parent || !transient) {
-    DVLOG(1) << "AddTransientWindow failed (invalid window or no transient"
-             << " parent transient_id=" << transient_id << ")";
-    return false;
-  }
-
-  if (!IsClientCreatedWindow(parent) || !IsClientCreatedWindow(transient)) {
-    DVLOG(1) << "SetModalType failed (access policy disallowed transient_id="
-             << transient_id << ")";
-    return false;
-  }
-
-  ::wm::RemoveTransientChild(parent, transient);
-  return true;
-}
-
-bool WindowTree::SetModalTypeImpl(const ClientWindowId& client_window_id,
-                                  ui::ModalType type) {
-  DVLOG(3) << "setting window modal type client=" << client_id_
-           << " client_window_id=" << client_window_id << " type=" << type;
-  aura::Window* window = GetWindowByClientId(client_window_id);
-  if (!window) {
-    DVLOG(1) << "SetModalType failed (invalid window id="
-             << client_window_id.ToString() << ")";
-    return false;
-  }
-
-  if (!IsClientRootWindow(window) && type == ui::MODAL_TYPE_SYSTEM) {
-    DVLOG(1) << "SetModalType failed (not allowed for embedded clients)";
-    return false;
-  }
-
-  if (type == ui::MODAL_TYPE_SYSTEM &&
-      window->type() != aura::client::WINDOW_TYPE_NORMAL &&
-      window->type() != aura::client::WINDOW_TYPE_POPUP) {
-    DVLOG(1) << "Window type cannot be made system modal: " << window->type();
-    return false;
-  }
-
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "SetModalType failed (access policy disallowed id="
-             << client_window_id.ToString() << ")";
-    return false;
-  }
-
-  window_service_->delegate()->SetModalType(window, type);
-  return true;
-}
-
-bool WindowTree::SetWindowVisibilityImpl(const ClientWindowId& window_id,
-                                         bool visible) {
-  aura::Window* window = GetWindowByClientId(window_id);
-  DVLOG(3) << "SetWindowVisibility client=" << client_id_
-           << " client window_id=" << window_id.ToString();
-  if (!window) {
-    DVLOG(1) << "SetWindowVisibility failed (no window)";
-    return false;
-  }
-  if (IsClientCreatedWindow(window) ||
-      (IsClientRootWindow(window) && can_change_root_window_visibility_)) {
-    if (window->TargetVisibility() == visible)
-      return true;
-    ClientChange change(property_change_tracker_.get(), window,
-                        ClientChangeType::kVisibility);
-    if (visible)
-      window->Show();
-    else
-      window->Hide();
-    // Return true only if the change actually took. It's entirely possible an
-    // observer may effectively revert the change.
-    return window->TargetVisibility() == visible;
-  }
-  DVLOG(1) << "SetWindowVisibility failed (access policy denied change)";
-  return false;
-}
-
-bool WindowTree::SetWindowPropertyImpl(
-    const ClientWindowId& window_id,
-    const std::string& name,
-    const base::Optional<std::vector<uint8_t>>& value) {
-  aura::Window* window = GetWindowByClientId(window_id);
-  DVLOG(3) << "SetWindowProperty client=" << client_id_
-           << " client window_id=" << window_id.ToString()
-           << " property=" << name;
-  if (!window) {
-    DVLOG(1) << "SetWindowProperty failed (no window)";
-    return false;
-  }
-  aura::PropertyConverter* property_converter =
-      window_service_->property_converter();
-  if (!property_converter->IsTransportNameRegistered(name)) {
-    NOTREACHED() << "Attempting to set an unregistered property; this is not "
-                    "implemented. property name="
-                 << name;
-    return false;
-  }
-  if (!IsClientCreatedWindow(window) && !IsClientRootWindow(window)) {
-    DVLOG(1) << "SetWindowProperty failed (access policy denied change)";
-    return false;
-  }
-
-  ClientChange change(
-      property_change_tracker_.get(), window, ClientChangeType::kProperty,
-      property_converter->GetPropertyKeyFromTransportName(name));
-
-  // Special handle the property whose value is a pointer to aura::Window since
-  // property converter can't convert the transported value.
-  const aura::WindowProperty<aura::Window*>* property =
-      property_converter->GetWindowPtrProperty(name);
-  if (property) {
-    aura::Window* prop_window = nullptr;
-    if (value.has_value())
-      prop_window = GetWindowByTransportId(mojo::ConvertTo<Id>(value.value()));
-    window->SetProperty(property, prop_window);
-    return true;
-  }
-
-  std::unique_ptr<std::vector<uint8_t>> data;
-  if (value.has_value())
-    data = std::make_unique<std::vector<uint8_t>>(value.value());
-  property_converter->SetPropertyFromTransportValue(window, name, data.get());
-  return true;
-}
-
-bool WindowTree::EmbedImpl(const ClientWindowId& window_id,
-                           mojom::WindowTreeClientPtr window_tree_client_ptr,
-                           mojom::WindowTreeClient* window_tree_client,
-                           uint32_t flags) {
-  DVLOG(3) << "Embed window_id=" << window_id;
-  aura::Window* window = GetWindowByClientId(window_id);
-  if (!window) {
-    DVLOG(1) << "Embed failed (no window)";
-    return false;
-  }
-  if (!IsClientCreatedWindow(window) || IsTopLevel(window)) {
-    DVLOG(1) << "Embed failed (access denied)";
-    return false;
-  }
-
-  const bool owner_intercept_events =
-      (connection_type_ != ConnectionType::kEmbedding &&
-       (flags & mojom::kEmbedFlagEmbedderInterceptsEvents) != 0);
-  std::unique_ptr<Embedding> embedding =
-      std::make_unique<Embedding>(this, window, owner_intercept_events);
-  embedding->Init(window_service_, std::move(window_tree_client_ptr),
-                  window_tree_client,
-                  base::BindOnce(&WindowTree::OnEmbeddedClientConnectionLost,
-                                 base::Unretained(this), embedding.get()));
-  if (flags & mojom::kEmbedFlagEmbedderControlsVisibility)
-    embedding->embedded_tree()->can_change_root_window_visibility_ = false;
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  proxy_window->SetEmbedding(std::move(embedding));
-  window_tree_client_->OnFrameSinkIdAllocated(
-      ClientWindowIdToTransportId(window_id), proxy_window->frame_sink_id());
-  return true;
-}
-
-bool WindowTree::SetWindowOpacityImpl(const ClientWindowId& window_id,
-                                      float opacity) {
-  aura::Window* window = GetWindowByClientId(window_id);
-  DVLOG(3) << "SetWindowOpacity client=" << client_id_
-           << " client window_id=" << window_id.ToString();
-  if (IsClientCreatedWindow(window) ||
-      (IsClientRootWindow(window) && can_change_root_window_visibility_)) {
-    if (window->layer()->opacity() == opacity)
-      return true;
-    window->layer()->SetOpacity(opacity);
-    return true;
-  }
-  DVLOG(1) << "SetWindowOpacity failed (invalid window or access denied)";
-  return false;
-}
-
-bool WindowTree::SetWindowTransparentImpl(const ClientWindowId& window_id,
-                                          bool transparent) {
-  aura::Window* window = GetWindowByClientId(window_id);
-  DVLOG(3) << "SetWindowTransparent client=" << client_id_
-           << " client window_id=" << window_id.ToString();
-  if (IsClientCreatedWindow(window) || IsClientRootWindow(window)) {
-    if (window->transparent() == transparent)
-      return true;
-    window->SetTransparent(transparent);
-    return true;
-  }
-  DVLOG(1) << "SetWindowTransparent failed (invalid window or access denied)";
-  return false;
-}
-
-bool WindowTree::SetWindowBoundsImpl(
-    const ClientWindowId& window_id,
-    const gfx::Rect& bounds,
-    const base::Optional<viz::LocalSurfaceIdAllocation>&
-        local_surface_id_allocation) {
-  aura::Window* window = GetWindowByClientId(window_id);
-
-  DVLOG(3) << "SetWindowBounds window_id=" << window_id
-           << " bounds=" << bounds.ToString() << " local_surface_id="
-           << (local_surface_id_allocation
-                   ? local_surface_id_allocation->ToString()
-                   : "null");
-
-  if (!window) {
-    DVLOG(1) << "SetWindowBounds failed (invalid window id)";
-    return false;
-  }
-
-  // Only the owner of the window can change the bounds.
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "SetWindowBounds failed (access denied)";
-    return false;
-  }
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  DCHECK(proxy_window);  // Earlier checks mean this should be true.
-  const bool local_surface_id_changed =
-      proxy_window->local_surface_id_allocation() !=
-      local_surface_id_allocation;
-
-  const gfx::Rect original_bounds =
-      IsTopLevel(window) ? window->GetBoundsInScreen() : window->bounds();
-
-  if (original_bounds == bounds && !local_surface_id_changed)
-    return true;
-
-  ClientChange change(property_change_tracker_.get(), window,
-                      ClientChangeType::kBounds);
-
-  ClientRoot* client_root = GetClientRootForWindow(window);
-  if (IsTopLevel(window)) {
-    // If IsTopLevel() returns true, there should be a ClientRoot.
-    DCHECK(client_root);
-    if (local_surface_id_allocation &&
-        local_surface_id_allocation->local_surface_id().embed_token() !=
-            proxy_window->local_surface_id_allocation()
-                ->local_surface_id()
-                .embed_token()) {
-      DVLOG(1) << "SetWindowBounds failed (embed token changed)";
-      return false;
-    }
-    return client_root->SetBoundsInScreenFromClient(
-        bounds, local_surface_id_allocation);
-  }
-  proxy_window->set_local_surface_id_allocation(local_surface_id_allocation);
-  window->SetBounds(bounds);
-
-  if (!change.window())
-    return true;  // Return value doesn't matter if window destroyed.
-
-  if (window->bounds() == original_bounds) {
-    if (local_surface_id_changed) {
-      // If the bounds didn't change, but the LocalSurfaceId did, then the
-      // LocalSurfaceId needs to be propagated to any embeddings.
-      if (proxy_window->HasEmbedding() &&
-          proxy_window->embedding()->embedding_tree() == this) {
-        WindowTree* embedded_tree = proxy_window->embedding()->embedded_tree();
-        ClientRoot* embedded_client_root =
-            embedded_tree->GetClientRootForWindow(window);
-        DCHECK(embedded_client_root);
-        embedded_client_root->OnLocalSurfaceIdChanged();
-      }
-    }
-    return (bounds == original_bounds);
-  }
-
-  if (window->bounds() == bounds &&
-      proxy_window->local_surface_id_allocation() ==
-          local_surface_id_allocation) {
-    return true;
-  }
-
-  // The window's bounds changed, but not to the value the client requested.
-  // Tell the client the new value, and return false, which triggers the client
-  // to use the value supplied to OnWindowBoundsChanged().
-  window_tree_client_->OnWindowBoundsChanged(
-      TransportIdForWindow(window), window->bounds(),
-      window->GetProperty(aura::client::kShowStateKey),
-      local_surface_id_allocation);
-  return false;
-}
-
-bool WindowTree::SetWindowTransformImpl(const ClientWindowId& window_id,
-                                        const gfx::Transform& transform) {
-  DVLOG(3) << "SetWindowTransform window_id=" << window_id;
-  aura::Window* window = GetWindowByClientId(window_id);
-  // This doesn't allow setting the transform on top-levels as that may conflict
-  // with top-level animations done by the window-manager. Additionally the
-  // window-manager is really the one that should be animating top-levels.
-  if (!window || !IsClientCreatedWindow(window) || IsTopLevel(window)) {
-    DVLOG(1) << "SetWindowTransform failed (invalid window)";
-    return false;
-  }
-  window->SetTransform(transform);
-  return true;
-}
-
-bool WindowTree::ReorderWindowImpl(const ClientWindowId& window_id,
-                                   const ClientWindowId& relative_window_id,
-                                   mojom::OrderDirection direction) {
-  DVLOG(3) << "ReorderWindow window_id=" << window_id
-           << " relative_window_id=" << relative_window_id;
-  aura::Window* window = GetWindowByClientId(window_id);
-  aura::Window* relative_window = GetWindowByClientId(relative_window_id);
-  // Only allow reordering of windows the client created, and windows that are
-  // siblings.
-  if (!IsClientCreatedWindow(window) ||
-      !IsClientCreatedWindow(relative_window) ||
-      window->parent() != relative_window->parent() || !window->parent() ||
-      !IsClientCreatedWindow(window->parent())) {
-    DVLOG(1) << "ReorderWindow failed (invalid windows)";
-    return false;
-  }
-  if (direction == mojom::OrderDirection::ABOVE)
-    window->parent()->StackChildAbove(window, relative_window);
-  else
-    window->parent()->StackChildBelow(window, relative_window);
-  return true;
-}
-
-std::vector<aura::Window*> WindowTree::GetWindowTreeImpl(
-    const ClientWindowId& window_id) {
-  aura::Window* window = GetWindowByClientId(window_id);
-  std::vector<aura::Window*> results;
-  GetWindowTreeRecursive(window, &results);
-  return results;
-}
-
-bool WindowTree::SetFocusImpl(const ClientWindowId& window_id) {
-  DVLOG(3) << "SetFocus window_id=" << window_id;
-  // FocusHandler deals with a null window.
-  return focus_handler_.SetFocus(GetWindowByClientId(window_id));
-}
-
-bool WindowTree::SetCursorImpl(const ClientWindowId& window_id,
-                               ui::Cursor cursor) {
-  aura::Window* window = GetWindowByClientId(window_id);
-  if (!window) {
-    DVLOG(1) << "SetCursor failed (no window)";
-    return false;
-  }
-  if (!IsClientCreatedWindow(window) && !IsClientRootWindow(window)) {
-    DVLOG(1) << "SetCursor failed (access denied)";
-    return false;
-  }
-
-  auto* proxy_window = ProxyWindow::GetMayBeNull(window);
-
-#if defined(USE_OZONE)
-  auto* factory = ui::CursorFactoryOzone::GetInstance();
-  if (cursor.native_type() != ui::CursorType::kCustom) {
-    cursor.SetPlatformCursor(factory->GetDefaultCursor(cursor.native_type()));
-  } else {
-    cursor.SetPlatformCursor(factory->CreateImageCursor(
-        cursor.GetBitmap(), cursor.GetHotspot(), cursor.device_scale_factor()));
-    cursor.UnrefCustomCursor();
-  }
-#else
-  NOTIMPLEMENTED();
-#endif
-
-  // Ask our delegate to set the cursor. This will save the cursor for toplevels
-  // and also update the active cursor if appropriate (i.e. if |window| is the
-  // last to have set the cursor/is currently hovered).
-  if (!window_service_->delegate()->StoreAndSetCursor(window, cursor)) {
-    // Store the cursor on ProxyWindow. This will later be accessed by the
-    // WindowDelegate for non-toplevels, i.e. WindowDelegateImpl.
-    proxy_window->StoreCursor(cursor);
-  }
-
-  return true;
-}
-
-bool WindowTree::StackAboveImpl(const ClientWindowId& above_window_id,
-                                const ClientWindowId& below_window_id) {
-  DVLOG(3) << "StackAbove above_window_id=" << above_window_id
-           << " below_window_id=" << below_window_id;
-  aura::Window* above_window = GetWindowByClientId(above_window_id);
-  aura::Window* below_window = GetWindowByClientId(below_window_id);
-  // This function only applies to top-levels.
-  if (!IsClientCreatedWindow(above_window) ||
-      !IsClientCreatedWindow(below_window) || !IsTopLevel(above_window) ||
-      !IsTopLevel(below_window) || !above_window->parent() ||
-      above_window->parent() != below_window->parent()) {
-    DVLOG(1) << "StackAbove failed (invalid windows)";
-    return false;
-  }
-  above_window->parent()->StackChildAbove(above_window, below_window);
-  return true;
-}
-
-bool WindowTree::StackAtTopImpl(const ClientWindowId& window_id) {
-  DVLOG(3) << "StackAtTop window_id=" << window_id;
-
-  aura::Window* window = GetWindowByClientId(window_id);
-  if (!window || !IsTopLevel(window)) {
-    DVLOG(1) << "StackAtTop failed (invalid id, or invalid window)";
-    return false;
-  }
-
-  if (window->parent())
-    window->parent()->StackChildAtTop(window);
-  return true;
-}
-
-void WindowTree::GetWindowTreeRecursive(aura::Window* window,
-                                        std::vector<aura::Window*>* windows) {
-  if (!IsWindowKnown(window))
-    return;
-
-  windows->push_back(window);
-  for (aura::Window* child : window->children())
-    GetWindowTreeRecursive(child, windows);
-}
-
-void WindowTree::OnEmbeddedClientConnectionLost(Embedding* embedding) {
-  ProxyWindow::GetMayBeNull(embedding->window())->SetEmbedding(nullptr);
-}
-
-void WindowTree::OnWindowHierarchyChanging(
-    const HierarchyChangeParams& params) {
-  if (params.target != params.receiver || !IsClientCreatedWindow(params.target))
-    return;
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(params.target);
-  DCHECK(proxy_window);  // non-null because of IsClientCreatedWindow() check.
-  ClientRoot* old_root = FindClientRootContaining(params.old_parent);
-  ClientRoot* new_root = FindClientRootContaining(params.new_parent);
-  if (old_root == new_root)
-    return;
-
-  if (old_root)
-    old_root->UnattachChildFrameSinkIdRecursive(proxy_window);
-  if (new_root)
-    new_root->AttachChildFrameSinkIdRecursive(proxy_window);
-}
-
-void WindowTree::OnWindowDestroyed(aura::Window* window) {
-  DCHECK(IsWindowKnown(window));
-
-  // WARNING: this function is not necessarily called. In particular it isn't
-  // called when the client requests the window to be deleted, or from the
-  // destructor.
-
-  auto iter = FindClientRootWithRoot(window);
-  if (iter != client_roots_.end())
-    DeleteClientRoot(iter->get(), WindowTree::DeleteClientRootReason::kDeleted);
-
-  DCHECK(IsWindowKnown(window));
-  window_tree_client_->OnWindowDeleted(TransportIdForWindow(window));
-
-  const bool delete_if_owned = false;
-  RemoveWindowFromKnownWindows(window, delete_if_owned);
-}
-
-void WindowTree::OnWindowVisibilityChanging(aura::Window* window,
-                                            bool visible) {
-  // Visibility changes for top-levels are handled by ClientRoot.
-  if (IsTopLevel(window) ||
-      property_change_tracker_->IsProcessingChangeForWindow(
-          window, ClientChangeType::kVisibility)) {
-    return;
-  }
-  window_tree_client_->OnWindowVisibilityChanged(TransportIdForWindow(window),
-                                                 visible);
-}
-
-void WindowTree::OnCaptureChanged(aura::Window* lost_capture,
-                                  aura::Window* gained_capture) {
-  if (property_change_tracker_->IsProcessingChangeForWindow(
-          lost_capture, ClientChangeType::kCapture) ||
-      property_change_tracker_->IsProcessingChangeForWindow(
-          gained_capture, ClientChangeType::kCapture)) {
-    // The client initiated the change, don't notify the client.
-    return;
-  }
-
-  // Assume the environment the WindowService is running in is not requesting
-  // capture on windows created by clients. With this assumption, the only time
-  // the client needs to be notified is if the client had set capture on one of
-  // its windows, and capture changed. This might happen if the window is no
-  // longer valid for capture, or the local environment requests capture on
-  // another window.
-  if (lost_capture && (IsClientCreatedWindow(lost_capture) ||
-                       IsClientRootWindow(lost_capture))) {
-    ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(lost_capture);
-    if (proxy_window->capture_owner() == this) {
-      // One of the windows known to this client had capture. Notify the client
-      // of the change. If the client does not know about the window that gained
-      // capture, an invalid window id is used.
-      proxy_window->SetCaptureOwner(nullptr);
-      const Id gained_capture_id = gained_capture &&
-                                           IsWindowKnown(gained_capture) &&
-                                           !IsClientRootWindow(gained_capture)
-                                       ? TransportIdForWindow(gained_capture)
-                                       : kInvalidTransportId;
-      window_tree_client_->OnCaptureChanged(gained_capture_id,
-                                            TransportIdForWindow(lost_capture));
-    }
-  }
-}
-
-void WindowTree::NewWindow(
-    uint32_t change_id,
-    Id transport_window_id,
-    const base::Optional<base::flat_map<std::string, std::vector<uint8_t>>>&
-        transport_properties) {
-  std::map<std::string, std::vector<uint8_t>> properties;
-  if (transport_properties.has_value())
-    properties = mojo::FlatMapToMap(transport_properties.value());
-  window_tree_client_->OnChangeCompleted(
-      change_id,
-      NewWindowImpl(MakeClientWindowId(transport_window_id), properties));
-}
-
-void WindowTree::NewTopLevelWindow(
-    uint32_t change_id,
-    Id transport_window_id,
-    const base::flat_map<std::string, std::vector<uint8_t>>& properties) {
-  const ClientWindowId client_window_id =
-      MakeClientWindowId(transport_window_id);
-  DVLOG(3) << "NewTopLevelWindow client_window_id="
-           << client_window_id.ToString();
-  if (!IsValidIdForNewWindow(client_window_id)) {
-    DVLOG(1) << "NewTopLevelWindow failed (invalid window id)";
-    window_tree_client_->OnChangeCompleted(change_id, false);
-    return;
-  }
-  if (connection_type_ == ConnectionType::kEmbedding) {
-    // This is done to disallow clients such as renderers from creating
-    // top-level windows.
-    DVLOG(1) << "NewTopLevelWindow failed (access denied)";
-    window_tree_client_->OnChangeCompleted(change_id, false);
-    return;
-  }
-  std::unique_ptr<TopLevelProxyWindowImpl> top_level_proxy_window =
-      std::make_unique<TopLevelProxyWindowImpl>(window_tree_client_,
-                                                transport_window_id);
-  std::unique_ptr<aura::Window> top_level_ptr =
-      window_service_->delegate()->NewTopLevel(
-          top_level_proxy_window.get(), window_service_->property_converter(),
-          properties);
-  if (!top_level_ptr) {
-    DVLOG(1) << "NewTopLevelWindow failed (delegate window creation failed)";
-    window_tree_client_->OnChangeCompleted(change_id, false);
-    return;
-  }
-  top_level_ptr->set_owned_by_parent(false);
-  const bool is_top_level = true;
-  aura::Window* top_level = AddClientCreatedWindow(
-      client_window_id, is_top_level, std::move(top_level_ptr));
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(top_level);
-  proxy_window->SetTopLevelProxyWindow(std::move(top_level_proxy_window));
-  proxy_window->set_frame_sink_id(client_window_id);
-  const int64_t display_id =
-      display::Screen::GetScreen()->GetDisplayNearestWindow(top_level).id();
-  // This passes null for the mojom::WindowTreePtr because the client has
-  // already been given the mojom::WindowTreePtr that is backed by this
-  // WindowTree.
-  ClientRoot* client_root = CreateClientRoot(top_level, is_top_level);
-  client_root->RegisterVizEmbeddingSupport();
-  proxy_window->top_level_proxy_window()->set_client_root(client_root);
-  // Creating the ClientRoot should trigger setting a LocalSurfaceIdAllocation.
-  DCHECK(proxy_window->local_surface_id_allocation());
-  window_tree_client_->OnTopLevelCreated(
-      change_id, WindowToWindowData(top_level), display_id,
-      top_level->IsVisible(), *(proxy_window->local_surface_id_allocation()));
-}
-
-void WindowTree::DeleteWindow(uint32_t change_id, Id transport_window_id) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, DeleteWindowImpl(MakeClientWindowId(transport_window_id)));
-}
-
-void WindowTree::SetCapture(uint32_t change_id, Id transport_window_id) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, SetCaptureImpl(MakeClientWindowId(transport_window_id)));
-}
-
-void WindowTree::ReleaseCapture(uint32_t change_id, Id transport_window_id) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, ReleaseCaptureImpl(MakeClientWindowId(transport_window_id)));
-}
-
-void WindowTree::ObserveEventTypes(
-    const std::vector<ui::mojom::EventType>& types) {
-  if (types.empty()) {
-    event_observer_helper_.reset();
-  } else {
-    if (!event_observer_helper_)
-      event_observer_helper_ = std::make_unique<EventObserverHelper>(this);
-    std::set<ui::EventType> event_types;
-    for (auto type : types)
-      event_types.insert(mojo::ConvertTo<ui::EventType>(type));
-    event_observer_helper_->set_types(event_types);
-  }
-}
-
-void WindowTree::SetWindowBounds(
-    uint32_t change_id,
-    Id window_id,
-    const gfx::Rect& bounds,
-    const base::Optional<viz::LocalSurfaceIdAllocation>&
-        local_surface_id_allocation) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, SetWindowBoundsImpl(MakeClientWindowId(window_id), bounds,
-                                     local_surface_id_allocation));
-}
-
-void WindowTree::UpdateLocalSurfaceIdFromChild(
-    Id transport_window_id,
-    const viz::LocalSurfaceIdAllocation& local_surface_id_allocation) {
-  const ClientWindowId window_id = MakeClientWindowId(transport_window_id);
-  aura::Window* window = GetWindowByClientId(window_id);
-
-  DVLOG(3) << "UpdateLocalSurfaceIdFromChild window_id=" << window_id
-           << " local_surface_id=" << local_surface_id_allocation.ToString();
-
-  ClientRoot* client_root = GetClientRootForWindow(window);
-  if (!client_root || !client_root->ShouldAssignLocalSurfaceId()) {
-    DVLOG(1) << "UpdateLocalSurfaceIdFromChild failed (invalid window id)";
-    return;
-  }
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  DCHECK(window);  // Earlier checks ensure this is non-null.
-  if (local_surface_id_allocation.local_surface_id().embed_token() !=
-      proxy_window->local_surface_id_allocation()
-          ->local_surface_id()
-          .embed_token()) {
-    DVLOG(1) << "UpdateLocalSurfaceIdFromChild failed (embed token changed)";
-    return;
-  }
-  client_root->UpdateLocalSurfaceIdFromChild(local_surface_id_allocation);
-}
-
-void WindowTree::AllocateLocalSurfaceId(Id transport_window_id) {
-  const ClientWindowId window_id = MakeClientWindowId(transport_window_id);
-  aura::Window* window = GetWindowByClientId(window_id);
-  DVLOG(3) << "AllocateLocalSurfaceId client window_id="
-           << window_id.ToString();
-  if (!window) {
-    DVLOG(1) << "AllocateLocalSurfaceId failed (invalid window id)";
-    return;
-  }
-  if (!IsTopLevel(window) &&
-      (!IsClientRootWindow(window) ||
-       ProxyWindow::GetMayBeNull(window)->owning_window_tree() != nullptr)) {
-    DVLOG(1) << "AllocateLocalSurfaceId failed (must be root or top-level)";
-    return;
-  }
-  ClientRoot* client_root = GetClientRootForWindow(window);
-  DCHECK(client_root);
-  client_root->AllocateLocalSurfaceIdAndNotifyClient();
-}
-
-void WindowTree::SetWindowTransform(uint32_t change_id,
-                                    Id transport_window_id,
-                                    const gfx::Transform& transform) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, SetWindowTransformImpl(MakeClientWindowId(transport_window_id),
-                                        transform));
-}
-
-void WindowTree::SetClientArea(
-    Id transport_window_id,
-    const gfx::Insets& insets,
-    const base::Optional<std::vector<gfx::Rect>>& additional_client_areas) {
-  const ClientWindowId window_id = MakeClientWindowId(transport_window_id);
-  aura::Window* window = GetWindowByClientId(window_id);
-  DVLOG(3) << "SetClientArea client window_id=" << window_id.ToString()
-           << " insets=" << insets.ToString();
-  if (!window) {
-    DVLOG(1) << "SetClientArea failed (invalid window id)";
-    return;
-  }
-  if (!IsClientRootWindow(window) || !IsTopLevel(window)) {
-    DVLOG(1) << "SetClientArea failed (access denied)";
-    return;
-  }
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  DCHECK(proxy_window);  // Must exist because of preceding conditionals.
-  proxy_window->SetClientArea(
-      insets, additional_client_areas.value_or(std::vector<gfx::Rect>()));
-}
-
-void WindowTree::SetHitTestInsets(Id transport_window_id,
-                                  const gfx::Insets& mouse,
-                                  const gfx::Insets& touch) {
-  const ClientWindowId window_id = MakeClientWindowId(transport_window_id);
-  aura::Window* window = GetWindowByClientId(window_id);
-  DVLOG(3) << "SetHitTestInsets client window_id=" << window_id.ToString()
-           << " mouse=" << mouse.ToString() << " touch=" << touch.ToString();
-  if (!window) {
-    DVLOG(1) << "SetHitTestInsets failed (invalid window id)";
-    return;
-  }
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "SetHitTestInsets failed (access denied)";
-    return;
-  }
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  DCHECK(proxy_window);  // Must exist because of preceding conditionals.
-  proxy_window->SetHitTestInsets(MakeInsetsPositive(mouse),
-                                 MakeInsetsPositive(touch));
-}
-
-void WindowTree::SetShape(Id transport_window_id,
-                          const std::vector<gfx::Rect>& shape) {
-  const ClientWindowId window_id = MakeClientWindowId(transport_window_id);
-  DVLOG(3) << "SetShape client_window_id=" << window_id.ToString()
-           << " #shape=" << shape.size();
-  aura::Window* window = GetWindowByClientId(window_id);
-  if (!window) {
-    DVLOG(1) << "SetShape failed (invalid window id)";
-    return;
-  }
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "SetShape failed (access denied)";
-    return;
-  }
-  window->layer()->SetAlphaShape(
-      shape.empty() ? nullptr
-                    : std::make_unique<std::vector<gfx::Rect>>(shape));
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  proxy_window->SetShape(shape);
-}
-
-void WindowTree::AttachFrameSinkId(Id transport_window_id,
-                                   const viz::FrameSinkId& f) {
-  if (!f.is_valid()) {
-    DVLOG(3) << "AttachFrameSinkId failed (invalid frame sink)";
-    return;
-  }
-  const ClientWindowId window_id = MakeClientWindowId(transport_window_id);
-  aura::Window* window = GetWindowByClientId(window_id);
-  if (!window || !IsClientCreatedWindow(window)) {
-    DVLOG(3) << "AttachFrameSinkId failed (invalid window id)";
-    return;
-  }
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  DCHECK(proxy_window);  // Must exist because of preceding conditionals.
-  if (proxy_window->attached_frame_sink_id() == f)
-    return;
-  if (f.is_valid() && proxy_window->attached_frame_sink_id().is_valid()) {
-    DVLOG(3) << "AttachFrameSinkId failed (window already has frame sink)";
-    return;
-  }
-  proxy_window->set_attached_frame_sink_id(f);
-  ClientRoot* client_root = FindClientRootContaining(window);
-  if (client_root)
-    client_root->AttachChildFrameSinkId(proxy_window);
-}
-
-void WindowTree::UnattachFrameSinkId(Id transport_window_id) {
-  const ClientWindowId window_id = MakeClientWindowId(transport_window_id);
-  aura::Window* window = GetWindowByClientId(window_id);
-  if (!window || !IsClientCreatedWindow(window)) {
-    DVLOG(3) << "UnattachFrameSinkId failed (invalid window id)";
-    return;
-  }
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  DCHECK(proxy_window);  // Must exist because of preceding conditionals.
-  if (!proxy_window->attached_frame_sink_id().is_valid()) {
-    DVLOG(3) << "UnattachFrameSinkId failed (frame sink already cleared)";
-    return;
-  }
-
-  ClientRoot* client_root = FindClientRootContaining(window);
-  if (client_root)
-    client_root->UnattachChildFrameSinkId(proxy_window);
-  proxy_window->set_attached_frame_sink_id(viz::FrameSinkId());
-}
-
-void WindowTree::SetCanAcceptDrops(Id window_id, bool accepts_drops) {
-  DVLOG(3) << "SetCanAcceptDrops id="
-           << MakeClientWindowId(window_id).ToString()
-           << " value=" << accepts_drops;
-  aura::Window* window = GetWindowByTransportId(window_id);
-  if (!window) {
-    DVLOG(1) << "SetCanAcceptDrops failed (no window)";
-    return;
-  }
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "SetCanAcceptDrops failed (access denied)";
-    return;
-  }
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  DCHECK(proxy_window);  // Must exist because of preceding conditionals.
-  if (accepts_drops && !proxy_window->HasDragDropDelegate()) {
-    auto drag_drop_delegate = std::make_unique<DragDropDelegate>(
-        this, window_tree_client_, window, window_id);
-    aura::client::SetDragDropDelegate(window, drag_drop_delegate.get());
-    proxy_window->SetDragDropDelegate(std::move(drag_drop_delegate));
-  } else if (!accepts_drops && proxy_window->HasDragDropDelegate()) {
-    aura::client::SetDragDropDelegate(window, nullptr);
-    proxy_window->SetDragDropDelegate(nullptr);
-  }
-}
-
-void WindowTree::SetWindowVisibility(uint32_t change_id,
-                                     Id transport_window_id,
-                                     bool visible) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, SetWindowVisibilityImpl(
-                     MakeClientWindowId(transport_window_id), visible));
-}
-
-void WindowTree::SetWindowProperty(
-    uint32_t change_id,
-    Id window_id,
-    const std::string& name,
-    const base::Optional<std::vector<uint8_t>>& value) {
-  window_tree_client_->OnChangeCompleted(
-      change_id,
-      SetWindowPropertyImpl(MakeClientWindowId(window_id), name, value));
-}
-
-void WindowTree::SetWindowOpacity(uint32_t change_id,
-                                  Id transport_window_id,
-                                  float opacity) {
-  window_tree_client_->OnChangeCompleted(
-      change_id,
-      SetWindowOpacityImpl(MakeClientWindowId(transport_window_id), opacity));
-}
-
-void WindowTree::SetWindowTransparent(uint32_t change_id,
-                                      Id transport_window_id,
-                                      bool transparent) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, SetWindowTransparentImpl(
-                     MakeClientWindowId(transport_window_id), transparent));
-}
-
-void WindowTree::AttachCompositorFrameSink(
-    Id transport_window_id,
-    viz::mojom::CompositorFrameSinkRequest compositor_frame_sink,
-    viz::mojom::CompositorFrameSinkClientPtr client) {
-  DVLOG(3) << "AttachCompositorFrameSink id="
-           << MakeClientWindowId(transport_window_id).ToString();
-  aura::Window* window = GetWindowByTransportId(transport_window_id);
-  if (!window) {
-    DVLOG(1) << "AttachCompositorFrameSink failed (invalid window id)";
-    return;
-  }
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  // If this isn't called on the root, then only allow it if there is not
-  // another client embedded in the window.
-  const bool allow = IsClientRootWindow(window) ||
-                     (IsClientCreatedWindow(window) &&
-                      proxy_window->embedded_window_tree() == nullptr);
-  if (!allow) {
-    DVLOG(1) << "AttachCompositorFrameSink failed (policy disallowed)";
-    return;
-  }
-
-  proxy_window->AttachCompositorFrameSink(std::move(compositor_frame_sink),
-                                          std::move(client));
-}
-
-void WindowTree::AddWindow(uint32_t change_id, Id parent_id, Id child_id) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, AddWindowImpl(MakeClientWindowId(parent_id),
-                               MakeClientWindowId(child_id)));
-}
-
-void WindowTree::RemoveWindowFromParent(uint32_t change_id, Id window_id) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, RemoveWindowFromParentImpl(MakeClientWindowId(window_id)));
-}
-
-void WindowTree::AddTransientWindow(uint32_t change_id,
-                                    Id window_id,
-                                    Id transient_window_id) {
-  window_tree_client_->OnChangeCompleted(
-      change_id,
-      AddTransientWindowImpl(MakeClientWindowId(window_id),
-                             MakeClientWindowId(transient_window_id)));
-}
-
-void WindowTree::RemoveTransientWindowFromParent(uint32_t change_id,
-                                                 Id transient_window_id) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, RemoveTransientWindowFromParentImpl(
-                     MakeClientWindowId(transient_window_id)));
-}
-
-void WindowTree::SetModalType(uint32_t change_id,
-                              Id window_id,
-                              ui::ModalType type) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, SetModalTypeImpl(MakeClientWindowId(window_id), type));
-}
-
-void WindowTree::ReorderWindow(uint32_t change_id,
-                               Id transport_window_id,
-                               Id transport_relative_window_id,
-                               mojom::OrderDirection direction) {
-  const bool result = ReorderWindowImpl(
-      MakeClientWindowId(transport_window_id),
-      MakeClientWindowId(transport_relative_window_id), direction);
-  window_tree_client_->OnChangeCompleted(change_id, result);
-}
-
-void WindowTree::GetWindowTree(Id window_id, GetWindowTreeCallback callback) {
-  std::vector<aura::Window*> windows =
-      GetWindowTreeImpl(MakeClientWindowId(window_id));
-  std::move(callback).Run(WindowsToWindowDatas(windows));
-}
-
-void WindowTree::Embed(Id transport_window_id,
-                       mojom::WindowTreeClientPtr client_ptr,
-                       uint32_t embed_flags,
-                       EmbedCallback callback) {
-  mojom::WindowTreeClient* client = client_ptr.get();
-  std::move(callback).Run(EmbedImpl(MakeClientWindowId(transport_window_id),
-                                    std::move(client_ptr), client,
-                                    embed_flags));
-}
-
-void WindowTree::ScheduleEmbed(mojom::WindowTreeClientPtr client,
-                               ScheduleEmbedCallback callback) {
-  const base::UnguessableToken token = base::UnguessableToken::Create();
-  DCHECK(!scheduled_embeds_.count(token));
-  scheduled_embeds_[token] = std::move(client);
-  std::move(callback).Run(token);
-}
-
-void WindowTree::ScheduleEmbedForExistingClient(
-    uint32_t window_id,
-    ScheduleEmbedForExistingClientCallback callback) {
-  const base::UnguessableToken token = base::UnguessableToken::Create();
-  DCHECK(!scheduled_embeds_for_existing_client_.count(token));
-  scheduled_embeds_for_existing_client_[token] = window_id;
-  std::move(callback).Run(token);
-}
-
-void WindowTree::EmbedUsingToken(Id transport_window_id,
-                                 const base::UnguessableToken& token,
-                                 uint32_t embed_flags,
-                                 EmbedUsingTokenCallback callback) {
-  DVLOG(3) << "EmbedUsingToken transport_window_id="
-           << MakeClientWindowId(transport_window_id).ToString()
-           << " token=" << token.ToString();
-  aura::Window* window =
-      GetWindowByClientId(MakeClientWindowId(transport_window_id));
-  if (!window) {
-    DVLOG(1) << "EmbedUsingToken failed (no window)";
-    std::move(callback).Run(false);
-    return;
-  }
-
-  // Check for a client registered using ScheduleEmbed().
-  std::set<WindowTree*> visited_trees;
-  mojom::WindowTreeClientPtr client =
-      GetAndRemoveScheduledEmbedWindowTreeClient(token, &visited_trees);
-  if (client) {
-    Embed(transport_window_id, std::move(client), embed_flags,
-          std::move(callback));
-    return;
-  }
-
-  // No client found using ScheduleEmbed(), check for a call to
-  // ScheduleEmbedForExistingClient().
-  WindowService::TreeAndWindowId tree_and_id =
-      window_service_->FindTreeWithScheduleEmbedForExistingClient(token);
-  if (!tree_and_id.tree) {
-    DVLOG(1) << "EmbedUsingToken failed (token not found)";
-    std::move(callback).Run(false);
-    return;
-  }
-  if (tree_and_id.tree == this) {
-    DVLOG(1) << "EmbedUsingToken failed, attempt to embed self, token="
-             << token.ToString();
-    std::move(callback).Run(false);
-    return;
-  }
-
-  if (!IsClientCreatedWindow(window) || IsTopLevel(window)) {
-    DVLOG(1) << "EmbedUsingToken failed (access denied)";
-    std::move(callback).Run(false);
-    return;
-  }
-
-  ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  const bool owner_intercept_events =
-      (connection_type_ != ConnectionType::kEmbedding &&
-       (embed_flags & mojom::kEmbedFlagEmbedderInterceptsEvents) != 0);
-  tree_and_id.tree->CompleteScheduleEmbedForExistingClient(
-      window, tree_and_id.id, token);
-  std::unique_ptr<Embedding> embedding =
-      std::make_unique<Embedding>(this, window, owner_intercept_events);
-  embedding->InitForEmbedInExistingTree(tree_and_id.tree);
-  proxy_window->SetEmbedding(std::move(embedding));
-  // Convert |transport_window_id| to ensure the client is supplied a consistent
-  // client-id.
-  window_tree_client_->OnFrameSinkIdAllocated(
-      ClientWindowIdToTransportId(MakeClientWindowId(transport_window_id)),
-      proxy_window->frame_sink_id());
-  std::move(callback).Run(true);
-}
-
-void WindowTree::SetFocus(uint32_t change_id, Id transport_window_id) {
-  window_tree_client_->OnChangeCompleted(
-      change_id, SetFocusImpl(MakeClientWindowId(transport_window_id)));
-}
-
-void WindowTree::SetCanFocus(Id transport_window_id, bool can_focus) {
-  focus_handler_.SetCanFocus(GetWindowByTransportId(transport_window_id),
-                             can_focus);
-}
-
-void WindowTree::SetCursor(uint32_t change_id,
-                           Id transport_window_id,
-                           ui::Cursor cursor) {
-  window_tree_client_->OnChangeCompleted(
-      change_id,
-      SetCursorImpl(MakeClientWindowId(transport_window_id), cursor));
-}
-
-void WindowTree::SetWindowTextInputState(Id window_id,
-                                         ::ui::mojom::TextInputStatePtr state) {
-  aura::Window* window = GetWindowByTransportId(window_id);
-  if (!window) {
-    DVLOG(1) << "SetWindowTextInputState failed (no window)";
-    return;
-  }
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "SetWindowTextInputState failed (access denied)";
-    return;
-  }
-
-  window_service_->delegate()->UpdateTextInputState(window, std::move(state));
-}
-
-void WindowTree::SetImeVisibility(Id window_id,
-                                  bool visible,
-                                  ::ui::mojom::TextInputStatePtr state) {
-  aura::Window* window = GetWindowByTransportId(window_id);
-  if (!window) {
-    DVLOG(1) << "SetImeVisibility failed (no window)";
-    return;
-  }
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "SetImeVisibility failed (access denied)";
-    return;
-  }
-
-  window_service_->delegate()->UpdateImeVisibility(window, visible,
-                                                   std::move(state));
-}
-
-void WindowTree::SetEventTargetingPolicy(Id transport_window_id,
-                                         mojom::EventTargetingPolicy policy) {
-  aura::Window* window = GetWindowByTransportId(transport_window_id);
-  if (IsClientCreatedWindow(window) || IsClientRootWindow(window))
-    window->SetEventTargetingPolicy(policy);
-}
-
-void WindowTree::OnWindowInputEventAck(uint32_t event_id,
-                                       mojom::EventResult result) {
-  DVLOG(4) << "OnWindowInputEventAck id=" << event_id;
-  std::unique_ptr<ui::Event> key_event;
-  if (!in_flight_key_events_.empty() &&
-      in_flight_key_events_.front()->id == event_id) {
-    key_event = std::move(in_flight_key_events_.front()->event);
-    in_flight_key_events_.pop();
-  } else if (!in_flight_other_events_.empty() &&
-             in_flight_other_events_.front()->id == event_id) {
-    DVLOG_IF(1, in_flight_other_events_.front()->event) << "Unexpected event";
-    in_flight_other_events_.pop();
-  } else {
-    DVLOG(1) << "client acked unknown event";
-    return;
-  }
-
-  if (key_event && result == mojom::EventResult::UNHANDLED) {
-    window_service_->delegate()->OnUnhandledKeyEvent(
-        *(key_event->AsKeyEvent()));
-  }
-
-  for (WindowServiceObserver& observer : window_service_->observers())
-    observer.OnClientAckedEvent(client_id_, event_id);
-  TRACE_EVENT_ASYNC_END0("ui", "WindowTree::SendEventToClient", event_id);
-}
-
-void WindowTree::DeactivateWindow(Id transport_window_id) {
-  DVLOG(3) << "DeactivateWindow id="
-           << MakeClientWindowId(transport_window_id).ToString();
-  aura::Window* window = GetWindowByTransportId(transport_window_id);
-  if (!window) {
-    DVLOG(1) << "DeactivateWindow failed (no window)";
-    return;
-  }
-
-  if (!IsClientCreatedWindow(window) || !IsTopLevel(window)) {
-    DVLOG(1) << "DeactivateWindow failed (access denied)";
-    return;
-  }
-
-  wm::ActivationClient* activation_client =
-      wm::GetActivationClient(window->GetRootWindow());
-  if (!activation_client) {
-    DVLOG(1) << "DeactivateWindow failed (no activation client)";
-    return;
-  }
-
-  // Only allow deactivation if |window| is the active window.
-  if (activation_client->GetActiveWindow() != window) {
-    DVLOG(1) << "DeactivateWindow failed (window is not active)";
-    return;
-  }
-
-  activation_client->DeactivateWindow(window);
-}
-
-void WindowTree::StackAbove(uint32_t change_id, Id above_id, Id below_id) {
-  const bool result = StackAboveImpl(MakeClientWindowId(above_id),
-                                     MakeClientWindowId(below_id));
-  window_tree_client_->OnChangeCompleted(change_id, result);
-}
-
-void WindowTree::StackAtTop(uint32_t change_id, Id window_id) {
-  const bool result = StackAtTopImpl(MakeClientWindowId(window_id));
-  window_tree_client_->OnChangeCompleted(change_id, result);
-}
-
-void WindowTree::BindWindowManagerInterface(
-    const std::string& name,
-    mojom::WindowManagerAssociatedRequest window_manager) {
-  auto wm_interface = window_service_->delegate()->CreateWindowManagerInterface(
-      this, name, window_manager.PassHandle());
-  if (wm_interface)
-    window_manager_interfaces_.push_back(std::move(wm_interface));
-}
-
-void WindowTree::GetCursorLocationMemory(
-    GetCursorLocationMemoryCallback callback) {
-}
-
-void WindowTree::PerformWindowMove(uint32_t change_id,
-                                   Id transport_window_id,
-                                   mojom::MoveLoopSource source,
-                                   const gfx::Point& cursor,
-                                   int hit_test) {
-  DVLOG(3) << "PerformWindowMove id="
-           << MakeClientWindowId(transport_window_id).ToString()
-           << " source=" << source << " cursor=" << cursor.ToString()
-           << " hit_test=" << hit_test;
-  aura::Window* window = GetWindowByTransportId(transport_window_id);
-  if (!IsClientCreatedWindow(window) || !IsTopLevel(window) ||
-      !window->IsVisible() || window_moving_) {
-    DVLOG(1) << "PerformWindowMove failed (invalid window)";
-    window_tree_client_->OnChangeCompleted(change_id, false);
-    return;
-  }
-
-  if (source == mojom::MoveLoopSource::MOUSE &&
-      !aura::Env::GetInstance()->IsMouseButtonDown()) {
-    DVLOG(1) << "PerformWindowMove failed (mouse not down)";
-    window_tree_client_->OnChangeCompleted(change_id, false);
-    return;
-  }
-
-  window_moving_ = window;
-  window_service_->delegate()->RunWindowMoveLoop(
-      window, source, cursor, hit_test,
-      base::BindOnce(&WindowTree::OnPerformWindowMoveDone,
-                     weak_factory_.GetWeakPtr(), change_id));
-}
-
-void WindowTree::CancelWindowMove(Id transport_window_id) {
-  if (!window_moving_) {
-    DVLOG(1) << "CancelWindowMove called and a move is not underway";
-    return;
-  }
-
-  aura::Window* window = GetWindowByTransportId(transport_window_id);
-  if (window == window_moving_)
-    window_service_->delegate()->CancelWindowMoveLoop();
-  else
-    DVLOG(1) << "CancelWindowMove called with wrong window";
-}
-
-void WindowTree::PerformDragDrop(
-    uint32_t change_id,
-    Id source_window_id,
-    const gfx::Point& screen_location,
-    const base::flat_map<std::string, std::vector<uint8_t>>& drag_data,
-    const gfx::ImageSkia& drag_image,
-    const gfx::Vector2d& drag_image_offset,
-    uint32_t drag_operation,
-    ::ui::mojom::PointerKind source) {
-  if (pending_drag_source_window_id_ != kInvalidTransportId) {
-    DVLOG(1) << "PerformDragDrop failed (only one drag allowed)";
-    window_tree_client_->OnPerformDragDropCompleted(change_id, false,
-                                                    mojom::kDropEffectNone);
-    return;
-  }
-
-  pending_drag_source_window_id_ = source_window_id;
-
-  // Runs the drag loop as a posted task to unwind mojo call stack.
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WindowTree::DoPerformDragDrop, weak_factory_.GetWeakPtr(),
-                     change_id, source_window_id, screen_location, drag_data,
-                     drag_image, drag_image_offset, drag_operation, source));
-}
-
-void WindowTree::CancelDragDrop(Id window_id) {
-  if (pending_drag_source_window_id_ == kInvalidTransportId) {
-    DVLOG(1) << "CancelDragDrop called and a drag is not underway";
-    return;
-  }
-
-  if (pending_drag_source_window_id_ != window_id) {
-    DVLOG(1) << "CancelDragDrop called with wrong window";
-    return;
-  }
-
-  // Clear |pending_drag_source_window_id_| to cancel posted drag loop task.
-  pending_drag_source_window_id_ = kInvalidTransportId;
-
-  aura::Window* window = GetWindowByTransportId(window_id);
-  if (!window) {
-    DVLOG(1) << "CancelDragDrop failed (no window)";
-    return;
-  }
-
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "CancelDragDrop failed (access denied)";
-    return;
-  }
-
-  // Cancel the current drag loop if it is running.
-  window_service_->delegate()->CancelDragLoop(window);
-}
-
-void WindowTree::ObserveTopmostWindow(mojom::MoveLoopSource source,
-                                      Id window_id) {
-  if (connection_type_ == ConnectionType::kEmbedding) {
-    DVLOG(1) << "ObserveTopmostWindow failed (access denied)";
-    return;
-  }
-  DVLOG(3) << "ObserveTopmostWindow id="
-           << MakeClientWindowId(window_id).ToString();
-  aura::Window* window = GetWindowByTransportId(window_id);
-  if (!IsClientCreatedWindow(window) || !IsTopLevel(window) ||
-      !window->IsVisible() || topmost_window_observer_) {
-    DVLOG(1) << "ObserveTopmostWindow failed (invalid window)";
-    return;
-  }
-
-  topmost_window_observer_ =
-      std::make_unique<TopmostWindowObserver>(this, source, window);
-}
-
-void WindowTree::StopObservingTopmostWindow() {
-  if (connection_type_ == ConnectionType::kEmbedding) {
-    DVLOG(1) << "StopObservingTopmostWindow failed (access denied)";
-    return;
-  }
-  if (!topmost_window_observer_) {
-    DVLOG(1) << "StopObservingTopmostWindow failed";
-    return;
-  }
-  topmost_window_observer_.reset();
-}
-
-void WindowTree::SetWindowResizeShadow(Id window_id, int hit_test) {
-  DVLOG(3) << "SetWindowResizeShadow id="
-           << MakeClientWindowId(window_id).ToString()
-           << " hit_test=" << hit_test;
-  aura::Window* window = GetWindowByTransportId(window_id);
-  if (!IsClientCreatedWindow(window) || !IsTopLevel(window) ||
-      !window->IsVisible()) {
-    DVLOG(1) << "SetWindowResizeShadow failed (invalid window)";
-    return;
-  }
-  if (hit_test != HTNOWHERE && !ui::IsResizingComponent(hit_test)) {
-    DVLOG(1) << "SetWindowResizeShadow failed (invalid hit_test)";
-    return;
-  }
-  window_service_->delegate()->SetWindowResizeShadow(window, hit_test);
-}
-
-void WindowTree::CancelActiveTouchesExcept(Id not_cancelled_window_id) {
-  if (connection_type_ == ConnectionType::kEmbedding) {
-    DVLOG(1) << "CancelActiveTouchesExcept failed (access denied)";
-    return;
-  }
-  DVLOG(3) << "CancelActiveTouchesExcept not_cancelled_window_id="
-           << MakeClientWindowId(not_cancelled_window_id).ToString();
-  aura::Window* not_cancelled_window = nullptr;
-  if (not_cancelled_window_id != kInvalidTransportId) {
-    not_cancelled_window = GetWindowByTransportId(not_cancelled_window_id);
-    if (!not_cancelled_window || !IsClientCreatedWindow(not_cancelled_window)) {
-      DVLOG(1) << "CancelActiveTouchesExcept failed (invalid window)";
-      return;
-    }
-  }
-  window_service_->env()->gesture_recognizer()->CancelActiveTouchesExcept(
-      not_cancelled_window);
-}
-
-void WindowTree::CancelActiveTouches(Id window_id) {
-  if (connection_type_ == ConnectionType::kEmbedding) {
-    DVLOG(1) << "CancelActiveTouches failed (access denied)";
-    return;
-  }
-  DVLOG(3) << "CancelActiveTouches window_id="
-           << MakeClientWindowId(window_id).ToString();
-  aura::Window* window = GetWindowByTransportId(window_id);
-  if (!window || !IsClientCreatedWindow(window)) {
-    DVLOG(1) << "CancelActiveTouches failed (invalid window)";
-    return;
-  }
-  window_service_->env()->gesture_recognizer()->CancelActiveTouches(window);
-}
-
-void WindowTree::TransferGestureEventsTo(Id current_id,
-                                         Id new_id,
-                                         bool should_cancel) {
-  if (connection_type_ == ConnectionType::kEmbedding) {
-    DVLOG(1) << "TransferGestureEventsTo failed (access denied)";
-    return;
-  }
-  DVLOG(3) << "TransferGestureEventsTo current_id="
-           << MakeClientWindowId(current_id).ToString()
-           << " new_id=" << MakeClientWindowId(new_id)
-           << " should_cancel=" << should_cancel;
-  aura::Window* current_window = GetWindowByTransportId(current_id);
-  aura::Window* new_window = GetWindowByTransportId(new_id);
-  if (!current_window || !IsClientCreatedWindow(current_window)) {
-    DVLOG(1) << "TransferGestureEventsTo failed (invalid current_window)";
-    return;
-  }
-  if (!new_window || !IsClientCreatedWindow(new_window)) {
-    DVLOG(1) << "TransferGestureEventsTo failed (invalid new_window)";
-    return;
-  }
-  window_service_->env()->gesture_recognizer()->TransferEventsTo(
-      current_window, new_window,
-      should_cancel ? ui::TransferTouchesBehavior::kCancel
-                    : ui::TransferTouchesBehavior::kDontCancel);
-}
-
-void WindowTree::TrackOcclusionState(Id transport_window_id) {
-  aura::Window* window = GetWindowByTransportId(transport_window_id);
-  if (!window) {
-    DVLOG(1) << "TrackOcclusionState failed (no window)";
-    return;
-  }
-  if (!IsClientCreatedWindow(window)) {
-    DVLOG(1) << "TrackOcclusionState failed (access denied)";
-    return;
-  }
-
-  window->TrackOcclusionState();
-}
-
-void WindowTree::PauseWindowOcclusionTracking() {
-  window_occlusion_tracking_pauses_.emplace_back(
-      std::make_unique<aura::WindowOcclusionTracker::ScopedPause>());
-}
-
-void WindowTree::UnpauseWindowOcclusionTracking() {
-  if (window_occlusion_tracking_pauses_.empty()) {
-    DVLOG(1) << "Unbalanced UnpauseWindowOcclusionTracking call.";
-    return;
-  }
-
-  window_occlusion_tracking_pauses_.pop_back();
-}
-
-void WindowTree::ConnectToImeEngine(ime::mojom::ImeEngineRequest engine_request,
-                                    ime::mojom::ImeEngineClientPtr client) {
-  aura::Window* focused_window =
-      window_service_->focus_client()->GetFocusedWindow();
-  if (!focused_window) {
-    DVLOG(1) << "ConnectToImeEngine failed (no focused window)";
-    return;
-  }
-
-  if (!IsClientCreatedWindow(focused_window) &&
-      !IsClientRootWindow(focused_window)) {
-    DVLOG(1) << "ConnectToImeEngine failed (the caller client is not focused)";
-    return;
-  }
-
-  window_service_->delegate()->ConnectToImeEngine(std::move(engine_request),
-                                                  std::move(client));
-}
-
-}  // namespace ws
diff --git a/services/ws/window_tree.h b/services/ws/window_tree.h
deleted file mode 100644
index 963e714..0000000
--- a/services/ws/window_tree.h
+++ /dev/null
@@ -1,612 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_TREE_H_
-#define SERVICES_WS_WINDOW_TREE_H_
-
-#include <memory>
-#include <queue>
-#include <set>
-#include <unordered_map>
-#include <vector>
-
-#include "base/component_export.h"
-#include "base/containers/flat_map.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "services/ws/focus_handler.h"
-#include "services/ws/ids.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "ui/aura/client/capture_client_observer.h"
-#include "ui/aura/window_observer.h"
-#include "ui/aura/window_occlusion_tracker.h"
-#include "ui/base/ime/mojo/ime.mojom.h"
-
-namespace aura {
-class Window;
-}
-
-namespace gfx {
-class PointF;
-}
-
-namespace ui {
-class Event;
-}
-
-namespace ws {
-
-class ClientChangeTracker;
-class ClientRoot;
-class Embedding;
-class EventObserverHelper;
-class FocusHandler;
-class ProxyWindow;
-class TopmostWindowObserver;
-class WindowManagerInterface;
-class WindowService;
-
-// WindowTree manages a client connected to the Window Service. WindowTree
-// provides the implementation of mojom::WindowTree that the client talks
-// to. WindowTree implements the mojom::WindowTree interface on top of aura.
-// That is, changes to the aura Window hierarchy are mirrored to the
-// mojom::WindowTreeClient interface. Similarly, changes from the client by
-// way of the mojom::WindowTree interface modify the underlying aura
-// Windows.
-//
-// WindowTree is created in two distinct ways:
-// . when the client is embedded in a specific aura::Window, by way of
-//   WindowTree::Embed(). Use InitForEmbed(). This configuration has only a
-//   single ClientRoot.
-// . by way of a WindowTreeFactory. In this mode the client has no initial
-//   roots. To create a root the client requests a top-level window. Use
-//   InitFromFactory() for this. In this configuration there is a ClientRoot
-//   per top-level.
-//
-// Typically instances of WindowTree are owned by a WindowTreeBinding that is
-// created via WindowTreeFactory, but that is not necessary (in particular tests
-// often do not use WindowTreeBinding).
-class COMPONENT_EXPORT(WINDOW_SERVICE) WindowTree
-    : public mojom::WindowTree,
-      public aura::WindowObserver,
-      public aura::client::CaptureClientObserver {
- public:
-  enum class ConnectionType {
-    // This client is the result of an embedding, InitForEmbed() was called.
-    kEmbedding,
-
-    // This client is not the result of an embedding. More specifically
-    // InitFromFactory() was called. Generally this means the client first
-    // connected to mojom::WindowTreeFactory and then called
-    // mojom::WindowTreeFactory::CreateWindowTree().
-    kOther,
-  };
-
-  WindowTree(WindowService* window_service,
-             ClientSpecificId client_id,
-             mojom::WindowTreeClient* client,
-             const std::string& client_name);
-  ~WindowTree() override;
-
-  // See class description for details on Init variants.
-  void InitForEmbed(aura::Window* root, mojom::WindowTreePtr window_tree_ptr);
-  void InitFromFactory();
-
-  ClientSpecificId client_id() const { return client_id_; }
-
-  // Notifies the client than an event has been received.
-  void SendEventToClient(aura::Window* window, const ui::Event& event);
-
-  // Notifies the client that an event matching an observer has been received.
-  void SendObservedEventToClient(int64_t display_id,
-                                 std::unique_ptr<ui::Event> event);
-
-  // Returns the aura::Window associated with the specified transport id; null
-  // if |transport_window_id| is not a valid id for a window.
-  aura::Window* GetWindowByTransportId(Id transport_window_id);
-
-  // Returns true if |window| was created by the client calling
-  // NewTopLevelWindow().
-  bool IsTopLevel(aura::Window* window);
-
-  // Asks the client to close |window|. |window| must be a top-level window.
-  void RequestClose(ProxyWindow* window);
-
-  // Called when an Embedding is destroyed. This is only called for Embeddings
-  // that do not own the WindowTree (see Embedding for more details on when this
-  // happens).
-  void OnEmbeddingDestroyed(Embedding* embedding);
-
-  // Sends the topmost window information to the client. There can be multiple
-  // windows, as described for OnTopmostWindowChanged() in window_tree.mojom.
-  void SendTopmostWindows(const std::vector<aura::Window*>& topmosts);
-
-  // Notifies the client that the occlusion state of |windows| have changed.
-  void SendOcclusionStates(const std::set<aura::Window*>& windows);
-
-  // Called from WindowService to update display id of ClientRoots contained by
-  // the root windows.
-  void OnWindowTreeHostsDisplayIdChanged(
-      const std::set<aura::Window*>& root_windows);
-
-  WindowService* window_service() { return window_service_; }
-
-  // Returns the ClientWindowId for the window the client previously supplied
-  // to ScheduleEmbedForExistingClient(). If the client did not call
-  // ScheduleEmbedForExistingClient() with |embed_token|, an invalid
-  // ClientWindowId is returned.
-  ClientWindowId RemoveScheduledEmbedUsingExistingClient(
-      const base::UnguessableToken& embed_token);
-
-  // Completes a previous call to ScheduleEmbedForExistingClient().
-  void CompleteScheduleEmbedForExistingClient(
-      aura::Window* window,
-      const ClientWindowId& id,
-      const base::UnguessableToken& token);
-
-  const std::string& client_name() const { return client_name_; }
-
-  ConnectionType connection_type() const { return connection_type_; }
-
-  // Returns the first ClientRoot that has its compositor frame sink created.
-  ClientRoot* GetFirstRootWithCompositorFrameSink();
-
-  // Returns true if |window| has been exposed to this client. A client
-  // typically only sees a limited set of windows that may exist. The set of
-  // windows exposed to the client are referred to as the known windows.
-  bool IsWindowKnown(aura::Window* window) const;
-
-  Id TransportIdForWindow(aura::Window* window) const;
-
-  ClientWindowId ClientWindowIdForWindow(aura::Window* window) const;
-
-  // If |window| is a client root, the ClientRoot is returned. This does not
-  // recurse.
-  ClientRoot* GetClientRootForWindow(aura::Window* window);
-
-  // Converts an Event's root_location as supplied to the window service to be
-  // relative to the nearest client root of |window|. The returned value should
-  // used as the root_location() for Events supplied to clients.
-  gfx::PointF ConvertRootLocationForClient(aura::Window* window,
-                                           const gfx::PointF& root_location);
-
-  // Sends CleanupGestureState mojo call for |window| to the window tree client.
-  void CleanupGestureState(aura::Window* window);
-
-  bool IsMovingWindow() const { return window_moving_ != nullptr; }
-
- private:
-  friend class ClientRoot;
-  // TODO(sky): WindowTree should be refactored such that it is not
-  // necessary to friend this.
-  friend class FocusHandler;
-  friend class WindowTreeTestHelper;
-
-  struct InFlightEvent;
-
-  using ClientRoots = std::vector<std::unique_ptr<ClientRoot>>;
-
-  enum class DeleteClientRootReason {
-    // The window is being destroyed.
-    kDeleted,
-
-    // Another client is being embedded in the window.
-    kEmbed,
-
-    // The embedded client explicitly asked to be unembedded.
-    kUnembed,
-
-    // Called when the ClientRoot is deleted from the WindowTree destructor.
-    kDestructor,
-  };
-
-  // Used to track every window known to the client.
-  struct KnownWindow {
-    KnownWindow();
-    ~KnownWindow();
-
-    // Id for the window.
-    ClientWindowId client_window_id;
-
-    // If non-null, the client created the window and owns it. During window
-    // destruction this may be destroyed before the entry is moved. If you need
-    // to know if the client created the window, use the |is_client_created|.
-    std::unique_ptr<aura::Window> owned_window;
-
-    bool is_client_created = false;
-  };
-
-  // Creates a new ClientRoot. The returned ClientRoot is owned by this.
-  // |is_top_level| is true if this is called from
-  // WindowTree::NewTopLevelWindow().
-  ClientRoot* CreateClientRoot(aura::Window* window, bool is_top_level);
-  void DeleteClientRoot(ClientRoot* client_root, DeleteClientRootReason reason);
-  void DeleteClientRootWithRoot(aura::Window* window);
-
-  aura::Window* GetWindowByClientId(const ClientWindowId& id);
-
-  // Returns true if |this| created |window|.
-  bool IsClientCreatedWindow(aura::Window* window);
-  bool IsClientRootWindow(aura::Window* window);
-
-  // Returns the ClientRoot that |window| is parented to, null if |window| is
-  // not in a ClientRoot.
-  ClientRoot* FindClientRootContaining(aura::Window* window);
-
-  ClientRoots::iterator FindClientRootWithRoot(aura::Window* window);
-
-  bool IsWindowRootOfAnotherClient(aura::Window* window) const;
-
-  // Returns true if |window| has an ancestor that intercepts events.
-  bool DoesAnyAncestorInterceptEvents(ProxyWindow* window);
-
-  // Called when one of the windows known to the client loses capture.
-  // |lost_capture| is the window that had capture.
-  void OnCaptureLost(aura::Window* lost_capture);
-
-  // Callback from WindowServiceDelegate::RunWindowMoveLoop(). |change_id| is
-  // the id at the time the move-loop was initiated. |result| is the result of
-  // the move loop (true for success).
-  void OnPerformWindowMoveDone(uint32_t change_id, bool result);
-
-  // Scheduled from PerformDragDrop to run drag loop with mojo stack unwinded.
-  void DoPerformDragDrop(
-      uint32_t change_id,
-      Id source_window_id,
-      const gfx::Point& screen_location,
-      const base::flat_map<std::string, std::vector<uint8_t>>& drag_data,
-      const gfx::ImageSkia& drag_image,
-      const gfx::Vector2d& drag_image_offset,
-      uint32_t drag_operation,
-      ui::mojom::PointerKind source);
-
-  // Callback from WindowServiceDelegate::RunDragLoop(). |change_id| is
-  // the id at the time the drag loop was initiated. |result| is the result of
-  // the drag (the final drag operation performed, or DRAG_NONE when the drag
-  // fails or gets canceled).
-  void OnPerformDragDropDone(uint32_t change_id, int drag_result);
-
-  // Returns the first window in |known_windows_map_| that was created by
-  // the client; null if the client did not create an windows.
-  aura::Window* FindFirstClientCreatedWindow();
-
-  // Called for windows created by the client (including top-levels).
-  aura::Window* AddClientCreatedWindow(
-      const ClientWindowId& id,
-      bool is_top_level,
-      std::unique_ptr<aura::Window> window_ptr);
-
-  // Adds/removes a Window from the set of windows known to the client. This
-  // also adds or removes any observers that may need to be installed.
-  void AddWindowToKnownWindows(aura::Window* window,
-                               const ClientWindowId& id,
-                               std::unique_ptr<aura::Window> owned_window);
-
-  // |delete_if_owned| indicates if |window| should be deleted if this client
-  // created it. |delete_if_owned| is false only if the window was externally
-  // deleted.
-  void RemoveWindowFromKnownWindows(aura::Window* window, bool delete_if_owned);
-
-  // Unregisters |window| and all its descendants. This stops at windows created
-  // by this client, adding to |created_windows|.
-  void RemoveWindowFromKnownWindowsRecursive(
-      aura::Window* window,
-      std::vector<aura::Window*>* created_windows);
-
-  // Returns true if |id| may be used for a new Window. Clients have certain
-  // restrictions placed on what ids they may use (and that an id isn't
-  // reused).
-  bool IsValidIdForNewWindow(const ClientWindowId& id) const;
-
-  // Returns the id to send to the client for a ClientWindowId. Windows that
-  // were created by this client always have the high bits set to 0 (because
-  // the client doesn't know its own id).
-  Id ClientWindowIdToTransportId(const ClientWindowId& client_window_id) const;
-
-  // Returns the ClientWindowId from a transport id. Uses |client_id_| as the
-  // ClientWindowId::client_id part if invalid. This function does a straight
-  // mapping, there may not be a window with the returned id.
-  ClientWindowId MakeClientWindowId(Id transport_window_id) const;
-
-  std::vector<mojom::WindowDataPtr> WindowsToWindowDatas(
-      const std::vector<aura::Window*>& windows);
-  mojom::WindowDataPtr WindowToWindowData(aura::Window* window);
-
-  // Returns the WindowTreeClient previously scheduled for an embed with the
-  // given |token| from ScheduleEmbed(). If this client is the result of an
-  // Embed() and ScheduleEmbed() was not called on this client, then this
-  // recurses to WindowTrees that embedded this tree. |visited_trees| contains
-  // the WindowTrees that have already been visited. Recursing enables an
-  // ancestor to call ScheduleEmbed() and the ancestor to communicate the
-  // token with the client.
-  mojom::WindowTreeClientPtr GetAndRemoveScheduledEmbedWindowTreeClient(
-      const base::UnguessableToken& token,
-      std::set<WindowTree*>* visited_trees);
-
-  // Methods with the name Impl() mirror those of mojom::WindowTree. The
-  // return value indicates whether they succeeded or not. Generally failure
-  // means the operation was not allowed.
-  bool NewWindowImpl(
-      const ClientWindowId& client_window_id,
-      const std::map<std::string, std::vector<uint8_t>>& properties);
-  bool DeleteWindowImpl(const ClientWindowId& window_id);
-  bool SetCaptureImpl(const ClientWindowId& window_id);
-  bool ReleaseCaptureImpl(const ClientWindowId& window_id);
-  bool AddWindowImpl(const ClientWindowId& parent_id,
-                     const ClientWindowId& child_id);
-  bool RemoveWindowFromParentImpl(const ClientWindowId& client_window_id);
-  bool AddTransientWindowImpl(const ClientWindowId& parent_window_id,
-                              const ClientWindowId& transient_window_id);
-  bool RemoveTransientWindowFromParentImpl(const ClientWindowId& transient_id);
-  bool SetModalTypeImpl(const ClientWindowId& client_window_id,
-                        ui::ModalType type);
-  bool SetWindowVisibilityImpl(const ClientWindowId& window_id, bool visible);
-  bool SetWindowPropertyImpl(const ClientWindowId& window_id,
-                             const std::string& name,
-                             const base::Optional<std::vector<uint8_t>>& value);
-  bool EmbedImpl(const ClientWindowId& window_id,
-                 mojom::WindowTreeClientPtr window_tree_client_ptr,
-                 mojom::WindowTreeClient* window_tree_client,
-                 uint32_t flags);
-  bool SetWindowOpacityImpl(const ClientWindowId& window_id, float opacity);
-  bool SetWindowTransparentImpl(const ClientWindowId& window_id,
-                                bool transparent);
-  bool SetWindowBoundsImpl(const ClientWindowId& window_id,
-                           const gfx::Rect& bounds,
-                           const base::Optional<viz::LocalSurfaceIdAllocation>&
-                               local_surface_id_allocation);
-  bool SetWindowTransformImpl(const ClientWindowId& window_id,
-                              const gfx::Transform& transform);
-  bool ReorderWindowImpl(const ClientWindowId& window_id,
-                         const ClientWindowId& relative_window_id,
-                         mojom::OrderDirection direction);
-  std::vector<aura::Window*> GetWindowTreeImpl(const ClientWindowId& window_id);
-  bool SetFocusImpl(const ClientWindowId& window_id);
-  bool SetCursorImpl(const ClientWindowId& window_id, ui::Cursor cursor);
-  bool StackAboveImpl(const ClientWindowId& above_window_id,
-                      const ClientWindowId& below_window_id);
-  bool StackAtTopImpl(const ClientWindowId& window_id);
-
-  void GetWindowTreeRecursive(aura::Window* window,
-                              std::vector<aura::Window*>* windows);
-
-  // Called when the client associated with an Embedding created by this object
-  // disconnects. This deletes |embedding|, which deletes the embedded client.
-  void OnEmbeddedClientConnectionLost(Embedding* embedding);
-
-  // aura::WindowObserver:
-  void OnWindowHierarchyChanging(const HierarchyChangeParams& params) override;
-  void OnWindowDestroyed(aura::Window* window) override;
-  void OnWindowVisibilityChanging(aura::Window* window, bool visible) override;
-
-  // aura::client::CaptureClientObserver:
-  void OnCaptureChanged(aura::Window* lost_capture,
-                        aura::Window* gained_capture) override;
-
-  // mojom::WindowTree:
-  void NewWindow(
-      uint32_t change_id,
-      Id transport_window_id,
-      const base::Optional<base::flat_map<std::string, std::vector<uint8_t>>>&
-          transport_properties) override;
-  void NewTopLevelWindow(
-      uint32_t change_id,
-      Id transport_window_id,
-      const base::flat_map<std::string, std::vector<uint8_t>>& properties)
-      override;
-  void DeleteWindow(uint32_t change_id, Id transport_window_id) override;
-  void SetCapture(uint32_t change_id, Id transport_window_id) override;
-  void ReleaseCapture(uint32_t change_id, Id transport_window_id) override;
-  void ObserveEventTypes(
-      const std::vector<ui::mojom::EventType>& types) override;
-  void SetWindowBounds(uint32_t change_id,
-                       Id window_id,
-                       const gfx::Rect& bounds,
-                       const base::Optional<viz::LocalSurfaceIdAllocation>&
-                           local_surface_id_allocation) override;
-  void UpdateLocalSurfaceIdFromChild(Id transport_window_id,
-                                     const viz::LocalSurfaceIdAllocation&
-                                         local_surface_id_allocation) override;
-  void AllocateLocalSurfaceId(Id transport_window_id) override;
-  void SetWindowTransform(uint32_t change_id,
-                          Id transport_window_id,
-                          const gfx::Transform& transform) override;
-  void SetClientArea(Id transport_window_id,
-                     const gfx::Insets& insets,
-                     const base::Optional<std::vector<gfx::Rect>>&
-                         additional_client_areas) override;
-  void SetHitTestInsets(Id transport_window_id,
-                        const gfx::Insets& mouse,
-                        const gfx::Insets& touch) override;
-  void SetShape(Id transport_window_id,
-                const std::vector<gfx::Rect>& shape) override;
-  void AttachFrameSinkId(Id transport_window_id,
-                         const viz::FrameSinkId& f) override;
-  void UnattachFrameSinkId(Id transport_window_id) override;
-  void SetCanAcceptDrops(Id window_id, bool accepts_drops) override;
-  void SetWindowVisibility(uint32_t change_id,
-                           Id transport_window_id,
-                           bool visible) override;
-  void SetWindowProperty(
-      uint32_t change_id,
-      Id window_id,
-      const std::string& name,
-      const base::Optional<std::vector<uint8_t>>& value) override;
-  void SetWindowOpacity(uint32_t change_id,
-                        Id transport_window_id,
-                        float opacity) override;
-  void SetWindowTransparent(uint32_t change_id,
-                            Id transport_window_id,
-                            bool transparent) override;
-  void AttachCompositorFrameSink(
-      Id transport_window_id,
-      viz::mojom::CompositorFrameSinkRequest compositor_frame_sink,
-      viz::mojom::CompositorFrameSinkClientPtr client) override;
-  void AddWindow(uint32_t change_id, Id parent_id, Id child_id) override;
-  void RemoveWindowFromParent(uint32_t change_id, Id window_id) override;
-  void AddTransientWindow(uint32_t change_id,
-                          Id window_id,
-                          Id transient_window_id) override;
-  void RemoveTransientWindowFromParent(uint32_t change_id,
-                                       Id transient_window_id) override;
-  void SetModalType(uint32_t change_id,
-                    Id window_id,
-                    ui::ModalType type) override;
-  void ReorderWindow(uint32_t change_id,
-                     Id transport_window_id,
-                     Id transport_relative_window_id,
-                     mojom::OrderDirection direction) override;
-  void GetWindowTree(Id window_id, GetWindowTreeCallback callback) override;
-  void Embed(Id transport_window_id,
-             mojom::WindowTreeClientPtr client_ptr,
-             uint32_t embed_flags,
-             EmbedCallback callback) override;
-  void ScheduleEmbed(mojom::WindowTreeClientPtr client,
-                     ScheduleEmbedCallback callback) override;
-  void ScheduleEmbedForExistingClient(
-      uint32_t window_id,
-      ScheduleEmbedForExistingClientCallback callback) override;
-  void EmbedUsingToken(Id transport_window_id,
-                       const base::UnguessableToken& token,
-                       uint32_t embed_flags,
-                       EmbedUsingTokenCallback callback) override;
-  void SetFocus(uint32_t change_id, Id transport_window_id) override;
-  void SetCanFocus(Id transport_window_id, bool can_focus) override;
-  void SetCursor(uint32_t change_id,
-                 Id transport_window_id,
-                 ui::Cursor cursor) override;
-  void SetWindowTextInputState(Id window_id,
-                               ui::mojom::TextInputStatePtr state) override;
-  void SetImeVisibility(Id window_id,
-                        bool visible,
-                        ::ui::mojom::TextInputStatePtr state) override;
-  void SetEventTargetingPolicy(Id transport_window_id,
-                               mojom::EventTargetingPolicy policy) override;
-  void OnWindowInputEventAck(uint32_t event_id,
-                             mojom::EventResult result) override;
-  void DeactivateWindow(Id transport_window_id) override;
-  void StackAbove(uint32_t change_id, Id above_id, Id below_id) override;
-  void StackAtTop(uint32_t change_id, Id window_id) override;
-  void BindWindowManagerInterface(
-      const std::string& name,
-      mojom::WindowManagerAssociatedRequest window_manager) override;
-  void GetCursorLocationMemory(
-      GetCursorLocationMemoryCallback callback) override;
-  void PerformWindowMove(uint32_t change_id,
-                         Id transport_window_id,
-                         mojom::MoveLoopSource source,
-                         const gfx::Point& cursor,
-                         int hit_test) override;
-  void CancelWindowMove(Id transport_window_id) override;
-  void PerformDragDrop(
-      uint32_t change_id,
-      Id source_window_id,
-      const gfx::Point& screen_location,
-      const base::flat_map<std::string, std::vector<uint8_t>>& drag_data,
-      const gfx::ImageSkia& drag_image,
-      const gfx::Vector2d& drag_image_offset,
-      uint32_t drag_operation,
-      ui::mojom::PointerKind source) override;
-  void CancelDragDrop(Id window_id) override;
-  void ObserveTopmostWindow(mojom::MoveLoopSource source,
-                            Id window_id) override;
-  void StopObservingTopmostWindow() override;
-  void SetWindowResizeShadow(Id window_id, int hit_test) override;
-  void CancelActiveTouchesExcept(Id not_cancelled_window_id) override;
-  void CancelActiveTouches(Id window_id) override;
-  void TransferGestureEventsTo(Id current_id,
-                               Id new_id,
-                               bool should_cancel) override;
-  void TrackOcclusionState(Id transport_window_id) override;
-  void PauseWindowOcclusionTracking() override;
-  void UnpauseWindowOcclusionTracking() override;
-  void ConnectToImeEngine(ime::mojom::ImeEngineRequest engine_request,
-                          ime::mojom::ImeEngineClientPtr client) override;
-
-  WindowService* window_service_;
-
-  const ClientSpecificId client_id_;
-
-  // Identity of the remote client. This is only valid for clients connecting
-  // directly to the WindowService. Clients that were embedded do not connect
-  // directly to the WindowService, in which case |client_name_| is empty.
-  const std::string client_name_;
-
-  ConnectionType connection_type_ = ConnectionType::kEmbedding;
-
-  mojom::WindowTreeClient* window_tree_client_;
-
-  // Controls whether the client can change the visibility of the roots.
-  bool can_change_root_window_visibility_ = true;
-
-  ClientRoots client_roots_;
-
-  // These contain mappings for known windows, see KnownWindow for details on
-  // it. This contains all windows created by the client, as well as windows
-  // known to the client. For example,if this client is the result of an
-  // embedding then the window at the embed point (the root window of the
-  // ClientRoot) was not created by this client, but is known and in these
-  // mappings.
-  std::map<aura::Window*, KnownWindow> known_windows_map_;
-  std::unordered_map<ClientWindowId, aura::Window*, ClientWindowIdHash>
-      client_window_id_to_window_map_;
-
-  // Used to track the active change from the client.
-  std::unique_ptr<ClientChangeTracker> property_change_tracker_;
-
-  // If non-null, the client requested to observe events the client would not
-  // normally get.
-  std::unique_ptr<EventObserverHelper> event_observer_helper_;
-
-  FocusHandler focus_handler_{this};
-
-  // Holds WindowTreeClients passed to ScheduleEmbed(). Entries are removed
-  // when EmbedUsingToken() is called.
-  using ScheduledEmbeds =
-      base::flat_map<base::UnguessableToken, mojom::WindowTreeClientPtr>;
-  ScheduledEmbeds scheduled_embeds_;
-
-  // Calls to ScheduleEmbedForExistingClient() add an entry here. The value is
-  // the value supplied to ScheduleEmbedForExistingClient(). When a matching
-  // EmbedUsingToken() is received, the value in the map is used as the id for
-  // the window in this client (specifically |ClientWindowId.sink_id|).
-  using ScheduledEmbedsForExistingClient =
-      base::flat_map<base::UnguessableToken, ClientSpecificId>;
-  ScheduledEmbedsForExistingClient scheduled_embeds_for_existing_client_;
-
-  // Used to track events sent to the client. Key events are tracked separately,
-  // as their acks may be delayed when the client uses async IME handling.
-  std::queue<std::unique_ptr<InFlightEvent>> in_flight_key_events_;
-  std::queue<std::unique_ptr<InFlightEvent>> in_flight_other_events_;
-
-  // Set while a window move loop is in progress.
-  aura::Window* window_moving_ = nullptr;
-
-  // Set while a window move loop is in progress to track the window move
-  // information.
-  std::unique_ptr<TopmostWindowObserver> topmost_window_observer_;
-
-  // Set while a drag loop is in progress.
-  Id pending_drag_source_window_id_ = kInvalidTransportId;
-
-  std::vector<std::unique_ptr<WindowManagerInterface>>
-      window_manager_interfaces_;
-
-  // Keeps track of outstanding occlusion tracking pauses. A ScopedPause object
-  // is added to the list when the client requests to pause and removed from the
-  // list  when the client no longer wishes to pause. Using a tracking vector so
-  // that outstanding pauses from the client are properly removed in case the
-  // client goes away.
-  std::vector<std::unique_ptr<aura::WindowOcclusionTracker::ScopedPause>>
-      window_occlusion_tracking_pauses_;
-
-  base::WeakPtrFactory<WindowTree> weak_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(WindowTree);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_TREE_H_
diff --git a/services/ws/window_tree_binding.cc b/services/ws/window_tree_binding.cc
deleted file mode 100644
index 9c20f4e..0000000
--- a/services/ws/window_tree_binding.cc
+++ /dev/null
@@ -1,72 +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.
-
-#include "services/ws/window_tree_binding.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "services/ws/screen_provider.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree.h"
-#include "ui/aura/window.h"
-
-namespace ws {
-
-WindowTreeBinding::WindowTreeBinding() = default;
-
-WindowTreeBinding::~WindowTreeBinding() {
-  if (window_tree_client_) {
-    window_service_->screen_provider()->RemoveObserver(
-        screen_provider_observer_.get());
-  }
-}
-
-void WindowTreeBinding::InitForEmbed(
-    WindowService* window_service,
-    mojom::WindowTreeClientPtr window_tree_client_ptr,
-    mojom::WindowTreeClient* window_tree_client,
-    aura::Window* initial_root,
-    base::OnceClosure connection_lost_callback) {
-  window_service_ = window_service;
-  window_tree_client_ = std::move(window_tree_client_ptr);
-  window_tree_ = window_service->CreateWindowTree(window_tree_client);
-  mojom::WindowTreePtr window_tree_ptr;
-  if (window_tree_client_) {
-    auto window_tree_request = mojo::MakeRequest(&window_tree_ptr);
-    CreateBinding(std::move(window_tree_request),
-                  std::move(connection_lost_callback));
-  }
-  window_tree_->InitForEmbed(initial_root, std::move(window_tree_ptr));
-}
-
-void WindowTreeBinding::InitFromFactory(
-    WindowService* window_service,
-    const std::string& client_name,
-    mojom::WindowTreeRequest window_tree_request,
-    mojom::WindowTreeClientPtr window_tree_client,
-    base::OnceClosure connection_lost_callback) {
-  window_service_ = window_service;
-  window_tree_client_ = std::move(window_tree_client);
-  window_tree_ =
-      window_service->CreateWindowTree(window_tree_client_.get(), client_name);
-  CreateBinding(std::move(window_tree_request),
-                std::move(connection_lost_callback));
-  window_tree_->InitFromFactory();
-}
-
-void WindowTreeBinding::CreateBinding(
-    mojom::WindowTreeRequest window_tree_request,
-    base::OnceClosure connection_lost_callback) {
-  binding_ = std::make_unique<mojo::Binding<mojom::WindowTree>>(
-      window_tree_.get(), std::move(window_tree_request));
-  binding_->set_connection_error_handler(std::move(connection_lost_callback));
-  window_tree_client_->OnClientId(window_tree_->client_id());
-  window_tree_client_->GetScreenProviderObserver(
-      MakeRequest(&screen_provider_observer_));
-  window_service_->screen_provider()->AddObserver(
-      screen_provider_observer_.get());
-}
-
-}  // namespace ws
diff --git a/services/ws/window_tree_binding.h b/services/ws/window_tree_binding.h
deleted file mode 100644
index 10a11eb..0000000
--- a/services/ws/window_tree_binding.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_TREE_BINDING_H_
-#define SERVICES_WS_WINDOW_TREE_BINDING_H_
-
-#include <memory>
-
-#include "base/callback_forward.h"
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "services/ws/public/mojom/screen_provider_observer.mojom.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/window_tree_binding.h"
-
-namespace aura {
-class Window;
-}
-
-namespace ws {
-
-class WindowService;
-class WindowTree;
-
-// Owns the mojo structures and WindowTree for a single client.
-class COMPONENT_EXPORT(WINDOW_SERVICE) WindowTreeBinding {
- public:
-  WindowTreeBinding();
-  ~WindowTreeBinding();
-
-  // See WindowTree for details on parameters and when to use.
-  // |window_tree_client_ptr| may be null for tests.
-  void InitForEmbed(WindowService* window_service,
-                    mojom::WindowTreeClientPtr window_tree_client_ptr,
-                    mojom::WindowTreeClient* window_tree_client,
-                    aura::Window* initial_root,
-                    base::OnceClosure connection_lost_callback);
-
-  // See WindowTree for details on parameters and when to use.
-  void InitFromFactory(WindowService* window_service,
-                       const std::string& client_name,
-                       mojom::WindowTreeRequest window_tree_request,
-                       mojom::WindowTreeClientPtr window_tree_client,
-                       base::OnceClosure connection_lost_callback);
-
-  WindowTree* window_tree() { return window_tree_.get(); }
-
- private:
-  friend class WindowTree;
-
-  void CreateBinding(mojom::WindowTreeRequest window_tree_request,
-                     base::OnceClosure connection_lost_callback);
-
-  WindowService* window_service_ = nullptr;
-  mojom::WindowTreeClientPtr window_tree_client_;
-  std::unique_ptr<WindowTree> window_tree_;
-
-  // |binding_| and |screen_provider_observer_| are only created if
-  // |window_tree_client_| is valid.
-  std::unique_ptr<mojo::Binding<mojom::WindowTree>> binding_;
-  mojom::ScreenProviderObserverAssociatedPtr screen_provider_observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowTreeBinding);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_TREE_BINDING_H_
diff --git a/services/ws/window_tree_client_unittest.cc b/services/ws/window_tree_client_unittest.cc
deleted file mode 100644
index 3b4f250..0000000
--- a/services/ws/window_tree_client_unittest.cc
+++ /dev/null
@@ -1,2250 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
-#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/ws/common/util.h"
-#include "services/ws/ids.h"
-#include "services/ws/public/mojom/constants.mojom.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/test_window_tree_client.h"
-#include "services/ws/window_server_service_test_base.h"
-#include "ui/base/cursor/cursor.h"
-
-using mojo::InterfaceRequest;
-using service_manager::Service;
-using ws::mojom::WindowDataPtr;
-using ws::mojom::WindowTree;
-using ws::mojom::WindowTreeClient;
-
-// TODO: this is a copy of existing tests. Many that are disabled need to be
-// reevaluated to understand if they make sense with ws2.
-
-namespace ws {
-namespace test {
-
-namespace {
-
-// Creates an id used for transport from the specified parameters.
-Id BuildWindowId(ClientSpecificId client_id, ClientSpecificId window_id) {
-  const Id tmp = client_id;
-  return (tmp << 32) | window_id;
-}
-
-// Callback function from WindowTree functions.
-// ----------------------------------
-
-void WindowTreeResultCallback(base::RunLoop* run_loop,
-                              std::vector<TestWindow>* windows,
-                              std::vector<WindowDataPtr> results) {
-  WindowDatasToTestWindows(results, windows);
-  run_loop->Quit();
-}
-
-void EmbedCallbackImpl(base::RunLoop* run_loop,
-                       bool* result_cache,
-                       bool result) {
-  *result_cache = result;
-  run_loop->Quit();
-}
-
-void ScheduleEmbedCallbackImpl(base::RunLoop* run_loop,
-                               base::UnguessableToken* resulting_token,
-                               const base::UnguessableToken& token) {
-  *resulting_token = token;
-  run_loop->Quit();
-}
-
-// -----------------------------------------------------------------------------
-
-bool EmbedUrl(service_manager::Connector* connector,
-              mojom::WindowTree* tree,
-              const std::string& url,
-              Id root_id) {
-  bool result = false;
-  base::RunLoop run_loop;
-  {
-    mojom::WindowTreeClientPtr client;
-    connector->BindInterface(url, &client);
-    const uint32_t embed_flags = 0;
-    tree->Embed(root_id, std::move(client), embed_flags,
-                base::Bind(&EmbedCallbackImpl, &run_loop, &result));
-  }
-  run_loop.Run();
-  return result;
-}
-
-bool Embed(mojom::WindowTree* tree,
-           Id root_id,
-           mojom::WindowTreeClientPtr client) {
-  bool result = false;
-  base::RunLoop run_loop;
-  {
-    const uint32_t embed_flags = 0;
-    tree->Embed(root_id, std::move(client), embed_flags,
-                base::Bind(&EmbedCallbackImpl, &run_loop, &result));
-  }
-  run_loop.Run();
-  return result;
-}
-
-bool EmbedUsingToken(mojom::WindowTree* tree,
-                     Id root_id,
-                     const base::UnguessableToken& token) {
-  bool result = false;
-  base::RunLoop run_loop;
-  const uint32_t embed_flags = 0;
-  tree->EmbedUsingToken(root_id, token, embed_flags,
-                        base::Bind(&EmbedCallbackImpl, &run_loop, &result));
-  run_loop.Run();
-  return result;
-}
-
-void ScheduleEmbed(mojom::WindowTree* tree,
-                   mojom::WindowTreeClientPtr client,
-                   base::UnguessableToken* token) {
-  base::RunLoop run_loop;
-  tree->ScheduleEmbed(std::move(client),
-                      base::Bind(&ScheduleEmbedCallbackImpl, &run_loop, token));
-  run_loop.Run();
-}
-
-void GetWindowTree(mojom::WindowTree* tree,
-                   Id window_id,
-                   std::vector<TestWindow>* windows) {
-  base::RunLoop run_loop;
-  tree->GetWindowTree(
-      window_id, base::Bind(&WindowTreeResultCallback, &run_loop, windows));
-  run_loop.Run();
-}
-
-// Utility functions -----------------------------------------------------------
-
-const Id kNullParentId = 0;
-std::string IdToString(Id id) {
-  return (id == kNullParentId)
-             ? "null"
-             : base::StringPrintf("%d,%d", ClientIdFromTransportId(id),
-                                  ClientWindowIdFromTransportId(id));
-}
-
-std::string WindowParentToString(Id window, Id parent) {
-  return base::StringPrintf("window=%s parent=%s", IdToString(window).c_str(),
-                            IdToString(parent).c_str());
-}
-
-// -----------------------------------------------------------------------------
-
-// Extends TestWindowTreeClient, adding functions to block until WindowTree
-// acks the change.
-class TestWindowTreeClient2 : public TestWindowTreeClient {
- public:
-  TestWindowTreeClient2()
-      : binding_(this),
-        // Start with a random large number so tests can use lower ids if they
-        // want.
-        next_change_id_(10000),
-        waiting_change_id_(0),
-        on_change_completed_result_(false) {}
-
-  void Bind(mojo::InterfaceRequest<mojom::WindowTreeClient> request) {
-    binding_.Bind(std::move(request));
-  }
-
-  ClientSpecificId client_id() const { return client_id_; }
-
-  // Runs a nested MessageLoop until |count| changes (calls to
-  // WindowTreeClient functions) have been received.
-  void WaitForChangeCount(size_t count) {
-    if (tracker_.changes()->size() >= count)
-      return;
-
-    ASSERT_TRUE(wait_state_.get() == nullptr);
-    wait_state_ = std::make_unique<WaitState>();
-    wait_state_->change_count = count;
-    wait_state_->run_loop.Run();
-    wait_state_.reset();
-  }
-
-  uint32_t GetAndAdvanceChangeId() { return next_change_id_++; }
-
-  // Runs a nested MessageLoop until OnEmbed() has been encountered.
-  void WaitForOnEmbed() {
-    if (tree_)
-      return;
-    embed_run_loop_ = std::make_unique<base::RunLoop>();
-    embed_run_loop_->Run();
-    embed_run_loop_.reset();
-  }
-
-  bool WaitForChangeCompleted(uint32_t id) {
-    waiting_change_id_ = id;
-    change_completed_run_loop_ = std::make_unique<base::RunLoop>();
-    change_completed_run_loop_->Run();
-    return on_change_completed_result_;
-  }
-
-  bool DeleteWindow(Id id) {
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->DeleteWindow(change_id, id);
-    return WaitForChangeCompleted(change_id);
-  }
-
-  bool AddWindow(Id parent, Id child) {
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->AddWindow(change_id, parent, child);
-    return WaitForChangeCompleted(change_id);
-  }
-
-  bool RemoveWindowFromParent(Id window_id) {
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->RemoveWindowFromParent(change_id, window_id);
-    return WaitForChangeCompleted(change_id);
-  }
-
-  bool ReorderWindow(Id window_id,
-                     Id relative_window_id,
-                     mojom::OrderDirection direction) {
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->ReorderWindow(change_id, window_id, relative_window_id, direction);
-    return WaitForChangeCompleted(change_id);
-  }
-
-  // Waits for all messages to be received by |ws|. This is done by attempting
-  // to set opacity on an embed/invalid window. 1.0f is the default opacity
-  // value. When we get the response we know all messages have been processed.
-  bool WaitForAllMessages() { return !SetWindowOpacity(0, 1.0f); }
-
-  Id NewWindow(ClientSpecificId window_id) {
-    return NewWindowWithCompleteId(window_id);
-  }
-
-  // Generally you want NewWindow(), but use this if you need to test given
-  // a complete window id (NewWindow() ors with the client id).
-  Id NewWindowWithCompleteId(Id id) {
-    base::flat_map<std::string, std::vector<uint8_t>> properties;
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->NewWindow(change_id, id, std::move(properties));
-    return WaitForChangeCompleted(change_id) ? id : 0;
-  }
-
-  bool SetWindowProperty(Id window_id,
-                         const std::string& name,
-                         const std::vector<uint8_t>* data) {
-    base::Optional<std::vector<uint8_t>> mojo_data;
-    if (data)
-      mojo_data.emplace(*data);
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->SetWindowProperty(change_id, window_id, name, mojo_data);
-    return WaitForChangeCompleted(change_id);
-  }
-
-  bool SetCursor(Id window_id, const ui::Cursor& cursor) {
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->SetCursor(change_id, window_id, cursor);
-    return WaitForChangeCompleted(change_id);
-  }
-
-  bool SetWindowVisibility(Id window_id, bool visible) {
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->SetWindowVisibility(change_id, window_id, visible);
-    return WaitForChangeCompleted(change_id);
-  }
-
-  bool SetWindowOpacity(Id window_id, float opacity) {
-    const uint32_t change_id = GetAndAdvanceChangeId();
-    tree()->SetWindowOpacity(change_id, window_id, opacity);
-    return WaitForChangeCompleted(change_id);
-  }
-
- private:
-  // Used when running a nested MessageLoop.
-  struct WaitState {
-    WaitState() : change_count(0) {}
-
-    // Number of changes waiting for.
-    size_t change_count;
-    base::RunLoop run_loop;
-  };
-
-  // TestWindowTreeClient:
-  void OnClientId(ClientSpecificId id) override { client_id_ = id; }
-  void OnChangeAdded() override {
-    if (wait_state_.get() &&
-        tracker_.changes()->size() >= wait_state_->change_count) {
-      wait_state_->run_loop.Quit();
-    }
-  }
-  void OnEmbed(WindowDataPtr root,
-               mojom::WindowTreePtr tree,
-               int64_t display_id,
-               Id focused_window_id,
-               bool drawn,
-               const base::Optional<viz::LocalSurfaceIdAllocation>&
-                   local_surface_id_allocation) override {
-    TestWindowTreeClient::OnEmbed(std::move(root), std::move(tree), display_id,
-                                  focused_window_id, drawn,
-                                  local_surface_id_allocation);
-    if (embed_run_loop_)
-      embed_run_loop_->Quit();
-  }
-  void OnEmbedFromToken(const base::UnguessableToken& token,
-                        mojom::WindowDataPtr root,
-                        int64_t display_id,
-                        const base::Optional<viz::LocalSurfaceIdAllocation>&
-                            local_surface_id_allocation) override {}
-  void OnEmbeddedAppDisconnected(Id window_id) override {
-    tracker()->OnEmbeddedAppDisconnected(window_id);
-  }
-  void OnUnembed(Id window_id) override { tracker()->OnUnembed(window_id); }
-  void OnCaptureChanged(Id new_capture_window_id,
-                        Id old_capture_window_id) override {
-    tracker()->OnCaptureChanged(new_capture_window_id, old_capture_window_id);
-  }
-  void OnFrameSinkIdAllocated(Id window_id,
-                              const viz::FrameSinkId& frame_sink_id) override {}
-  void OnTopLevelCreated(uint32_t change_id,
-                         mojom::WindowDataPtr data,
-                         int64_t display_id,
-                         bool drawn,
-                         const viz::LocalSurfaceIdAllocation&
-                             local_surface_id_allocation) override {
-    tracker()->OnTopLevelCreated(change_id, std::move(data), display_id, drawn,
-                                 local_surface_id_allocation);
-  }
-  void OnWindowBoundsChanged(
-      Id window_id,
-      const gfx::Rect& new_bounds,
-      ui::WindowShowState state,
-      const base::Optional<viz::LocalSurfaceIdAllocation>&
-          local_surface_id_allocation) override {
-    // The bounds of the root may change during startup on Android at random
-    // times. As this doesn't matter, and shouldn't impact test exepctations,
-    // it is ignored.
-    if (window_id == root_window_id_ && !track_root_bounds_changes_)
-      return;
-    tracker()->OnWindowBoundsChanged(window_id, new_bounds, state,
-                                     local_surface_id_allocation);
-  }
-  void OnWindowTransformChanged(Id window_id,
-                                const gfx::Transform& new_transform) override {
-    tracker()->OnWindowTransformChanged(window_id);
-  }
-  void OnTransientWindowAdded(Id window_id, Id transient_window_id) override {
-    tracker()->OnTransientWindowAdded(window_id, transient_window_id);
-  }
-  void OnTransientWindowRemoved(Id window_id, Id transient_window_id) override {
-    tracker()->OnTransientWindowRemoved(window_id, transient_window_id);
-  }
-  void OnWindowHierarchyChanged(Id window,
-                                Id old_parent,
-                                Id new_parent,
-                                std::vector<WindowDataPtr> windows) override {
-    tracker()->OnWindowHierarchyChanged(window, old_parent, new_parent,
-                                        std::move(windows));
-  }
-  void OnWindowReordered(Id window_id,
-                         Id relative_window_id,
-                         mojom::OrderDirection direction) override {
-    tracker()->OnWindowReordered(window_id, relative_window_id, direction);
-  }
-  void OnWindowDeleted(Id window) override {
-    tracker()->OnWindowDeleted(window);
-  }
-  void OnWindowVisibilityChanged(Id window, bool visible) override {
-    tracker()->OnWindowVisibilityChanged(window, visible);
-  }
-  void OnWindowParentDrawnStateChanged(Id window, bool drawn) override {
-    tracker()->OnWindowParentDrawnStateChanged(window, drawn);
-  }
-  void OnWindowInputEvent(uint32_t event_id,
-                          Id window_id,
-                          int64_t display_id,
-                          std::unique_ptr<ui::Event> event,
-                          bool matches_event_observer) override {
-    // Ack input events to clear the state on the server. These can be received
-    // during test startup. X11Window::DispatchEvent sends a synthetic move
-    // event to notify of entry.
-    tree()->OnWindowInputEventAck(event_id, mojom::EventResult::HANDLED);
-    // Don't log input events as none of the tests care about them and they
-    // may come in at random points.
-  }
-  void OnObservedInputEvent(std::unique_ptr<ui::Event> event) override {}
-  void OnWindowSharedPropertyChanged(
-      Id window,
-      const std::string& name,
-      const base::Optional<std::vector<uint8_t>>& new_data) override {
-    tracker_.OnWindowSharedPropertyChanged(window, name, new_data);
-  }
-  // TODO(sky): add testing coverage.
-  void OnWindowFocused(Id focused_window_id) override {}
-  void OnWindowCursorChanged(Id window_id, ui::Cursor cursor) override {
-    tracker_.OnWindowCursorChanged(window_id, cursor);
-  }
-  void OnDragDropStart(const base::flat_map<std::string, std::vector<uint8_t>>&
-                           drag_data) override {}
-
-  void OnDragEnter(Id window,
-                   uint32_t key_state,
-                   const gfx::PointF& location_in_root,
-                   const gfx::PointF& location,
-                   uint32_t effect_bitmask,
-                   OnDragEnterCallback callback) override {}
-  void OnDragOver(Id window,
-                  uint32_t key_state,
-                  const gfx::PointF& location_in_root,
-                  const gfx::PointF& location,
-                  uint32_t effect_bitmask,
-                  OnDragOverCallback callback) override {}
-  void OnDragLeave(Id window) override {}
-  void OnCompleteDrop(Id window,
-                      uint32_t key_state,
-                      const gfx::PointF& location_in_root,
-                      const gfx::PointF& location,
-                      uint32_t effect_bitmask,
-                      OnCompleteDropCallback callback) override {}
-
-  void OnPerformDragDropCompleted(uint32_t change_id,
-                                  bool success,
-                                  uint32_t action_taken) override {}
-
-  void OnDragDropDone() override {}
-
-  void OnChangeCompleted(uint32_t change_id, bool success) override {
-    if (waiting_change_id_ == change_id && change_completed_run_loop_) {
-      on_change_completed_result_ = success;
-      change_completed_run_loop_->Quit();
-    }
-  }
-  void RequestClose(Id window_id) override {}
-
-  // If non-null we're waiting for OnEmbed() using this RunLoop.
-  std::unique_ptr<base::RunLoop> embed_run_loop_;
-
-  // If non-null we're waiting for a certain number of change notifications to
-  // be encountered.
-  std::unique_ptr<WaitState> wait_state_;
-
-  mojo::Binding<WindowTreeClient> binding_;
-  uint32_t next_change_id_;
-  uint32_t waiting_change_id_;
-  bool on_change_completed_result_;
-  std::unique_ptr<base::RunLoop> change_completed_run_loop_;
-  ClientSpecificId client_id_ = 0u;
-
-  DISALLOW_COPY_AND_ASSIGN(TestWindowTreeClient2);
-};
-
-// -----------------------------------------------------------------------------
-
-// InterfaceFactory for vending TestWindowTreeClient2s.
-class WindowTreeClientFactory {
- public:
-  WindowTreeClientFactory() {}
-  ~WindowTreeClientFactory() {}
-
-  // Runs a nested MessageLoop until a new instance has been created.
-  std::unique_ptr<TestWindowTreeClient2> WaitForInstance() {
-    if (!client_impl_.get()) {
-      DCHECK(!run_loop_);
-      run_loop_ = std::make_unique<base::RunLoop>();
-      run_loop_->Run();
-      run_loop_.reset();
-    }
-    return std::move(client_impl_);
-  }
-
-  void BindWindowTreeClientRequest(mojom::WindowTreeClientRequest request) {
-    client_impl_ = std::make_unique<TestWindowTreeClient2>();
-    client_impl_->Bind(std::move(request));
-    if (run_loop_.get())
-      run_loop_->Quit();
-  }
-
- private:
-  std::unique_ptr<TestWindowTreeClient2> client_impl_;
-  std::unique_ptr<base::RunLoop> run_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowTreeClientFactory);
-};
-
-}  // namespace
-
-class WindowTreeClientTest : public WindowServerServiceTestBase {
- public:
-  WindowTreeClientTest() : root_window_id_(0) {}
-
-  ~WindowTreeClientTest() override {}
-
- protected:
-  // Returns the changes from the various clients.
-  std::vector<Change>* changes1() { return wt_client1_->tracker()->changes(); }
-  std::vector<Change>* changes2() { return wt_client2_->tracker()->changes(); }
-  std::vector<Change>* changes3() { return wt_client3_->tracker()->changes(); }
-
-  // Various clients. |wt1()|, being the first client, has special permissions
-  // (it's treated as the window manager).
-  mojom::WindowTree* wt1() { return wt_client1_->tree(); }
-  mojom::WindowTree* wt2() { return wt_client2_->tree(); }
-  mojom::WindowTree* wt3() { return wt_client3_->tree(); }
-
-  TestWindowTreeClient2* wt_client1() { return wt_client1_.get(); }
-  TestWindowTreeClient2* wt_client2() { return wt_client2_.get(); }
-  TestWindowTreeClient2* wt_client3() { return wt_client3_.get(); }
-
-  Id root_window_id() const { return root_window_id_; }
-
-  ClientSpecificId client_id_1() const { return client_id_1_; }
-  ClientSpecificId client_id_2() const { return client_id_2_; }
-  ClientSpecificId client_id_3() const { return client_id_3_; }
-
-  void EstablishSecondClientWithRoot(Id root_id) {
-    ASSERT_TRUE(wt_client2_.get() == nullptr);
-    wt_client2_ = EstablishClientViaEmbed(wt1(), root_id);
-    ASSERT_GT(client_id_2_, 0u);
-    ASSERT_TRUE(wt_client2_.get() != nullptr);
-  }
-
-  void EstablishSecondClient(bool create_initial_window) {
-    Id window_1_1 = 0;
-    if (create_initial_window) {
-      window_1_1 = wt_client1()->NewWindow(1);
-      ASSERT_TRUE(window_1_1);
-    }
-    ASSERT_NO_FATAL_FAILURE(
-        EstablishSecondClientWithRoot(BuildWindowId(client_id_1(), 1)));
-
-    if (create_initial_window) {
-      // window_1_1 is created by wt_client1() so its client_id part should be
-      // client_id_1() in wt_client2.
-      EXPECT_EQ(
-          "[" +
-              WindowParentToString(
-                  BuildWindowId(client_id_1(),
-                                ClientWindowIdFromTransportId(window_1_1)),
-                  kNullParentId) +
-              "]",
-          ChangeWindowDescription(*changes2()));
-    }
-  }
-
-  void EstablishThirdClient(mojom::WindowTree* owner, Id root_id) {
-    ASSERT_TRUE(wt_client3_.get() == nullptr);
-    wt_client3_ = EstablishClientViaEmbed(owner, root_id);
-    ASSERT_TRUE(wt_client3_.get() != nullptr);
-  }
-
-  std::unique_ptr<TestWindowTreeClient2> WaitForWindowTreeClient() {
-    return client_factory_->WaitForInstance();
-  }
-
-  // Establishes a new client by way of Embed() on the specified WindowTree.
-  std::unique_ptr<TestWindowTreeClient2> EstablishClientViaEmbed(
-      mojom::WindowTree* owner,
-      Id root_id) {
-    return EstablishClientViaEmbedWithPolicyBitmask(owner, root_id);
-  }
-
-  std::unique_ptr<TestWindowTreeClient2>
-  EstablishClientViaEmbedWithPolicyBitmask(mojom::WindowTree* owner,
-                                           Id root_id) {
-    if (!EmbedUrl(connector(), owner, test_name(), root_id)) {
-      ADD_FAILURE() << "Embed() failed";
-      return nullptr;
-    }
-    std::unique_ptr<TestWindowTreeClient2> client =
-        client_factory_->WaitForInstance();
-    if (!client.get()) {
-      ADD_FAILURE() << "WaitForInstance failed";
-      return nullptr;
-    }
-    client->WaitForOnEmbed();
-
-    // TODO(fsamuel): Currently the FrameSinkId maps directly to the server's
-    // window ID. This is likely bad from a security perspective and should be
-    // fixed.
-    EXPECT_EQ("OnEmbed",
-              SingleChangeToDescription(*client->tracker()->changes()));
-    return client;
-  }
-
-  // WindowServerServiceTestBase:
-  void OnBindInterface(const service_manager::BindSourceInfo& source_info,
-                       const std::string& interface_name,
-                       mojo::ScopedMessagePipeHandle interface_pipe) override {
-    registry_.BindInterface(interface_name, std::move(interface_pipe));
-  }
-
-  void SetUp() override {
-    client_factory_ = std::make_unique<WindowTreeClientFactory>();
-    registry_.AddInterface(
-        base::Bind(&WindowTreeClientFactory::BindWindowTreeClientRequest,
-                   base::Unretained(client_factory_.get())));
-
-    WindowServerServiceTestBase::SetUp();
-
-    mojom::WindowTreeFactoryPtr factory;
-    // TODO: figure out better way to isolate this!
-    connector()->BindInterface("ui", &factory);
-
-    // Connect |wt_client_1| as the first client.
-    mojom::WindowTreeClientPtr tree_client_ptr;
-    wt_client1_ = std::make_unique<TestWindowTreeClient2>();
-    wt_client1_->Bind(MakeRequest(&tree_client_ptr));
-
-    mojom::WindowTreePtr tree_ptr;
-    factory->CreateWindowTree(MakeRequest(&tree_ptr),
-                              std::move(tree_client_ptr));
-    wt_client1_->SetWindowTree(std::move(tree_ptr));
-
-    // Creates a window to use as root window. 1000 is an arbitrary ID not used
-    // in any test cases.
-    root_window_id_ = wt_client1_->NewWindow(1000);
-    changes1()->clear();
-  }
-
-  void TearDown() override {
-    // Destroy these before the message loop is destroyed (happens in
-    // WindowServerServiceTestBase::TearDown).
-    wt_client1_.reset();
-    wt_client2_.reset();
-    wt_client3_.reset();
-    client_factory_.reset();
-    WindowServerServiceTestBase::TearDown();
-  }
-
-  std::unique_ptr<TestWindowTreeClient2> wt_client1_;
-  std::unique_ptr<TestWindowTreeClient2> wt_client2_;
-  std::unique_ptr<TestWindowTreeClient2> wt_client3_;
-
- private:
-  std::unique_ptr<WindowTreeClientFactory> client_factory_;
-  const ClientSpecificId client_id_1_ = kWindowServerClientId + 1;
-  const ClientSpecificId client_id_2_ = client_id_1_ + 1;
-  const ClientSpecificId client_id_3_ = client_id_2_ + 1;
-  Id root_window_id_;
-  service_manager::BinderRegistry registry_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowTreeClientTest);
-};
-
-TEST_F(WindowTreeClientTest, GotClientId) {
-  EXPECT_NE(0u, wt_client1_->client_id());
-}
-
-// Verifies two clients get different ids.
-TEST_F(WindowTreeClientTest, TwoClientsGetDifferentClientIds) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-
-  ASSERT_EQ(1u, changes2()->size());
-  ASSERT_NE(client_id_1(), client_id_2());
-}
-
-// Verifies when Embed() is invoked any child windows are removed.
-TEST_F(WindowTreeClientTest, WindowsRemovedWhenEmbedding) {
-  // Two windows 1 and 2. 2 is parented to 1.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_2);
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_1, window_1_2));
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-  ASSERT_EQ(1u, changes2()->size());
-  ASSERT_EQ(1u, (*changes2())[0].windows.size());
-  // window_1_1 has a client_id part of client_id_1 in wt2.
-  Id window11_in_wt2 =
-      BuildWindowId(client_id_1(), ClientWindowIdFromTransportId(window_1_1));
-  EXPECT_EQ("[" + WindowParentToString(window11_in_wt2, kNullParentId) + "]",
-            ChangeWindowDescription(*changes2()));
-
-  // Embed() removed window 2.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), window_1_2, &windows);
-    EXPECT_EQ(WindowParentToString(window_1_2, kNullParentId),
-              SingleWindowDescription(windows));
-  }
-
-  // ws2 should not see window 2.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt2(), window11_in_wt2, &windows);
-    EXPECT_EQ(WindowParentToString(window11_in_wt2, kNullParentId),
-              SingleWindowDescription(windows));
-  }
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt2(), window_1_2, &windows);
-    EXPECT_TRUE(windows.empty());
-  }
-
-  // Windows 3 and 4 in client 2.
-  Id window_2_3 = wt_client2()->NewWindow(3);
-  Id window_2_4 = wt_client2()->NewWindow(4);
-  ASSERT_TRUE(window_2_3);
-  ASSERT_TRUE(window_2_4);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_3, window_2_4));
-
-  // Client 3 rooted at 2.
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(wt2(), window_2_3));
-
-  // Window 4 should no longer have a parent.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt2(), window_2_3, &windows);
-    EXPECT_EQ(WindowParentToString(window_2_3, kNullParentId),
-              SingleWindowDescription(windows));
-
-    windows.clear();
-    GetWindowTree(wt2(), window_2_4, &windows);
-    EXPECT_EQ(WindowParentToString(window_2_4, kNullParentId),
-              SingleWindowDescription(windows));
-  }
-
-  // And window 4 should not be visible to client 3.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt3(), window_2_3, &windows);
-    EXPECT_EQ("no windows", SingleWindowDescription(windows));
-  }
-}
-
-// Verifies once Embed() has been invoked the parent client can't see any
-// children.
-TEST_F(WindowTreeClientTest, CantAccessChildrenOfEmbeddedWindow) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  Id window_2_2 = wt_client2()->NewWindow(2);
-  ASSERT_TRUE(window_2_2);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_2));
-
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(wt2(), window_2_2));
-
-  Id window_3_3 = wt_client3()->NewWindow(3);
-  ASSERT_TRUE(window_3_3);
-  ASSERT_TRUE(
-      wt_client3()->AddWindow(wt_client3()->root_window_id(), window_3_3));
-
-  // Even though 3 is a child of 2 client 2 can't see 3 as it's from a
-  // different client.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt2(), window_2_2, &windows);
-    EXPECT_EQ(WindowParentToString(window_2_2, window_1_1),
-              SingleWindowDescription(windows));
-  }
-
-  // Client 2 shouldn't be able to get window 3 at all.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt2(), window_3_3, &windows);
-    EXPECT_TRUE(windows.empty());
-  }
-
-  // Client 1 should only see window_1_1.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), window_1_1, &windows);
-    ASSERT_EQ(1u, windows.size());
-    // window_1_1 is created by wt1() so client_id part would be 0 in wt1().
-    EXPECT_EQ(WindowParentToString(ClientWindowIdFromTransportId(window_1_1),
-                                   kNullParentId),
-              windows[0].ToString());
-  }
-}
-
-// Verifies once Embed() has been invoked the parent can't mutate the children.
-TEST_F(WindowTreeClientTest, CantModifyChildrenOfEmbeddedWindow) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(wt2(), window_2_1));
-
-  Id window_2_2 = wt_client2()->NewWindow(2);
-  ASSERT_TRUE(window_2_2);
-  // Client 2 shouldn't be able to add anything to the window anymore.
-  ASSERT_FALSE(wt_client2()->AddWindow(window_2_1, window_2_2));
-
-  // Create window 3 in client 3 and add it to window 3.
-  Id window_3_1 = wt_client3()->NewWindow(1);
-  ASSERT_TRUE(window_3_1);
-  // window_2_1 should have a client_id of client_id_2 in wt_client3.
-  ASSERT_TRUE(wt_client3()->AddWindow(
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_1)),
-      window_3_1));
-
-  // Client 2 shouldn't be able to remove window 3.
-  ASSERT_FALSE(wt_client2()->RemoveWindowFromParent(
-      BuildWindowId(client_id_3(), ClientWindowIdFromTransportId(window_3_1))));
-}
-
-// Verifies client gets a valid id.
-TEST_F(WindowTreeClientTest, NewWindow) {
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-  EXPECT_TRUE(changes1()->empty());
-
-  // Can't create a window with the same id.
-  ASSERT_EQ(0u, wt_client1()->NewWindowWithCompleteId(window_1_1));
-  EXPECT_TRUE(changes1()->empty());
-
-  // Can't create a window with a bogus client id.
-  ASSERT_EQ(0u, wt_client1()->NewWindowWithCompleteId(
-                    BuildWindowId(client_id_1() + 1, 1)));
-  EXPECT_TRUE(changes1()->empty());
-}
-
-// Verifies AddWindow fails when window is already in position.
-TEST_F(WindowTreeClientTest, AddWindowWithNoChange) {
-  // Create the embed point now so that the ids line up.
-  ASSERT_TRUE(wt_client1()->NewWindow(1));
-  Id window_1_21 = wt_client1()->NewWindow(21);
-  Id window_1_31 = wt_client1()->NewWindow(31);
-  ASSERT_TRUE(window_1_21);
-  ASSERT_TRUE(window_1_31);
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-
-  // Make 3 a child of 2.
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_21, window_1_31));
-
-  // Try again, this should fail.
-  EXPECT_FALSE(wt_client1()->AddWindow(window_1_21, window_1_31));
-}
-
-// Verifies AddWindow fails when window is already in position.
-TEST_F(WindowTreeClientTest, AddAncestorFails) {
-  // Create the embed point now so that the ids line up.
-  ASSERT_TRUE(wt_client1()->NewWindow(1));
-  Id window_1_21 = wt_client1()->NewWindow(21);
-  Id window_1_31 = wt_client1()->NewWindow(31);
-  ASSERT_TRUE(window_1_21);
-  ASSERT_TRUE(window_1_31);
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-
-  // Make 3 a child of 2.
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_21, window_1_31));
-
-  // Try to make 2 a child of 3, this should fail since 2 is an ancestor of 3.
-  EXPECT_FALSE(wt_client1()->AddWindow(window_1_31, window_1_21));
-}
-
-// Assertions around adding windows to the root.
-TEST_F(WindowTreeClientTest, AddToRoot) {
-  // Create the embed point now so that the ids line up.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-  Id window_1_21 = wt_client1()->NewWindow(21);
-  Id window_1_31 = wt_client1()->NewWindow(31);
-  ASSERT_TRUE(window_1_21);
-  ASSERT_TRUE(window_1_31);
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-
-  // Make 3 a child of 21.
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_21, window_1_31));
-
-  // Make 21 a child of 1. This should fail because window_1_1 is the root
-  // of client2, not client1.
-  EXPECT_FALSE(wt_client1()->AddWindow(window_1_1, window_1_21));
-}
-
-TEST_F(WindowTreeClientTest,
-       DISABLED_WindowHierarchyChangedAddingKnownToUnknown) {
-  // Create the following structure: root -> 1 -> 11 and 2->21 (2 has no
-  // parent).
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-
-  Id window_2_11 = wt_client2()->NewWindow(11);
-  Id window_2_2 = wt_client2()->NewWindow(2);
-  Id window_2_21 = wt_client2()->NewWindow(21);
-  ASSERT_TRUE(window_2_11);
-  ASSERT_TRUE(window_2_2);
-  ASSERT_TRUE(window_2_21);
-  // window_1_1 has a client_id part of 0 in wt1, while window_2_2 has that of
-  // client_id_2.
-  Id window11_in_wt1 = ClientWindowIdFromTransportId(window_1_1);
-  Id window22_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_2));
-
-  // Set up the hierarchy.
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_11));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_2, window_2_21));
-
-  // Remove 11, should result in a hierarchy change for the root.
-  {
-    changes1()->clear();
-    ASSERT_TRUE(wt_client2()->RemoveWindowFromParent(window_2_11));
-
-    wt_client1_->WaitForChangeCount(1);
-    // client_id_2(),1 should be IdToString(window_2_11), but window_2_11 is in
-    // the id space of client2, not client1.
-    EXPECT_EQ("HierarchyChanged window=" + std::to_string(client_id_2()) +
-                  ",11 old_parent=" + IdToString(window11_in_wt1) +
-                  " new_parent=null",
-              SingleChangeToDescription(*changes1()));
-  }
-
-  // Add 2 to 1.
-  {
-    changes1()->clear();
-    ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_2));
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("HierarchyChanged window=" + IdToString(window22_in_wt1) +
-                  " old_parent=null new_parent=" + IdToString(window11_in_wt1),
-              SingleChangeToDescription(*changes1()));
-    // "window=client_id_2(),3 parent=client_id_2(),2]" should be,
-    // WindowParentToString(window_2_21, window_2_2), but isn't because of
-    // differing id spaces.
-    EXPECT_EQ("[" + WindowParentToString(window22_in_wt1, window11_in_wt1) +
-                  "],[window=" + std::to_string(client_id_2()) +
-                  ",21 parent=" + std::to_string(client_id_2()) + ",2]",
-              ChangeWindowDescription(*changes1()));
-  }
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_ReorderWindow) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  Id window_2_2 = wt_client2()->NewWindow(2);
-  Id window_2_3 = wt_client2()->NewWindow(3);
-  Id window_1_4 = wt_client1()->NewWindow(4);  // Peer to client_id_1(),1
-  Id window_1_5 = wt_client1()->NewWindow(5);  // Peer to client_id_1(),1
-  Id window_2_6 = wt_client2()->NewWindow(6);  // Child of client_id_1(),2.
-  Id window_2_7 = wt_client2()->NewWindow(7);  // Unparented.
-  Id window_2_8 = wt_client2()->NewWindow(8);  // Unparented.
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(window_2_2);
-  ASSERT_TRUE(window_2_3);
-  ASSERT_TRUE(window_1_4);
-  ASSERT_TRUE(window_1_5);
-  ASSERT_TRUE(window_2_6);
-  ASSERT_TRUE(window_2_7);
-  ASSERT_TRUE(window_2_8);
-
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_1, window_2_2));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_2, window_2_6));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_1, window_2_3));
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_4));
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_5));
-  ASSERT_TRUE(
-      wt_client2()->AddWindow(BuildWindowId(client_id_1(), 1), window_2_1));
-
-  // window_2_* has client_id part of client_id_2 in wt1.
-  Id window22_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_2));
-  Id window23_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_3));
-  Id window26_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_6));
-  Id window27_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_7));
-  Id window28_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_8));
-
-  {
-    changes1()->clear();
-    ASSERT_TRUE(wt_client2()->ReorderWindow(window_2_2, window_2_3,
-                                            mojom::OrderDirection::ABOVE));
-
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("Reordered window=" + IdToString(window22_in_wt1) + " relative=" +
-                  IdToString(window23_in_wt1) + " direction=above",
-              SingleChangeToDescription(*changes1()));
-  }
-
-  {
-    changes1()->clear();
-    ASSERT_TRUE(wt_client2()->ReorderWindow(window_2_2, window_2_3,
-                                            mojom::OrderDirection::BELOW));
-
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("Reordered window=" + IdToString(window22_in_wt1) + " relative=" +
-                  IdToString(window23_in_wt1) + " direction=below",
-              SingleChangeToDescription(*changes1()));
-  }
-
-  // view2 is already below view3.
-  EXPECT_FALSE(wt_client2()->ReorderWindow(window_2_2, window_2_3,
-                                           mojom::OrderDirection::BELOW));
-
-  // view4 & 5 are unknown to client 2.
-  EXPECT_FALSE(wt_client2()->ReorderWindow(window_1_4, window_1_5,
-                                           mojom::OrderDirection::ABOVE));
-
-  // view6 & view3 have different parents.
-  EXPECT_FALSE(wt_client1()->ReorderWindow(window23_in_wt1, window26_in_wt1,
-                                           mojom::OrderDirection::ABOVE));
-
-  // Non-existent window-ids
-  EXPECT_FALSE(wt_client1()->ReorderWindow(BuildWindowId(client_id_1(), 27),
-                                           BuildWindowId(client_id_1(), 28),
-                                           mojom::OrderDirection::ABOVE));
-
-  // view7 & view8 are un-parented.
-  EXPECT_FALSE(wt_client1()->ReorderWindow(window27_in_wt1, window28_in_wt1,
-                                           mojom::OrderDirection::ABOVE));
-}
-
-// Verifies DeleteWindow works.
-TEST_F(WindowTreeClientTest, DISABLED_DeleteWindow) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  // window_2_1 is not created by wt1 so its client_id part is client_id_2,
-  // while window_1_1 would have 0 for the client_id part.
-  Id window21_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_1));
-
-  // Make 2 a child of 1.
-  {
-    changes1()->clear();
-    ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("HierarchyChanged window=" + IdToString(window21_in_wt1) +
-                  " old_parent=null new_parent=" +
-                  IdToString(ClientWindowIdFromTransportId(window_1_1)),
-              SingleChangeToDescription(*changes1()));
-  }
-
-  // Delete 2.
-  {
-    changes1()->clear();
-    changes2()->clear();
-    ASSERT_TRUE(wt_client2()->DeleteWindow(window_2_1));
-    EXPECT_TRUE(changes2()->empty());
-
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("WindowDeleted window=" + IdToString(window21_in_wt1),
-              SingleChangeToDescription(*changes1()));
-  }
-}
-
-// Verifies DeleteWindow() on the root succeeds.
-TEST_F(WindowTreeClientTest, DeleteRoot) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  EXPECT_TRUE(wt_client2()->DeleteWindow(window_1_1));
-  // Client1 should get OnEmbeddedAppDisconnected().
-  wt_client1_->WaitForChangeCount(1);
-  // window_1_1 should have client_id of 0 in wt_client1 because it's created
-  // by wt_client1.
-  EXPECT_EQ("OnEmbeddedAppDisconnected window=" +
-                IdToString(ClientWindowIdFromTransportId(window_1_1)),
-            SingleChangeToDescription(*changes1()));
-
-  // Create a new window and try adding to |window_1_1| from client 2, should
-  // fail as client 2 no longer knows about |window_1_1|.
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  EXPECT_FALSE(wt_client2()->AddWindow(window_1_1, window_2_1));
-}
-
-// Verifies DeleteWindow() on the root suceeds.
-TEST_F(WindowTreeClientTest, DeleteRootWithChildren) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-  changes2()->clear();
-  EXPECT_TRUE(wt_client2()->DeleteWindow(window_1_1));
-  // DeleteWindow() should not result in any calls to client 2.
-  EXPECT_TRUE(changes2()->empty());
-
-  // Create a new window parented to 2_1. Should work as 2_1 is still valid.
-  Id window_2_2 = wt_client2()->NewWindow(2);
-  ASSERT_TRUE(window_2_2);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_1, window_2_2));
-}
-
-TEST_F(WindowTreeClientTest, DeleteUnknownWindowSucceeds) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  // Even though the window is unknown, deletion succeeds to avoid races with
-  // the client (both sides deleting a window at the same time).
-  EXPECT_TRUE(wt_client2()->DeleteWindow(BuildWindowId(client_id_1(), 2)));
-}
-
-// Verifies if a window was deleted and then reused that other clients are
-// properly notified.
-TEST_F(WindowTreeClientTest, DISABLED_ReuseDeletedWindowId) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-
-  // wt1 created window_1_1 but not window_2_1.
-  Id window11_in_wt1 = ClientWindowIdFromTransportId(window_1_1);
-  Id window21_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_1));
-
-  // Add 2 to 1.
-  {
-    changes1()->clear();
-    ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("HierarchyChanged window=" + IdToString(window21_in_wt1) +
-                  " old_parent=null new_parent=" + IdToString(window11_in_wt1),
-              SingleChangeToDescription(*changes1()));
-    EXPECT_EQ(
-        "[" + WindowParentToString(window21_in_wt1, window11_in_wt1) + "]",
-        ChangeWindowDescription(*changes1()));
-  }
-
-  // Delete 2.
-  {
-    changes1()->clear();
-    ASSERT_TRUE(wt_client2()->DeleteWindow(window_2_1));
-
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("WindowDeleted window=" + IdToString(window21_in_wt1),
-              SingleChangeToDescription(*changes1()));
-  }
-
-  // Create 2 again, and add it back to 1. Should get the same notification.
-  window_2_1 = wt_client2()->NewWindow(2);
-  window21_in_wt1 = BuildWindowId(ClientIdFromTransportId(window21_in_wt1),
-                                  ClientWindowIdFromTransportId(window_2_1));
-  ASSERT_TRUE(window_2_1);
-  {
-    changes1()->clear();
-    ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("HierarchyChanged window=" + IdToString(window21_in_wt1) +
-                  " old_parent=null new_parent=" + IdToString(window11_in_wt1),
-              SingleChangeToDescription(*changes1()));
-    EXPECT_EQ(
-        "[" + WindowParentToString(window21_in_wt1, window11_in_wt1) + "]",
-        ChangeWindowDescription(*changes1()));
-  }
-}
-
-// Assertions for GetWindowTree.
-TEST_F(WindowTreeClientTest, DISABLED_GetWindowTree) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-
-  // Create 11 in first client and make it a child of 1.
-  Id window_1_11 = wt_client1()->NewWindow(11);
-  ASSERT_TRUE(window_1_11);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_1, window_1_11));
-
-  // Create two windows in second client, 2 and 3, both children of 1.
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  Id window_2_2 = wt_client2()->NewWindow(2);
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(window_2_2);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_2));
-
-  // wt1 created window_1_1 and window_1_11, but not window_2_1 and window_2_2.
-  Id window11_in_wt1 = ClientWindowIdFromTransportId(window_1_1);
-  Id window111_in_wt1 = ClientWindowIdFromTransportId(window_1_11);
-  Id window21_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_1));
-  Id window22_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_2));
-
-  // Verifies GetWindowTree() on the root. The root client sees all.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), root_window_id(), &windows);
-    ASSERT_EQ(5u, windows.size());
-    EXPECT_EQ(WindowParentToString(root_window_id(), kNullParentId),
-              windows[0].ToString());
-    EXPECT_EQ(WindowParentToString(window11_in_wt1, root_window_id()),
-              windows[1].ToString());
-    EXPECT_EQ(WindowParentToString(window111_in_wt1, window11_in_wt1),
-              windows[2].ToString());
-    EXPECT_EQ(WindowParentToString(window21_in_wt1, window11_in_wt1),
-              windows[3].ToString());
-    EXPECT_EQ(WindowParentToString(window22_in_wt1, window11_in_wt1),
-              windows[4].ToString());
-  }
-
-  // Verifies GetWindowTree() on the window client_id_1(),1 from wt2(). wt2()
-  // sees client_id_1(),1 as client_id_1(),1 is wt2()'s root and wt2() sees all
-  // the windows it created.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt2(), window_1_1, &windows);
-    ASSERT_EQ(3u, windows.size());
-    EXPECT_EQ(WindowParentToString(window_1_1, kNullParentId),
-              windows[0].ToString());
-    EXPECT_EQ(WindowParentToString(window_2_1, window_1_1),
-              windows[1].ToString());
-    EXPECT_EQ(WindowParentToString(window_2_2, window_1_1),
-              windows[2].ToString());
-  }
-
-  // Client 2 shouldn't be able to get the root tree.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt2(), root_window_id(), &windows);
-    ASSERT_EQ(0u, windows.size());
-  }
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_SetWindowBounds) {
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-
-  changes2()->clear();
-
-  wt_client2_->set_track_root_bounds_changes(true);
-
-  viz::ParentLocalSurfaceIdAllocator allocator;
-  allocator.GenerateId();
-  viz::LocalSurfaceIdAllocation local_surface_id_allocation =
-      allocator.GetCurrentLocalSurfaceIdAllocation();
-  wt1()->SetWindowBounds(10, window_1_1, gfx::Rect(0, 0, 100, 100),
-                         local_surface_id_allocation);
-  ASSERT_TRUE(wt_client1()->WaitForChangeCompleted(10));
-
-  wt_client2_->WaitForChangeCount(1);
-  // window_1_1 has a client_id part of client_id_1 in wt2.
-  Id window11_in_wt2 =
-      BuildWindowId(client_id_1(), ClientWindowIdFromTransportId(window_1_1));
-  EXPECT_EQ("BoundsChanged window=" + IdToString(window11_in_wt2) +
-                " old_bounds=0,0 0x0 new_bounds=0,0 100x100 local_surface_id=" +
-                local_surface_id_allocation.ToString(),
-            SingleChangeToDescription(*changes2()));
-
-  // Should not be possible to change the bounds of a window created by another
-  // client.
-  wt2()->SetWindowBounds(11, window11_in_wt2, gfx::Rect(0, 0, 0, 0),
-                         base::nullopt);
-  ASSERT_FALSE(wt_client2()->WaitForChangeCompleted(11));
-}
-
-// Verify AddWindow fails when trying to manipulate windows in other roots.
-TEST_F(WindowTreeClientTest, CantMoveWindowsFromOtherRoot) {
-  // Create 1 and 2 in the first client.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_1);
-  ASSERT_TRUE(window_1_2);
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-
-  // Try to move 2 to be a child of 1 from client 2. This should fail as 2
-  // should not be able to access 1.
-  ASSERT_FALSE(wt_client2()->AddWindow(window_1_1, window_1_2));
-
-  // Try to reparent 1 to the root. A client is not allowed to reparent its
-  // roots.
-  ASSERT_FALSE(wt_client2()->AddWindow(root_window_id(), window_1_1));
-}
-
-// Verify RemoveWindowFromParent fails for windows that are descendants of the
-// roots.
-TEST_F(WindowTreeClientTest, CantRemoveWindowsInOtherRoots) {
-  // Create 1 and 2 in the first client and parent both to the root.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_1);
-  ASSERT_TRUE(window_1_2);
-
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_2));
-
-  // Establish the second client and give it the root 1.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-
-  // Client 2 should not be able to remove window 2 or 1 from its parent.
-  ASSERT_FALSE(wt_client2()->RemoveWindowFromParent(window_1_2));
-  ASSERT_FALSE(wt_client2()->RemoveWindowFromParent(window_1_1));
-
-  // Create windows 10 and 11 in 2.
-  Id window_2_10 = wt_client2()->NewWindow(10);
-  Id window_2_11 = wt_client2()->NewWindow(11);
-  ASSERT_TRUE(window_2_10);
-  ASSERT_TRUE(window_2_11);
-
-  // Parent 11 to 10.
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_10, window_2_11));
-  // Remove 11 from 10.
-  ASSERT_TRUE(wt_client2()->RemoveWindowFromParent(window_2_11));
-
-  // Verify nothing was actually removed.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), root_window_id(), &windows);
-    ASSERT_EQ(3u, windows.size());
-    EXPECT_EQ(WindowParentToString(root_window_id(), kNullParentId),
-              windows[0].ToString());
-    EXPECT_EQ(WindowParentToString(window_1_1, root_window_id()),
-              windows[1].ToString());
-    EXPECT_EQ(WindowParentToString(window_1_2, root_window_id()),
-              windows[2].ToString());
-  }
-}
-
-// Verify GetWindowTree fails for windows that are not descendants of the roots.
-TEST_F(WindowTreeClientTest, CantGetWindowTreeOfOtherRoots) {
-  // Create 1 and 2 in the first client and parent both to the root.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_1);
-  ASSERT_TRUE(window_1_2);
-
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_2));
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-
-  std::vector<TestWindow> windows;
-
-  // Should get nothing for the root.
-  GetWindowTree(wt2(), root_window_id(), &windows);
-  ASSERT_TRUE(windows.empty());
-
-  // Should get nothing for window 2.
-  GetWindowTree(wt2(), window_1_2, &windows);
-  ASSERT_TRUE(windows.empty());
-
-  // Should get window 1 if asked for.
-  Id window11_in_wt2 =
-      BuildWindowId(client_id_1(), ClientWindowIdFromTransportId(window_1_1));
-  GetWindowTree(wt2(), window11_in_wt2, &windows);
-  ASSERT_EQ(1u, windows.size());
-  EXPECT_EQ(WindowParentToString(window11_in_wt2, kNullParentId),
-            windows[0].ToString());
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_EmbedWithSameWindowId) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  changes2()->clear();
-
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(wt1(), window_1_1));
-
-  // Client 2 should have been told of the unembed and delete.
-  {
-    wt_client2_->WaitForChangeCount(2);
-    EXPECT_EQ("OnUnembed window=" + IdToString(window_1_1),
-              ChangesToDescription1(*changes2())[0]);
-    EXPECT_EQ("WindowDeleted window=" + IdToString(window_1_1),
-              ChangesToDescription1(*changes2())[1]);
-  }
-
-  // Client 2 has no root. Verify it can't see window client_id_1(),1 anymore.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt2(), window_1_1, &windows);
-    EXPECT_TRUE(windows.empty());
-  }
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_EmbedWithSameWindowId2) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  changes2()->clear();
-
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(wt1(), window_1_1));
-
-  // Client 2 should have been told about the unembed and delete.
-  wt_client2_->WaitForChangeCount(2);
-  changes2()->clear();
-
-  // Create a window in the third client and parent it to the root.
-  Id window_3_1 = wt_client3()->NewWindow(1);
-  ASSERT_TRUE(window_3_1);
-  // After EstablishThirdClient, window_1_1 should have a ClientWindowId of
-  // (client_id_2, 0).
-  Id embedded_window_1_1_wt3 = BuildWindowId(client_id_2(), 0);
-  ASSERT_TRUE(wt_client3()->AddWindow(embedded_window_1_1_wt3, window_3_1));
-
-  // wt1 created window_1_1 but not window_3_1.
-  Id window11_in_wt1 = ClientWindowIdFromTransportId(window_1_1);
-  Id window31_in_wt1 =
-      BuildWindowId(client_id_3(), ClientWindowIdFromTransportId(window_3_1));
-
-  // Client 1 should have been told about the add (it owns the window).
-  {
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ("HierarchyChanged window=" + IdToString(window31_in_wt1) +
-                  " old_parent=null new_parent=" + IdToString(window11_in_wt1),
-              SingleChangeToDescription(*changes1()));
-  }
-
-  // Embed client_id_1(),1 again.
-  {
-    changes3()->clear();
-
-    // We should get a new client for the new embedding.
-    std::unique_ptr<TestWindowTreeClient2> client4(
-        EstablishClientViaEmbed(wt1(), window_1_1));
-    Id embedded_window_1_1_wt4 = BuildWindowId(client_id_3(), 0);
-    ASSERT_TRUE(client4.get());
-    EXPECT_EQ("[" +
-                  WindowParentToString(embedded_window_1_1_wt4, kNullParentId) +
-                  "]",
-              ChangeWindowDescription(*client4->tracker()->changes()));
-
-    // And 3 should get an unembed and delete.
-    wt_client3_->WaitForChangeCount(2);
-    EXPECT_EQ("OnUnembed window=" + IdToString(embedded_window_1_1_wt3),
-              ChangesToDescription1(*changes3())[0]);
-    EXPECT_EQ("WindowDeleted window=" + IdToString(embedded_window_1_1_wt3),
-              ChangesToDescription1(*changes3())[1]);
-  }
-
-  // wt3() has no root. Verify it can't see window client_id_1(),1 anymore.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt3(), window_1_1, &windows);
-    EXPECT_TRUE(windows.empty());
-  }
-
-  // Verify client_id_3(),1 is no longer parented to client_id_1(),1. We have to
-  // do this from client_id_1(),1 as wt3() can no longer see client_id_1(),1.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), window_1_1, &windows);
-    ASSERT_EQ(1u, windows.size());
-    EXPECT_EQ(WindowParentToString(window11_in_wt1, kNullParentId),
-              windows[0].ToString());
-  }
-
-  // Verify wt3() can still see the window it created client_id_3(),1.
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt3(), window_3_1, &windows);
-    ASSERT_EQ(1u, windows.size());
-    EXPECT_EQ(WindowParentToString(window_3_1, kNullParentId),
-              windows[0].ToString());
-  }
-}
-
-// Assertions for SetWindowVisibility.
-TEST_F(WindowTreeClientTest, DISABLED_SetWindowVisibility) {
-  // Create 1 and 2 in the first client and parent both to the root.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_1);
-  ASSERT_TRUE(window_1_2);
-
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), root_window_id(), &windows);
-    ASSERT_EQ(2u, windows.size());
-    EXPECT_EQ(
-        WindowParentToString(root_window_id(), kNullParentId) + " visible=true",
-        windows[0].ToString2());
-    EXPECT_EQ(
-        WindowParentToString(window_1_1, root_window_id()) + " visible=false",
-        windows[1].ToString2());
-  }
-
-  // Show all the windows.
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, true));
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_2, true));
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), root_window_id(), &windows);
-    ASSERT_EQ(2u, windows.size());
-    EXPECT_EQ(
-        WindowParentToString(root_window_id(), kNullParentId) + " visible=true",
-        windows[0].ToString2());
-    EXPECT_EQ(
-        WindowParentToString(window_1_1, root_window_id()) + " visible=true",
-        windows[1].ToString2());
-  }
-
-  // Hide 1.
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, false));
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), window_1_1, &windows);
-    ASSERT_EQ(1u, windows.size());
-    EXPECT_EQ(
-        WindowParentToString(window_1_1, root_window_id()) + " visible=false",
-        windows[0].ToString2());
-  }
-
-  // Attach 2 to 1.
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_1, window_1_2));
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), window_1_1, &windows);
-    ASSERT_EQ(2u, windows.size());
-    EXPECT_EQ(
-        WindowParentToString(window_1_1, root_window_id()) + " visible=false",
-        windows[0].ToString2());
-    EXPECT_EQ(WindowParentToString(window_1_2, window_1_1) + " visible=true",
-              windows[1].ToString2());
-  }
-
-  // Show 1.
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, true));
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), window_1_1, &windows);
-    ASSERT_EQ(2u, windows.size());
-    EXPECT_EQ(
-        WindowParentToString(window_1_1, root_window_id()) + " visible=true",
-        windows[0].ToString2());
-    EXPECT_EQ(WindowParentToString(window_1_2, window_1_1) + " visible=true",
-              windows[1].ToString2());
-  }
-}
-
-// Test that we hear the cursor change in other clients.
-TEST_F(WindowTreeClientTest, DISABLED_SetCursor) {
-  // Get a second client to listen in.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  changes2()->clear();
-
-  ASSERT_TRUE(
-      wt_client1()->SetCursor(window_1_1, ui::Cursor(ui::CursorType::kIBeam)));
-  wt_client2_->WaitForChangeCount(1u);
-
-  EXPECT_EQ("CursorChanged id=" + IdToString(window_1_1) + " cursor_type=4",
-            SingleChangeToDescription(*changes2()));
-}
-
-// Assertions for SetWindowVisibility sending notifications.
-TEST_F(WindowTreeClientTest, DISABLED_SetWindowVisibilityNotifications) {
-  // Create client_id_1(),1 and client_id_1(),2. client_id_1(),2 is made a child
-  // of client_id_1(),1 and client_id_1(),1 a child of the root.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, true));
-  // Setting to the same value should return true.
-  EXPECT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, true));
-
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_2);
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_2, true));
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_1, window_1_2));
-
-  // Establish the second client at client_id_1(),2.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClientWithRoot(window_1_2));
-
-  // Add client_id_2(),3 as a child of client_id_1(),2.
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(wt_client2()->SetWindowVisibility(window_2_1, true));
-  // window_1_2 has a client_id part of client_id_1 in wt2.
-  Id window12_in_wt2 =
-      BuildWindowId(client_id_1(), ClientWindowIdFromTransportId(window_1_2));
-  ASSERT_TRUE(wt_client2()->AddWindow(window12_in_wt2, window_2_1));
-  ASSERT_TRUE(wt_client1()->WaitForAllMessages());
-
-  changes2()->clear();
-  // Hide client_id_1(),2 from client 1. Client 2 should see this.
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_2, false));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("VisibilityChanged window=" + IdToString(window12_in_wt2) +
-                  " visible=false",
-              SingleChangeToDescription(*changes2()));
-  }
-
-  changes1()->clear();
-  // Show client_id_1(),2 from client 2, client 1 should be notified.
-  ASSERT_TRUE(wt_client2()->SetWindowVisibility(window12_in_wt2, true));
-  {
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ(
-        "VisibilityChanged window=" + IdToString(window_1_2) + " visible=true",
-        SingleChangeToDescription(*changes1()));
-  }
-
-  changes2()->clear();
-  // Hide client_id_1(),1, client 2 should be told the draw state changed.
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, false));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("DrawnStateChanged window=" + IdToString(window12_in_wt2) +
-                  " drawn=false",
-              SingleChangeToDescription(*changes2()));
-  }
-
-  changes2()->clear();
-  // Show client_id_1(),1 from client 1. Client 2 should see this.
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, true));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("DrawnStateChanged window=" + IdToString(window12_in_wt2) +
-                  " drawn=true",
-              SingleChangeToDescription(*changes2()));
-  }
-
-  // Change visibility of client_id_2(),3, client 1 should see this.
-  changes1()->clear();
-  ASSERT_TRUE(wt_client2()->SetWindowVisibility(window_2_1, false));
-  {
-    wt_client1_->WaitForChangeCount(1);
-    EXPECT_EQ(
-        "VisibilityChanged window=" +
-            IdToString(BuildWindowId(
-                client_id_2(), ClientWindowIdFromTransportId(window_2_1))) +
-            " visible=false",
-        SingleChangeToDescription(*changes1()));
-  }
-
-  changes2()->clear();
-  // Remove client_id_1(),1 from the root, client 2 should see drawn state
-  // changed.
-  ASSERT_TRUE(wt_client1()->RemoveWindowFromParent(window_1_1));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("DrawnStateChanged window=" + IdToString(window12_in_wt2) +
-                  " drawn=false",
-              SingleChangeToDescription(*changes2()));
-  }
-
-  changes2()->clear();
-  // Add client_id_1(),1 back to the root, client 2 should see drawn state
-  // changed.
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("DrawnStateChanged window=" + IdToString(window12_in_wt2) +
-                  " drawn=true",
-              SingleChangeToDescription(*changes2()));
-  }
-}
-
-// Assertions for SetWindowVisibility sending notifications.
-TEST_F(WindowTreeClientTest, DISABLED_SetWindowVisibilityNotifications2) {
-  // Create client_id_1(),1 and client_id_1(),2. client_id_1(),2 is made a child
-  // of client_id_1(),1 and client_id_1(),1 a child of the root.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, true));
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_2);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_1, window_1_2));
-
-  // Establish the second client at client_id_1(),2.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClientWithRoot(window_1_2));
-  // window_1_2 has a client_id part of client_id_1 in wt2.
-  Id window12_in_wt2 =
-      BuildWindowId(client_id_1(), ClientWindowIdFromTransportId(window_1_2));
-  EXPECT_EQ("OnEmbed drawn=true", SingleChangeToDescription2(*changes2()));
-  changes2()->clear();
-
-  // Show client_id_1(),2 from client 1. Client 2 should see this.
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_2, true));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("VisibilityChanged window=" + IdToString(window12_in_wt2) +
-                  " visible=true",
-              SingleChangeToDescription(*changes2()));
-  }
-}
-
-// Assertions for SetWindowVisibility sending notifications.
-TEST_F(WindowTreeClientTest, DISABLED_SetWindowVisibilityNotifications3) {
-  // Create client_id_1(),1 and client_id_1(),2. client_id_1(),2 is made a child
-  // of client_id_1(),1 and client_id_1(),1 a child of the root.
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_2);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client1()->AddWindow(window_1_1, window_1_2));
-
-  // Establish the second client at client_id_1(),2.
-  // TODO(fsamuel): Currently the FrameSinkId maps directly to the server's
-  // window ID. This is likely bad from a security perspective and should be
-  // fixed.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClientWithRoot(window_1_2));
-  // window_1_2 has a client_id part of client_id_1 in wt2.
-  Id window12_in_wt2 =
-      BuildWindowId(client_id_1(), ClientWindowIdFromTransportId(window_1_2));
-  EXPECT_EQ("OnEmbed drawn=false", SingleChangeToDescription2(*changes2()));
-  changes2()->clear();
-
-  // Show client_id_1(),1, drawn should be true for client_id_1(),2 (as that is
-  // all the child sees).
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_1, true));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("DrawnStateChanged window=" + IdToString(window12_in_wt2) +
-                  " drawn=true",
-              SingleChangeToDescription(*changes2()));
-  }
-  changes2()->clear();
-
-  // Show client_id_1(),2, visible should be true.
-  ASSERT_TRUE(wt_client1()->SetWindowVisibility(window_1_2, true));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("VisibilityChanged window=" + IdToString(window12_in_wt2) +
-                  " visible=true",
-              SingleChangeToDescription(*changes2()));
-  }
-}
-
-// Tests that when opacity is set on a window, that the calling client is not
-// notified, however children are. Also that setting the same opacity is
-// rejected and no one is notified.
-TEST_F(WindowTreeClientTest, DISABLED_SetOpacityNotifications) {
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClientWithRoot(window_1_1));
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  // window_1_1 has a client_id part of client_id_1 in wt2.
-  Id window11_in_wt2 =
-      BuildWindowId(client_id_1(), ClientWindowIdFromTransportId(window_1_1));
-  ASSERT_TRUE(wt_client2()->AddWindow(window11_in_wt2, window_2_1));
-  ASSERT_TRUE(wt_client1()->WaitForAllMessages());
-
-  changes1()->clear();
-  changes2()->clear();
-  // Change opacity, no notification for calling client.
-  ASSERT_TRUE(wt_client1()->SetWindowOpacity(window_1_1, 0.5f));
-  EXPECT_TRUE(changes1()->empty());
-  wt_client2()->WaitForChangeCount(1);
-  EXPECT_EQ("OpacityChanged window_id=" + IdToString(window11_in_wt2) +
-                " opacity=0.50",
-            SingleChangeToDescription(*changes2()));
-
-  changes2()->clear();
-  // Attempting to set the same opacity should succeed, but no notification as
-  // there was no actual change.
-  ASSERT_TRUE(wt_client1()->SetWindowOpacity(window_1_1, 0.5f));
-  EXPECT_TRUE(changes1()->empty());
-  wt_client2()->WaitForAllMessages();
-  EXPECT_TRUE(changes2()->empty());
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_SetWindowProperty) {
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  ASSERT_TRUE(window_1_1);
-
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(false));
-  changes2()->clear();
-
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), root_window_id(), &windows);
-    ASSERT_EQ(2u, windows.size());
-    EXPECT_EQ(root_window_id(), windows[0].window_id);
-    EXPECT_EQ(window_1_1, windows[1].window_id);
-    ASSERT_EQ(0u, windows[1].properties.size());
-  }
-
-  // Set properties on 1.
-  changes2()->clear();
-  std::vector<uint8_t> one(1, '1');
-  ASSERT_TRUE(wt_client1()->SetWindowProperty(window_1_1, "one", &one));
-  // window_1_1 has a client_id part of client_id_1 in wt2.
-  Id window11_in_wt2 =
-      BuildWindowId(client_id_1(), ClientWindowIdFromTransportId(window_1_1));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("PropertyChanged window=" + IdToString(window11_in_wt2) +
-                  " key=one value=1",
-              SingleChangeToDescription(*changes2()));
-  }
-
-  // Test that our properties exist in the window tree
-  {
-    std::vector<TestWindow> windows;
-    GetWindowTree(wt1(), window_1_1, &windows);
-    ASSERT_EQ(1u, windows.size());
-    ASSERT_EQ(1u, windows[0].properties.size());
-    EXPECT_EQ(one, windows[0].properties["one"]);
-  }
-
-  changes2()->clear();
-  // Set back to null.
-  ASSERT_TRUE(wt_client1()->SetWindowProperty(window_1_1, "one", NULL));
-  {
-    wt_client2_->WaitForChangeCount(1);
-    EXPECT_EQ("PropertyChanged window=" + IdToString(window11_in_wt2) +
-                  " key=one value=NULL",
-              SingleChangeToDescription(*changes2()));
-  }
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_OnEmbeddedAppDisconnected) {
-  // Create client 2 and 3.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-  changes2()->clear();
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(wt2(), window_2_1));
-
-  // Client 1 should get a hierarchy change for window_2_1.
-  wt_client1_->WaitForChangeCount(1);
-  changes1()->clear();
-
-  // Close client 3. Client 2 (which had previously embedded 3) should
-  // be notified of this.
-  wt_client3_.reset();
-  wt_client2_->WaitForChangeCount(1);
-  EXPECT_EQ("OnEmbeddedAppDisconnected window=" + IdToString(window_2_1),
-            SingleChangeToDescription(*changes2()));
-
-  // The closing is only interesting to the root that did the embedding. Other
-  // clients should not be notified of this.
-  wt_client1_->WaitForAllMessages();
-  EXPECT_TRUE(changes1()->empty());
-}
-
-// Verifies when the parent of an Embed() is destroyed the embedded app gets
-// a WindowDeleted (and doesn't trigger a DCHECK).
-TEST_F(WindowTreeClientTest, DISABLED_OnParentOfEmbedDisconnects) {
-  // Create client 2 and 3.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  Id window_2_2 = wt_client2()->NewWindow(2);
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(window_2_2);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_1, window_2_2));
-  changes2()->clear();
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(wt2(), window_2_2));
-  changes3()->clear();
-
-  // Close client 2. Client 3 should get a delete (for its root).
-  wt_client2_.reset();
-  wt_client3_->WaitForChangeCount(1);
-  // window_2_2 has a client_id part of client_id_2 in wt3.
-  EXPECT_EQ("WindowDeleted window=" +
-                IdToString(BuildWindowId(
-                    client_id_2(), ClientWindowIdFromTransportId(window_2_2))),
-            SingleChangeToDescription(*changes3()));
-}
-
-// Verifies WindowTreeImpl doesn't incorrectly erase from its internal
-// map when a window from another client with the same window_id is removed.
-TEST_F(WindowTreeClientTest, DISABLED_DontCleanMapOnDestroy) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  ASSERT_TRUE(wt_client2()->NewWindow(1));
-  changes1()->clear();
-  wt_client2_.reset();
-  wt_client1_->WaitForChangeCount(1);
-  // window_1_1 is created by wt1 so client_id part would be 0.
-  EXPECT_EQ("OnEmbeddedAppDisconnected window=" +
-                IdToString(ClientWindowIdFromTransportId(window_1_1)),
-            SingleChangeToDescription(*changes1()));
-  std::vector<TestWindow> windows;
-  GetWindowTree(wt1(), window_1_1, &windows);
-  EXPECT_FALSE(windows.empty());
-}
-
-// Verifies Embed() works when supplying a WindowTreeClient.
-TEST_F(WindowTreeClientTest, EmbedSupplyingWindowTreeClient) {
-  ASSERT_TRUE(wt_client1()->NewWindow(1));
-
-  TestWindowTreeClient2 client2;
-  mojom::WindowTreeClientPtr client2_ptr;
-  mojo::Binding<WindowTreeClient> client2_binding(
-      &client2, mojo::MakeRequest(&client2_ptr));
-  ASSERT_TRUE(
-      Embed(wt1(), BuildWindowId(client_id_1(), 1), std::move(client2_ptr)));
-  client2.WaitForOnEmbed();
-  EXPECT_EQ("OnEmbed",
-            SingleChangeToDescription(*client2.tracker()->changes()));
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_EmbedUsingToken) {
-  // Embed client2.
-  ASSERT_TRUE(wt_client1()->NewWindow(1));
-  TestWindowTreeClient2 client2;
-  mojom::WindowTreeClientPtr client2_ptr;
-  mojo::Binding<WindowTreeClient> client2_binding(
-      &client2, mojo::MakeRequest(&client2_ptr));
-  ASSERT_TRUE(
-      Embed(wt1(), BuildWindowId(client_id_1(), 1), std::move(client2_ptr)));
-  client2.WaitForOnEmbed();
-  EXPECT_EQ("OnEmbed",
-            SingleChangeToDescription(*client2.tracker()->changes()));
-
-  // Schedule an embed of |client3| from wt1().
-  TestWindowTreeClient2 client3;
-  mojom::WindowTreeClientPtr client3_ptr;
-  mojo::Binding<WindowTreeClient> client3_binding(
-      &client3, mojo::MakeRequest(&client3_ptr));
-  base::UnguessableToken token;
-  ScheduleEmbed(wt1(), std::move(client3_ptr), &token);
-
-  // Have |client2| embed using the token scheduled above.
-  const Id window_id = client2.NewWindow(121);
-  ASSERT_TRUE(window_id);
-  ASSERT_TRUE(EmbedUsingToken(client2.tree(), BuildWindowId(client_id_2(), 121),
-                              token));
-  client3.WaitForOnEmbed();
-  EXPECT_EQ("OnEmbed",
-            SingleChangeToDescription(*client3.tracker()->changes()));
-
-  // EmbedUsingToken() should fail when passed a token that was already used.
-  EXPECT_FALSE(EmbedUsingToken(client2.tree(),
-                               BuildWindowId(client_id_2(), 121), token));
-
-  // EmbedUsingToken() should fail when passed a locally generated token.
-  EXPECT_FALSE(EmbedUsingToken(client2.tree(),
-                               BuildWindowId(client_id_2(), 121),
-                               base::UnguessableToken::Create()));
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_EmbedUsingTokenFailsWithInvalidWindow) {
-  // Embed client2.
-  ASSERT_TRUE(wt_client1()->NewWindow(1));
-  TestWindowTreeClient2 client2;
-  mojom::WindowTreeClientPtr client2_ptr;
-  mojo::Binding<WindowTreeClient> client2_binding(
-      &client2, mojo::MakeRequest(&client2_ptr));
-  ASSERT_TRUE(
-      Embed(wt1(), BuildWindowId(client_id_1(), 1), std::move(client2_ptr)));
-  client2.WaitForOnEmbed();
-  EXPECT_EQ("OnEmbed",
-            SingleChangeToDescription(*client2.tracker()->changes()));
-
-  // Schedule an embed of |client3| from wt1().
-  TestWindowTreeClient2 client3;
-  mojom::WindowTreeClientPtr client3_ptr;
-  mojo::Binding<WindowTreeClient> client3_binding(
-      &client3, mojo::MakeRequest(&client3_ptr));
-  base::UnguessableToken token;
-  ScheduleEmbed(wt1(), std::move(client3_ptr), &token);
-
-  // This should fail as the window id does not identify a valid window.
-  EXPECT_FALSE(EmbedUsingToken(client2.tree(),
-                               BuildWindowId(client_id_2(), 121), token));
-}
-
-TEST_F(WindowTreeClientTest, EmbedFailsFromOtherClient) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(wt2(), window_2_1));
-
-  Id window_3_3 = wt_client3()->NewWindow(3);
-  ASSERT_TRUE(window_3_3);
-  // window_2_1 should have client_id of client_id_2 in wt_client3.
-  ASSERT_TRUE(wt_client3()->AddWindow(
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_1)),
-      window_3_3));
-
-  // 2 should not be able to embed in window_3_3 as window_3_3 was not created
-  // by
-  // 2.
-  EXPECT_FALSE(EmbedUrl(connector(), wt2(), test_name(), window_3_3));
-}
-
-// Verifies Embed() from window manager on another clients window works.
-TEST_F(WindowTreeClientTest, DISABLED_EmbedFromOtherClient) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  ASSERT_TRUE(window_2_1);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-
-  changes2()->clear();
-
-  // Establish a third client in window_2_1. window_2_1 has a client_id of
-  // client_id_2 for other clients.
-  ASSERT_NO_FATAL_FAILURE(EstablishThirdClient(
-      wt1(),
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_1))));
-
-  ASSERT_TRUE(wt_client2()->WaitForAllMessages());
-  EXPECT_EQ(std::string(), SingleChangeToDescription(*changes2()));
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_CantEmbedFromClientRoot) {
-  // Shouldn't be able to embed into the root.
-  ASSERT_FALSE(EmbedUrl(connector(), wt1(), test_name(), root_window_id()));
-
-  // Even though the call above failed a WindowTreeClient was obtained. We need
-  // to
-  // wait for it else we throw off the next connect.
-  WaitForWindowTreeClient();
-
-  // Don't allow a client to embed into its own root.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  EXPECT_FALSE(EmbedUrl(connector(), wt2(), test_name(),
-                        BuildWindowId(client_id_1(), 1)));
-
-  // Need to wait for a WindowTreeClient for same reason as above.
-  WaitForWindowTreeClient();
-
-  Id window_1_2 = wt_client1()->NewWindow(2);
-  ASSERT_TRUE(window_1_2);
-  ASSERT_TRUE(
-      wt_client1()->AddWindow(BuildWindowId(client_id_1(), 1), window_1_2));
-  ASSERT_TRUE(wt_client3_.get() == nullptr);
-  wt_client3_ = EstablishClientViaEmbedWithPolicyBitmask(wt1(), window_1_2);
-  ASSERT_TRUE(wt_client3_.get() != nullptr);
-
-  // window_1_2 is ws3's root, so even though v3 is an embed root it should not
-  // be able to Embed into itself.
-  ASSERT_FALSE(EmbedUrl(connector(), wt3(), test_name(), window_1_2));
-}
-
-// Verifies that a transient window tracks its parent's lifetime.
-TEST_F(WindowTreeClientTest,
-       DISABLED_TransientWindowTracksTransientParentLifetime) {
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClient(true));
-  Id window_1_1 = BuildWindowId(client_id_1(), 1);
-
-  Id window_2_1 = wt_client2()->NewWindow(1);
-  Id window_2_2 = wt_client2()->NewWindow(2);
-  Id window_2_3 = wt_client2()->NewWindow(3);
-  ASSERT_TRUE(window_2_1);
-  // window_2_* has a client_id part of client_id_2 in wt1.
-  Id window21_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_1));
-  Id window22_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_2));
-  Id window23_in_wt1 =
-      BuildWindowId(client_id_2(), ClientWindowIdFromTransportId(window_2_3));
-
-  // root -> window_1_1 -> window_2_1
-  // root -> window_1_1 -> window_2_2
-  // root -> window_1_1 -> window_2_3
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_1));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_2));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_1, window_2_3));
-
-  // window_2_2 and window_2_3 now track the lifetime of window_2_1.
-  changes1()->clear();
-  wt2()->AddTransientWindow(10, window_2_1, window_2_2);
-  wt2()->AddTransientWindow(11, window_2_1, window_2_3);
-  wt_client1()->WaitForChangeCount(2);
-  EXPECT_EQ("AddTransientWindow parent = " + IdToString(window21_in_wt1) +
-                " child = " + IdToString(window22_in_wt1),
-            ChangesToDescription1(*changes1())[0]);
-  EXPECT_EQ("AddTransientWindow parent = " + IdToString(window21_in_wt1) +
-                " child = " + IdToString(window23_in_wt1),
-            ChangesToDescription1(*changes1())[1]);
-
-  changes1()->clear();
-  wt2()->RemoveTransientWindowFromParent(12, window_2_3);
-  wt_client1()->WaitForChangeCount(1);
-  EXPECT_EQ("RemoveTransientWindowFromParent parent = " +
-                IdToString(window21_in_wt1) +
-                " child = " + IdToString(window23_in_wt1),
-            SingleChangeToDescription(*changes1()));
-
-  changes1()->clear();
-  ASSERT_TRUE(wt_client2()->DeleteWindow(window_2_1));
-  wt_client1()->WaitForChangeCount(2);
-  EXPECT_EQ("WindowDeleted window=" + IdToString(window22_in_wt1),
-            ChangesToDescription1(*changes1())[0]);
-  EXPECT_EQ("WindowDeleted window=" + IdToString(window21_in_wt1),
-            ChangesToDescription1(*changes1())[1]);
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_Ids) {
-  const Id window_1_100 = wt_client1()->NewWindow(100);
-  ASSERT_TRUE(window_1_100);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_100));
-
-  // Establish the second client at client_id_1(),100.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClientWithRoot(window_1_100));
-
-  // client_id_1(),100 is the id in the wt_client1's id space. The new client
-  // should see client_id_2(),1 (the server id).
-  const Id window_1_100_in_ws2 = BuildWindowId(client_id_1(), 100);
-  EXPECT_EQ(window_1_100_in_ws2, wt_client2()->root_window_id());
-
-  // The first window created in the second client gets a server id of
-  // client_id_2(),1 regardless of the id the client uses.
-  const Id window_2_101 = wt_client2()->NewWindow(101);
-  ASSERT_TRUE(wt_client2()->AddWindow(window_1_100_in_ws2, window_2_101));
-  const Id window_2_101_in_ws1 = BuildWindowId(client_id_2(), 101);
-  wt_client1()->WaitForChangeCount(1);
-  EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_101_in_ws1) +
-                " old_parent=null new_parent=" + IdToString(window_1_100),
-            SingleChangeToDescription(*changes1()));
-  changes1()->clear();
-
-  // Change the bounds of window_2_101 and make sure server gets it.
-  wt2()->SetWindowBounds(11, window_2_101, gfx::Rect(1, 2, 3, 4),
-                         base::nullopt);
-  ASSERT_TRUE(wt_client2()->WaitForChangeCompleted(11));
-  wt_client1()->WaitForChangeCount(1);
-  EXPECT_EQ(
-      "BoundsChanged window=" + IdToString(window_2_101_in_ws1) +
-          " old_bounds=0,0 0x0 new_bounds=1,2 3x4 local_surface_id=(none)",
-      SingleChangeToDescription(*changes1()));
-  changes2()->clear();
-
-  // Remove 2_101 from wm, client1 should see the change.
-  wt1()->RemoveWindowFromParent(12, window_2_101_in_ws1);
-  ASSERT_TRUE(wt_client1()->WaitForChangeCompleted(12));
-  wt_client2()->WaitForChangeCount(1);
-  EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_101) +
-                " old_parent=" + IdToString(window_1_100_in_ws2) +
-                " new_parent=null",
-            SingleChangeToDescription(*changes2()));
-}
-
-// Tests that setting capture fails when no input event has occurred, and there
-// is no notification of lost capture.
-TEST_F(WindowTreeClientTest, ExplicitCaptureWithoutInput) {
-  Id window_1_1 = wt_client1()->NewWindow(1);
-
-  // Add the window to the root, so that they have a Display to handle input
-  // capture.
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  changes1()->clear();
-
-  // Since there has been no input, capture should not succeed. No lost capture
-  // message is expected.
-  wt1()->SetCapture(1, window_1_1);
-  wt_client1_->WaitForAllMessages();
-  EXPECT_TRUE(changes1()->empty());
-
-  // Since there is no window with capture, lost capture should not be notified.
-  wt1()->ReleaseCapture(3, window_1_1);
-  wt_client1_->WaitForAllMessages();
-  EXPECT_TRUE(changes1()->empty());
-}
-
-// TODO(jonross): Enable this once apptests can send input events to the server.
-// Enabling capture requires that the client be processing events.
-TEST_F(WindowTreeClientTest, DISABLED_ExplicitCapturePropagation) {
-  Id window_1_1 = wt_client1()->NewWindow(1);
-  Id window_1_2 = wt_client1()->NewWindow(2);
-
-  // Add the windows to the root, so that they have a Display to handle input
-  // capture.
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_1));
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_2));
-
-  changes1()->clear();
-  // Window 1 takes capture then Window 2 takes capture.
-  // Verify that window 1 has lost capture.
-  wt1()->SetCapture(1, window_1_1);
-  wt1()->SetCapture(2, window_1_2);
-  wt_client1_->WaitForChangeCount(1);
-
-  EXPECT_EQ("OnLostCapture window=" + IdToString(window_1_1),
-            SingleChangeToDescription(*changes1()));
-
-  changes1()->clear();
-  // Explicitly releasing capture should not notify of lost capture.
-  wt1()->ReleaseCapture(3, window_1_2);
-  wt_client1_->WaitForAllMessages();
-
-  EXPECT_TRUE(changes1()->empty());
-}
-
-// Verifies when an unknown window with a known child is added to a hierarchy
-// the known child is identified in the WindowData.
-TEST_F(WindowTreeClientTest, DISABLED_AddUnknownWindowKnownParent) {
-  const Id window_1_100 = wt_client1()->NewWindow(100);
-  ASSERT_TRUE(window_1_100);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window_1_100));
-
-  // Establish the second client at client_id_1(),100.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClientWithRoot(window_1_100));
-  const Id window_2_1 = wt_client2()->NewWindow(1000);
-  const Id window_2_2 = wt_client2()->NewWindow(2000);
-  // Add 2_1 to the root, remove 2_1, add 2_1 to 2_2 and then 2_2 to the parent.
-  ASSERT_TRUE(
-      wt_client2()->AddWindow(wt_client2()->root_window_id(), window_2_1));
-  ASSERT_TRUE(wt_client2()->RemoveWindowFromParent(window_2_1));
-  ASSERT_TRUE(wt_client2()->AddWindow(window_2_2, window_2_1));
-  wt_client1()->WaitForChangeCount(2);
-  changes1()->clear();
-  ASSERT_TRUE(
-      wt_client2()->AddWindow(wt_client2()->root_window_id(), window_2_2));
-  wt_client1()->WaitForChangeCount(1);
-  const Id window_2_1_in_wm = BuildWindowId(client_id_2(), 1000);
-  const Id window_2_2_in_wm = BuildWindowId(client_id_2(), 2000);
-  EXPECT_EQ("HierarchyChanged window=" + IdToString(window_2_2_in_wm) +
-                " old_parent=null new_parent=" + IdToString(window_1_100),
-            SingleChangeToDescription(*changes1()));
-  EXPECT_EQ("[window=" + IdToString(window_2_2_in_wm) +
-                " parent=" + IdToString(window_1_100) +
-                "],[window=" + IdToString(window_2_1_in_wm) +
-                " parent=" + IdToString(window_2_2_in_wm) + "]",
-            ChangeWindowDescription(*changes1()));
-}
-
-TEST_F(WindowTreeClientTest, DISABLED_Transform) {
-  const Id window1 = wt_client1()->NewWindow(100);
-  ASSERT_TRUE(window1);
-  ASSERT_TRUE(wt_client1()->AddWindow(root_window_id(), window1));
-
-  // Establish the second client at |window1|.
-  ASSERT_NO_FATAL_FAILURE(EstablishSecondClientWithRoot(window1));
-
-  // The first window created in the second client gets a server id of
-  // client_id_2(),1 regardless of the id the client uses.
-  const Id window1_in_client2 = BuildWindowId(client_id_1(), 100);
-  const Id window2 = wt_client2()->NewWindow(11);
-  ASSERT_TRUE(wt_client2()->AddWindow(window1_in_client2, window2));
-  const Id window2_in_client1 = BuildWindowId(client_id_2(), 11);
-  wt_client1()->WaitForChangeCount(1);
-  changes1()->clear();
-
-  // Change the transform of |window2| and make sure server gets it.
-  gfx::Transform transform;
-  transform.Scale(SkIntToMScalar(2), SkIntToMScalar(2));
-  const uint32_t transform_change_id = 12;
-  wt2()->SetWindowTransform(transform_change_id, window2, transform);
-  ASSERT_TRUE(wt_client2()->WaitForChangeCompleted(transform_change_id));
-  wt_client1()->WaitForChangeCount(1);
-  EXPECT_EQ("TransformChanged window_id=" + IdToString(window2_in_client1),
-            SingleChangeToDescription(*changes1()));
-}
-
-// TODO(sky): need to better track changes to initial client. For example,
-// that SetBounsdWindows/AddWindow and the like don't result in messages to the
-// originating client.
-
-// TODO(sky): make sure coverage of what was
-// WindowManagerTest.SecondEmbedRoot_InitService and
-// WindowManagerTest.MultipleEmbedRootsBeforeWTHReady gets added to window
-// manager
-// tests.
-
-}  // namespace test
-}  // namespace ws
diff --git a/services/ws/window_tree_factory.cc b/services/ws/window_tree_factory.cc
deleted file mode 100644
index a0b24fc0..0000000
--- a/services/ws/window_tree_factory.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ws/window_tree_factory.h"
-
-#include <stddef.h>
-
-#include "base/bind.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_tree_binding.h"
-
-namespace ws {
-
-WindowTreeFactory::WindowTreeFactory(WindowService* window_service)
-    : window_service_(window_service) {}
-
-WindowTreeFactory::~WindowTreeFactory() = default;
-
-void WindowTreeFactory::AddBinding(mojom::WindowTreeFactoryRequest request,
-                                   const std::string& client_name) {
-  bindings_.AddBinding(this, std::move(request), client_name);
-}
-
-void WindowTreeFactory::CreateWindowTree(mojom::WindowTreeRequest tree_request,
-                                         mojom::WindowTreeClientPtr client) {
-  std::unique_ptr<WindowTreeBinding> binding =
-      std::make_unique<WindowTreeBinding>();
-  binding->InitFromFactory(
-      window_service_, bindings_.dispatch_context(), std::move(tree_request),
-      std::move(client),
-      base::BindOnce(&WindowTreeFactory::OnLostConnectionToClient,
-                     base::Unretained(this), binding.get()));
-  window_tree_bindings_.push_back(std::move(binding));
-}
-
-void WindowTreeFactory::OnLostConnectionToClient(WindowTreeBinding* binding) {
-  for (auto iter = window_tree_bindings_.begin();
-       iter != window_tree_bindings_.end(); ++iter) {
-    if (iter->get() == binding) {
-      window_tree_bindings_.erase(iter);
-      return;
-    }
-  }
-  NOTREACHED();
-}
-
-}  // namespace ws
diff --git a/services/ws/window_tree_factory.h b/services/ws/window_tree_factory.h
deleted file mode 100644
index bd4192c..0000000
--- a/services/ws/window_tree_factory.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_TREE_FACTORY_H_
-#define SERVICES_WS_WINDOW_TREE_FACTORY_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/component_export.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-
-namespace ws {
-
-class WindowService;
-class WindowTreeBinding;
-
-// Implementation of mojom::WindowTreeFactory. This creates a
-// WindowTreeBinding for each request for a WindowTree. Any WindowTreeBindings
-// created by WindowTreeFactory are owned by the WindowTreeFactory.
-class COMPONENT_EXPORT(WINDOW_SERVICE) WindowTreeFactory
-    : public mojom::WindowTreeFactory {
- public:
-  explicit WindowTreeFactory(WindowService* window_service);
-  ~WindowTreeFactory() override;
-
-  // |client_name| is the name of the client requesting the factory.
-  void AddBinding(mojom::WindowTreeFactoryRequest request,
-                  const std::string& client_name);
-
-  // mojom::WindowTreeFactory:
-  void CreateWindowTree(mojom::WindowTreeRequest tree_request,
-                        mojom::WindowTreeClientPtr client) override;
-
- private:
-  void OnLostConnectionToClient(WindowTreeBinding* binding);
-
-  using WindowTreeBindings = std::vector<std::unique_ptr<WindowTreeBinding>>;
-
-  WindowService* window_service_;
-
-  // The |string| parameter is the name of the client that created by binding.
-  mojo::BindingSet<mojom::WindowTreeFactory, std::string> bindings_;
-
-  WindowTreeBindings window_tree_bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowTreeFactory);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_TREE_FACTORY_H_
diff --git a/services/ws/window_tree_test_helper.cc b/services/ws/window_tree_test_helper.cc
deleted file mode 100644
index 6da0467c..0000000
--- a/services/ws/window_tree_test_helper.cc
+++ /dev/null
@@ -1,197 +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.
-
-#include "services/ws/window_tree_test_helper.h"
-
-#include "services/ws/proxy_window.h"
-#include "services/ws/window_tree_binding.h"
-
-namespace ws {
-
-WindowTreeTestHelper::WindowTreeTestHelper(WindowTree* window_tree)
-    : window_tree_(window_tree) {}
-
-WindowTreeTestHelper::~WindowTreeTestHelper() = default;
-
-mojom::WindowTree* WindowTreeTestHelper::window_tree() {
-  return static_cast<mojom::WindowTree*>(window_tree_);
-}
-
-mojom::WindowDataPtr WindowTreeTestHelper::WindowToWindowData(
-    aura::Window* window) {
-  return window_tree_->WindowToWindowData(window);
-}
-
-aura::Window* WindowTreeTestHelper::NewWindow(
-    Id transport_window_id,
-    base::flat_map<std::string, std::vector<uint8_t>> properties) {
-  if (transport_window_id == 0)
-    transport_window_id = next_window_id_++;
-  const uint32_t change_id = 1u;
-  window_tree_->NewWindow(change_id, transport_window_id, properties);
-  return window_tree_->GetWindowByClientId(
-      window_tree_->MakeClientWindowId(transport_window_id));
-}
-
-void WindowTreeTestHelper::DeleteWindow(aura::Window* window) {
-  const int change_id = 1u;
-  window_tree_->DeleteWindow(change_id, TransportIdForWindow(window));
-}
-
-aura::Window* WindowTreeTestHelper::NewTopLevelWindow(
-    Id transport_window_id,
-    base::flat_map<std::string, std::vector<uint8_t>> properties) {
-  if (transport_window_id == 0)
-    transport_window_id = next_window_id_++;
-  const uint32_t change_id = 1u;
-  window_tree_->NewTopLevelWindow(change_id, transport_window_id, properties);
-  return window_tree_->GetWindowByClientId(
-      window_tree_->MakeClientWindowId(transport_window_id));
-}
-
-aura::Window* WindowTreeTestHelper::NewTopLevelWindow(
-    const base::flat_map<std::string, std::vector<uint8_t>>& properties) {
-  return NewTopLevelWindow(0u, properties);
-}
-
-bool WindowTreeTestHelper::SetCapture(aura::Window* window) {
-  return window_tree_->SetCaptureImpl(ClientWindowIdForWindow(window));
-}
-
-bool WindowTreeTestHelper::ReleaseCapture(aura::Window* window) {
-  return window_tree_->ReleaseCaptureImpl(ClientWindowIdForWindow(window));
-}
-
-bool WindowTreeTestHelper::ReorderWindow(aura::Window* window,
-                                         aura::Window* relative_window,
-                                         mojom::OrderDirection direction) {
-  return window_tree_->ReorderWindowImpl(
-      ClientWindowIdForWindow(window), ClientWindowIdForWindow(relative_window),
-      direction);
-}
-
-bool WindowTreeTestHelper::SetTransform(aura::Window* window,
-                                        const gfx::Transform& transform) {
-  return window_tree_->SetWindowTransformImpl(ClientWindowIdForWindow(window),
-                                              transform);
-}
-
-bool WindowTreeTestHelper::SetWindowBounds(
-    aura::Window* window,
-    const gfx::Rect& bounds,
-    const base::Optional<viz::LocalSurfaceIdAllocation>&
-        local_surface_id_allocation) {
-  return window_tree_->SetWindowBoundsImpl(ClientWindowIdForWindow(window),
-                                           bounds, local_surface_id_allocation);
-}
-
-void WindowTreeTestHelper::SetWindowBoundsWithAck(
-    aura::Window* window,
-    const gfx::Rect& bounds,
-    const base::Optional<viz::LocalSurfaceIdAllocation>&
-        local_surface_id_allocation,
-    uint32_t change_id) {
-  window_tree_->SetWindowBounds(change_id, TransportIdForWindow(window), bounds,
-                                local_surface_id_allocation);
-}
-
-void WindowTreeTestHelper::SetClientArea(
-    aura::Window* window,
-    const gfx::Insets& insets,
-    base::Optional<std::vector<gfx::Rect>> additional_client_areas) {
-  window_tree_->SetClientArea(TransportIdForWindow(window), insets,
-                              additional_client_areas);
-}
-
-void WindowTreeTestHelper::SetHitTestInsets(aura::Window* window,
-                                            const gfx::Insets& mouse,
-                                            const gfx::Insets& touch) {
-  window_tree_->SetHitTestInsets(TransportIdForWindow(window), mouse, touch);
-}
-
-void WindowTreeTestHelper::SetShape(aura::Window* window,
-                                    const std::vector<gfx::Rect>& shape) {
-  window_tree_->SetShape(TransportIdForWindow(window), shape);
-}
-
-bool WindowTreeTestHelper::SetWindowVisibility(aura::Window* window,
-                                               bool visible) {
-  return window_tree_->SetWindowVisibilityImpl(ClientWindowIdForWindow(window),
-                                               visible);
-}
-
-void WindowTreeTestHelper::SetWindowProperty(aura::Window* window,
-                                             const std::string& name,
-                                             const std::vector<uint8_t>& value,
-                                             uint32_t change_id) {
-  window_tree_->SetWindowProperty(change_id, TransportIdForWindow(window), name,
-                                  value);
-}
-
-Embedding* WindowTreeTestHelper::Embed(aura::Window* window,
-                                       mojom::WindowTreeClientPtr client_ptr,
-                                       mojom::WindowTreeClient* client,
-                                       uint32_t embed_flags) {
-  if (!window_tree_->EmbedImpl(ClientWindowIdForWindow(window),
-                               std::move(client_ptr), client, embed_flags)) {
-    return nullptr;
-  }
-  return ProxyWindow::GetMayBeNull(window)->embedding();
-}
-
-void WindowTreeTestHelper::SetEventTargetingPolicy(
-    aura::Window* window,
-    mojom::EventTargetingPolicy policy) {
-  window_tree_->SetEventTargetingPolicy(TransportIdForWindow(window), policy);
-}
-
-void WindowTreeTestHelper::OnWindowInputEventAck(uint32_t event_id,
-                                                 mojom::EventResult result) {
-  window_tree_->OnWindowInputEventAck(event_id, result);
-}
-
-bool WindowTreeTestHelper::StackAbove(aura::Window* above_window,
-                                      aura::Window* below_window) {
-  return window_tree_->StackAboveImpl(ClientWindowIdForWindow(above_window),
-                                      ClientWindowIdForWindow(below_window));
-}
-
-bool WindowTreeTestHelper::StackAtTop(aura::Window* window) {
-  return window_tree_->StackAtTopImpl(ClientWindowIdForWindow(window));
-}
-
-Id WindowTreeTestHelper::TransportIdForWindow(aura::Window* window) {
-  return window ? window_tree_->TransportIdForWindow(window)
-                : kInvalidTransportId;
-}
-
-bool WindowTreeTestHelper::SetFocus(aura::Window* window) {
-  return window_tree_->SetFocusImpl(ClientWindowIdForWindow(window));
-}
-
-void WindowTreeTestHelper::SetCanFocus(aura::Window* window, bool can_focus) {
-  window_tree_->SetCanFocus(window_tree_->TransportIdForWindow(window),
-                            can_focus);
-}
-
-void WindowTreeTestHelper::SetCursor(aura::Window* window, ui::Cursor cursor) {
-  window_tree_->SetCursorImpl(ClientWindowIdForWindow(window), cursor);
-}
-
-void WindowTreeTestHelper::DestroyEmbedding(Embedding* embedding) {
-  // Triggers WindowTree deleting the Embedding.
-  window_tree_->OnEmbeddedClientConnectionLost(embedding);
-}
-
-aura::Window* WindowTreeTestHelper::GetWindowByClientId(
-    const ClientWindowId& id) {
-  return window_tree_->GetWindowByClientId(id);
-}
-
-ClientWindowId WindowTreeTestHelper::ClientWindowIdForWindow(
-    aura::Window* window) {
-  return window_tree_->MakeClientWindowId(TransportIdForWindow(window));
-}
-
-}  // namespace ws
diff --git a/services/ws/window_tree_test_helper.h b/services/ws/window_tree_test_helper.h
deleted file mode 100644
index 8d507a83..0000000
--- a/services/ws/window_tree_test_helper.h
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_WS_WINDOW_TREE_TEST_HELPER_H_
-#define SERVICES_WS_WINDOW_TREE_TEST_HELPER_H_
-
-#include <string>
-#include <vector>
-
-#include "base/containers/flat_map.h"
-#include "base/macros.h"
-#include "base/optional.h"
-#include "services/ws/ids.h"
-#include "services/ws/public/mojom/window_tree.mojom.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "services/ws/window_tree.h"
-#include "ui/gfx/geometry/rect.h"
-
-namespace aura {
-class Window;
-}
-
-namespace gfx {
-class Insets;
-class Transform;
-}
-
-namespace ui {
-
-namespace mojom {
-class WindowTree;
-
-enum class EventTargetingPolicy;
-}  // namespace mojom
-
-}  // namespace ui
-
-namespace ws {
-
-class Embedding;
-
-// Used for accessing private members of WindowTree in tests.
-class WindowTreeTestHelper {
- public:
-  explicit WindowTreeTestHelper(WindowTree* window_tree);
-  ~WindowTreeTestHelper();
-
-  mojom::WindowTree* window_tree();
-
-  ClientSpecificId client_id() const { return window_tree_->client_id_; }
-
-  mojom::WindowDataPtr WindowToWindowData(aura::Window* window);
-
-  aura::Window* NewWindow(
-      Id transport_window_id = 0,
-      base::flat_map<std::string, std::vector<uint8_t>> properties = {});
-  void DeleteWindow(aura::Window* window);
-  aura::Window* NewTopLevelWindow(
-      Id transport_window_id = 0,
-      base::flat_map<std::string, std::vector<uint8_t>> properties = {});
-  aura::Window* NewTopLevelWindow(
-      const base::flat_map<std::string, std::vector<uint8_t>>& properties);
-  bool SetCapture(aura::Window* window);
-  bool ReleaseCapture(aura::Window* window);
-  bool ReorderWindow(aura::Window* window,
-                     aura::Window* relative_window,
-                     mojom::OrderDirection direction);
-  bool SetTransform(aura::Window* window, const gfx::Transform& transform);
-  bool SetWindowBounds(aura::Window* window,
-                       const gfx::Rect& bounds,
-                       const base::Optional<viz::LocalSurfaceIdAllocation>&
-                           local_surface_id_allocation =
-                               base::Optional<viz::LocalSurfaceIdAllocation>());
-  // Same as SetWindowBounds(), but called in such a way that the ack
-  // (OnChangeCompleted()) is called on the client.
-  void SetWindowBoundsWithAck(
-      aura::Window* window,
-      const gfx::Rect& bounds,
-      const base::Optional<viz::LocalSurfaceIdAllocation>&
-          local_surface_id_allocation =
-              base::Optional<viz::LocalSurfaceIdAllocation>(),
-      uint32_t change_id = 1);
-  void SetClientArea(
-      aura::Window* window,
-      const gfx::Insets& insets,
-      base::Optional<std::vector<gfx::Rect>> additional_client_areas =
-          base::Optional<std::vector<gfx::Rect>>());
-  void SetHitTestInsets(aura::Window* window,
-                        const gfx::Insets& mouse,
-                        const gfx::Insets& touch);
-  void SetShape(aura::Window* window, const std::vector<gfx::Rect>& shape);
-  bool SetWindowVisibility(aura::Window* window, bool visible);
-  void SetWindowProperty(aura::Window* window,
-                         const std::string& name,
-                         const std::vector<uint8_t>& value,
-                         uint32_t change_id = 1);
-
-  // Creates a new embedding. On success the new Embedding is returned. The
-  // returned Embedding is owned by the ProxyWindow for |window|.
-  Embedding* Embed(aura::Window* window,
-                   mojom::WindowTreeClientPtr client_ptr,
-                   mojom::WindowTreeClient* client,
-                   uint32_t embed_flags = 0);
-  void SetEventTargetingPolicy(aura::Window* window,
-                               mojom::EventTargetingPolicy policy);
-  bool SetFocus(aura::Window* window);
-  void SetCanFocus(aura::Window* window, bool can_focus);
-  void SetCursor(aura::Window* window, ui::Cursor cursor);
-  void OnWindowInputEventAck(uint32_t event_id, mojom::EventResult result);
-  bool StackAbove(aura::Window* above_window, aura::Window* below_window);
-  bool StackAtTop(aura::Window* window);
-
-  Id TransportIdForWindow(aura::Window* window);
-
-  void DestroyEmbedding(Embedding* embedding);
-
-  aura::Window* GetWindowByClientId(const ClientWindowId& id);
-  ClientWindowId ClientWindowIdForWindow(aura::Window* window);
-
-  const std::queue<std::unique_ptr<WindowTree::InFlightEvent>>&
-  in_flight_key_events() {
-    return window_tree_->in_flight_key_events_;
-  }
-  const std::queue<std::unique_ptr<WindowTree::InFlightEvent>>&
-  in_flight_other_events() {
-    return window_tree_->in_flight_other_events_;
-  }
-  void ConnectToImeEngine(ime::mojom::ImeEngineRequest engine_request,
-                          ime::mojom::ImeEngineClientPtr client) {
-    window_tree_->ConnectToImeEngine(std::move(engine_request),
-                                     std::move(client));
-  }
-
- private:
-  WindowTree* window_tree_;
-
-  // Next id to use for creating a window (including top-level windows).
-  Id next_window_id_ = 1;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowTreeTestHelper);
-};
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_TREE_TEST_HELPER_H_
diff --git a/services/ws/window_tree_unittest.cc b/services/ws/window_tree_unittest.cc
deleted file mode 100644
index 6dc180e..0000000
--- a/services/ws/window_tree_unittest.cc
+++ /dev/null
@@ -1,2630 +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.
-
-#include "services/ws/window_tree.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <queue>
-
-#include "base/bind.h"
-#include "base/run_loop.h"
-#include "base/unguessable_token.h"
-#include "components/viz/common/surfaces/child_local_surface_id_allocator.h"
-#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
-#include "components/viz/host/host_frame_sink_manager.h"
-#include "components/viz/test/fake_host_frame_sink_client.h"
-#include "services/ws/client_root_test_helper.h"
-#include "services/ws/event_test_utils.h"
-#include "services/ws/proxy_window.h"
-#include "services/ws/proxy_window_test_helper.h"
-#include "services/ws/public/cpp/property_type_converters.h"
-#include "services/ws/public/mojom/window_manager.mojom.h"
-#include "services/ws/window_service.h"
-#include "services/ws/window_service_test_setup.h"
-#include "services/ws/window_tree_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/env.h"
-#include "ui/aura/layout_manager.h"
-#include "ui/aura/mus/client_surface_embedder.h"
-#include "ui/aura/test/aura_test_helper.h"
-#include "ui/aura/test/test_screen.h"
-#include "ui/aura/test/test_window_delegate.h"
-#include "ui/aura/test/test_window_parenting_client.h"
-#include "ui/aura/test/window_occlusion_tracker_test_api.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tracker.h"
-#include "ui/base/hit_test.h"
-#include "ui/events/mojo/event_constants.mojom.h"
-#include "ui/events/test/event_generator.h"
-#include "ui/gfx/transform.h"
-#include "ui/wm/core/capture_controller.h"
-#include "ui/wm/core/default_screen_position_client.h"
-#include "ui/wm/core/focus_controller.h"
-#include "ui/wm/core/window_util.h"
-
-namespace ws {
-namespace {
-
-DEFINE_UI_CLASS_PROPERTY_KEY(aura::Window*, kTestPropertyKey, nullptr)
-const char kTestPropertyServerKey[] = "test-property-server";
-
-// Passed to Embed() to give the default behavior (see kEmbedFlag* in mojom for
-// details).
-constexpr uint32_t kDefaultEmbedFlags = 0;
-
-class TestLayoutManager : public aura::LayoutManager {
- public:
-  TestLayoutManager() = default;
-  ~TestLayoutManager() override = default;
-
-  void set_next_bounds(const gfx::Rect& bounds) { next_bounds_ = bounds; }
-
-  // aura::LayoutManager:
-  void OnWindowResized() override {}
-  void OnWindowAddedToLayout(aura::Window* child) override {}
-  void OnWillRemoveWindowFromLayout(aura::Window* child) override {}
-  void OnWindowRemovedFromLayout(aura::Window* child) override {}
-  void OnChildWindowVisibilityChanged(aura::Window* child,
-                                      bool visible) override {}
-  void SetChildBounds(aura::Window* child,
-                      const gfx::Rect& requested_bounds) override {
-    if (next_bounds_) {
-      SetChildBoundsDirect(child, *next_bounds_);
-      next_bounds_.reset();
-    } else {
-      SetChildBoundsDirect(child, requested_bounds);
-    }
-  }
-
- private:
-  base::Optional<gfx::Rect> next_bounds_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestLayoutManager);
-};
-
-// Used as callback from ScheduleEmbed().
-void ScheduleEmbedCallback(base::UnguessableToken* result_token,
-                           const base::UnguessableToken& actual_token) {
-  *result_token = actual_token;
-}
-
-// Used as callback to EmbedUsingToken().
-void EmbedUsingTokenCallback(bool* was_called,
-                             bool* result_value,
-                             bool actual_result) {
-  *was_called = true;
-  *result_value = actual_result;
-}
-
-// A screen position client with a fixed screen offset applied via SetBounds.
-class TestScreenPositionClient : public wm::DefaultScreenPositionClient {
- public:
-  explicit TestScreenPositionClient(const gfx::Vector2d& offset)
-      : offset_(offset) {}
-  ~TestScreenPositionClient() override = default;
-
-  // wm::DefaultScreenPositionClient:
-  void ConvertPointToScreen(const aura::Window* window,
-                            gfx::PointF* point) override {
-    wm::DefaultScreenPositionClient::ConvertPointToScreen(window, point);
-    *point += offset_;
-  }
-  void ConvertPointFromScreen(const aura::Window* window,
-                              gfx::PointF* point) override {
-    *point -= offset_;
-    wm::DefaultScreenPositionClient::ConvertPointFromScreen(window, point);
-  }
-  void SetBounds(aura::Window* window,
-                 const gfx::Rect& bounds,
-                 const display::Display& display) override {
-    EXPECT_EQ(display, display::Screen::GetScreen()->GetPrimaryDisplay());
-    gfx::Rect offset_bounds = bounds;
-    offset_bounds.Offset(-offset_);
-    wm::DefaultScreenPositionClient::SetBounds(window, offset_bounds, display);
-  }
-
- private:
-  const gfx::Vector2d offset_;
-  DISALLOW_COPY_AND_ASSIGN(TestScreenPositionClient);
-};
-
-TEST(WindowTreeTest, NewWindow) {
-  WindowServiceTestSetup setup;
-  EXPECT_TRUE(setup.changes()->empty());
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  EXPECT_EQ("ChangeCompleted id=1 success=true",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, NewWindowWithProperties) {
-  WindowServiceTestSetup setup;
-  EXPECT_TRUE(setup.changes()->empty());
-  aura::PropertyConverter::PrimitiveType value = true;
-  std::vector<uint8_t> transport = mojo::ConvertTo<std::vector<uint8_t>>(value);
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow(
-      1, {{mojom::WindowManager::kAlwaysOnTop_Property, transport}});
-  ASSERT_TRUE(window);
-  EXPECT_EQ("ChangeCompleted id=1 success=true",
-            SingleChangeToDescription(*setup.changes()));
-  EXPECT_TRUE(window->GetProperty(aura::client::kAlwaysOnTopKey));
-}
-
-TEST(WindowTreeTest, NewTopLevelWindow) {
-  WindowServiceTestSetup setup;
-  EXPECT_TRUE(setup.changes()->empty());
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  EXPECT_EQ("TopLevelCreated id=1 window_id=0,1 drawn=false",
-            SingleChangeToDescription(*setup.changes()));
-  ASSERT_TRUE((*setup.changes())[0].local_surface_id_allocation);
-  EXPECT_TRUE((*setup.changes())[0].local_surface_id_allocation->IsValid());
-  EXPECT_EQ(ProxyWindow::GetMayBeNull(top_level)->local_surface_id_allocation(),
-            (*setup.changes())[0].local_surface_id_allocation);
-}
-
-TEST(WindowTreeTest, NewTopLevelWindowWithProperties) {
-  WindowServiceTestSetup setup;
-  EXPECT_TRUE(setup.changes()->empty());
-  aura::PropertyConverter::PrimitiveType value = true;
-  std::vector<uint8_t> transport = mojo::ConvertTo<std::vector<uint8_t>>(value);
-  aura::Window* top_level = setup.window_tree_test_helper()->NewTopLevelWindow(
-      1, {{mojom::WindowManager::kAlwaysOnTop_Property, transport}});
-  ASSERT_TRUE(top_level);
-  EXPECT_EQ("TopLevelCreated id=1 window_id=0,1 drawn=false",
-            SingleChangeToDescription(*setup.changes()));
-  EXPECT_TRUE(top_level->GetProperty(aura::client::kAlwaysOnTopKey));
-}
-
-TEST(WindowTreeTest, SetTopLevelWindowBounds) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  ProxyWindow* top_level_proxy = ProxyWindow::GetMayBeNull(top_level);
-
-  const gfx::Rect bounds_from_client = gfx::Rect(100, 200, 300, 400);
-  viz::ChildLocalSurfaceIdAllocator child_allocator;
-  child_allocator.UpdateFromParent(
-      *top_level_proxy->local_surface_id_allocation());
-  child_allocator.GenerateId();
-  setup.window_tree_test_helper()->SetWindowBoundsWithAck(
-      top_level, bounds_from_client,
-      child_allocator.GetCurrentLocalSurfaceIdAllocation(), 2);
-  EXPECT_EQ(bounds_from_client, top_level->GetBoundsInScreen());
-  EXPECT_EQ("ChangeCompleted id=2 success=true",
-            SingleChangeToDescription(*setup.changes()));
-  setup.changes()->clear();
-
-  const gfx::Rect bounds_from_server = gfx::Rect(101, 102, 103, 104);
-  top_level->SetBounds(bounds_from_server);
-  ASSERT_EQ(1u, setup.changes()->size());
-  EXPECT_EQ(CHANGE_TYPE_NODE_BOUNDS_CHANGED, (*setup.changes())[0].type);
-  EXPECT_EQ(bounds_from_server, (*setup.changes())[0].bounds);
-  ASSERT_TRUE((*setup.changes())[0].local_surface_id_allocation);
-  EXPECT_NE((*setup.changes())[0].local_surface_id_allocation,
-            child_allocator.GetCurrentLocalSurfaceIdAllocation());
-  EXPECT_EQ(top_level_proxy->local_surface_id_allocation(),
-            (*setup.changes())[0].local_surface_id_allocation);
-  setup.changes()->clear();
-
-  // Set a LayoutManager so that when the client requests a bounds change the
-  // window is resized to a different bounds.
-  // |layout_manager| is owned by top_level->parent();
-  TestLayoutManager* layout_manager = new TestLayoutManager();
-  const gfx::Rect restricted_bounds = gfx::Rect(401, 405, 406, 407);
-  layout_manager->set_next_bounds(restricted_bounds);
-  top_level->parent()->SetLayoutManager(layout_manager);
-  child_allocator.GenerateId();
-  setup.window_tree_test_helper()->SetWindowBoundsWithAck(
-      top_level, bounds_from_client,
-      child_allocator.GetCurrentLocalSurfaceIdAllocation(), 3);
-  ASSERT_EQ(2u, setup.changes()->size());
-  // The layout manager changes the bounds to a different value than the client
-  // requested, so the client should get OnWindowBoundsChanged() with
-  // |restricted_bounds|.
-  EXPECT_EQ(CHANGE_TYPE_NODE_BOUNDS_CHANGED, (*setup.changes())[0].type);
-  EXPECT_EQ(restricted_bounds, (*setup.changes())[0].bounds);
-
-  // And because the layout manager changed the bounds the result is false.
-  EXPECT_EQ("ChangeCompleted id=3 success=false",
-            ChangeToDescription((*setup.changes())[1]));
-  setup.changes()->clear();
-
-  // Install a screen position client with a non-zero screen bounds offset.
-  gfx::Vector2d screen_offset(10, 20);
-  TestScreenPositionClient screen_position_client(screen_offset);
-  aura::client::SetScreenPositionClient(setup.aura_test_helper()->root_window(),
-                                        &screen_position_client);
-
-  // Tests that top-level window bounds are set in screen coordinates.
-  child_allocator.GenerateId();
-  setup.window_tree_test_helper()->SetWindowBoundsWithAck(
-      top_level, bounds_from_client,
-      child_allocator.GetCurrentLocalSurfaceIdAllocation(), 4);
-  EXPECT_EQ(bounds_from_client, top_level->GetBoundsInScreen());
-  EXPECT_EQ(bounds_from_client - screen_offset, top_level->bounds());
-  EXPECT_EQ("ChangeCompleted id=4 success=true",
-            SingleChangeToDescription(*setup.changes()));
-
-  aura::client::SetScreenPositionClient(setup.aura_test_helper()->root_window(),
-                                        nullptr);
-}
-
-TEST(WindowTreeTest, SetTopLevelWindowBoundsSameSize) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  const gfx::Rect bounds = gfx::Rect(1, 2, 300, 400);
-  top_level->SetBounds(bounds);
-  setup.changes()->clear();
-  ProxyWindow* top_level_proxy = ProxyWindow::GetMayBeNull(top_level);
-  ASSERT_TRUE(top_level_proxy);
-  ASSERT_TRUE(top_level_proxy->local_surface_id_allocation().has_value());
-  viz::ChildLocalSurfaceIdAllocator child_allocator;
-  child_allocator.UpdateFromParent(
-      *top_level_proxy->local_surface_id_allocation());
-  child_allocator.GenerateId();
-  // WindowTreeTestHelper::SetWindowBounds() with same bounds should succeed.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetWindowBounds(
-      top_level, bounds, child_allocator.GetCurrentLocalSurfaceIdAllocation()));
-  EXPECT_TRUE(setup.changes()->empty());
-  ASSERT_TRUE(top_level_proxy->local_surface_id_allocation().has_value());
-  EXPECT_EQ(child_allocator.GetCurrentLocalSurfaceIdAllocation(),
-            *top_level_proxy->local_surface_id_allocation());
-}
-
-TEST(WindowTreeTest, SetTopLevelWindowBoundsBadEmbedToken) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  const gfx::Rect bounds = gfx::Rect(1, 2, 300, 400);
-  top_level->SetBounds(bounds);
-  setup.changes()->clear();
-  ProxyWindow* top_level_proxy = ProxyWindow::GetMayBeNull(top_level);
-  ASSERT_TRUE(top_level_proxy);
-  ASSERT_TRUE(top_level_proxy->local_surface_id_allocation().has_value());
-  const viz::LocalSurfaceId initial_lsia =
-      top_level_proxy->local_surface_id_allocation()->local_surface_id();
-  viz::LocalSurfaceIdAllocation lsia_with_different_embed_token(
-      viz::LocalSurfaceId(initial_lsia.parent_sequence_number(),
-                          initial_lsia.child_sequence_number(),
-                          base::UnguessableToken::Create()),
-      base::TimeTicks::Now());
-  // Clients are not allowed to change the embed token.
-  EXPECT_FALSE(setup.window_tree_test_helper()->SetWindowBounds(
-      top_level, gfx::Rect(1, 2, 3, 4), lsia_with_different_embed_token));
-  EXPECT_EQ(initial_lsia,
-            top_level_proxy->local_surface_id_allocation()->local_surface_id());
-  EXPECT_EQ(bounds, top_level->bounds());
-  EXPECT_TRUE(setup.changes()->empty());
-}
-
-TEST(WindowTreeTest, UpdateLocalSurfaceIdFromChildBadEmbedToken) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  const gfx::Rect bounds = gfx::Rect(1, 2, 300, 400);
-  top_level->SetBounds(bounds);
-  setup.changes()->clear();
-  ProxyWindow* top_level_proxy = ProxyWindow::GetMayBeNull(top_level);
-  ASSERT_TRUE(top_level_proxy);
-  ASSERT_TRUE(top_level_proxy->local_surface_id_allocation().has_value());
-  const viz::LocalSurfaceId initial_lsia =
-      top_level_proxy->local_surface_id_allocation()->local_surface_id();
-  viz::LocalSurfaceIdAllocation lsia_with_different_embed_token(
-      viz::LocalSurfaceId(initial_lsia.parent_sequence_number(),
-                          initial_lsia.child_sequence_number(),
-                          base::UnguessableToken::Create()),
-      base::TimeTicks::Now());
-  // Clients are not allowed to change the embed token.
-  setup.window_tree_test_helper()->window_tree()->UpdateLocalSurfaceIdFromChild(
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level),
-      lsia_with_different_embed_token);
-  EXPECT_EQ(initial_lsia,
-            top_level_proxy->local_surface_id_allocation()->local_surface_id());
-  EXPECT_EQ(bounds, top_level->bounds());
-  EXPECT_TRUE(setup.changes()->empty());
-}
-
-TEST(WindowTreeTest, UpdateLocalSurfaceIdFromScheduleEmbedWindow) {
-  WindowServiceTestSetup setup;
-  // Schedule an embed in the tree created by |setup|.
-  base::UnguessableToken token;
-  const uint32_t window_id_in_child = 149;
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->ScheduleEmbedForExistingClient(
-          window_id_in_child, base::BindOnce(&ScheduleEmbedCallback, &token));
-  EXPECT_FALSE(token.is_empty());
-
-  // Create a window that will serve as the parent for the remote window and
-  // complete the embedding.
-  aura::Window local_window(nullptr);
-  local_window.Init(ui::LAYER_NOT_DRAWN);
-  local_window.SetBounds(gfx::Rect(1, 2, 3, 4));
-  ASSERT_TRUE(setup.service()->CompleteScheduleEmbedForExistingClient(
-      &local_window, token, /* embed_flags */ 0));
-  EXPECT_TRUE(WindowService::IsProxyWindow(&local_window));
-
-  // Call UpdateLocalSurfaceIdFromScheduleEmbedWindow() for the embedded window
-  // and ensure the value is updated.
-  ProxyWindow* local_window_proxy = ProxyWindow::GetMayBeNull(&local_window);
-  ASSERT_TRUE(local_window_proxy);
-  ASSERT_TRUE(local_window_proxy->local_surface_id_allocation().has_value());
-  viz::ChildLocalSurfaceIdAllocator child_allocator;
-  child_allocator.UpdateFromParent(
-      *local_window_proxy->local_surface_id_allocation());
-  child_allocator.GenerateId();
-  setup.window_tree_test_helper()->window_tree()->UpdateLocalSurfaceIdFromChild(
-      setup.window_tree_test_helper()->TransportIdForWindow(&local_window),
-      child_allocator.GetCurrentLocalSurfaceIdAllocation());
-  EXPECT_EQ(child_allocator.GetCurrentLocalSurfaceIdAllocation(),
-            local_window_proxy->local_surface_id_allocation());
-}
-
-TEST(WindowTreeTest, SetTopLevelWindowBoundsNullSurfaceId) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  const gfx::Rect bounds = gfx::Rect(1, 2, 300, 400);
-  top_level->SetBounds(bounds);
-  setup.changes()->clear();
-  // Server allows null LocalSurfaceIds, which is used on the initial resize
-  // from the client.
-  EXPECT_TRUE(
-      setup.window_tree_test_helper()->SetWindowBounds(top_level, bounds));
-  // The server always responds with a bounds change when the client changes the
-  // bounds and does not supply a LocalSurfaceId.
-  ASSERT_FALSE(setup.changes()->empty());
-  const auto& change = (*setup.changes())[0];
-  EXPECT_EQ(CHANGE_TYPE_NODE_BOUNDS_CHANGED, change.type);
-  EXPECT_EQ(setup.window_tree_test_helper()->TransportIdForWindow(top_level),
-            change.window_id);
-  EXPECT_TRUE(change.local_surface_id_allocation);
-  EXPECT_EQ(bounds, change.bounds);
-}
-
-TEST(WindowTreeTest, SetChildWindowBounds) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  const gfx::Rect bounds = gfx::Rect(1, 2, 300, 400);
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetWindowBounds(window, bounds));
-  EXPECT_EQ(bounds, window->bounds());
-
-  // Setting to same bounds should return true.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetWindowBounds(window, bounds));
-  EXPECT_EQ(bounds, window->bounds());
-}
-
-TEST(WindowTreeTest, SetBoundsAtEmbedWindow) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  const gfx::Rect bounds1 = gfx::Rect(1, 2, 300, 400);
-  EXPECT_TRUE(
-      setup.window_tree_test_helper()->SetWindowBounds(window, bounds1));
-
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(window);
-  ASSERT_TRUE(embedding_helper);
-
-  // Child client should not be able to change bounds of embed window.
-  EXPECT_FALSE(embedding_helper->window_tree_test_helper->SetWindowBounds(
-      window, gfx::Rect()));
-  // Bounds should not have changed.
-  EXPECT_EQ(bounds1, window->bounds());
-
-  embedding_helper->window_tree_client.tracker()->changes()->clear();
-  embedding_helper->window_tree_client.set_track_root_bounds_changes(true);
-
-  // Set the bounds from the parent and ensure client is notified.
-  const gfx::Rect bounds2 = gfx::Rect(1, 2, 300, 401);
-  base::Optional<viz::LocalSurfaceIdAllocation> local_surface_id_allocation(
-      viz::LocalSurfaceIdAllocation(
-          viz::LocalSurfaceId(1, 2, base::UnguessableToken::Create()),
-          base::TimeTicks::Now()));
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetWindowBounds(
-      window, bounds2, local_surface_id_allocation));
-  EXPECT_EQ(bounds2, window->bounds());
-  ASSERT_EQ(1u,
-            embedding_helper->window_tree_client.tracker()->changes()->size());
-  const Change bounds_change =
-      (*(embedding_helper->window_tree_client.tracker()->changes()))[0];
-  EXPECT_EQ(CHANGE_TYPE_NODE_BOUNDS_CHANGED, bounds_change.type);
-  EXPECT_EQ(bounds2, bounds_change.bounds);
-  EXPECT_EQ(local_surface_id_allocation,
-            bounds_change.local_surface_id_allocation);
-  embedding_helper->window_tree_client.tracker()->changes()->clear();
-
-  // Set the bounds from the parent, only updating the LocalSurfaceId (bounds
-  // remains the same). The client should be notified.
-  base::Optional<viz::LocalSurfaceIdAllocation> local_surface_id_allocation2(
-      viz::LocalSurfaceIdAllocation(
-          viz::LocalSurfaceId(1, 3, base::UnguessableToken::Create()),
-          base::TimeTicks::Now()));
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetWindowBounds(
-      window, bounds2, local_surface_id_allocation2));
-  EXPECT_EQ(bounds2, window->bounds());
-  ASSERT_EQ(1u,
-            embedding_helper->window_tree_client.tracker()->changes()->size());
-  const Change bounds_change2 =
-      (*(embedding_helper->window_tree_client.tracker()->changes()))[0];
-  EXPECT_EQ(CHANGE_TYPE_NODE_BOUNDS_CHANGED, bounds_change2.type);
-  EXPECT_EQ(bounds2, bounds_change2.bounds);
-  EXPECT_EQ(local_surface_id_allocation2,
-            bounds_change2.local_surface_id_allocation);
-  embedding_helper->window_tree_client.tracker()->changes()->clear();
-
-  // Try again with the same values. This should succeed, but not notify the
-  // client.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetWindowBounds(
-      window, bounds2, local_surface_id_allocation2));
-  EXPECT_TRUE(
-      embedding_helper->window_tree_client.tracker()->changes()->empty());
-}
-
-// Tests the ability of the client to change properties on the server.
-TEST(WindowTreeTest, SetTopLevelWindowProperty) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-
-  EXPECT_FALSE(top_level->GetProperty(aura::client::kAlwaysOnTopKey));
-  aura::PropertyConverter::PrimitiveType client_value = true;
-  std::vector<uint8_t> client_transport_value =
-      mojo::ConvertTo<std::vector<uint8_t>>(client_value);
-  setup.window_tree_test_helper()->SetWindowProperty(
-      top_level, mojom::WindowManager::kAlwaysOnTop_Property,
-      client_transport_value, 2);
-  EXPECT_EQ("ChangeCompleted id=2 success=true",
-            SingleChangeToDescription(*setup.changes()));
-  EXPECT_TRUE(top_level->GetProperty(aura::client::kAlwaysOnTopKey));
-  setup.changes()->clear();
-
-  top_level->SetProperty(aura::client::kAlwaysOnTopKey, false);
-  EXPECT_EQ(
-      "PropertyChanged window=0,1 key=prop:always_on_top "
-      "value=0000000000000000",
-      SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, WindowToWindowData) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  setup.changes()->clear();
-
-  window->SetBounds(gfx::Rect(1, 2, 300, 400));
-  window->SetProperty(aura::client::kAlwaysOnTopKey, true);
-  window->Show();  // Called to make the window visible.
-  mojom::WindowDataPtr data =
-      setup.window_tree_test_helper()->WindowToWindowData(window);
-  EXPECT_EQ(gfx::Rect(1, 2, 300, 400), data->bounds);
-  EXPECT_TRUE(data->visible);
-  EXPECT_EQ(
-      1u, data->properties.count(mojom::WindowManager::kAlwaysOnTop_Property));
-  EXPECT_EQ(aura::PropertyConverter::PrimitiveType(true),
-            mojo::ConvertTo<aura::PropertyConverter::PrimitiveType>(
-                data->properties[mojom::WindowManager::kAlwaysOnTop_Property]));
-}
-
-TEST(WindowTreeTest, SetWindowPointerProperty) {
-  WindowServiceTestSetup setup;
-  setup.service()->property_converter()->RegisterWindowPtrProperty(
-      kTestPropertyKey, kTestPropertyServerKey);
-
-  WindowTreeTestHelper* helper = setup.window_tree_test_helper();
-  aura::Window* top_level1 = helper->NewTopLevelWindow();
-  aura::Window* top_level2 = helper->NewTopLevelWindow();
-  Id id1 = helper->TransportIdForWindow(top_level1);
-  Id id2 = helper->TransportIdForWindow(top_level2);
-
-  base::Optional<std::vector<uint8_t>> value =
-      mojo::ConvertTo<std::vector<uint8_t>>(id2);
-  setup.window_tree_test_helper()->window_tree()->SetWindowProperty(
-      1, id1, kTestPropertyServerKey, value);
-  EXPECT_EQ(top_level2, top_level1->GetProperty(kTestPropertyKey));
-
-  value.reset();
-  setup.window_tree_test_helper()->window_tree()->SetWindowProperty(
-      1, id1, kTestPropertyServerKey, value);
-  EXPECT_FALSE(top_level1->GetProperty(kTestPropertyKey));
-}
-
-TEST(WindowTreeTest, SetWindowPointerPropertyWithInvalidValues) {
-  WindowServiceTestSetup setup;
-  setup.service()->property_converter()->RegisterWindowPtrProperty(
-      kTestPropertyKey, kTestPropertyServerKey);
-
-  WindowTreeTestHelper* helper = setup.window_tree_test_helper();
-  aura::Window* top_level = helper->NewTopLevelWindow();
-  Id id = helper->TransportIdForWindow(top_level);
-  base::Optional<std::vector<uint8_t>> value =
-      mojo::ConvertTo<std::vector<uint8_t>>(kInvalidTransportId);
-  setup.window_tree_test_helper()->window_tree()->SetWindowProperty(
-      1, id, kTestPropertyServerKey, value);
-  EXPECT_FALSE(top_level->GetProperty(kTestPropertyKey));
-
-  value = mojo::ConvertTo<std::vector<uint8_t>>(10);
-  setup.window_tree_test_helper()->window_tree()->SetWindowProperty(
-      1, id, kTestPropertyServerKey, value);
-  EXPECT_FALSE(top_level->GetProperty(kTestPropertyKey));
-
-  value->clear();
-  value->push_back(1);
-  setup.window_tree_test_helper()->window_tree()->SetWindowProperty(
-      1, id, kTestPropertyServerKey, value);
-  EXPECT_FALSE(top_level->GetProperty(kTestPropertyKey));
-}
-
-TEST(WindowTreeTest, OnWindowInputEventAck) {
-  WindowServiceTestSetup setup;
-  setup.set_ack_events_immediately(false);
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  WindowTreeTestHelper* tree = setup.window_tree_test_helper();
-  aura::Window* top_level = tree->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-
-  top_level->Show();
-  top_level->Focus();
-  top_level->SetBounds(gfx::Rect(100, 100));
-
-  // Send a key event and a mouse event to the client.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  event_generator.MoveMouseTo(10, 10);
-  ASSERT_EQ(2u, window_tree_client->input_events().size());
-  TestWindowTreeClient::InputEvent event1 = window_tree_client->PopInputEvent();
-  ASSERT_TRUE(event1.event->IsKeyEvent());
-  TestWindowTreeClient::InputEvent event2 = window_tree_client->PopInputEvent();
-  ASSERT_TRUE(event2.event->IsLocatedEvent());
-
-  // Acking the events in the order they were received works fine.
-  EXPECT_EQ(1u, tree->in_flight_key_events().size());
-  tree->OnWindowInputEventAck(event1.event_id, ws::mojom::EventResult::HANDLED);
-  EXPECT_EQ(0u, tree->in_flight_key_events().size());
-  EXPECT_EQ(1u, tree->in_flight_other_events().size());
-  tree->OnWindowInputEventAck(event2.event_id, ws::mojom::EventResult::HANDLED);
-  EXPECT_EQ(0u, tree->in_flight_other_events().size());
-
-  // Send another key event and a mouse event.
-  event_generator.ReleaseKey(ui::VKEY_A, ui::EF_NONE);
-  event_generator.MoveMouseTo(11, 11);
-  ASSERT_EQ(2u, window_tree_client->input_events().size());
-  TestWindowTreeClient::InputEvent event3 = window_tree_client->PopInputEvent();
-  ASSERT_TRUE(event3.event->IsKeyEvent());
-  TestWindowTreeClient::InputEvent event4 = window_tree_client->PopInputEvent();
-  ASSERT_TRUE(event4.event->IsLocatedEvent());
-
-  // Acking the mouse and key events out of order from one another is okay.
-  EXPECT_EQ(1u, tree->in_flight_other_events().size());
-  tree->OnWindowInputEventAck(event4.event_id, ws::mojom::EventResult::HANDLED);
-  EXPECT_EQ(0u, tree->in_flight_other_events().size());
-  EXPECT_EQ(1u, tree->in_flight_key_events().size());
-  tree->OnWindowInputEventAck(event3.event_id, ws::mojom::EventResult::HANDLED);
-  EXPECT_EQ(0u, tree->in_flight_key_events().size());
-
-  // Send two more mouse events.
-  event_generator.MoveMouseTo(12, 12);
-  event_generator.MoveMouseTo(13, 13);
-  ASSERT_EQ(2u, window_tree_client->input_events().size());
-  TestWindowTreeClient::InputEvent event5 = window_tree_client->PopInputEvent();
-  ASSERT_TRUE(event5.event->IsLocatedEvent());
-  TestWindowTreeClient::InputEvent event6 = window_tree_client->PopInputEvent();
-  ASSERT_TRUE(event6.event->IsLocatedEvent());
-
-  // The client cannot ack the second mouse event before the first.
-  EXPECT_EQ(2u, tree->in_flight_other_events().size());
-  tree->OnWindowInputEventAck(event6.event_id, ws::mojom::EventResult::HANDLED);
-  EXPECT_EQ(2u, tree->in_flight_other_events().size());
-
-  // Send a key-press.
-  event_generator.PressKey(ui::VKEY_A, ui::EF_NONE);
-  ASSERT_EQ(1u, window_tree_client->input_events().size());
-  TestWindowTreeClient::InputEvent event7 = window_tree_client->PopInputEvent();
-  ASSERT_TRUE(event7.event->IsKeyEvent());
-  // Acking the wrong event should be ignored.
-  tree->OnWindowInputEventAck(event7.event_id + 11,
-                              ws::mojom::EventResult::HANDLED);
-  EXPECT_EQ(1u, tree->in_flight_key_events().size());
-}
-
-TEST(WindowTreeTest, EventLocation) {
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  WindowTreeTestHelper* helper = setup.window_tree_test_helper();
-  aura::Window* top_level = helper->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 20, 100, 100));
-
-  // Add a child Window that covers the bottom half of the top-level window.
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  window->Show();
-  window->SetBounds(gfx::Rect(0, 50, 100, 50));
-  top_level->AddChild(window);
-
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(33, 44);
-  ASSERT_EQ(1u, window_tree_client->input_events().size());
-  TestWindowTreeClient::InputEvent event1 = window_tree_client->PopInputEvent();
-  EXPECT_EQ(helper->TransportIdForWindow(top_level), event1.window_id);
-  ASSERT_TRUE(event1.event->IsLocatedEvent());
-  ui::LocatedEvent* located_event1 = event1.event->AsLocatedEvent();
-  // The location is in the target window's coordinate system.
-  EXPECT_EQ(gfx::Point(23, 24), located_event1->location());
-  // The root location is in the client-root coordinate system.
-  EXPECT_EQ(gfx::Point(23, 24), located_event1->root_location());
-
-  event_generator.MoveMouseTo(55, 86);
-  // 2 input events should happen -- exit on |top_level| and enter on |window|.
-  ASSERT_EQ(2u, window_tree_client->input_events().size());
-
-  // Check the exit event on |top_level|.
-  TestWindowTreeClient::InputEvent event2 = window_tree_client->PopInputEvent();
-  EXPECT_EQ(helper->TransportIdForWindow(top_level), event2.window_id);
-  ASSERT_TRUE(event2.event->IsLocatedEvent());
-  ui::LocatedEvent* located_event2 = event2.event->AsLocatedEvent();
-  // The location is in the target window's coordinate system.
-  EXPECT_EQ(gfx::Point(45, 66), located_event2->location());
-  // The root location is in the client-root coordinate system.
-  EXPECT_EQ(gfx::Point(45, 66), located_event2->root_location());
-
-  // Check the enter event on |window|.
-  TestWindowTreeClient::InputEvent event3 = window_tree_client->PopInputEvent();
-  EXPECT_EQ(helper->TransportIdForWindow(window), event3.window_id);
-  ASSERT_TRUE(event3.event->IsLocatedEvent());
-  ui::LocatedEvent* located_event3 = event3.event->AsLocatedEvent();
-  // The location is in the target window's coordinate system.
-  EXPECT_EQ(gfx::Point(45, 16), located_event3->location());
-  // The root location is in the client-root coordinate system.
-  EXPECT_EQ(gfx::Point(45, 66), located_event3->root_location());
-}
-
-TEST(WindowTreeTest, EventLocationForTransientChildWindow) {
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  WindowTreeTestHelper* helper = setup.window_tree_test_helper();
-
-  aura::Window* top_level = helper->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 20, 100, 100));
-
-  aura::Window* transient = helper->NewTopLevelWindow();
-  ASSERT_TRUE(transient);
-  transient->Show();
-  transient->SetBounds(gfx::Rect(50, 30, 60, 90));
-
-  helper->window_tree()->AddTransientWindow(
-      10, helper->TransportIdForWindow(top_level),
-      helper->TransportIdForWindow(transient));
-
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(61, 44);
-  ASSERT_EQ(1u, window_tree_client->input_events().size());
-  TestWindowTreeClient::InputEvent event = window_tree_client->PopInputEvent();
-  EXPECT_EQ(helper->TransportIdForWindow(transient), event.window_id);
-  ASSERT_TRUE(event.event->IsLocatedEvent());
-  ui::LocatedEvent* located_event = event.event->AsLocatedEvent();
-  // The location is in the target window's coordinate system.
-  EXPECT_EQ(gfx::Point(11, 14), located_event->location());
-  // The root location is in the client-root coordinate system. Transient
-  // parents won't affect the coordinate system.
-  EXPECT_EQ(gfx::Point(11, 14), located_event->root_location());
-}
-
-TEST(WindowTreeTest, MovePressDragRelease) {
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(50, 50);
-  EXPECT_EQ("MOUSE_MOVED 40,40",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  event_generator.PressLeftButton();
-  EXPECT_EQ("MOUSE_PRESSED 40,40",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  event_generator.MoveMouseTo(0, 0);
-  EXPECT_EQ("MOUSE_DRAGGED -10,-10",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  event_generator.ReleaseLeftButton();
-  EXPECT_EQ("MOUSE_RELEASED -10,-10",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-}
-
-// Used to verify destruction with a touch pointer down doesn't crash.
-TEST(WindowTreeTest, ShutdownWithTouchDown) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.set_current_screen_location(gfx::Point(50, 51));
-  event_generator.PressTouch();
-}
-
-TEST(WindowTreeTest, TouchPressDragRelease) {
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 11, 100, 100));
-
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.set_current_screen_location(gfx::Point(50, 51));
-  event_generator.PressTouch();
-  EXPECT_EQ("ET_TOUCH_PRESSED 40,40",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  event_generator.MoveTouch(gfx::Point(5, 6));
-  EXPECT_EQ("ET_TOUCH_MOVED -5,-5",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  event_generator.ReleaseTouch();
-  EXPECT_EQ("ET_TOUCH_RELEASED -5,-5",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-}
-
-class EventRecordingWindowDelegate : public aura::test::TestWindowDelegate {
- public:
-  EventRecordingWindowDelegate() = default;
-  ~EventRecordingWindowDelegate() override = default;
-
-  std::queue<std::unique_ptr<ui::Event>>& events() { return events_; }
-
-  std::unique_ptr<ui::Event> PopEvent() {
-    if (events_.empty())
-      return nullptr;
-    auto event = std::move(events_.front());
-    events_.pop();
-    return event;
-  }
-
-  void ClearEvents() {
-    std::queue<std::unique_ptr<ui::Event>> events;
-    std::swap(events_, events);
-  }
-
-  // aura::test::TestWindowDelegate:
-  void OnEvent(ui::Event* event) override {
-    events_.push(ui::Event::Clone(*event));
-  }
-
- private:
-  std::queue<std::unique_ptr<ui::Event>> events_;
-
-  DISALLOW_COPY_AND_ASSIGN(EventRecordingWindowDelegate);
-};
-
-TEST(WindowTreeTest, MoveFromClientToNonClient) {
-  EventRecordingWindowDelegate window_delegate;
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  setup.delegate()->set_delegate_for_next_top_level(&window_delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-  setup.window_tree_test_helper()->SetClientArea(top_level,
-                                                 gfx::Insets(10, 0, 0, 0));
-
-  window_delegate.ClearEvents();
-
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(50, 50);
-  EXPECT_EQ("MOUSE_MOVED 40,40",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  // The delegate should see the same events (but as mouse events).
-  EXPECT_EQ("MOUSE_ENTERED 40,40", LocatedEventToEventTypeAndLocation(
-                                       window_delegate.PopEvent().get()));
-  EXPECT_EQ("MOUSE_MOVED 40,40", LocatedEventToEventTypeAndLocation(
-                                     window_delegate.PopEvent().get()));
-
-  // Move the mouse over the non-client area.
-  // The event is still sent to the client, and the delegate.
-  event_generator.MoveMouseTo(15, 16);
-  EXPECT_EQ("MOUSE_MOVED 5,6",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  // Delegate should also get the events.
-  EXPECT_EQ("MOUSE_MOVED 5,6", LocatedEventToEventTypeAndLocation(
-                                   window_delegate.PopEvent().get()));
-
-  // Only the delegate should get the press in this case.
-  event_generator.PressLeftButton();
-  ASSERT_FALSE(window_tree_client->PopInputEvent().event.get());
-
-  EXPECT_EQ("MOUSE_PRESSED 5,6", LocatedEventToEventTypeAndLocation(
-                                     window_delegate.PopEvent().get()));
-
-  // Move mouse into client area, only the delegate should get the move (drag).
-  event_generator.MoveMouseTo(35, 51);
-  ASSERT_FALSE(window_tree_client->PopInputEvent().event.get());
-
-  EXPECT_EQ("MOUSE_DRAGGED 25,41", LocatedEventToEventTypeAndLocation(
-                                       window_delegate.PopEvent().get()));
-
-  // Release over client area, again only delegate should get it.
-  event_generator.ReleaseLeftButton();
-  ASSERT_FALSE(window_tree_client->PopInputEvent().event.get());
-
-  EXPECT_EQ("MOUSE_RELEASED",
-            EventToEventType(window_delegate.PopEvent().get()));
-
-  event_generator.MoveMouseTo(26, 50);
-  EXPECT_EQ("MOUSE_MOVED 16,40",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  // Delegate should also get the events.
-  EXPECT_EQ("MOUSE_MOVED 16,40", LocatedEventToEventTypeAndLocation(
-                                     window_delegate.PopEvent().get()));
-
-  // Press in client area. Only the client should get the event.
-  event_generator.PressLeftButton();
-  EXPECT_EQ("MOUSE_PRESSED 16,40",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-
-  ASSERT_FALSE(window_delegate.PopEvent().get());
-}
-
-TEST(WindowTreeTest, MouseDownInNonClientWithChildWindow) {
-  EventRecordingWindowDelegate window_delegate;
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  setup.delegate()->set_delegate_for_next_top_level(&window_delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-  setup.window_tree_test_helper()->SetClientArea(top_level,
-                                                 gfx::Insets(10, 0, 0, 0));
-
-  // Add a child Window that is sized to fill the top-level.
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  window->Show();
-  window->SetBounds(gfx::Rect(top_level->bounds().size()));
-  top_level->AddChild(window);
-
-  window_delegate.ClearEvents();
-
-  // Move the mouse over the non-client area. Both the client and the delegate
-  // should get the event.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(15, 16);
-  EXPECT_EQ("MOUSE_MOVED 5,6",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-  EXPECT_TRUE(window_tree_client->input_events().empty());
-  EXPECT_EQ("MOUSE_ENTERED",
-            EventToEventType(window_delegate.PopEvent().get()));
-  EXPECT_EQ("MOUSE_MOVED", EventToEventType(window_delegate.PopEvent().get()));
-  EXPECT_TRUE(window_delegate.events().empty());
-
-  // Press over the non-client. The client should not be notified as the event
-  // should be handled locally.
-  event_generator.PressLeftButton();
-  ASSERT_FALSE(window_tree_client->PopInputEvent().event.get());
-  EXPECT_EQ("MOUSE_PRESSED 5,6", LocatedEventToEventTypeAndLocation(
-                                     window_delegate.PopEvent().get()));
-}
-
-TEST(WindowTreeTest, MouseDownInNonClientDragToClientWithChildWindow) {
-  EventRecordingWindowDelegate window_delegate;
-  WindowServiceTestSetup setup;
-  setup.delegate()->set_delegate_for_next_top_level(&window_delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-  setup.window_tree_test_helper()->SetClientArea(top_level,
-                                                 gfx::Insets(10, 0, 0, 0));
-
-  // Add a child Window that is sized to fill the top-level.
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  window->Show();
-  window->SetBounds(gfx::Rect(top_level->bounds().size()));
-  top_level->AddChild(window);
-
-  // Press in non-client area.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(15, 16);
-  event_generator.PressLeftButton();
-
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  window_tree_client->ClearInputEvents();
-  window_delegate.ClearEvents();
-  // Drag over client area, only the delegate should get it (because the press
-  // was in the non-client area).
-  event_generator.MoveMouseTo(15, 26);
-  EXPECT_EQ("MOUSE_DRAGGED",
-            EventToEventType(window_delegate.PopEvent().get()));
-  EXPECT_TRUE(window_tree_client->input_events().empty());
-}
-
-TEST(WindowTreeTest, SetHitTestInsets) {
-  EventRecordingWindowDelegate window_delegate;
-  WindowServiceTestSetup setup;
-  setup.delegate()->set_delegate_for_next_top_level(&window_delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  window_tree_client->ClearInputEvents();
-  window_delegate.ClearEvents();
-
-  // Set the hit test insets in the window's bounds that excludes the top half.
-  setup.window_tree_test_helper()->SetHitTestInsets(
-      top_level, gfx::Insets(50, 0, 0, 0), gfx::Insets(50, 0, 0, 0));
-
-  // Events outside the hit test insets are not seen by the delegate or client.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(50, 30);
-  EXPECT_TRUE(window_tree_client->input_events().empty());
-  EXPECT_TRUE(window_delegate.events().empty());
-
-  // Events in the hit test insets are seen by the delegate and client.
-  event_generator.MoveMouseTo(50, 80);
-  EXPECT_EQ("MOUSE_MOVED 40,70",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopInputEvent().event.get()));
-  EXPECT_EQ("MOUSE_ENTERED 40,70", LocatedEventToEventTypeAndLocation(
-                                       window_delegate.PopEvent().get()));
-  EXPECT_EQ("MOUSE_MOVED 40,70", LocatedEventToEventTypeAndLocation(
-                                     window_delegate.PopEvent().get()));
-}
-
-TEST(WindowTreeTest, EventObserver) {
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  // Start observing mouse press and release.
-  setup.window_tree_test_helper()->window_tree()->ObserveEventTypes(
-      {ui::mojom::EventType::MOUSE_PRESSED_EVENT,
-       ui::mojom::EventType::MOUSE_RELEASED_EVENT});
-
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(50, 50);
-  ASSERT_TRUE(window_tree_client->observed_events().empty());
-
-  event_generator.MoveMouseTo(5, 6);
-  ASSERT_TRUE(window_tree_client->observed_events().empty());
-
-  event_generator.PressLeftButton();
-  EXPECT_EQ("MOUSE_PRESSED 5,6",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopObservedEvent().get()));
-
-  event_generator.ReleaseLeftButton();
-  EXPECT_EQ("MOUSE_RELEASED 5,6",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopObservedEvent().get()));
-
-  // Start also observing mouse move events.
-  setup.window_tree_test_helper()->window_tree()->ObserveEventTypes(
-      {ui::mojom::EventType::MOUSE_PRESSED_EVENT,
-       ui::mojom::EventType::MOUSE_RELEASED_EVENT,
-       ui::mojom::EventType::MOUSE_MOVED_EVENT});
-  event_generator.MoveMouseTo(8, 9);
-  EXPECT_EQ("MOUSE_MOVED 8,9",
-            LocatedEventToEventTypeAndLocation(
-                window_tree_client->PopObservedEvent().get()));
-}
-
-TEST(WindowTreeTest, MatchesEventObserverSet) {
-  WindowServiceTestSetup setup;
-  TestWindowTreeClient* window_tree_client = setup.window_tree_client();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow(1);
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(10, 10, 100, 100));
-  // Start observing touch press and release.
-  setup.window_tree_test_helper()->window_tree()->ObserveEventTypes(
-      {ui::mojom::EventType::TOUCH_PRESSED,
-       ui::mojom::EventType::TOUCH_RELEASED});
-
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.set_current_screen_location(gfx::Point(50, 50));
-  event_generator.PressTouch();
-
-  // The client should get the input event, and |matches_event_observer| should
-  // be true (because it also matched the event observer).
-  TestWindowTreeClient::InputEvent press_input =
-      window_tree_client->PopInputEvent();
-  ASSERT_TRUE(press_input.event);
-  EXPECT_EQ("ET_TOUCH_PRESSED 40,40",
-            LocatedEventToEventTypeAndLocation(press_input.event.get()));
-  EXPECT_TRUE(press_input.matches_event_observer);
-  // The event targeted the client, so there are no separately observed events.
-  EXPECT_TRUE(window_tree_client->observed_events().empty());
-}
-
-TEST(WindowTreeTest, Capture) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-
-  // Setting capture on |window| should fail as it's not visible.
-  EXPECT_FALSE(setup.window_tree_test_helper()->SetCapture(window));
-
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  EXPECT_FALSE(setup.window_tree_test_helper()->SetCapture(top_level));
-  top_level->Show();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(top_level));
-
-  EXPECT_FALSE(setup.window_tree_test_helper()->ReleaseCapture(window));
-  EXPECT_TRUE(setup.window_tree_test_helper()->ReleaseCapture(top_level));
-
-  top_level->AddChild(window);
-  window->Show();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(window));
-  EXPECT_TRUE(setup.window_tree_test_helper()->ReleaseCapture(window));
-}
-
-TEST(WindowTreeTest, CaptureDisallowedWhenEmbedderInterceptsEvents) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  top_level->AddChild(window);
-  window->Show();
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(window, mojom::kEmbedFlagEmbedderInterceptsEvents);
-  ASSERT_TRUE(embedding_helper);
-  EXPECT_FALSE(embedding_helper->window_tree_test_helper->SetCapture(window));
-}
-
-TEST(WindowTreeTest, TransferCaptureToClient) {
-  EventRecordingWindowDelegate window_delegate;
-  WindowServiceTestSetup setup;
-  setup.delegate()->set_delegate_for_next_top_level(&window_delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  setup.window_tree_test_helper()->SetClientArea(top_level,
-                                                 gfx::Insets(10, 0, 0, 0));
-
-  wm::CaptureController::Get()->SetCapture(top_level);
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(6, 6);
-  setup.window_tree_client()->ClearInputEvents();
-  window_delegate.ClearEvents();
-  event_generator.MoveMouseTo(7, 7);
-
-  // Because capture was initiated locally event should go to |window_delegate|
-  // only (not the client).
-  EXPECT_TRUE(setup.window_tree_client()->input_events().empty());
-  EXPECT_EQ("MOUSE_MOVED", EventToEventType(window_delegate.PopEvent().get()));
-  EXPECT_TRUE(window_delegate.events().empty());
-
-  // Request capture from the client.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(top_level));
-  event_generator.MoveMouseTo(8, 8);
-  // Now the event should go to the client and not local.
-  EXPECT_TRUE(window_delegate.events().empty());
-  EXPECT_EQ("MOUSE_MOVED",
-            EventToEventType(
-                setup.window_tree_client()->PopInputEvent().event.get()));
-  EXPECT_TRUE(setup.window_tree_client()->input_events().empty());
-}
-
-TEST(WindowTreeTest, TransferCaptureBetweenParentAndChild) {
-  EventRecordingWindowDelegate window_delegate;
-  WindowServiceTestSetup setup;
-  setup.delegate()->set_delegate_for_next_top_level(&window_delegate);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  top_level->AddChild(window);
-  window->Show();
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(window);
-  ASSERT_TRUE(embedding_helper);
-
-  // Move the mouse and set capture from the child.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(6, 6);
-  setup.window_tree_client()->ClearInputEvents();
-  window_delegate.ClearEvents();
-  embedding_helper->window_tree_client.ClearInputEvents();
-  EXPECT_TRUE(embedding_helper->window_tree_test_helper->SetCapture(window));
-  event_generator.MoveMouseTo(7, 7);
-
-  // As capture was set from the child, only the child should get the event.
-  EXPECT_TRUE(setup.window_tree_client()->input_events().empty());
-  EXPECT_TRUE(window_delegate.events().empty());
-  EXPECT_EQ(
-      "MOUSE_MOVED",
-      EventToEventType(
-          embedding_helper->window_tree_client.PopInputEvent().event.get()));
-  EXPECT_TRUE(embedding_helper->window_tree_client.input_events().empty());
-
-  // Set capture from the parent, only the parent should get the event now.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(top_level));
-  event_generator.MoveMouseTo(8, 8);
-  EXPECT_EQ("MOUSE_MOVED",
-            EventToEventType(
-                setup.window_tree_client()->PopInputEvent().event.get()));
-  EXPECT_TRUE(setup.window_tree_client()->input_events().empty());
-  EXPECT_TRUE(window_delegate.events().empty());
-  EXPECT_TRUE(embedding_helper->window_tree_client.input_events().empty());
-}
-
-TEST(WindowTreeTest, CaptureNotification) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  top_level->AddChild(window);
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  window->Show();
-  setup.changes()->clear();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(window));
-  EXPECT_TRUE(setup.changes()->empty());
-
-  wm::CaptureController::Get()->ReleaseCapture(window);
-  EXPECT_EQ("OnCaptureChanged new_window=null old_window=0,1",
-            SingleChangeToDescription(*(setup.changes())));
-}
-
-TEST(WindowTreeTest, CaptureNotificationForEmbedRoot) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  top_level->AddChild(window);
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  window->Show();
-  setup.changes()->clear();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(window));
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Set capture on the embed-root from the embedded client. The embedder
-  // should be notified.
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(window);
-  ASSERT_TRUE(embedding_helper);
-  setup.changes()->clear();
-  embedding_helper->changes()->clear();
-  EXPECT_TRUE(embedding_helper->window_tree_test_helper->SetCapture(window));
-  EXPECT_EQ("OnCaptureChanged new_window=null old_window=0,1",
-            SingleChangeToDescription(*(setup.changes())));
-  setup.changes()->clear();
-  EXPECT_TRUE(embedding_helper->changes()->empty());
-
-  // Set capture from the embedder. This triggers the embedded client to lose
-  // capture.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(window));
-  EXPECT_TRUE(setup.changes()->empty());
-  // NOTE: the '2' is because the embedded client sees the high order bits of
-  // the root.
-  EXPECT_EQ("OnCaptureChanged new_window=null old_window=2,1",
-            SingleChangeToDescription(*(embedding_helper->changes())));
-  embedding_helper->changes()->clear();
-
-  // And release capture locally.
-  wm::CaptureController::Get()->ReleaseCapture(window);
-  EXPECT_EQ("OnCaptureChanged new_window=null old_window=0,1",
-            SingleChangeToDescription(*(setup.changes())));
-  EXPECT_TRUE(embedding_helper->changes()->empty());
-}
-
-TEST(WindowTreeTest, CaptureNotificationForTopLevel) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow(11);
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  setup.changes()->clear();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(top_level));
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Release capture locally.
-  wm::CaptureController* capture_controller = wm::CaptureController::Get();
-  capture_controller->ReleaseCapture(top_level);
-  EXPECT_EQ("OnCaptureChanged new_window=null old_window=0,11",
-            SingleChangeToDescription(*(setup.changes())));
-  setup.changes()->clear();
-
-  // Set capture locally.
-  capture_controller->SetCapture(top_level);
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Set capture from client.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(top_level));
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Release locally.
-  capture_controller->ReleaseCapture(top_level);
-  EXPECT_EQ("OnCaptureChanged new_window=null old_window=0,11",
-            SingleChangeToDescription(*(setup.changes())));
-}
-
-TEST(WindowTreeTest, EventsGoToCaptureWindow) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  top_level->AddChild(window);
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  window->Show();
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  window->SetBounds(gfx::Rect(10, 10, 90, 90));
-  // Left press on the top-level, leaving mouse down.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(5, 5);
-  event_generator.PressLeftButton();
-  setup.window_tree_client()->ClearInputEvents();
-
-  // Set capture on |window|.
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(window));
-  EXPECT_TRUE(setup.window_tree_client()->input_events().empty());
-
-  // Move mouse, should go to |window|.
-  event_generator.MoveMouseTo(6, 6);
-  auto drag_event = setup.window_tree_client()->PopInputEvent();
-  EXPECT_EQ(setup.window_tree_test_helper()->TransportIdForWindow(window),
-            drag_event.window_id);
-  EXPECT_EQ("MOUSE_DRAGGED -4,-4",
-            LocatedEventToEventTypeAndLocation(drag_event.event.get()));
-}
-
-TEST(WindowTreeTest, PointerDownResetOnCaptureChange) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->AddChild(window);
-  setup.window_tree_test_helper()->SetClientArea(top_level,
-                                                 gfx::Insets(10, 0, 0, 0));
-  top_level->Show();
-  window->Show();
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  window->SetBounds(gfx::Rect(10, 10, 90, 90));
-  // Left press on the top-level, leaving mouse down.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(5, 5);
-  event_generator.PressLeftButton();
-  ProxyWindow* top_level_proxy_window = ProxyWindow::GetMayBeNull(top_level);
-  ASSERT_TRUE(top_level_proxy_window);
-  ProxyWindowTestHelper top_level_proxy_window_helper(top_level_proxy_window);
-  EXPECT_TRUE(top_level_proxy_window_helper.IsHandlingPointerPress(
-      ui::MouseEvent::kMousePointerId));
-
-  // Set capture on |window|, top_level should no longer be in pointer-down
-  // (because capture changed).
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetCapture(window));
-  EXPECT_FALSE(top_level_proxy_window_helper.IsHandlingPointerPress(
-      ui::MouseEvent::kMousePointerId));
-}
-
-TEST(WindowTreeTest, PointerDownResetOnHide) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  setup.window_tree_test_helper()->SetClientArea(top_level,
-                                                 gfx::Insets(10, 0, 0, 0));
-  top_level->Show();
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  // Left press on the top-level, leaving mouse down.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.MoveMouseTo(5, 5);
-  event_generator.PressLeftButton();
-  ProxyWindow* top_level_proxy_window = ProxyWindow::GetMayBeNull(top_level);
-  ASSERT_TRUE(top_level_proxy_window);
-  ProxyWindowTestHelper top_level_proxy_window_helper(top_level_proxy_window);
-  EXPECT_TRUE(top_level_proxy_window_helper.IsHandlingPointerPress(
-      ui::MouseEvent::kMousePointerId));
-
-  // Hiding should implicitly cancel capture.
-  top_level->Hide();
-  EXPECT_FALSE(top_level_proxy_window_helper.IsHandlingPointerPress(
-      ui::MouseEvent::kMousePointerId));
-}
-
-TEST(WindowTreeTest, DeleteWindow) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  aura::WindowTracker tracker;
-  tracker.Add(window);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->DeleteWindow(window);
-  EXPECT_TRUE(tracker.windows().empty());
-  EXPECT_EQ("ChangeCompleted id=1 success=true",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, DeleteTopLevel) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  const ClientWindowId top_level_id =
-      setup.window_tree_test_helper()->ClientWindowIdForWindow(top_level);
-  ASSERT_TRUE(top_level);
-  aura::WindowTracker tracker;
-  tracker.Add(top_level);
-  setup.changes()->clear();
-
-  // Ask the tree to delete the window, which should result in deleting the
-  // Window as well responding with success.
-  setup.window_tree_test_helper()->DeleteWindow(top_level);
-  EXPECT_TRUE(tracker.windows().empty());
-  EXPECT_EQ("ChangeCompleted id=1 success=true",
-            SingleChangeToDescription(*setup.changes()));
-
-  // Make sure the WindowTree doesn't have a mapping for the id anymore.
-  EXPECT_FALSE(
-      setup.window_tree_test_helper()->GetWindowByClientId(top_level_id));
-}
-
-TEST(WindowTreeTest, ExternalDeleteTopLevel) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  ASSERT_TRUE(top_level);
-  delete top_level;
-  EXPECT_EQ("WindowDeleted window=0,1",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, ExternalDeleteWindow) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  setup.changes()->clear();
-  delete window;
-  EXPECT_EQ("WindowDeleted window=0,1",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, Embed) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewWindow();
-  aura::Window* embed_window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window);
-  ASSERT_TRUE(embed_window);
-  window->AddChild(embed_window);
-  embed_window->SetBounds(gfx::Rect(1, 2, 3, 4));
-  setup.changes()->clear();
-
-  std::unique_ptr<EmbeddingHelper> embedding_helper =
-      setup.CreateEmbedding(embed_window);
-  ASSERT_TRUE(embedding_helper);
-  ASSERT_EQ("OnEmbed", SingleChangeToDescription(*embedding_helper->changes()));
-  const Change& test_change = (*embedding_helper->changes())[0];
-  ASSERT_EQ(1u, test_change.windows.size());
-  EXPECT_EQ(embed_window->bounds(), test_change.windows[0].bounds);
-  EXPECT_EQ(kInvalidTransportId, test_change.windows[0].parent_id);
-  EXPECT_EQ(embed_window->TargetVisibility(), test_change.windows[0].visible);
-  EXPECT_NE(kInvalidTransportId, test_change.windows[0].window_id);
-
-  // OnFrameSinkIdAllocated() should called on the parent tree.
-  ASSERT_EQ(1u, setup.changes()->size());
-  EXPECT_EQ(CHANGE_TYPE_FRAME_SINK_ID_ALLOCATED, (*setup.changes())[0].type);
-  const Id embed_window_transport_id =
-      setup.window_tree_test_helper()->TransportIdForWindow(embed_window);
-  EXPECT_EQ(embed_window_transport_id, (*setup.changes())[0].window_id);
-  EXPECT_EQ(ProxyWindow::GetMayBeNull(embed_window)->frame_sink_id(),
-            (*setup.changes())[0].frame_sink_id);
-}
-
-// Base class for ScheduleEmbed() related tests. This creates a Window and
-// prepares a secondary client (|embed_client_|) that is intended to be embedded
-// at some point.
-class WindowTreeScheduleEmbedTest : public testing::Test {
- public:
-  WindowTreeScheduleEmbedTest() = default;
-  ~WindowTreeScheduleEmbedTest() override = default;
-
-  // testing::Test:
-  void SetUp() override {
-    testing::Test::SetUp();
-    setup_ = std::make_unique<WindowServiceTestSetup>();
-    embed_binding_.Bind(mojo::MakeRequest(&embed_client_ptr_));
-    window_ = setup_->window_tree_test_helper()->NewWindow();
-    ASSERT_TRUE(window_);
-  }
-  void TearDown() override {
-    window_ = nullptr;
-    embed_binding_.Close();
-    setup_.reset();
-    testing::Test::TearDown();
-  }
-
- protected:
-  std::unique_ptr<WindowServiceTestSetup> setup_;
-  TestWindowTreeClient embed_client_;
-  mojom::WindowTreeClientPtr embed_client_ptr_;
-  aura::Window* window_ = nullptr;
-
- private:
-  mojo::Binding<mojom::WindowTreeClient> embed_binding_{&embed_client_};
-
-  DISALLOW_COPY_AND_ASSIGN(WindowTreeScheduleEmbedTest);
-};
-
-TEST_F(WindowTreeScheduleEmbedTest, ScheduleEmbedWithUnregisteredToken) {
-  bool embed_result = false;
-  bool embed_callback_called = false;
-  setup_->window_tree_test_helper()->window_tree()->EmbedUsingToken(
-      setup_->window_tree_test_helper()->TransportIdForWindow(window_),
-      base::UnguessableToken::Create(), kDefaultEmbedFlags,
-      base::BindOnce(&EmbedUsingTokenCallback, &embed_callback_called,
-                     &embed_result));
-  EXPECT_TRUE(embed_callback_called);
-  // ScheduleEmbed() with an invalid token should fail.
-  EXPECT_FALSE(embed_result);
-}
-
-TEST_F(WindowTreeScheduleEmbedTest, ScheduleEmbedRegisteredTokenInvalidWindow) {
-  // Register a token for embedding.
-  base::UnguessableToken token;
-  setup_->window_tree_test_helper()->window_tree()->ScheduleEmbed(
-      std::move(embed_client_ptr_),
-      base::BindOnce(&ScheduleEmbedCallback, &token));
-  EXPECT_FALSE(token.is_empty());
-
-  bool embed_result = false;
-  bool embed_callback_called = false;
-  setup_->window_tree_test_helper()->window_tree()->EmbedUsingToken(
-      kInvalidTransportId, token, kDefaultEmbedFlags,
-      base::BindOnce(&EmbedUsingTokenCallback, &embed_callback_called,
-                     &embed_result));
-  EXPECT_TRUE(embed_callback_called);
-  // ScheduleEmbed() with a valid token, but invalid window should fail.
-  EXPECT_FALSE(embed_result);
-}
-
-TEST_F(WindowTreeScheduleEmbedTest, ScheduleEmbed) {
-  base::UnguessableToken token;
-  // ScheduleEmbed() with a valid token and valid window.
-  setup_->window_tree_test_helper()->window_tree()->ScheduleEmbed(
-      std::move(embed_client_ptr_),
-      base::BindOnce(&ScheduleEmbedCallback, &token));
-  EXPECT_FALSE(token.is_empty());
-
-  bool embed_result = false;
-  bool embed_callback_called = false;
-  setup_->window_tree_test_helper()->window_tree()->EmbedUsingToken(
-      setup_->window_tree_test_helper()->TransportIdForWindow(window_), token,
-      kDefaultEmbedFlags,
-      base::BindOnce(&EmbedUsingTokenCallback, &embed_callback_called,
-                     &embed_result));
-  EXPECT_TRUE(embed_callback_called);
-  EXPECT_TRUE(embed_result);
-  base::RunLoop().RunUntilIdle();
-
-  // The embedded client should get OnEmbed().
-  EXPECT_EQ("OnEmbed",
-            SingleChangeToDescription(*embed_client_.tracker()->changes()));
-}
-
-TEST(WindowTreeTest, ScheduleEmbedForExistingClient) {
-  WindowServiceTestSetup setup;
-  // Schedule an embed in the tree created by |setup|.
-  base::UnguessableToken token;
-  const uint32_t window_id_in_child = 149;
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->ScheduleEmbedForExistingClient(
-          window_id_in_child, base::BindOnce(&ScheduleEmbedCallback, &token));
-  EXPECT_FALSE(token.is_empty());
-
-  // Create another client and a window.
-  TestWindowTreeClient client2;
-  std::unique_ptr<WindowTree> tree2 =
-      setup.service()->CreateWindowTree(&client2);
-  ASSERT_TRUE(tree2);
-  WindowTreeTestHelper tree2_test_helper(tree2.get());
-  aura::Window* window_in_parent = tree2_test_helper.NewWindow();
-  ASSERT_TRUE(window_in_parent);
-
-  // Call EmbedUsingToken() from tree2, which should result in the tree from
-  // |setup| getting OnEmbedFromToken().
-  bool embed_result = false;
-  bool embed_callback_called = false;
-  WindowTreeTestHelper(tree2.get())
-      .window_tree()
-      ->EmbedUsingToken(
-          tree2_test_helper.TransportIdForWindow(window_in_parent), token,
-          kDefaultEmbedFlags,
-          base::BindOnce(&EmbedUsingTokenCallback, &embed_callback_called,
-                         &embed_result));
-  EXPECT_TRUE(embed_callback_called);
-  EXPECT_TRUE(embed_result);
-
-  EXPECT_EQ("OnEmbedFromToken", SingleChangeToDescription(*setup.changes()));
-  EXPECT_EQ(
-      static_cast<Id>(window_id_in_child),
-      setup.window_tree_test_helper()->TransportIdForWindow(window_in_parent));
-}
-
-TEST(WindowTreeTest, DeleteRootOfEmbeddingFromScheduleEmbedForExistingClient) {
-  WindowServiceTestSetup setup;
-  aura::Window* window_in_parent = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window_in_parent);
-
-  // Create another client.
-  TestWindowTreeClient client2;
-  std::unique_ptr<WindowTree> tree2 =
-      setup.service()->CreateWindowTree(&client2);
-  WindowTreeTestHelper tree2_test_helper(tree2.get());
-  base::UnguessableToken token;
-  tree2_test_helper.window_tree()->ScheduleEmbedForExistingClient(
-      11, base::BindOnce(&ScheduleEmbedCallback, &token));
-  EXPECT_FALSE(token.is_empty());
-
-  // Call EmbedUsingToken() from setup.window_tree(), which should result in
-  // |tree2| getting OnEmbedFromToken().
-  bool embed_result = false;
-  bool embed_callback_called = false;
-  setup.window_tree_test_helper()->window_tree()->EmbedUsingToken(
-      setup.window_tree_test_helper()->TransportIdForWindow(window_in_parent),
-      token, kDefaultEmbedFlags,
-      base::BindOnce(&EmbedUsingTokenCallback, &embed_callback_called,
-                     &embed_result));
-  EXPECT_TRUE(embed_callback_called);
-  EXPECT_TRUE(embed_result);
-
-  EXPECT_EQ("OnEmbedFromToken",
-            SingleChangeToDescription(*client2.tracker()->changes()));
-  client2.tracker()->changes()->clear();
-
-  // Delete |window_in_parent|, which should trigger notifying tree2.
-  setup.window_tree_test_helper()->DeleteWindow(window_in_parent);
-  window_in_parent = nullptr;
-
-  // 11 is the same value supplied to ScheduleEmbedForExistingClient().
-  EXPECT_EQ("WindowDeleted window=0,11",
-            SingleChangeToDescription(*client2.tracker()->changes()));
-}
-
-TEST(WindowTreeTest, DeleteEmbededTreeFromScheduleEmbedForExistingClient) {
-  WindowServiceTestSetup setup;
-  aura::Window* window_in_parent = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window_in_parent);
-
-  // Create another client and call ScheduleEmbedForExistingClient() from it.
-  TestWindowTreeClient client2;
-  std::unique_ptr<WindowTree> tree2 =
-      setup.service()->CreateWindowTree(&client2);
-  WindowTreeTestHelper tree2_test_helper(tree2.get());
-  base::UnguessableToken token;
-  tree2_test_helper.window_tree()->ScheduleEmbedForExistingClient(
-      11, base::BindOnce(&ScheduleEmbedCallback, &token));
-  EXPECT_FALSE(token.is_empty());
-
-  // Call EmbedUsingToken() from setup.window_tree(), which should result in
-  // |tree2| getting OnEmbedFromToken().
-  bool embed_result = false;
-  bool embed_callback_called = false;
-  setup.window_tree_test_helper()->window_tree()->EmbedUsingToken(
-      setup.window_tree_test_helper()->TransportIdForWindow(window_in_parent),
-      token, kDefaultEmbedFlags,
-      base::BindOnce(&EmbedUsingTokenCallback, &embed_callback_called,
-                     &embed_result));
-  EXPECT_TRUE(embed_callback_called);
-  EXPECT_TRUE(embed_result);
-  EXPECT_TRUE(ProxyWindow::GetMayBeNull(window_in_parent)->HasEmbedding());
-
-  tree2.reset();
-  EXPECT_FALSE(ProxyWindow::GetMayBeNull(window_in_parent)->HasEmbedding());
-}
-
-TEST(WindowTreeTest, StackAtTop) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level1 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level1);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->StackAtTop(
-      10, setup.window_tree_test_helper()->TransportIdForWindow(top_level1));
-  // This succeeds because |top_level1| is already at top. |10| is the value
-  // supplied to StackAtTop().
-  EXPECT_EQ("ChangeCompleted id=10 success=true",
-            SingleChangeToDescription(*setup.changes()));
-
-  // Create another top-level. |top_level2| should initially be above 1.
-  aura::Window* top_level2 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level2);
-  ASSERT_EQ(2u, top_level1->parent()->children().size());
-  EXPECT_EQ(top_level2, top_level1->parent()->children()[1]);
-
-  // Stack 1 at the top.
-  EXPECT_TRUE(setup.window_tree_test_helper()->StackAtTop(top_level1));
-  EXPECT_EQ(top_level1, top_level1->parent()->children()[1]);
-
-  // Stacking a non-toplevel window at top should fail.
-  aura::Window* non_top_level_window =
-      setup.window_tree_test_helper()->NewWindow();
-  EXPECT_FALSE(
-      setup.window_tree_test_helper()->StackAtTop(non_top_level_window));
-}
-
-TEST(WindowTreeTest, OnUnhandledKeyEvent) {
-  // Create a top-level, show it and give it focus.
-  WindowServiceTestSetup setup;
-  // This test acks its own events.
-  setup.set_ack_events_immediately(false);
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  top_level->Focus();
-  ASSERT_TRUE(top_level->HasFocus());
-  ui::test::EventGenerator event_generator(setup.root());
-
-  // Generate a key-press. The client should get the event, but not the
-  // delegate.
-  event_generator.PressKey(ui::VKEY_A, ui::EF_CONTROL_DOWN);
-  EXPECT_TRUE(setup.delegate()->unhandled_key_events()->empty());
-
-  // Respond that the event was not handled. Should result in notifying the
-  // delegate.
-  EXPECT_TRUE(setup.window_tree_client()->AckFirstEvent(
-      setup.window_tree(), mojom::EventResult::UNHANDLED));
-  ASSERT_EQ(1u, setup.delegate()->unhandled_key_events()->size());
-  EXPECT_EQ(ui::VKEY_A,
-            (*setup.delegate()->unhandled_key_events())[0].key_code());
-  EXPECT_EQ(ui::EF_CONTROL_DOWN,
-            (*setup.delegate()->unhandled_key_events())[0].flags());
-  setup.delegate()->unhandled_key_events()->clear();
-
-  // Repeat, but respond with handled. This should not result in the delegate
-  // being notified.
-  event_generator.PressKey(ui::VKEY_B, ui::EF_SHIFT_DOWN);
-  EXPECT_TRUE(setup.window_tree_client()->AckFirstEvent(
-      setup.window_tree(), mojom::EventResult::HANDLED));
-  EXPECT_TRUE(setup.delegate()->unhandled_key_events()->empty());
-}
-
-TEST(WindowTreeTest, ReorderWindow) {
-  // Create a top-level and two child windows.
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  aura::Window* window1 = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window1);
-  top_level->AddChild(window1);
-  aura::Window* window2 = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(window2);
-  top_level->AddChild(window2);
-
-  // Reorder |window1| on top of |window2|.
-  EXPECT_TRUE(setup.window_tree_test_helper()->ReorderWindow(
-      window1, window2, mojom::OrderDirection::ABOVE));
-  EXPECT_EQ(window2, top_level->children()[0]);
-  EXPECT_EQ(window1, top_level->children()[1]);
-
-  // Reorder |window2| on top of |window1|.
-  EXPECT_TRUE(setup.window_tree_test_helper()->ReorderWindow(
-      window2, window1, mojom::OrderDirection::ABOVE));
-  EXPECT_EQ(window1, top_level->children()[0]);
-  EXPECT_EQ(window2, top_level->children()[1]);
-
-  // Repeat, but use the WindowTree interface, which should result in an ack.
-  setup.changes()->clear();
-  uint32_t change_id = 101;
-  setup.window_tree_test_helper()->window_tree()->ReorderWindow(
-      change_id, setup.window_tree_test_helper()->TransportIdForWindow(window1),
-      setup.window_tree_test_helper()->TransportIdForWindow(window2),
-      mojom::OrderDirection::ABOVE);
-  EXPECT_EQ("ChangeCompleted id=101 success=true",
-            SingleChangeToDescription(*setup.changes()));
-  setup.changes()->clear();
-
-  // Supply invalid window ids, which should fail.
-  setup.window_tree_test_helper()->window_tree()->ReorderWindow(
-      change_id, 0, 1, mojom::OrderDirection::ABOVE);
-  EXPECT_EQ("ChangeCompleted id=101 success=false",
-            SingleChangeToDescription(*setup.changes()));
-
-  // These calls should fail as the windows are not siblings.
-  EXPECT_FALSE(setup.window_tree_test_helper()->ReorderWindow(
-      window1, top_level, mojom::OrderDirection::ABOVE));
-  EXPECT_FALSE(setup.window_tree_test_helper()->ReorderWindow(
-      top_level, window2, mojom::OrderDirection::ABOVE));
-}
-
-TEST(WindowTreeTest, StackAbove) {
-  // Create two top-levels.
-  WindowServiceTestSetup setup;
-  aura::Window* top_level1 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level1);
-  aura::Window* top_level2 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level2);
-  ASSERT_TRUE(top_level1->parent());
-  ASSERT_EQ(top_level1->parent(), top_level2->parent());
-  ASSERT_EQ(2u, top_level2->parent()->children().size());
-
-  // 1 on top of 2.
-  EXPECT_TRUE(
-      setup.window_tree_test_helper()->StackAbove(top_level1, top_level2));
-  EXPECT_EQ(top_level2, top_level2->parent()->children()[0]);
-  EXPECT_EQ(top_level1, top_level2->parent()->children()[1]);
-
-  // Repeat, should still succeed and nothing should change.
-  EXPECT_TRUE(
-      setup.window_tree_test_helper()->StackAbove(top_level1, top_level2));
-  EXPECT_EQ(top_level2, top_level2->parent()->children()[0]);
-  EXPECT_EQ(top_level1, top_level2->parent()->children()[1]);
-
-  // 2 on top of 1.
-  EXPECT_TRUE(
-      setup.window_tree_test_helper()->StackAbove(top_level2, top_level1));
-  EXPECT_EQ(top_level1, top_level2->parent()->children()[0]);
-  EXPECT_EQ(top_level2, top_level2->parent()->children()[1]);
-
-  // 1 on top of 2, using WindowTree interface, which should result in an ack.
-  setup.changes()->clear();
-  uint32_t change_id = 102;
-  setup.window_tree_test_helper()->window_tree()->StackAbove(
-      change_id,
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level1),
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level2));
-  EXPECT_EQ("ChangeCompleted id=102 success=true",
-            SingleChangeToDescription(*setup.changes()));
-  setup.changes()->clear();
-  EXPECT_EQ(top_level2, top_level2->parent()->children()[0]);
-  EXPECT_EQ(top_level1, top_level2->parent()->children()[1]);
-
-  // Using invalid id should fail.
-  setup.window_tree_test_helper()->window_tree()->StackAbove(
-      change_id,
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level1),
-      kInvalidTransportId);
-  EXPECT_EQ("ChangeCompleted id=102 success=false",
-            SingleChangeToDescription(*setup.changes()));
-
-  // Using non-top-level should fail.
-  aura::Window* non_top_level_window =
-      setup.window_tree_test_helper()->NewWindow();
-  EXPECT_FALSE(setup.window_tree_test_helper()->StackAbove(
-      top_level1, non_top_level_window));
-}
-
-TEST(WindowTreeTest, VisibilityChanged) {
-  WindowServiceTestSetup setup;
-  aura::Window* window = setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  EXPECT_FALSE(window->IsVisible());
-
-  window->Show();
-  EXPECT_TRUE(window->IsVisible());
-  EXPECT_EQ("VisibilityChanged window=0,1 visible=true",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, RunMoveLoopTouch) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  const Id top_level_id =
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformWindowMove(
-      12, top_level_id, mojom::MoveLoopSource::TOUCH, gfx::Point(), HTCAPTION);
-  // |top_level| isn't visible, so should fail immediately.
-  EXPECT_EQ("ChangeCompleted id=12 success=false",
-            SingleChangeToDescription(*setup.changes()));
-  setup.changes()->clear();
-
-  // Make the window visible and repeat.
-  top_level->Show();
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformWindowMove(
-      13, top_level_id, mojom::MoveLoopSource::TOUCH, gfx::Point(), HTCAPTION);
-  // WindowServiceDelegate should be asked to do the move.
-  WindowServiceDelegate::DoneCallback move_loop_callback =
-      setup.delegate()->TakeMoveLoopCallback();
-  ASSERT_TRUE(move_loop_callback);
-  // As the move is in progress, changes should be empty.
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Respond to the callback with success, which should notify client.
-  std::move(move_loop_callback).Run(true);
-  EXPECT_EQ("ChangeCompleted id=13 success=true",
-            SingleChangeToDescription(*setup.changes()));
-
-  // Trying to move non-top-level should fail.
-  aura::Window* non_top_level_window =
-      setup.window_tree_test_helper()->NewWindow();
-  non_top_level_window->Show();
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformWindowMove(
-      14,
-      setup.window_tree_test_helper()->TransportIdForWindow(
-          non_top_level_window),
-      mojom::MoveLoopSource::TOUCH, gfx::Point(), HTCAPTION);
-  EXPECT_EQ("ChangeCompleted id=14 success=false",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, RunMoveLoopMouse) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  const Id top_level_id =
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformWindowMove(
-      12, top_level_id, mojom::MoveLoopSource::MOUSE, gfx::Point(), HTCAPTION);
-  // The mouse isn't down, so this should fail.
-  EXPECT_EQ("ChangeCompleted id=12 success=false",
-            SingleChangeToDescription(*setup.changes()));
-  setup.changes()->clear();
-
-  // Press the left button and repeat.
-  ui::test::EventGenerator event_generator(setup.root());
-  event_generator.PressLeftButton();
-  setup.window_tree_test_helper()->window_tree()->PerformWindowMove(
-      13, top_level_id, mojom::MoveLoopSource::MOUSE, gfx::Point(), HTCAPTION);
-  // WindowServiceDelegate should be asked to do the move.
-  WindowServiceDelegate::DoneCallback move_loop_callback =
-      setup.delegate()->TakeMoveLoopCallback();
-  ASSERT_TRUE(move_loop_callback);
-  // As the move is in progress, changes should be empty.
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Respond to the callback, which should notify client.
-  std::move(move_loop_callback).Run(true);
-  EXPECT_EQ("ChangeCompleted id=13 success=true",
-            SingleChangeToDescription(*setup.changes()));
-  setup.changes()->clear();
-}
-
-TEST(WindowTreeTest, CancelMoveLoop) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  const Id top_level_id =
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformWindowMove(
-      12, top_level_id, mojom::MoveLoopSource::TOUCH, gfx::Point(), HTCAPTION);
-
-  // WindowServiceDelegate should be asked to do the move.
-  WindowServiceDelegate::DoneCallback move_loop_callback =
-      setup.delegate()->TakeMoveLoopCallback();
-  ASSERT_TRUE(move_loop_callback);
-  // As the move is in progress, changes should be empty.
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Cancelling with an invalid id should do nothing.
-  EXPECT_FALSE(setup.delegate()->cancel_window_move_loop_called());
-  setup.window_tree_test_helper()->window_tree()->CancelWindowMove(
-      kInvalidTransportId);
-  EXPECT_TRUE(setup.changes()->empty());
-  EXPECT_FALSE(setup.delegate()->cancel_window_move_loop_called());
-
-  // Cancel with the real id should notify the delegate.
-  EXPECT_FALSE(setup.delegate()->cancel_window_move_loop_called());
-  setup.window_tree_test_helper()->window_tree()->CancelWindowMove(
-      top_level_id);
-  EXPECT_TRUE(setup.delegate()->cancel_window_move_loop_called());
-  // No changes yet, because |move_loop_callback| was not run yet.
-  EXPECT_TRUE(setup.changes()->empty());
-  // Run the closure, which triggers notifying the client.
-  std::move(move_loop_callback).Run(false);
-  EXPECT_EQ("ChangeCompleted id=12 success=false",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, CancelMode) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(top_level));
-  // Dispatch a CancelEvent. This should go to the |top_level| as it has focus.
-  setup.root()->GetHost()->dispatcher()->DispatchCancelModeEvent();
-  EXPECT_EQ("CANCEL_MODE",
-            EventToEventType(
-                setup.window_tree_client()->PopInputEvent().event.get()));
-}
-
-TEST(WindowTreeTest, PerformDragDrop) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  const Id top_level_id =
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformDragDrop(
-      12, top_level_id, gfx::Point(),
-      base::flat_map<std::string, std::vector<uint8_t>>(), gfx::ImageSkia(),
-      gfx::Vector2d(), 0, ::ui::mojom::PointerKind::MOUSE);
-
-  // Let the posted drag loop task run.
-  base::RunLoop().RunUntilIdle();
-
-  // WindowServiceDelegate should be asked to run the drag loop.
-  WindowServiceDelegate::DragDropCompletedCallback drag_loop_callback =
-      setup.delegate()->TakeDragLoopCallback();
-  ASSERT_TRUE(drag_loop_callback);
-
-  // As the drag is in progress, changes should be empty.
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Respond with a drop operation, client should be notified with success.
-  std::move(drag_loop_callback).Run(ui::DragDropTypes::DRAG_MOVE);
-  EXPECT_EQ("OnPerformDragDropCompleted id=12 success=true action=1",
-            SingleChangeToDescription(*setup.changes()));
-
-  // Starts another drag and but the drag is canceled this time.
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformDragDrop(
-      13, top_level_id, gfx::Point(),
-      base::flat_map<std::string, std::vector<uint8_t>>(), gfx::ImageSkia(),
-      gfx::Vector2d(), 0, ::ui::mojom::PointerKind::MOUSE);
-  base::RunLoop().RunUntilIdle();
-  drag_loop_callback = setup.delegate()->TakeDragLoopCallback();
-  ASSERT_TRUE(drag_loop_callback);
-
-  std::move(drag_loop_callback).Run(ui::DragDropTypes::DRAG_NONE);
-  EXPECT_EQ("OnPerformDragDropCompleted id=13 success=false action=0",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, PerformDragDropBeforePreviousOneFinish) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  const Id top_level_id =
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformDragDrop(
-      12, top_level_id, gfx::Point(),
-      base::flat_map<std::string, std::vector<uint8_t>>(), gfx::ImageSkia(),
-      gfx::Vector2d(), 0, ::ui::mojom::PointerKind::MOUSE);
-
-  // PerformDragDrop before the drag loop task runs should fail.
-  setup.window_tree_test_helper()->window_tree()->PerformDragDrop(
-      13, top_level_id, gfx::Point(),
-      base::flat_map<std::string, std::vector<uint8_t>>(), gfx::ImageSkia(),
-      gfx::Vector2d(), 0, ::ui::mojom::PointerKind::MOUSE);
-  EXPECT_EQ("OnPerformDragDropCompleted id=13 success=false action=0",
-            SingleChangeToDescription(*setup.changes()));
-
-  // Let the posted drag loop task run.
-  base::RunLoop().RunUntilIdle();
-
-  // WindowServiceDelegate should be asked to run the drag loop.
-  WindowServiceDelegate::DragDropCompletedCallback drag_loop_callback =
-      setup.delegate()->TakeDragLoopCallback();
-  ASSERT_TRUE(drag_loop_callback);
-
-  // PerformDragDrop after the drop loop task runs should fail too because
-  // the drag is not finished.
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformDragDrop(
-      14, top_level_id, gfx::Point(),
-      base::flat_map<std::string, std::vector<uint8_t>>(), gfx::ImageSkia(),
-      gfx::Vector2d(), 0, ::ui::mojom::PointerKind::MOUSE);
-  EXPECT_EQ("OnPerformDragDropCompleted id=14 success=false action=0",
-            SingleChangeToDescription(*setup.changes()));
-
-  // Finish the drop operation, client should be notified with success.
-  setup.changes()->clear();
-  std::move(drag_loop_callback).Run(ui::DragDropTypes::DRAG_MOVE);
-  EXPECT_EQ("OnPerformDragDropCompleted id=12 success=true action=1",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, CancelDragDrop) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  const Id top_level_id =
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformDragDrop(
-      12, top_level_id, gfx::Point(),
-      base::flat_map<std::string, std::vector<uint8_t>>(), gfx::ImageSkia(),
-      gfx::Vector2d(), 0, ::ui::mojom::PointerKind::MOUSE);
-
-  // Let the posted drag loop task run.
-  base::RunLoop().RunUntilIdle();
-
-  // WindowServiceDelegate should be asked to run the drag loop.
-  WindowServiceDelegate::DragDropCompletedCallback drag_loop_callback =
-      setup.delegate()->TakeDragLoopCallback();
-  ASSERT_TRUE(drag_loop_callback);
-
-  // Cancelling with an invalid id should do nothing.
-  EXPECT_FALSE(setup.delegate()->cancel_drag_loop_called());
-  setup.window_tree_test_helper()->window_tree()->CancelDragDrop(
-      kInvalidTransportId);
-  EXPECT_TRUE(setup.changes()->empty());
-  EXPECT_FALSE(setup.delegate()->cancel_drag_loop_called());
-
-  // Cancel with the real id should notify the delegate.
-  EXPECT_FALSE(setup.delegate()->cancel_drag_loop_called());
-  setup.window_tree_test_helper()->window_tree()->CancelDragDrop(top_level_id);
-  EXPECT_TRUE(setup.delegate()->cancel_drag_loop_called());
-
-  // No changes yet because the |drag_loop_callback| has not run.
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Run the closure to simulate drag cancel.
-  std::move(drag_loop_callback).Run(ui::DragDropTypes::DRAG_NONE);
-  EXPECT_EQ("OnPerformDragDropCompleted id=12 success=false action=0",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, CancelDragDropBeforeDragLoopRun) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  const Id top_level_id =
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level);
-  setup.changes()->clear();
-  setup.window_tree_test_helper()->window_tree()->PerformDragDrop(
-      12, top_level_id, gfx::Point(),
-      base::flat_map<std::string, std::vector<uint8_t>>(), gfx::ImageSkia(),
-      gfx::Vector2d(), 0, ::ui::mojom::PointerKind::MOUSE);
-
-  // Cancel the drag before the drag loop task runs.
-  EXPECT_FALSE(setup.delegate()->cancel_drag_loop_called());
-  setup.window_tree_test_helper()->window_tree()->CancelDragDrop(top_level_id);
-  EXPECT_TRUE(setup.delegate()->cancel_drag_loop_called());
-
-  // Let the posted drag loop task run.
-  base::RunLoop().RunUntilIdle();
-
-  // WindowServiceDelegate should not be notified.
-  WindowServiceDelegate::DragDropCompletedCallback drag_loop_callback =
-      setup.delegate()->TakeDragLoopCallback();
-  EXPECT_FALSE(drag_loop_callback);
-
-  // The request should fail.
-  EXPECT_EQ("OnPerformDragDropCompleted id=12 success=false action=0",
-            SingleChangeToDescription(*setup.changes()));
-}
-
-TEST(WindowTreeTest, DsfChanges) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-  ProxyWindow* top_level_proxy_window = ProxyWindow::GetMayBeNull(top_level);
-  const base::Optional<viz::LocalSurfaceIdAllocation>
-      initial_surface_id_allocation =
-          top_level_proxy_window->local_surface_id_allocation();
-  EXPECT_TRUE(initial_surface_id_allocation);
-
-  // Changing the scale factor should change the LocalSurfaceId.
-  setup.aura_test_helper()->test_screen()->SetDeviceScaleFactor(2.0f);
-  EXPECT_TRUE(top_level_proxy_window->local_surface_id_allocation());
-  EXPECT_NE(*top_level_proxy_window->local_surface_id_allocation(),
-            *initial_surface_id_allocation);
-}
-
-TEST(WindowTreeTest, DontSendGestures) {
-  // Create a top-level and a child window.
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->SetBounds(gfx::Rect(0, 0, 100, 100));
-  top_level->Show();
-  aura::Window* child_window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(child_window);
-  top_level->AddChild(child_window);
-  child_window->SetBounds(gfx::Rect(0, 0, 100, 100));
-  child_window->Show();
-
-  ui::test::EventGenerator event_generator(setup.root());
-  // GestureTapAt() generates a touch down/up, and should not generate a gesture
-  // because the Window Service consumes touch events (consuming touch events
-  // results in no GestureEvents being generated). Additionally, gestures should
-  // never be forwarded to the client, as it's assumed the client runs its own
-  // gesture recognizer.
-  event_generator.GestureTapAt(gfx::Point(10, 10));
-  EXPECT_EQ("ET_TOUCH_PRESSED",
-            EventToEventType(
-                setup.window_tree_client()->PopInputEvent().event.get()));
-  EXPECT_EQ("ET_TOUCH_RELEASED",
-            EventToEventType(
-                setup.window_tree_client()->PopInputEvent().event.get()));
-  EXPECT_TRUE(setup.window_tree_client()->input_events().empty());
-}
-
-TEST(WindowTreeTest, DeactivateWindow) {
-  // Create two top-levels and focuses (activates) the second.
-  WindowServiceTestSetup setup;
-  aura::Window* top_level1 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level1);
-  top_level1->Show();
-  aura::Window* top_level2 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level2);
-  top_level2->Show();
-  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(top_level2));
-  EXPECT_TRUE(wm::IsActiveWindow(top_level2));
-
-  // Attempting to deactivate |top_level1| should do nothing.
-  setup.window_tree_test_helper()->window_tree()->DeactivateWindow(
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level1));
-  EXPECT_TRUE(wm::IsActiveWindow(top_level2));
-
-  // Similarly, calling Deactivate() with an invalid id should do nothing.
-  setup.window_tree_test_helper()->window_tree()->DeactivateWindow(
-      kInvalidTransportId);
-  EXPECT_TRUE(wm::IsActiveWindow(top_level2));
-
-  // Deactivate() with |top_level2| should activate |top_level1|.
-  setup.window_tree_test_helper()->window_tree()->DeactivateWindow(
-      setup.window_tree_test_helper()->TransportIdForWindow(top_level2));
-  EXPECT_TRUE(wm::IsActiveWindow(top_level1));
-}
-
-TEST(WindowTreeTest, AttachFrameSinkId) {
-  // Create two top-levels and focuses (activates) the second.
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  top_level->Show();
-
-  aura::Window* child_window = setup.window_tree_test_helper()->NewWindow();
-  ASSERT_TRUE(child_window);
-  viz::FrameSinkId test_frame_sink_id(101, 102);
-  viz::HostFrameSinkManager* host_frame_sink_manager =
-      aura::Env::GetInstance()
-          ->context_factory_private()
-          ->GetHostFrameSinkManager();
-
-  // Attach a frame sink to |child_window|. This shouldn't immediately register.
-  setup.window_tree_test_helper()->window_tree()->AttachFrameSinkId(
-      setup.window_tree_test_helper()->TransportIdForWindow(child_window),
-      test_frame_sink_id);
-  EXPECT_FALSE(
-      host_frame_sink_manager->IsFrameSinkIdRegistered(test_frame_sink_id));
-
-  // Add the window to a parent, which should trigger registering the hierarchy.
-  viz::FakeHostFrameSinkClient test_host_frame_sink_client;
-  host_frame_sink_manager->RegisterFrameSinkId(
-      test_frame_sink_id, &test_host_frame_sink_client,
-      viz::ReportFirstSurfaceActivation::kYes);
-  EXPECT_EQ(test_frame_sink_id,
-            ProxyWindow::GetMayBeNull(child_window)->attached_frame_sink_id());
-  top_level->AddChild(child_window);
-  EXPECT_TRUE(host_frame_sink_manager->IsFrameSinkHierarchyRegistered(
-      ProxyWindow::GetMayBeNull(top_level)->frame_sink_id(),
-      test_frame_sink_id));
-
-  // Removing the window should remove the association.
-  top_level->RemoveChild(child_window);
-  EXPECT_FALSE(host_frame_sink_manager->IsFrameSinkHierarchyRegistered(
-      ProxyWindow::GetMayBeNull(top_level)->frame_sink_id(),
-      test_frame_sink_id));
-
-  setup.window_tree_test_helper()->DeleteWindow(child_window);
-
-  host_frame_sink_manager->InvalidateFrameSinkId(test_frame_sink_id);
-}
-
-TEST(WindowTreeTest, OcclusionStateChange) {
-  WindowServiceTestSetup setup;
-
-  // Create |tracked| and tracks its occlusion state.
-  aura::Window* tracked = setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(tracked);
-  tracked->SetBounds(gfx::Rect(0, 0, 10, 10));
-
-  tracked->TrackOcclusionState();
-
-  // Gets HIDDEN state since |tracked| is created hidden.
-  EXPECT_TRUE(ContainsChange(
-      *setup.changes(),
-      "OnOcclusionStatesChanged {{window_id=0,1, state=HIDDEN}}"));
-
-  // Gets VISIBLE state when |tracked| is shown.
-  tracked->Show();
-  EXPECT_TRUE(ContainsChange(
-      *setup.changes(),
-      "OnOcclusionStatesChanged {{window_id=0,1, state=VISIBLE}}"));
-
-  // Creates |blocking_window| and make it occlude |tracked|.
-  aura::Window* blocking_window =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(blocking_window);
-  blocking_window->SetProperty(aura::client::kWindowLayerDrawn, true);
-  blocking_window->SetBounds(gfx::Rect(0, 0, 15, 15));
-  blocking_window->Show();
-
-  // Gets OCCLUDED state since |blocking_window| covers |tracked|.
-  EXPECT_TRUE(ContainsChange(
-      *setup.changes(),
-      "OnOcclusionStatesChanged {{window_id=0,1, state=OCCLUDED}}"));
-}
-
-TEST(WindowTreeTest, OcclusionStateChangeBatchSameTree) {
-  WindowServiceTestSetup setup;
-
-  // Create two tracked windows and tracks their occlusion state.
-  aura::Window* tracked_1 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(tracked_1);
-  tracked_1->SetBounds(gfx::Rect(0, 0, 10, 10));
-  tracked_1->TrackOcclusionState();
-  tracked_1->Show();
-
-  aura::Window* tracked_2 =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(tracked_2);
-  tracked_2->SetBounds(gfx::Rect(10, 0, 10, 10));
-  tracked_2->TrackOcclusionState();
-  tracked_2->Show();
-
-  // Creates |blocking_window| and make it occlude both tracked windows.
-  aura::Window* blocking_window =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(blocking_window);
-  blocking_window->SetProperty(aura::client::kWindowLayerDrawn, true);
-  blocking_window->SetBounds(gfx::Rect(0, 0, 20, 15));
-  blocking_window->Show();
-
-  // Occlusion changes of windows for the same tree are sent together.
-  EXPECT_TRUE(
-      ContainsChange(*setup.changes(),
-                     "OnOcclusionStatesChanged {{window_id=0,1, "
-                     "state=OCCLUDED}, {window_id=0,2, state=OCCLUDED}}"));
-}
-
-TEST(WindowTreeTest, OcclusionStateChangeBatchDifferentTree) {
-  WindowServiceTestSetup setup;
-
-  // Create |tracked_1| from default tree.
-  aura::Window* tracked_1 =
-      setup.window_tree_test_helper()->NewTopLevelWindow(100);
-  ASSERT_TRUE(tracked_1);
-  tracked_1->SetBounds(gfx::Rect(0, 0, 10, 10));
-  tracked_1->TrackOcclusionState();
-  tracked_1->Show();
-
-  // Create |tracked_2| from a second tree.
-  TestWindowTreeClient client2;
-  std::unique_ptr<WindowTree> tree2 =
-      setup.service()->CreateWindowTree(&client2);
-  tree2->InitFromFactory();
-  WindowTreeTestHelper tree2_test_helper(tree2.get());
-
-  aura::Window* tracked_2 = tree2_test_helper.NewTopLevelWindow(200);
-  ASSERT_TRUE(tracked_2);
-  tracked_2->SetBounds(gfx::Rect(10, 0, 10, 10));
-  tracked_2->TrackOcclusionState();
-  tracked_2->Show();
-
-  // Creates |blocking_window| and make it occlude both tracked windows.
-  aura::Window* blocking_window =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  ASSERT_TRUE(blocking_window);
-  blocking_window->SetProperty(aura::client::kWindowLayerDrawn, true);
-  blocking_window->SetBounds(gfx::Rect(0, 0, 20, 15));
-  blocking_window->Show();
-
-  // Occlusion changes are sent separately for different trees.
-  EXPECT_TRUE(ContainsChange(*setup.changes(),
-                             "OnOcclusionStatesChanged {{window_id=0,100, "
-                             "state=OCCLUDED}}"));
-  EXPECT_TRUE(ContainsChange(*client2.tracker()->changes(),
-                             "OnOcclusionStatesChanged {{window_id=0,200, "
-                             "state=OCCLUDED}}"));
-}
-
-TEST(WindowTreeTest, OcclusionTrackingPause) {
-  WindowServiceTestSetup setup;
-  aura::test::WindowOcclusionTrackerTestApi tracker_api(
-      setup.service()->env()->GetWindowOcclusionTracker());
-  ASSERT_FALSE(tracker_api.IsPaused());
-
-  // Simple case of one pause.
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->PauseWindowOcclusionTracking();
-  EXPECT_TRUE(tracker_api.IsPaused());
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->UnpauseWindowOcclusionTracking();
-  EXPECT_FALSE(tracker_api.IsPaused());
-
-  // Multiple pauses.
-  constexpr int kPauses = 3;
-  for (int i = 0; i < kPauses; ++i) {
-    setup.window_tree_test_helper()
-        ->window_tree()
-        ->PauseWindowOcclusionTracking();
-    EXPECT_TRUE(tracker_api.IsPaused());
-  }
-  for (int i = 0; i < kPauses - 1; ++i) {
-    setup.window_tree_test_helper()
-        ->window_tree()
-        ->UnpauseWindowOcclusionTracking();
-    EXPECT_TRUE(tracker_api.IsPaused());
-  }
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->UnpauseWindowOcclusionTracking();
-  EXPECT_FALSE(tracker_api.IsPaused());
-}
-
-TEST(WindowTreeTest, OcclusionTrackingPauseInterleaved) {
-  WindowServiceTestSetup setup;
-  aura::test::WindowOcclusionTrackerTestApi tracker_api(
-      setup.service()->env()->GetWindowOcclusionTracker());
-  ASSERT_FALSE(tracker_api.IsPaused());
-
-  // Creates a second WindowTree.
-  TestWindowTreeClient tree_client;
-  std::unique_ptr<WindowTree> tree2 =
-      setup.service()->CreateWindowTree(&tree_client);
-  tree2->InitFromFactory();
-  auto helper2 = std::make_unique<WindowTreeTestHelper>(tree2.get());
-
-  // Tree1 pauses.
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->PauseWindowOcclusionTracking();
-  EXPECT_TRUE(tracker_api.IsPaused());
-
-  // Tree2 pauses.
-  helper2->window_tree()->PauseWindowOcclusionTracking();
-  EXPECT_TRUE(tracker_api.IsPaused());
-
-  // Tree1 unpauses.
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->UnpauseWindowOcclusionTracking();
-  EXPECT_TRUE(tracker_api.IsPaused());
-
-  // Tree2 unpauses
-  helper2->window_tree()->UnpauseWindowOcclusionTracking();
-  EXPECT_FALSE(tracker_api.IsPaused());
-}
-
-TEST(WindowTreeTest, OcclusionTrackingPauseGoingAwayTree) {
-  WindowServiceTestSetup setup;
-  aura::test::WindowOcclusionTrackerTestApi tracker_api(
-      setup.service()->env()->GetWindowOcclusionTracker());
-  ASSERT_FALSE(tracker_api.IsPaused());
-
-  // Tree1 pauses.
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->PauseWindowOcclusionTracking();
-  EXPECT_TRUE(tracker_api.IsPaused());
-
-  // Creates a second WindowTree.
-  TestWindowTreeClient tree_client;
-  std::unique_ptr<WindowTree> tree2 =
-      setup.service()->CreateWindowTree(&tree_client);
-  tree2->InitFromFactory();
-  auto helper2 = std::make_unique<WindowTreeTestHelper>(tree2.get());
-
-  // Tree2 creates an outstanding pause.
-  helper2->window_tree()->PauseWindowOcclusionTracking();
-  EXPECT_TRUE(tracker_api.IsPaused());
-
-  // Tree2 goes away with the outstanding pause.
-  helper2.reset();
-  tree2.reset();
-
-  // Still paused because tree1 still holds a pause.
-  EXPECT_TRUE(tracker_api.IsPaused());
-
-  // Tree1 releases the pause and tracker is unpaused.
-  setup.window_tree_test_helper()
-      ->window_tree()
-      ->UnpauseWindowOcclusionTracking();
-  EXPECT_FALSE(tracker_api.IsPaused());
-}
-
-// Forces window visibility to a target value in OnWindowVisibilityChanged().
-// This mimics MultiUserWindowManager in ash.
-class WindowVisibilityEnforcer : public aura::WindowObserver {
- public:
-  WindowVisibilityEnforcer(aura::Window* window, bool target_visibility)
-      : window_(window), target_visibility_(target_visibility) {
-    window_->AddObserver(this);
-  }
-  ~WindowVisibilityEnforcer() override { StopObservering(); }
-
-  // aura::WindowObserver:
-  void OnWindowVisibilityChanged(aura::Window* window, bool visible) override {
-    if (visible == target_visibility_)
-      return;
-
-    if (target_visibility_)
-      window->Show();
-    else
-      window->Hide();
-  }
-  void OnWindowDestroying(aura::Window* window) override { StopObservering(); }
-
- private:
-  void StopObservering() {
-    if (!window_)
-      return;
-    window_->RemoveObserver(this);
-    window_ = nullptr;
-  }
-
-  aura::Window* window_;
-  const bool target_visibility_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowVisibilityEnforcer);
-};
-
-TEST(WindowTreeTest, ForcedWindowVisibility) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-
-  // WindowVisibilityEnforcer ensures the window remains hidden.
-  std::unique_ptr<WindowVisibilityEnforcer> enforcer =
-      std::make_unique<WindowVisibilityEnforcer>(top_level, false);
-  // Attempting to show the window should fail because WindowVisibilityEnforcer
-  // forces the window to remain hidden.
-  EXPECT_FALSE(
-      setup.window_tree_test_helper()->SetWindowVisibility(top_level, true));
-  EXPECT_FALSE(top_level->IsVisible());
-  // The client should not be notified of anything (returning false is enough).
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Destroy the enforcer and make the window visible.
-  enforcer.reset();
-  EXPECT_TRUE(
-      setup.window_tree_test_helper()->SetWindowVisibility(top_level, true));
-  EXPECT_TRUE(top_level->IsVisible());
-  EXPECT_TRUE(setup.changes()->empty());
-
-  // Create another enforcer that forces the window to remain visible.
-  enforcer = std::make_unique<WindowVisibilityEnforcer>(top_level, true);
-  // Attempting to hide the window should fail because WindowVisibilityEnforcer
-  // forces the window to remain visible.
-  EXPECT_FALSE(
-      setup.window_tree_test_helper()->SetWindowVisibility(top_level, false));
-  EXPECT_TRUE(top_level->IsVisible());
-  EXPECT_TRUE(setup.changes()->empty());
-}
-
-TEST(WindowTreeTest, SetWindowTransform) {
-  WindowServiceTestSetup setup;
-  aura::Window* top_level =
-      setup.window_tree_test_helper()->NewTopLevelWindow();
-  setup.changes()->clear();
-  gfx::Transform scaled;
-  scaled.Scale(2, 2);
-  EXPECT_FALSE(
-      setup.window_tree_test_helper()->SetTransform(top_level, scaled));
-  EXPECT_EQ(gfx::Transform(), top_level->transform());
-
-  aura::Window* child_window = setup.window_tree_test_helper()->NewWindow();
-  EXPECT_TRUE(
-      setup.window_tree_test_helper()->SetTransform(child_window, scaled));
-  EXPECT_EQ(scaled, child_window->transform());
-}
-
-TEST(WindowTreeTest, AddingTransientGoesThroughParentingClient) {
-  WindowServiceTestSetup setup;
-  aura::test::TestWindowParentingClient test_window_parenting_client(
-      setup.aura_test_helper()->root_window());
-  WindowTreeTestHelper* helper = setup.window_tree_test_helper();
-  aura::Window* top_level = helper->NewTopLevelWindow();
-  ASSERT_TRUE(top_level);
-  aura::Window* transient = helper->NewTopLevelWindow();
-  ASSERT_TRUE(transient);
-
-  // Put |top_level| in |container|.
-  aura::Window container(nullptr);
-  container.Init(ui::LAYER_NOT_DRAWN);
-  top_level->parent()->AddChild(&container);
-  container.AddChild(top_level);
-  test_window_parenting_client.set_default_parent(&container);
-  EXPECT_NE(&container, transient->parent());
-
-  // AddTransientWindow() should trigger calling into the WindowParentingClient,
-  // which will result in adding |transient| as a child of |container|.
-  helper->window_tree()->AddTransientWindow(
-      10, helper->TransportIdForWindow(top_level),
-      helper->TransportIdForWindow(transient));
-  EXPECT_EQ(&container, transient->parent());
-}
-
-}  // namespace
-}  // namespace ws
diff --git a/services/ws/window_utils.cc b/services/ws/window_utils.cc
deleted file mode 100644
index 9363998..0000000
--- a/services/ws/window_utils.cc
+++ /dev/null
@@ -1,52 +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 "services/ws/window_utils.h"
-
-#include "services/ws/proxy_window.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/window.h"
-#include "ui/gfx/geometry/insets.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/rect.h"
-
-namespace ws {
-
-bool IsLocationInNonClientArea(const aura::Window* window,
-                               const gfx::Point& location) {
-  const ProxyWindow* proxy_window = ProxyWindow::GetMayBeNull(window);
-  if (!proxy_window || !proxy_window->IsTopLevel())
-    return false;
-
-  // Locations inside bounds but within the resize insets count as non-client
-  // area. Locations outside the bounds, assume it's in extended hit test area,
-  // which is non-client area.
-  ui::WindowShowState window_state =
-      window->GetProperty(aura::client::kShowStateKey);
-  if ((window->GetProperty(aura::client::kResizeBehaviorKey) &
-       ws::mojom::kResizeBehaviorCanResize) &&
-      (window_state != ui::WindowShowState::SHOW_STATE_MAXIMIZED) &&
-      (window_state != ui::WindowShowState::SHOW_STATE_FULLSCREEN)) {
-    int resize_handle_size =
-        window->GetProperty(aura::client::kResizeHandleInset);
-    gfx::Rect non_handle_area(window->bounds().size());
-    non_handle_area.Inset(gfx::Insets(resize_handle_size));
-    if (!non_handle_area.Contains(location))
-      return true;
-  }
-
-  gfx::Rect client_area(window->bounds().size());
-  client_area.Inset(proxy_window->client_area());
-  if (client_area.Contains(location))
-    return false;
-
-  for (const auto& rect : proxy_window->additional_client_areas()) {
-    if (rect.Contains(location))
-      return false;
-  }
-  return true;
-}
-
-}  // namespace ws
diff --git a/services/ws/window_utils.h b/services/ws/window_utils.h
deleted file mode 100644
index 7878f1a..0000000
--- a/services/ws/window_utils.h
+++ /dev/null
@@ -1,29 +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 SERVICES_WS_WINDOW_UTILS_H_
-#define SERVICES_WS_WINDOW_UTILS_H_
-
-#include "base/component_export.h"
-
-namespace aura {
-class Window;
-}
-
-namespace gfx {
-class Point;
-}
-
-namespace ws {
-
-// Returns true if |location| is in the non-client area (or outside the bounds
-// of the window). A return value of false means the location is in the client
-// area.
-COMPONENT_EXPORT(WINDOW_SERVICE)
-bool IsLocationInNonClientArea(const aura::Window* window,
-                               const gfx::Point& location);
-
-}  // namespace ws
-
-#endif  // SERVICES_WS_WINDOW_PROPERTIES_H_
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 41889aba..c2c2605 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -1,27 +1,20 @@
+
 /*
- * Copyright (C) 2006 The Android Open Source Project
+ * Copyright 2006 The Android Open Source Project
  *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
  */
 
+
 #ifndef SKIA_CONFIG_SKUSERCONFIG_H_
 #define SKIA_CONFIG_SKUSERCONFIG_H_
 
 /*  SkTypes.h, the root of the public header files, does the following trick:
 
-    #include <SkPreConfig.h>
-    #include <SkUserConfig.h>
-    #include <SkPostConfig.h>
+    #include "include/config/SkUserConfig.h"
+    #include "include/core/SkPostConfig.h"
+    #include "include/core/SkPreConfig.h"
 
     SkPreConfig.h runs first, and it is responsible for initializing certain
     skia defines.
@@ -36,7 +29,7 @@
 
     Below are optional defines that add, subtract, or change default behavior
     in Skia. Your port can locally edit this file to enable/disable flags as
-    you choose, or these can be declared on your command line (i.e. -Dfoo).
+    you choose, or these can be delared on your command line (i.e. -Dfoo).
 
     By default, this include file will always default to having all of the flags
     commented out, so including it will have no effect.
@@ -56,6 +49,81 @@
 //#define SK_DEBUG
 //#define SK_RELEASE
 
+/*  Skia has certain debug-only code that is extremely intensive even for debug
+    builds.  This code is useful for diagnosing specific issues, but is not
+    generally applicable, therefore it must be explicitly enabled to avoid
+    the performance impact. By default these flags are undefined, but can be
+    enabled by uncommenting them below.
+ */
+//#define SK_DEBUG_GLYPH_CACHE
+//#define SK_DEBUG_PATH
+
+/*  preconfig will have attempted to determine the endianness of the system,
+    but you can change these mutually exclusive flags here.
+ */
+//#define SK_CPU_BENDIAN
+//#define SK_CPU_LENDIAN
+
+/*  Most compilers use the same bit endianness for bit flags in a byte as the
+    system byte endianness, and this is the default. If for some reason this
+    needs to be overridden, specify which of the mutually exclusive flags to
+    use. For example, some atom processors in certain configurations have big
+    endian byte order but little endian bit orders.
+*/
+//#define SK_UINT8_BITFIELD_BENDIAN
+//#define SK_UINT8_BITFIELD_LENDIAN
+
+
+/*  To write debug messages to a console, skia will call SkDebugf(...) following
+    printf conventions (e.g. const char* format, ...). If you want to redirect
+    this to something other than printf, define yours here
+ */
+//#define SkDebugf(...)  MyFunction(__VA_ARGS__)
+
+/*
+ *  To specify a different default font cache limit, define this. If this is
+ *  undefined, skia will use a built-in value.
+ */
+//#define SK_DEFAULT_FONT_CACHE_LIMIT   (1024 * 1024)
+
+/*
+ *  To specify the default size of the image cache, undefine this and set it to
+ *  the desired value (in bytes). SkGraphics.h as a runtime API to set this
+ *  value as well. If this is undefined, a built-in value will be used.
+ */
+//#define SK_DEFAULT_IMAGE_CACHE_LIMIT (1024 * 1024)
+
+/*  Define this to set the upper limit for text to support LCD. Values that
+    are very large increase the cost in the font cache and draw slower, without
+    improving readability. If this is undefined, Skia will use its default
+    value (e.g. 48)
+ */
+//#define SK_MAX_SIZE_FOR_LCDTEXT     48
+
+/*  Change the kN32_SkColorType ordering to BGRA to work in X windows.
+ */
+//#define SK_R32_SHIFT    16
+
+
+/* Determines whether to build code that supports the GPU backend. Some classes
+   that are not GPU-specific, such as SkShader subclasses, have optional code
+   that is used allows them to interact with the GPU backend. If you'd like to
+   omit this code set SK_SUPPORT_GPU to 0. This also allows you to omit the gpu
+   directories from your include search path when you're not building the GPU
+   backend. Defaults to 1 (build the GPU code).
+ */
+//#define SK_SUPPORT_GPU 1
+
+/* Skia makes use of histogram logging macros to trace the frequency of
+ * events. By default, Skia provides no-op versions of these macros.
+ * Skia consumers can provide their own definitions of these macros to
+ * integrate with their histogram collection backend.
+ */
+//#define SK_HISTOGRAM_BOOLEAN(name, value)
+//#define SK_HISTOGRAM_ENUMERATION(name, value, boundary_value)
+
+// ===== Begin Chrome-specific definitions =====
+
 #ifdef DCHECK_ALWAYS_ON
     #undef SK_RELEASE
     #define SK_DEBUG
@@ -70,8 +138,6 @@
 // converted to type3 when producing PDFs, and reduces build size.
 #define SK_PDF_DO_NOT_SUPPORT_TYPE_1_FONTS
 
-// ===== Begin Chrome-specific definitions =====
-
 #ifdef SK_DEBUG
 #define SK_REF_CNT_MIXIN_INCLUDE "skia/config/sk_ref_cnt_ext_debug.h"
 #else
@@ -82,16 +148,11 @@
 #undef SK_MSCALAR_IS_DOUBLE
 
 // Log the file and line number for assertions.
-#define SkDebugf(...) SkDebugf_FileLine(__FILE__, __LINE__, false, __VA_ARGS__)
-SK_API void SkDebugf_FileLine(const char* file, int line, bool fatal,
-                              const char* format, ...);
-
-// Marking the debug print as "fatal" will cause a debug break, so we don't need
-// a separate crash call here.
-#define SK_DEBUGBREAK(cond) do { if (!(cond)) { \
-    SkDebugf_FileLine(__FILE__, __LINE__, true, \
-    "%s:%d: failed assertion \"%s\"\n", \
-    __FILE__, __LINE__, #cond); } } while (false)
+#define SkDebugf(...) SkDebugf_FileLine(__FILE__, __LINE__, __VA_ARGS__)
+SK_API void SkDebugf_FileLine(const char* file,
+                              int line,
+                              const char* format,
+                              ...);
 
 #if !defined(ANDROID)   // On Android, we use the skia default settings.
 #define SK_A32_SHIFT    24
@@ -125,11 +186,6 @@
 
 #endif
 
-// The default crash macro writes to badbeef which can cause some strange
-// problems. Instead, pipe this through to the logging function as a fatal
-// assertion.
-#define SK_CRASH() SkDebugf_FileLine(__FILE__, __LINE__, true, "SK_CRASH")
-
 // These flags are no longer defined in Skia, but we have them (temporarily)
 // until we update our call-sites (typically these are for API changes).
 //
diff --git a/skia/ext/google_logging.cc b/skia/ext/google_logging.cc
index 27b44d4d..c3db43b 100644
--- a/skia/ext/google_logging.cc
+++ b/skia/ext/google_logging.cc
@@ -10,12 +10,11 @@
 #include "base/strings/stringprintf.h"
 #include "third_party/skia/include/core/SkTypes.h"
 
-void SkDebugf_FileLine(const char* file, int line, bool fatal,
-                       const char* format, ...) {
+void SkDebugf_FileLine(const char* file, int line, const char* format, ...) {
 #if DCHECK_IS_ON()
-  int severity = fatal ? logging::LOG_FATAL : logging::LOG_ERROR;
+  int severity = logging::LOG_ERROR;
 #else
-  int severity = fatal ? logging::LOG_FATAL : logging::LOG_INFO;
+  int severity = logging::LOG_INFO;
 #endif
   if (severity < logging::GetMinLogLevel())
     return;
diff --git a/skia/ext/platform_canvas.cc b/skia/ext/platform_canvas.cc
index 4258dff..e2574ce 100644
--- a/skia/ext/platform_canvas.cc
+++ b/skia/ext/platform_canvas.cc
@@ -57,8 +57,7 @@
     bitmap.setPixels(data);
   } else {
       if (!bitmap.tryAllocPixels()) {
-        if (CRASH_ON_FAILURE == failureType)
-          SK_CRASH();
+        CHECK(failureType != CRASH_ON_FAILURE);
         return nullptr;
       }
 
diff --git a/skia/ext/raster_handle_allocator_win.cc b/skia/ext/raster_handle_allocator_win.cc
index d2c4feb..8cd6de71 100644
--- a/skia/ext/raster_handle_allocator_win.cc
+++ b/skia/ext/raster_handle_allocator_win.cc
@@ -148,8 +148,7 @@
     }
   }
 
-  if (failure_type == CRASH_ON_FAILURE)
-    SK_CRASH();
+  CHECK(failure_type != CRASH_ON_FAILURE);
   return nullptr;
 }
 
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 76c7ff3..e05844b 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -8656,12 +8656,6 @@
     "scripts": [
       {
         "isolate_coverage_data": true,
-        "name": "check_static_initializers",
-        "script": "check_static_initializers.py",
-        "swarming": {}
-      },
-      {
-        "isolate_coverage_data": true,
         "name": "checkdeps",
         "script": "checkdeps.py",
         "swarming": {}
diff --git a/testing/buildbot/filters/fuchsia.mojo_unittests.filter b/testing/buildbot/filters/fuchsia.mojo_unittests.filter
index 8f529675..08b60848 100644
--- a/testing/buildbot/filters/fuchsia.mojo_unittests.filter
+++ b/testing/buildbot/filters/fuchsia.mojo_unittests.filter
@@ -7,9 +7,3 @@
 # crbug.com/780317 - These timeout under QEMU s/w emulation of ARM64.
 -MultiprocessMessagePipeTestWithPeerSupport.PingPongPipe*
 -MessagePipeTest.SharedBufferHandlePingPong
-
-# Flaky since migration to unified mojo_unittests, https://crbug.com/814914.
--FileDataPipeProducerTest.HugeFile
-
-# Flaky due to slow process launch, https://crbug.com/831024.
--DataPipeTest.SendConsumerAndCloseProducer
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 95b84a96..f047e1a3 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -2652,11 +2652,11 @@
     "type": "console_test_launcher",
   },
   "usb_descriptors_fuzzer": {
-    "label": "//device/usb:usb_descriptors_fuzzer",
+    "label": "//services/device/usb:usb_descriptors_fuzzer",
     "type": "fuzzer",
   },
   "usb_string_read_fuzzer": {
-    "label": "//device/usb:usb_string_read_fuzzer",
+    "label": "//services/device/usb:usb_string_read_fuzzer",
     "type": "fuzzer",
   },
   "usrsctp_fuzzer": {
@@ -2863,7 +2863,7 @@
     "type": "script",
   },
   "webusb_descriptors_fuzzer": {
-    "label": "//device/usb:webusb_descriptors_fuzzer",
+    "label": "//services/device/usb:webusb_descriptors_fuzzer",
     "type": "fuzzer",
   },
   "webview_cts_tests": {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 538e2797..fb58416 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -282,6 +282,12 @@
       },
     },
   },
+  # TODO(crbug.com/956591): Remove this once the bug is fixed.
+  'check_static_initializers': {
+    'remove_from': [
+      'Linux Tests Code Coverage',
+    ],
+  },
   'checkbins': {
     'remove_from': [
       'linux-archive-dbg',
diff --git a/testing/libfuzzer/fuzzer_test.gni b/testing/libfuzzer/fuzzer_test.gni
index 056844fc..863377d 100644
--- a/testing/libfuzzer/fuzzer_test.gni
+++ b/testing/libfuzzer/fuzzer_test.gni
@@ -17,7 +17,6 @@
 # - additional_configs - additional configs to be used for compilation
 # - dict - a dictionary file for the fuzzer.
 # - environment_variables - certain whitelisted environment variables for the
-# - configs_to_remove - (EXPERIMENTAL, don't use) configs to remove.
 # fuzzer (AFL_DRIVER_DONT_DEFER is the only one allowed currently).
 # - libfuzzer_options - options for the fuzzer (e.g. -close_fd_mask=N).
 # - asan_options - AddressSanitizer options (e.g. allow_user_segv_handler=1).
@@ -196,9 +195,6 @@
                              ])
       deps = test_deps
 
-      if (defined(invoker.configs_to_remove)) {
-        configs -= invoker.configs_to_remove
-      }
       if (defined(invoker.additional_configs)) {
         configs += invoker.additional_configs
       }
diff --git a/testing/scripts/gpu_integration_test_adapter.py b/testing/scripts/gpu_integration_test_adapter.py
index 54711eb..4672058b3 100644
--- a/testing/scripts/gpu_integration_test_adapter.py
+++ b/testing/scripts/gpu_integration_test_adapter.py
@@ -13,15 +13,9 @@
     return ['--all']
 
   def generate_test_filter_args(self, test_filter_str):
-    filter_list = common.extract_filter_list(test_filter_str)
     # isolated_script_test_filter comes in like:
-    #   gpu_tests.webgl_conformance_integration_test.WebGLConformanceIntegrationTest.WebglExtension_WEBGL_depth_texture  # pylint: disable=line-too-long
-    # but we need to pass it to --test-filter like this:
-    #   WebglExtension_WEBGL_depth_texture
-    filter_list = [f.split('.')[-1] for f in filter_list]
-    # Need to convert this to a valid regex.
-    filter_regex = '(' + '|'.join(filter_list) + ')'
-    return ['--test-filter=%s' % filter_regex]
+    # WebglExtension_WEBGL_depth_texture::conformance/textures/misc/copytexsubimage2d-subrects.html # pylint: disable=line-too-long
+    return ['--test-filter=%s' % test_filter_str]
 
   def generate_sharding_args(self, total_shards, shard_index):
     return ['--total-shards=%d' % total_shards,
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 117e24a..ecac1f7f 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -426,6 +426,21 @@
             ]
         }
     ],
+    "AndroidNightMode": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_20190503",
+                    "enable_features": [
+                        "AndroidNightMode"
+                    ]
+                }
+            ]
+        }
+    ],
     "AndroidSpellChecker": [
         {
             "platforms": [
@@ -3101,6 +3116,7 @@
                         "is_url_incremented_scale": "100",
                         "preconnect_skip_link_scores": "true",
                         "ratio_area_scale": "100",
+                        "retry_preconnect_wait_time_ms": "50",
                         "same_origin_preconnecting_allowed": "true",
                         "source_engagement_score_scale": "100",
                         "target_engagement_score_scale": "100",
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index e7a8081..332c140 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache 2.0
 License File: LICENSE
 Version: 0
-Revision: aa468ad75539619b47979911297efbb629c52e44
+Revision: 436ba6c4a0ea3a06eca6e055f9c8d296bf3bae12
 Security Critical: yes
 
 Description:
diff --git a/third_party/abseil-cpp/absl/base/BUILD.bazel b/third_party/abseil-cpp/absl/base/BUILD.bazel
index 9fb1d8c..c6f0e4d 100644
--- a/third_party/abseil-cpp/absl/base/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/base/BUILD.bazel
@@ -18,9 +18,9 @@
     "//absl:copts/configure_copts.bzl",
     "ABSL_DEFAULT_COPTS",
     "ABSL_DEFAULT_LINKOPTS",
-    "ABSL_TEST_COPTS",
     "ABSL_EXCEPTIONS_FLAG",
     "ABSL_EXCEPTIONS_FLAG_LINKOPTS",
+    "ABSL_TEST_COPTS",
 )
 
 package(default_visibility = ["//visibility:public"])
@@ -444,7 +444,7 @@
 
 cc_test(
     name = "low_level_alloc_test",
-    size = "small",
+    size = "medium",
     srcs = ["internal/low_level_alloc_test.cc"],
     copts = ABSL_TEST_COPTS,
     linkopts = ABSL_DEFAULT_LINKOPTS,
diff --git a/third_party/abseil-cpp/absl/base/config.h b/third_party/abseil-cpp/absl/base/config.h
index 3b81e26..2a14fe7 100644
--- a/third_party/abseil-cpp/absl/base/config.h
+++ b/third_party/abseil-cpp/absl/base/config.h
@@ -191,15 +191,13 @@
 // * On Clang:
 //   * Building using Clang for Windows, where the Clang runtime library has
 //     128-bit support only on LP64 architectures, but Windows is LLP64.
-//   * Building for aarch64, where __int128 exists but has exhibits a sporadic
-//     compiler crashing bug.
 // * On Nvidia's nvcc:
 //   * nvcc also defines __GNUC__ and __SIZEOF_INT128__, but not all versions
 //     actually support __int128.
 #ifdef ABSL_HAVE_INTRINSIC_INT128
 #error ABSL_HAVE_INTRINSIC_INT128 cannot be directly set
 #elif defined(__SIZEOF_INT128__)
-#if (defined(__clang__) && !defined(_WIN32) && !defined(__aarch64__)) || \
+#if (defined(__clang__) && !defined(_WIN32)) || \
     (defined(__CUDACC__) && __CUDACC_VER_MAJOR__ >= 9) ||                \
     (defined(__GNUC__) && !defined(__clang__) && !defined(__CUDACC__))
 #define ABSL_HAVE_INTRINSIC_INT128 1
diff --git a/third_party/abseil-cpp/absl/container/BUILD.bazel b/third_party/abseil-cpp/absl/container/BUILD.bazel
index f25a9ff..99a7248 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/container/BUILD.bazel
@@ -198,11 +198,23 @@
     deps = [
         ":inlined_vector",
         "//absl/base",
+        "//absl/base:core_headers",
         "//absl/strings",
         "@com_github_google_benchmark//:benchmark_main",
     ],
 )
 
+cc_test(
+    name = "inlined_vector_exception_safety_test",
+    srcs = ["inlined_vector_exception_safety_test.cc"],
+    copts = ABSL_TEST_COPTS + ABSL_EXCEPTIONS_FLAG,
+    deps = [
+        ":inlined_vector",
+        "//absl/base:exception_safety_testing",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
 cc_library(
     name = "test_instance_tracker",
     testonly = 1,
@@ -213,6 +225,7 @@
     visibility = [
         "//absl:__subpackages__",
     ],
+    deps = ["//absl/types:compare"],
 )
 
 cc_test(
diff --git a/third_party/abseil-cpp/absl/container/BUILD.gn b/third_party/abseil-cpp/absl/container/BUILD.gn
index 288987f6..3466fda 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.gn
+++ b/third_party/abseil-cpp/absl/container/BUILD.gn
@@ -114,6 +114,9 @@
   public = [
     "internal/test_instance_tracker.h",
   ]
+  deps = [
+    "../types:compare",
+  ]
   visibility = []
   visibility += [ "../*" ]
 }
diff --git a/third_party/abseil-cpp/absl/container/CMakeLists.txt b/third_party/abseil-cpp/absl/container/CMakeLists.txt
index 9531d7f..526e37a 100644
--- a/third_party/abseil-cpp/absl/container/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/container/CMakeLists.txt
@@ -195,6 +195,22 @@
     gmock_main
 )
 
+absl_cc_test(
+  NAME
+    inlined_vector_exception_safety_test
+  SRCS
+    "inlined_vector_exception_safety_test.cc"
+  COPTS
+    ${ABSL_TEST_COPTS}
+    ${ABSL_EXCEPTIONS_FLAG}
+  LINKOPTS
+    ${ABSL_EXCEPTIONS_FLAG_LINKOPTS}
+  DEPS
+    absl::inlined_vector
+    absl::exception_safety_testing
+    gmock_main
+)
+
 absl_cc_library(
   NAME
     test_instance_tracker
@@ -204,6 +220,8 @@
     "internal/test_instance_tracker.cc"
   COPTS
     ${ABSL_DEFAULT_COPTS}
+  DEPS
+    absl::compare
   TESTONLY
 )
 
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector.h b/third_party/abseil-cpp/absl/container/inlined_vector.h
index 34e9aa0..61e0cfb 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/inlined_vector.h
@@ -69,7 +69,7 @@
   static_assert(
       N > 0, "InlinedVector cannot be instantiated with `0` inlined elements.");
 
-  using Storage = inlined_vector_internal::Storage<InlinedVector>;
+  using Storage = inlined_vector_internal::Storage<T, N, A>;
   using AllocatorTraits = typename Storage::AllocatorTraits;
 
   template <typename Iterator>
@@ -784,16 +784,20 @@
   // Destroys all elements in the inlined vector, sets the size of `0` and
   // deallocates the heap allocation if the inlined vector was allocated.
   void clear() noexcept {
-    size_type s = size();
-    if (storage_.GetIsAllocated()) {
-      Destroy(storage_.GetAllocatedData(), storage_.GetAllocatedData() + s);
-      AllocatorTraits::deallocate(storage_.GetAllocator(),
-                                  storage_.GetAllocatedData(),
+    const bool is_allocated = storage_.GetIsAllocated();
+
+    pointer the_data =
+        is_allocated ? storage_.GetAllocatedData() : storage_.GetInlinedData();
+
+    inlined_vector_internal::DestroyElements(storage_.GetAllocator(), the_data,
+                                             storage_.GetSize());
+
+    if (is_allocated) {
+      AllocatorTraits::deallocate(storage_.GetAllocator(), the_data,
                                   storage_.GetAllocatedCapacity());
-    } else if (s != 0) {  // do nothing for empty vectors
-      Destroy(storage_.GetInlinedData(), storage_.GetInlinedData() + s);
     }
-    storage_.SetInlinedSize(0);
+
+    storage_.SetInlinedSize(/* size = */ 0);
   }
 
   // `InlinedVector::reserve()`
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector_benchmark.cc b/third_party/abseil-cpp/absl/container/inlined_vector_benchmark.cc
index 867a29e..7bb3271 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector_benchmark.cc
+++ b/third_party/abseil-cpp/absl/container/inlined_vector_benchmark.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 The Abseil Authors.
+// Copyright 2019 The Abseil Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "absl/container/inlined_vector.h"
-
 #include <string>
 #include <vector>
 
 #include "benchmark/benchmark.h"
 #include "absl/base/internal/raw_logging.h"
+#include "absl/base/macros.h"
+#include "absl/container/inlined_vector.h"
 #include "absl/strings/str_cat.h"
 
 namespace {
@@ -373,4 +373,72 @@
 }
 BENCHMARK(BM_StdVectorEmpty);
 
+constexpr size_t kInlineElements = 4;
+constexpr size_t kSmallSize = kInlineElements / 2;
+constexpr size_t kLargeSize = kInlineElements * 2;
+constexpr size_t kBatchSize = 100;
+
+struct TrivialType {
+  size_t val;
+};
+
+using TrivialVec = absl::InlinedVector<TrivialType, kInlineElements>;
+
+class NontrivialType {
+ public:
+  ABSL_ATTRIBUTE_NOINLINE NontrivialType() : val_() {}
+
+  ABSL_ATTRIBUTE_NOINLINE NontrivialType(const NontrivialType& other)
+      : val_(other.val_) {}
+
+  ABSL_ATTRIBUTE_NOINLINE NontrivialType& operator=(
+      const NontrivialType& other) {
+    val_ = other.val_;
+    return *this;
+  }
+
+  ABSL_ATTRIBUTE_NOINLINE ~NontrivialType() noexcept {}
+
+ private:
+  size_t val_;
+};
+
+using NontrivialVec = absl::InlinedVector<NontrivialType, kInlineElements>;
+
+#define BENCHMARK_OPERATION(BM_Function)                      \
+  BENCHMARK_TEMPLATE(BM_Function, TrivialVec, kSmallSize);    \
+  BENCHMARK_TEMPLATE(BM_Function, TrivialVec, kLargeSize);    \
+  BENCHMARK_TEMPLATE(BM_Function, NontrivialVec, kSmallSize); \
+  BENCHMARK_TEMPLATE(BM_Function, NontrivialVec, kLargeSize)
+
+template <typename VecT, typename PrepareVec, typename TestVec>
+void BatchedBenchmark(benchmark::State& state, PrepareVec prepare_vec,
+                      TestVec test_vec) {
+  VecT vectors[kBatchSize];
+
+  while (state.KeepRunningBatch(kBatchSize)) {
+    // Prepare batch
+    state.PauseTiming();
+    for (auto& vec : vectors) {
+      prepare_vec(&vec);
+    }
+    benchmark::DoNotOptimize(vectors);
+    state.ResumeTiming();
+
+    // Test batch
+    for (auto& vec : vectors) {
+      test_vec(&vec);
+    }
+  }
+}
+
+template <typename VecT, size_t Size>
+void BM_Clear(benchmark::State& state) {
+  BatchedBenchmark<VecT>(
+      state,
+      /* prepare_vec = */ [](VecT* vec) { vec->resize(Size); },
+      /* test_vec = */ [](VecT* vec) { vec->clear(); });
+}
+BENCHMARK_OPERATION(BM_Clear);
+
 }  // namespace
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector_exception_safety_test.cc b/third_party/abseil-cpp/absl/container/inlined_vector_exception_safety_test.cc
new file mode 100644
index 0000000..0af048b1
--- /dev/null
+++ b/third_party/abseil-cpp/absl/container/inlined_vector_exception_safety_test.cc
@@ -0,0 +1,55 @@
+// Copyright 2019 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <memory>
+
+#include "gtest/gtest.h"
+#include "absl/base/internal/exception_safety_testing.h"
+#include "absl/container/inlined_vector.h"
+
+namespace {
+
+constexpr size_t kInlined = 4;
+constexpr size_t kSmallSize = kInlined / 2;
+constexpr size_t kLargeSize = kInlined * 2;
+
+using Thrower = testing::ThrowingValue<>;
+using ThrowerAlloc = testing::ThrowingAllocator<Thrower>;
+
+template <typename Allocator = std::allocator<Thrower>>
+using InlVec = absl::InlinedVector<Thrower, kInlined, Allocator>;
+
+TEST(InlinedVector, DefaultConstructor) {
+  testing::TestThrowingCtor<InlVec<>>();
+
+  testing::TestThrowingCtor<InlVec<ThrowerAlloc>>();
+}
+
+TEST(InlinedVector, AllocConstructor) {
+  auto alloc = std::allocator<Thrower>();
+  testing::TestThrowingCtor<InlVec<>>(alloc);
+
+  auto throw_alloc = ThrowerAlloc();
+  testing::TestThrowingCtor<InlVec<ThrowerAlloc>>(throw_alloc);
+}
+
+TEST(InlinedVector, Clear) {
+  auto small_vec = InlVec<>(kSmallSize);
+  EXPECT_TRUE(testing::TestNothrowOp([&]() { small_vec.clear(); }));
+
+  auto large_vec = InlVec<>(kLargeSize);
+  EXPECT_TRUE(testing::TestNothrowOp([&]() { large_vec.clear(); }));
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
index b8b4f4ce..4589ce0 100644
--- a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
@@ -16,6 +16,7 @@
 #define ABSL_CONTAINER_INTERNAL_INLINED_VECTOR_INTERNAL_H_
 
 #include <cstddef>
+#include <cstring>
 #include <iterator>
 #include <memory>
 #include <utility>
@@ -31,12 +32,35 @@
     typename std::iterator_traits<Iterator>::iterator_category,
     std::forward_iterator_tag>;
 
-template <typename InlinedVector>
-class Storage;
+template <typename AllocatorType, typename ValueType, typename SizeType>
+void DestroyElements(AllocatorType alloc, ValueType* destroy_first,
+                     SizeType destroy_size) {
+  using AllocatorTraits = std::allocator_traits<AllocatorType>;
 
-template <template <typename, size_t, typename> class InlinedVector, typename T,
-          size_t N, typename A>
-class Storage<InlinedVector<T, N, A>> {
+  // Destroys `destroy_size` elements from `destroy_first`.
+  //
+  // Destroys the range
+  //   [`destroy_first`, `destroy_first + destroy_size`).
+  //
+  // NOTE: We assume destructors do not throw and thus make no attempt to roll
+  // back.
+  for (SizeType i = 0; i < destroy_size; ++i) {
+    AllocatorTraits::destroy(alloc, destroy_first + i);
+  }
+
+#ifndef NDEBUG
+  // Overwrite unused memory with `0xab` so we can catch uninitialized usage.
+  //
+  // Cast to `void*` to tell the compiler that we don't care that we might be
+  // scribbling on a vtable pointer.
+  void* memory = reinterpret_cast<void*>(destroy_first);
+  size_t memory_size = sizeof(ValueType) * destroy_size;
+  std::memset(memory, 0xab, memory_size);
+#endif  // NDEBUG
+}
+
+template <typename T, size_t N, typename A>
+class Storage {
  public:
   using allocator_type = A;
   using value_type = typename allocator_type::value_type;
diff --git a/third_party/abseil-cpp/absl/container/internal/test_instance_tracker.h b/third_party/abseil-cpp/absl/container/internal/test_instance_tracker.h
index 032d16d..3d4b2980 100644
--- a/third_party/abseil-cpp/absl/container/internal/test_instance_tracker.h
+++ b/third_party/abseil-cpp/absl/container/internal/test_instance_tracker.h
@@ -18,6 +18,8 @@
 #include <cstdlib>
 #include <ostream>
 
+#include "absl/types/compare.h"
+
 namespace absl {
 namespace test_internal {
 
@@ -96,6 +98,14 @@
     return value_ >= x.value_;
   }
 
+  absl::weak_ordering compare(const BaseCountedInstance& x) const {
+    ++num_comparisons_;
+    return value_ < x.value_
+               ? absl::weak_ordering::less
+               : value_ == x.value_ ? absl::weak_ordering::equivalent
+                                    : absl::weak_ordering::greater;
+  }
+
   int value() const {
     if (!is_live_) std::abort();
     return value_;
diff --git a/third_party/abseil-cpp/absl/container/internal/test_instance_tracker_test.cc b/third_party/abseil-cpp/absl/container/internal/test_instance_tracker_test.cc
index 091f428..1c6a4fa 100644
--- a/third_party/abseil-cpp/absl/container/internal/test_instance_tracker_test.cc
+++ b/third_party/abseil-cpp/absl/container/internal/test_instance_tracker_test.cc
@@ -174,6 +174,8 @@
   EXPECT_EQ(5, tracker.comparisons());
   EXPECT_FALSE(one >= two);
   EXPECT_EQ(6, tracker.comparisons());
+  EXPECT_TRUE(one.compare(two) < 0);  // NOLINT
+  EXPECT_EQ(7, tracker.comparisons());
 
   tracker.ResetCopiesMovesSwaps();
   EXPECT_EQ(0, tracker.comparisons());
diff --git a/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake b/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
index f968ba7..c4948d4 100644
--- a/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
+++ b/third_party/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake
@@ -41,6 +41,7 @@
     "-Wno-unreachable-code"
     "-Wno-unused-macros"
     "-Wno-weak-vtables"
+    "-Wno-zero-as-null-pointer-constant"
     "-Wbitfield-enum-conversion"
     "-Wbool-conversion"
     "-Wconstant-conversion"
@@ -149,6 +150,7 @@
     "-Wno-unreachable-code"
     "-Wno-unused-macros"
     "-Wno-weak-vtables"
+    "-Wno-zero-as-null-pointer-constant"
     "-Wbitfield-enum-conversion"
     "-Wbool-conversion"
     "-Wconstant-conversion"
diff --git a/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl b/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
index 2b4790a..422b3a9 100644
--- a/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
+++ b/third_party/abseil-cpp/absl/copts/GENERATED_copts.bzl
@@ -42,6 +42,7 @@
     "-Wno-unreachable-code",
     "-Wno-unused-macros",
     "-Wno-weak-vtables",
+    "-Wno-zero-as-null-pointer-constant",
     "-Wbitfield-enum-conversion",
     "-Wbool-conversion",
     "-Wconstant-conversion",
@@ -150,6 +151,7 @@
     "-Wno-unreachable-code",
     "-Wno-unused-macros",
     "-Wno-weak-vtables",
+    "-Wno-zero-as-null-pointer-constant",
     "-Wbitfield-enum-conversion",
     "-Wbool-conversion",
     "-Wconstant-conversion",
diff --git a/third_party/abseil-cpp/absl/copts/copts.py b/third_party/abseil-cpp/absl/copts/copts.py
index 8a0ecf6..5bede34 100644
--- a/third_party/abseil-cpp/absl/copts/copts.py
+++ b/third_party/abseil-cpp/absl/copts/copts.py
@@ -70,6 +70,8 @@
     # Causes warnings on include guards
     "-Wno-unused-macros",
     "-Wno-weak-vtables",
+    # Causes warnings on usage of types/compare.h comparison operators.
+    "-Wno-zero-as-null-pointer-constant",
     ###
     # Implicit conversion warnings turned off by -Wno-conversion
     # which are re-enabled below.
diff --git a/third_party/abseil-cpp/absl/debugging/BUILD.bazel b/third_party/abseil-cpp/absl/debugging/BUILD.bazel
index 0854314..e4aed5e4 100644
--- a/third_party/abseil-cpp/absl/debugging/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/debugging/BUILD.bazel
@@ -244,6 +244,7 @@
         "//conditions:default": [],
     }),
     linkopts = ABSL_LSAN_LINKOPTS + ABSL_DEFAULT_LINKOPTS,
+    tags = ["notsan"],
     deps = [
         ":leak_check_api_enabled_for_testing",
         "//absl/base",
@@ -256,6 +257,7 @@
     srcs = ["leak_check_test.cc"],
     copts = ["-UABSL_EXPECT_LEAK_SANITIZER"],
     linkopts = ABSL_DEFAULT_LINKOPTS,
+    tags = ["noasan"],
     deps = [
         ":leak_check_api_disabled_for_testing",
         "//absl/base",  # for raw_logging
@@ -271,6 +273,7 @@
     name = "disabled_leak_check_test",
     srcs = ["leak_check_fail_test.cc"],
     linkopts = ABSL_LSAN_LINKOPTS + ABSL_DEFAULT_LINKOPTS,
+    tags = ["notsan"],
     deps = [
         ":leak_check_api_enabled_for_testing",
         ":leak_check_disable",
diff --git a/third_party/abseil-cpp/absl/flags/BUILD.bazel b/third_party/abseil-cpp/absl/flags/BUILD.bazel
index 2d868b0..bb1a7aa 100644
--- a/third_party/abseil-cpp/absl/flags/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/flags/BUILD.bazel
@@ -220,6 +220,20 @@
 )
 
 cc_test(
+    name = "config_test",
+    size = "small",
+    srcs = [
+        "config_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    deps = [
+        ":config",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "flag_test",
     size = "small",
     srcs = [
diff --git a/third_party/abseil-cpp/absl/flags/CMakeLists.txt b/third_party/abseil-cpp/absl/flags/CMakeLists.txt
index 284d6279b..9e0b441b 100644
--- a/third_party/abseil-cpp/absl/flags/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/flags/CMakeLists.txt
@@ -203,6 +203,18 @@
 
 absl_cc_test(
   NAME
+    flags_config_test
+  SRCS
+    "config_test.cc"
+  COPTS
+    ${ABSL_TEST_COPTS}
+  DEPS
+    absl::flags_config
+    gtest_main
+)
+
+absl_cc_test(
+  NAME
     flags_flag_test
   SRCS
     "flag_test.cc"
diff --git a/third_party/abseil-cpp/absl/flags/config.h b/third_party/abseil-cpp/absl/flags/config.h
index a734af4..a9fd97a 100644
--- a/third_party/abseil-cpp/absl/flags/config.h
+++ b/third_party/abseil-cpp/absl/flags/config.h
@@ -17,38 +17,32 @@
 #define ABSL_FLAGS_CONFIG_H_
 
 // Determine if we should strip string literals from the Flag objects.
+// By default we strip string literals on mobile platforms.
 #if !defined(ABSL_FLAGS_STRIP_NAMES)
 
-// Non-mobile linux platforms don't strip string literals.
-#if (defined(__linux__) || defined(__Fuchsia__)) && !defined(__ANDROID__)
-#define ABSL_FLAGS_STRIP_NAMES 0
+#if defined(__ANDROID__)
+#define ABSL_FLAGS_STRIP_NAMES 1
 
-// So do Macs (not iOS or embedded Apple platforms).
 #elif defined(__APPLE__)
 #include <TargetConditionals.h>
-#if !TARGET_OS_IPHONE && !TARGET_OS_EMBEDDED
-#define ABSL_FLAGS_STRIP_NAMES 0
+#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+#define ABSL_FLAGS_STRIP_NAMES 1
+#elif defined(TARGET_OS_EMBEDDED) && TARGET_OS_EMBEDDED
+#define ABSL_FLAGS_STRIP_NAMES 1
+#endif  // TARGET_OS_*
 #endif
 
-// And Windows.
-#elif defined(_WIN32)
-#define ABSL_FLAGS_STRIP_NAMES 0
-
-// And Myriad.
-#elif defined(__myriad2__)
-#define ABSL_FLAGS_STRIP_NAMES 0
-
-#endif
 #endif  // !defined(ABSL_FLAGS_STRIP_NAMES)
 
-#if ABSL_FLAGS_STRIP_NAMES
-#if !defined(ABSL_FLAGS_STRIP_HELP)
-#define ABSL_FLAGS_STRIP_HELP 1
+#if !defined(ABSL_FLAGS_STRIP_NAMES)
+// If ABSL_FLAGS_STRIP_NAMES wasn't set on the command line or above,
+// the default is not to strip.
+#define ABSL_FLAGS_STRIP_NAMES 0
 #endif
-#else
+
 #if !defined(ABSL_FLAGS_STRIP_HELP)
-#define ABSL_FLAGS_STRIP_HELP 0
-#endif
+// By default, if we strip names, we also strip help.
+#define ABSL_FLAGS_STRIP_HELP ABSL_FLAGS_STRIP_NAMES
 #endif
 
 #endif  // ABSL_FLAGS_CONFIG_H_
diff --git a/third_party/abseil-cpp/absl/flags/config_test.cc b/third_party/abseil-cpp/absl/flags/config_test.cc
new file mode 100644
index 0000000..63899866
--- /dev/null
+++ b/third_party/abseil-cpp/absl/flags/config_test.cc
@@ -0,0 +1,61 @@
+//  Copyright 2019 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/flags/config.h"
+
+#ifdef __APPLE__
+#include <TargetConditionals.h>
+#endif
+
+#include "gtest/gtest.h"
+
+#ifndef ABSL_FLAGS_STRIP_NAMES
+#error ABSL_FLAGS_STRIP_NAMES is not defined
+#endif
+
+#ifndef ABSL_FLAGS_STRIP_HELP
+#error ABSL_FLAGS_STRIP_HELP is not defined
+#endif
+
+namespace {
+
+// Test that ABSL_FLAGS_STRIP_NAMES and ABSL_FLAGS_STRIP_HELP are configured how
+// we expect them to be configured by default. If you override this
+// configuration, this test will fail, but the code should still be safe to use.
+TEST(FlagsConfigTest, Test) {
+#if defined(__ANDROID__)
+  EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 1);
+  EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 1);
+#elif defined(__myriad2__)
+  EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 0);
+  EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 0);
+#elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+  EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 1);
+  EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 1);
+#elif defined(TARGET_OS_EMBEDDED) && TARGET_OS_EMBEDDED
+  EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 1);
+  EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 1);
+#elif defined(__APPLE__)
+  EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 0);
+  EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 0);
+#elif defined(_WIN32)
+  EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 0);
+  EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 0);
+#elif defined(__linux__)
+  EXPECT_EQ(ABSL_FLAGS_STRIP_NAMES, 0);
+  EXPECT_EQ(ABSL_FLAGS_STRIP_HELP, 0);
+#endif
+}
+
+}  // namespace
diff --git a/third_party/abseil-cpp/absl/flags/internal/registry.cc b/third_party/abseil-cpp/absl/flags/internal/registry.cc
index 89a2013..14c03ef4 100644
--- a/third_party/abseil-cpp/absl/flags/internal/registry.cc
+++ b/third_party/abseil-cpp/absl/flags/internal/registry.cc
@@ -15,7 +15,6 @@
 
 #include "absl/flags/internal/registry.h"
 
-#include "absl/base/call_once.h"
 #include "absl/base/dynamic_annotations.h"
 #include "absl/base/internal/raw_logging.h"
 #include "absl/flags/config.h"
@@ -151,12 +150,6 @@
 
   FlagPtrMap flag_ptr_map_;
 
-  static FlagRegistry* global_registry_;  // a singleton registry
-
-  static absl::once_flag global_registry_once_;
-
-  static void InitGlobalRegistry();
-
   absl::Mutex lock_;
 
   // Disallow
@@ -164,16 +157,9 @@
   FlagRegistry& operator=(const FlagRegistry&);
 };
 
-// Get the singleton FlagRegistry object
-FlagRegistry* FlagRegistry::global_registry_ = nullptr;
-absl::once_flag FlagRegistry::global_registry_once_;
-
-void FlagRegistry::InitGlobalRegistry() { global_registry_ = new FlagRegistry; }
-
 FlagRegistry* FlagRegistry::GlobalRegistry() {
-  absl::call_once(global_registry_once_, &InitGlobalRegistry);
-
-  return global_registry_;
+  static FlagRegistry* global_registry = new FlagRegistry;
+  return global_registry;
 }
 
 namespace {
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.bazel b/third_party/abseil-cpp/absl/strings/BUILD.bazel
index 2b19473..d6ce88d 100644
--- a/third_party/abseil-cpp/absl/strings/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/strings/BUILD.bazel
@@ -404,7 +404,7 @@
 
 cc_test(
     name = "numbers_test",
-    size = "small",
+    size = "medium",
     srcs = [
         "internal/numbers_test_common.h",
         "numbers_test.cc",
@@ -628,7 +628,7 @@
 
 cc_test(
     name = "str_format_convert_test",
-    size = "small",
+    size = "medium",
     srcs = ["internal/str_format/convert_test.cc"],
     copts = ABSL_TEST_COPTS,
     visibility = ["//visibility:private"],
diff --git a/third_party/abseil-cpp/absl/strings/str_format.h b/third_party/abseil-cpp/absl/strings/str_format.h
index 539d951..da3208e1 100644
--- a/third_party/abseil-cpp/absl/strings/str_format.h
+++ b/third_party/abseil-cpp/absl/strings/str_format.h
@@ -50,7 +50,7 @@
 //   * A `ParsedFormat` instance, which encapsulates a specific, pre-compiled
 //     format string for a specific set of type(s), and which can be passed
 //     between API boundaries. (The `FormatSpec` type should not be used
-//     directly.)
+//     directly except as an argument type for wrapper functions.)
 //
 // The `str_format` library provides the ability to output its format strings to
 // arbitrary sink types:
@@ -157,10 +157,15 @@
 // FormatSpec
 //
 // The `FormatSpec` type defines the makeup of a format string within the
-// `str_format` library. You should not need to use or manipulate this type
-// directly. A `FormatSpec` is a variadic class template that is evaluated at
-// compile-time, according to the format string and arguments that are passed
-// to it.
+// `str_format` library. It is a variadic class template that is evaluated at
+// compile-time, according to the format string and arguments that are passed to
+// it.
+//
+// You should not need to manipulate this type directly. You should only name it
+// if you are writing wrapper functions which accept format arguments that will
+// be provided unmodified to functions in this library. Such a wrapper function
+// might be a class method that provides format arguments and/or internally uses
+// the result of formatting.
 //
 // For a `FormatSpec` to be valid at compile-time, it must be provided as
 // either:
diff --git a/third_party/abseil-cpp/absl/strings/str_format_test.cc b/third_party/abseil-cpp/absl/strings/str_format_test.cc
index d4cffa0..80830b3 100644
--- a/third_party/abseil-cpp/absl/strings/str_format_test.cc
+++ b/third_party/abseil-cpp/absl/strings/str_format_test.cc
@@ -13,7 +13,7 @@
 namespace {
 using str_format_internal::FormatArgImpl;
 
-class FormatEntryPointTest : public ::testing::Test { };
+using FormatEntryPointTest = ::testing::Test;
 
 TEST_F(FormatEntryPointTest, Format) {
   std::string sink;
@@ -458,7 +458,7 @@
   return out;
 }
 
-class ParsedFormatTest : public testing::Test {};
+using ParsedFormatTest = ::testing::Test;
 
 TEST_F(ParsedFormatTest, SimpleChecked) {
   EXPECT_EQ("[ABC]{d:1$d}[DEF]",
@@ -600,6 +600,24 @@
   EXPECT_FALSE((ExtendedParsedFormat<Conv::d, Conv::o>::New("%1$d %o")));
 }
 
+using FormatWrapperTest = ::testing::Test;
+
+// Plain wrapper for StrFormat.
+template <typename... Args>
+std::string WrappedFormat(const absl::FormatSpec<Args...>& format,
+                          const Args&... args) {
+  return StrFormat(format, args...);
+}
+
+TEST_F(FormatWrapperTest, ConstexprStringFormat) {
+  EXPECT_EQ(WrappedFormat("%s there", "hello"), "hello there");
+}
+
+TEST_F(FormatWrapperTest, ParsedFormat) {
+  ParsedFormat<'s'> format("%s there");
+  EXPECT_EQ(WrappedFormat(format, "hello"), "hello there");
+}
+
 }  // namespace
 }  // namespace absl
 
diff --git a/third_party/abseil-cpp/absl/synchronization/mutex.cc b/third_party/abseil-cpp/absl/synchronization/mutex.cc
index ac2e2b9..acac740 100644
--- a/third_party/abseil-cpp/absl/synchronization/mutex.cc
+++ b/third_party/abseil-cpp/absl/synchronization/mutex.cc
@@ -154,7 +154,7 @@
   if (c < limit) {
     c++;               // spin
   } else {
-    ABSL_TSAN_MUTEX_PRE_DIVERT(0, 0);
+    ABSL_TSAN_MUTEX_PRE_DIVERT(nullptr, 0);
     if (c == limit) {  // yield once
       AbslInternalMutexYield();
       c++;
@@ -162,7 +162,7 @@
       absl::SleepFor(absl::Microseconds(10));
       c = 0;
     }
-    ABSL_TSAN_MUTEX_POST_DIVERT(0, 0);
+    ABSL_TSAN_MUTEX_POST_DIVERT(nullptr, 0);
   }
   return (c);
 }
@@ -901,11 +901,15 @@
       // base_internal::CycleClock::Now() is 0.5%.
       int policy;
       struct sched_param param;
-      pthread_getschedparam(pthread_self(), &policy, &param);
-      s->priority = param.sched_priority;
-      s->next_priority_read_cycles =
-          now_cycles +
-          static_cast<int64_t>(base_internal::CycleClock::Frequency());
+      const int err = pthread_getschedparam(pthread_self(), &policy, &param);
+      if (err != 0) {
+        ABSL_RAW_LOG(ERROR, "pthread_getschedparam failed: %d", err);
+      } else {
+        s->priority = param.sched_priority;
+        s->next_priority_read_cycles =
+            now_cycles +
+            static_cast<int64_t>(base_internal::CycleClock::Frequency());
+      }
     }
     if (s->priority > head->priority) {  // s's priority is above head's
       // try to put s in priority-fifo order, or failing that at the front.
@@ -2583,7 +2587,7 @@
 }
 
 void CondVar::Signal() {
-  ABSL_TSAN_MUTEX_PRE_SIGNAL(0, 0);
+  ABSL_TSAN_MUTEX_PRE_SIGNAL(nullptr, 0);
   intptr_t v;
   int c = 0;
   for (v = cv_.load(std::memory_order_relaxed); v != 0;
@@ -2612,17 +2616,17 @@
       if ((v & kCvEvent) != 0) {
         PostSynchEvent(this, SYNCH_EV_SIGNAL);
       }
-      ABSL_TSAN_MUTEX_POST_SIGNAL(0, 0);
+      ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
       return;
     } else {
       c = Delay(c, GENTLE);
     }
   }
-  ABSL_TSAN_MUTEX_POST_SIGNAL(0, 0);
+  ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
 }
 
 void CondVar::SignalAll () {
-  ABSL_TSAN_MUTEX_PRE_SIGNAL(0, 0);
+  ABSL_TSAN_MUTEX_PRE_SIGNAL(nullptr, 0);
   intptr_t v;
   int c = 0;
   for (v = cv_.load(std::memory_order_relaxed); v != 0;
@@ -2649,13 +2653,13 @@
       if ((v & kCvEvent) != 0) {
         PostSynchEvent(this, SYNCH_EV_SIGNALALL);
       }
-      ABSL_TSAN_MUTEX_POST_SIGNAL(0, 0);
+      ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
       return;
     } else {
       c = Delay(c, GENTLE);           // try again after a delay
     }
   }
-  ABSL_TSAN_MUTEX_POST_SIGNAL(0, 0);
+  ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
 }
 
 void ReleasableMutexLock::Release() {
diff --git a/third_party/abseil-cpp/absl/synchronization/mutex_test.cc b/third_party/abseil-cpp/absl/synchronization/mutex_test.cc
index 6df0a45c..9d643a5 100644
--- a/third_party/abseil-cpp/absl/synchronization/mutex_test.cc
+++ b/third_party/abseil-cpp/absl/synchronization/mutex_test.cc
@@ -815,7 +815,12 @@
 
 // Test that we correctly handle the situation when a lock is
 // held and then destroyed (w/o unlocking).
+#ifdef THREAD_SANITIZER
+// TSAN reports errors when locked Mutexes are destroyed.
+TEST(Mutex, DISABLED_LockedMutexDestructionBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
+#else
 TEST(Mutex, LockedMutexDestructionBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
+#endif
   for (int i = 0; i != 10; i++) {
     // Create, lock and destroy 10 locks.
     const int kNumLocks = 10;
@@ -1062,7 +1067,12 @@
 const char ScopedDisableBazelTestWarnings::kVarName[] =
     "TEST_WARNINGS_OUTPUT_FILE";
 
+#ifdef THREAD_SANITIZER
+// This test intentionally creates deadlocks to test the deadlock detector.
+TEST(Mutex, DISABLED_DeadlockDetectorBazelWarning) {
+#else
 TEST(Mutex, DeadlockDetectorBazelWarning) {
+#endif
   absl::SetMutexDeadlockDetectionMode(absl::OnDeadlockCycle::kReport);
 
   // Cause deadlock detection to detect something, if it's
@@ -1109,7 +1119,12 @@
   }
 }
 
+#ifdef THREAD_SANITIZER
+// TSAN reports errors when locked Mutexes are destroyed.
+TEST(Mutex, DISABLED_DeadlockIdBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
+#else
 TEST(Mutex, DeadlockIdBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
+#endif
   // Test a scenario where a cached deadlock graph node id in the
   // list of held locks is not invalidated when the corresponding
   // mutex is deleted.
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h b/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h
index bb191b3..3e24340 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h
@@ -555,13 +555,43 @@
 ////////////////////////////////////////////////////////////////////////
 
 CONSTEXPR_F civil_day next_weekday(civil_day cd, weekday wd) noexcept {
-  do { cd += 1; } while (get_weekday(cd) != wd);
-  return cd;
+  CONSTEXPR_D weekday k_weekdays_forw[14] = {
+      weekday::monday,    weekday::tuesday,  weekday::wednesday,
+      weekday::thursday,  weekday::friday,   weekday::saturday,
+      weekday::sunday,    weekday::monday,   weekday::tuesday,
+      weekday::wednesday, weekday::thursday, weekday::friday,
+      weekday::saturday,  weekday::sunday,
+  };
+  weekday base = get_weekday(cd);
+  for (int i = 0;; ++i) {
+    if (base == k_weekdays_forw[i]) {
+      for (int j = i + 1;; ++j) {
+        if (wd == k_weekdays_forw[j]) {
+          return cd + (j - i);
+        }
+      }
+    }
+  }
 }
 
 CONSTEXPR_F civil_day prev_weekday(civil_day cd, weekday wd) noexcept {
-  do { cd -= 1; } while (get_weekday(cd) != wd);
-  return cd;
+  CONSTEXPR_D weekday k_weekdays_back[14] = {
+      weekday::sunday,   weekday::saturday,  weekday::friday,
+      weekday::thursday, weekday::wednesday, weekday::tuesday,
+      weekday::monday,   weekday::sunday,    weekday::saturday,
+      weekday::friday,   weekday::thursday,  weekday::wednesday,
+      weekday::tuesday,  weekday::monday,
+  };
+  weekday base = get_weekday(cd);
+  for (int i = 0;; ++i) {
+    if (base == k_weekdays_back[i]) {
+      for (int j = i + 1;; ++j) {
+        if (wd == k_weekdays_back[j]) {
+          return cd - (j - i);
+        }
+      }
+    }
+  }
 }
 
 CONSTEXPR_F int get_yearday(const civil_day& cd) noexcept {
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc b/third_party/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc
index 445366e..a40f504 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc
@@ -47,6 +47,56 @@
 }
 BENCHMARK(BM_Step_Days);
 
+void BM_GetWeekday(benchmark::State& state) {
+  const cctz::civil_day c(2014, 8, 22);
+  while (state.KeepRunning()) {
+    benchmark::DoNotOptimize(cctz::get_weekday(c));
+  }
+}
+BENCHMARK(BM_GetWeekday);
+
+void BM_NextWeekday(benchmark::State& state) {
+  const cctz::civil_day kStart(2014, 8, 22);
+  const cctz::civil_day kDays[7] = {
+      kStart + 0, kStart + 1, kStart + 2, kStart + 3,
+      kStart + 4, kStart + 5, kStart + 6,
+  };
+  const cctz::weekday kWeekdays[7] = {
+      cctz::weekday::monday,   cctz::weekday::tuesday, cctz::weekday::wednesday,
+      cctz::weekday::thursday, cctz::weekday::friday,  cctz::weekday::saturday,
+      cctz::weekday::sunday,
+  };
+  while (state.KeepRunningBatch(7 * 7)) {
+    for (const auto from : kDays) {
+      for (const auto to : kWeekdays) {
+        benchmark::DoNotOptimize(cctz::next_weekday(from, to));
+      }
+    }
+  }
+}
+BENCHMARK(BM_NextWeekday);
+
+void BM_PrevWeekday(benchmark::State& state) {
+  const cctz::civil_day kStart(2014, 8, 22);
+  const cctz::civil_day kDays[7] = {
+      kStart + 0, kStart + 1, kStart + 2, kStart + 3,
+      kStart + 4, kStart + 5, kStart + 6,
+  };
+  const cctz::weekday kWeekdays[7] = {
+      cctz::weekday::monday,   cctz::weekday::tuesday, cctz::weekday::wednesday,
+      cctz::weekday::thursday, cctz::weekday::friday,  cctz::weekday::saturday,
+      cctz::weekday::sunday,
+  };
+  while (state.KeepRunningBatch(7 * 7)) {
+    for (const auto from : kDays) {
+      for (const auto to : kWeekdays) {
+        benchmark::DoNotOptimize(cctz::prev_weekday(from, to));
+      }
+    }
+  }
+}
+BENCHMARK(BM_PrevWeekday);
+
 const char RFC3339_full[] = "%Y-%m-%dT%H:%M:%E*S%Ez";
 const char RFC3339_sec[] = "%Y-%m-%dT%H:%M:%S%Ez";
 
diff --git a/third_party/abseil-cpp/absl/types/BUILD.bazel b/third_party/abseil-cpp/absl/types/BUILD.bazel
index a254871..134f9f2 100644
--- a/third_party/abseil-cpp/absl/types/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/types/BUILD.bazel
@@ -308,3 +308,27 @@
         "@com_google_googletest//:gtest_main",
     ],
 )
+
+cc_library(
+    name = "compare",
+    hdrs = ["compare.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    deps = [
+        "//absl/base:core_headers",
+        "//absl/meta:type_traits",
+    ],
+)
+
+cc_test(
+    name = "compare_test",
+    size = "small",
+    srcs = [
+        "compare_test.cc",
+    ],
+    copts = ABSL_TEST_COPTS,
+    deps = [
+        ":compare",
+        "//absl/base",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/third_party/abseil-cpp/absl/types/BUILD.gn b/third_party/abseil-cpp/absl/types/BUILD.gn
index a483f5e..c9aeff0 100644
--- a/third_party/abseil-cpp/absl/types/BUILD.gn
+++ b/third_party/abseil-cpp/absl/types/BUILD.gn
@@ -182,3 +182,19 @@
     "../utility",
   ]
 }
+
+source_set("compare") {
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    "//build/config/compiler:no_chromium_code",
+    "//third_party/abseil-cpp:absl_default_cflags_cc",
+  ]
+  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
+  public = [
+    "compare.h",
+  ]
+  deps = [
+    "../base:core_headers",
+    "../meta:type_traits",
+  ]
+}
diff --git a/third_party/abseil-cpp/absl/types/CMakeLists.txt b/third_party/abseil-cpp/absl/types/CMakeLists.txt
index 9da94eb..4ce685d 100644
--- a/third_party/abseil-cpp/absl/types/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/types/CMakeLists.txt
@@ -299,6 +299,32 @@
     gmock_main
 )
 
+absl_cc_library(
+  NAME
+    compare
+  HDRS
+    "compare.h"
+  COPTS
+    ${ABSL_DEFAULT_COPTS}
+  DEPS
+    absl::core_headers
+    absl::type_traits
+  PUBLIC
+)
+
+absl_cc_test(
+  NAME
+    compare_test
+  SRCS
+    "compare_test.cc"
+  COPTS
+    ${ABSL_TEST_COPTS}
+  DEPS
+    absl::base
+    absl::compare
+    gmock_main
+)
+
 # TODO(cohenjon,zhangxy) Figure out why this test is failing on gcc 4.8
 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
 else()
diff --git a/third_party/abseil-cpp/absl/types/compare.h b/third_party/abseil-cpp/absl/types/compare.h
new file mode 100644
index 0000000..50361d6
--- /dev/null
+++ b/third_party/abseil-cpp/absl/types/compare.h
@@ -0,0 +1,508 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// -----------------------------------------------------------------------------
+// compare.h
+// -----------------------------------------------------------------------------
+//
+// This header file defines the `absl::weak_equality`, `absl::strong_equality`,
+// `absl::partial_ordering`, `absl::weak_ordering`, and `absl::strong_ordering`
+// types for storing the results of three way comparisons.
+//
+// Example:
+//   absl::weak_ordering compare(const std::string& a, const std::string& b);
+//
+// These are C++11 compatible versions of the C++20 corresponding types
+// (`std::weak_equality`, etc.) and are designed to be drop-in replacements
+// for code compliant with C++20.
+
+#ifndef ABSL_TYPES_COMPARE_H_
+#define ABSL_TYPES_COMPARE_H_
+
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+#include <type_traits>
+
+#include "absl/base/attributes.h"
+#include "absl/meta/type_traits.h"
+
+namespace absl {
+namespace compare_internal {
+
+using value_type = int8_t;
+
+template <typename T>
+struct Fail {
+  static_assert(sizeof(T) < 0, "Only literal `0` is allowed.");
+};
+
+// We need the NullPtrT template to avoid triggering the modernize-use-nullptr
+// ClangTidy warning in user code.
+template <typename NullPtrT = std::nullptr_t>
+struct OnlyLiteralZero {
+  constexpr OnlyLiteralZero(NullPtrT) noexcept {}  // NOLINT
+
+  // Fails compilation when `nullptr` or integral type arguments other than
+  // `int` are passed. This constructor doesn't accept `int` because literal `0`
+  // has type `int`. Literal `0` arguments will be implicitly converted to
+  // `std::nullptr_t` and accepted by the above constructor, while other `int`
+  // arguments will fail to be converted and cause compilation failure.
+  template <
+      typename T,
+      typename = typename std::enable_if<
+          std::is_same<T, std::nullptr_t>::value ||
+          (std::is_integral<T>::value && !std::is_same<T, int>::value)>::type,
+      typename = typename Fail<T>::type>
+  OnlyLiteralZero(T);  // NOLINT
+};
+
+enum class eq : value_type {
+  equal = 0,
+  equivalent = equal,
+  nonequal = 1,
+  nonequivalent = nonequal,
+};
+
+enum class ord : value_type { less = -1, greater = 1 };
+
+enum class ncmp : value_type { unordered = -127 };
+
+// These template base classes allow for defining the values of the constants
+// in the header file (for performance) without using inline variables (which
+// aren't available in C++11).
+template <typename T>
+struct weak_equality_base {
+  ABSL_CONST_INIT static const T equivalent;
+  ABSL_CONST_INIT static const T nonequivalent;
+};
+template <typename T>
+const T weak_equality_base<T>::equivalent(eq::equivalent);
+template <typename T>
+const T weak_equality_base<T>::nonequivalent(eq::nonequivalent);
+
+template <typename T>
+struct strong_equality_base {
+  ABSL_CONST_INIT static const T equal;
+  ABSL_CONST_INIT static const T nonequal;
+  ABSL_CONST_INIT static const T equivalent;
+  ABSL_CONST_INIT static const T nonequivalent;
+};
+template <typename T>
+const T strong_equality_base<T>::equal(eq::equal);
+template <typename T>
+const T strong_equality_base<T>::nonequal(eq::nonequal);
+template <typename T>
+const T strong_equality_base<T>::equivalent(eq::equivalent);
+template <typename T>
+const T strong_equality_base<T>::nonequivalent(eq::nonequivalent);
+
+template <typename T>
+struct partial_ordering_base {
+  ABSL_CONST_INIT static const T less;
+  ABSL_CONST_INIT static const T equivalent;
+  ABSL_CONST_INIT static const T greater;
+  ABSL_CONST_INIT static const T unordered;
+};
+template <typename T>
+const T partial_ordering_base<T>::less(ord::less);
+template <typename T>
+const T partial_ordering_base<T>::equivalent(eq::equivalent);
+template <typename T>
+const T partial_ordering_base<T>::greater(ord::greater);
+template <typename T>
+const T partial_ordering_base<T>::unordered(ncmp::unordered);
+
+template <typename T>
+struct weak_ordering_base {
+  ABSL_CONST_INIT static const T less;
+  ABSL_CONST_INIT static const T equivalent;
+  ABSL_CONST_INIT static const T greater;
+};
+template <typename T>
+const T weak_ordering_base<T>::less(ord::less);
+template <typename T>
+const T weak_ordering_base<T>::equivalent(eq::equivalent);
+template <typename T>
+const T weak_ordering_base<T>::greater(ord::greater);
+
+template <typename T>
+struct strong_ordering_base {
+  ABSL_CONST_INIT static const T less;
+  ABSL_CONST_INIT static const T equal;
+  ABSL_CONST_INIT static const T equivalent;
+  ABSL_CONST_INIT static const T greater;
+};
+template <typename T>
+const T strong_ordering_base<T>::less(ord::less);
+template <typename T>
+const T strong_ordering_base<T>::equal(eq::equal);
+template <typename T>
+const T strong_ordering_base<T>::equivalent(eq::equivalent);
+template <typename T>
+const T strong_ordering_base<T>::greater(ord::greater);
+
+}  // namespace compare_internal
+
+class weak_equality
+    : public compare_internal::weak_equality_base<weak_equality> {
+  explicit constexpr weak_equality(compare_internal::eq v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  friend struct compare_internal::weak_equality_base<weak_equality>;
+
+ public:
+  // Comparisons
+  friend constexpr bool operator==(
+      weak_equality v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ == 0;
+  }
+  friend constexpr bool operator!=(
+      weak_equality v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ != 0;
+  }
+  friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>,
+                                   weak_equality v) noexcept {
+    return 0 == v.value_;
+  }
+  friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>,
+                                   weak_equality v) noexcept {
+    return 0 != v.value_;
+  }
+
+ private:
+  compare_internal::value_type value_;
+};
+
+class strong_equality
+    : public compare_internal::strong_equality_base<strong_equality> {
+  explicit constexpr strong_equality(compare_internal::eq v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  friend struct compare_internal::strong_equality_base<strong_equality>;
+
+ public:
+  // Conversion
+  constexpr operator weak_equality() const noexcept {  // NOLINT
+    return value_ == 0 ? weak_equality::equivalent
+                       : weak_equality::nonequivalent;
+  }
+  // Comparisons
+  friend constexpr bool operator==(
+      strong_equality v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ == 0;
+  }
+  friend constexpr bool operator!=(
+      strong_equality v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ != 0;
+  }
+  friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>,
+                                   strong_equality v) noexcept {
+    return 0 == v.value_;
+  }
+  friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>,
+                                   strong_equality v) noexcept {
+    return 0 != v.value_;
+  }
+
+ private:
+  compare_internal::value_type value_;
+};
+
+class partial_ordering
+    : public compare_internal::partial_ordering_base<partial_ordering> {
+  explicit constexpr partial_ordering(compare_internal::eq v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  explicit constexpr partial_ordering(compare_internal::ord v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  explicit constexpr partial_ordering(compare_internal::ncmp v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  friend struct compare_internal::partial_ordering_base<partial_ordering>;
+
+  constexpr bool is_ordered() const noexcept {
+    return value_ !=
+           compare_internal::value_type(compare_internal::ncmp::unordered);
+  }
+
+ public:
+  // Conversion
+  constexpr operator weak_equality() const noexcept {  // NOLINT
+    return value_ == 0 ? weak_equality::equivalent
+                       : weak_equality::nonequivalent;
+  }
+  // Comparisons
+  friend constexpr bool operator==(
+      partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.is_ordered() && v.value_ == 0;
+  }
+  friend constexpr bool operator!=(
+      partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return !v.is_ordered() || v.value_ != 0;
+  }
+  friend constexpr bool operator<(
+      partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.is_ordered() && v.value_ < 0;
+  }
+  friend constexpr bool operator<=(
+      partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.is_ordered() && v.value_ <= 0;
+  }
+  friend constexpr bool operator>(
+      partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.is_ordered() && v.value_ > 0;
+  }
+  friend constexpr bool operator>=(
+      partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.is_ordered() && v.value_ >= 0;
+  }
+  friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>,
+                                   partial_ordering v) noexcept {
+    return v.is_ordered() && 0 == v.value_;
+  }
+  friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>,
+                                   partial_ordering v) noexcept {
+    return !v.is_ordered() || 0 != v.value_;
+  }
+  friend constexpr bool operator<(compare_internal::OnlyLiteralZero<>,
+                                  partial_ordering v) noexcept {
+    return v.is_ordered() && 0 < v.value_;
+  }
+  friend constexpr bool operator<=(compare_internal::OnlyLiteralZero<>,
+                                   partial_ordering v) noexcept {
+    return v.is_ordered() && 0 <= v.value_;
+  }
+  friend constexpr bool operator>(compare_internal::OnlyLiteralZero<>,
+                                  partial_ordering v) noexcept {
+    return v.is_ordered() && 0 > v.value_;
+  }
+  friend constexpr bool operator>=(compare_internal::OnlyLiteralZero<>,
+                                   partial_ordering v) noexcept {
+    return v.is_ordered() && 0 >= v.value_;
+  }
+
+ private:
+  compare_internal::value_type value_;
+};
+
+class weak_ordering
+    : public compare_internal::weak_ordering_base<weak_ordering> {
+  explicit constexpr weak_ordering(compare_internal::eq v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  explicit constexpr weak_ordering(compare_internal::ord v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  friend struct compare_internal::weak_ordering_base<weak_ordering>;
+
+ public:
+  // Conversions
+  constexpr operator weak_equality() const noexcept {  // NOLINT
+    return value_ == 0 ? weak_equality::equivalent
+                       : weak_equality::nonequivalent;
+  }
+  constexpr operator partial_ordering() const noexcept {  // NOLINT
+    return value_ == 0 ? partial_ordering::equivalent
+                       : (value_ < 0 ? partial_ordering::less
+                                     : partial_ordering::greater);
+  }
+  // Comparisons
+  friend constexpr bool operator==(
+      weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ == 0;
+  }
+  friend constexpr bool operator!=(
+      weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ != 0;
+  }
+  friend constexpr bool operator<(
+      weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ < 0;
+  }
+  friend constexpr bool operator<=(
+      weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ <= 0;
+  }
+  friend constexpr bool operator>(
+      weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ > 0;
+  }
+  friend constexpr bool operator>=(
+      weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ >= 0;
+  }
+  friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>,
+                                   weak_ordering v) noexcept {
+    return 0 == v.value_;
+  }
+  friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>,
+                                   weak_ordering v) noexcept {
+    return 0 != v.value_;
+  }
+  friend constexpr bool operator<(compare_internal::OnlyLiteralZero<>,
+                                  weak_ordering v) noexcept {
+    return 0 < v.value_;
+  }
+  friend constexpr bool operator<=(compare_internal::OnlyLiteralZero<>,
+                                   weak_ordering v) noexcept {
+    return 0 <= v.value_;
+  }
+  friend constexpr bool operator>(compare_internal::OnlyLiteralZero<>,
+                                  weak_ordering v) noexcept {
+    return 0 > v.value_;
+  }
+  friend constexpr bool operator>=(compare_internal::OnlyLiteralZero<>,
+                                   weak_ordering v) noexcept {
+    return 0 >= v.value_;
+  }
+
+ private:
+  compare_internal::value_type value_;
+};
+
+class strong_ordering
+    : public compare_internal::strong_ordering_base<strong_ordering> {
+  explicit constexpr strong_ordering(compare_internal::eq v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  explicit constexpr strong_ordering(compare_internal::ord v) noexcept
+      : value_(static_cast<compare_internal::value_type>(v)) {}
+  friend struct compare_internal::strong_ordering_base<strong_ordering>;
+
+ public:
+  // Conversions
+  constexpr operator weak_equality() const noexcept {  // NOLINT
+    return value_ == 0 ? weak_equality::equivalent
+                       : weak_equality::nonequivalent;
+  }
+  constexpr operator strong_equality() const noexcept {  // NOLINT
+    return value_ == 0 ? strong_equality::equal : strong_equality::nonequal;
+  }
+  constexpr operator partial_ordering() const noexcept {  // NOLINT
+    return value_ == 0 ? partial_ordering::equivalent
+                       : (value_ < 0 ? partial_ordering::less
+                                     : partial_ordering::greater);
+  }
+  constexpr operator weak_ordering() const noexcept {  // NOLINT
+    return value_ == 0
+               ? weak_ordering::equivalent
+               : (value_ < 0 ? weak_ordering::less : weak_ordering::greater);
+  }
+  // Comparisons
+  friend constexpr bool operator==(
+      strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ == 0;
+  }
+  friend constexpr bool operator!=(
+      strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ != 0;
+  }
+  friend constexpr bool operator<(
+      strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ < 0;
+  }
+  friend constexpr bool operator<=(
+      strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ <= 0;
+  }
+  friend constexpr bool operator>(
+      strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ > 0;
+  }
+  friend constexpr bool operator>=(
+      strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept {
+    return v.value_ >= 0;
+  }
+  friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>,
+                                   strong_ordering v) noexcept {
+    return 0 == v.value_;
+  }
+  friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>,
+                                   strong_ordering v) noexcept {
+    return 0 != v.value_;
+  }
+  friend constexpr bool operator<(compare_internal::OnlyLiteralZero<>,
+                                  strong_ordering v) noexcept {
+    return 0 < v.value_;
+  }
+  friend constexpr bool operator<=(compare_internal::OnlyLiteralZero<>,
+                                   strong_ordering v) noexcept {
+    return 0 <= v.value_;
+  }
+  friend constexpr bool operator>(compare_internal::OnlyLiteralZero<>,
+                                  strong_ordering v) noexcept {
+    return 0 > v.value_;
+  }
+  friend constexpr bool operator>=(compare_internal::OnlyLiteralZero<>,
+                                   strong_ordering v) noexcept {
+    return 0 >= v.value_;
+  }
+
+ private:
+  compare_internal::value_type value_;
+};
+
+namespace compare_internal {
+// We also provide these comparator adapter functions for internal absl use.
+
+// Helper functions to do a boolean comparison of two keys given a boolean
+// or three-way comparator.
+// SFINAE prevents implicit conversions to bool (such as from int).
+template <typename Bool,
+          absl::enable_if_t<std::is_same<bool, Bool>::value, int> = 0>
+constexpr bool compare_result_as_less_than(const Bool r) { return r; }
+constexpr bool compare_result_as_less_than(const absl::weak_ordering r) {
+  return r < 0;
+}
+
+template <typename Compare, typename K, typename LK>
+constexpr bool do_less_than_comparison(const Compare &compare, const K &x,
+                                       const LK &y) {
+  return compare_result_as_less_than(compare(x, y));
+}
+
+// Helper functions to do a three-way comparison of two keys given a boolean or
+// three-way comparator.
+// SFINAE prevents implicit conversions to int (such as from bool).
+template <typename Int,
+          absl::enable_if_t<std::is_same<int, Int>::value, int> = 0>
+constexpr absl::weak_ordering compare_result_as_ordering(const Int c) {
+  return c < 0 ? absl::weak_ordering::less
+               : c == 0 ? absl::weak_ordering::equivalent
+                        : absl::weak_ordering::greater;
+}
+constexpr absl::weak_ordering compare_result_as_ordering(
+    const absl::weak_ordering c) {
+  return c;
+}
+
+template <
+    typename Compare, typename K, typename LK,
+    absl::enable_if_t<!std::is_same<bool, absl::result_of_t<Compare(
+                                              const K &, const LK &)>>::value,
+                      int> = 0>
+constexpr absl::weak_ordering do_three_way_comparison(const Compare &compare,
+                                                      const K &x, const LK &y) {
+  return compare_result_as_ordering(compare(x, y));
+}
+template <
+    typename Compare, typename K, typename LK,
+    absl::enable_if_t<std::is_same<bool, absl::result_of_t<Compare(
+                                             const K &, const LK &)>>::value,
+                      int> = 0>
+constexpr absl::weak_ordering do_three_way_comparison(const Compare &compare,
+                                                      const K &x, const LK &y) {
+  return compare(x, y) ? absl::weak_ordering::less
+                       : compare(y, x) ? absl::weak_ordering::greater
+                                       : absl::weak_ordering::equivalent;
+}
+
+}  // namespace compare_internal
+}  // namespace absl
+
+#endif  // ABSL_TYPES_COMPARE_H_
diff --git a/third_party/abseil-cpp/absl/types/compare_test.cc b/third_party/abseil-cpp/absl/types/compare_test.cc
new file mode 100644
index 0000000..3a855421
--- /dev/null
+++ b/third_party/abseil-cpp/absl/types/compare_test.cc
@@ -0,0 +1,311 @@
+// Copyright 2018 The Abseil Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/types/compare.h"
+
+#include "gtest/gtest.h"
+#include "absl/base/casts.h"
+
+namespace absl {
+namespace {
+
+// This is necessary to avoid a bunch of lint warnings suggesting that we use
+// EXPECT_EQ/etc., which doesn't work in this case because they convert the `0`
+// to an int, which can't be converted to the unspecified zero type.
+bool Identity(bool b) { return b; }
+
+TEST(Compare, WeakEquality) {
+  EXPECT_TRUE(Identity(weak_equality::equivalent == 0));
+  EXPECT_TRUE(Identity(0 == weak_equality::equivalent));
+  EXPECT_TRUE(Identity(weak_equality::nonequivalent != 0));
+  EXPECT_TRUE(Identity(0 != weak_equality::nonequivalent));
+}
+
+TEST(Compare, StrongEquality) {
+  EXPECT_TRUE(Identity(strong_equality::equal == 0));
+  EXPECT_TRUE(Identity(0 == strong_equality::equal));
+  EXPECT_TRUE(Identity(strong_equality::nonequal != 0));
+  EXPECT_TRUE(Identity(0 != strong_equality::nonequal));
+  EXPECT_TRUE(Identity(strong_equality::equivalent == 0));
+  EXPECT_TRUE(Identity(0 == strong_equality::equivalent));
+  EXPECT_TRUE(Identity(strong_equality::nonequivalent != 0));
+  EXPECT_TRUE(Identity(0 != strong_equality::nonequivalent));
+}
+
+TEST(Compare, PartialOrdering) {
+  EXPECT_TRUE(Identity(partial_ordering::less < 0));
+  EXPECT_TRUE(Identity(0 > partial_ordering::less));
+  EXPECT_TRUE(Identity(partial_ordering::less <= 0));
+  EXPECT_TRUE(Identity(0 >= partial_ordering::less));
+  EXPECT_TRUE(Identity(partial_ordering::equivalent == 0));
+  EXPECT_TRUE(Identity(0 == partial_ordering::equivalent));
+  EXPECT_TRUE(Identity(partial_ordering::greater > 0));
+  EXPECT_TRUE(Identity(0 < partial_ordering::greater));
+  EXPECT_TRUE(Identity(partial_ordering::greater >= 0));
+  EXPECT_TRUE(Identity(0 <= partial_ordering::greater));
+  EXPECT_TRUE(Identity(partial_ordering::unordered != 0));
+  EXPECT_TRUE(Identity(0 != partial_ordering::unordered));
+  EXPECT_FALSE(Identity(partial_ordering::unordered < 0));
+  EXPECT_FALSE(Identity(0 < partial_ordering::unordered));
+  EXPECT_FALSE(Identity(partial_ordering::unordered <= 0));
+  EXPECT_FALSE(Identity(0 <= partial_ordering::unordered));
+  EXPECT_FALSE(Identity(partial_ordering::unordered > 0));
+  EXPECT_FALSE(Identity(0 > partial_ordering::unordered));
+  EXPECT_FALSE(Identity(partial_ordering::unordered >= 0));
+  EXPECT_FALSE(Identity(0 >= partial_ordering::unordered));
+}
+
+TEST(Compare, WeakOrdering) {
+  EXPECT_TRUE(Identity(weak_ordering::less < 0));
+  EXPECT_TRUE(Identity(0 > weak_ordering::less));
+  EXPECT_TRUE(Identity(weak_ordering::less <= 0));
+  EXPECT_TRUE(Identity(0 >= weak_ordering::less));
+  EXPECT_TRUE(Identity(weak_ordering::equivalent == 0));
+  EXPECT_TRUE(Identity(0 == weak_ordering::equivalent));
+  EXPECT_TRUE(Identity(weak_ordering::greater > 0));
+  EXPECT_TRUE(Identity(0 < weak_ordering::greater));
+  EXPECT_TRUE(Identity(weak_ordering::greater >= 0));
+  EXPECT_TRUE(Identity(0 <= weak_ordering::greater));
+}
+
+TEST(Compare, StrongOrdering) {
+  EXPECT_TRUE(Identity(strong_ordering::less < 0));
+  EXPECT_TRUE(Identity(0 > strong_ordering::less));
+  EXPECT_TRUE(Identity(strong_ordering::less <= 0));
+  EXPECT_TRUE(Identity(0 >= strong_ordering::less));
+  EXPECT_TRUE(Identity(strong_ordering::equal == 0));
+  EXPECT_TRUE(Identity(0 == strong_ordering::equal));
+  EXPECT_TRUE(Identity(strong_ordering::equivalent == 0));
+  EXPECT_TRUE(Identity(0 == strong_ordering::equivalent));
+  EXPECT_TRUE(Identity(strong_ordering::greater > 0));
+  EXPECT_TRUE(Identity(0 < strong_ordering::greater));
+  EXPECT_TRUE(Identity(strong_ordering::greater >= 0));
+  EXPECT_TRUE(Identity(0 <= strong_ordering::greater));
+}
+
+TEST(Compare, Conversions) {
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(strong_equality::equal) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(strong_equality::nonequal) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(strong_equality::equivalent) == 0));
+  EXPECT_TRUE(Identity(
+      implicit_cast<weak_equality>(strong_equality::nonequivalent) != 0));
+
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(partial_ordering::less) != 0));
+  EXPECT_TRUE(Identity(
+      implicit_cast<weak_equality>(partial_ordering::equivalent) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(partial_ordering::greater) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(partial_ordering::unordered) != 0));
+
+  EXPECT_TRUE(implicit_cast<weak_equality>(weak_ordering::less) != 0);
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(weak_ordering::equivalent) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(weak_ordering::greater) != 0));
+
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(weak_ordering::less) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(weak_ordering::less) < 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(weak_ordering::less) <= 0));
+  EXPECT_TRUE(Identity(
+      implicit_cast<partial_ordering>(weak_ordering::equivalent) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(weak_ordering::greater) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(weak_ordering::greater) > 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(weak_ordering::greater) >= 0));
+
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(strong_ordering::less) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(strong_ordering::equal) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(strong_ordering::equivalent) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_equality>(strong_ordering::greater) != 0));
+
+  EXPECT_TRUE(
+      Identity(implicit_cast<strong_equality>(strong_ordering::less) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<strong_equality>(strong_ordering::equal) == 0));
+  EXPECT_TRUE(Identity(
+      implicit_cast<strong_equality>(strong_ordering::equivalent) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<strong_equality>(strong_ordering::greater) != 0));
+
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(strong_ordering::less) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(strong_ordering::less) < 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(strong_ordering::less) <= 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(strong_ordering::equal) == 0));
+  EXPECT_TRUE(Identity(
+      implicit_cast<partial_ordering>(strong_ordering::equivalent) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(strong_ordering::greater) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(strong_ordering::greater) > 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<partial_ordering>(strong_ordering::greater) >= 0));
+
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_ordering>(strong_ordering::less) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_ordering>(strong_ordering::less) < 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_ordering>(strong_ordering::less) <= 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_ordering>(strong_ordering::equal) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_ordering>(strong_ordering::equivalent) == 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_ordering>(strong_ordering::greater) != 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_ordering>(strong_ordering::greater) > 0));
+  EXPECT_TRUE(
+      Identity(implicit_cast<weak_ordering>(strong_ordering::greater) >= 0));
+}
+
+struct WeakOrderingLess {
+  template <typename T>
+  absl::weak_ordering operator()(const T &a, const T &b) const {
+    return a < b ? absl::weak_ordering::less
+                 : a == b ? absl::weak_ordering::equivalent
+                          : absl::weak_ordering::greater;
+  }
+};
+
+TEST(CompareResultAsLessThan, SanityTest) {
+  EXPECT_FALSE(absl::compare_internal::compare_result_as_less_than(false));
+  EXPECT_TRUE(absl::compare_internal::compare_result_as_less_than(true));
+
+  EXPECT_TRUE(
+      absl::compare_internal::compare_result_as_less_than(weak_ordering::less));
+  EXPECT_FALSE(absl::compare_internal::compare_result_as_less_than(
+      weak_ordering::equivalent));
+  EXPECT_FALSE(absl::compare_internal::compare_result_as_less_than(
+      weak_ordering::greater));
+}
+
+TEST(DoLessThanComparison, SanityTest) {
+  std::less<int> less;
+  WeakOrderingLess weak;
+
+  EXPECT_TRUE(absl::compare_internal::do_less_than_comparison(less, -1, 0));
+  EXPECT_TRUE(absl::compare_internal::do_less_than_comparison(weak, -1, 0));
+
+  EXPECT_FALSE(absl::compare_internal::do_less_than_comparison(less, 10, 10));
+  EXPECT_FALSE(absl::compare_internal::do_less_than_comparison(weak, 10, 10));
+
+  EXPECT_FALSE(absl::compare_internal::do_less_than_comparison(less, 10, 5));
+  EXPECT_FALSE(absl::compare_internal::do_less_than_comparison(weak, 10, 5));
+}
+
+TEST(CompareResultAsOrdering, SanityTest) {
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::compare_result_as_ordering(-1) < 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::compare_result_as_ordering(-1) == 0));
+  EXPECT_FALSE(
+      Identity(absl::compare_internal::compare_result_as_ordering(-1) > 0));
+  EXPECT_TRUE(Identity(absl::compare_internal::compare_result_as_ordering(
+                           weak_ordering::less) < 0));
+  EXPECT_FALSE(Identity(absl::compare_internal::compare_result_as_ordering(
+                            weak_ordering::less) == 0));
+  EXPECT_FALSE(Identity(absl::compare_internal::compare_result_as_ordering(
+                            weak_ordering::less) > 0));
+
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::compare_result_as_ordering(0) < 0));
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::compare_result_as_ordering(0) == 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::compare_result_as_ordering(0) > 0));
+  EXPECT_FALSE(Identity(absl::compare_internal::compare_result_as_ordering(
+                           weak_ordering::equivalent) < 0));
+  EXPECT_TRUE(Identity(absl::compare_internal::compare_result_as_ordering(
+                            weak_ordering::equivalent) == 0));
+  EXPECT_FALSE(Identity(absl::compare_internal::compare_result_as_ordering(
+                            weak_ordering::equivalent) > 0));
+
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::compare_result_as_ordering(1) < 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::compare_result_as_ordering(1) == 0));
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::compare_result_as_ordering(1) > 0));
+  EXPECT_FALSE(Identity(absl::compare_internal::compare_result_as_ordering(
+                           weak_ordering::greater) < 0));
+  EXPECT_FALSE(Identity(absl::compare_internal::compare_result_as_ordering(
+                            weak_ordering::greater) == 0));
+  EXPECT_TRUE(Identity(absl::compare_internal::compare_result_as_ordering(
+                            weak_ordering::greater) > 0));
+}
+
+TEST(DoThreeWayComparison, SanityTest) {
+  std::less<int> less;
+  WeakOrderingLess weak;
+
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, -1, 0) < 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, -1, 0) == 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, -1, 0) > 0));
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, -1, 0) < 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, -1, 0) == 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, -1, 0) > 0));
+
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, 10, 10) < 0));
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, 10, 10) == 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, 10, 10) > 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, 10, 10) < 0));
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, 10, 10) == 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, 10, 10) > 0));
+
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, 10, 5) < 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, 10, 5) == 0));
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::do_three_way_comparison(less, 10, 5) > 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, 10, 5) < 0));
+  EXPECT_FALSE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, 10, 5) == 0));
+  EXPECT_TRUE(Identity(
+      absl::compare_internal::do_three_way_comparison(weak, 10, 5) > 0));
+}
+
+}  // namespace
+}  // namespace absl
diff --git a/third_party/blink/public/mojom/usb/BUILD.gn b/third_party/blink/public/mojom/usb/BUILD.gn
index 9629b38..e04fd42f 100644
--- a/third_party/blink/public/mojom/usb/BUILD.gn
+++ b/third_party/blink/public/mojom/usb/BUILD.gn
@@ -15,10 +15,7 @@
 
   deps = [
     "//mojo/public/mojom/base",
-
-    # TODO(donna.wu@intel.com): Change the following line to //service/device/
-    # after it has been moved to //services/device.
-    "//device/usb/public/mojom",
+    "//services/device/public/mojom:usb",
   ]
 
   # USB Mojom interfaces are exposed publicly to web tests which use
diff --git a/third_party/blink/public/mojom/usb/web_usb_service.mojom b/third_party/blink/public/mojom/usb/web_usb_service.mojom
index 05c8e68..7d6a8e1 100644
--- a/third_party/blink/public/mojom/usb/web_usb_service.mojom
+++ b/third_party/blink/public/mojom/usb/web_usb_service.mojom
@@ -4,9 +4,9 @@
 
 module blink.mojom;
 
-import "device/usb/public/mojom/device.mojom";
-import "device/usb/public/mojom/device_enumeration_options.mojom";
-import "device/usb/public/mojom/device_manager_client.mojom";
+import "services/device/public/mojom/usb_device.mojom";
+import "services/device/public/mojom/usb_enumeration_options.mojom";
+import "services/device/public/mojom/usb_manager_client.mojom";
 
 // This is a parallel interface with UsbDeviceManager aimed to handle extra work
 // such as permission checking, chooser showing, etc. in browser.
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index dd4c9e1..02ef2a6 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -1519,7 +1519,6 @@
   kPresentationRequestStartInsecureOrigin = 2064,
   kPersistentClientHintHeader = 2065,
   kStyleSheetListNonNullAnonymousNamedGetter = 2066,
-  kOffMainThreadFetch = 2067,
   kARIAActiveDescendantAttribute = 2069,
   kARIAAtomicAttribute = 2070,
   kARIAAutocompleteAttribute = 2071,
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index cf06aa2..9211755 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -632,10 +632,6 @@
 
   // Fills in the WebMediaStream to capture from the WebMediaPlayer identified
   // by the second parameter.
-  virtual void CreateHTMLVideoElementCapturer(
-      WebMediaStream*,
-      WebMediaPlayer*,
-      scoped_refptr<base::SingleThreadTaskRunner>) {}
   virtual void CreateHTMLAudioElementCapturer(
       WebMediaStream*,
       WebMediaPlayer*,
diff --git a/third_party/blink/public/web/web_ax_object.h b/third_party/blink/public/web/web_ax_object.h
index 13ac49de6..7a4be89 100644
--- a/third_party/blink/public/web/web_ax_object.h
+++ b/third_party/blink/public/web/web_ax_object.h
@@ -283,6 +283,7 @@
   BLINK_EXPORT bool HasComputedStyle() const;
   BLINK_EXPORT WebString ComputedStyleDisplay() const;
   BLINK_EXPORT bool AccessibilityIsIgnored() const;
+  BLINK_EXPORT bool AccessibilityIsIncludedInTree() const;
   BLINK_EXPORT void Markers(WebVector<ax::mojom::MarkerType>& types,
                             WebVector<int>& starts,
                             WebVector<int>& ends) const;
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h
index fa0c5f7a..82fb3fdf 100644
--- a/third_party/blink/public/web/web_local_frame.h
+++ b/third_party/blink/public/web/web_local_frame.h
@@ -324,6 +324,10 @@
   ExecuteScriptInIsolatedWorldAndReturnValue(int world_id,
                                              const WebScriptSource&) = 0;
 
+  // Clears the isolated world CSP stored for |world_id| by this frame's
+  // Document.
+  virtual void ClearIsolatedWorldCSPForTesting(int world_id) = 0;
+
   // Sets up an isolated world by associating a |world_id| with |info|.
   // worldID must be > 0 (as 0 represents the main world).
   // worldID must be < kEmbedderWorldIdLimit, high number used internally.
diff --git a/third_party/blink/public/web/web_view_client.h b/third_party/blink/public/web/web_view_client.h
index cb8f2c2..3bfbc776 100644
--- a/third_party/blink/public/web/web_view_client.h
+++ b/third_party/blink/public/web/web_view_client.h
@@ -183,8 +183,7 @@
 
   // Informs the browser that the page scale has changed and/or a pinch gesture
   // has started or ended.
-  virtual void PageScaleFactorChanged(float page_scale_factor,
-                                      bool is_pinch_gesture_active) {}
+  virtual void PageScaleFactorChanged(float page_scale_factor) {}
 
   // Gestures -------------------------------------------------------------
 
diff --git a/third_party/blink/public/web/web_widget_client.h b/third_party/blink/public/web/web_widget_client.h
index 6b92ded..3118d32 100644
--- a/third_party/blink/public/web/web_widget_client.h
+++ b/third_party/blink/public/web/web_widget_client.h
@@ -245,9 +245,10 @@
 
   // Sets the current page scale factor and minimum / maximum limits. Both
   // limits are initially 1 (no page scale allowed).
-  virtual void SetPageScaleFactorAndLimits(float page_scale_factor,
-                                           float minimum,
-                                           float maximum) {}
+  virtual void SetPageScaleStateAndLimits(float page_scale_factor,
+                                          bool is_pinch_gesture_active,
+                                          float minimum,
+                                          float maximum) {}
 
   // Starts an animation of the page scale to a target scale factor and scroll
   // offset.
diff --git a/third_party/blink/renderer/DEPS b/third_party/blink/renderer/DEPS
index eb3e573..bf0a0930 100644
--- a/third_party/blink/renderer/DEPS
+++ b/third_party/blink/renderer/DEPS
@@ -41,6 +41,7 @@
     "+base/timer/elapsed_timer.h",
     "+base/trace_event/memory_dump_manager.h",
     "+base/trace_event/memory_dump_provider.h",
+    "+base/trace_event/trace_event.h",
     "+build",
     "+components/crash/core/common/crash_key.h",
     "+services/network/public/mojom",
diff --git a/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc b/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc
index de317702..b9084b0 100644
--- a/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/dom_wrapper_world_test.cc
@@ -119,9 +119,9 @@
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner =
       Thread::Current()->GetTaskRunner();
   thread->BackingThread().PostTask(
-      FROM_HERE,
-      CrossThreadBind(&WorkerThreadFunc, CrossThreadUnretained(thread.get()),
-                      std::move(main_thread_task_runner)));
+      FROM_HERE, CrossThreadBindOnce(&WorkerThreadFunc,
+                                     CrossThreadUnretained(thread.get()),
+                                     std::move(main_thread_task_runner)));
   test::EnterRunLoop();
 
   // Worlds on the worker thread should not be visible from the main thread.
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_threaded_test.cc b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_threaded_test.cc
index c974b89..d7f8e36 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_threaded_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_threaded_test.cc
@@ -51,7 +51,7 @@
   // Intentionally keep a reference on this thread while this occurs.
   worker_thread.GetWorkerBackingThread().BackingThread().PostTask(
       FROM_HERE,
-      CrossThreadBind(
+      CrossThreadBindOnce(
           [](WorkerThread* worker_thread,
              scoped_refptr<SerializedScriptValue> serialized) {
             WorkerOrWorkletScriptController* script =
@@ -71,8 +71,8 @@
   // references held by the task are dropped.
   base::WaitableEvent done;
   worker_thread.GetWorkerBackingThread().BackingThread().PostTask(
-      FROM_HERE, CrossThreadBind(&base::WaitableEvent::Signal,
-                                 CrossThreadUnretained(&done)));
+      FROM_HERE, CrossThreadBindOnce(&base::WaitableEvent::Signal,
+                                     CrossThreadUnretained(&done)));
   done.Wait();
 
   // Now destroy the value on the main thread.
diff --git a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc
index 9083897..26a0f26 100644
--- a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.cc
@@ -100,7 +100,6 @@
     v8::Isolate* isolate)
     : global_scope_(global_scope),
       isolate_(isolate),
-      execution_forbidden_(false),
       rejected_promises_(RejectedPromises::Create()),
       execution_state_(nullptr) {
   DCHECK(isolate);
@@ -220,10 +219,6 @@
   V8DOMWrapper::SetNativeInfo(isolate_, global_object, wrapper_type_info,
                               script_wrappable);
 
-  // All interfaces must be registered to V8PerContextData.
-  // So we explicitly call constructorForType for the global object.
-  V8PerContextData::From(context)->ConstructorForType(wrapper_type_info);
-
   if (global_scope_->IsMainThreadWorkletGlobalScope()) {
     // Set the human readable name for the world.
     DCHECK(!global_scope_->Name().IsEmpty());
@@ -237,20 +232,91 @@
                              context);
   }
 
-  wrapper_type_info->InstallConditionalFeatures(
-      context, *world_, global_object, v8::Local<v8::Object>(),
-      v8::Local<v8::Function>(), global_interface_template);
-
   if (!disable_eval_pending_.IsEmpty()) {
     DisableEvalInternal(disable_eval_pending_);
     disable_eval_pending_ = String();
   }
 
+  // This is a workaround for worker with on-the-main-thread script fetch and
+  // worklets.
+  // - For workers with off-the-main-thread worker script fetch,
+  //   PrepareForEvaluation() is called in WorkerGlobalScope::Initialize() after
+  //   top-level worker script fetch and before script evaluation.
+  // - For workers with on-the-main-thread worker script fetch, it's too early
+  //   to call PrepareForEvaluation() in WorkerGlobalScope::Initialize() because
+  //   it's called immediately after WorkerGlobalScope's constructor, that is,
+  //   before WorkerOrWorkletScriptController::Initialize(). Therefore, we
+  //   ignore the first call of PrepareForEvaluation() from
+  //   WorkerGlobalScope::Initialize(), and call it here again.
+  // TODO(nhiroki): Remove this workaround once off-the-main-thread worker
+  // script fetch is enabled by default for all worker types.
+  //
+  // - For worklets, there is no appropriate timing to call
+  //   PrepareForEvaluation() other than here because worklets have various
+  //   initialization sequences depending on thread model (on-main-thread vs.
+  //   off-main-thread) and unique script fetch (fetching a top-level script per
+  //   addModule() call in JS).
+  // TODO(nhiroki): Unify worklet initialization sequences, and move this to an
+  // appropriate place.
+  if (global_scope_->GetOffMainThreadWorkerScriptFetchOption() ==
+          OffMainThreadWorkerScriptFetchOption::kDisabled ||
+      global_scope_->IsWorkletGlobalScope()) {
+    // This should be called after origin trial tokens are applied for
+    // OriginTrialContext in WorkerGlobalScope::Initialize() to install origin
+    // trial features in JavaScript's global object. Workers with
+    // on-the-main-thread script fetch and worklets apply origin trial tokens
+    // before WorkerOrWorkletScriptController::initialize(), so it's safe to
+    // call this here.
+    PrepareForEvaluation();
+  }
+
+  return true;
+}
+
+void WorkerOrWorkletScriptController::PrepareForEvaluation() {
+  if (!IsContextInitialized()) {
+    // For workers with off-the-main-thread worker script fetch, this can be
+    // called before WorkerOrWorkletScriptController::Initialize() via
+    // WorkerGlobalScope creation function. In this case, PrepareForEvaluation()
+    // calls this function again. See comments in PrepareForEvaluation().
+    DCHECK(global_scope_->IsWorkerGlobalScope());
+    DCHECK_EQ(OffMainThreadWorkerScriptFetchOption::kDisabled,
+              global_scope_->GetOffMainThreadWorkerScriptFetchOption());
+    return;
+  }
+  DCHECK(!is_ready_to_evaluate_);
+  is_ready_to_evaluate_ = true;
+
+  v8::HandleScope handle_scope(isolate_);
+
+  ScriptState::Scope scope(script_state_);
+  v8::Local<v8::Context> context = script_state_->GetContext();
+
+  auto* script_wrappable = static_cast<ScriptWrappable*>(global_scope_);
+  const WrapperTypeInfo* wrapper_type_info =
+      script_wrappable->GetWrapperTypeInfo();
+
+  // All interfaces must be registered to V8PerContextData.
+  // So we explicitly call constructorForType for the global object.
+  // This should be called after OriginTrialContext::AddTokens() in
+  // WorkerGlobalScope::Initialize() to install origin trial features.
+  V8PerContextData::From(context)->ConstructorForType(wrapper_type_info);
+
+  v8::Local<v8::Object> global_object =
+      context->Global()->GetPrototype().As<v8::Object>();
+  DCHECK(!global_object.IsEmpty());
+
+  v8::Local<v8::FunctionTemplate> global_interface_template =
+      wrapper_type_info->DomTemplate(isolate_, *world_);
+  DCHECK(!global_interface_template.IsEmpty());
+
+  wrapper_type_info->InstallConditionalFeatures(
+      context, *world_, global_object, v8::Local<v8::Object>(),
+      v8::Local<v8::Function>(), global_interface_template);
+
   // This can only be called after the global object is fully initialised, as it
   // reads values from it.
   InitializeV8ExtrasBinding(script_state_);
-
-  return true;
 }
 
 void WorkerOrWorkletScriptController::DisableEvalInternal(
@@ -269,6 +335,7 @@
     SanitizeScriptErrors sanitize_script_errors,
     V8CacheOptions v8_cache_options) {
   DCHECK(IsContextInitialized());
+  DCHECK(is_ready_to_evaluate_);
 
   TRACE_EVENT1("devtools.timeline", "EvaluateScript", "data",
                inspector_evaluate_script_event::Data(
diff --git a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h
index 03f829b..fd3f5a3a 100644
--- a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h
+++ b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h
@@ -75,6 +75,10 @@
   // This should be called only once.
   bool Initialize(const KURL& url_for_debugger);
 
+  // Prepares for script evaluation. This must be called after Initialize()
+  // before Evaluate().
+  void PrepareForEvaluation();
+
   // Used by WorkerGlobalScope:
   void RethrowExceptionFromImportedScript(ErrorEvent*, ExceptionState&);
   // Disables `eval()` on JavaScript. This must be called before Evaluate().
@@ -125,7 +129,8 @@
   // Keeps the error message for `eval()` on JavaScript until Initialize().
   String disable_eval_pending_;
 
-  bool execution_forbidden_;
+  bool is_ready_to_evaluate_ = false;
+  bool execution_forbidden_ = false;
 
   scoped_refptr<RejectedPromises> rejected_promises_;
 
diff --git a/third_party/blink/renderer/bindings/modules/v8/BUILD.gn b/third_party/blink/renderer/bindings/modules/v8/BUILD.gn
index c82043e..f837216 100644
--- a/third_party/blink/renderer/bindings/modules/v8/BUILD.gn
+++ b/third_party/blink/renderer/bindings/modules/v8/BUILD.gn
@@ -95,12 +95,12 @@
 
   deps = [
     "//device/gamepad/public/mojom:mojom_blink_headers",
-    "//device/usb/public/mojom:mojom_blink_headers",
     "//device/vr/public/mojom:mojom_blink_headers",
     "//media/capture/mojom:image_capture_blink_headers",
     "//media/midi:mojo_blink_headers",
     "//services/device/public/mojom:generic_sensor_headers",
     "//services/device/public/mojom:mojom_blink_headers",
+    "//services/device/public/mojom:usb_blink_headers",
     "//services/shape_detection/public/mojom:mojom_blink_headers",
 
     # IndexedDB Mojom Blink headers are provided by the mojom_modules
diff --git a/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl b/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl
index b5c346e..77220d6a5 100644
--- a/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl
+++ b/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl
@@ -48,6 +48,7 @@
 // reinterpret_cast in the casting functions above. reinterpret_cast would be
 // unsafe due to multiple inheritence.
 
+// TODO(abhijeet@igalia.com): Remove below type casting macros.
 {% for tag in tags|sort if not tag.multipleTagNames and not tag.noTypeHelpers %}
 template <>
 struct DowncastTraits<{{tag.interface}}> {
@@ -64,7 +65,6 @@
 };
 #define To{{tag.interface}}(x) blink::To<blink::{{tag.interface}}>(x)
 #define To{{tag.interface}}OrNull(x) blink::DynamicTo<blink::{{tag.interface}}>(x)
-#define To{{tag.interface}}OrDie(x) blink::To<blink::{{tag.interface}}>(x)
 
 {% endfor %}
 
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 6f86eee..482d5b8 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -2015,6 +2015,7 @@
     "layout/scroll_anchor_test.cc",
     "layout/scrollbars_test.cc",
     "layout/shapes/box_shape_test.cc",
+    "layout/style_retain_scope_test.cc",
     "layout/svg/layout_svg_foreign_object_test.cc",
     "layout/svg/layout_svg_root_test.cc",
     "layout/svg/layout_svg_text_test.cc",
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc
index 8009b130..848beb9 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -203,10 +203,7 @@
     // Elements with subtrees containing will-change: contents are not
     // composited for animations as if the contents change the tiles
     // would need to be rerastered anyways.
-    // TODO(crbug.com/961686): Remove Style() check once unit tests create
-    // fully styled Elements.
-    if (layout_object && layout_object->Style() &&
-        layout_object->Style()->SubtreeWillChangeContents()) {
+    if (layout_object && layout_object->Style()->SubtreeWillChangeContents()) {
       reasons |= kTargetHasInvalidCompositingState;
     }
   }
diff --git a/third_party/blink/renderer/core/css/cssom/cross_thread_style_value_test.cc b/third_party/blink/renderer/core/css/cssom/cross_thread_style_value_test.cc
index d0129a4c..6c0825f 100644
--- a/third_party/blink/renderer/core/css/cssom/cross_thread_style_value_test.cc
+++ b/third_party/blink/renderer/core/css/cssom/cross_thread_style_value_test.cc
@@ -30,10 +30,10 @@
 
   void ShutDownThread() {
     base::WaitableEvent waitable_event;
-    thread_->PostTask(FROM_HERE,
-                      CrossThreadBind(&CrossThreadStyleValueTest::ShutDown,
-                                      CrossThreadUnretained(this),
-                                      CrossThreadUnretained(&waitable_event)));
+    thread_->PostTask(
+        FROM_HERE, CrossThreadBindOnce(&CrossThreadStyleValueTest::ShutDown,
+                                       CrossThreadUnretained(this),
+                                       CrossThreadUnretained(&waitable_event)));
     waitable_event.Wait();
   }
 
@@ -83,10 +83,10 @@
   base::WaitableEvent waitable_event;
   thread_->PostTask(
       FROM_HERE,
-      CrossThreadBind(&CrossThreadStyleValueTest::CheckUnsupportedValue,
-                      CrossThreadUnretained(this),
-                      CrossThreadUnretained(&waitable_event),
-                      WTF::Passed(std::move(value))));
+      CrossThreadBindOnce(&CrossThreadStyleValueTest::CheckUnsupportedValue,
+                          CrossThreadUnretained(this),
+                          CrossThreadUnretained(&waitable_event),
+                          WTF::Passed(std::move(value))));
   waitable_event.Wait();
 
   ShutDownThread();
@@ -113,10 +113,11 @@
       ThreadCreationParams(WebThreadType::kTestThread));
   base::WaitableEvent waitable_event;
   thread_->PostTask(
-      FROM_HERE, CrossThreadBind(&CrossThreadStyleValueTest::CheckKeywordValue,
-                                 CrossThreadUnretained(this),
-                                 CrossThreadUnretained(&waitable_event),
-                                 WTF::Passed(std::move(value))));
+      FROM_HERE,
+      CrossThreadBindOnce(&CrossThreadStyleValueTest::CheckKeywordValue,
+                          CrossThreadUnretained(this),
+                          CrossThreadUnretained(&waitable_event),
+                          WTF::Passed(std::move(value))));
   waitable_event.Wait();
 
   ShutDownThread();
@@ -143,11 +144,11 @@
   thread_ = std::make_unique<WebThreadSupportingGC>(
       ThreadCreationParams(WebThreadType::kTestThread));
   base::WaitableEvent waitable_event;
-  thread_->PostTask(FROM_HERE,
-                    CrossThreadBind(&CrossThreadStyleValueTest::CheckUnitValue,
-                                    CrossThreadUnretained(this),
-                                    CrossThreadUnretained(&waitable_event),
-                                    WTF::Passed(std::move(value))));
+  thread_->PostTask(
+      FROM_HERE, CrossThreadBindOnce(&CrossThreadStyleValueTest::CheckUnitValue,
+                                     CrossThreadUnretained(this),
+                                     CrossThreadUnretained(&waitable_event),
+                                     WTF::Passed(std::move(value))));
   waitable_event.Wait();
 
   ShutDownThread();
diff --git a/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc b/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc
index 55d743b2..816551d 100644
--- a/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc
+++ b/third_party/blink/renderer/core/css/cssom/paint_worklet_style_property_map_test.cc
@@ -40,9 +40,10 @@
   void ShutDownThread() {
     base::WaitableEvent waitable_event;
     thread_->PostTask(
-        FROM_HERE, CrossThreadBind(&PaintWorkletStylePropertyMapTest::ShutDown,
-                                   CrossThreadUnretained(this),
-                                   CrossThreadUnretained(&waitable_event)));
+        FROM_HERE,
+        CrossThreadBindOnce(&PaintWorkletStylePropertyMapTest::ShutDown,
+                            CrossThreadUnretained(this),
+                            CrossThreadUnretained(&waitable_event)));
     waitable_event.Wait();
   }
 
@@ -195,7 +196,7 @@
       ThreadCreationParams(WebThreadType::kTestThread));
   base::WaitableEvent waitable_event;
   thread_->PostTask(
-      FROM_HERE, CrossThreadBind(
+      FROM_HERE, CrossThreadBindOnce(
                      &PaintWorkletStylePropertyMapTest::CheckStyleMap,
                      CrossThreadUnretained(this),
                      CrossThreadUnretained(&waitable_event), std::move(input)));
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
index b31247f..5fe98bfb 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -6301,15 +6301,12 @@
 
   CSSIdentifierValue* under_value =
       css_property_parser_helpers::ConsumeIdent<CSSValueID::kUnder>(range);
-  CSSIdentifierValue* left_or_right_value = nullptr;
-  if (RuntimeEnabledFeatures::TextUnderlinePositionLeftRightEnabled()) {
-    left_or_right_value =
-        css_property_parser_helpers::ConsumeIdent<CSSValueID::kLeft,
-                                                  CSSValueID::kRight>(range);
-    if (left_or_right_value && !under_value) {
-      under_value =
-          css_property_parser_helpers::ConsumeIdent<CSSValueID::kUnder>(range);
-    }
+  CSSIdentifierValue* left_or_right_value =
+      css_property_parser_helpers::ConsumeIdent<CSSValueID::kLeft,
+                                                CSSValueID::kRight>(range);
+  if (left_or_right_value && !under_value) {
+    under_value =
+        css_property_parser_helpers::ConsumeIdent<CSSValueID::kUnder>(range);
   }
   if (!under_value && !left_or_right_value) {
     return nullptr;
diff --git a/third_party/blink/renderer/core/css/style_element.cc b/third_party/blink/renderer/core/css/style_element.cc
index 05a8e36b..03ac95e4 100644
--- a/third_party/blink/renderer/core/css/style_element.cc
+++ b/third_party/blink/renderer/core/css/style_element.cc
@@ -121,17 +121,9 @@
   sheet_.Release()->ClearOwnerNode();
 }
 
-static bool ShouldBypassMainWorldCSP(const Element& element) {
-  // Main world CSP is bypassed within an isolated world.
-  if (ContentSecurityPolicy::ShouldBypassMainWorld(&element.GetDocument()))
-    return true;
-
-  // Main world CSP is bypassed for style elements in user agent shadow DOM.
+static bool IsInUserAgentShadowDOM(const Element& element) {
   ShadowRoot* root = element.ContainingShadowRoot();
-  if (root && root->IsUserAgent())
-    return true;
-
-  return false;
+  return root && root->IsUserAgent();
 }
 
 StyleElement::ProcessingResult StyleElement::CreateSheet(Element& element,
@@ -139,9 +131,12 @@
   DCHECK(element.isConnected());
   Document& document = element.GetDocument();
 
-  const ContentSecurityPolicy* csp = document.GetContentSecurityPolicy();
+  const ContentSecurityPolicy* csp =
+      document.GetContentSecurityPolicyForWorld();
+
+  // CSP is bypassed for style elements in user agent shadow DOM.
   bool passes_content_security_policy_checks =
-      ShouldBypassMainWorldCSP(element) ||
+      IsInUserAgentShadowDOM(element) ||
       csp->AllowInline(ContentSecurityPolicy::InlineType::kStyle, &element,
                        text, element.nonce(), document.Url(),
                        start_position_.line_);
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 5e0f656..17a72ea9 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -7968,6 +7968,10 @@
   return Url().GetString().StartsWith(web_app_scope);
 }
 
+void Document::ClearIsolatedWorldCSPForTesting(int world_id) {
+  isolated_world_csp_map_->erase(world_id);
+}
+
 void Document::SendViolationReport(
     mojom::blink::CSPViolationParamsPtr violation_params) {
   std::unique_ptr<SourceLocation> source_location =
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 032447a..8c63d2b 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -1555,6 +1555,8 @@
   void SetMetaColorScheme(const ColorSchemeSet&);
   void ColorSchemeChanged();
 
+  void ClearIsolatedWorldCSPForTesting(int world_id);
+
  protected:
   void DidUpdateSecurityOrigin() final;
 
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index f09205e..91bd8ed 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2892,8 +2892,25 @@
     return nullptr;
   }
 
+  // Checking IsCustomElement() here is just an optimization because
+  // IsValidName() is not cheap.
+  if (RuntimeEnabledFeatures::ElementInternalsEnabled() && IsCustomElement() &&
+      (CustomElement::IsValidName(localName()) || !IsValue().IsNull())) {
+    auto* registry = CustomElement::Registry(*this);
+    auto* definition =
+        registry ? registry->DefinitionForName(IsValue().IsNull() ? localName()
+                                                                  : IsValue())
+                 : nullptr;
+    if (definition && definition->DisableShadow()) {
+      exception_state.ThrowDOMException(
+          DOMExceptionCode::kNotSupportedError,
+          "attachShadow() is disabled by disabledFeatures static field.");
+      return nullptr;
+    }
+  }
+
   if (GetShadowRoot()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+    exception_state.ThrowDOMException(DOMExceptionCode::kNotSupportedError,
                                       "Shadow root cannot be created on a host "
                                       "which already hosts a shadow tree.");
     return nullptr;
@@ -5165,10 +5182,9 @@
   if (new_style_string.IsNull()) {
     EnsureUniqueElementData().inline_style_.Clear();
   } else if (modification_reason == AttributeModificationReason::kByCloning ||
-             ContentSecurityPolicy::ShouldBypassMainWorld(&GetDocument()) ||
              (ContainingShadowRoot() &&
               ContainingShadowRoot()->IsUserAgent()) ||
-             GetDocument().GetContentSecurityPolicy()->AllowInline(
+             GetDocument().GetContentSecurityPolicyForWorld()->AllowInline(
                  ContentSecurityPolicy::InlineType::kStyleAttribute, this,
                  new_style_string, String() /* nonce */, GetDocument().Url(),
                  start_line_number)) {
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 61a9771..bb39343 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -1326,13 +1326,18 @@
   if (!node)
     return false;
 
-  if (this == node)
-    return true;
+  return this == node || IsShadowIncludingAncestorOf(*node);
+}
 
-  if (GetDocument() != node->GetDocument())
+bool Node::IsShadowIncludingAncestorOf(const Node& node) const {
+  // In the following case, contains(host) below returns true.
+  if (this == &node)
     return false;
 
-  if (isConnected() != node->isConnected())
+  if (GetDocument() != node.GetDocument())
+    return false;
+
+  if (isConnected() != node.isConnected())
     return false;
 
   auto* this_node = DynamicTo<ContainerNode>(this);
@@ -1341,9 +1346,9 @@
   if (!has_children && !has_shadow)
     return false;
 
-  for (; node; node = node->OwnerShadowHost()) {
-    if (GetTreeScope() == node->GetTreeScope())
-      return contains(node);
+  for (const Node* host = &node; host; host = host->OwnerShadowHost()) {
+    if (GetTreeScope() == host->GetTreeScope())
+      return contains(host);
   }
 
   return false;
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h
index d46e87a..c4babc4d 100644
--- a/third_party/blink/renderer/core/dom/node.h
+++ b/third_party/blink/renderer/core/dom/node.h
@@ -639,7 +639,11 @@
 
   bool IsDescendantOf(const Node*) const;
   bool contains(const Node*) const;
+  // https://dom.spec.whatwg.org/#concept-shadow-including-inclusive-ancestor
+  // TODO(tkent): The argument should be |const Node&|.
   bool IsShadowIncludingInclusiveAncestorOf(const Node*) const;
+  // https://dom.spec.whatwg.org/#concept-shadow-including-ancestor
+  bool IsShadowIncludingAncestorOf(const Node&) const;
   bool ContainsIncludingHostElements(const Node&) const;
   Node* CommonAncestor(const Node&,
                        ContainerNode* (*parent)(const Node&)) const;
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client.cc b/third_party/blink/renderer/core/editing/caret_display_item_client.cc
index fd39799..28186d9 100644
--- a/third_party/blink/renderer/core/editing/caret_display_item_client.cc
+++ b/third_party/blink/renderer/core/editing/caret_display_item_client.cc
@@ -78,9 +78,7 @@
       const_cast<LayoutObject*>(caret_rect.layout_object);
   DCHECK(caret_layout_object->IsDescendantOf(caret_block));
 
-  LayoutRect rect = caret_rect.rect;
-  caret_block->FlipForWritingMode(rect);
-  PhysicalRect result_rect(rect);
+  PhysicalRect result_rect = caret_rect.rect;
   while (caret_layout_object != caret_block) {
     LayoutObject* container_object = caret_layout_object->Container();
     if (!container_object)
diff --git a/third_party/blink/renderer/core/editing/compute_layer_selection.cc b/third_party/blink/renderer/core/editing/compute_layer_selection.cc
index 0688e10e..eaceabb 100644
--- a/third_party/blink/renderer/core/editing/compute_layer_selection.cc
+++ b/third_party/blink/renderer/core/editing/compute_layer_selection.cc
@@ -84,8 +84,11 @@
 
 std::pair<LayoutPoint, LayoutPoint> static GetLocalSelectionStartpoints(
     const LocalCaretRect& local_caret_rect) {
-  const LayoutRect rect = local_caret_rect.rect;
-  if (local_caret_rect.layout_object->Style()->IsHorizontalWritingMode())
+  // TODO(wangxianzhu): Don't flip when LayoutObject::LocalToAncestorPoint()
+  // accepts physical coordinates, and let this file use physical coordinates.
+  const LayoutRect rect =
+      local_caret_rect.layout_object->FlipForWritingMode(local_caret_rect.rect);
+  if (local_caret_rect.layout_object->IsHorizontalWritingMode())
     return {rect.MinXMinYCorner(), rect.MinXMaxYCorner()};
 
   // When text is vertical, it looks better for the start handle baseline to
@@ -96,8 +99,11 @@
 
 std::pair<LayoutPoint, LayoutPoint> static GetLocalSelectionEndpoints(
     const LocalCaretRect& local_caret_rect) {
-  const LayoutRect rect = local_caret_rect.rect;
-  if (local_caret_rect.layout_object->Style()->IsHorizontalWritingMode())
+  // TODO(wangxianzhu): Don't flip when LayoutObject::LocalToAncestorPoint()
+  // accepts physical coordinates, and let this file use physical coordinates.
+  const LayoutRect rect =
+      local_caret_rect.layout_object->FlipForWritingMode(local_caret_rect.rect);
+  if (local_caret_rect.layout_object->IsHorizontalWritingMode())
     return {rect.MinXMinYCorner(), rect.MinXMaxYCorner()};
 
   return {rect.MinXMinYCorner(), rect.MaxXMinYCorner()};
diff --git a/third_party/blink/renderer/core/editing/editing_utilities.cc b/third_party/blink/renderer/core/editing/editing_utilities.cc
index 5e72d44..3d2bd13 100644
--- a/third_party/blink/renderer/core/editing/editing_utilities.cc
+++ b/third_party/blink/renderer/core/editing/editing_utilities.cc
@@ -1553,8 +1553,11 @@
 }
 
 FloatQuad LocalToAbsoluteQuadOf(const LocalCaretRect& caret_rect) {
-  return caret_rect.layout_object->LocalToAbsoluteQuad(
-      FloatRect(caret_rect.rect));
+  // TODO(wangxianzhu): Don't flip when LayoutObject::LocalToAbsoluteQuad()
+  // accepts physical coordinates.
+  LayoutRect rect =
+      caret_rect.layout_object->FlipForWritingMode(caret_rect.rect);
+  return caret_rect.layout_object->LocalToAbsoluteQuad(FloatRect(rect));
 }
 
 const StaticRangeVector* TargetRangesForInputEvent(const Node& node) {
diff --git a/third_party/blink/renderer/core/editing/element_inner_text.cc b/third_party/blink/renderer/core/editing/element_inner_text.cc
index e9d234b2..bf528002f 100644
--- a/third_party/blink/renderer/core/editing/element_inner_text.cc
+++ b/third_party/blink/renderer/core/editing/element_inner_text.cc
@@ -255,6 +255,10 @@
   const NGOffsetMapping* const mapping = GetOffsetMapping(layout_text);
   const NGMappingUnitRange range = mapping->GetMappingUnitsForNode(text_node);
   for (const NGOffsetMappingUnit& unit : range) {
+    // TODO(yosin): Once |NGOffsetMapping| holds valid entries, we should remove
+    // following |CHECK|s. See http://crbug.com/964871
+    CHECK_LE(unit.TextContentStart(), mapping->GetText().length());
+    CHECK_LE(unit.TextContentEnd(), mapping->GetText().length());
     result_.EmitText(
         StringView(mapping->GetText(), unit.TextContentStart(),
                    unit.TextContentEnd() - unit.TextContentStart()));
diff --git a/third_party/blink/renderer/core/editing/local_caret_rect.cc b/third_party/blink/renderer/core/editing/local_caret_rect.cc
index b025cdae..4ecc98d 100644
--- a/third_party/blink/renderer/core/editing/local_caret_rect.cc
+++ b/third_party/blink/renderer/core/editing/local_caret_rect.cc
@@ -72,15 +72,15 @@
               box_position.inline_box->GetLineLayoutItem());
       return LocalCaretRect(
           box_layout_object,
-          box_layout_object->LocalCaretRect(box_position.inline_box,
-                                            box_position.offset_in_box,
-                                            extra_width_to_end_of_line));
+          box_layout_object->PhysicalLocalCaretRect(
+              box_position.inline_box, box_position.offset_in_box,
+              extra_width_to_end_of_line));
     }
   }
 
   // DeleteSelectionCommandTest.deleteListFromTable goes here.
   return LocalCaretRect(
-      layout_object, layout_object->LocalCaretRect(
+      layout_object, layout_object->PhysicalLocalCaretRect(
                          nullptr, position.GetPosition().ComputeEditingOffset(),
                          extra_width_to_end_of_line));
 }
@@ -114,24 +114,21 @@
   LayoutObject* const layout_object = LineLayoutAPIShim::LayoutObjectFrom(
       box_position.inline_box->GetLineLayoutItem());
 
-  const LayoutRect& rect = layout_object->LocalCaretRect(
-      box_position.inline_box, box_position.offset_in_box);
+  LayoutRect rect = layout_object->LocalCaretRect(box_position.inline_box,
+                                                  box_position.offset_in_box);
 
   if (rect.IsEmpty())
     return LocalCaretRect();
 
   const InlineBox* const box = box_position.inline_box;
-  if (layout_object->Style()->IsHorizontalWritingMode()) {
-    return LocalCaretRect(
-        layout_object,
-        LayoutRect(LayoutPoint(rect.X(), box->Root().SelectionTop()),
-                   LayoutSize(rect.Width(), box->Root().SelectionHeight())));
+  if (layout_object->IsHorizontalWritingMode()) {
+    rect.SetY(box->Root().SelectionTop());
+    rect.SetHeight(box->Root().SelectionHeight());
+  } else {
+    rect.SetX(box->Root().SelectionTop());
+    rect.SetHeight(box->Root().SelectionHeight());
   }
-
-  return LocalCaretRect(
-      layout_object,
-      LayoutRect(LayoutPoint(box->Root().SelectionTop(), rect.Y()),
-                 LayoutSize(box->Root().SelectionHeight(), rect.Height())));
+  return LocalCaretRect(layout_object, layout_object->FlipForWritingMode(rect));
 }
 
 }  // namespace
@@ -158,32 +155,19 @@
 
 template <typename Strategy>
 static IntRect AbsoluteCaretBoundsOfAlgorithm(
-    const PositionWithAffinityTemplate<Strategy>& position) {
-  const LocalCaretRect& caret_rect = LocalCaretRectOfPosition(position);
+    const PositionWithAffinityTemplate<Strategy>& position,
+    LayoutUnit* extra_width_to_end_of_line = nullptr) {
+  const LocalCaretRect& caret_rect = LocalCaretRectOfPositionTemplate<Strategy>(
+      position, extra_width_to_end_of_line);
   if (caret_rect.IsEmpty())
     return IntRect();
   return LocalToAbsoluteQuadOf(caret_rect).EnclosingBoundingBox();
 }
 
-IntRect AbsoluteCaretBoundsOf(const PositionWithAffinity& position) {
-  return AbsoluteCaretBoundsOfAlgorithm<EditingStrategy>(position);
-}
-
-// TODO(editing-dev): This function does pretty much the same thing as
-// |AbsoluteCaretBoundsOf()|. Consider merging them.
-IntRect AbsoluteCaretRectOfPosition(const PositionWithAffinity& position,
-                                    LayoutUnit* extra_width_to_end_of_line) {
-  const LocalCaretRect local_caret_rect =
-      LocalCaretRectOfPosition(position, extra_width_to_end_of_line);
-  if (!local_caret_rect.layout_object)
-    return IntRect();
-
-  const IntRect local_rect = PixelSnappedIntRect(local_caret_rect.rect);
-  return local_rect == IntRect()
-             ? IntRect()
-             : local_caret_rect.layout_object
-                   ->LocalToAbsoluteQuad(FloatRect(local_rect))
-                   .EnclosingBoundingBox();
+IntRect AbsoluteCaretBoundsOf(const PositionWithAffinity& position,
+                              LayoutUnit* extra_width_to_end_of_line) {
+  return AbsoluteCaretBoundsOfAlgorithm<EditingStrategy>(
+      position, extra_width_to_end_of_line);
 }
 
 template <typename Strategy>
diff --git a/third_party/blink/renderer/core/editing/local_caret_rect.h b/third_party/blink/renderer/core/editing/local_caret_rect.h
index ba6101c..6a218a6 100644
--- a/third_party/blink/renderer/core/editing/local_caret_rect.h
+++ b/third_party/blink/renderer/core/editing/local_caret_rect.h
@@ -7,7 +7,7 @@
 
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/editing/forward.h"
-#include "third_party/blink/renderer/platform/geometry/layout_rect.h"
+#include "third_party/blink/renderer/core/layout/geometry/physical_rect.h"
 
 namespace blink {
 
@@ -19,10 +19,10 @@
 
  public:
   const LayoutObject* layout_object = nullptr;
-  LayoutRect rect;
+  PhysicalRect rect;
 
   LocalCaretRect() = default;
-  LocalCaretRect(const LayoutObject* layout_object, const LayoutRect& rect)
+  LocalCaretRect(const LayoutObject* layout_object, const PhysicalRect& rect)
       : layout_object(layout_object), rect(rect) {}
 
   bool IsEmpty() const { return !layout_object || rect.IsEmpty(); }
@@ -39,14 +39,12 @@
 LocalCaretRect LocalSelectionRectOfPosition(const PositionWithAffinity&);
 
 // Bounds of (possibly transformed) caret in absolute coords
-CORE_EXPORT IntRect AbsoluteCaretBoundsOf(const PositionWithAffinity&);
+CORE_EXPORT IntRect
+AbsoluteCaretBoundsOf(const PositionWithAffinity&,
+                      LayoutUnit* extra_width_to_end_of_line = nullptr);
 CORE_EXPORT IntRect
 AbsoluteCaretBoundsOf(const PositionInFlatTreeWithAffinity&);
 
-IntRect AbsoluteCaretRectOfPosition(
-    const PositionWithAffinity&,
-    LayoutUnit* extra_width_to_end_of_line = nullptr);
-
 CORE_EXPORT IntRect AbsoluteSelectionBoundsOf(const VisiblePosition&);
 CORE_EXPORT IntRect AbsoluteSelectionBoundsOf(const VisiblePositionInFlatTree&);
 
diff --git a/third_party/blink/renderer/core/editing/local_caret_rect_bidi_test.cc b/third_party/blink/renderer/core/editing/local_caret_rect_bidi_test.cc
index 026300a..3bb8e089 100644
--- a/third_party/blink/renderer/core/editing/local_caret_rect_bidi_test.cc
+++ b/third_party/blink/renderer/core/editing/local_caret_rect_bidi_test.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/renderer/core/editing/position_with_affinity.h"
 #include "third_party/blink/renderer/core/editing/testing/editing_test_base.h"
 #include "third_party/blink/renderer/core/editing/text_affinity.h"
+#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 
 namespace blink {
@@ -45,7 +46,7 @@
       "<div dir=ltr><bdo dir=ltr><bdo dir=rtl>ABC</bdo>|def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -59,7 +60,7 @@
       "<div dir=ltr><bdo dir=ltr>ghi<bdo dir=rtl>ABC</bdo>|def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -74,7 +75,7 @@
       "<div dir=ltr><bdo dir=ltr><bdo dir=rtl>ABC|</bdo>def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -89,7 +90,7 @@
       "<div dir=ltr><bdo dir=ltr>ghi<bdo dir=rtl>ABC|</bdo>def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -105,7 +106,7 @@
       "dir=ltr>abc</bdo></bdo>|ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -121,7 +122,7 @@
       "dir=ltr>abc|</bdo></bdo>ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -138,9 +139,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(60, 0, 1, 10) : LayoutRect(90, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(60, 0, 1, 10)
+                              : PhysicalRect(90, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -156,9 +157,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(60, 0, 1, 10) : LayoutRect(90, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(60, 0, 1, 10)
+                              : PhysicalRect(90, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -174,9 +175,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(90, 0, 1, 10) : LayoutRect(120, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(90, 0, 1, 10)
+                              : PhysicalRect(120, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -192,9 +193,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(90, 0, 1, 10) : LayoutRect(120, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(90, 0, 1, 10)
+                              : PhysicalRect(120, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -208,7 +209,7 @@
       "<div dir=ltr><bdo dir=ltr>def|<bdo dir=rtl>ABC</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -222,7 +223,7 @@
       "<div dir=ltr><bdo dir=ltr>def|<bdo dir=rtl>ABC</bdo>ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -237,7 +238,7 @@
       "<div dir=ltr><bdo dir=ltr>def<bdo dir=rtl>|ABC</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -252,7 +253,7 @@
       "<div dir=ltr><bdo dir=ltr>def<bdo dir=rtl>|ABC</bdo>ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -268,7 +269,7 @@
       "dir=ltr>abc</bdo>DEF</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -284,7 +285,7 @@
       "dir=ltr>|abc</bdo>DEF</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -301,9 +302,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(30, 0, 1, 10) : LayoutRect(60, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(30, 0, 1, 10)
+                              : PhysicalRect(60, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -319,9 +320,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(30, 0, 1, 10) : LayoutRect(60, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(30, 0, 1, 10)
+                              : PhysicalRect(60, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -337,9 +338,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(30, 0, 1, 10) : LayoutRect(60, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(30, 0, 1, 10)
+                              : PhysicalRect(60, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -355,9 +356,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(30, 0, 1, 10) : LayoutRect(60, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(30, 0, 1, 10)
+                              : PhysicalRect(60, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -371,7 +372,7 @@
       "<div dir=ltr><bdo dir=rtl><bdo dir=ltr>abc</bdo>|DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -385,7 +386,7 @@
       "<div dir=ltr><bdo dir=rtl>GHI<bdo dir=ltr>abc</bdo>|DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -400,7 +401,7 @@
       "<div dir=ltr><bdo dir=rtl><bdo dir=ltr>abc|</bdo>DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -415,7 +416,7 @@
       "<div dir=ltr><bdo dir=rtl>GHI<bdo dir=ltr>abc|</bdo>DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -431,7 +432,7 @@
       "dir=rtl>ABC</bdo></bdo>|GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(90, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(90, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -447,7 +448,7 @@
       "dir=rtl>ABC|</bdo></bdo>GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(90, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(90, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -463,7 +464,7 @@
       "dir=ltr>abc</bdo></bdo></bdo>|JKL</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(120, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(120, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -479,7 +480,7 @@
       "dir=ltr>abc|</bdo></bdo></bdo>JKL</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(120, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(120, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -495,7 +496,7 @@
       "dir=ltr>def<bdo dir=rtl>ABC</bdo></bdo></bdo></bdo>|MNO</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(150, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(150, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -511,7 +512,7 @@
       "dir=ltr>def<bdo dir=rtl>ABC|</bdo></bdo></bdo></bdo>MNO</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(150, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(150, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -526,7 +527,7 @@
       "<div dir=ltr><bdo dir=rtl>DEF|<bdo dir=ltr>abc</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -540,7 +541,7 @@
       "<div dir=ltr><bdo dir=rtl>DEF|<bdo dir=ltr>abc</bdo>GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -555,7 +556,7 @@
       "<div dir=ltr><bdo dir=rtl>DEF<bdo dir=ltr>|abc</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -570,7 +571,7 @@
       "<div dir=ltr><bdo dir=rtl>DEF<bdo dir=ltr>|abc</bdo>GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -586,7 +587,7 @@
       "dir=rtl>ABC</bdo>def</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -602,7 +603,7 @@
       "dir=rtl>|ABC</bdo>def</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -618,7 +619,7 @@
       "dir=ltr>abc</bdo>DEF</bdo>ghi</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -634,7 +635,7 @@
       "dir=ltr>|abc</bdo>DEF</bdo>ghi</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -650,7 +651,7 @@
       "dir=ltr><bdo dir=rtl>ABC</bdo>def</bdo>GHI</bdo>jkl</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -666,7 +667,7 @@
       "dir=ltr><bdo dir=rtl>|ABC</bdo>def</bdo>GHI</bdo>jkl</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -681,7 +682,7 @@
       "<div dir=rtl><bdo dir=ltr><bdo dir=rtl>ABC</bdo>|def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -695,7 +696,7 @@
       "<div dir=rtl><bdo dir=ltr>ghi<bdo dir=rtl>ABC</bdo>|def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -710,7 +711,7 @@
       "<div dir=rtl><bdo dir=ltr><bdo dir=rtl>ABC|</bdo>def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -725,7 +726,7 @@
       "<div dir=rtl><bdo dir=ltr>ghi<bdo dir=rtl>ABC|</bdo>def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -741,7 +742,7 @@
       "dir=ltr>abc</bdo></bdo>|ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(210, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(210, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -757,7 +758,7 @@
       "dir=ltr>abc|</bdo></bdo>ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(210, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(210, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -773,7 +774,7 @@
       "dir=rtl>ABC</bdo></bdo></bdo>|jkl</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(180, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(180, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -789,7 +790,7 @@
       "dir=rtl>ABC|</bdo></bdo></bdo>jkl</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(180, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(180, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -806,9 +807,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(180, 0, 1, 10) : LayoutRect(150, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(180, 0, 1, 10)
+                              : PhysicalRect(150, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -824,9 +825,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(180, 0, 1, 10) : LayoutRect(150, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(180, 0, 1, 10)
+                              : PhysicalRect(150, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -840,7 +841,7 @@
       "<div dir=rtl><bdo dir=ltr>def|<bdo dir=rtl>ABC</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -854,7 +855,7 @@
       "<div dir=rtl><bdo dir=ltr>def|<bdo dir=rtl>ABC</bdo>ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -869,7 +870,7 @@
       "<div dir=rtl><bdo dir=ltr>def<bdo dir=rtl>|ABC</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -884,7 +885,7 @@
       "<div dir=rtl><bdo dir=ltr>def<bdo dir=rtl>|ABC</bdo>ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -900,7 +901,7 @@
       "dir=ltr>abc</bdo>DEF</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -916,7 +917,7 @@
       "dir=ltr>|abc</bdo>DEF</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -932,7 +933,7 @@
       "dir=rtl>ABC</bdo>def</bdo>GHI</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -948,7 +949,7 @@
       "dir=rtl>|ABC</bdo>def</bdo>GHI</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -965,9 +966,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(299, 0, 1, 10) : LayoutRect(270, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(299, 0, 1, 10)
+                              : PhysicalRect(270, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -983,9 +984,9 @@
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
   // TODO(xiaochengh): Decide if the behavior difference is worth to fix.
-  EXPECT_EQ(
-      LayoutNGEnabled() ? LayoutRect(299, 0, 1, 10) : LayoutRect(270, 0, 1, 10),
-      LocalCaretRectOfPosition(position_with_affinity).rect);
+  EXPECT_EQ(LayoutNGEnabled() ? PhysicalRect(299, 0, 1, 10)
+                              : PhysicalRect(270, 0, 1, 10),
+            LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectBidiTest,
@@ -999,7 +1000,7 @@
       "<div dir=rtl><bdo dir=rtl><bdo dir=ltr>abc</bdo>|DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1013,7 +1014,7 @@
       "<div dir=rtl><bdo dir=rtl>GHI<bdo dir=ltr>abc</bdo>|DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1028,7 +1029,7 @@
       "<div dir=rtl><bdo dir=rtl><bdo dir=ltr>abc|</bdo>DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1043,7 +1044,7 @@
       "<div dir=rtl><bdo dir=rtl>GHI<bdo dir=ltr>abc|</bdo>DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1059,7 +1060,7 @@
       "dir=rtl>ABC</bdo></bdo>|GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1075,7 +1076,7 @@
       "dir=rtl>ABC|</bdo></bdo>GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1091,7 +1092,7 @@
       "dir=ltr>abc</bdo></bdo></bdo>|JKL</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(210, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(210, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1107,7 +1108,7 @@
       "dir=ltr>abc|</bdo></bdo></bdo>JKL</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(210, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(210, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1123,7 +1124,7 @@
       "dir=ltr>def<bdo dir=rtl>ABC</bdo></bdo></bdo></bdo>|MNO</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(180, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(180, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1139,7 +1140,7 @@
       "dir=ltr>def<bdo dir=rtl>ABC|</bdo></bdo></bdo></bdo>MNO</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(180, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(180, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1154,7 +1155,7 @@
       "<div dir=rtl><bdo dir=rtl>DEF|<bdo dir=ltr>abc</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1168,7 +1169,7 @@
       "<div dir=rtl><bdo dir=rtl>DEF|<bdo dir=ltr>abc</bdo>GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1183,7 +1184,7 @@
       "<div dir=rtl><bdo dir=rtl>DEF<bdo dir=ltr>|abc</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1198,7 +1199,7 @@
       "<div dir=rtl><bdo dir=rtl>DEF<bdo dir=ltr>|abc</bdo>GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1214,7 +1215,7 @@
       "dir=rtl>ABC</bdo>def</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1230,7 +1231,7 @@
       "dir=rtl>|ABC</bdo>def</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1246,7 +1247,7 @@
       "dir=ltr>abc</bdo>DEF</bdo>ghi</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1262,7 +1263,7 @@
       "dir=ltr>|abc</bdo>DEF</bdo>ghi</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1278,7 +1279,7 @@
       "dir=ltr><bdo dir=rtl>ABC</bdo>def</bdo>GHI</bdo>jkl</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1294,7 +1295,7 @@
       "dir=ltr><bdo dir=rtl>|ABC</bdo>def</bdo>GHI</bdo>jkl</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1309,7 +1310,7 @@
       "<div dir=ltr><bdo dir=ltr><bdo dir=rtl>|ABC</bdo>def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1325,7 +1326,7 @@
       "dir=ltr>|abc</bdo>DEF</bdo>ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1341,7 +1342,7 @@
       "dir=rtl>|ABC</bdo>def</bdo>GHI</bdo>jkl</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1356,7 +1357,7 @@
       "<div dir=ltr><bdo dir=ltr>def<bdo dir=rtl>ABC|</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1372,7 +1373,7 @@
       "dir=ltr>abc|</bdo></bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(90, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(90, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1388,7 +1389,7 @@
       "dir=rtl>ABC|</bdo></bdo></bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(90, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(90, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1402,7 +1403,7 @@
       SetCaretTextToBody("<div dir=ltr><bdo dir=rtl>|ABC</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1417,7 +1418,7 @@
       "<div dir=ltr><bdo dir=rtl><bdo dir=ltr>|abc</bdo>DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1433,7 +1434,7 @@
       "dir=rtl>|ABC</bdo>def</bdo>GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1449,7 +1450,7 @@
       "dir=ltr>|abc</bdo>DEF</bdo>ghi</bdo>JKL</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1463,7 +1464,7 @@
       SetCaretTextToBody("<div dir=ltr><bdo dir=rtl>ABC|</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1478,7 +1479,7 @@
       "<div dir=ltr><bdo dir=rtl>DEF<bdo dir=ltr>abc|</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1494,7 +1495,7 @@
       "dir=rtl>ABC|</bdo></bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(60, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(60, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1510,7 +1511,7 @@
       "dir=ltr>abc|</bdo></bdo></bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(90, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(90, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1524,7 +1525,7 @@
       SetCaretTextToBody("<div dir=rtl><bdo dir=ltr>|abc</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1539,7 +1540,7 @@
       "<div dir=rtl><bdo dir=ltr><bdo dir=rtl>|ABC</bdo>def</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1555,7 +1556,7 @@
       "dir=ltr>|abc</bdo>DEF</bdo>ghi</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1571,7 +1572,7 @@
       "dir=rtl>|ABC</bdo>def</bdo>GHI</bdo>jkl</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1585,7 +1586,7 @@
       SetCaretTextToBody("<div dir=rtl><bdo dir=ltr>abc|</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1600,7 +1601,7 @@
       "<div dir=rtl><bdo dir=ltr>def<bdo dir=rtl>ABC|</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1616,7 +1617,7 @@
       "dir=ltr>abc|</bdo></bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1632,7 +1633,7 @@
       "dir=rtl>ABC|</bdo></bdo></bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(210, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(210, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1647,7 +1648,7 @@
       "<div dir=rtl><bdo dir=rtl><bdo dir=ltr>|abc</bdo>DEF</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1663,7 +1664,7 @@
       "dir=rtl>|ABC</bdo>def</bdo>GHI</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(299, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(299, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1679,7 +1680,7 @@
       "dir=ltr>|abc</bdo>DEF</bdo>ghi</bdo>JKL</bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(270, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(270, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1694,7 +1695,7 @@
       "<div dir=rtl><bdo dir=rtl>DEF<bdo dir=ltr>abc|</bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(240, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(240, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1710,7 +1711,7 @@
       "dir=rtl>ABC|</bdo></bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(210, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(210, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
@@ -1726,7 +1727,7 @@
       "dir=ltr>abc|</bdo></bdo></bdo></bdo></div>");
   const PositionWithAffinity position_with_affinity(position,
                                                     TextAffinity::kDownstream);
-  EXPECT_EQ(LayoutRect(210, 0, 1, 10),
+  EXPECT_EQ(PhysicalRect(210, 0, 1, 10),
             LocalCaretRectOfPosition(position_with_affinity).rect);
 }
 
diff --git a/third_party/blink/renderer/core/editing/local_caret_rect_test.cc b/third_party/blink/renderer/core/editing/local_caret_rect_test.cc
index a38033d..71cda0c 100644
--- a/third_party/blink/renderer/core/editing/local_caret_rect_test.cc
+++ b/third_party/blink/renderer/core/editing/local_caret_rect_test.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/html/forms/text_control_element.h"
 #include "third_party/blink/renderer/core/layout/layout_object.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
+#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 
 namespace blink {
@@ -68,16 +69,16 @@
       "<div id=div style='font: 10px/10px Ahem; width: 30px'>XXX</div>");
   const Node* foo = GetElementById("div")->firstChild();
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 0), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 1), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
 }
@@ -90,16 +91,16 @@
       "<div id=div style='font: 10px/10px Ahem; width: 30px'>Xpp</div>");
   const Node* foo = GetElementById("div")->firstChild();
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 0), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 1), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
 }
@@ -113,16 +114,16 @@
       "font: 10px/10px Ahem; width: 30px'>XXX</bdo>");
   const Node* foo = GetElementById("bdo")->firstChild();
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 0), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 1), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
 }
@@ -136,11 +137,11 @@
       "XXXX"
       "</div>");
   const Node* text = GetElementById("root")->firstChild();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 0), TextAffinity::kDownstream)));
   // LocalCaretRect may be outside the containing block.
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(39, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(39, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 4), TextAffinity::kDownstream)));
 }
@@ -154,11 +155,11 @@
       "XX"
       "</div>");
   const Node* text = GetElementById("root")->firstChild();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 0), TextAffinity::kDownstream)));
   // LocalCaretRect may be outside the containing block.
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(20, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(20, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 2), TextAffinity::kDownstream)));
 }
@@ -173,13 +174,14 @@
       "XXXX"
       "</bdo>");
   const Node* text = GetElementById("root")->firstChild();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 0), TextAffinity::kDownstream)));
   // LocalCaretRect may be outside the containing block.
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(-10, 0, 1, 10)),
-            LocalCaretRectOfPosition(PositionWithAffinity(
-                Position(text, 4), TextAffinity::kDownstream)));
+  EXPECT_EQ(
+      LocalCaretRect(text->GetLayoutObject(), PhysicalRect(-10, 0, 1, 10)),
+      LocalCaretRectOfPosition(
+          PositionWithAffinity(Position(text, 4), TextAffinity::kDownstream)));
 }
 
 TEST_P(ParameterizedLocalCaretRectTest, UnderflowTextRtl) {
@@ -192,11 +194,11 @@
       "XX"
       "</bdo>");
   const Node* text = GetElementById("root")->firstChild();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 0), TextAffinity::kDownstream)));
   // LocalCaretRect may be outside the containing block.
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(10, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(10, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 2), TextAffinity::kDownstream)));
 }
@@ -210,42 +212,42 @@
       "font: 10px/10px Ahem; width: 30px; height: 30px'>XXXYYYZZZ</div>");
   const Node* foo = GetElementById("div")->firstChild();
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 0), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 10, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 10, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 1), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 20, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 20, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 29, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 29, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kUpstream)));
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 10, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 10, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 4), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 20, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 20, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 5), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 29, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 29, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 6), TextAffinity::kUpstream)));
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 6), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 10, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 10, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 7), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 20, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 20, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 8), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 29, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 29, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 9), TextAffinity::kDownstream)));
 }
@@ -259,42 +261,42 @@
       "font: 10px/10px Ahem; width: 30px; height: 30px'>XXXYYYZZZ</div>");
   const Node* foo = GetElementById("div")->firstChild();
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 0), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 10, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 10, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 1), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 20, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 20, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 29, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 29, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kUpstream)));
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 10, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 10, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 4), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 20, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 20, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 5), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 29, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 29, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 6), TextAffinity::kUpstream)));
 
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 6), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 10, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 10, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 7), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 20, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 20, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 8), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 29, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 29, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 9), TextAffinity::kDownstream)));
 }
@@ -309,11 +311,11 @@
       "XXXX"
       "</div>");
   const Node* text = GetElementById("root")->firstChild();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 0), TextAffinity::kDownstream)));
   // LocalCaretRect may be outside the containing block.
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 39, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 39, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 4), TextAffinity::kDownstream)));
 }
@@ -328,11 +330,11 @@
       "XX"
       "</div>");
   const Node* text = GetElementById("root")->firstChild();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 0), TextAffinity::kDownstream)));
   // LocalCaretRect may be outside the containing block.
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 20, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 20, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 2), TextAffinity::kDownstream)));
 }
@@ -347,13 +349,14 @@
       "XXXX"
       "</bdo>");
   const Node* text = GetElementById("root")->firstChild();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 29, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 29, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 0), TextAffinity::kDownstream)));
   // LocalCaretRect may be outside the containing block.
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, -10, 10, 1)),
-            LocalCaretRectOfPosition(PositionWithAffinity(
-                Position(text, 4), TextAffinity::kDownstream)));
+  EXPECT_EQ(
+      LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, -10, 10, 1)),
+      LocalCaretRectOfPosition(
+          PositionWithAffinity(Position(text, 4), TextAffinity::kDownstream)));
 }
 
 TEST_P(ParameterizedLocalCaretRectTest, UnderflowTextVerticalRtl) {
@@ -366,11 +369,11 @@
       "XX"
       "</bdo>");
   const Node* text = GetElementById("root")->firstChild();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 29, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 29, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 0), TextAffinity::kDownstream)));
   // LocalCaretRect may be outside the containing block.
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(0, 10, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(0, 10, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text, 2), TextAffinity::kDownstream)));
 }
@@ -385,30 +388,30 @@
   const Node* foo = GetElementById("div")->firstChild();
 
   // First line
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 0), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 1), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kUpstream)));
 
   // Second line
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(10, 10, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(10, 10, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 4), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(20, 10, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(20, 10, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 5), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(29, 10, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(29, 10, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 6), TextAffinity::kDownstream)));
 }
@@ -430,24 +433,27 @@
   const Node* text_d = GetElementById("span-d")->firstChild();
 
   const Position after_c(text_c, 1);
-  EXPECT_EQ(LocalCaretRect(text_c->GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
-            LocalCaretRectOfPosition(
-                PositionWithAffinity(after_c, TextAffinity::kUpstream)));
-  EXPECT_EQ(LocalCaretRect(text_d->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
-            LocalCaretRectOfPosition(
-                PositionWithAffinity(after_c, TextAffinity::kDownstream)));
+  EXPECT_EQ(
+      LocalCaretRect(text_c->GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
+      LocalCaretRectOfPosition(
+          PositionWithAffinity(after_c, TextAffinity::kUpstream)));
+  EXPECT_EQ(
+      LocalCaretRect(text_d->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
+      LocalCaretRectOfPosition(
+          PositionWithAffinity(after_c, TextAffinity::kDownstream)));
 
   const Position before_d(text_d, 0);
   // TODO(xiaochengh): Should return the same result for legacy and LayoutNG.
-  EXPECT_EQ(
-      LayoutNGEnabled()
-          ? LocalCaretRect(text_c->GetLayoutObject(), LayoutRect(29, 0, 1, 10))
-          : LocalCaretRect(text_d->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
-      LocalCaretRectOfPosition(
-          PositionWithAffinity(before_d, TextAffinity::kUpstream)));
-  EXPECT_EQ(LocalCaretRect(text_d->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+  EXPECT_EQ(LayoutNGEnabled() ? LocalCaretRect(text_c->GetLayoutObject(),
+                                               PhysicalRect(29, 0, 1, 10))
+                              : LocalCaretRect(text_d->GetLayoutObject(),
+                                               PhysicalRect(0, 10, 1, 10)),
             LocalCaretRectOfPosition(
-                PositionWithAffinity(before_d, TextAffinity::kDownstream)));
+                PositionWithAffinity(before_d, TextAffinity::kUpstream)));
+  EXPECT_EQ(
+      LocalCaretRect(text_d->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
+      LocalCaretRectOfPosition(
+          PositionWithAffinity(before_d, TextAffinity::kDownstream)));
 }
 
 TEST_P(ParameterizedLocalCaretRectTest,
@@ -469,24 +475,25 @@
   const Node* text_d = GetElementById("span-d")->firstChild();
 
   const Position after_c(text_c, 1);
-  EXPECT_EQ(LocalCaretRect(text_c->GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
-            LocalCaretRectOfPosition(
-                PositionWithAffinity(after_c, TextAffinity::kUpstream)));
   EXPECT_EQ(
-      LocalCaretRect(text_d->GetLayoutObject(), LayoutRect(29, 10, 1, 10)),
+      LocalCaretRect(text_c->GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
+      LocalCaretRectOfPosition(
+          PositionWithAffinity(after_c, TextAffinity::kUpstream)));
+  EXPECT_EQ(
+      LocalCaretRect(text_d->GetLayoutObject(), PhysicalRect(29, 10, 1, 10)),
       LocalCaretRectOfPosition(
           PositionWithAffinity(after_c, TextAffinity::kDownstream)));
 
   const Position before_d(text_d, 0);
   // TODO(xiaochengh): Should return the same result for legacy and LayoutNG.
   EXPECT_EQ(LayoutNGEnabled() ? LocalCaretRect(text_c->GetLayoutObject(),
-                                               LayoutRect(0, 0, 1, 10))
+                                               PhysicalRect(0, 0, 1, 10))
                               : LocalCaretRect(text_d->GetLayoutObject(),
-                                               LayoutRect(29, 10, 1, 10)),
+                                               PhysicalRect(29, 10, 1, 10)),
             LocalCaretRectOfPosition(
                 PositionWithAffinity(before_d, TextAffinity::kUpstream)));
   EXPECT_EQ(
-      LocalCaretRect(text_d->GetLayoutObject(), LayoutRect(29, 10, 1, 10)),
+      LocalCaretRect(text_d->GetLayoutObject(), PhysicalRect(29, 10, 1, 10)),
       LocalCaretRectOfPosition(
           PositionWithAffinity(before_d, TextAffinity::kDownstream)));
 }
@@ -499,7 +506,7 @@
       "<div style='font: 10px/10px Ahem; width: 30px'><br>foo</div>");
   const Element& br = *GetDocument().QuerySelector("br");
 
-  EXPECT_EQ(LocalCaretRect(br.GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(br.GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::BeforeNode(br), TextAffinity::kDownstream)));
 }
@@ -513,7 +520,7 @@
       "<br>foo</bdo>");
   const Element& br = *GetDocument().QuerySelector("br");
 
-  EXPECT_EQ(LocalCaretRect(br.GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(br.GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::BeforeNode(br), TextAffinity::kDownstream)));
 }
@@ -530,10 +537,10 @@
 
   const Element& img1 = *GetElementById("img1");
 
-  EXPECT_EQ(LocalCaretRect(img1.GetLayoutObject(), LayoutRect(0, 0, 1, 12)),
+  EXPECT_EQ(LocalCaretRect(img1.GetLayoutObject(), PhysicalRect(0, 0, 1, 12)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::BeforeNode(img1), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(img1.GetLayoutObject(), LayoutRect(9, 0, 1, 12)),
+  EXPECT_EQ(LocalCaretRect(img1.GetLayoutObject(), PhysicalRect(9, 0, 1, 12)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::AfterNode(img1), TextAffinity::kDownstream)));
 
@@ -544,11 +551,11 @@
   // TODO(xiaochengh): Should return the same result for legacy and LayoutNG.
   EXPECT_EQ(
       LayoutNGEnabled()
-          ? LocalCaretRect(img1.GetLayoutObject(), LayoutRect(9, 0, 1, 12))
-          : LocalCaretRect(img2.GetLayoutObject(), LayoutRect(0, 0, 1, 12)),
+          ? LocalCaretRect(img1.GetLayoutObject(), PhysicalRect(9, 0, 1, 12))
+          : LocalCaretRect(img2.GetLayoutObject(), PhysicalRect(0, 0, 1, 12)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position::BeforeNode(img2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(img2.GetLayoutObject(), LayoutRect(9, 0, 1, 12)),
+  EXPECT_EQ(LocalCaretRect(img2.GetLayoutObject(), PhysicalRect(9, 0, 1, 12)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::AfterNode(img2), TextAffinity::kDownstream)));
 }
@@ -568,20 +575,20 @@
 
   // Box-anchored LocalCaretRect is local to the box itself, instead of its
   // containing block.
-  EXPECT_EQ(LocalCaretRect(img1.GetLayoutObject(), LayoutRect(9, 0, 1, 12)),
+  EXPECT_EQ(LocalCaretRect(img1.GetLayoutObject(), PhysicalRect(9, 0, 1, 12)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::BeforeNode(img1), TextAffinity::kDownstream)));
   EXPECT_EQ(
       LayoutNGEnabled()
-          ? LocalCaretRect(img2.GetLayoutObject(), LayoutRect(9, 0, 1, 12))
-          : LocalCaretRect(img1.GetLayoutObject(), LayoutRect(0, 0, 1, 12)),
+          ? LocalCaretRect(img2.GetLayoutObject(), PhysicalRect(9, 0, 1, 12))
+          : LocalCaretRect(img1.GetLayoutObject(), PhysicalRect(0, 0, 1, 12)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position::AfterNode(img1), TextAffinity::kDownstream)));
 
-  EXPECT_EQ(LocalCaretRect(img2.GetLayoutObject(), LayoutRect(9, 0, 1, 12)),
+  EXPECT_EQ(LocalCaretRect(img2.GetLayoutObject(), PhysicalRect(9, 0, 1, 12)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::BeforeNode(img2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(img2.GetLayoutObject(), LayoutRect(0, 0, 1, 12)),
+  EXPECT_EQ(LocalCaretRect(img2.GetLayoutObject(), PhysicalRect(0, 0, 1, 12)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::AfterNode(img2), TextAffinity::kDownstream)));
 }
@@ -598,15 +605,15 @@
 
   // Box-anchored LocalCaretRect is local to the box itself, instead of its
   // containing block.
-  EXPECT_EQ(LocalCaretRect(img.GetLayoutObject(), LayoutRect(0, 0, 10, 1)),
+  EXPECT_EQ(LocalCaretRect(img.GetLayoutObject(), PhysicalRect(0, 0, 10, 1)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::BeforeNode(img), TextAffinity::kDownstream)));
 
   EXPECT_EQ(
       LayoutNGEnabled()
-          ? LocalCaretRect(img.GetLayoutObject(), LayoutRect(0, 19, 10, 1))
+          ? LocalCaretRect(img.GetLayoutObject(), PhysicalRect(0, 19, 10, 1))
           // TODO(crbug.com/805064): The legacy behavior is wrong. Fix it.
-          : LocalCaretRect(img.GetLayoutObject(), LayoutRect(0, 9, 10, 1)),
+          : LocalCaretRect(img.GetLayoutObject(), PhysicalRect(0, 9, 10, 1)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position::AfterNode(img), TextAffinity::kDownstream)));
 }
@@ -625,34 +632,36 @@
   const Node* text1 = img.previousSibling();
   const Node* text2 = img.nextSibling();
 
-  EXPECT_EQ(LocalCaretRect(text1->GetLayoutObject(), LayoutRect(0, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text1->GetLayoutObject(), PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(text1, 0), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(text1->GetLayoutObject(), LayoutRect(10, 0, 1, 10)),
-            LocalCaretRectOfPosition(PositionWithAffinity(
-                Position(text1, 1), TextAffinity::kDownstream)));
+  EXPECT_EQ(
+      LocalCaretRect(text1->GetLayoutObject(), PhysicalRect(10, 0, 1, 10)),
+      LocalCaretRectOfPosition(
+          PositionWithAffinity(Position(text1, 1), TextAffinity::kDownstream)));
 
   // TODO(xiaochengh): Should return the same result for legacy and LayoutNG.
   EXPECT_EQ(
       LayoutNGEnabled()
-          ? LocalCaretRect(text1->GetLayoutObject(), LayoutRect(10, 0, 1, 10))
-          : LocalCaretRect(img.GetLayoutObject(), LayoutRect(0, -5, 1, 10)),
+          ? LocalCaretRect(text1->GetLayoutObject(), PhysicalRect(10, 0, 1, 10))
+          : LocalCaretRect(img.GetLayoutObject(), PhysicalRect(0, -5, 1, 10)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position::BeforeNode(img), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(img.GetLayoutObject(), LayoutRect(9, -5, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(img.GetLayoutObject(), PhysicalRect(9, -5, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::AfterNode(img), TextAffinity::kDownstream)));
 
   // TODO(xiaochengh): Should return the same result for legacy and LayoutNG.
-  EXPECT_EQ(
-      LayoutNGEnabled()
-          ? LocalCaretRect(img.GetLayoutObject(), LayoutRect(9, -5, 1, 10))
-          : LocalCaretRect(text2->GetLayoutObject(), LayoutRect(20, 5, 1, 10)),
-      LocalCaretRectOfPosition(
-          PositionWithAffinity(Position(text2, 0), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(text2->GetLayoutObject(), LayoutRect(29, 0, 1, 10)),
+  EXPECT_EQ(LayoutNGEnabled() ? LocalCaretRect(img.GetLayoutObject(),
+                                               PhysicalRect(9, -5, 1, 10))
+                              : LocalCaretRect(text2->GetLayoutObject(),
+                                               PhysicalRect(20, 5, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
-                Position(text2, 1), TextAffinity::kDownstream)));
+                Position(text2, 0), TextAffinity::kDownstream)));
+  EXPECT_EQ(
+      LocalCaretRect(text2->GetLayoutObject(), PhysicalRect(29, 0, 1, 10)),
+      LocalCaretRectOfPosition(
+          PositionWithAffinity(Position(text2, 1), TextAffinity::kDownstream)));
 }
 
 TEST_P(ParameterizedLocalCaretRectTest, FloatFirstLetter) {
@@ -668,18 +677,18 @@
   // first-letter LayoutObject. Fix it.
 
   EXPECT_EQ(LocalCaretRect(LayoutNGEnabled() ? first_letter : remaining_text,
-                           LayoutRect(0, 0, 1, 10)),
+                           PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 0), TextAffinity::kDownstream)));
   EXPECT_EQ(LocalCaretRect(remaining_text,
-                           LayoutRect(LayoutNGEnabled() ? 0 : 10, 0, 1, 10)),
+                           PhysicalRect(LayoutNGEnabled() ? 0 : 10, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 1), TextAffinity::kDownstream)));
   EXPECT_EQ(LocalCaretRect(remaining_text,
-                           LayoutRect(LayoutNGEnabled() ? 10 : 20, 0, 1, 10)),
+                           PhysicalRect(LayoutNGEnabled() ? 10 : 20, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 2), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(remaining_text, LayoutRect(20, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(remaining_text, PhysicalRect(20, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
 }
@@ -691,15 +700,15 @@
   const Node* foo = div->firstChild();
   const Node* first_br = foo->nextSibling();
   const Node* second_br = first_br->nextSibling();
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(30, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(30, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::AfterNode(*foo), TextAffinity::kDownstream)));
   EXPECT_EQ(
-      LocalCaretRect(second_br->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+      LocalCaretRect(second_br->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position::AfterNode(*first_br), TextAffinity::kDownstream)));
   EXPECT_EQ(
-      LocalCaretRect(second_br->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+      LocalCaretRect(second_br->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position::AfterNode(*second_br), TextAffinity::kDownstream)));
 }
@@ -709,13 +718,13 @@
   SetBodyContent("<pre style='font: 10px/10px Ahem;'>foo\n\n</pre>");
   const Node* pre = GetDocument().body()->firstChild();
   const Node* foo = pre->firstChild();
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(30, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(30, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 4), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 5), TextAffinity::kDownstream)));
 }
@@ -728,13 +737,13 @@
   const Node* pre = GetDocument().body()->firstChild();
   const Node* foo = pre->firstChild();
   const Node* br = foo->nextSibling();
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(30, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(30, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(br->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(br->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 4), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(br->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(br->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::AfterNode(*br), TextAffinity::kDownstream)));
 }
@@ -745,16 +754,16 @@
   const auto* textarea = ToTextControl(GetDocument().body()->firstChild());
   const Node* inner_text = textarea->InnerEditorElement()->firstChild();
   EXPECT_EQ(
-      LocalCaretRect(inner_text->GetLayoutObject(), LayoutRect(30, 0, 1, 10)),
+      LocalCaretRect(inner_text->GetLayoutObject(), PhysicalRect(30, 0, 1, 10)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position(inner_text, 3), TextAffinity::kDownstream)));
   EXPECT_EQ(
-      LocalCaretRect(inner_text->GetLayoutObject(), LayoutRect(0, 10, 1, 10)),
+      LocalCaretRect(inner_text->GetLayoutObject(), PhysicalRect(0, 10, 1, 10)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position(inner_text, 4), TextAffinity::kDownstream)));
   const Node* hidden_br = inner_text->nextSibling();
   EXPECT_EQ(
-      LocalCaretRect(hidden_br->GetLayoutObject(), LayoutRect(0, 20, 1, 10)),
+      LocalCaretRect(hidden_br->GetLayoutObject(), PhysicalRect(0, 20, 1, 10)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position(inner_text, 5), TextAffinity::kDownstream)));
 }
@@ -768,34 +777,34 @@
   const Node* foo = first_span->firstChild();
   const Node* second_span = first_span->nextSibling();
   const Node* white_spaces = second_span->firstChild();
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(30, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(30, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(foo, 3), TextAffinity::kDownstream)));
-  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), LayoutRect(30, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(foo->GetLayoutObject(), PhysicalRect(30, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position::AfterNode(*foo), TextAffinity::kDownstream)));
   // TODO(yoichio): Following should return valid rect: crbug.com/812535.
   EXPECT_EQ(
-      LocalCaretRect(first_span->GetLayoutObject(), LayoutRect(0, 0, 0, 0)),
+      LocalCaretRect(first_span->GetLayoutObject(), PhysicalRect(0, 0, 0, 0)),
       LocalCaretRectOfPosition(PositionWithAffinity(
           Position(first_span, PositionAnchorType::kAfterChildren),
           TextAffinity::kDownstream)));
   EXPECT_EQ(LayoutNGEnabled() ? LocalCaretRect(foo->GetLayoutObject(),
-                                               LayoutRect(30, 0, 1, 10))
+                                               PhysicalRect(30, 0, 1, 10))
                               : LocalCaretRect(white_spaces->GetLayoutObject(),
-                                               LayoutRect(0, 0, 0, 0)),
+                                               PhysicalRect(0, 0, 0, 0)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(white_spaces, 0), TextAffinity::kDownstream)));
   EXPECT_EQ(LayoutNGEnabled() ? LocalCaretRect(foo->GetLayoutObject(),
-                                               LayoutRect(30, 0, 1, 10))
+                                               PhysicalRect(30, 0, 1, 10))
                               : LocalCaretRect(white_spaces->GetLayoutObject(),
-                                               LayoutRect(0, 0, 0, 0)),
+                                               PhysicalRect(0, 0, 0, 0)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(white_spaces, 1), TextAffinity::kDownstream)));
   EXPECT_EQ(LayoutNGEnabled() ? LocalCaretRect(foo->GetLayoutObject(),
-                                               LayoutRect(30, 0, 1, 10))
+                                               PhysicalRect(30, 0, 1, 10))
                               : LocalCaretRect(white_spaces->GetLayoutObject(),
-                                               LayoutRect(0, 0, 0, 0)),
+                                               PhysicalRect(0, 0, 0, 0)),
             LocalCaretRectOfPosition(PositionWithAffinity(
                 Position(white_spaces, 2), TextAffinity::kDownstream)));
 }
@@ -833,12 +842,13 @@
   EXPECT_FALSE(rect.IsEmpty());
 }
 
-static std::pair<LayoutRect, LayoutRect> GetLayoutRects(const Position& caret) {
+static std::pair<PhysicalRect, PhysicalRect> GetPhysicalRects(
+    const Position& caret) {
   const PositionWithAffinity position(caret);
-  const LayoutRect& position_rect = LocalCaretRectOfPosition(position).rect;
+  const PhysicalRect& position_rect = LocalCaretRectOfPosition(position).rect;
   const PositionWithAffinity visible_position(
       CreateVisiblePosition(position).DeepEquivalent());
-  const LayoutRect& visible_position_rect =
+  const PhysicalRect& visible_position_rect =
       LocalCaretRectOfPosition(visible_position).rect;
   return {position_rect, visible_position_rect};
 }
@@ -848,10 +858,10 @@
   InsertStyleElement("pre{ font: 10px/10px Ahem; width: 300px }");
   const Position& caret =
       SetCaretTextToBody("<pre dir='ltr'>foo\n|<bdo dir='ltr'>abc</bdo></pre>");
-  LayoutRect position_rect, visible_position_rect;
-  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
-  EXPECT_EQ(LayoutRect(0, 10, 1, 10), position_rect);
-  EXPECT_EQ(LayoutRect(0, 10, 1, 10), visible_position_rect);
+  PhysicalRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetPhysicalRects(caret);
+  EXPECT_EQ(PhysicalRect(0, 10, 1, 10), position_rect);
+  EXPECT_EQ(PhysicalRect(0, 10, 1, 10), visible_position_rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectTest, AfterLineBreakInPreBlockLTRLineRTL) {
@@ -859,10 +869,10 @@
   InsertStyleElement("pre{ font: 10px/10px Ahem; width: 300px }");
   const Position& caret =
       SetCaretTextToBody("<pre dir='ltr'>foo\n|<bdo dir='rtl'>abc</bdo></pre>");
-  LayoutRect position_rect, visible_position_rect;
-  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
-  EXPECT_EQ(LayoutRect(0, 10, 1, 10), position_rect);
-  EXPECT_EQ(LayoutRect(0, 10, 1, 10), visible_position_rect);
+  PhysicalRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetPhysicalRects(caret);
+  EXPECT_EQ(PhysicalRect(0, 10, 1, 10), position_rect);
+  EXPECT_EQ(PhysicalRect(0, 10, 1, 10), visible_position_rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectTest, AfterLineBreakInPreBlockRTLLineLTR) {
@@ -870,10 +880,10 @@
   InsertStyleElement("pre{ font: 10px/10px Ahem; width: 300px }");
   const Position& caret =
       SetCaretTextToBody("<pre dir='rtl'>foo\n|<bdo dir='ltr'>abc</bdo></pre>");
-  LayoutRect position_rect, visible_position_rect;
-  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
-  EXPECT_EQ(LayoutRect(299, 10, 1, 10), position_rect);
-  EXPECT_EQ(LayoutRect(299, 10, 1, 10), visible_position_rect);
+  PhysicalRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetPhysicalRects(caret);
+  EXPECT_EQ(PhysicalRect(299, 10, 1, 10), position_rect);
+  EXPECT_EQ(PhysicalRect(299, 10, 1, 10), visible_position_rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectTest, AfterLineBreakInPreBlockRTLLineRTL) {
@@ -881,10 +891,10 @@
   InsertStyleElement("pre{ font: 10px/10px Ahem; width: 300px }");
   const Position& caret =
       SetCaretTextToBody("<pre dir='rtl'>foo\n|<bdo dir='rtl'>abc</bdo></pre>");
-  LayoutRect position_rect, visible_position_rect;
-  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
-  EXPECT_EQ(LayoutRect(299, 10, 1, 10), position_rect);
-  EXPECT_EQ(LayoutRect(299, 10, 1, 10), visible_position_rect);
+  PhysicalRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetPhysicalRects(caret);
+  EXPECT_EQ(PhysicalRect(299, 10, 1, 10), position_rect);
+  EXPECT_EQ(PhysicalRect(299, 10, 1, 10), visible_position_rect);
 }
 
 // crbug.com/834686
@@ -892,10 +902,10 @@
   LoadAhem();
   InsertStyleElement("body { font: 10px/10px Ahem; width: 300px }");
   const Position& caret = SetCaretTextToBody("<div>foo\n|</div>");
-  LayoutRect position_rect, visible_position_rect;
-  std::tie(position_rect, visible_position_rect) = GetLayoutRects(caret);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10), position_rect);
-  EXPECT_EQ(LayoutRect(30, 0, 1, 10), visible_position_rect);
+  PhysicalRect position_rect, visible_position_rect;
+  std::tie(position_rect, visible_position_rect) = GetPhysicalRects(caret);
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10), position_rect);
+  EXPECT_EQ(PhysicalRect(30, 0, 1, 10), visible_position_rect);
 }
 
 TEST_P(ParameterizedLocalCaretRectTest,
@@ -903,9 +913,9 @@
   LoadAhem();
   InsertStyleElement("div { font: 10px/10px Ahem; unicode-bidi: plaintext }");
   const Position position = SetCaretTextToBody("<div dir='rtl'>|abc</div>");
-  const LayoutRect caret_rect =
+  const PhysicalRect caret_rect =
       LocalCaretRectOfPosition(PositionWithAffinity(position)).rect;
-  EXPECT_EQ(LayoutRect(0, 0, 1, 10), caret_rect);
+  EXPECT_EQ(PhysicalRect(0, 0, 1, 10), caret_rect);
 }
 
 // http://crbug.com/835779
@@ -923,7 +933,8 @@
   EXPECT_EQ(
       // TODO(xiaochengh): Should return the same result for legacy and
       // LayoutNG.
-      LayoutNGEnabled() ? LayoutRect(50, 10, 1, 10) : LayoutRect(0, 20, 1, 10),
+      LayoutNGEnabled() ? PhysicalRect(50, 10, 1, 10)
+                        : PhysicalRect(0, 20, 1, 10),
       LocalCaretRectOfPosition(PositionWithAffinity(Position::AfterNode(br)))
           .rect);
 }
@@ -939,11 +950,11 @@
   const LayoutObject* text_before = image.previousSibling()->GetLayoutObject();
   // TODO(xiaochengh): Should return the same result for legacy and NG
   EXPECT_EQ(LayoutNGEnabled()
-                ? LocalCaretRect(text_before, LayoutRect(10, 0, 1, 10))
-                : LocalCaretRect(image_layout, LayoutRect(0, 0, 1, 10)),
+                ? LocalCaretRect(text_before, PhysicalRect(10, 0, 1, 10))
+                : LocalCaretRect(image_layout, PhysicalRect(0, 0, 1, 10)),
             LocalCaretRectOfPosition(
                 PositionWithAffinity(Position::BeforeNode(image))));
-  EXPECT_EQ(LocalCaretRect(image_layout, LayoutRect(9, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(image_layout, PhysicalRect(9, 0, 1, 10)),
             LocalCaretRectOfPosition(
                 PositionWithAffinity(Position::AfterNode(image))));
 }
@@ -967,7 +978,7 @@
   const Position position =
       SetCaretTextToBody("<bdo dir=rtl>AAA  |BBB<span>CCC</span></bdo>");
   const Node* text = position.AnchorNode();
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(60, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(60, 0, 1, 10)),
             LocalCaretRectOfPosition(
                 PositionWithAffinity(position, TextAffinity::kDownstream)));
 }
@@ -985,7 +996,7 @@
   const Node* text = div->firstChild()->firstChild();
 
   const Position position = Position::LastPositionInNode(*div);
-  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), LayoutRect(30, 0, 1, 10)),
+  EXPECT_EQ(LocalCaretRect(text->GetLayoutObject(), PhysicalRect(30, 0, 1, 10)),
             LocalCaretRectOfPosition(PositionWithAffinity(position)));
 }
 
diff --git a/third_party/blink/renderer/core/editing/selection_modifier.cc b/third_party/blink/renderer/core/editing/selection_modifier.cc
index 3ca5231..1676bb8 100644
--- a/third_party/blink/renderer/core/editing/selection_modifier.cc
+++ b/third_party/blink/renderer/core/editing/selection_modifier.cc
@@ -931,16 +931,16 @@
   // This ignores transforms on purpose, for now. Vertical navigation is done
   // without consulting transforms, so that 'up' in transformed text is 'up'
   // relative to the text, not absolute 'up'.
+  // TODO(wangxianzhu): For now LocalToAbsolute() requires the input to be in
+  // flipped blocks direction. Will make LocalToAbsolute() accept physical
+  // coordinates.
+  LayoutRect caret_layout_rect =
+      caret_rect.layout_object->FlipForWritingMode(caret_rect.rect);
   const FloatPoint& caret_point = caret_rect.layout_object->LocalToAbsolute(
-      FloatPoint(caret_rect.rect.Location()));
-  const LayoutObject* const containing_block =
-      caret_rect.layout_object->ContainingBlock();
-  // Just use ourselves to determine the writing mode if we have no containing
-  // block.
-  const LayoutObject* const layout_object =
-      containing_block ? containing_block : caret_rect.layout_object;
-  return LayoutUnit(layout_object->IsHorizontalWritingMode() ? caret_point.X()
-                                                             : caret_point.Y());
+      FloatPoint(caret_layout_rect.Location()));
+  return LayoutUnit(caret_rect.layout_object->IsHorizontalWritingMode()
+                        ? caret_point.X()
+                        : caret_point.Y());
 }
 
 LayoutUnit SelectionModifier::LineDirectionPointForBlockDirectionNavigation(
diff --git a/third_party/blink/renderer/core/editing/selection_modifier_line.cc b/third_party/blink/renderer/core/editing/selection_modifier_line.cc
index 0d5a7c2..684caad3 100644
--- a/third_party/blink/renderer/core/editing/selection_modifier_line.cc
+++ b/third_party/blink/renderer/core/editing/selection_modifier_line.cc
@@ -124,7 +124,7 @@
   if (containing_block.HasOverflowClip())
     absolute_block_point -= FloatSize(containing_block.ScrolledContentOffset());
 
-  if (root->Block().IsHorizontalWritingMode()) {
+  if (containing_block.IsHorizontalWritingMode()) {
     return LayoutPoint(
         LayoutUnit(line_direction_point - absolute_block_point.X()),
         root->BlockDirectionPointInLine());
diff --git a/third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.cc b/third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.cc
index 277dfae..502f8dd 100644
--- a/third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.cc
+++ b/third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.cc
@@ -300,7 +300,6 @@
     }
   } else if (should_append_parent_tag) {
     EditingStyle* style = traverser.CreateInlineStyleIfNeeded(*last_closed_);
-    // traverser.WrapWithNode(*To<ContainerNode>(last_closed_.Get()), style);
     traverser.WrapWithNode(To<ContainerNode>(*last_closed_), style);
   }
 
diff --git a/third_party/blink/renderer/core/editing/visible_units.cc b/third_party/blink/renderer/core/editing/visible_units.cc
index 677ca7a..082ab15 100644
--- a/third_party/blink/renderer/core/editing/visible_units.cc
+++ b/third_party/blink/renderer/core/editing/visible_units.cc
@@ -1259,14 +1259,14 @@
       CreateVisiblePosition(range.StartPosition()).DeepEquivalent(),
       TextAffinity::kDownstream);
   const IntRect start_caret_rect =
-      AbsoluteCaretRectOfPosition(start_position, &extra_width_to_end_of_line);
+      AbsoluteCaretBoundsOf(start_position, &extra_width_to_end_of_line);
   if (start_caret_rect.IsEmpty())
     return IntRect();
 
   const PositionWithAffinity end_position(
       CreateVisiblePosition(range.EndPosition()).DeepEquivalent(),
       TextAffinity::kUpstream);
-  const IntRect end_caret_rect = AbsoluteCaretRectOfPosition(end_position);
+  const IntRect end_caret_rect = AbsoluteCaretBoundsOf(end_position);
   if (end_caret_rect.IsEmpty())
     return IntRect();
 
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index d4abf56..0203d2a 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -2023,8 +2023,10 @@
   if (does_composite_) {
     // When attaching a local main frame, set up any state on the compositor.
     AsWidget().client->SetBackgroundColor(BackgroundColor());
-    AsWidget().client->SetPageScaleFactorAndLimits(
-        PageScaleFactor(), MinimumPageScaleFactor(), MaximumPageScaleFactor());
+    auto& viewport = GetPage()->GetVisualViewport();
+    AsWidget().client->SetPageScaleStateAndLimits(
+        viewport.Scale(), viewport.IsPinchGestureActive(),
+        MinimumPageScaleFactor(), MaximumPageScaleFactor());
   }
 }
 
@@ -2567,8 +2569,10 @@
   // so we must update those even though SetPageScaleFactor() may do the same if
   // the scale factor is changed.
   if (does_composite_) {
-    AsWidget().client->SetPageScaleFactorAndLimits(
-        PageScaleFactor(), MinimumPageScaleFactor(), MaximumPageScaleFactor());
+    auto& viewport = GetPage()->GetVisualViewport();
+    AsWidget().client->SetPageScaleStateAndLimits(
+        viewport.Scale(), viewport.IsPinchGestureActive(),
+        MinimumPageScaleFactor(), MaximumPageScaleFactor());
   }
 }
 
@@ -2822,8 +2826,10 @@
 
   // A resized main frame can change the page scale limits.
   if (does_composite_) {
-    AsWidget().client->SetPageScaleFactorAndLimits(
-        PageScaleFactor(), MinimumPageScaleFactor(), MaximumPageScaleFactor());
+    auto& viewport = GetPage()->GetVisualViewport();
+    AsWidget().client->SetPageScaleStateAndLimits(
+        viewport.Scale(), viewport.IsPinchGestureActive(),
+        MinimumPageScaleFactor(), MaximumPageScaleFactor());
   }
 }
 
@@ -3090,14 +3096,13 @@
   DCHECK(does_composite_);
 
   GetPageScaleConstraintsSet().SetNeedsReset(false);
-  // Set up the compositor.
-  AsWidget().client->SetPageScaleFactorAndLimits(
-      PageScaleFactor(), MinimumPageScaleFactor(), MaximumPageScaleFactor());
-  // Also inform the browser of the PageScaleFactor, which is tracked
-  // per-view.
+  // Set up the compositor and inform the browser of the PageScaleFactor,
+  // which is tracked per-view.
   auto& viewport = GetPage()->GetVisualViewport();
-  AsView().client->PageScaleFactorChanged(viewport.Scale(),
-                                          viewport.IsPinchGestureActive());
+  AsWidget().client->SetPageScaleStateAndLimits(
+      viewport.Scale(), viewport.IsPinchGestureActive(),
+      MinimumPageScaleFactor(), MaximumPageScaleFactor());
+  AsView().client->PageScaleFactorChanged(viewport.Scale());
   dev_tools_emulator_->MainFrameScrollOrScaleChanged();
 }
 
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
index 91f49117..0178359 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -641,9 +641,11 @@
   layer_tree_host()->SetHasGpuRasterizationTrigger(allow);
 }
 
-void TestWebWidgetClient::SetPageScaleFactorAndLimits(float page_scale_factor,
-                                                      float minimum,
-                                                      float maximum) {
+void TestWebWidgetClient::SetPageScaleStateAndLimits(
+    float page_scale_factor,
+    bool is_pinch_gesture_active,
+    float minimum,
+    float maximum) {
   layer_tree_host()->SetPageScaleFactorAndLimits(page_scale_factor, minimum,
                                                  maximum);
 }
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h
index 5cc66d2..07482cf 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.h
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -205,9 +205,10 @@
   void RegisterSelection(const cc::LayerSelection& selection) override;
   void SetBackgroundColor(SkColor color) override;
   void SetAllowGpuRasterization(bool allow) override;
-  void SetPageScaleFactorAndLimits(float page_scale_factor,
-                                   float minimum,
-                                   float maximum) override;
+  void SetPageScaleStateAndLimits(float page_scale_factor,
+                                  bool is_pinch_gesture_active,
+                                  float minimum,
+                                  float maximum) override;
 
   content::LayerTreeView* layer_tree_view() { return layer_tree_view_; }
   cc::LayerTreeHost* layer_tree_host() {
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 99bee766..38c36dcf 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -90,6 +90,7 @@
 #include "third_party/blink/renderer/core/layout/layout_embedded_object.h"
 #include "third_party/blink/renderer/core/layout/layout_view.h"
 #include "third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h"
+#include "third_party/blink/renderer/core/layout/style_retain_scope.h"
 #include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h"
 #include "third_party/blink/renderer/core/layout/text_autosizer.h"
 #include "third_party/blink/renderer/core/layout/traced_layout_object.h"
@@ -766,6 +767,7 @@
   LayoutObject* root_for_this_layout = GetLayoutView();
 
   FontCachePurgePreventer font_cache_purge_preventer;
+  StyleRetainScope style_retain_scope;
   {
     base::AutoReset<bool> change_scheduling_enabled(&layout_scheduling_enabled_,
                                                     false);
diff --git a/third_party/blink/renderer/core/frame/use_counter_test.cc b/third_party/blink/renderer/core/frame/use_counter_test.cc
index 815a091..94fe81e 100644
--- a/third_party/blink/renderer/core/frame/use_counter_test.cc
+++ b/third_party/blink/renderer/core/frame/use_counter_test.cc
@@ -46,17 +46,6 @@
   void SetURL(const KURL& url) { dummy_->GetDocument().SetURL(url); }
   Document& GetDocument() { return dummy_->GetDocument(); }
 
-  template <typename T>
-  void HistogramBasicTest(
-      const std::string& histogram,
-      T item,
-      T second_item,
-      std::function<bool(T, UseCounter&)> counted,
-      std::function<void(T, UseCounter&)> count,
-      std::function<int(T)> histogram_map,
-      std::function<void(LocalFrame*, UseCounter&)> did_commit_load,
-      const std::string& url,
-      UseCounter::Context context = UseCounter::kDefaultContext);
   std::unique_ptr<DummyPageHolder> dummy_;
   HistogramTester histogram_tester_;
 
@@ -66,74 +55,54 @@
   }
 };
 
-template <typename T>
-void UseCounterTest::HistogramBasicTest(
-    const std::string& histogram,
-    T item,
-    T second_item,
-    std::function<bool(T, UseCounter&)> counted,
-    std::function<void(T, UseCounter&)> count,
-    std::function<int(T)> histogram_map,
-    std::function<void(LocalFrame*, UseCounter&)> did_commit_load,
-    const std::string& url,
-    UseCounter::Context context) {
+TEST_F(UseCounterTest, RecordingExtensions) {
+  const std::string histogram = kExtensionFeaturesHistogramName;
+  constexpr auto item = mojom::WebFeature::kFetch;
+  constexpr auto second_item = WebFeature::kFetchBodyStream;
+  const std::string url = kExtensionUrl;
+  UseCounter::Context context = UseCounter::kExtensionContext;
   int page_visits_bucket = GetPageVisitsBucketforHistogram(histogram);
 
   UseCounter use_counter0(context, UseCounter::kCommited);
 
   // Test recording a single (arbitrary) counter
-  EXPECT_FALSE(counted(item, use_counter0));
-  count(item, use_counter0);
-  EXPECT_TRUE(counted(item, use_counter0));
-  histogram_tester_.ExpectUniqueSample(histogram, histogram_map(item), 1);
+  EXPECT_FALSE(use_counter0.HasRecordedMeasurement(item));
+  use_counter0.RecordMeasurement(item, *GetFrame());
+  EXPECT_TRUE(use_counter0.HasRecordedMeasurement(item));
+  histogram_tester_.ExpectUniqueSample(histogram, static_cast<int>(item), 1);
   // Test that repeated measurements have no effect
-  count(item, use_counter0);
-  histogram_tester_.ExpectUniqueSample(histogram, histogram_map(item), 1);
+  use_counter0.RecordMeasurement(item, *GetFrame());
+  histogram_tester_.ExpectUniqueSample(histogram, static_cast<int>(item), 1);
 
   // Test recording a different sample
-  EXPECT_FALSE(counted(second_item, use_counter0));
-  count(second_item, use_counter0);
-  EXPECT_TRUE(counted(second_item, use_counter0));
-  histogram_tester_.ExpectBucketCount(histogram, histogram_map(item), 1);
-  histogram_tester_.ExpectBucketCount(histogram, histogram_map(second_item), 1);
+  EXPECT_FALSE(use_counter0.HasRecordedMeasurement(second_item));
+  use_counter0.RecordMeasurement(second_item, *GetFrame());
+  EXPECT_TRUE(use_counter0.HasRecordedMeasurement(second_item));
+  histogram_tester_.ExpectBucketCount(histogram, static_cast<int>(item), 1);
+  histogram_tester_.ExpectBucketCount(histogram, static_cast<int>(second_item),
+                                      1);
   histogram_tester_.ExpectTotalCount(histogram, 2);
 
   // After a page load, the histograms will be updated, even when the URL
   // scheme is internal
   UseCounter use_counter1(context);
   SetURL(url_test_helpers::ToKURL(url));
-  did_commit_load(GetFrame(), use_counter1);
-  histogram_tester_.ExpectBucketCount(histogram, histogram_map(item), 1);
-  histogram_tester_.ExpectBucketCount(histogram, histogram_map(second_item), 1);
+  use_counter1.DidCommitLoad(GetFrame());
+  histogram_tester_.ExpectBucketCount(histogram, static_cast<int>(item), 1);
+  histogram_tester_.ExpectBucketCount(histogram, static_cast<int>(second_item),
+                                      1);
   histogram_tester_.ExpectBucketCount(histogram, page_visits_bucket, 1);
   histogram_tester_.ExpectTotalCount(histogram, 3);
 
   // Now a repeat measurement should get recorded again, exactly once
-  EXPECT_FALSE(counted(item, use_counter1));
-  count(item, use_counter1);
-  count(item, use_counter1);
-  EXPECT_TRUE(counted(item, use_counter1));
-  histogram_tester_.ExpectBucketCount(histogram, histogram_map(item), 2);
+  EXPECT_FALSE(use_counter1.HasRecordedMeasurement(item));
+  use_counter1.RecordMeasurement(item, *GetFrame());
+  use_counter1.RecordMeasurement(item, *GetFrame());
+  EXPECT_TRUE(use_counter1.HasRecordedMeasurement(item));
+  histogram_tester_.ExpectBucketCount(histogram, static_cast<int>(item), 2);
   histogram_tester_.ExpectTotalCount(histogram, 4);
 }
 
-TEST_F(UseCounterTest, RecordingExtensions) {
-  HistogramBasicTest<WebFeature>(
-      kExtensionFeaturesHistogramName, WebFeature::kFetch,
-      WebFeature::kFetchBodyStream,
-      [&](WebFeature feature, UseCounter& use_counter) -> bool {
-        return use_counter.HasRecordedMeasurement(feature);
-      },
-      [&](WebFeature feature, UseCounter& use_counter) {
-        use_counter.RecordMeasurement(feature, *GetFrame());
-      },
-      [](WebFeature feature) -> int { return static_cast<int>(feature); },
-      [&](LocalFrame* frame, UseCounter& use_counter) {
-        use_counter.DidCommitLoad(frame);
-      },
-      kExtensionUrl, UseCounter::kExtensionContext);
-}
-
 TEST_F(UseCounterTest, CSSSelectorPseudoWhere) {
   auto dummy_page_holder = std::make_unique<DummyPageHolder>(IntSize(800, 600));
   Page::InsertOrdinaryPageForTesting(&dummy_page_holder->GetPage());
diff --git a/third_party/blink/renderer/core/frame/web_frame_serializer_impl.cc b/third_party/blink/renderer/core/frame/web_frame_serializer_impl.cc
index 00111944..37446f7 100644
--- a/third_party/blink/renderer/core/frame/web_frame_serializer_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_serializer_impl.cc
@@ -101,12 +101,11 @@
 namespace {
 
 // Generate the default base tag declaration.
-String GenerateBaseTagDeclaration(const WebString& base_target) {
+String GenerateBaseTagDeclaration(const String& base_target) {
   // TODO(yosin) We should call |FrameSerializer::baseTagDeclarationOf()|.
   if (base_target.IsEmpty())
     return String("<base href=\".\">");
-  String base_string = "<base href=\".\" target=\"" +
-                       static_cast<const String&>(base_target) + "\">";
+  String base_string = "<base href=\".\" target=\"" + base_target + "\">";
   return base_string;
 }
 
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index ec350a64..d8a9895 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -228,9 +228,9 @@
       // TODO(wjmaclean): This is updating when the size of the *child frame*
       // have changed which are completely independent of the WebView, and in an
       // OOPIF where the main frame is remote, are these limits even useful?
-      Client()->SetPageScaleFactorAndLimits(1.f,
-                                            View()->MinimumPageScaleFactor(),
-                                            View()->MaximumPageScaleFactor());
+      Client()->SetPageScaleStateAndLimits(
+          1.f, false /* is_pinch_gesture_active */,
+          View()->MinimumPageScaleFactor(), View()->MaximumPageScaleFactor());
     }
   }
 }
@@ -1037,8 +1037,9 @@
   Client()->SetBackgroundColor(SK_ColorTRANSPARENT);
   // Pass the limits even though this is for subframes, as the limits will
   // be needed in setting the raster scale.
-  Client()->SetPageScaleFactorAndLimits(1.f, View()->MinimumPageScaleFactor(),
-                                        View()->MaximumPageScaleFactor());
+  Client()->SetPageScaleStateAndLimits(1.f, false /* is_pinch_gesture_active */,
+                                       View()->MinimumPageScaleFactor(),
+                                       View()->MaximumPageScaleFactor());
 
   // TODO(kenrb): Currently GPU rasterization is always enabled for OOPIFs.
   // This is okay because it is only necessarily to set the trigger to false
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index bed10352..856d787 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -720,6 +720,17 @@
       world_id, source_in, KURL(), SanitizeScriptErrors::kDoNotSanitize);
 }
 
+void WebLocalFrameImpl::ClearIsolatedWorldCSPForTesting(int world_id) {
+  if (!GetFrame())
+    return;
+  if (world_id <= DOMWrapperWorld::kMainWorldId ||
+      world_id >= DOMWrapperWorld::kDOMWrapperWorldEmbedderWorldIdLimit) {
+    return;
+  }
+
+  GetFrame()->GetDocument()->ClearIsolatedWorldCSPForTesting(world_id);
+}
+
 void WebLocalFrameImpl::SetIsolatedWorldInfo(int world_id,
                                              const WebIsolatedWorldInfo& info) {
   DCHECK(GetFrame());
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
index 8b5916d..c88c8e8 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -114,6 +114,7 @@
   WARN_UNUSED_RESULT v8::Local<v8::Value>
   ExecuteScriptInIsolatedWorldAndReturnValue(int world_id,
                                              const WebScriptSource&) override;
+  void ClearIsolatedWorldCSPForTesting(int world_id) override;
   void SetIsolatedWorldInfo(int world_id, const WebIsolatedWorldInfo&) override;
   void AddMessageToConsole(const WebConsoleMessage&) override;
   void Alert(const WebString& message) override;
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition.cc b/third_party/blink/renderer/core/html/custom/custom_element_definition.cc
index 0a08fe8..6126e0d 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_definition.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_definition.cc
@@ -34,6 +34,7 @@
       observed_attributes_(observed_attributes),
       has_style_attribute_changed_callback_(
           observed_attributes.Contains(html_names::kStyleAttr.LocalName())),
+      disable_shadow_(disabled_features.Contains(String("shadow"))),
       disable_internals_(disabled_features.Contains(String("internals"))),
       is_form_associated_(form_association_flag == FormAssociationFlag::kYes) {}
 
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition.h b/third_party/blink/renderer/core/html/custom/custom_element_definition.h
index e7a2ebf..a996c82 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_definition.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_definition.h
@@ -122,6 +122,7 @@
   bool HasDefaultStyleSheets() const {
     return !default_style_sheets_.IsEmpty();
   }
+  bool DisableShadow() const { return disable_shadow_; }
   bool DisableInternals() const { return disable_internals_; }
   bool IsFormAssociated() const { return is_form_associated_; }
 
@@ -162,6 +163,7 @@
   HashSet<AtomicString> observed_attributes_;
   bool has_style_attribute_changed_callback_;
   bool added_default_style_sheet_ = false;
+  bool disable_shadow_ = false;
   bool disable_internals_ = false;
   bool is_form_associated_ = false;
 
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.cc b/third_party/blink/renderer/core/html/custom/element_internals.cc
index bb726af..9d211c6 100644
--- a/third_party/blink/renderer/core/html/custom/element_internals.cc
+++ b/third_party/blink/renderer/core/html/custom/element_internals.cc
@@ -39,6 +39,7 @@
   visitor->Trace(value_);
   visitor->Trace(state_);
   visitor->Trace(validity_flags_);
+  visitor->Trace(validation_anchor_);
   ListedElement::Trace(visitor);
   ScriptWrappable::Trace(visitor);
 }
@@ -88,12 +89,19 @@
 
 void ElementInternals::setValidity(ValidityStateFlags* flags,
                                    ExceptionState& exception_state) {
-  setValidity(flags, String(), exception_state);
+  setValidity(flags, String(), nullptr, exception_state);
 }
 
 void ElementInternals::setValidity(ValidityStateFlags* flags,
                                    const String& message,
                                    ExceptionState& exception_state) {
+  setValidity(flags, message, nullptr, exception_state);
+}
+
+void ElementInternals::setValidity(ValidityStateFlags* flags,
+                                   const String& message,
+                                   Element* anchor,
+                                   ExceptionState& exception_state) {
   if (!IsTargetFormAssociated()) {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kNotSupportedError,
@@ -109,7 +117,19 @@
         "first argument are true.");
     return;
   }
+  if (anchor && !Target().IsShadowIncludingAncestorOf(*anchor)) {
+    exception_state.ThrowDOMException(
+        DOMExceptionCode::kNotFoundError,
+        "The Element argument should be a shadow-including descendant of the "
+        "target element.");
+    return;
+  }
+
+  if (validation_anchor_ && validation_anchor_ != anchor) {
+    HideVisibleValidationMessage();
+  }
   validity_flags_ = flags;
+  validation_anchor_ = anchor;
   SetCustomValidationMessage(message);
   SetNeedsValidityCheck();
 }
@@ -157,6 +177,10 @@
   return String();
 }
 
+Element& ElementInternals::ValidationAnchor() const {
+  return validation_anchor_ ? *validation_anchor_ : Target();
+}
+
 bool ElementInternals::checkValidity(ExceptionState& exception_state) {
   if (!IsTargetFormAssociated()) {
     exception_state.ThrowDOMException(
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.h b/third_party/blink/renderer/core/html/custom/element_internals.h
index fff80f92..2000c55 100644
--- a/third_party/blink/renderer/core/html/custom/element_internals.h
+++ b/third_party/blink/renderer/core/html/custom/element_internals.h
@@ -38,6 +38,10 @@
   void setValidity(ValidityStateFlags* flags,
                    const String& message,
                    ExceptionState& exception_state);
+  void setValidity(ValidityStateFlags* flags,
+                   const String& message,
+                   Element* anchor,
+                   ExceptionState& exception_state);
   bool willValidate(ExceptionState& exception_state) const;
   ValidityState* validity(ExceptionState& exception_state);
   String ValidationMessageForBinding(ExceptionState& exception_state);
@@ -66,6 +70,7 @@
   bool CustomError() const override;
   String validationMessage() const override;
   String ValidationSubMessage() const override;
+  Element& ValidationAnchor() const override;
   void DisabledStateMightBeChanged() override;
   bool ClassSupportsStateRestore() const override;
   bool ShouldSaveAndRestoreFormControlState() const override;
@@ -78,6 +83,7 @@
   ControlValue state_;
   bool is_disabled_ = false;
   Member<ValidityStateFlags> validity_flags_;
+  Member<Element> validation_anchor_;
 
   DISALLOW_COPY_AND_ASSIGN(ElementInternals);
 };
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.idl b/third_party/blink/renderer/core/html/custom/element_internals.idl
index 1786ffd..438c7ad4 100644
--- a/third_party/blink/renderer/core/html/custom/element_internals.idl
+++ b/third_party/blink/renderer/core/html/custom/element_internals.idl
@@ -16,7 +16,7 @@
 
   [RaisesException] readonly attribute HTMLFormElement? form;
 
-  [RaisesException] void setValidity(ValidityStateFlags flags, optional DOMString message);
+  [RaisesException] void setValidity(ValidityStateFlags flags, optional DOMString message, optional Element anchor);
   [RaisesException] readonly attribute boolean willValidate;
   [RaisesException] readonly attribute ValidityState validity;
   [RaisesException, ImplementedAs=ValidationMessageForBinding] readonly attribute DOMString validationMessage;
diff --git a/third_party/blink/renderer/core/html/forms/clear_button_element.h b/third_party/blink/renderer/core/html/forms/clear_button_element.h
index 5ce0eae..f92cdf9 100644
--- a/third_party/blink/renderer/core/html/forms/clear_button_element.h
+++ b/third_party/blink/renderer/core/html/forms/clear_button_element.h
@@ -62,6 +62,13 @@
                   element->IsClearButtonElement(),
                   element.IsClearButtonElement());
 
+template <>
+struct DowncastTraits<ClearButtonElement> {
+  static bool AllowFrom(const Element& element) {
+    return element.IsClearButtonElement();
+  }
+};
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FORMS_CLEAR_BUTTON_ELEMENT_H_
diff --git a/third_party/blink/renderer/core/html/forms/color_input_type.cc b/third_party/blink/renderer/core/html/forms/color_input_type.cc
index c2f6fef..99d106e 100644
--- a/third_party/blink/renderer/core/html/forms/color_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/color_input_type.cc
@@ -222,8 +222,11 @@
 
 HTMLElement* ColorInputType::ShadowColorSwatch() const {
   ShadowRoot* shadow = GetElement().UserAgentShadowRoot();
-  return shadow ? ToHTMLElementOrDie(shadow->firstChild()->firstChild())
-                : nullptr;
+  if (shadow) {
+    CHECK(IsA<HTMLElement>(shadow->firstChild()->firstChild()));
+    return To<HTMLElement>(shadow->firstChild()->firstChild());
+  }
+  return nullptr;
 }
 
 Element& ColorInputType::OwnerElement() const {
diff --git a/third_party/blink/renderer/core/html/forms/date_time_edit_element.h b/third_party/blink/renderer/core/html/forms/date_time_edit_element.h
index 1cece31..05cf99d 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_edit_element.h
+++ b/third_party/blink/renderer/core/html/forms/date_time_edit_element.h
@@ -161,6 +161,13 @@
                   element->IsDateTimeEditElement(),
                   element.IsDateTimeEditElement());
 
+template <>
+struct DowncastTraits<DateTimeEditElement> {
+  static bool AllowFrom(const Element& element) {
+    return element.IsDateTimeEditElement();
+  }
+};
+
 }  // namespace blink
 
 #endif
diff --git a/third_party/blink/renderer/core/html/forms/html_form_element.cc b/third_party/blink/renderer/core/html/forms/html_form_element.cc
index 52cc046..2ab7003e 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_element.cc
@@ -234,7 +234,7 @@
 
   // Focus on the first focusable control and show a validation message.
   for (const auto& unhandled : unhandled_invalid_controls) {
-    if (unhandled->ToHTMLElement().IsFocusable()) {
+    if (unhandled->ValidationAnchorOrHostIsFocusable()) {
       unhandled->ShowValidationMessage();
       UseCounter::Count(GetDocument(),
                         WebFeature::kFormValidationShowedMessage);
@@ -244,7 +244,7 @@
   // Warn about all of unfocusable controls.
   if (GetDocument().GetFrame()) {
     for (const auto& unhandled : unhandled_invalid_controls) {
-      if (unhandled->ToHTMLElement().IsFocusable())
+      if (unhandled->ValidationAnchorOrHostIsFocusable())
         continue;
       String message(
           "An invalid form control with name='%name' is not focusable.");
diff --git a/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc b/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
index e95c656e..e87d0861 100644
--- a/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
@@ -155,8 +155,10 @@
 }
 
 HTMLDivElement& HTMLOptGroupElement::OptGroupLabelElement() const {
-  return *ToHTMLDivElementOrDie(UserAgentShadowRoot()->getElementById(
-      shadow_element_names::OptGroupLabel()));
+  auto* element = UserAgentShadowRoot()->getElementById(
+      shadow_element_names::OptGroupLabel());
+  CHECK(!element || IsA<HTMLDivElement>(element));
+  return *To<HTMLDivElement>(element);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/listed_element.cc b/third_party/blink/renderer/core/html/forms/listed_element.cc
index 82fb150e..ae88649 100644
--- a/third_party/blink/renderer/core/html/forms/listed_element.cc
+++ b/third_party/blink/renderer/core/html/forms/listed_element.cc
@@ -396,14 +396,15 @@
 }
 
 void ListedElement::UpdateVisibleValidationMessage() {
-  HTMLElement& element = ToHTMLElement();
+  const Element& element = ValidationAnchor();
   Page* page = element.GetDocument().GetPage();
   if (!page || !page->IsPageVisible() || element.GetDocument().UnloadStarted())
     return;
   if (page->Paused())
     return;
   String message;
-  if (element.GetLayoutObject() && WillValidate())
+  if (element.GetLayoutObject() && WillValidate() &&
+      ToHTMLElement().IsShadowIncludingInclusiveAncestorOf(&element))
     message = validationMessage().StripWhiteSpace();
 
   has_validation_message_ = true;
@@ -426,7 +427,7 @@
     return;
 
   if (auto* client = GetValidationMessageClient())
-    client->HideValidationMessage(ToHTMLElement());
+    client->HideValidationMessage(ValidationAnchor());
 }
 
 bool ListedElement::IsValidationMessageVisible() const {
@@ -434,7 +435,7 @@
     return false;
 
   if (auto* client = GetValidationMessageClient()) {
-    return client->IsValidationMessageVisible(ToHTMLElement());
+    return client->IsValidationMessageVisible(ValidationAnchor());
   }
   return false;
 }
@@ -445,6 +446,20 @@
   return nullptr;
 }
 
+Element& ListedElement::ValidationAnchor() const {
+  return const_cast<HTMLElement&>(ToHTMLElement());
+}
+
+bool ListedElement::ValidationAnchorOrHostIsFocusable() const {
+  const Element& anchor = ValidationAnchor();
+  const HTMLElement& host = ToHTMLElement();
+  if (anchor.IsFocusable())
+    return true;
+  if (&anchor == &host)
+    return false;
+  return host.IsFocusable();
+}
+
 bool ListedElement::checkValidity(List* unhandled_invalid_controls) {
   if (IsNotCandidateOrValid())
     return true;
@@ -460,9 +475,12 @@
 }
 
 void ListedElement::ShowValidationMessage() {
-  HTMLElement& element = ToHTMLElement();
+  Element& element = ValidationAnchor();
   element.scrollIntoViewIfNeeded(false);
-  element.focus();
+  if (element.IsFocusable())
+    element.focus();
+  else
+    ToHTMLElement().focus();
   UpdateVisibleValidationMessage();
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/listed_element.h b/third_party/blink/renderer/core/html/forms/listed_element.h
index c052527f..1d3c8f5 100644
--- a/third_party/blink/renderer/core/html/forms/listed_element.h
+++ b/third_party/blink/renderer/core/html/forms/listed_element.h
@@ -118,6 +118,8 @@
                                                 TextDirection& message_dir,
                                                 String& sub_message,
                                                 TextDirection& sub_message_dir);
+  virtual Element& ValidationAnchor() const;
+  bool ValidationAnchorOrHostIsFocusable() const;
 
   // For Element::IsValidElement(), which is for :valid :invalid selectors.
   bool IsValidElement();
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
index 577fdf8..ac76a2c 100644
--- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
+++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
@@ -135,23 +135,26 @@
 
 DateTimeEditElement*
 MultipleFieldsTemporalInputTypeView::GetDateTimeEditElement() const {
-  return ToDateTimeEditElementOrDie(
-      GetElement().UserAgentShadowRoot()->getElementById(
-          shadow_element_names::DateTimeEdit()));
+  auto* element = GetElement().UserAgentShadowRoot()->getElementById(
+      shadow_element_names::DateTimeEdit());
+  CHECK(!element || IsA<DateTimeEditElement>(element));
+  return To<DateTimeEditElement>(element);
 }
 
 SpinButtonElement* MultipleFieldsTemporalInputTypeView::GetSpinButtonElement()
     const {
-  return ToSpinButtonElementOrDie(
-      GetElement().UserAgentShadowRoot()->getElementById(
-          shadow_element_names::SpinButton()));
+  auto* element = GetElement().UserAgentShadowRoot()->getElementById(
+      shadow_element_names::SpinButton());
+  CHECK(!element || IsA<SpinButtonElement>(element));
+  return To<SpinButtonElement>(element);
 }
 
 ClearButtonElement* MultipleFieldsTemporalInputTypeView::GetClearButtonElement()
     const {
-  return ToClearButtonElementOrDie(
-      GetElement().UserAgentShadowRoot()->getElementById(
-          shadow_element_names::ClearButton()));
+  auto* element = GetElement().UserAgentShadowRoot()->getElementById(
+      shadow_element_names::ClearButton());
+  CHECK(!element || IsA<ClearButtonElement>(element));
+  return To<ClearButtonElement>(element);
 }
 
 PickerIndicatorElement*
diff --git a/third_party/blink/renderer/core/html/forms/spin_button_element.h b/third_party/blink/renderer/core/html/forms/spin_button_element.h
index 2a673f9..5f0c9394 100644
--- a/third_party/blink/renderer/core/html/forms/spin_button_element.h
+++ b/third_party/blink/renderer/core/html/forms/spin_button_element.h
@@ -108,6 +108,13 @@
                   ToElement(node)->IsSpinButtonElement(),
                   ToElement(node).IsSpinButtonElement());
 
+template <>
+struct DowncastTraits<SpinButtonElement> {
+  static bool AllowFrom(const Node& node) {
+    return ToElement(node).IsSpinButtonElement();
+  }
+};
+
 }  // namespace blink
 
 #endif
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.cc b/third_party/blink/renderer/core/html/forms/text_control_element.cc
index 8699aba..955b551 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.cc
@@ -173,8 +173,10 @@
   if (!SupportsPlaceholder())
     return nullptr;
   DCHECK(UserAgentShadowRoot());
-  return ToHTMLElementOrDie(UserAgentShadowRoot()->getElementById(
-      shadow_element_names::Placeholder()));
+  auto* element = UserAgentShadowRoot()->getElementById(
+      shadow_element_names::Placeholder());
+  CHECK(!element || IsA<HTMLElement>(element));
+  return To<HTMLElement>(element);
 }
 
 void TextControlElement::UpdatePlaceholderVisibility() {
diff --git a/third_party/blink/renderer/core/html/forms/text_field_input_type.cc b/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
index d52693a2..e23a4545 100644
--- a/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
@@ -121,9 +121,10 @@
 }
 
 SpinButtonElement* TextFieldInputType::GetSpinButtonElement() const {
-  return ToSpinButtonElementOrDie(
-      GetElement().UserAgentShadowRoot()->getElementById(
-          shadow_element_names::SpinButton()));
+  auto* element = GetElement().UserAgentShadowRoot()->getElementById(
+      shadow_element_names::SpinButton());
+  CHECK(!element || IsA<SpinButtonElement>(element));
+  return To<SpinButtonElement>(element);
 }
 
 bool TextFieldInputType::MayTriggerVirtualKeyboard() const {
diff --git a/third_party/blink/renderer/core/html/html_details_element.cc b/third_party/blink/renderer/core/html/html_details_element.cc
index 2833524..c4ef49e 100644
--- a/third_party/blink/renderer/core/html/html_details_element.cc
+++ b/third_party/blink/renderer/core/html/html_details_element.cc
@@ -97,8 +97,9 @@
           Traversal<HTMLSummaryElement>::FirstChild(*this))
     return summary;
 
-  HTMLSlotElement* slot =
-      ToHTMLSlotElementOrDie(UserAgentShadowRoot()->firstChild());
+  auto* element = UserAgentShadowRoot()->firstChild();
+  CHECK(!element || IsA<HTMLSlotElement>(element));
+  HTMLSlotElement* slot = To<HTMLSlotElement>(element);
   DCHECK(slot->firstChild());
   CHECK(IsHTMLSummaryElement(*slot->firstChild()));
   return ToElement(slot->firstChild());
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc
index d40dba2..14eb8fff 100644
--- a/third_party/blink/renderer/core/html/html_element.cc
+++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -1469,7 +1469,7 @@
       registry ? registry->DefinitionForName(localName()) : nullptr;
   if (!definition) {
     exception_state.ThrowDOMException(
-        DOMExceptionCode::kInvalidStateError,
+        DOMExceptionCode::kNotSupportedError,
         "Unable to attach ElementInternals to non-custom elements.");
     return nullptr;
   }
@@ -1481,7 +1481,7 @@
   }
   if (DidAttachInternals()) {
     exception_state.ThrowDOMException(
-        DOMExceptionCode::kInvalidStateError,
+        DOMExceptionCode::kNotSupportedError,
         "ElementInternals for the specified element was already attached.");
     return nullptr;
   }
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index e0a5f7e..58e4524 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -3886,10 +3886,8 @@
   if (cc_layer == cc_layer_)
     return;
 
-  // If either of the layers is null we need to enable or disable compositing.
-  // This is done by triggering a style recalc.
-  if (!cc_layer_ || !cc_layer)
-    SetNeedsCompositingUpdate();
+  // We need to update the GraphicsLayer when the cc layer changes.
+  SetNeedsCompositingUpdate();
 
   if (cc_layer_)
     GraphicsLayer::UnregisterContentsLayer(cc_layer_);
diff --git a/third_party/blink/renderer/core/html/media/html_video_element_test.cc b/third_party/blink/renderer/core/html/media/html_video_element_test.cc
index 4c0355a..37e149c 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_video_element_test.cc
@@ -12,7 +12,9 @@
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/html/media/html_media_test_helper.h"
 #include "third_party/blink/renderer/core/html_names.h"
+#include "third_party/blink/renderer/core/layout/layout_box_model_object.h"
 #include "third_party/blink/renderer/core/loader/empty_clients.h"
+#include "third_party/blink/renderer/core/paint/paint_layer.h"
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 #include "third_party/blink/renderer/platform/testing/empty_web_media_player.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
@@ -125,4 +127,32 @@
   }
 }
 
+TEST_F(HTMLVideoElementTest, ChangeLayerNeedsCompositingUpdate) {
+  video()->SetSrc("http://example.com/foo.mp4");
+  test::RunPendingTasks();
+  UpdateAllLifecyclePhasesForTest();
+
+  auto layer1 = cc::Layer::Create();
+  SetFakeCcLayer(layer1.get());
+  ASSERT_TRUE(video()->GetLayoutObject()->HasLayer());
+  auto* paint_layer =
+      ToLayoutBoxModelObject(video()->GetLayoutObject())->Layer();
+  EXPECT_TRUE(paint_layer->NeedsCompositingInputsUpdate());
+  UpdateAllLifecyclePhasesForTest();
+  EXPECT_FALSE(paint_layer->NeedsCompositingInputsUpdate());
+
+  // Change to another cc layer.
+  auto layer2 = cc::Layer::Create();
+  SetFakeCcLayer(layer2.get());
+  EXPECT_TRUE(paint_layer->NeedsCompositingInputsUpdate());
+  UpdateAllLifecyclePhasesForTest();
+  EXPECT_FALSE(paint_layer->NeedsCompositingInputsUpdate());
+
+  // Remove cc layer.
+  SetFakeCcLayer(nullptr);
+  EXPECT_TRUE(paint_layer->NeedsCompositingInputsUpdate());
+  UpdateAllLifecyclePhasesForTest();
+  EXPECT_FALSE(paint_layer->NeedsCompositingInputsUpdate());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/portal/html_portal_element.cc b/third_party/blink/renderer/core/html/portal/html_portal_element.cc
index 3711241..8b56786 100644
--- a/third_party/blink/renderer/core/html/portal/html_portal_element.cc
+++ b/third_party/blink/renderer/core/html/portal/html_portal_element.cc
@@ -67,18 +67,9 @@
 
 void HTMLPortalElement::Navigate() {
   KURL url = GetNonEmptyURLAttribute(html_names::kSrcAttr);
-  if (!portal_ptr_ || url.IsEmpty())
-    return;
-
-  if (!url.ProtocolIsInHTTPFamily()) {
-    GetDocument().AddConsoleMessage(ConsoleMessage::Create(
-        mojom::ConsoleMessageSource::kRendering,
-        mojom::ConsoleMessageLevel::kWarning,
-        "Portals only allow navigation to protocols in the HTTP family."));
-    return;
+  if (!url.IsEmpty() && portal_ptr_) {
+    portal_ptr_->Navigate(url);
   }
-
-  portal_ptr_->Navigate(url);
 }
 
 void HTMLPortalElement::ConsumePortal() {
diff --git a/third_party/blink/renderer/core/inspector/browser_protocol.pdl b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
index 46999b9..9de341fc 100644
--- a/third_party/blink/renderer/core/inspector/browser_protocol.pdl
+++ b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
@@ -479,6 +479,8 @@
     enum
       backgroundFetch
       backgroundSync
+      pushMessaging
+      notifications
 
   # Enables event updates for the service.
   command startObserving
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
index b7d9b864..43474e3 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
@@ -286,7 +286,7 @@
   LayoutRect root_clip_rect = root_rect.ToLayoutRect();
   // TODO(szager): This flipping seems incorrect because root_rect is already
   // physical.
-  local_ancestor->FlipForWritingMode(root_clip_rect);
+  local_ancestor->DeprecatedFlipForWritingMode(root_clip_rect);
   return does_intersect &
          intersection_rect.InclusiveIntersect(PhysicalRect(root_clip_rect));
 }
diff --git a/third_party/blink/renderer/core/layout/BUILD.gn b/third_party/blink/renderer/core/layout/BUILD.gn
index 00b9e74..1b36cc86 100644
--- a/third_party/blink/renderer/core/layout/BUILD.gn
+++ b/third_party/blink/renderer/core/layout/BUILD.gn
@@ -497,6 +497,8 @@
     "shapes/shape_interval.h",
     "shapes/shape_outside_info.cc",
     "shapes/shape_outside_info.h",
+    "style_retain_scope.cc",
+    "style_retain_scope.h",
     "subtree_layout_scope.cc",
     "subtree_layout_scope.h",
     "svg/line/svg_inline_flow_box.cc",
diff --git a/third_party/blink/renderer/core/layout/api/line_layout_box.h b/third_party/blink/renderer/core/layout/api/line_layout_box.h
index 8c51d64..3fc6a1e 100644
--- a/third_party/blink/renderer/core/layout/api/line_layout_box.h
+++ b/third_party/blink/renderer/core/layout/api/line_layout_box.h
@@ -44,20 +44,12 @@
     return ToBox()->FlipForWritingMode(unit);
   }
 
-  void FlipForWritingMode(FloatRect& rect) const {
-    ToBox()->FlipForWritingMode(rect);
-  }
-
-  FloatPoint FlipForWritingMode(const FloatPoint& point) const {
-    return ToBox()->FlipForWritingMode(point);
-  }
-
   void FlipForWritingMode(LayoutRect& rect) const {
-    ToBox()->FlipForWritingMode(rect);
+    ToBox()->DeprecatedFlipForWritingMode(rect);
   }
 
   LayoutPoint FlipForWritingMode(const LayoutPoint& point) const {
-    return ToBox()->FlipForWritingMode(point);
+    return ToBox()->DeprecatedFlipForWritingMode(point);
   }
 
   LayoutPoint FlipForWritingModeForChild(const LineLayoutBox& child,
diff --git a/third_party/blink/renderer/core/layout/fragmentainer_iterator.cc b/third_party/blink/renderer/core/layout/fragmentainer_iterator.cc
index a376aee..86c184a73 100644
--- a/third_party/blink/renderer/core/layout/fragmentainer_iterator.cc
+++ b/third_party/blink/renderer/core/layout/fragmentainer_iterator.cc
@@ -19,7 +19,7 @@
   // This is how rectangles typically are represented in layout, i.e. with the
   // block direction coordinate flipped, if writing mode is vertical-rl.
   LayoutRect bounds_in_flow_thread = physical_bounding_box_in_flow_thread;
-  flow_thread_.FlipForWritingMode(bounds_in_flow_thread);
+  flow_thread_.DeprecatedFlipForWritingMode(bounds_in_flow_thread);
 
   if (flow_thread_.IsHorizontalWritingMode()) {
     logical_top_in_flow_thread_ = bounds_in_flow_thread.Y();
@@ -83,7 +83,7 @@
   DCHECK(!AtEnd());
   LayoutRect clip_rect = CurrentGroup().FlowThreadPortionOverflowRectAt(
       current_fragmentainer_index_);
-  flow_thread_.FlipForWritingMode(clip_rect);
+  flow_thread_.DeprecatedFlipForWritingMode(clip_rect);
   return clip_rect;
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc
index d11613a..84ce09c 100644
--- a/third_party/blink/renderer/core/layout/layout_block.cc
+++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -1251,7 +1251,7 @@
     }
     if (did_hit) {
       UpdateHitTestResult(
-          result, FlipForWritingMode(ToLayoutPoint(
+          result, DeprecatedFlipForWritingMode(ToLayoutPoint(
                       location_in_container.Point() - accumulated_offset)));
       return true;
     }
@@ -1423,12 +1423,12 @@
 }
 
 void LayoutBlock::OffsetForContents(LayoutPoint& offset) const {
-  offset = FlipForWritingMode(offset);
+  offset = DeprecatedFlipForWritingMode(offset);
 
   if (HasOverflowClip())
     offset += LayoutSize(ScrolledContentOffset());
 
-  offset = FlipForWritingMode(offset);
+  offset = DeprecatedFlipForWritingMode(offset);
 }
 
 void LayoutBlock::ScrollbarsChanged(bool horizontal_scrollbar_changed,
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc
index 03e23be..b5a31fbc 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -396,9 +396,9 @@
   if (logical_height_length.IsPercentOrCalc() &&
       !GetDocument().InQuirksMode()) {
     has_auto_height = true;
-    for (LayoutBlock* cb = ContainingBlock(); !cb->IsLayoutView();
-         cb = cb->ContainingBlock()) {
-      if (cb->StyleRef().LogicalHeight().IsFixed() || cb->IsTableCell())
+    if (LayoutBlock* cb = ContainingBlock()) {
+      if (!cb->IsLayoutView() &&
+          (cb->StyleRef().LogicalHeight().IsFixed() || cb->IsTableCell()))
         has_auto_height = false;
     }
   }
@@ -4195,7 +4195,7 @@
                             location_in_container, scrolled_offset,
                             hit_test_action)) {
       UpdateHitTestResult(
-          result, FlipForWritingMode(ToLayoutPoint(
+          result, DeprecatedFlipForWritingMode(ToLayoutPoint(
                       location_in_container.Point() - accumulated_offset)));
       return true;
     }
@@ -4820,8 +4820,7 @@
       LayoutRect rect(flipped_left, top, flipped_right - flipped_left,
                       bottom - top);
       if (!rect.IsEmpty()) {
-        FlipForWritingMode(rect);
-        PhysicalRect physical_rect(rect);
+        PhysicalRect physical_rect = FlipForWritingMode(rect);
         physical_rect.Move(additional_offset);
         rects.push_back(physical_rect);
       }
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index fa1e796..4d84368 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -1660,9 +1660,9 @@
     }
     bounds_rect.Move(ToSize(adjusted_location));
     if (location_in_container.Intersects(bounds_rect)) {
-      UpdateHitTestResult(result,
-                          FlipForWritingMode(location_in_container.Point() -
-                                             ToLayoutSize(adjusted_location)));
+      UpdateHitTestResult(result, DeprecatedFlipForWritingMode(
+                                      location_in_container.Point() -
+                                      ToLayoutSize(adjusted_location)));
       if (result.AddNodeToListBasedTestResult(NodeForHitTest(),
                                               location_in_container,
                                               bounds_rect) == kStopHitTesting)
@@ -2684,11 +2684,7 @@
 }
 
 PhysicalRect LayoutBox::LocalVisualRectIgnoringVisibility() const {
-  // VisualOverflowRect() is in "physical coordinates with flipped blocks
-  // direction", while all "VisualRect"s are in pure physical coordinates.
-  LayoutRect rect = SelfVisualOverflowRect();
-  FlipForWritingMode(rect);
-  return PhysicalRect(rect);
+  return PhysicalSelfVisualOverflowRect();
 }
 
 void LayoutBox::InflateVisualRectForFilterUnderContainer(
@@ -5596,13 +5592,6 @@
   overflow_->layout_overflow->AddLayoutOverflow(overflow_rect);
 }
 
-void LayoutBox::AddSelfVisualOverflow(const PhysicalRect& rect) {
-  LayoutRect layout_rect = rect.ToLayoutRect();
-  if (UNLIKELY(HasFlippedBlocksWritingMode()))
-    FlipForWritingMode(layout_rect);
-  AddSelfVisualOverflow(layout_rect);
-}
-
 void LayoutBox::AddSelfVisualOverflow(const LayoutRect& rect) {
   if (rect.IsEmpty())
     return;
@@ -5621,13 +5610,6 @@
   overflow_->visual_overflow->AddSelfVisualOverflow(rect);
 }
 
-void LayoutBox::AddContentsVisualOverflow(const PhysicalRect& rect) {
-  LayoutRect layout_rect = rect.ToLayoutRect();
-  if (UNLIKELY(HasFlippedBlocksWritingMode()))
-    FlipForWritingMode(layout_rect);
-  AddContentsVisualOverflow(layout_rect);
-}
-
 void LayoutBox::AddContentsVisualOverflow(const LayoutRect& rect) {
   if (rect.IsEmpty())
     return;
@@ -5825,7 +5807,7 @@
     // If we are relatively positioned or if we have a transform, then we have
     // to convert this rectangle into physical coordinates, apply relative
     // positioning and transforms to it, and then convert it back.
-    FlipForWritingMode(rect);
+    DeprecatedFlipForWritingMode(rect);
 
     PhysicalOffset container_offset;
 
@@ -5842,7 +5824,7 @@
     }
 
     // Now we need to flip back.
-    FlipForWritingMode(rect);
+    DeprecatedFlipForWritingMode(rect);
   }
 
   return RectForOverflowPropagation(rect);
@@ -5850,9 +5832,7 @@
 
 DISABLE_CFI_PERF
 LayoutRect LayoutBox::NoOverflowRect() const {
-  auto rect = PhysicalPaddingBoxRect().ToLayoutRect();
-  FlipForWritingMode(rect);
-  return rect;
+  return FlipForWritingMode(PhysicalPaddingBoxRect());
 }
 
 LayoutRect LayoutBox::VisualOverflowRect() const {
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h
index 8ea6a5b..ea450a9 100644
--- a/third_party/blink/renderer/core/layout/layout_box.h
+++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -405,6 +405,8 @@
   LayoutRect BorderBoxRect() const { return LayoutRect(LayoutPoint(), Size()); }
   PhysicalRect PhysicalBorderBoxRect() const {
     // This doesn't need flipping because the result would be the same.
+    DCHECK_EQ(PhysicalRect(BorderBoxRect()),
+              FlipForWritingMode(BorderBoxRect()));
     return PhysicalRect(BorderBoxRect());
   }
 
@@ -494,9 +496,7 @@
                : NoOverflowRect();
   }
   PhysicalRect PhysicalLayoutOverflowRect() const {
-    LayoutRect overflow_rect = LayoutOverflowRect();
-    FlipForWritingMode(overflow_rect);
-    return PhysicalRect(overflow_rect);
+    return FlipForWritingMode(LayoutOverflowRect());
   }
   // TODO(crbug.com/962299): This is incorrect in some cases.
   IntRect PixelSnappedLayoutOverflowRect() const {
@@ -508,9 +508,7 @@
 
   LayoutRect VisualOverflowRect() const override;
   PhysicalRect PhysicalVisualOverflowRect() const {
-    LayoutRect overflow_rect = VisualOverflowRect();
-    FlipForWritingMode(overflow_rect);
-    return PhysicalRect(overflow_rect);
+    return FlipForWritingMode(VisualOverflowRect());
   }
   LayoutUnit LogicalLeftVisualOverflow() const {
     return StyleRef().IsHorizontalWritingMode() ? VisualOverflowRect().X()
@@ -527,9 +525,7 @@
                : BorderBoxRect();
   }
   PhysicalRect PhysicalSelfVisualOverflowRect() const {
-    LayoutRect overflow_rect = SelfVisualOverflowRect();
-    FlipForWritingMode(overflow_rect);
-    return PhysicalRect(overflow_rect);
+    return FlipForWritingMode(SelfVisualOverflowRect());
   }
   LayoutRect ContentsVisualOverflowRect() const {
     return VisualOverflowIsSet()
@@ -550,9 +546,13 @@
   virtual bool HasLeftOverflow() const;
 
   void AddLayoutOverflow(const LayoutRect&);
-  void AddSelfVisualOverflow(const PhysicalRect&);
+  void AddSelfVisualOverflow(const PhysicalRect& r) {
+    AddSelfVisualOverflow(FlipForWritingMode(r));
+  }
   void AddSelfVisualOverflow(const LayoutRect&);
-  void AddContentsVisualOverflow(const PhysicalRect&);
+  void AddContentsVisualOverflow(const PhysicalRect& r) {
+    AddContentsVisualOverflow(FlipForWritingMode(r));
+  }
   void AddContentsVisualOverflow(const LayoutRect&);
 
   void AddVisualEffectOverflow();
@@ -1302,49 +1302,36 @@
   LayoutUnit OffsetLeft(const Element*) const final;
   LayoutUnit OffsetTop(const Element*) const final;
 
+  // TODO(wangxianzhu): This should be also type-safe. Will do when converting
+  // hit testing geometry to use physical geometry types.
   LayoutPoint FlipForWritingModeForChild(const LayoutBox* child,
                                          const LayoutPoint&) const;
 
-  WARN_UNUSED_RESULT LayoutUnit FlipForWritingMode(LayoutUnit position) const {
+  WARN_UNUSED_RESULT LayoutUnit
+  FlipForWritingMode(LayoutUnit position,
+                     LayoutUnit width = LayoutUnit()) const {
     // The offset is in the block direction (y for horizontal writing modes, x
     // for vertical writing modes).
-    if (!UNLIKELY(HasFlippedBlocksWritingMode()))
+    if (LIKELY(!HasFlippedBlocksWritingMode()))
       return position;
     DCHECK(!IsHorizontalWritingMode());
-    return frame_rect_.Width() - position;
+    return frame_rect_.Width() - (position + width);
   }
   WARN_UNUSED_RESULT LayoutPoint
-  FlipForWritingMode(const LayoutPoint& position) const {
-    if (!UNLIKELY(HasFlippedBlocksWritingMode()))
-      return position;
-    DCHECK(!IsHorizontalWritingMode());
-    return LayoutPoint(frame_rect_.Width() - position.X(), position.Y());
+  FlipForWritingMode(const PhysicalOffset& offset) const {
+    return LayoutPoint(FlipForWritingMode(offset.left), offset.top);
   }
-  WARN_UNUSED_RESULT LayoutSize
-  FlipForWritingMode(const LayoutSize& offset) const {
-    if (!UNLIKELY(HasFlippedBlocksWritingMode()))
-      return offset;
-    DCHECK(!IsHorizontalWritingMode());
-    return LayoutSize(frame_rect_.Width() - offset.Width(), offset.Height());
+  // Inherit other flipping methods from LayoutObject.
+  using LayoutObject::FlipForWritingMode;
+
+  WARN_UNUSED_RESULT LayoutPoint
+  DeprecatedFlipForWritingMode(const LayoutPoint& position) const {
+    return LayoutPoint(FlipForWritingMode(position.X()), position.Y());
   }
-  void FlipForWritingMode(LayoutRect& rect) const {
-    if (!UNLIKELY(HasFlippedBlocksWritingMode()))
+  void DeprecatedFlipForWritingMode(LayoutRect& rect) const {
+    if (LIKELY(!HasFlippedBlocksWritingMode()))
       return;
-    DCHECK(!IsHorizontalWritingMode());
-    rect.SetX(frame_rect_.Width() - rect.MaxX());
-  }
-  WARN_UNUSED_RESULT FloatPoint
-  FlipForWritingMode(const FloatPoint& position) const {
-    if (!UNLIKELY(HasFlippedBlocksWritingMode()))
-      return position;
-    DCHECK(!IsHorizontalWritingMode());
-    return FloatPoint(frame_rect_.Width() - position.X(), position.Y());
-  }
-  void FlipForWritingMode(FloatRect& rect) const {
-    if (!UNLIKELY(HasFlippedBlocksWritingMode()))
-      return;
-    DCHECK(!IsHorizontalWritingMode());
-    rect.SetX(frame_rect_.Width() - rect.MaxX());
+    rect = FlipForWritingMode(rect).ToLayoutRect();
   }
 
   // Passing |flipped_blocks_container| causes flipped-block flipping w.r.t.
@@ -1789,6 +1776,14 @@
   // scrollWidth. For the full story, visit http://crbug.com/724255.
   LayoutUnit VerticalScrollbarWidthClampedToContentBox() const;
 
+  LayoutUnit FlipForWritingModeInternal(
+      LayoutUnit position,
+      LayoutUnit width,
+      const LayoutBox* box_for_flipping) const final {
+    DCHECK(!box_for_flipping || box_for_flipping == this);
+    return FlipForWritingMode(position, width);
+  }
+
   // The CSS border box rect for this box.
   //
   // The rectangle is in LocationContainer's physical coordinates in flipped
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
index 19ed3307..c46a7325 100644
--- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
@@ -902,8 +902,9 @@
     sticky_box_rect =
         FloatRect(ToLayoutInline(this)->PhysicalLinesBoundingBox());
   } else {
-    sticky_box_rect = FloatRect(ToLayoutBox(this)->FrameRect());
-    containing_block->FlipForWritingMode(sticky_box_rect);
+    PhysicalRect physical_rect =
+        containing_block->FlipForWritingMode(ToLayoutBox(this)->FrameRect());
+    sticky_box_rect = FloatRect(physical_rect);
   }
   FloatPoint sticky_location =
       sticky_box_rect.Location() + skipped_containers_offset;
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 19076ba8..17fe058 100644
--- a/third_party/blink/renderer/core/layout/layout_flexible_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
@@ -244,17 +244,15 @@
   EFlexDirection flex_direction = StyleRef().FlexDirection();
   if (IsHorizontalWritingMode())
     return flex_direction == EFlexDirection::kColumnReverse;
-  return flex_direction == (StyleRef().IsLeftToRightDirection()
-                                ? EFlexDirection::kRowReverse
-                                : EFlexDirection::kRow);
+  return !StyleRef().IsLeftToRightDirection() ^
+         (flex_direction == EFlexDirection::kRowReverse);
 }
 
 bool LayoutFlexibleBox::HasLeftOverflow() const {
   EFlexDirection flex_direction = StyleRef().FlexDirection();
   if (IsHorizontalWritingMode()) {
-    return flex_direction == (StyleRef().IsLeftToRightDirection()
-                                  ? EFlexDirection::kRowReverse
-                                  : EFlexDirection::kRow);
+    return !StyleRef().IsLeftToRightDirection() ^
+           (flex_direction == EFlexDirection::kRowReverse);
   }
   return flex_direction == EFlexDirection::kColumnReverse;
 }
@@ -307,7 +305,7 @@
         child->HitTestAllPhases(result, location_in_container, child_point);
     if (child_hit) {
       UpdateHitTestResult(
-          result, FlipForWritingMode(ToLayoutPoint(
+          result, DeprecatedFlipForWritingMode(ToLayoutPoint(
                       location_in_container.Point() - accumulated_offset)));
       return true;
     }
diff --git a/third_party/blink/renderer/core/layout/layout_flow_thread.cc b/third_party/blink/renderer/core/layout/layout_flow_thread.cc
index f52bfb2..b7f1585 100644
--- a/third_party/blink/renderer/core/layout/layout_flow_thread.cc
+++ b/third_party/blink/renderer/core/layout/layout_flow_thread.cc
@@ -253,12 +253,12 @@
   // expects and returns.
   if (!IsHorizontalWritingMode())
     position = position.TransposedPoint();
-  position = FlipForWritingMode(position);
+  position = DeprecatedFlipForWritingMode(position);
 
   position.Move(ColumnOffset(position));
 
   // Make |position| logical again, and read out the values.
-  position = FlipForWritingMode(position);
+  position = DeprecatedFlipForWritingMode(position);
   if (!IsHorizontalWritingMode())
     position = position.TransposedPoint();
   block_position = position.Y();
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc
index ae3543ee..ee41515 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.cc
+++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -793,7 +793,7 @@
     CollectCulledLineBoxRects(yield);
   } else {
     const LayoutBlock* block_for_flipping =
-        NeedsFlipForWritingMode() ? ContainingBlock() : nullptr;
+        UNLIKELY(HasFlippedBlocksWritingMode()) ? ContainingBlock() : nullptr;
     for (InlineFlowBox* curr : *LineBoxes()) {
       yield(FlipForWritingMode(LayoutRect(curr->Location(), curr->Size()),
                                block_for_flipping));
@@ -806,7 +806,7 @@
     const PhysicalRectCollector& yield) const {
   DCHECK(!IsInLayoutNGInlineFormattingContext());
   const LayoutBlock* block_for_flipping =
-      NeedsFlipForWritingMode() ? ContainingBlock() : nullptr;
+      UNLIKELY(HasFlippedBlocksWritingMode()) ? ContainingBlock() : nullptr;
   CollectCulledLineBoxRectsInFlippedBlocksDirection(
       [this, block_for_flipping, &yield](const LayoutRect& r) {
         PhysicalRect rect = FlipForWritingMode(r, block_for_flipping);
@@ -921,7 +921,7 @@
   LayoutGeometryMap geometry_map(mode);
   geometry_map.PushMappingsToAncestor(this, nullptr);
   const LayoutBlock* block_for_flipping =
-      NeedsFlipForWritingMode() ? ContainingBlock() : nullptr;
+      UNLIKELY(HasFlippedBlocksWritingMode()) ? ContainingBlock() : nullptr;
   CollectLineBoxRects(
       [this, &quads, &geometry_map, block_for_flipping](const PhysicalRect& r) {
         // LayoutGeometryMap requires flipped rect as the input.
@@ -947,9 +947,9 @@
   }
   if (const InlineBox* first_box = FirstLineBoxIncludingCulling()) {
     LayoutPoint location = first_box->Location();
-    if (UNLIKELY(NeedsFlipForWritingMode())) {
-      location = ContainingBlock()->FlipForWritingMode(location);
-      location.Move(-first_box->Width(), LayoutUnit());
+    if (UNLIKELY(HasFlippedBlocksWritingMode())) {
+      location.Move(first_box->Width(), LayoutUnit());
+      return ContainingBlock()->FlipForWritingMode(location);
     }
     return PhysicalOffset(location);
   }
@@ -1753,30 +1753,6 @@
   LayoutBoxModelObject::MapLocalToAncestor(ancestor, transform_state, mode);
 }
 
-LayoutRect LayoutInline::FlipForWritingMode(
-    const PhysicalRect& r,
-    const LayoutBlock* block_for_flipping) const {
-  LayoutRect rect = r.ToLayoutRect();
-  if (UNLIKELY(NeedsFlipForWritingMode())) {
-    DCHECK(!block_for_flipping || block_for_flipping == ContainingBlock());
-    (block_for_flipping ? block_for_flipping : ContainingBlock())
-        ->FlipForWritingMode(rect);
-  }
-  return rect;
-}
-
-PhysicalRect LayoutInline::FlipForWritingMode(
-    const LayoutRect& r,
-    const LayoutBlock* block_for_flipping) const {
-  LayoutRect rect = r;
-  if (UNLIKELY(NeedsFlipForWritingMode())) {
-    DCHECK(!block_for_flipping || block_for_flipping == ContainingBlock());
-    (block_for_flipping ? block_for_flipping : ContainingBlock())
-        ->FlipForWritingMode(rect);
-  }
-  return PhysicalRect(rect);
-}
-
 PhysicalRect LayoutInline::DebugRect() const {
   return PhysicalRect(EnclosingIntRect(PhysicalLinesBoundingBox()));
 }
diff --git a/third_party/blink/renderer/core/layout/layout_inline.h b/third_party/blink/renderer/core/layout/layout_inline.h
index 96519324..5d1c691 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.h
+++ b/third_party/blink/renderer/core/layout/layout_inline.h
@@ -358,7 +358,7 @@
       TransformState&,
       VisualRectFlags = kDefaultVisualRectFlags) const final;
 
-  PositionWithAffinity PositionForPoint(const LayoutPoint&) const final;
+  PositionWithAffinity PositionForPoint(const LayoutPoint&) const override;
 
   IntRect BorderBoundingBox() const final {
     IntRect bounding_box = EnclosingIntRect(PhysicalLinesBoundingBox());
@@ -399,22 +399,6 @@
   base::Optional<PhysicalOffset> FirstLineBoxTopLeftInternal() const;
   PhysicalOffset AnchorPhysicalLocation() const;
 
-  bool NeedsFlipForWritingMode() const {
-    return HasFlippedBlocksWritingMode() && !IsSVG();
-  }
-  // These functions flip the input rect in ContainingBlock() if
-  // NeedsFlipForWritingMode() is true. If |block_for_flipping| is not null,
-  // it should be ContainingBlock(), otherwise the function will call
-  // ContainingBlock() by themselves. The caller should prepare
-  // |block_for_flipping| if it will loop through many rects to flip to avoid
-  // the cost of repeated ContainingBlock() calls.
-  ALWAYS_INLINE WARN_UNUSED_RESULT LayoutRect
-  FlipForWritingMode(const PhysicalRect& r,
-                     const LayoutBlock* block_for_flipping = nullptr) const;
-  ALWAYS_INLINE WARN_UNUSED_RESULT PhysicalRect
-  FlipForWritingMode(const LayoutRect& r,
-                     const LayoutBlock* block_for_flipping = nullptr) const;
-
   LayoutObjectChildList children_;
 
   union {
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
index 2ba1a85..368f7d2 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
@@ -393,7 +393,7 @@
 LayoutSize LayoutMultiColumnFlowThread::FlowThreadTranslationAtPoint(
     const LayoutPoint& flow_thread_point,
     CoordinateSpaceConversion mode) const {
-  LayoutPoint flipped_point = FlipForWritingMode(flow_thread_point);
+  LayoutPoint flipped_point = DeprecatedFlipForWritingMode(flow_thread_point);
   LayoutUnit block_offset =
       IsHorizontalWritingMode() ? flipped_point.Y() : flipped_point.X();
 
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index b9ade64..1ff1c9cc 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -825,6 +825,12 @@
   return block_flow->CurrentFragment();
 }
 
+bool LayoutObject::IsFirstInlineFragmentSafe() const {
+  DCHECK(IsInline());
+  LayoutBlockFlow* block_flow = ContainingNGBlockFlow();
+  return block_flow && !block_flow->NeedsLayout();
+}
+
 LayoutBox* LayoutObject::EnclosingScrollableBox() const {
   for (LayoutObject* ancestor = Parent(); ancestor;
        ancestor = ancestor->Parent()) {
@@ -2572,7 +2578,7 @@
         IntPoint center_point = RoundedIntPoint(transform_state.MappedPoint());
         transform_state.Move(ToLayoutBox(container)->FlipForWritingMode(
                                  LayoutPoint(center_point)) -
-                             center_point);
+                             PhysicalOffset(center_point));
       }
       mode &= ~kApplyContainerFlip;
     }
@@ -2692,7 +2698,7 @@
   if (apply_container_flip) {
     IntPoint center_point = RoundedIntPoint(transform_state.MappedPoint());
     transform_state.Move(
-        center_point -
+        PhysicalOffset(center_point) -
         ToLayoutBox(container)->FlipForWritingMode(LayoutPoint(center_point)));
   }
 
@@ -3070,11 +3076,9 @@
       layer->DirtyVisibleContentStatus();
   }
 
-  if (IsInLayoutNGInlineFormattingContext()) {
-    // In case of |this| layout object is moved, to avoid paint fragments in old
-    // tree live longer than |this|, we reset associated paint fragment list.
-    SetFirstInlineFragment(nullptr);
-  }
+  // |FirstInlineFragment()| should be cleared. |LayoutObjectChildList| does
+  // this, just check here for all new objects in the tree.
+  DCHECK_EQ(FirstInlineFragment(), nullptr);
 
   if (Parent()->ChildrenInline())
     Parent()->DirtyLinesFromChangedChild(this);
@@ -4066,6 +4070,20 @@
   GetNode()->SetComputedStyle(std::move(style));
 }
 
+LayoutUnit LayoutObject::FlipForWritingModeInternal(
+    LayoutUnit position,
+    LayoutUnit width,
+    const LayoutBox* box_for_flipping) const {
+  DCHECK(!IsBox());
+  DCHECK(HasFlippedBlocksWritingMode());
+  DCHECK(!box_for_flipping || box_for_flipping == ContainingBlock());
+  // For now, block flipping doesn't apply for non-box SVG objects.
+  if (IsSVG())
+    return position;
+  return (box_for_flipping ? box_for_flipping : ContainingBlock())
+      ->FlipForWritingMode(position, width);
+}
+
 }  // namespace blink
 
 #ifndef NDEBUG
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index a0fddf6..72382f6 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -929,6 +929,45 @@
     return StyleRef().IsFlippedBlocksWritingMode();
   }
 
+  // If HasFlippedBlocksWritingMode() is true, these functions flip the input
+  // rect/point in blocks direction in this object's local coordinate space
+  // (which is the ContainerBlock()'s space if this object is not a box).
+  // For non-boxes, for better performance, the caller can prepare
+  // |block_for_flipping| (= ContainingBlock()) if it will loop through many
+  // rects/points to flip to avoid the cost of repeated ContainingBlock() calls.
+  WARN_UNUSED_RESULT LayoutRect
+  FlipForWritingMode(const PhysicalRect& r,
+                     const LayoutBox* box_for_flipping = nullptr) const {
+    if (LIKELY(!HasFlippedBlocksWritingMode()))
+      return r.ToLayoutRect();
+    return {FlipForWritingModeInternal(r.X(), r.Width(), box_for_flipping),
+            r.Y(), r.Width(), r.Height()};
+  }
+  WARN_UNUSED_RESULT PhysicalRect
+  FlipForWritingMode(const LayoutRect& r,
+                     const LayoutBox* box_for_flipping = nullptr) const {
+    if (LIKELY(!HasFlippedBlocksWritingMode()))
+      return PhysicalRect(r);
+    return {FlipForWritingModeInternal(r.X(), r.Width(), box_for_flipping),
+            r.Y(), r.Width(), r.Height()};
+  }
+  WARN_UNUSED_RESULT LayoutPoint
+  FlipForWritingMode(const PhysicalOffset& p,
+                     const LayoutBox* box_for_flipping = nullptr) const {
+    if (LIKELY(!HasFlippedBlocksWritingMode()))
+      return p.ToLayoutPoint();
+    return {FlipForWritingModeInternal(p.left, LayoutUnit(), box_for_flipping),
+            p.top};
+  }
+  WARN_UNUSED_RESULT PhysicalOffset
+  FlipForWritingMode(const LayoutPoint& p,
+                     const LayoutBox* box_for_flipping = nullptr) const {
+    if (LIKELY(!HasFlippedBlocksWritingMode()))
+      return PhysicalOffset(p);
+    return {FlipForWritingModeInternal(p.X(), LayoutUnit(), box_for_flipping),
+            p.Y()};
+  }
+
   bool HasLayer() const { return bitfields_.HasLayer(); }
 
   // This may be different from StyleRef().hasBoxDecorationBackground() because
@@ -1293,6 +1332,10 @@
   // this is the root of an inline formatting context, laid out by LayoutNG.
   virtual NGPaintFragment* PaintFragment() const { return nullptr; }
 
+  // Paint/Physical fragments are not in sync with LayoutObject tree until it is
+  // laid out. For inline, it needs to check if the containing block is
+  // layout-clean. crbug.com/963103
+  bool IsFirstInlineFragmentSafe() const;
   void SetIsInLayoutNGInlineFormattingContext(bool);
   virtual NGPaintFragment* FirstInlineFragment() const { return nullptr; }
   virtual void SetFirstInlineFragment(NGPaintFragment*) {}
@@ -1775,6 +1818,13 @@
       const InlineBox*,
       int caret_offset,
       LayoutUnit* extra_width_to_end_of_line = nullptr) const;
+  PhysicalRect PhysicalLocalCaretRect(
+      const InlineBox* inline_box,
+      int caret_offset,
+      LayoutUnit* extra_width_to_end_of_line = nullptr) const {
+    return FlipForWritingMode(
+        LocalCaretRect(inline_box, caret_offset, extra_width_to_end_of_line));
+  }
 
   // When performing a global document tear-down, the layoutObject of the
   // document is cleared. We use this as a hook to detect the case of document
@@ -2586,6 +2636,11 @@
 
   IntRect AdjustVisualRectForInlineBox(const IntRect&) const;
 
+  virtual LayoutUnit FlipForWritingModeInternal(
+      LayoutUnit position,
+      LayoutUnit width,
+      const LayoutBox* box_for_flipping) const;
+
   // This is set by Set[Subtree]ShouldDoFullPaintInvalidation, and cleared
   // during PrePaint in this object's InvalidatePaint(). It's different from
   // DisplayItemClient::GetPaintInvalidationReason() which is set during
diff --git a/third_party/blink/renderer/core/layout/layout_object_child_list.cc b/third_party/blink/renderer/core/layout/layout_object_child_list.cc
index 54faafe..f7a3bd2f 100644
--- a/third_party/blink/renderer/core/layout/layout_object_child_list.cc
+++ b/third_party/blink/renderer/core/layout/layout_object_child_list.cc
@@ -37,23 +37,34 @@
 
 namespace {
 
-// Invalidate InineItems() in LayoutNGText.
+// Invalidate LayoutNG properties for insertion.
 //
 // They need to be invalidated when moving across inline formatting context
 // (i.e., to a different LayoutBlockFlow.)
 void InvalidateInlineItems(LayoutObject* object) {
-  if (object->IsInLayoutNGInlineFormattingContext())
-    object->SetFirstInlineFragment(nullptr);
-  if (object->IsText()) {
-    ToLayoutText(object)->InvalidateInlineItems();
-  } else if (object->IsLayoutInline()) {
-    // When moving without |notify_layout_object|, only top-level objects are
-    // moved. Ensure to invalidate all LayoutNGText in this inline formatting
-    // context.
-    for (LayoutObject* curr = object->SlowFirstChild(); curr;
-         curr = curr->NextSibling())
-      InvalidateInlineItems(curr);
+  DCHECK(object->IsInLayoutNGInlineFormattingContext());
+
+  if (auto* layout_text = ToLayoutTextOrNull(object)) {
+    layout_text->SetFirstInlineFragment(nullptr);
+    layout_text->InvalidateInlineItems();
+    return;
   }
+
+  if (auto* layout_inline = ToLayoutInlineOrNull(object)) {
+    layout_inline->SetFirstInlineFragment(nullptr);
+
+    // In some cases, only top-level objects are moved, when |SplitFlow()| moves
+    // subtree, or when moving without |notify_layout_object|. Ensure to
+    // invalidate all descendants in this inline formatting context.
+    for (LayoutObject* child = layout_inline->FirstChild(); child;
+         child = child->NextSibling()) {
+      if (child->IsInLayoutNGInlineFormattingContext())
+        InvalidateInlineItems(child);
+    }
+    return;
+  }
+
+  object->SetFirstInlineFragment(nullptr);
 }
 
 }  // namespace
@@ -193,14 +204,16 @@
   }
 
   if (!owner->DocumentBeingDestroyed()) {
+    // Run LayoutNG invalidations outside of |InsertedIntoTree| because it needs
+    // to run regardless of |notify_layout_object|. |notify_layout_object| is an
+    // optimization to skip notifications when moving within the same tree.
+    if (new_child->IsInLayoutNGInlineFormattingContext()) {
+      InvalidateInlineItems(new_child);
+    }
+
     if (notify_layout_object) {
       new_child->InsertedIntoTree();
       LayoutCounter::LayoutObjectSubtreeAttached(new_child);
-    } else if (RuntimeEnabledFeatures::LayoutNGEnabled()) {
-      // |notify_layout_object| is an optimization to skip notifications when
-      // moving within the same tree. Inline items need to be invalidated even
-      // when moving.
-      InvalidateInlineItems(new_child);
     }
 
     if (owner->IsInLayoutNGInlineFormattingContext() ||
diff --git a/third_party/blink/renderer/core/layout/layout_table.cc b/third_party/blink/renderer/core/layout/layout_table.cc
index 039731d9..72102c9 100644
--- a/third_party/blink/renderer/core/layout/layout_table.cc
+++ b/third_party/blink/renderer/core/layout/layout_table.cc
@@ -1641,9 +1641,9 @@
       (action == kHitTestBlockBackground ||
        action == kHitTestChildBlockBackground) &&
       location_in_container.Intersects(bounds_rect)) {
-    UpdateHitTestResult(result,
-                        FlipForWritingMode(location_in_container.Point() -
-                                           ToLayoutSize(adjusted_location)));
+    UpdateHitTestResult(
+        result, DeprecatedFlipForWritingMode(location_in_container.Point() -
+                                             ToLayoutSize(adjusted_location)));
     if (result.AddNodeToListBasedTestResult(GetNode(), location_in_container,
                                             bounds_rect) == kStopHitTesting)
       return true;
diff --git a/third_party/blink/renderer/core/layout/layout_table_section.cc b/third_party/blink/renderer/core/layout/layout_table_section.cc
index eb0b1bd..285bba66 100644
--- a/third_party/blink/renderer/core/layout/layout_table_section.cc
+++ b/third_party/blink/renderer/core/layout/layout_table_section.cc
@@ -1510,7 +1510,7 @@
     const LayoutRect& rect) const {
   LayoutRect table_aligned_rect(rect);
 
-  FlipForWritingMode(table_aligned_rect);
+  DeprecatedFlipForWritingMode(table_aligned_rect);
 
   if (!TableStyle().IsHorizontalWritingMode())
     table_aligned_rect = table_aligned_rect.TransposedRect();
@@ -1742,6 +1742,7 @@
 LayoutTableCell* LayoutTableSection::OriginatingCellAt(
     unsigned row,
     unsigned effective_column) {
+  SECURITY_CHECK(!needs_cell_recalc_);
   if (effective_column >= NumCols(row))
     return nullptr;
   auto& grid_cell = GridCellAt(row, effective_column);
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc
index 20f5271..6b9d768 100644
--- a/third_party/blink/renderer/core/layout/layout_text.cc
+++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -204,6 +204,8 @@
     valid_ng_items_ = false;
     SetNeedsCollectInlines();
   }
+
+  SetHorizontalWritingMode(new_style.IsHorizontalWritingMode());
 }
 
 void LayoutText::RemoveAndDestroyTextBoxes() {
@@ -421,55 +423,48 @@
   return IntRect();
 }
 
-void LayoutText::AccumlateQuads(Vector<FloatQuad>& quads,
-                                const IntRect& ellipsis_rect,
-                                LocalOrAbsoluteOption local_or_absolute,
-                                MapCoordinatesFlags mode,
-                                const LayoutRect& passed_boundaries) const {
-  FloatRect boundaries(passed_boundaries);
-  if (!ellipsis_rect.IsEmpty()) {
-    if (StyleRef().IsHorizontalWritingMode())
-      boundaries.SetWidth(ellipsis_rect.MaxX() - boundaries.X());
-    else
-      boundaries.SetHeight(ellipsis_rect.MaxY() - boundaries.Y());
-  }
-  quads.push_back(local_or_absolute == kAbsoluteQuads
-                      ? LocalToAbsoluteQuad(boundaries, mode)
-                      : boundaries);
-}
-
-void LayoutText::Quads(Vector<FloatQuad>& quads,
-                       ClippingOption option,
-                       LocalOrAbsoluteOption local_or_absolute,
-                       MapCoordinatesFlags mode) const {
+template <typename PhysicalRectCollector>
+void LayoutText::CollectLineBoxRects(const PhysicalRectCollector& yield,
+                                     ClippingOption option) const {
   if (const NGPhysicalBoxFragment* box_fragment =
           ContainingBlockFlowFragment()) {
     const auto children =
         NGInlineFragmentTraversal::SelfFragmentsOf(*box_fragment, this);
-    const LayoutBlock* block_for_flipping = nullptr;
-    if (UNLIKELY(HasFlippedBlocksWritingMode()))
-      block_for_flipping = ContainingBlock();
     for (const auto& child : children) {
       // TODO(layout-dev): We should have NG version of |EllipsisRectForBox()|
-      LayoutRect rect = child.RectInContainerBox().ToLayoutRect();
-      if (UNLIKELY(block_for_flipping))
-        block_for_flipping->FlipForWritingMode(rect);
-      AccumlateQuads(quads, IntRect(), local_or_absolute, mode, rect);
+      yield(child.RectInContainerBox());
     }
     return;
   }
+
+  const LayoutBlock* block_for_flipping =
+      UNLIKELY(HasFlippedBlocksWritingMode()) ? ContainingBlock() : nullptr;
   for (InlineTextBox* box : TextBoxes()) {
+    LayoutRect boundaries = box->FrameRect();
     const IntRect ellipsis_rect = (option == kClipToEllipsis)
                                       ? EllipsisRectForBox(box, 0, TextLength())
                                       : IntRect();
-    AccumlateQuads(quads, ellipsis_rect, local_or_absolute, mode,
-                   box->FrameRect());
+    if (!ellipsis_rect.IsEmpty()) {
+      if (IsHorizontalWritingMode())
+        boundaries.SetWidth(ellipsis_rect.MaxX() - boundaries.X());
+      else
+        boundaries.SetHeight(ellipsis_rect.MaxY() - boundaries.Y());
+    }
+    yield(FlipForWritingMode(boundaries, block_for_flipping));
   }
 }
 
 void LayoutText::AbsoluteQuads(Vector<FloatQuad>& quads,
                                MapCoordinatesFlags mode) const {
-  Quads(quads, kNoClipping, kAbsoluteQuads, mode);
+  const LayoutBlock* block_for_flipping =
+      UNLIKELY(HasFlippedBlocksWritingMode()) ? ContainingBlock() : nullptr;
+  CollectLineBoxRects(
+      [this, &quads, mode, block_for_flipping](const PhysicalRect& r) {
+        // LocalToAbsoluteQuad requires the input to be in flipped blocks
+        // direction.
+        LayoutRect rect = FlipForWritingMode(r, block_for_flipping);
+        quads.push_back(LocalToAbsoluteQuad(FloatRect(rect), mode));
+      });
 }
 
 bool LayoutText::MapDOMOffsetToTextContentOffset(const NGOffsetMapping& mapping,
@@ -560,12 +555,12 @@
       const unsigned clamped_start =
           std::max(start, text_fragment.StartOffset());
       const unsigned clamped_end = std::min(end, text_fragment.EndOffset());
-      LayoutRect rect =
-          text_fragment.LocalRect(clamped_start, clamped_end).ToLayoutRect();
-      rect.MoveBy(fragment->InlineOffsetToContainerBox().ToLayoutPoint());
-      if (UNLIKELY(block_for_flipping))
-        block_for_flipping->FlipForWritingMode(rect);
-      const FloatQuad quad = LocalToAbsoluteQuad(FloatRect(rect));
+      PhysicalRect rect = text_fragment.LocalRect(clamped_start, clamped_end);
+      rect.Move(fragment->InlineOffsetToContainerBox());
+      // LocalToAbsoluteQuad requires the input to be in flipped blocks
+      // direction.
+      LayoutRect layout_rect = FlipForWritingMode(rect, block_for_flipping);
+      const FloatQuad quad = LocalToAbsoluteQuad(FloatRect(layout_rect));
       if (clamped_start < clamped_end) {
         quads.push_back(quad);
         found_non_collapsed_quad = true;
@@ -621,10 +616,16 @@
 
 FloatRect LayoutText::LocalBoundingBoxRectForAccessibility() const {
   FloatRect result;
-  Vector<FloatQuad> quads;
-  Quads(quads, LayoutText::kClipToEllipsis, LayoutText::kLocalQuads);
-  for (const FloatQuad& quad : quads)
-    result.Unite(quad.BoundingBox());
+  const LayoutBlock* block_for_flipping =
+      UNLIKELY(HasFlippedBlocksWritingMode()) ? ContainingBlock() : nullptr;
+  CollectLineBoxRects(
+      [this, &result, block_for_flipping](const PhysicalRect& r) {
+        LayoutRect rect = FlipForWritingMode(r, block_for_flipping);
+        result.Unite(FloatRect(rect));
+      },
+      kClipToEllipsis);
+  // TODO(wangxianzhu): This is one of a few cases that a FloatRect is required
+  // to be in flipped blocks direction. Should eliminite them.
   return result;
 }
 
@@ -1543,13 +1544,18 @@
 }
 
 PhysicalOffset LayoutText::FirstLineBoxTopLeft() const {
-  if (const NGPaintFragment* fragment = FirstInlineFragment())
+  if (const NGPaintFragment* fragment = FirstInlineFragment()) {
+    // TODO(kojii): Some clients call this against dirty-tree, but NG fragments
+    // are not safe to read for dirty-tree. crbug.com/963103
+    if (UNLIKELY(!IsFirstInlineFragmentSafe()))
+      return PhysicalOffset();
     return fragment->InlineOffsetToContainerBox();
+  }
   if (const auto* text_box = FirstTextBox()) {
-    auto location = text_box->Location();
+    LayoutPoint location = text_box->Location();
     if (UNLIKELY(HasFlippedBlocksWritingMode())) {
-      location = ContainingBlock()->FlipForWritingMode(location);
-      location.Move(-text_box->Width(), LayoutUnit());
+      location.Move(text_box->Width(), LayoutUnit());
+      return ContainingBlock()->FlipForWritingMode(location);
     }
     return PhysicalOffset(location);
   }
@@ -1962,55 +1968,19 @@
 }
 
 PhysicalRect LayoutText::PhysicalLinesBoundingBox() const {
-  if (const NGPhysicalBoxFragment* box_fragment =
-          ContainingBlockFlowFragment()) {
-    PhysicalRect bounding_box;
-    auto children =
-        NGInlineFragmentTraversal::SelfFragmentsOf(*box_fragment, this);
-    for (const auto& child : children)
-      bounding_box.UniteIfNonZero(child.RectInContainerBox());
-    return bounding_box;
-  }
-
-  LayoutRect result;
-
-  DCHECK_EQ(!FirstTextBox(),
-            !LastTextBox());  // Either both are null or both exist.
-  if (FirstTextBox() && LastTextBox()) {
-    // Return the width of the minimal left side and the maximal right side.
-    float logical_left_side = 0;
-    float logical_right_side = 0;
-    for (InlineTextBox* curr : TextBoxes()) {
-      if (curr == FirstTextBox() || curr->LogicalLeft() < logical_left_side)
-        logical_left_side = curr->LogicalLeft().ToFloat();
-      if (curr == FirstTextBox() || curr->LogicalRight() > logical_right_side)
-        logical_right_side = curr->LogicalRight().ToFloat();
-    }
-
-    bool is_horizontal = StyleRef().IsHorizontalWritingMode();
-
-    float x = is_horizontal ? logical_left_side : FirstTextBox()->X().ToFloat();
-    float y = is_horizontal ? FirstTextBox()->Y().ToFloat() : logical_left_side;
-    float width = is_horizontal ? logical_right_side - logical_left_side
-                                : LastTextBox()->LogicalBottom() - x;
-    float height = is_horizontal ? LastTextBox()->LogicalBottom() - y
-                                 : logical_right_side - logical_left_side;
-    result = EnclosingLayoutRect(FloatRect(x, y, width, height));
-  }
-
-  if (UNLIKELY(HasFlippedBlocksWritingMode()))
-    ContainingBlock()->FlipForWritingMode(result);
-  return PhysicalRect(result);
+  PhysicalRect result;
+  CollectLineBoxRects(
+      [&result](const PhysicalRect& r) { result.UniteIfNonZero(r); });
+  // Some callers expect correct offset even if the rect is empty.
+  if (result == PhysicalRect())
+    result.offset = FirstLineBoxTopLeft();
+  return result;
 }
 
 LayoutRect LayoutText::VisualOverflowRect() const {
   if (base::Optional<PhysicalRect> physical_rect =
-          NGPaintFragment::LocalVisualRectFor(*this)) {
-    LayoutRect rect = physical_rect->ToLayoutRect();
-    if (UNLIKELY(HasFlippedBlocksWritingMode()))
-      ContainingBlock()->FlipForWritingMode(rect);
-    return rect;
-  }
+          NGPaintFragment::LocalVisualRectFor(*this))
+    return FlipForWritingMode(*physical_rect);
 
   if (!FirstTextBox())
     return LayoutRect();
@@ -2057,13 +2027,12 @@
 }
 
 PhysicalRect LayoutText::LocalVisualRectIgnoringVisibility() const {
-  if (const auto& rect = NGPaintFragment::LocalVisualRectFor(*this))
-    return UnionRect(*rect, LocalSelectionVisualRect());
-
-  auto rect = VisualOverflowRect();
-  if (UNLIKELY(HasFlippedBlocksWritingMode()))
-    ContainingBlock()->FlipForWritingMode(rect);
-  return UnionRect(PhysicalRect(rect), LocalSelectionVisualRect());
+  PhysicalRect rect;
+  if (const auto& r = NGPaintFragment::LocalVisualRectFor(*this))
+    rect = *r;
+  else
+    rect = FlipForWritingMode(VisualOverflowRect());
+  return UnionRect(rect, LocalSelectionVisualRect());
 }
 
 PhysicalRect LayoutText::LocalSelectionVisualRect() const {
@@ -2100,9 +2069,7 @@
     rect.Unite(LayoutRect(EllipsisRectForBox(box, start_pos, end_pos)));
   }
 
-  if (UNLIKELY(HasFlippedBlocksWritingMode()))
-    ContainingBlock()->FlipForWritingMode(rect);
-  return PhysicalRect(rect);
+  return FlipForWritingMode(rect);
 }
 
 const NGOffsetMapping* LayoutText::GetNGOffsetMapping() const {
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h
index 6b25375..7d2ce62 100644
--- a/third_party/blink/renderer/core/layout/layout_text.h
+++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -120,11 +120,8 @@
   FloatRect LocalBoundingBoxRectForAccessibility() const final;
 
   enum ClippingOption { kNoClipping, kClipToEllipsis };
-  enum LocalOrAbsoluteOption { kLocalQuads, kAbsoluteQuads };
-  void Quads(Vector<FloatQuad>&,
-             ClippingOption = kNoClipping,
-             LocalOrAbsoluteOption = kAbsoluteQuads,
-             MapCoordinatesFlags mode = 0) const;
+  void LocalQuadsInFlippedBlocksDirection(Vector<FloatQuad>&,
+                                          ClippingOption = kNoClipping) const;
 
   PositionWithAffinity PositionForPoint(const LayoutPoint&) const override;
 
@@ -346,11 +343,11 @@
  private:
   InlineTextBoxList& MutableTextBoxes();
 
-  void AccumlateQuads(Vector<FloatQuad>&,
-                      const IntRect& ellipsis_rect,
-                      LocalOrAbsoluteOption,
-                      MapCoordinatesFlags mode,
-                      const LayoutRect&) const;
+  // PhysicalRectCollector should be like a function:
+  // void (const PhysicalRect&).
+  template <typename PhysicalRectCollector>
+  void CollectLineBoxRects(const PhysicalRectCollector&,
+                           ClippingOption option = kNoClipping) const;
 
   void ComputePreferredLogicalWidths(float lead_width);
   void ComputePreferredLogicalWidths(
diff --git a/third_party/blink/renderer/core/layout/layout_text_test.cc b/third_party/blink/renderer/core/layout/layout_text_test.cc
index 5d6831c..f8b7005 100644
--- a/third_party/blink/renderer/core/layout/layout_text_test.cc
+++ b/third_party/blink/renderer/core/layout/layout_text_test.cc
@@ -662,21 +662,6 @@
                 ->PhysicalLinesBoundingBox());
 }
 
-TEST_P(ParameterizedLayoutTextTest, QuadsBasic) {
-  GetDocument().SetCompatibilityMode(Document::kQuirksMode);
-  LoadAhem();
-  SetBasicBody(
-      "<style>p {font: 13px/17px Ahem;}</style>"
-      "<p id=one>one</p>");
-  const Element& one = *GetDocument().getElementById("one");
-  Vector<FloatQuad> actual_quads;
-  ToLayoutText(one.firstChild()->GetLayoutObject())->Quads(actual_quads);
-  EXPECT_EQ(
-      Vector<FloatQuad>({FloatQuad(FloatPoint(8, 10), FloatPoint(47, 10),
-                                   FloatPoint(47, 23), FloatPoint(8, 23))}),
-      actual_quads);
-}
-
 TEST_P(ParameterizedLayoutTextTest, WordBreakElement) {
   SetBasicBody("foo <wbr> bar");
 
@@ -807,4 +792,51 @@
                                 "foo bar b^a|z</div>"));
 }
 
+TEST_P(ParameterizedLayoutTextTest, VisualRectInDocumentSVGTspan) {
+  LoadAhem();
+  SetBodyInnerHTML(R"HTML(
+    <style>
+      body {
+        margin:0px;
+        font: 20px/20px Ahem;
+      }
+    </style>
+    <svg>
+      <text x="10" y="50" width="100">
+        <tspan id="target" dx="15" dy="25">tspan</tspan>
+      </text>
+    </svg>
+  )HTML");
+
+  LayoutText* target =
+      ToLayoutText(GetLayoutObjectByElementId("target")->SlowFirstChild());
+  const int ascent = 16;
+  PhysicalRect expected(10 + 15, 50 + 25 - ascent, 20 * 5, 20);
+  EXPECT_EQ(expected, target->VisualRectInDocument());
+  EXPECT_EQ(expected, target->VisualRectInDocument(kUseGeometryMapper));
+}
+
+TEST_P(ParameterizedLayoutTextTest, VisualRectInDocumentSVGTspanTB) {
+  LoadAhem();
+  SetBodyInnerHTML(R"HTML(
+    <style>
+      body {
+        margin:0px;
+        font: 20px/20px Ahem;
+      }
+    </style>
+    <svg>
+      <text x="50" y="10" width="100" writing-mode="tb">
+        <tspan id="target" dx="15" dy="25">tspan</tspan>
+      </text>
+    </svg>
+  )HTML");
+
+  LayoutText* target =
+      ToLayoutText(GetLayoutObjectByElementId("target")->SlowFirstChild());
+  PhysicalRect expected(50 + 15 - 20 / 2, 10 + 25, 20, 20 * 5);
+  EXPECT_EQ(expected, target->VisualRectInDocument());
+  EXPECT_EQ(expected, target->VisualRectInDocument(kUseGeometryMapper));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
index 822d80d..a7ee036 100644
--- a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
+++ b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
@@ -451,15 +451,16 @@
   if (!physical_text_fragment)
     return;
   const ComputedStyle& style = physical_fragment.Style();
+  // TODO(layout-dev): Dump physical coordinates when removing the legacy inline
+  // layout code.
   NGTextFragment fragment(style.GetWritingMode(), *physical_text_fragment);
   if (UNLIKELY(style.IsFlippedBlocksWritingMode())) {
     if (physical_fragment.GetLayoutObject()) {
-      LayoutRect rect(offset_to_container_box.ToLayoutPoint(),
-                      physical_fragment.Size().ToLayoutSize());
+      PhysicalRect rect(offset_to_container_box, physical_fragment.Size());
       const LayoutBlock* containing_block =
           physical_fragment.GetLayoutObject()->ContainingBlock();
-      containing_block->FlipForWritingMode(rect);
-      offset_to_container_box.left = rect.X();
+      LayoutRect layout_rect = containing_block->FlipForWritingMode(rect);
+      offset_to_container_box.left = layout_rect.X();
     }
   }
 
diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc
index 9f92e98..4ea710e 100644
--- a/third_party/blink/renderer/core/layout/layout_view.cc
+++ b/third_party/blink/renderer/core/layout/layout_view.cc
@@ -715,8 +715,7 @@
 }
 
 IntRect LayoutView::DocumentRect() const {
-  LayoutRect overflow_rect(LayoutOverflowRect());
-  FlipForWritingMode(overflow_rect);
+  PhysicalRect overflow_rect = FlipForWritingMode(LayoutOverflowRect());
   // TODO(crbug.com/650768): The pixel snapping looks incorrect.
   return PixelSnappedIntRect(overflow_rect);
 }
diff --git a/third_party/blink/renderer/core/layout/line/inline_box.cc b/third_party/blink/renderer/core/layout/line/inline_box.cc
index 118f69f..63705c62 100644
--- a/third_party/blink/renderer/core/layout/line/inline_box.cc
+++ b/third_party/blink/renderer/core/layout/line/inline_box.cc
@@ -346,18 +346,6 @@
   return rect.Location();
 }
 
-void InlineBox::FlipForWritingMode(FloatRect& rect) const {
-  if (!UNLIKELY(GetLineLayoutItem().HasFlippedBlocksWritingMode()))
-    return;
-  Root().Block().FlipForWritingMode(rect);
-}
-
-FloatPoint InlineBox::FlipForWritingMode(const FloatPoint& point) const {
-  if (!UNLIKELY(GetLineLayoutItem().HasFlippedBlocksWritingMode()))
-    return point;
-  return Root().Block().FlipForWritingMode(point);
-}
-
 void InlineBox::FlipForWritingMode(LayoutRect& rect) const {
   if (!UNLIKELY(GetLineLayoutItem().HasFlippedBlocksWritingMode()))
     return;
diff --git a/third_party/blink/renderer/core/layout/line/inline_box.h b/third_party/blink/renderer/core/layout/line/inline_box.h
index d6d23d6..0f8091b 100644
--- a/third_party/blink/renderer/core/layout/line/inline_box.h
+++ b/third_party/blink/renderer/core/layout/line/inline_box.h
@@ -357,8 +357,6 @@
 
   // TODO(szager): The Rect versions should return a rect, not modify the
   // argument.
-  void FlipForWritingMode(FloatRect&) const;
-  FloatPoint FlipForWritingMode(const FloatPoint&) const;
   void FlipForWritingMode(LayoutRect&) const;
   LayoutPoint FlipForWritingMode(const LayoutPoint&) const;
 
diff --git a/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.cc b/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.cc
index 8542fac..8f516e2 100644
--- a/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.cc
+++ b/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.cc
@@ -169,12 +169,12 @@
           : ColumnIndexAtOffset(offset_in_flow_thread, rule);
 
   LayoutRect portion_rect(FlowThreadPortionRectAt(column_index));
-  flow_thread->FlipForWritingMode(portion_rect);
+  flow_thread->DeprecatedFlipForWritingMode(portion_rect);
   portion_rect.MoveBy(flow_thread->PhysicalLocation().ToLayoutPoint());
 
   LayoutRect column_rect(ColumnRectAt(column_index));
   column_rect.Move(OffsetFromColumnSet());
-  column_set_.FlipForWritingMode(column_rect);
+  column_set_.DeprecatedFlipForWritingMode(column_rect);
   column_rect.MoveBy(column_set_.PhysicalLocation().ToLayoutPoint());
 
   LayoutSize translation_relative_to_flow_thread =
@@ -262,7 +262,8 @@
   // Find the start and end column intersected by the bounding box.
   LayoutRect flipped_bounding_box_in_flow_thread(bounding_box_in_flow_thread);
   LayoutFlowThread* flow_thread = column_set_.FlowThread();
-  flow_thread->FlipForWritingMode(flipped_bounding_box_in_flow_thread);
+  flow_thread->DeprecatedFlipForWritingMode(
+      flipped_bounding_box_in_flow_thread);
   bool is_horizontal_writing_mode = column_set_.IsHorizontalWritingMode();
   LayoutUnit bounding_box_logical_top =
       is_horizontal_writing_mode ? flipped_bounding_box_in_flow_thread.Y()
@@ -283,7 +284,8 @@
 
   LayoutRect start_column_flow_thread_overflow_portion =
       FlowThreadPortionOverflowRectAt(start_column);
-  flow_thread->FlipForWritingMode(start_column_flow_thread_overflow_portion);
+  flow_thread->DeprecatedFlipForWritingMode(
+      start_column_flow_thread_overflow_portion);
   LayoutRect start_column_rect(bounding_box_in_flow_thread);
   start_column_rect.Intersect(start_column_flow_thread_overflow_portion);
   start_column_rect.Move(
@@ -295,7 +297,8 @@
 
   LayoutRect end_column_flow_thread_overflow_portion =
       FlowThreadPortionOverflowRectAt(end_column);
-  flow_thread->FlipForWritingMode(end_column_flow_thread_overflow_portion);
+  flow_thread->DeprecatedFlipForWritingMode(
+      end_column_flow_thread_overflow_portion);
   LayoutRect end_column_rect(bounding_box_in_flow_thread);
   end_column_rect.Intersect(end_column_flow_thread_overflow_portion);
   end_column_rect.Move(FlowThreadTranslationAtOffset(
diff --git a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion.cc b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion.cc
index 66d3f69..d0d4e64 100644
--- a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion.cc
+++ b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion.cc
@@ -7,7 +7,8 @@
 namespace blink {
 
 bool NGExclusion::operator==(const NGExclusion& other) const {
-  return std::tie(other.rect, other.type) == std::tie(rect, type);
+  return type == other.type && rect == other.rect &&
+         shape_data == other.shape_data;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.cc b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.cc
index 81db62c..549698b 100644
--- a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.cc
+++ b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.cc
@@ -228,8 +228,7 @@
   bool already_exists = false;
 
   if (num_exclusions_ < exclusions_->data.size()) {
-    if (*exclusion == *exclusions_->data.at(num_exclusions_) &&
-        !exclusion->shape_data) {
+    if (*exclusion == *exclusions_->data.at(num_exclusions_)) {
       // We might be adding an exclusion seen in a previous layout pass.
       already_exists = true;
     } else {
diff --git a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h
index ff5feb8..0d05cbc 100644
--- a/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h
+++ b/third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h
@@ -151,7 +151,11 @@
       const NGExclusionSpaceInternal& other) const {
     DCHECK_EQ(num_exclusions_, other.num_exclusions_);
     for (wtf_size_t i = 0; i < num_exclusions_; ++i) {
-      DCHECK(*exclusions_->data.at(i) == *other.exclusions_->data.at(i));
+      const auto& exclusion = *exclusions_->data.at(i);
+      const auto& other_exclusion = *other.exclusions_->data.at(i);
+      DCHECK(exclusion.rect == other_exclusion.rect);
+      DCHECK_EQ(exclusion.type, other_exclusion.type);
+      DCHECK_EQ((bool)exclusion.shape_data, (bool)other_exclusion.shape_data);
     }
   }
 #endif
diff --git a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text.h b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text.h
index d922dbf..4e2517f 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text.h
@@ -23,12 +23,6 @@
   }
   bool IsLayoutNGObject() const override { return true; }
 
- protected:
-  void InsertedIntoTree() override {
-    valid_ng_items_ = false;
-    LayoutText::InsertedIntoTree();
-  }
-
  private:
   const NGInlineItems* GetNGInlineItems() const final { return &inline_items_; }
   NGInlineItems* GetNGInlineItems() final { return &inline_items_; }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
index 3508091..4149569 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
@@ -125,29 +125,19 @@
       DCHECK(fragment.PhysicalFragment().IsBox());
       const PhysicalRect fragment_local_rect = ComputeLocalCaretRectByBoxSide(
           fragment, caret_position.position_type);
-      return {layout_object, fragment_local_rect.ToLayoutRect()};
+      return {layout_object, fragment_local_rect};
     }
     case NGCaretPositionType::kAtTextOffset: {
       DCHECK(fragment.PhysicalFragment().IsText());
       DCHECK(caret_position.text_offset.has_value());
       const PhysicalRect caret_rect = ComputeLocalCaretRectAtTextOffset(
           fragment, *caret_position.text_offset);
-      LayoutRect layout_rect = caret_rect.ToLayoutRect();
-
-      // For vertical-rl, convert to "flipped block-flow" coordinates space.
-      // See core/layout/README.md#coordinate-spaces for details.
-      if (fragment.Style().IsFlippedBlocksWritingMode()) {
-        const LayoutBlockFlow* container =
-            layout_object->ContainingNGBlockFlow();
-        container->FlipForWritingMode(layout_rect);
-      }
-
-      return {layout_object, layout_rect};
+      return {layout_object, caret_rect};
     }
   }
 
   NOTREACHED();
-  return {layout_object, LayoutRect()};
+  return {layout_object, PhysicalRect()};
 }
 
 LocalCaretRect ComputeLocalSelectionRect(
@@ -156,32 +146,21 @@
   if (!caret_rect.layout_object)
     return caret_rect;
 
-  const LayoutObject* layout_object = caret_rect.layout_object;
-  const LayoutRect rect = caret_rect.rect;
-
   const NGPaintFragment& fragment = *caret_position.fragment;
   const NGPaintFragment* line_box = fragment.ContainerLineBox();
   // TODO(xiaochengh): We'll hit this DCHECK for caret in empty block if we
   // enable LayoutNG in contenteditable.
   DCHECK(line_box);
 
+  PhysicalRect rect = caret_rect.rect;
   if (fragment.Style().IsHorizontalWritingMode()) {
-    const LayoutUnit line_top = line_box->InlineOffsetToContainerBox().top;
-    const LayoutUnit line_height = line_box->Size().height;
-    return LocalCaretRect(layout_object, LayoutRect(rect.X(), line_top,
-                                                    rect.Width(), line_height));
+    rect.SetY(line_box->InlineOffsetToContainerBox().top);
+    rect.SetHeight(line_box->Size().height);
+  } else {
+    rect.SetX(line_box->InlineOffsetToContainerBox().left);
+    rect.SetHeight(line_box->Size().width);
   }
-
-  const LayoutUnit line_top = line_box->InlineOffsetToContainerBox().left;
-  const LayoutUnit line_height = line_box->Size().width;
-  LayoutRect layout_rect(line_top, rect.Y(), line_height, rect.Height());
-  // For vertical-rl, convert to "flipped block-flow" coordinates space.
-  // See core/layout/README.md#coordinate-spaces for details.
-  if (fragment.Style().IsFlippedBlocksWritingMode()) {
-    const LayoutBlockFlow* container = layout_object->ContainingNGBlockFlow();
-    container->FlipForWritingMode(layout_rect);
-  }
-  return LocalCaretRect(layout_object, layout_rect);
+  return {caret_rect.layout_object, rect};
 }
 
 }  // namespace
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
index 5f5ad0b0..c187f34 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
@@ -1339,6 +1339,55 @@
   EXPECT_FALSE(layout_block_flow_->HasNGInlineNodeData());
 }
 
+// Test inline objects are initialized when |SplitFlow()| moves them.
+TEST_F(NGInlineNodeTest, ClearFirstInlineFragmentOnSplitFlow) {
+  SetBodyInnerHTML(R"HTML(
+    <div>
+      <span id=outer_span>
+        <span id=inner_span>1234</span>
+      </span>
+    </div>
+  )HTML");
+
+  // Keep the text fragment to compare later.
+  Element* inner_span = GetElementById("inner_span");
+  Node* text = inner_span->firstChild();
+  scoped_refptr<NGPaintFragment> text_fragment_before_split =
+      text->GetLayoutObject()->FirstInlineFragment();
+  EXPECT_NE(text_fragment_before_split.get(), nullptr);
+
+  // Append <div> to <span>. causing SplitFlow().
+  Element* outer_span = GetElementById("outer_span");
+  Element* div = GetDocument().CreateRawElement(html_names::kDivTag);
+  outer_span->appendChild(div);
+
+  // Update tree but do NOT update layout. At this point, there's no guarantee,
+  // but there are some clients (e.g., Schroll Anchor) who try to read
+  // associated fragments.
+  //
+  // NGPaintFragment is owned by LayoutNGBlockFlow. Because the original owner
+  // no longer has an inline formatting context, the NGPaintFragment subtree is
+  // destroyed, and should not be accessible.
+  GetDocument().UpdateStyleAndLayoutTree();
+  scoped_refptr<NGPaintFragment> text_fragment_before_layout =
+      text->GetLayoutObject()->FirstInlineFragment();
+  EXPECT_EQ(text_fragment_before_layout, nullptr);
+
+  // Update layout. There should be a different instance of the text fragment.
+  UpdateAllLifecyclePhasesForTest();
+  scoped_refptr<NGPaintFragment> text_fragment_after_layout =
+      text->GetLayoutObject()->FirstInlineFragment();
+  EXPECT_NE(text_fragment_before_split, text_fragment_after_layout);
+
+  // Check it is the one owned by the new root inline formatting context.
+  LayoutBlock* anonymous_block =
+      inner_span->GetLayoutObject()->ContainingBlock();
+  EXPECT_TRUE(anonymous_block->IsAnonymous());
+  const NGPaintFragment* block_fragment = anonymous_block->PaintFragment();
+  const NGPaintFragment* line_box_fragment = block_fragment->FirstChild();
+  EXPECT_EQ(line_box_fragment->FirstChild(), text_fragment_after_layout);
+}
+
 // https://crbug.com/911220
 TEST_F(NGInlineNodeTest, PreservedNewlineWithBidiAndRelayout) {
   SetupHtml("container",
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
index ee9c006e..8da9010 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
@@ -15,7 +15,6 @@
 namespace {
 
 struct SameSizeAsNGPhysicalLineBoxFragment : NGPhysicalContainerFragment {
-  void* pointer;
   NGLineHeightMetrics metrics;
 };
 
@@ -50,7 +49,6 @@
       metrics_(builder->metrics_) {
   // A line box must have a metrics unless it's an empty line box.
   DCHECK(!metrics_.IsEmpty() || IsEmptyLineBox());
-  style_ = std::move(builder->style_);
   base_direction_ = static_cast<unsigned>(builder->base_direction_);
   has_propagated_descendants_ = has_floating_descendants_ ||
                                 !oof_positioned_descendants_.IsEmpty() ||
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
index 61d1229e..a919365 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
@@ -44,7 +44,6 @@
   // True if descendants were propagated to outside of this fragment.
   bool HasPropagatedDescendants() const { return has_propagated_descendants_; }
 
-  const ComputedStyle& Style() const { return *style_; }
   const NGLineHeightMetrics& Metrics() const { return metrics_; }
 
   // The base direction of this line. Also known as the paragraph direction.
@@ -81,7 +80,6 @@
  private:
   NGPhysicalLineBoxFragment(NGLineBoxFragmentBuilder* builder);
 
-  scoped_refptr<const ComputedStyle> style_;
   NGLineHeightMetrics metrics_;
   NGLinkStorage children_[];
 };
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h
index 0a585db..9799e2b 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h
@@ -48,7 +48,7 @@
                    const LayoutPoint& accumulated_offset,
                    HitTestAction) final;
 
-  PositionWithAffinity PositionForPoint(const LayoutPoint&) const final;
+  PositionWithAffinity PositionForPoint(const LayoutPoint&) const override;
 
   NGPaintFragment* PaintFragment() const final {
     // TODO(layout-dev) crbug.com/963103
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.cc b/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.cc
index ad92092..6938996 100644
--- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.cc
+++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.cc
@@ -24,4 +24,9 @@
          LayoutInline::IsOfType(type);
 }
 
+PositionWithAffinity LayoutNGInsideListMarker::PositionForPoint(
+    const LayoutPoint&) const {
+  return CreatePositionWithAffinity(0);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h b/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h
index 6267fa6..9197de75 100644
--- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h
+++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h
@@ -30,6 +30,7 @@
 
  private:
   bool IsOfType(LayoutObjectType) const override;
+  PositionWithAffinity PositionForPoint(const LayoutPoint&) const override;
 };
 
 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutNGInsideListMarker,
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.cc b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.cc
index 09193a2..bf9f409 100644
--- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.cc
+++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.cc
@@ -53,4 +53,9 @@
   return false;
 }
 
+PositionWithAffinity LayoutNGListMarker::PositionForPoint(
+    const LayoutPoint&) const {
+  return CreatePositionWithAffinity(0);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.h b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.h
index dfc428c..74eb29e 100644
--- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.h
+++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_marker.h
@@ -32,6 +32,7 @@
 
  private:
   bool IsOfType(LayoutObjectType) const override;
+  PositionWithAffinity PositionForPoint(const LayoutPoint&) const override;
 };
 
 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutNGListMarker, IsLayoutNGListMarker());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
index 9dfaa66..d8663099 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
@@ -37,9 +37,7 @@
                                    writing_mode,
                                    direction),
         box_type_(NGPhysicalFragment::NGBoxType::kNormalBox),
-        did_break_(false) {
-    layout_object_ = node.GetLayoutBox();
-  }
+        did_break_(false) {}
 
   // Build a fragment for LayoutObject without NGLayoutInputNode. LayoutInline
   // has NGInlineItem but does not have corresponding NGLayoutInputNode.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
index ee738d90..8410fe4 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
@@ -210,7 +210,9 @@
                              TextDirection direction)
       : NGFragmentBuilder(std::move(style), writing_mode, direction),
         node_(node),
-        space_(space) {}
+        space_(space) {
+    layout_object_ = node.GetLayoutBox();
+  }
 
   void AddChildInternal(scoped_refptr<const NGPhysicalFragment>,
                         const LogicalOffset&);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc
index 0ca7aba3..2009cba4 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc
@@ -76,7 +76,8 @@
     // Outline of an element continuation or anonymous block continuation is
     // added when we iterate the continuation chain.
     // See NGPhysicalBoxFragment::AddSelfOutlineRects().
-    if (LayoutObject* child_layout_object = child->GetLayoutObject()) {
+    if (!child->IsLineBox()) {
+      LayoutObject* child_layout_object = child->GetLayoutObject();
       auto* child_layout_block_flow =
           DynamicTo<LayoutBlockFlow>(child_layout_object);
       if (child_layout_object->IsElementContinuation() ||
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
index 91d3260..14a71dd0 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -219,7 +219,7 @@
 NGPhysicalFragment::NGPhysicalFragment(NGFragmentBuilder* builder,
                                        NGFragmentType type,
                                        unsigned sub_type)
-    : layout_object_(builder->layout_object_),
+    : layout_object_(*builder->layout_object_),
       size_(ToPhysicalSize(builder->size_, builder->GetWritingMode())),
       break_token_(std::move(builder->break_token_)),
       type_(type),
@@ -227,7 +227,9 @@
       style_variant_((unsigned)builder->style_variant_),
       has_floating_descendants_(false),
       is_fieldset_container_(false),
-      is_legacy_layout_root_(false) {}
+      is_legacy_layout_root_(false) {
+  DCHECK(builder->layout_object_);
+}
 
 NGPhysicalFragment::NGPhysicalFragment(LayoutObject* layout_object,
                                        NGStyleVariant style_variant,
@@ -235,7 +237,7 @@
                                        NGFragmentType type,
                                        unsigned sub_type,
                                        scoped_refptr<NGBreakToken> break_token)
-    : layout_object_(layout_object),
+    : layout_object_(*layout_object),
       size_(size),
       break_token_(std::move(break_token)),
       type_(type),
@@ -243,7 +245,9 @@
       style_variant_((unsigned)style_variant),
       has_floating_descendants_(false),
       is_fieldset_container_(false),
-      is_legacy_layout_root_(false) {}
+      is_legacy_layout_root_(false) {
+  DCHECK(layout_object);
+}
 
 // Keep the implementation of the destructor here, to avoid dependencies on
 // ComputedStyle in the header file.
@@ -267,38 +271,34 @@
   }
 }
 
-const ComputedStyle& NGPhysicalFragment::Style() const {
-  if (auto* line_box = DynamicTo<NGPhysicalLineBoxFragment>(this))
-    return line_box->Style();
+const ComputedStyle& NGPhysicalFragment::SlowEffectiveStyle() const {
   switch (StyleVariant()) {
     case NGStyleVariant::kStandard:
-      DCHECK(GetLayoutObject());
-      return *GetLayoutObject()->Style();
+      return layout_object_.StyleRef();
     case NGStyleVariant::kFirstLine:
-      DCHECK(GetLayoutObject());
-      return *GetLayoutObject()->FirstLineStyle();
+      return layout_object_.FirstLineStyleRef();
     case NGStyleVariant::kEllipsis:
       DCHECK_EQ(Type(), kFragmentText);
       DCHECK_EQ(StyleVariant(), NGStyleVariant::kEllipsis);
-      DCHECK(GetLayoutObject());
       // The ellipsis is styled according to the line style.
       // https://drafts.csswg.org/css-ui/#ellipsing-details
       // Use first-line style if exists since most cases it is the first line.
       // TODO(kojii): Should determine if it's really in the first line.
-      if (LayoutObject* block = GetLayoutObject()->ContainingBlock())
+      DCHECK(layout_object_.IsInline());
+      if (LayoutObject* block = layout_object_.ContainingBlock())
         return block->FirstLineStyleRef();
-      return GetLayoutObject()->FirstLineStyleRef();
+      return layout_object_.FirstLineStyleRef();
   }
   NOTREACHED();
-  return *GetLayoutObject()->Style();
+  return layout_object_.StyleRef();
 }
 
 Node* NGPhysicalFragment::GetNode() const {
-  return layout_object_ ? layout_object_->GetNode() : nullptr;
+  return !IsLineBox() ? layout_object_.GetNode() : nullptr;
 }
 
 bool NGPhysicalFragment::HasLayer() const {
-  return layout_object_ && layout_object_->HasLayer();
+  return !IsLineBox() && layout_object_.HasLayer();
 }
 
 PaintLayer* NGPhysicalFragment::Layer() const {
@@ -307,7 +307,7 @@
 
   // If the underlying LayoutObject has a layer it's guaranteed to be a
   // LayoutBoxModelObject.
-  return static_cast<LayoutBoxModelObject*>(layout_object_)->Layer();
+  return static_cast<LayoutBoxModelObject&>(layout_object_).Layer();
 }
 
 bool NGPhysicalFragment::HasSelfPaintingLayer() const {
@@ -316,32 +316,32 @@
 
   // If the underlying LayoutObject has a layer it's guaranteed to be a
   // LayoutBoxModelObject.
-  return static_cast<LayoutBoxModelObject*>(layout_object_)
-      ->HasSelfPaintingLayer();
+  return static_cast<LayoutBoxModelObject&>(layout_object_)
+      .HasSelfPaintingLayer();
 }
 
 bool NGPhysicalFragment::HasOverflowClip() const {
-  return layout_object_ && layout_object_->HasOverflowClip();
+  return !IsLineBox() && layout_object_.HasOverflowClip();
 }
 
 bool NGPhysicalFragment::ShouldClipOverflow() const {
-  return layout_object_ && layout_object_->ShouldClipOverflow();
+  return !IsLineBox() && layout_object_.ShouldClipOverflow();
 }
 
 bool NGPhysicalFragment::IsBlockFlow() const {
-  return layout_object_ && layout_object_->IsLayoutBlockFlow();
+  return !IsLineBox() && layout_object_.IsLayoutBlockFlow();
 }
 
 bool NGPhysicalFragment::IsListMarker() const {
-  return layout_object_ && layout_object_->IsLayoutNGListMarker();
+  return !IsLineBox() && layout_object_.IsLayoutNGListMarker();
 }
 
 bool NGPhysicalFragment::IsPlacedByLayoutNG() const {
   // TODO(kojii): Move this to a flag for |LayoutNGBlockFlow::UpdateBlockLayout|
   // to set.
-  if (!layout_object_)
+  if (IsLineBox())
     return false;
-  const LayoutBlock* container = layout_object_->ContainingBlock();
+  const LayoutBlock* container = layout_object_.ContainingBlock();
   if (!container)
     return false;
   return container->IsLayoutNGMixin() || container->IsLayoutNGFlexibleBox();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
index c1e4e9f..ff1d011 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -163,7 +163,18 @@
   bool UsesFirstLineStyle() const {
     return StyleVariant() == NGStyleVariant::kFirstLine;
   }
-  const ComputedStyle& Style() const;
+
+  // Returns the style for this fragment.
+  //
+  // For a line box, this returns the style of the containing block. This mostly
+  // represents the style for the line box, except 1) |style.Direction()| maybe
+  // incorrect, use |BaseDirection()| instead, and 2) margin/border/padding,
+  // background etc. do not apply to the line box.
+  const ComputedStyle& Style() const {
+    return StyleVariant() == NGStyleVariant::kStandard
+               ? layout_object_.StyleRef()
+               : SlowEffectiveStyle();
+  }
   Node* GetNode() const;
 
   // Whether there is a PaintLayer associated with the fragment.
@@ -182,7 +193,13 @@
 
   // GetLayoutObject should only be used when necessary for compatibility
   // with LegacyLayout.
-  LayoutObject* GetLayoutObject() const { return layout_object_; }
+  //
+  // For a line box, |layout_object_| has its containing block but this function
+  // returns |nullptr| for the historical reasons. TODO(kojii): We may change
+  // this in future. Use |IsLineBox()| instead of testing this is |nullptr|.
+  LayoutObject* GetLayoutObject() const {
+    return !IsLineBox() ? &layout_object_ : nullptr;
+  }
 
   // Scrollable overflow. including contents, in the local coordinate.
   PhysicalRect ScrollableOverflow() const;
@@ -240,9 +257,11 @@
                      unsigned sub_type,
                      scoped_refptr<NGBreakToken> break_token = nullptr);
 
+  const ComputedStyle& SlowEffectiveStyle() const;
+
   const Vector<NGInlineItem>& InlineItemsOfContainingBlock() const;
 
-  LayoutObject* const layout_object_;
+  LayoutObject& layout_object_;
   const PhysicalSize size_;
   scoped_refptr<NGBreakToken> break_token_;
 
diff --git a/third_party/blink/renderer/core/layout/scroll_anchor.cc b/third_party/blink/renderer/core/layout/scroll_anchor.cc
index 73bf64f..9bea1dca 100644
--- a/third_party/blink/renderer/core/layout/scroll_anchor.cc
+++ b/third_party/blink/renderer/core/layout/scroll_anchor.cc
@@ -97,11 +97,9 @@
       local_bounds.ShiftMaxYEdgeTo(max_y);
     }
   } else if (layout_object->IsText()) {
-    LayoutRect bounds =
-        ToLayoutText(layout_object)->PhysicalLinesBoundingBox().ToLayoutRect();
-    if (UNLIKELY(layout_object->HasFlippedBlocksWritingMode()))
-      layout_object->ContainingBlock()->FlipForWritingMode(bounds);
-    local_bounds.Unite(bounds);
+    const auto* text = ToLayoutText(layout_object);
+    PhysicalRect bounds = text->PhysicalLinesBoundingBox();
+    local_bounds.Unite(text->FlipForWritingMode(bounds));
   } else {
     // Only LayoutBox and LayoutText are supported.
     NOTREACHED();
diff --git a/third_party/blink/renderer/core/layout/style_retain_scope.cc b/third_party/blink/renderer/core/layout/style_retain_scope.cc
new file mode 100644
index 0000000..f2b8506
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/style_retain_scope.cc
@@ -0,0 +1,38 @@
+// 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 "third_party/blink/renderer/core/layout/style_retain_scope.h"
+
+#include "third_party/blink/renderer/core/style/computed_style.h"
+#include "third_party/blink/renderer/platform/wtf/thread_specific.h"
+
+namespace blink {
+
+namespace {
+
+StyleRetainScope** CurrentPtr() {
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<StyleRetainScope*>, current,
+                                  ());
+  return &*current;
+}
+
+}  // namespace
+
+StyleRetainScope::StyleRetainScope() {
+  StyleRetainScope** current_ptr = CurrentPtr();
+  parent_ = *current_ptr;
+  *current_ptr = this;
+}
+
+StyleRetainScope::~StyleRetainScope() {
+  StyleRetainScope** current_ptr = CurrentPtr();
+  DCHECK_EQ(*current_ptr, this);
+  *current_ptr = parent_;
+}
+
+StyleRetainScope* StyleRetainScope::Current() {
+  return *CurrentPtr();
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/style_retain_scope.h b/third_party/blink/renderer/core/layout/style_retain_scope.h
new file mode 100644
index 0000000..6ff00c2c
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/style_retain_scope.h
@@ -0,0 +1,38 @@
+// 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 THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_STYLE_RETAIN_SCOPE_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_STYLE_RETAIN_SCOPE_H_
+
+#include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/platform/wtf/allocator.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
+
+namespace blink {
+
+class ComputedStyle;
+
+// This class retains references to temporary styles during layout.
+class CORE_EXPORT StyleRetainScope {
+  STACK_ALLOCATED();
+
+ public:
+  StyleRetainScope();
+  ~StyleRetainScope();
+
+  static StyleRetainScope* Current();
+
+  // Retain a reference to |style| for the lifetime of |this|.
+  void Retain(const ComputedStyle& style) {
+    styles_retained_during_layout_.push_back(&style);
+  }
+
+ private:
+  Vector<scoped_refptr<const ComputedStyle>> styles_retained_during_layout_;
+  StyleRetainScope* parent_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_STYLE_RETAIN_SCOPE_H_
diff --git a/third_party/blink/renderer/core/layout/style_retain_scope_test.cc b/third_party/blink/renderer/core/layout/style_retain_scope_test.cc
new file mode 100644
index 0000000..fc564545
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/style_retain_scope_test.cc
@@ -0,0 +1,40 @@
+// 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 "third_party/blink/renderer/core/layout/style_retain_scope.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/core/style/computed_style.h"
+#include "third_party/blink/renderer/platform/wtf/thread_specific.h"
+
+namespace blink {
+
+TEST(StyleRetainScopeTest, Current) {
+  EXPECT_EQ(StyleRetainScope::Current(), nullptr);
+  {
+    StyleRetainScope scope;
+    EXPECT_EQ(StyleRetainScope::Current(), &scope);
+    {
+      StyleRetainScope scope2;
+      EXPECT_EQ(StyleRetainScope::Current(), &scope2);
+    }
+    EXPECT_EQ(StyleRetainScope::Current(), &scope);
+  }
+  EXPECT_EQ(StyleRetainScope::Current(), nullptr);
+}
+
+TEST(StyleRetainScopeTest, Retain) {
+  scoped_refptr<const ComputedStyle> style = ComputedStyle::Create();
+  EXPECT_TRUE(style->HasOneRef());
+  {
+    StyleRetainScope scope;
+    scope.Retain(*style);
+
+    EXPECT_FALSE(style->HasOneRef());
+    EXPECT_TRUE(style->HasAtLeastOneRef());
+  }
+  EXPECT_TRUE(style->HasOneRef());
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/text_autosizer.cc b/third_party/blink/renderer/core/layout/text_autosizer.cc
index ad780afd..87b231a 100644
--- a/third_party/blink/renderer/core/layout/text_autosizer.cc
+++ b/third_party/blink/renderer/core/layout/text_autosizer.cc
@@ -53,6 +53,7 @@
 #include "third_party/blink/renderer/core/layout/layout_view.h"
 #include "third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_block_node.h"
+#include "third_party/blink/renderer/core/layout/style_retain_scope.h"
 #include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/platform/geometry/int_rect.h"
@@ -397,7 +398,6 @@
   if (block == first_block_to_begin_layout_) {
     first_block_to_begin_layout_ = nullptr;
     cluster_stack_.clear();
-    styles_retained_during_layout_.clear();
 #if DCHECK_IS_ON()
     blocks_that_have_begun_layout_.clear();
 #endif
@@ -1195,7 +1195,10 @@
       // Don't free current_style until the end of the layout pass. This allows
       // other parts of the system to safely hold raw ComputedStyle* pointers
       // during layout, e.g. BreakingContext::current_style_.
-      styles_retained_during_layout_.push_back(&current_style);
+      if (auto* scope = StyleRetainScope::Current())
+        scope->Retain(current_style);
+      else
+        DCHECK(false);
 
       layout_object->SetModifiedStyleOutsideStyleRecalc(
           std::move(style), LayoutObject::ApplyStyleChanges::kNo);
diff --git a/third_party/blink/renderer/core/layout/text_autosizer.h b/third_party/blink/renderer/core/layout/text_autosizer.h
index e1fad70..b4127ab 100644
--- a/third_party/blink/renderer/core/layout/text_autosizer.h
+++ b/third_party/blink/renderer/core/layout/text_autosizer.h
@@ -42,7 +42,6 @@
 
 namespace blink {
 
-class ComputedStyle;
 class Document;
 class IntSize;
 class LayoutBlock;
@@ -369,7 +368,6 @@
   // Clusters are created and destroyed during layout
   ClusterStack cluster_stack_;
   FingerprintMapper fingerprint_mapper_;
-  Vector<scoped_refptr<const ComputedStyle>> styles_retained_during_layout_;
   // FIXME: All frames should share the same m_pageInfo instance.
   PageInfo page_info_;
   bool update_page_info_deferred_;
diff --git a/third_party/blink/renderer/core/paint/README.md b/third_party/blink/renderer/core/paint/README.md
index ba0e739..fdcc1c66 100644
--- a/third_party/blink/renderer/core/paint/README.md
+++ b/third_party/blink/renderer/core/paint/README.md
@@ -174,6 +174,10 @@
 much of the new PaintArtifactCompositor logic (e.g., converting blink property
 trees to cc property trees) without changing how compositing decisions are made.
 
+[Debugging blink objects](https://docs.google.com/document/d/1vgQY11pxRQUDAufxSsc2xKyQCKGPftZ5wZnjY2El4w8/view)
+has information about dumping the paint and compositing datastructures for
+debugging.
+
 
 ### Current compositing algorithm (CompositeBeforePaint)
 
@@ -305,6 +309,9 @@
   | to compositor
   v
 ```
+[Debugging blink objects](https://docs.google.com/document/d/1vgQY11pxRQUDAufxSsc2xKyQCKGPftZ5wZnjY2El4w8/view)
+has information about dumping these paint and compositing datastructures for
+debugging.
 
 ### New compositing algorithm (CompositeAfterPaint)
 
@@ -363,6 +370,9 @@
   | to compositor
   v
 ```
+[Debugging blink objects](https://docs.google.com/document/d/1vgQY11pxRQUDAufxSsc2xKyQCKGPftZ5wZnjY2El4w8/view)
+has information about dumping these paint and compositing datastructures for
+debugging.
 
 ### Comparison of the current and new compositing algorithms
 
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
index ed51cacfd..eb6c960 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
@@ -379,12 +379,17 @@
 
     if (children_are_inline) {
       DCHECK(!child_fragment->IsOutOfFlowPositioned());
-      if (!child_fragment->IsFloating() && !child_fragment->IsListMarker()) {
-        if (LayoutObject* layout_object = child_fragment->GetLayoutObject())
-          child->AssociateWithLayoutObject(layout_object, last_fragment_map);
-
+      if (child_fragment->IsText() || child_fragment->IsInlineBox() ||
+          child_fragment->IsAtomicInline()) {
+        child->AssociateWithLayoutObject(child_fragment->GetLayoutObject(),
+                                         last_fragment_map);
         child->inline_offset_to_container_box_ =
             inline_offset_to_container_box + child_fragment.Offset();
+      } else if (child_fragment->IsLineBox()) {
+        child->inline_offset_to_container_box_ =
+            inline_offset_to_container_box + child_fragment.Offset();
+      } else {
+        DCHECK(child_fragment->IsFloating() || child_fragment->IsListMarker());
       }
 
       if (populate_children) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index bc173243..bc1d928 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1834,7 +1834,7 @@
     if (fallback) {
       GetLayoutObject().UpdateHitTestResult(
           result, ToLayoutView(GetLayoutObject())
-                      .FlipForWritingMode(hit_test_location.Point()));
+                      .DeprecatedFlipForWritingMode(hit_test_location.Point()));
       inside_layer = this;
 
       // Don't cache this result since it really wasn't a true hit.
@@ -2570,8 +2570,7 @@
     rect = ToLayoutBox(GetLayoutObject()).PhysicalVisualOverflowRect();
   } else {
     LayoutRect layout_rect = GetLayoutObject().VisualOverflowRect();
-    GetLayoutObject().ContainingBlock()->FlipForWritingMode(layout_rect);
-    rect = PhysicalRect(layout_rect);
+    rect = GetLayoutObject().FlipForWritingMode(layout_rect);
   }
 
   if (GetLayoutObject().IsEffectiveRootScroller() || IsRootLayer()) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
index 4721c9b..e2df705 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -859,7 +859,7 @@
 
 void PaintLayerScrollableArea::UpdateScrollDimensions() {
   LayoutRect new_overflow_rect = GetLayoutBox()->LayoutOverflowRect();
-  GetLayoutBox()->FlipForWritingMode(new_overflow_rect);
+  GetLayoutBox()->DeprecatedFlipForWritingMode(new_overflow_rect);
 
   // The layout viewport can be larger than the document's layout overflow when
   // top controls are hidden.  Expand the overflow here to ensure that our
diff --git a/third_party/blink/renderer/core/probe/core_probes.pidl b/third_party/blink/renderer/core/probe/core_probes.pidl
index 306849e..f170f74 100644
--- a/third_party/blink/renderer/core/probe/core_probes.pidl
+++ b/third_party/blink/renderer/core/probe/core_probes.pidl
@@ -57,7 +57,6 @@
   class FontCustomPlatformData;
   class FontFace;
   class HTMLDocumentParser;
-  class WorkerInspectorProxy;
   class XMLHttpRequest;
 
   void DidClearDocumentOfWindowObject([Keep] LocalFrame*);
diff --git a/third_party/blink/renderer/core/scheduler/frame_throttling_test.cc b/third_party/blink/renderer/core/scheduler/frame_throttling_test.cc
index a85f62742..f1e7866f 100644
--- a/third_party/blink/renderer/core/scheduler/frame_throttling_test.cc
+++ b/third_party/blink/renderer/core/scheduler/frame_throttling_test.cc
@@ -1434,8 +1434,7 @@
   ASSERT_NE(nullptr, paint_controller);
   // We no longer collect the graphics layers of the iframe and the composited
   // content.
-  EXPECT_EQ(display_item_count - 2,
-            paint_controller->GetDisplayItemList().size());
+  EXPECT_GT(display_item_count, paint_controller->GetDisplayItemList().size());
 
   // Move the child back to the visible viewport.
   frame_element->setAttribute(kStyleAttr,
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc
index 4bab4aa..b791706 100644
--- a/third_party/blink/renderer/core/testing/internals.cc
+++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -123,6 +123,7 @@
 #include "third_party/blink/renderer/core/page/scrolling/scroll_state.h"
 #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h"
 #include "third_party/blink/renderer/core/page/spatial_navigation_controller.h"
+#include "third_party/blink/renderer/core/page/validation_message_client.h"
 #include "third_party/blink/renderer/core/page/viewport_description.h"
 #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h"
 #include "third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_as_text.h"
@@ -813,8 +814,10 @@
 
 bool Internals::isValidationMessageVisible(Element* element) {
   DCHECK(element);
-  if (auto* control = ListedElement::From(*element))
-    return control->IsValidationMessageVisible();
+  if (auto* page = element->GetDocument().GetPage()) {
+    return page->GetValidationMessageClient().IsValidationMessageVisible(
+        *element);
+  }
   return false;
 }
 
diff --git a/third_party/blink/renderer/core/timing/performance_mark.cc b/third_party/blink/renderer/core/timing/performance_mark.cc
index be3675a9..a1733a82 100644
--- a/third_party/blink/renderer/core/timing/performance_mark.cc
+++ b/third_party/blink/renderer/core/timing/performance_mark.cc
@@ -30,13 +30,6 @@
 // static
 PerformanceMark* PerformanceMark::Create(ScriptState* script_state,
                                          const AtomicString& mark_name,
-                                         ExceptionState& exception_state) {
-  return Create(script_state, mark_name, nullptr, exception_state);
-}
-
-// static
-PerformanceMark* PerformanceMark::Create(ScriptState* script_state,
-                                         const AtomicString& mark_name,
                                          PerformanceMarkOptions* mark_options,
                                          ExceptionState& exception_state) {
   LocalDOMWindow* window = LocalDOMWindow::From(script_state);
diff --git a/third_party/blink/renderer/core/timing/performance_mark.h b/third_party/blink/renderer/core/timing/performance_mark.h
index f4512df..da82967 100644
--- a/third_party/blink/renderer/core/timing/performance_mark.h
+++ b/third_party/blink/renderer/core/timing/performance_mark.h
@@ -51,11 +51,6 @@
   // This method is required by the constructor defined in performance_mark.idl.
   static PerformanceMark* Create(ScriptState*,
                                  const AtomicString& mark_name,
-                                 ExceptionState&);
-
-  // This method is required by the constructor defined in performance_mark.idl.
-  static PerformanceMark* Create(ScriptState*,
-                                 const AtomicString& mark_name,
                                  PerformanceMarkOptions*,
                                  ExceptionState&);
 
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
index 7431ad9..1666ed9 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
@@ -138,8 +138,11 @@
   InitContentSecurityPolicyFromVector(OutsideContentSecurityPolicyHeaders());
   BindContentSecurityPolicyToExecutionContext();
 
+  // This should be called after OriginTrialContext::AddTokens() to install
+  // origin trial features in JavaScript's global object.
   // DedicatedWorkerGlobalScope inherits the outside's OriginTrialTokens in the
   // constructor instead of the response origin trial tokens.
+  ScriptController()->PrepareForEvaluation();
 }
 
 // https://html.spec.whatwg.org/C/#worker-processing-model
diff --git a/third_party/blink/renderer/core/workers/experimental/thread_pool_thread.cc b/third_party/blink/renderer/core/workers/experimental/thread_pool_thread.cc
index 61cb937..a78a82e93 100644
--- a/third_party/blink/renderer/core/workers/experimental/thread_pool_thread.cc
+++ b/third_party/blink/renderer/core/workers/experimental/thread_pool_thread.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/workers/experimental/thread_pool_thread.h"
 
+#include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
 #include "third_party/blink/renderer/core/workers/experimental/task_worklet_global_scope.h"
@@ -52,6 +53,10 @@
     BindContentSecurityPolicyToExecutionContext();
 
     OriginTrialContext::AddTokens(this, response_origin_trial_tokens);
+
+    // This should be called after OriginTrialContext::AddTokens() to install
+    // origin trial features in JavaScript's global object.
+    ScriptController()->PrepareForEvaluation();
   }
   void FetchAndRunClassicScript(
       const KURL& script_url,
diff --git a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
index 13acda45..9e47febc 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
@@ -34,6 +34,7 @@
 #include "base/feature_list.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/bindings/core/v8/source_location.h"
+#include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h"
 #include "third_party/blink/renderer/core/events/message_event.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
@@ -126,6 +127,10 @@
   BindContentSecurityPolicyToExecutionContext();
 
   OriginTrialContext::AddTokens(this, response_origin_trial_tokens);
+
+  // This should be called after OriginTrialContext::AddTokens() to install
+  // origin trial features in JavaScript's global object.
+  ScriptController()->PrepareForEvaluation();
 }
 
 // https://html.spec.whatwg.org/C/#worker-processing-model
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc
index b16111af..ea2197e 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -411,6 +411,7 @@
     base::TimeTicks time_origin)
     : WorkerOrWorkletGlobalScope(
           thread->GetIsolate(),
+          creation_params->off_main_thread_fetch_option,
           creation_params->global_scope_name,
           creation_params->parent_devtools_token,
           creation_params->v8_cache_options,
diff --git a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
index fbff9c2..b5c7400b 100644
--- a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
@@ -166,6 +166,7 @@
 
 WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope(
     v8::Isolate* isolate,
+    OffMainThreadWorkerScriptFetchOption off_main_thread_fetch_option,
     const String& name,
     const base::UnguessableToken& parent_devtools_token,
     V8CacheOptions v8_cache_options,
@@ -173,6 +174,7 @@
     scoped_refptr<WebWorkerFetchContext> web_worker_fetch_context,
     WorkerReportingProxy& reporting_proxy)
     : ExecutionContext(isolate, Agent::CreateForWorkerOrWorklet(isolate)),
+      off_main_thread_fetch_option_(off_main_thread_fetch_option),
       name_(name),
       parent_devtools_token_(parent_devtools_token),
       worker_clients_(worker_clients),
diff --git a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h
index c9feb18..f401caf7 100644
--- a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h
+++ b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 #include "third_party/blink/renderer/core/frame/web_feature_forward.h"
 #include "third_party/blink/renderer/core/script/modulator.h"
+#include "third_party/blink/renderer/core/workers/global_scope_creation_params.h"
 #include "third_party/blink/renderer/core/workers/worker_clients.h"
 #include "third_party/blink/renderer/core/workers/worker_navigator.h"
 #include "third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h"
@@ -45,6 +46,7 @@
 
   WorkerOrWorkletGlobalScope(
       v8::Isolate*,
+      OffMainThreadWorkerScriptFetchOption,
       const String& name,
       const base::UnguessableToken& parent_devtools_token,
       V8CacheOptions,
@@ -135,6 +137,11 @@
   scheduler::WorkerScheduler* GetScheduler() override;
   scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(TaskType) override;
 
+  OffMainThreadWorkerScriptFetchOption GetOffMainThreadWorkerScriptFetchOption()
+      const {
+    return off_main_thread_fetch_option_;
+  }
+
  protected:
   // Sets outside's CSP used for off-main-thread top-level worker script
   // fetch.
@@ -167,6 +174,7 @@
 
   bool web_fetch_context_initialized_ = false;
 
+  const OffMainThreadWorkerScriptFetchOption off_main_thread_fetch_option_;
   const String name_;
   const base::UnguessableToken parent_devtools_token_;
 
diff --git a/third_party/blink/renderer/core/workers/worker_thread.cc b/third_party/blink/renderer/core/workers/worker_thread.cc
index 70358532..6a2463a 100644
--- a/third_party/blink/renderer/core/workers/worker_thread.cc
+++ b/third_party/blink/renderer/core/workers/worker_thread.cc
@@ -164,9 +164,9 @@
   base::WaitableEvent waitable_event;
   GetWorkerBackingThread().BackingThread().PostTask(
       FROM_HERE,
-      CrossThreadBind(&WorkerThread::InitializeSchedulerOnWorkerThread,
-                      CrossThreadUnretained(this),
-                      CrossThreadUnretained(&waitable_event)));
+      CrossThreadBindOnce(&WorkerThread::InitializeSchedulerOnWorkerThread,
+                          CrossThreadUnretained(this),
+                          CrossThreadUnretained(&waitable_event)));
   waitable_event.Wait();
 
   inspector_task_runner_ =
@@ -174,7 +174,7 @@
 
   GetWorkerBackingThread().BackingThread().PostTask(
       FROM_HERE,
-      CrossThreadBind(
+      CrossThreadBindOnce(
           &WorkerThread::InitializeOnWorkerThread, CrossThreadUnretained(this),
           WTF::Passed(std::move(global_scope_creation_params)),
           thread_startup_data, WTF::Passed(std::move(devtools_params))));
@@ -239,8 +239,8 @@
     ResumeOnWorkerThread();
   } else {
     GetWorkerBackingThread().BackingThread().PostTask(
-        FROM_HERE, CrossThreadBind(&WorkerThread::ResumeOnWorkerThread,
-                                   CrossThreadUnretained(this)));
+        FROM_HERE, CrossThreadBindOnce(&WorkerThread::ResumeOnWorkerThread,
+                                       CrossThreadUnretained(this)));
   }
 }
 
@@ -262,11 +262,12 @@
 
   GetWorkerBackingThread().BackingThread().PostTask(
       FROM_HERE,
-      CrossThreadBind(&WorkerThread::PrepareForShutdownOnWorkerThread,
-                      CrossThreadUnretained(this)));
+      CrossThreadBindOnce(&WorkerThread::PrepareForShutdownOnWorkerThread,
+                          CrossThreadUnretained(this)));
   GetWorkerBackingThread().BackingThread().PostTask(
-      FROM_HERE, CrossThreadBind(&WorkerThread::PerformShutdownOnWorkerThread,
-                                 CrossThreadUnretained(this)));
+      FROM_HERE,
+      CrossThreadBindOnce(&WorkerThread::PerformShutdownOnWorkerThread,
+                          CrossThreadUnretained(this)));
 }
 
 void WorkerThread::TerminateForTesting() {
@@ -748,7 +749,7 @@
                                 interrupt_data);
     }
     GetWorkerBackingThread().BackingThread().PostTask(
-        FROM_HERE, CrossThreadBind(
+        FROM_HERE, CrossThreadBindOnce(
                        &WorkerThread::PauseOrFreezeInsidePostTaskOnWorkerThread,
                        CrossThreadUnretained(interrupt_data)));
   }
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test.cc b/third_party/blink/renderer/core/workers/worker_thread_test.cc
index e33f106..d64e4318 100644
--- a/third_party/blink/renderer/core/workers/worker_thread_test.cc
+++ b/third_party/blink/renderer/core/workers/worker_thread_test.cc
@@ -503,10 +503,11 @@
 
   base::WaitableEvent waitable_event;
   worker_thread_->GetWorkerBackingThread().BackingThread().PostTask(
-      FROM_HERE, CrossThreadBind(&VerifyParentAndChildAreTerminated,
-                                 CrossThreadUnretained(worker_thread_.get()),
-                                 CrossThreadUnretained(&nested_worker_helper),
-                                 CrossThreadUnretained(&waitable_event)));
+      FROM_HERE,
+      CrossThreadBindOnce(&VerifyParentAndChildAreTerminated,
+                          CrossThreadUnretained(worker_thread_.get()),
+                          CrossThreadUnretained(&nested_worker_helper),
+                          CrossThreadUnretained(&waitable_event)));
   waitable_event.Wait();
 }
 
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
index 93afffd4..c363d83 100644
--- a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
+++ b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
@@ -14,6 +14,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/source_location.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_cache_options.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h"
+#include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
@@ -73,6 +74,10 @@
     BindContentSecurityPolicyToExecutionContext();
 
     OriginTrialContext::AddTokens(this, response_origin_trial_tokens);
+
+    // This should be called after OriginTrialContext::AddTokens() to install
+    // origin trial features in JavaScript's global object.
+    ScriptController()->PrepareForEvaluation();
   }
   void FetchAndRunClassicScript(
       const KURL& script_url,
@@ -139,8 +144,9 @@
   void WaitForInit() {
     base::WaitableEvent completion_event;
     GetWorkerBackingThread().BackingThread().PostTask(
-        FROM_HERE, CrossThreadBind(&base::WaitableEvent::Signal,
-                                   CrossThreadUnretained(&completion_event)));
+        FROM_HERE,
+        CrossThreadBindOnce(&base::WaitableEvent::Signal,
+                            CrossThreadUnretained(&completion_event)));
     completion_event.Wait();
   }
 
diff --git a/third_party/blink/renderer/core/workers/worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worklet_global_scope.cc
index b0cc318..9ce4921 100644
--- a/third_party/blink/renderer/core/workers/worklet_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worklet_global_scope.cc
@@ -62,6 +62,7 @@
     WorkerThread* worker_thread)
     : WorkerOrWorkletGlobalScope(
           isolate,
+          creation_params->off_main_thread_fetch_option,
           creation_params->global_scope_name,
           creation_params->parent_devtools_token,
           creation_params->v8_cache_options,
diff --git a/third_party/blink/renderer/core/workers/worklet_thread_holder.h b/third_party/blink/renderer/core/workers/worklet_thread_holder.h
index dceb76de..124825a8 100644
--- a/third_party/blink/renderer/core/workers/worklet_thread_holder.h
+++ b/third_party/blink/renderer/core/workers/worklet_thread_holder.h
@@ -59,8 +59,8 @@
     thread_ = std::move(backing_thread);
     thread_->BackingThread().PostTask(
         FROM_HERE,
-        CrossThreadBind(&WorkletThreadHolder::InitializeOnWorkletThread,
-                        CrossThreadUnretained(this)));
+        CrossThreadBindOnce(&WorkletThreadHolder::InitializeOnWorkletThread,
+                            CrossThreadUnretained(this)));
   }
 
   void InitializeOnWorkletThread() {
@@ -74,9 +74,9 @@
     base::WaitableEvent waitable_event;
     thread_->BackingThread().PostTask(
         FROM_HERE,
-        CrossThreadBind(&WorkletThreadHolder::ShutdownOnWorkletThread,
-                        CrossThreadUnretained(this),
-                        CrossThreadUnretained(&waitable_event)));
+        CrossThreadBindOnce(&WorkletThreadHolder::ShutdownOnWorkletThread,
+                            CrossThreadUnretained(this),
+                            CrossThreadUnretained(&waitable_event)));
     waitable_event.Wait();
   }
 
diff --git a/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css b/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css
index e4630fba..17ca57e 100644
--- a/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css
+++ b/third_party/blink/renderer/devtools/front_end/color_picker/spectrum.css
@@ -622,3 +622,4 @@
 
 button.background-color-picker:hover [is=ui-icon].largeicon-eyedropper.icon-mask {
     background-color: #333;
+}
diff --git a/third_party/blink/renderer/devtools/front_end/emulation/DevicesSettingsTab.js b/third_party/blink/renderer/devtools/front_end/emulation/DevicesSettingsTab.js
index c25cf538..0b63f7d 100644
--- a/third_party/blink/renderer/devtools/front_end/emulation/DevicesSettingsTab.js
+++ b/third_party/blink/renderer/devtools/front_end/emulation/DevicesSettingsTab.js
@@ -13,7 +13,7 @@
     this.registerRequiredCSS('emulation/devicesSettingsTab.css');
 
     const header = this.element.createChild('header');
-    header.createChild('h1').createTextChild(ls`Emulated Devices`);
+    header.createChild('h3').createTextChild(Common.UIString('Emulated Devices'));
     this.containerElement = this.element.createChild('div', 'settings-container-wrapper')
                                 .createChild('div', 'settings-tab settings-content settings-container');
 
diff --git a/third_party/blink/renderer/devtools/front_end/main/Main.js b/third_party/blink/renderer/devtools/front_end/main/Main.js
index 57a7bcc..6b0399f 100644
--- a/third_party/blink/renderer/devtools/front_end/main/Main.js
+++ b/third_party/blink/renderer/devtools/front_end/main/Main.js
@@ -109,6 +109,8 @@
     Runtime.experiments.register('applyCustomStylesheet', 'Allow custom UI themes');
     Runtime.experiments.register('sourcesPrettyPrint', 'Automatically pretty print in the Sources Panel');
     Runtime.experiments.register('backgroundServices', 'Background web platform feature events', true);
+    Runtime.experiments.register('backgroundServicesNotifications', 'Background services section for Notifications');
+    Runtime.experiments.register('backgroundServicesPushMessaging', 'Background services section for Push Messaging');
     Runtime.experiments.register('blackboxJSFramesOnTimeline', 'Blackbox JavaScript frames on Timeline', true);
     Runtime.experiments.register('emptySourceMapAutoStepping', 'Empty sourcemap auto-stepping');
     Runtime.experiments.register('inputEventsOnTimelineOverview', 'Input events on Timeline overview', true);
diff --git a/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js b/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
index 40faebd..426e7833 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
+++ b/third_party/blink/renderer/devtools/front_end/resources/ApplicationPanelSidebar.js
@@ -113,6 +113,17 @@
       this.backgroundSyncTreeElement =
           new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.BackgroundSync);
       backgroundServiceTreeElement.appendChild(this.backgroundSyncTreeElement);
+
+      if (Runtime.experiments.isEnabled('backgroundServicesNotifications')) {
+        this.notificationsTreeElement =
+            new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.Notifications);
+        backgroundServiceTreeElement.appendChild(this.notificationsTreeElement);
+      }
+      if (Runtime.experiments.isEnabled('backgroundServicesPushMessaging')) {
+        this.pushMessagingTreeElement =
+            new Resources.BackgroundServiceTreeElement(panel, Protocol.BackgroundService.ServiceName.PushMessaging);
+        backgroundServiceTreeElement.appendChild(this.pushMessagingTreeElement);
+      }
     }
 
     this._resourcesSection = new Resources.ResourcesSection(panel, this._addSidebarSection(Common.UIString('Frames')));
@@ -232,6 +243,10 @@
     if (Runtime.experiments.isEnabled('backgroundServices')) {
       this.backgroundFetchTreeElement._initialize(backgroundServiceModel);
       this.backgroundSyncTreeElement._initialize(backgroundServiceModel);
+      if (Runtime.experiments.isEnabled('backgroundServicesNotifications'))
+        this.notificationsTreeElement._initialize(backgroundServiceModel);
+      if (Runtime.experiments.isEnabled('backgroundServicesPushMessaging'))
+        this.pushMessagingTreeElement._initialize(backgroundServiceModel);
     }
   }
 
@@ -743,6 +758,10 @@
         return 'mediumicon-fetch';
       case Protocol.BackgroundService.ServiceName.BackgroundSync:
         return 'mediumicon-sync';
+      case Protocol.BackgroundService.ServiceName.PushMessaging:
+        return 'mediumicon-cloud';
+      case Protocol.BackgroundService.ServiceName.Notifications:
+        return 'mediumicon-bell';
       default:
         console.error(`Service ${this._serviceName} does not have a dedicated icon`);
         return 'mediumicon-table';
diff --git a/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js b/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
index a92d8b1d..7a65f4b6 100644
--- a/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
+++ b/third_party/blink/renderer/devtools/front_end/resources/BackgroundServiceView.js
@@ -13,6 +13,10 @@
         return ls`Background Fetch`;
       case Protocol.BackgroundService.ServiceName.BackgroundSync:
         return ls`Background Sync`;
+      case Protocol.BackgroundService.ServiceName.PushMessaging:
+        return ls`Push Messaging`;
+      case Protocol.BackgroundService.ServiceName.Notifications:
+        return ls`Notifications`;
       default:
         return '';
     }
diff --git a/third_party/blink/renderer/devtools/front_end/settings/SettingsScreen.js b/third_party/blink/renderer/devtools/front_end/settings/SettingsScreen.js
index f07567f..2f8d2c9 100644
--- a/third_party/blink/renderer/devtools/front_end/settings/SettingsScreen.js
+++ b/third_party/blink/renderer/devtools/front_end/settings/SettingsScreen.js
@@ -117,7 +117,7 @@
     if (id)
       this.element.id = id;
     const header = this.element.createChild('header');
-    header.createChild('h1').createTextChild(name);
+    header.createChild('h3').createTextChild(name);
     this.containerElement = this.element.createChild('div', 'settings-container-wrapper')
                                 .createChild('div', 'settings-tab settings-content settings-container');
   }
@@ -128,15 +128,8 @@
    */
   _appendSection(name) {
     const block = this.containerElement.createChild('div', 'settings-block');
-    if (name) {
-      UI.ARIAUtils.markAsGroup(block);
-      const title = block.createChild('div', 'settings-section-title');
-      title.textContent = name;
-      UI.ARIAUtils.markAsHeading(title, 2);
-      const sectionTitleId = UI.ARIAUtils.nextId('settings-section-title');
-      title.setAttribute('id', sectionTitleId);
-      block.setAttribute('aria-labelledby', sectionTitleId);
-    }
+    if (name)
+      block.createChild('div', 'settings-section-title').textContent = name;
     return block;
   }
 };
diff --git a/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css b/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css
index 32ba7c64..9989041 100644
--- a/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css
+++ b/third_party/blink/renderer/devtools/front_end/settings/settingsScreen.css
@@ -183,7 +183,7 @@
     margin-left: 0;
 }
 
-.settings-tab-container header > h1 {
+.settings-tab-container header > h3 {
     font-size: 18px;
     font-weight: normal;
     margin: 0;
diff --git a/third_party/blink/renderer/devtools/front_end/ui/SettingsUI.js b/third_party/blink/renderer/devtools/front_end/ui/SettingsUI.js
index 7e09206..8a78ab7 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/SettingsUI.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/SettingsUI.js
@@ -61,12 +61,8 @@
  */
 UI.SettingsUI.createSettingSelect = function(name, options, setting) {
   const p = createElement('p');
-  const label = p.createChild('label');
-  label.textContent = name;
+  p.createChild('label').textContent = name;
   const select = p.createChild('select', 'chrome-select');
-  const selectId = UI.ARIAUtils.nextId('chrome-select');
-  select.setAttribute('id', selectId);
-  label.setAttribute('for', selectId);
 
   for (let i = 0; i < options.length; ++i) {
     // The "raw" flag indicates text is non-i18n-izable.
@@ -121,11 +117,7 @@
 UI.SettingsUI.createCustomSetting = function(name, element) {
   const p = createElement('p');
   const fieldsetElement = p.createChild('fieldset');
-  const label = fieldsetElement.createChild('label');
-  label.textContent = name;
-  const elementId = UI.ARIAUtils.nextId('setting-element');
-  element.setAttribute('id', elementId);
-  label.setAttribute('for', elementId);
+  fieldsetElement.createChild('label').textContent = name;
   fieldsetElement.appendChild(element);
   return p;
 };
diff --git a/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js b/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js
index fb675543..9bcd4f0 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/ShortcutsScreen.js
@@ -225,7 +225,7 @@
     const widget = new UI.Widget();
 
     widget.element.className = 'settings-tab-container';  // Override
-    widget.element.createChild('header').createChild('h1').createTextChild(ls`Shortcuts`);
+    widget.element.createChild('header').createChild('h3').createTextChild(Common.UIString('Shortcuts'));
     const scrollPane = widget.element.createChild('div', 'settings-container-wrapper');
     const container = scrollPane.createChild('div');
     container.className = 'settings-content settings-container';
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index ba1f02f45..d5e13e5 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -324,6 +324,7 @@
     "media_controls/media_controls_orientation_lock_delegate_test.cc",
     "media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc",
     "mediacapturefromelement/canvas_capture_handler_unittest.cc",
+    "mediacapturefromelement/html_video_element_capturer_source_unittest.cc",
     "mediastream/media_constraints_test.cc",
     "mediastream/media_devices_test.cc",
     "mediastream/media_stream_video_capturer_source_test.cc",
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
index 4eb08cc..0f19dc56 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -2724,7 +2724,7 @@
            layout_text->FirstAbstractInlineTextBox();
        box.get(); box = box->NextInlineTextBox()) {
     AXObject* ax_object = AXObjectCache().GetOrCreate(box.get());
-    if (!ax_object->AccessibilityIsIgnored())
+    if (ax_object->AccessibilityIsIncludedInTree())
       children_.push_back(ax_object);
   }
 }
@@ -3448,7 +3448,7 @@
       // Find out where the last layout sibling is located within m_children.
       if (AXObject* child_object =
               AXObjectCache().Get(child.GetLayoutObject())) {
-        if (child_object->AccessibilityIsIgnored()) {
+        if (!child_object->AccessibilityIsIncludedInTree()) {
           const auto& children = child_object->Children();
           child_object = children.size() ? children.back().Get() : nullptr;
         }
@@ -3487,7 +3487,7 @@
       AXImageMapLink* area_object = ToAXImageMapLink(obj);
       area_object->SetParent(this);
       DCHECK_NE(area_object->AXObjectID(), 0U);
-      if (!area_object->AccessibilityIsIgnored())
+      if (area_object->AccessibilityIsIncludedInTree())
         children_.push_back(area_object);
       else
         AXObjectCache().Remove(area_object->AXObjectID());
@@ -3529,7 +3529,7 @@
 
   root->SetParent(this);
 
-  if (root->AccessibilityIsIgnored()) {
+  if (!root->AccessibilityIsIncludedInTree()) {
     for (const auto& child : root->Children())
       children_.push_back(child);
   } else {
@@ -3550,7 +3550,7 @@
       if (HTMLTableCaptionElement* caption =
               ToHTMLTableElement(table_node)->caption()) {
         AXObject* caption_object = ax_cache.GetOrCreate(caption);
-        if (caption_object && !caption_object->AccessibilityIsIgnored())
+        if (caption_object && caption_object->AccessibilityIsIncludedInTree())
           children_.push_front(caption_object);
       }
     }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_menu_list.cc b/third_party/blink/renderer/modules/accessibility/ax_menu_list.cc
index cdd8977..caaeda8 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_menu_list.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_menu_list.cc
@@ -78,7 +78,7 @@
     return;
 
   ToAXMockObject(popup)->SetParent(this);
-  if (popup->AccessibilityIsIgnored()) {
+  if (!popup->AccessibilityIsIncludedInTree()) {
     cache.Remove(popup->AXObjectID());
     return;
   }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index b52ef87..1e54ed4 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -1486,7 +1486,7 @@
     for (AXObject* child : parent->Children()) {
       DCHECK(child);
       if (child->RoleValue() == ax::mojom::Role::kRadioButton &&
-          !child->AccessibilityIsIgnored()) {
+          child->AccessibilityIsIncludedInTree()) {
         radio_buttons.push_back(child);
       }
     }
@@ -2364,7 +2364,7 @@
   // getting children, ensure data is not stale.
   child->ClearChildren();
 
-  if (child->AccessibilityIsIgnored()) {
+  if (!child->AccessibilityIsIncludedInTree()) {
     const auto& children = child->Children();
     wtf_size_t length = children.size();
     for (wtf_size_t i = 0; i < length; ++i)
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index e3f3d9c..20f30f97 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -888,6 +888,12 @@
   return cached_is_ignored_;
 }
 
+// TODO(janewman) AccessibilityIsIncludedInTree should be true for all nodes
+// that should be included in the tree, ignored or not.
+bool AXObject::AccessibilityIsIncludedInTree() const {
+  return !AccessibilityIsIgnored();
+}
+
 void AXObject::UpdateCachedAttributeValuesIfNeeded() const {
   if (IsDetached())
     return;
@@ -904,7 +910,8 @@
   cached_is_descendant_of_disabled_node_ = !!DisabledAncestor();
   cached_has_inherited_presentational_role_ =
       !!InheritsPresentationalRoleFrom();
-  cached_is_ignored_ = ComputeAccessibilityIsIgnored();
+  IgnoredReasons ignored_reasons;
+  cached_is_ignored_ = ComputeAccessibilityIsIgnored(&ignored_reasons);
   cached_is_editable_root_ = ComputeIsEditableRoot();
   // Compute live region root, which can be from any ARIA live value, including
   // "off", or from an automatic ARIA live value, e.g. from role="status".
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h
index 633f429..cbedc3b6 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -561,8 +561,13 @@
   virtual bool CanSetFocusAttribute() const;
   bool CanSetValueAttribute() const;
 
-  // Whether objects are ignored, i.e. not included in the tree.
+  // Whether objects are ignored, i.e. hidden in the tree for most ATs
   bool AccessibilityIsIgnored() const;
+
+  // Whether objects are included in the tree. A node may be Ignored,
+  // but allowed to pass into the tree, e.g. a hidden node referenced
+  // by labeled-by.
+  bool AccessibilityIsIncludedInTree() const;
   typedef HeapVector<IgnoredReason> IgnoredReasons;
   virtual bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const {
     return true;
@@ -1107,6 +1112,7 @@
   mutable int last_modification_count_;
   mutable RGBA32 cached_background_color_;
   mutable bool cached_is_ignored_ : 1;
+
   mutable bool cached_is_inert_or_aria_hidden_ : 1;
   mutable bool cached_is_descendant_of_leaf_node_ : 1;
   mutable bool cached_is_descendant_of_disabled_node_ : 1;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 0ac1c5b..2c689c0 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -219,7 +219,7 @@
 
   // the HTML element, for example, is focusable but has an AX object that is
   // ignored
-  if (obj->AccessibilityIsIgnored())
+  if (!obj->AccessibilityIsIncludedInTree())
     obj = obj->ParentObjectUnignored();
 
   return obj;
@@ -1437,7 +1437,8 @@
     return nullptr;
 
   AXObject* accessible_object = GetOrCreate(node->GetLayoutObject());
-  while (accessible_object && accessible_object->AccessibilityIsIgnored()) {
+  while (accessible_object &&
+         !accessible_object->AccessibilityIsIncludedInTree()) {
     node = NodeTraversal::Next(*node);
 
     while (node && !node->GetLayoutObject())
@@ -1615,7 +1616,7 @@
   AXObject* obj = GetOrCreate(anchor_node->GetLayoutObject());
   if (!obj)
     return;
-  if (obj->AccessibilityIsIgnored())
+  if (!obj->AccessibilityIsIncludedInTree())
     obj = obj->ParentObjectUnignored();
   PostNotification(obj, ax::mojom::Event::kScrolledToAnchor);
 }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_slider.cc b/third_party/blink/renderer/modules/accessibility/ax_slider.cc
index 8dc379b2..05a3e36cc 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_slider.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_slider.cc
@@ -87,7 +87,7 @@
 
   // Before actually adding the value indicator to the hierarchy,
   // allow the platform to make a final decision about it.
-  if (thumb->AccessibilityIsIgnored())
+  if (!thumb->AccessibilityIsIncludedInTree())
     cache.Remove(thumb->AXObjectID());
   else
     children_.push_back(thumb);
diff --git a/third_party/blink/renderer/modules/exported/web_ax_object.cc b/third_party/blink/renderer/modules/exported/web_ax_object.cc
index 84ec4bb2..4829781 100644
--- a/third_party/blink/renderer/modules/exported/web_ax_object.cc
+++ b/third_party/blink/renderer/modules/exported/web_ax_object.cc
@@ -1231,6 +1231,13 @@
   return private_->AccessibilityIsIgnored();
 }
 
+bool WebAXObject::AccessibilityIsIncludedInTree() const {
+  if (IsDetached())
+    return false;
+
+  return private_->AccessibilityIsIncludedInTree();
+}
+
 int WebAXObject::AriaColumnCount() const {
   if (IsDetached())
     return 0;
diff --git a/third_party/blink/renderer/modules/gamepad/gamepad.idl b/third_party/blink/renderer/modules/gamepad/gamepad.idl
index 87ed092..5b56e4ae 100644
--- a/third_party/blink/renderer/modules/gamepad/gamepad.idl
+++ b/third_party/blink/renderer/modules/gamepad/gamepad.idl
@@ -35,6 +35,9 @@
 enum GamepadMappingType {
   "",
   "standard",
+  // https://immersive-web.github.io/webxr/#xr-standard-gamepad-mapping
+  // Extended attributes are not supported for enum values.
+  /* [RuntimeEnabled=WebXR] */ "xr-standard",
 };
 
 // https://w3c.github.io/gamepad/#gamepad-interface
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.cc
index 1f863f8..a6b4645e 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.cc
@@ -6,7 +6,6 @@
 
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
-#include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
 #include "third_party/blink/renderer/modules/media_controls/elements/media_control_elements_helper.h"
 #include "third_party/blink/renderer/modules/media_controls/media_controls_impl.h"
@@ -21,61 +20,6 @@
 
 }  // anonymous namespace
 
-// Listens for the 'transitionend' event.
-class MediaControlPanelElement::TransitionEventListener final
-    : public NativeEventListener {
- public:
-  using Callback = base::RepeatingCallback<void()>;
-
-  // |element| is the element to listen for the 'transitionend' event on.
-  // |callback| is the callback to call when the event is handled.
-  explicit TransitionEventListener(Element* element, Callback callback)
-      : callback_(callback), element_(element) {
-    DCHECK(callback_);
-    DCHECK(element_);
-  }
-
-  void Attach() {
-    DCHECK(!attached_);
-    attached_ = true;
-
-    element_->addEventListener(event_type_names::kTransitionend, this, false);
-  }
-
-  void Detach() {
-    DCHECK(attached_);
-    attached_ = false;
-
-    element_->removeEventListener(event_type_names::kTransitionend, this,
-                                  false);
-  }
-
-  bool IsAttached() const { return attached_; }
-
-  void Invoke(ExecutionContext* context, Event* event) override {
-    if (event->target() != element_)
-      return;
-
-    if (event->type() == event_type_names::kTransitionend) {
-      callback_.Run();
-      return;
-    }
-
-    NOTREACHED();
-  }
-
-  void Trace(blink::Visitor* visitor) override {
-    NativeEventListener::Trace(visitor);
-    visitor->Trace(element_);
-  }
-
- private:
-  bool attached_ = false;
-
-  Callback callback_;
-  Member<Element> element_;
-};
-
 MediaControlPanelElement::MediaControlPanelElement(
     MediaControlsImpl& media_controls)
     : MediaControlDivElement(media_controls), event_listener_(nullptr) {
@@ -148,11 +92,11 @@
 void MediaControlPanelElement::EnsureTransitionEventListener() {
   // Create the event listener if it doesn't exist.
   if (!event_listener_) {
-    event_listener_ =
-        MakeGarbageCollected<MediaControlPanelElement::TransitionEventListener>(
-            this, WTF::BindRepeating(
-                      &MediaControlPanelElement::HandleTransitionEndEvent,
-                      WrapWeakPersistent(this)));
+    event_listener_ = MakeGarbageCollected<
+        MediaControlsSharedHelpers::TransitionEventListener>(
+        this,
+        WTF::BindRepeating(&MediaControlPanelElement::HandleTransitionEndEvent,
+                           WrapWeakPersistent(this)));
   }
 
   // Attach the event listener if we are not attached.
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.h b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.h
index ccb43bb..a010ba1 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.h
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_ELEMENTS_MEDIA_CONTROL_PANEL_ELEMENT_H_
 
 #include "third_party/blink/renderer/modules/media_controls/elements/media_control_div_element.h"
+#include "third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 
 namespace blink {
@@ -40,8 +41,6 @@
   bool EventListenerIsAttachedForTest() const;
 
  private:
-  class TransitionEventListener;
-
   void EnsureTransitionEventListener();
   void DetachTransitionEventListener();
 
@@ -55,7 +54,7 @@
   bool opaque_ = true;
   bool keep_displayed_for_accessibility_ = false;
 
-  Member<TransitionEventListener> event_listener_;
+  Member<MediaControlsSharedHelpers::TransitionEventListener> event_listener_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.cc b/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.cc
index 03688127b..92cc944 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.cc
@@ -6,6 +6,7 @@
 
 #include <cmath>
 #include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h"
+#include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/frame/use_counter.h"
 #include "third_party/blink/renderer/core/fullscreen/fullscreen.h"
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
@@ -21,6 +22,54 @@
 
 namespace blink {
 
+// |element| is the element to listen for the 'transitionend' event on.
+// |callback| is the callback to call when the event is handled.
+MediaControlsSharedHelpers::TransitionEventListener::TransitionEventListener(
+    Element* element,
+    Callback callback)
+    : callback_(callback), element_(element) {
+  DCHECK(callback_);
+  DCHECK(element_);
+}
+
+void MediaControlsSharedHelpers::TransitionEventListener::Attach() {
+  DCHECK(!attached_);
+  attached_ = true;
+
+  element_->addEventListener(event_type_names::kTransitionend, this, false);
+}
+
+void MediaControlsSharedHelpers::TransitionEventListener::Detach() {
+  DCHECK(attached_);
+  attached_ = false;
+
+  element_->removeEventListener(event_type_names::kTransitionend, this, false);
+}
+
+bool MediaControlsSharedHelpers::TransitionEventListener::IsAttached() const {
+  return attached_;
+}
+
+void MediaControlsSharedHelpers::TransitionEventListener::Invoke(
+    ExecutionContext* context,
+    Event* event) {
+  if (event->target() != element_)
+    return;
+
+  if (event->type() == event_type_names::kTransitionend) {
+    callback_.Run();
+    return;
+  }
+
+  NOTREACHED();
+}
+
+void MediaControlsSharedHelpers::TransitionEventListener::Trace(
+    blink::Visitor* visitor) {
+  NativeEventListener::Trace(visitor);
+  visitor->Trace(element_);
+}
+
 base::Optional<unsigned>
 MediaControlsSharedHelpers::GetCurrentBufferedTimeRange(
     HTMLMediaElement& media_element) {
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.h b/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.h
index bae4da1..4920fef 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.h
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.h
@@ -5,18 +5,38 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_MEDIA_CONTROLS_SHARED_HELPER_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_MEDIA_CONTROLS_SHARED_HELPER_H_
 
+#include "base/callback.h"
 #include "base/optional.h"
+#include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
 
 class HTMLMediaElement;
+class Element;
 
 class MediaControlsSharedHelpers final {
   STATIC_ONLY(MediaControlsSharedHelpers);
 
  public:
+  class TransitionEventListener final : public NativeEventListener {
+   public:
+    using Callback = base::RepeatingCallback<void()>;
+
+    explicit TransitionEventListener(Element* element, Callback callback);
+    void Attach();
+    void Detach();
+    bool IsAttached() const;
+    void Invoke(ExecutionContext* context, Event* event) override;
+    void Trace(blink::Visitor* visitor) override;
+
+   private:
+    bool attached_ = false;
+    Callback callback_;
+    Member<Element> element_;
+  };
+
   static base::Optional<unsigned> GetCurrentBufferedTimeRange(
       HTMLMediaElement& media_element);
 
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.cc b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.cc
index 4542382..d708992 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.cc
@@ -4,8 +4,10 @@
 
 #include "third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.h"
 
+#include "third_party/blink/renderer/core/html/media/html_media_element.h"
 #include "third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_time_display_element.h"
 #include "third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_timeline_element.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
 
@@ -25,6 +27,14 @@
 
   ParserAppendChild(time_display_element_);
   ParserAppendChild(timeline_element_);
+
+  event_listener_ =
+      MakeGarbageCollected<MediaControlsSharedHelpers::TransitionEventListener>(
+          this,
+          WTF::BindRepeating(&MediaControlsTouchlessBottomContainerElement::
+                                 HandleTransitionEndEvent,
+                             WrapWeakPersistent(this)));
+  event_listener_->Attach();
 }
 
 LayoutObject*
@@ -37,10 +47,30 @@
   return time_display_element_->GetLayoutObject();
 }
 
+void MediaControlsTouchlessBottomContainerElement::MakeOpaque(
+    bool should_hide) {
+  SetDisplayed(true);
+  MediaElement().MediaControlsDidBecomeVisible();
+  MediaControlsTouchlessElement::MakeOpaque(should_hide);
+}
+
+void MediaControlsTouchlessBottomContainerElement::HandleTransitionEndEvent() {
+  SetDisplayed(false);
+}
+
+void MediaControlsTouchlessBottomContainerElement::SetDisplayed(
+    bool displayed) {
+  if (displayed)
+    RemoveInlineStyleProperty(CSSPropertyID::kDisplay);
+  else
+    SetInlineStyleProperty(CSSPropertyID::kDisplay, CSSValueID::kNone);
+}
+
 void MediaControlsTouchlessBottomContainerElement::Trace(
     blink::Visitor* visitor) {
   visitor->Trace(timeline_element_);
   visitor->Trace(time_display_element_);
+  visitor->Trace(event_listener_);
   MediaControlsTouchlessElement::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.h b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.h
index 34d04de..e23acc5 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.h
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_bottom_container_element.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_TOUCHLESS_ELEMENTS_MEDIA_CONTROLS_TOUCHLESS_BOTTOM_CONTAINER_ELEMENT_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_CONTROLS_TOUCHLESS_ELEMENTS_MEDIA_CONTROLS_TOUCHLESS_BOTTOM_CONTAINER_ELEMENT_H_
 
+#include "third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.h"
 #include "third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h"
 
 namespace blink {
@@ -20,11 +21,17 @@
   MediaControlsTouchlessBottomContainerElement(MediaControlsTouchlessImpl&);
   LayoutObject* TimelineLayoutObject();
   LayoutObject* TimeDisplayLayoutObject();
+
+  void MakeOpaque(bool);
   void Trace(blink::Visitor*) override;
 
  private:
+  void HandleTransitionEndEvent();
+  void SetDisplayed(bool);
+
   Member<MediaControlsTouchlessTimelineElement> timeline_element_;
   Member<MediaControlsTouchlessTimeDisplayElement> time_display_element_;
+  Member<MediaControlsSharedHelpers::TransitionEventListener> event_listener_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.cc b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.cc
index cbbac960..4c2c2137 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.cc
@@ -17,6 +17,7 @@
 constexpr WTF::TimeDelta kTimeToHideControl = TimeDelta::FromMilliseconds(3000);
 
 const char kTransparentCSSClass[] = "transparent";
+const char kTransparentImmediateCSSClass[] = "transparent-immediate";
 
 }  // namespace
 
@@ -34,7 +35,7 @@
 void MediaControlsTouchlessElement::MakeOpaque(bool should_hide) {
   EnsureHideControlTimer();
 
-  classList().Remove(kTransparentCSSClass);
+  removeAttribute("class");
 
   if (hide_control_timer_->IsActive())
     StopHideControlTimer();
@@ -43,8 +44,9 @@
     StartHideControlTimer();
 }
 
-void MediaControlsTouchlessElement::MakeTransparent() {
-  classList().Add(kTransparentCSSClass);
+void MediaControlsTouchlessElement::MakeTransparent(bool hide_immediate) {
+  classList().Add(hide_immediate ? kTransparentImmediateCSSClass
+                                 : kTransparentCSSClass);
 }
 
 void MediaControlsTouchlessElement::EnsureHideControlTimer() {
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h
index c0a6fa6f..f5463bb 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h
+++ b/third_party/blink/renderer/modules/media_controls/touchless/elements/media_controls_touchless_element.h
@@ -27,7 +27,7 @@
   void Trace(blink::Visitor* visitor) override;
 
   void MakeOpaque(bool /** True if control should hide after timer fired */);
-  void MakeTransparent();
+  void MakeTransparent(bool = false /** True if hide immediately */);
 
   // Non-touch media event listener observer implementation.
   void OnFocusIn() override {}
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl.cc b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl.cc
index bea31f9..1e81e58 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl.cc
@@ -192,7 +192,7 @@
   bool handled = true;
   switch (event->keyCode()) {
     case VKEY_RETURN:
-      volume_container_->MakeTransparent();
+      volume_container_->MakeTransparent(true);
       overlay_->MakeOpaque(true);
       MediaElement().TogglePlayState();
       break;
@@ -402,14 +402,14 @@
 void MediaControlsTouchlessImpl::HandleTopButtonPress() {
   MaybeChangeVolume(kVolumeToChangeForTouchless);
   volume_container_->UpdateVolume();
-  overlay_->MakeTransparent();
+  overlay_->MakeTransparent(true);
   volume_container_->MakeOpaque(true);
 }
 
 void MediaControlsTouchlessImpl::HandleBottomButtonPress() {
   MaybeChangeVolume(kVolumeToChangeForTouchless * -1);
   volume_container_->UpdateVolume();
-  overlay_->MakeTransparent();
+  overlay_->MakeTransparent(true);
   volume_container_->MakeOpaque(true);
 }
 
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
index 0ec8824..01576a0 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
@@ -24,6 +24,7 @@
 #include "third_party/blink/renderer/core/html/time_ranges.h"
 #include "third_party/blink/renderer/core/html/track/text_track.h"
 #include "third_party/blink/renderer/core/html/track/text_track_list.h"
+#include "third_party/blink/renderer/core/layout/layout_object.h"
 #include "third_party/blink/renderer/core/loader/empty_clients.h"
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 #include "third_party/blink/renderer/modules/media_controls/touchless/test_media_controls_menu_host.h"
@@ -146,7 +147,16 @@
   }
 
   bool IsControlsVisible(Element* element) {
-    return !element->classList().contains("transparent");
+    return !element->classList().contains("transparent") &&
+           !element->classList().contains("transparent-immediate");
+  }
+
+  bool IsElementDisplayed(Element* element) {
+    if (!element->InlineStyle())
+      return true;
+
+    return element->InlineStyle()->GetPropertyValue(CSSPropertyID::kDisplay) !=
+           "none";
   }
 
   void SetHasAudio(bool has_audio) { WebMediaPlayer()->has_audio_ = has_audio; }
@@ -480,6 +490,7 @@
 
   // Bottom container starts opaque since video is paused.
   EXPECT_TRUE(IsControlsVisible(bottom_container));
+  EXPECT_TRUE(IsElementDisplayed(bottom_container));
 
   MediaElement().Play();
   platform()->RunForPeriodSeconds(3);
@@ -506,6 +517,11 @@
   platform()->RunForPeriodSeconds(3);
   EXPECT_FALSE(IsControlsVisible(bottom_container));
 
+  // Display should be none after hide transition ends.
+  bottom_container->DispatchEvent(
+      *Event::Create(event_type_names::kTransitionend));
+  EXPECT_FALSE(IsElementDisplayed(bottom_container));
+
   // Bottom container should show after pressing right/left arrow.
   SimulateKeydownEvent(MediaElement(), VK_RIGHT);
   EXPECT_TRUE(IsControlsVisible(bottom_container));
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/resources/mediaControlsTouchless.css b/third_party/blink/renderer/modules/media_controls/touchless/resources/mediaControlsTouchless.css
index 1ef89f2..98516f3 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/resources/mediaControlsTouchless.css
+++ b/third_party/blink/renderer/modules/media_controls/touchless/resources/mediaControlsTouchless.css
@@ -40,6 +40,10 @@
   transition: opacity .5s;
 }
 
+video::-internal-media-controls-touchless-overlay.transparent-immediate {
+  opacity: 0;
+}
+
 video::-internal-media-controls-touchless-volume-up-button {
   width: 30px;
   height: 30px;
@@ -175,6 +179,10 @@
   transition: opacity .5s;
 }
 
+video::-internal-media-controls-touchless-volume-container.transparent-immediate {
+  opacity: 0;
+}
+
 video::-internal-media-controls-touchless-volume-bar-background {
   width: 4px;
   margin-left: 20px;
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/BUILD.gn b/third_party/blink/renderer/modules/mediacapturefromelement/BUILD.gn
index 7778a4b..085d538 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/BUILD.gn
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/BUILD.gn
@@ -16,6 +16,8 @@
     "html_canvas_element_capture.h",
     "html_media_element_capture.cc",
     "html_media_element_capture.h",
+    "html_video_element_capturer_source.cc",
+    "html_video_element_capturer_source.h",
     "on_request_canvas_draw_listener.cc",
     "on_request_canvas_draw_listener.h",
     "timed_canvas_draw_listener.cc",
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/DEPS b/third_party/blink/renderer/modules/mediacapturefromelement/DEPS
index 844e79cc..1b37b75 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/DEPS
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/DEPS
@@ -5,15 +5,19 @@
     "+third_party/blink/renderer/modules/mediastream",
     "+third_party/blink/renderer/modules/modules_export.h",
 
+    "+cc/paint/paint_canvas.h",
+    "+cc/paint/skia_paint_canvas.h",
     "+components/viz/common",
     "+media/base",
     "+media/capture",
+    "+skia/ext/platform_canvas.h",
     "+third_party/libyuv",
     "+ui/gfx/color_space.h",
 ]
 
 specific_include_rules = {
-    "canvas_capture_handler_unittest\.cc" : [
+    ".*_unittest.cc": [
         "+base/run_loop.h",
+        "+cc/paint/paint_flags.h",
     ],
 }
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc b/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
index db744760..0447a5d 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.cc
@@ -8,19 +8,81 @@
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_media_stream.h"
 #include "third_party/blink/public/platform/web_media_stream_track.h"
+#include "third_party/blink/public/web/modules/mediastream/media_stream_constraints_util.h"
+#include "third_party/blink/public/web/modules/mediastream/media_stream_video_capturer_source.h"
+#include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
+#include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
 #include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
 #include "third_party/blink/renderer/core/html/track/audio_track_list.h"
 #include "third_party/blink/renderer/core/html/track/video_track_list.h"
 #include "third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.h"
 #include "third_party/blink/renderer/modules/encryptedmedia/media_keys.h"
+#include "third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_center.h"
+#include "third_party/blink/renderer/platform/uuid.h"
 
 namespace blink {
 
 namespace {
 
+// This method creates a WebMediaStreamSource + MediaStreamSource pair with the
+// provided video capturer source. A new WebMediaStreamTrack +
+// MediaStreamTrack pair is created, connected to the source and is plugged into
+// the WebMediaStream (|web_media_stream|).
+// |is_remote| should be true if the source of the data is not a local device.
+// |is_readonly| should be true if the format of the data cannot be changed by
+// MediaTrackConstraints.
+bool AddVideoTrackToMediaStream(
+    std::unique_ptr<media::VideoCapturerSource> video_source,
+    bool is_remote,
+    WebMediaStream* web_media_stream) {
+  DCHECK(video_source.get());
+  if (!web_media_stream || web_media_stream->IsNull()) {
+    DLOG(ERROR) << "WebMediaStream is null";
+    return false;
+  }
+
+  media::VideoCaptureFormats preferred_formats =
+      video_source->GetPreferredFormats();
+  MediaStreamVideoSource* const media_stream_source =
+      new MediaStreamVideoCapturerSource(
+          WebPlatformMediaStreamSource::SourceStoppedCallback(),
+          std::move(video_source));
+  const WebString track_id(CreateCanonicalUUIDString());
+  WebMediaStreamSource web_media_stream_source;
+  web_media_stream_source.Initialize(track_id, WebMediaStreamSource::kTypeVideo,
+                                     track_id, is_remote);
+  // Takes ownership of |media_stream_source|.
+  web_media_stream_source.SetPlatformSource(
+      base::WrapUnique(media_stream_source));
+  web_media_stream_source.SetCapabilities(ComputeCapabilitiesForVideoSource(
+      track_id, preferred_formats,
+      media::VideoFacingMode::MEDIA_VIDEO_FACING_NONE,
+      false /* is_device_capture */));
+  web_media_stream->AddTrack(MediaStreamVideoTrack::CreateVideoTrack(
+      media_stream_source, MediaStreamVideoSource::ConstraintsCallback(),
+      true));
+  return true;
+}
+
+// Fills in the WebMediaStream to capture from the WebMediaPlayer identified
+// by the second parameter.
+void CreateHTMLVideoElementCapturer(
+    WebMediaStream* web_media_stream,
+    WebMediaPlayer* web_media_player,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+  DCHECK(web_media_stream);
+  DCHECK(web_media_player);
+  AddVideoTrackToMediaStream(
+      HtmlVideoElementCapturerSource::CreateFromWebMediaPlayerImpl(
+          web_media_player, Platform::Current()->GetIOTaskRunner(),
+          std::move(task_runner)),
+      false,  // is_remote
+      web_media_stream);
+}
+
 // Class to register to the events of |m_mediaElement|, acting accordingly on
 // the tracks of |m_mediaStream|.
 class MediaElementEventListener final : public NativeEventListener {
@@ -89,7 +151,7 @@
                         WebVector<WebMediaStreamTrack>());
 
   if (media_element_->HasVideo()) {
-    Platform::Current()->CreateHTMLVideoElementCapturer(
+    CreateHTMLVideoElementCapturer(
         &web_stream, media_element_->GetWebMediaPlayer(),
         media_element_->GetExecutionContext()->GetTaskRunner(
             TaskType::kInternalMediaRealTime));
@@ -176,10 +238,9 @@
   }
 
   if (element.HasVideo()) {
-    Platform::Current()->CreateHTMLVideoElementCapturer(
-        &web_stream, element.GetWebMediaPlayer(),
-        element.GetExecutionContext()->GetTaskRunner(
-            TaskType::kInternalMediaRealTime));
+    CreateHTMLVideoElementCapturer(&web_stream, element.GetWebMediaPlayer(),
+                                   element.GetExecutionContext()->GetTaskRunner(
+                                       TaskType::kInternalMediaRealTime));
   }
   if (element.HasAudio()) {
     Platform::Current()->CreateHTMLAudioElementCapturer(
diff --git a/content/renderer/media_capture_from_element/html_video_element_capturer_source.cc b/third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.cc
similarity index 77%
rename from content/renderer/media_capture_from_element/html_video_element_capturer_source.cc
rename to third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.cc
index df3ac484..ddfe0f5 100644
--- a/content/renderer/media_capture_from_element/html_video_element_capturer_source.cc
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.cc
@@ -2,16 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/media_capture_from_element/html_video_element_capturer_source.h"
+#include "third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.h"
 
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/paint/skia_paint_canvas.h"
-#include "content/public/renderer/render_thread.h"
 #include "media/base/limits.h"
 #include "skia/ext/platform_canvas.h"
 #include "third_party/blink/public/platform/modules/mediastream/webrtc_uma_histograms.h"
@@ -19,15 +17,18 @@
 #include "third_party/blink/public/platform/web_rect.h"
 #include "third_party/blink/public/platform/web_size.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
+#include "third_party/blink/renderer/platform/cross_thread_functional.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
+#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 #include "third_party/libyuv/include/libyuv.h"
 
 namespace {
 const float kMinFramesPerSecond = 1.0;
 }  // anonymous namespace
 
-namespace content {
+namespace blink {
 
-//static
+// static
 std::unique_ptr<HtmlVideoElementCapturerSource>
 HtmlVideoElementCapturerSource::CreateFromWebMediaPlayerImpl(
     blink::WebMediaPlayer* player,
@@ -56,18 +57,18 @@
 }
 
 HtmlVideoElementCapturerSource::~HtmlVideoElementCapturerSource() {
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 }
 
 media::VideoCaptureFormats
 HtmlVideoElementCapturerSource::GetPreferredFormats() {
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   // WebMediaPlayer has a setRate() but can't be read back.
   // TODO(mcasas): Add getRate() to WMPlayer and/or fix the spec to allow users
   // to specify it.
   const media::VideoCaptureFormat format(
-      web_media_player_->NaturalSize(),
+      gfx::Size(web_media_player_->NaturalSize()),
       blink::MediaStreamVideoSource::kDefaultFrameRate,
       media::PIXEL_FORMAT_I420);
   media::VideoCaptureFormats formats;
@@ -82,7 +83,7 @@
   DVLOG(2) << __func__ << " requested "
            << media::VideoCaptureFormat::ToString(params.requested_format);
   DCHECK(params.requested_format.IsValid());
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   running_callback_ = running_callback;
   if (!web_media_player_ || !web_media_player_->HasVideo()) {
@@ -98,14 +99,15 @@
                         params.requested_format.frame_rate));
 
   running_callback_.Run(true);
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&HtmlVideoElementCapturerSource::sendNewFrame,
-                                weak_factory_.GetWeakPtr()));
+  // TODO(crbug.com/964463): Use per-frame task runner.
+  Thread::Current()->GetTaskRunner()->PostTask(
+      FROM_HERE, WTF::Bind(&HtmlVideoElementCapturerSource::sendNewFrame,
+                           weak_factory_.GetWeakPtr()));
 }
 
 void HtmlVideoElementCapturerSource::StopCapture() {
   DVLOG(2) << __func__;
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   running_callback_.Reset();
   new_frame_callback_.Reset();
   next_capture_time_ = base::TimeTicks();
@@ -114,7 +116,7 @@
 void HtmlVideoElementCapturerSource::sendNewFrame() {
   DVLOG(3) << __func__;
   TRACE_EVENT0("media", "HtmlVideoElementCapturerSource::sendNewFrame");
-  DCHECK(thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   if (!web_media_player_ || new_frame_callback_.is_null())
     return;
@@ -154,9 +156,11 @@
     return;
   }
 
+  // TODO(crbug.com/964494): Avoid the explicit convertion to gfx::Size here.
+  gfx::Size gfx_resolution = gfx::Size(resolution);
   scoped_refptr<media::VideoFrame> frame = frame_pool_.CreateFrame(
       is_opaque_ ? media::PIXEL_FORMAT_I420 : media::PIXEL_FORMAT_I420A,
-      resolution, gfx::Rect(resolution), resolution,
+      gfx_resolution, gfx::Rect(gfx_resolution), gfx_resolution,
       current_time - start_capture_time_);
 
   const uint32_t source_pixel_format =
@@ -179,14 +183,23 @@
     if (!is_opaque_) {
       // OK to use ARGB...() because alpha has the same alignment for both ABGR
       // and ARGB.
-      libyuv::ARGBExtractAlpha(static_cast<uint8_t*>(bitmap_.getPixels()),
-                               bitmap_.rowBytes() /* stride */,
-                               frame->visible_data(media::VideoFrame::kAPlane),
-                               frame->stride(media::VideoFrame::kAPlane),
-                               bitmap_.info().width(), bitmap_.info().height());
+      libyuv::ARGBExtractAlpha(
+          static_cast<uint8_t*>(bitmap_.getPixels()),
+          static_cast<int>(bitmap_.rowBytes()) /* stride */,
+          frame->visible_data(media::VideoFrame::kAPlane),
+          frame->stride(media::VideoFrame::kAPlane), bitmap_.info().width(),
+          bitmap_.info().height());
     }  // Success!
-    io_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(new_frame_callback_, frame, current_time));
+
+    // Post with CrossThreadBind here, instead of CrossThreadBindOnce,
+    // otherwise the |new_frame_callback_| ivar can be nulled out
+    // unintentionally.
+    //
+    // TODO(crbug.com/964922): Consider cloning |new_frame_callback_|
+    // and use CrossThreadBind
+    PostCrossThreadTask(
+        *io_task_runner_, FROM_HERE,
+        CrossThreadBind(new_frame_callback_, frame, current_time));
   }
 
   // Calculate the time in the future where the next frame should be created.
@@ -202,11 +215,11 @@
       next_capture_time_ = current_time;
   }
   // Schedule next capture.
-  task_runner_->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&HtmlVideoElementCapturerSource::sendNewFrame,
-                     weak_factory_.GetWeakPtr()),
+  PostDelayedCrossThreadTask(
+      *task_runner_, FROM_HERE,
+      CrossThreadBindOnce(&HtmlVideoElementCapturerSource::sendNewFrame,
+                          weak_factory_.GetWeakPtr()),
       next_capture_time_ - current_time);
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/renderer/media_capture_from_element/html_video_element_capturer_source.h b/third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.h
similarity index 85%
rename from content/renderer/media_capture_from_element/html_video_element_capturer_source.h
rename to third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.h
index 69c0cfd4..2f7395406 100644
--- a/content/renderer/media_capture_from_element/html_video_element_capturer_source.h
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.h
@@ -2,39 +2,37 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_MEDIA_CAPTURE_FROM_ELEMENT_HTML_VIDEO_ELEMENT_CAPTURER_SOURCE_H_
-#define CONTENT_RENDERER_MEDIA_CAPTURE_FROM_ELEMENT_HTML_VIDEO_ELEMENT_CAPTURER_SOURCE_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIACAPTUREFROMELEMENT_HTML_VIDEO_ELEMENT_CAPTURER_SOURCE_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIACAPTUREFROMELEMENT_HTML_VIDEO_ELEMENT_CAPTURER_SOURCE_H_
 
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
-#include "content/common/content_export.h"
 #include "media/base/video_frame_pool.h"
 #include "media/base/video_types.h"
 #include "media/capture/video_capturer_source.h"
 #include "third_party/blink/public/platform/web_size.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
-namespace base{
+namespace base {
 class SingleThreadTaskRunner;
 }
 
-namespace blink {
-class WebMediaPlayer;
-}  // namespace blink
-
 namespace cc {
 class PaintCanvas;
 }  // namespace cc
 
-namespace content {
+namespace blink {
+
+class WebMediaPlayer;
 
 // This class is a VideoCapturerSource taking video snapshots of the ctor-passed
 // blink::WebMediaPlayer on Render Main thread. The captured data is converted
 // and sent back to |io_task_runner_| via the registered |new_frame_callback_|.
-class CONTENT_EXPORT HtmlVideoElementCapturerSource final
+class MODULES_EXPORT HtmlVideoElementCapturerSource final
     : public media::VideoCapturerSource {
  public:
   static std::unique_ptr<HtmlVideoElementCapturerSource>
@@ -85,7 +83,7 @@
   base::TimeTicks next_capture_time_;
 
   // Bound to the main render thread.
-  base::ThreadChecker thread_checker_;
+  THREAD_CHECKER(thread_checker_);
 
   // Used on main render thread to schedule future capture events.
   base::WeakPtrFactory<HtmlVideoElementCapturerSource> weak_factory_;
@@ -93,6 +91,6 @@
   DISALLOW_COPY_AND_ASSIGN(HtmlVideoElementCapturerSource);
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_RENDERER_MEDIA_CAPTURE_FROM_ELEMENT_HTML_VIDEO_ELEMENT_CAPTURER_SOURCE_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIACAPTUREFROMELEMENT_HTML_VIDEO_ELEMENT_CAPTURER_SOURCE_H_
diff --git a/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc b/third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source_unittest.cc
similarity index 75%
rename from content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc
rename to third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source_unittest.cc
index 35fe3508..ed8ef0f 100644
--- a/content/renderer/media_capture_from_element/html_video_element_capturer_source_unittest.cc
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source_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 "content/renderer/media_capture_from_element/html_video_element_capturer_source.h"
+#include "third_party/blink/renderer/modules/mediacapturefromelement/html_video_element_capturer_source.h"
 
 #include <memory>
 #include <utility>
@@ -10,8 +10,7 @@
 #include "base/bind.h"
 #include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/threading/thread_task_runner_handle.h"
+#include "base/single_thread_task_runner.h"
 #include "cc/paint/paint_canvas.h"
 #include "cc/paint/paint_flags.h"
 #include "media/base/limits.h"
@@ -21,27 +20,30 @@
 #include "third_party/blink/public/platform/web_media_player.h"
 #include "third_party/blink/public/platform/web_rect.h"
 #include "third_party/blink/public/platform/web_string.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
 
 using ::testing::_;
 using ::testing::InSequence;
 using ::testing::Mock;
 using ::testing::SaveArg;
 
-namespace content {
+namespace blink {
 
-ACTION_P(RunClosure, closure) {
+namespace {
+
+// This is named |RunClosure2| not to collide with the same construction
+// in canvas_capture_handler_unittest.cc on jumbo builds.
+ACTION_P(RunClosure2, closure) {
   closure.Run();
 }
 
 // An almost empty WebMediaPlayer to override paint() method.
-class MockWebMediaPlayer : public blink::WebMediaPlayer {
+class MockWebMediaPlayer : public WebMediaPlayer {
  public:
   MockWebMediaPlayer() : weak_factory_(this) {}
   ~MockWebMediaPlayer() override = default;
 
-  LoadTiming Load(LoadType,
-                  const blink::WebMediaPlayerSource&,
-                  CorsMode) override {
+  LoadTiming Load(LoadType, const WebMediaPlayerSource&, CorsMode) override {
     return LoadTiming::kImmediate;
   }
   void Play() override {}
@@ -50,18 +52,14 @@
   void SetRate(double) override {}
   void SetVolume(double) override {}
   void OnRequestPictureInPicture() override {}
-  blink::WebTimeRanges Buffered() const override {
-    return blink::WebTimeRanges();
-  }
-  blink::WebTimeRanges Seekable() const override {
-    return blink::WebTimeRanges();
-  }
-  void SetSinkId(const blink::WebString& sinkId,
-                 blink::WebSetSinkIdCompleteCallback) override {}
+  WebTimeRanges Buffered() const override { return WebTimeRanges(); }
+  WebTimeRanges Seekable() const override { return WebTimeRanges(); }
+  void SetSinkId(const WebString& sinkId,
+                 WebSetSinkIdCompleteCallback) override {}
   bool HasVideo() const override { return true; }
   bool HasAudio() const override { return false; }
-  blink::WebSize NaturalSize() const override { return blink::WebSize(16, 10); }
-  blink::WebSize VisibleRect() const override { return blink::WebSize(16, 10); }
+  WebSize NaturalSize() const override { return WebSize(16, 10); }
+  WebSize VisibleRect() const override { return WebSize(16, 10); }
   bool Paused() const override { return false; }
   bool Seeking() const override { return false; }
   double Duration() const override { return 0.0; }
@@ -71,9 +69,7 @@
   SurfaceLayerMode GetVideoSurfaceLayerMode() const override {
     return SurfaceLayerMode::kNever;
   }
-  blink::WebString GetErrorMessage() const override {
-    return blink::WebString();
-  }
+  WebString GetErrorMessage() const override { return WebString(); }
 
   bool DidLoadingProgress() override { return true; }
   bool WouldTaintOrigin() const override { return false; }
@@ -85,7 +81,7 @@
   uint64_t VideoDecodedByteCount() const override { return 0; }
 
   void Paint(cc::PaintCanvas* canvas,
-             const blink::WebRect& rect,
+             const WebRect& rect,
              cc::PaintFlags&,
              int already_uploaded_id,
              VideoFrameUploadMetadata* out_metadata) override {
@@ -105,16 +101,16 @@
   base::WeakPtrFactory<MockWebMediaPlayer> weak_factory_;
 };
 
+}  // namespace
+
 class HTMLVideoElementCapturerSourceTest : public testing::TestWithParam<bool> {
  public:
   HTMLVideoElementCapturerSourceTest()
-      : scoped_task_environment_(
-            base::test::ScopedTaskEnvironment::MainThreadType::UI),
-        web_media_player_(new MockWebMediaPlayer()),
+      : web_media_player_(new MockWebMediaPlayer()),
         html_video_capturer_(new HtmlVideoElementCapturerSource(
             web_media_player_->AsWeakPtr(),
-            blink::scheduler::GetSingleThreadTaskRunnerForTesting(),
-            blink::scheduler::GetSingleThreadTaskRunnerForTesting())) {}
+            scheduler::GetSingleThreadTaskRunnerForTesting(),
+            scheduler::GetSingleThreadTaskRunnerForTesting())) {}
 
   // Necessary callbacks and MOCK_METHODS for them.
   MOCK_METHOD2(DoOnDeliverFrame,
@@ -132,10 +128,6 @@
   }
 
  protected:
-  // We need some kind of message loop to allow |html_video_capturer_| to
-  // schedule capture events.
-  const base::test::ScopedTaskEnvironment scoped_task_environment_;
-
   std::unique_ptr<MockWebMediaPlayer> web_media_player_;
   std::unique_ptr<HtmlVideoElementCapturerSource> html_video_capturer_;
 };
@@ -166,20 +158,21 @@
   SetVideoPlayerOpacity(is_video_opaque);
 
   base::RunLoop run_loop;
-  base::Closure quit_closure = run_loop.QuitClosure();
+  base::RepeatingClosure quit_closure = run_loop.QuitClosure();
   scoped_refptr<media::VideoFrame> first_frame;
   scoped_refptr<media::VideoFrame> second_frame;
   EXPECT_CALL(*this, DoOnDeliverFrame(_, _)).WillOnce(SaveArg<0>(&first_frame));
   EXPECT_CALL(*this, DoOnDeliverFrame(_, _))
       .Times(1)
       .WillOnce(DoAll(SaveArg<0>(&second_frame),
-                      RunClosure(std::move(quit_closure))));
+                      RunClosure2(std::move(quit_closure))));
 
   html_video_capturer_->StartCapture(
-      params, base::Bind(&HTMLVideoElementCapturerSourceTest::OnDeliverFrame,
+      params,
+      WTF::BindRepeating(&HTMLVideoElementCapturerSourceTest::OnDeliverFrame,
                          base::Unretained(this)),
-      base::Bind(&HTMLVideoElementCapturerSourceTest::OnRunning,
-                 base::Unretained(this)));
+      WTF::BindRepeating(&HTMLVideoElementCapturerSourceTest::OnRunning,
+                         base::Unretained(this)));
 
   run_loop.Run();
 
@@ -220,10 +213,10 @@
 
   html_video_capturer_->StartCapture(
       params,
-      base::Bind(&HTMLVideoElementCapturerSourceTest::OnDeliverFrame,
-                 base::Unretained(this)),
-      base::Bind(&HTMLVideoElementCapturerSourceTest::OnRunning,
-                 base::Unretained(this)));
+      WTF::BindRepeating(&HTMLVideoElementCapturerSourceTest::OnDeliverFrame,
+                         base::Unretained(this)),
+      WTF::BindRepeating(&HTMLVideoElementCapturerSourceTest::OnRunning,
+                         base::Unretained(this)));
   html_video_capturer_->StopCapture();
   base::RunLoop().RunUntilIdle();
 
@@ -243,18 +236,18 @@
     SetVideoPlayerOpacity(false);
 
     base::RunLoop run_loop;
-    base::Closure quit_closure = run_loop.QuitClosure();
+    base::RepeatingClosure quit_closure = run_loop.QuitClosure();
     scoped_refptr<media::VideoFrame> frame;
     EXPECT_CALL(*this, DoOnRunning(true)).Times(1);
     EXPECT_CALL(*this, DoOnDeliverFrame(_, _))
         .WillOnce(
-            DoAll(SaveArg<0>(&frame), RunClosure(std::move(quit_closure))));
+            DoAll(SaveArg<0>(&frame), RunClosure2(std::move(quit_closure))));
     html_video_capturer_->StartCapture(
         params,
-        base::Bind(&HTMLVideoElementCapturerSourceTest::OnDeliverFrame,
-                   base::Unretained(this)),
-        base::Bind(&HTMLVideoElementCapturerSourceTest::OnRunning,
-                   base::Unretained(this)));
+        WTF::BindRepeating(&HTMLVideoElementCapturerSourceTest::OnDeliverFrame,
+                           base::Unretained(this)),
+        WTF::BindRepeating(&HTMLVideoElementCapturerSourceTest::OnRunning,
+                           base::Unretained(this)));
     run_loop.Run();
 
     EXPECT_EQ(media::PIXEL_FORMAT_I420A, frame->format());
@@ -263,11 +256,11 @@
     SetVideoPlayerOpacity(true);
 
     base::RunLoop run_loop;
-    base::Closure quit_closure = run_loop.QuitClosure();
+    base::RepeatingClosure quit_closure = run_loop.QuitClosure();
     scoped_refptr<media::VideoFrame> frame;
     EXPECT_CALL(*this, DoOnDeliverFrame(_, _))
         .WillOnce(
-            DoAll(SaveArg<0>(&frame), RunClosure(std::move(quit_closure))));
+            DoAll(SaveArg<0>(&frame), RunClosure2(std::move(quit_closure))));
     run_loop.Run();
 
     EXPECT_EQ(media::PIXEL_FORMAT_I420, frame->format());
@@ -276,11 +269,11 @@
     SetVideoPlayerOpacity(false);
 
     base::RunLoop run_loop;
-    base::Closure quit_closure = run_loop.QuitClosure();
+    base::RepeatingClosure quit_closure = run_loop.QuitClosure();
     scoped_refptr<media::VideoFrame> frame;
     EXPECT_CALL(*this, DoOnDeliverFrame(_, _))
         .WillOnce(
-            DoAll(SaveArg<0>(&frame), RunClosure(std::move(quit_closure))));
+            DoAll(SaveArg<0>(&frame), RunClosure2(std::move(quit_closure))));
     run_loop.Run();
 
     EXPECT_EQ(media::PIXEL_FORMAT_I420A, frame->format());
@@ -290,4 +283,4 @@
   Mock::VerifyAndClearExpectations(this);
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.cc
index 99c4357..35bd6c1 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_crypto_stream_factory_impl.cc
@@ -31,8 +31,7 @@
     quic::QuicSession* session,
     quic::QuicCryptoServerStream::Helper* helper) {
   return std::make_unique<quic::QuicCryptoServerStream>(
-      crypto_config, compressed_certs_cache,
-      /*use_stateless_rejects_if_peer_supported=*/false, session, helper);
+      crypto_config, compressed_certs_cache, session, helper);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
index ef84281..40430f4 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_impl.cc
@@ -228,7 +228,10 @@
   // TODO(shampson): Consider setting larger initial flow control window sizes
   // so that the default limit doesn't cause initial undersending.
   quic::QuicConfig quic_config;
-  quic_config.SetMaxIncomingDynamicStreamsToSend(kMaxIncomingDynamicStreams);
+  quic_config.SetMaxIncomingBidirectionalStreamsToSend(
+      kMaxIncomingDynamicStreams);
+  quic_config.SetMaxIncomingUnidirectionalStreamsToSend(
+      kMaxIncomingDynamicStreams);
   // The handshake network timeouts are configured to large values to prevent
   // the QUIC connection from being closed on a slow connection. This can occur
   // if signaling is slow and one side begins the handshake early.
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc
index 7a08f57..258ce658 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc
@@ -472,10 +472,13 @@
         quic::QuicTime::Delta::FromSeconds(2 * quic::kMaximumIdleTimeoutSecs),
         quic::QuicTime::Delta::FromSeconds(quic::kMaximumIdleTimeoutSecs));
     config.SetBytesForConnectionIdToSend(quic::PACKET_8BYTE_CONNECTION_ID);
-    config.SetMaxIncomingDynamicStreamsToSend(
+    config.SetMaxIncomingBidirectionalStreamsToSend(
+        quic::kDefaultMaxStreamsPerConnection / 2);
+    config.SetMaxIncomingUnidirectionalStreamsToSend(
         quic::kDefaultMaxStreamsPerConnection / 2);
     quic::CryptoHandshakeMessage message;
-    config.ToHandshakeMessage(&message);
+    config.ToHandshakeMessage(&message,
+                              session()->connection()->transport_version());
     std::string error_details;
     session()->config()->ProcessPeerHello(message, quic::CLIENT,
                                           &error_details);
@@ -524,8 +527,7 @@
       quic::QuicSession* session,
       quic::QuicCryptoServerStream::Helper* helper) override {
     return std::make_unique<quic::QuicCryptoServerStream>(
-        crypto_config, compressed_certs_cache,
-        /*use_stateless_rejects_if_peer_supported=*/false, session, helper);
+        crypto_config, compressed_certs_cache, session, helper);
   }
 };
 
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index 71d551c..1d1c826 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -473,6 +473,10 @@
 
   // TODO(nhiroki): Clarify mappings between the steps 4.8-4.11 and
   // implementation.
+
+  // This should be called after OriginTrialContext::AddTokens() to install
+  // origin trial features in JavaScript's global object.
+  ScriptController()->PrepareForEvaluation();
 }
 
 // https://w3c.github.io/ServiceWorker/#run-service-worker-algorithm
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
index 6df31520..a5efbab 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
@@ -73,10 +73,10 @@
     base::WaitableEvent wait_event;
     thread->GetWorkerBackingThread().BackingThread().PostTask(
         FROM_HERE,
-        CrossThreadBind(&AudioWorkletThreadTest::ExecuteScriptInWorklet,
-                        CrossThreadUnretained(this),
-                        CrossThreadUnretained(thread),
-                        CrossThreadUnretained(&wait_event)));
+        CrossThreadBindOnce(&AudioWorkletThreadTest::ExecuteScriptInWorklet,
+                            CrossThreadUnretained(this),
+                            CrossThreadUnretained(thread),
+                            CrossThreadUnretained(&wait_event)));
     wait_event.Wait();
   }
 
diff --git a/third_party/blink/renderer/modules/webdatabase/database_thread.cc b/third_party/blink/renderer/modules/webdatabase/database_thread.cc
index c1dbe00..8cc4f88 100644
--- a/third_party/blink/renderer/modules/webdatabase/database_thread.cc
+++ b/third_party/blink/renderer/modules/webdatabase/database_thread.cc
@@ -62,8 +62,8 @@
   thread_ = std::make_unique<WebThreadSupportingGC>(
       ThreadCreationParams(WebThreadType::kDatabaseThread));
   thread_->PostTask(FROM_HERE,
-                    CrossThreadBind(&DatabaseThread::SetupDatabaseThread,
-                                    WrapCrossThreadPersistent(this)));
+                    CrossThreadBindOnce(&DatabaseThread::SetupDatabaseThread,
+                                        WrapCrossThreadPersistent(this)));
 }
 
 void DatabaseThread::SetupDatabaseThread() {
@@ -81,9 +81,9 @@
     termination_requested_ = true;
     cleanup_sync_ = &sync;
     STORAGE_DVLOG(1) << "DatabaseThread " << this << " was asked to terminate";
-    thread_->PostTask(FROM_HERE,
-                      CrossThreadBind(&DatabaseThread::CleanupDatabaseThread,
-                                      WrapCrossThreadPersistent(this)));
+    thread_->PostTask(
+        FROM_HERE, CrossThreadBindOnce(&DatabaseThread::CleanupDatabaseThread,
+                                       WrapCrossThreadPersistent(this)));
   }
   sync.Wait();
   // The Thread destructor blocks until all the tasks of the database
@@ -173,7 +173,7 @@
 #endif
   // Thread takes ownership of the task.
   thread_->PostTask(FROM_HERE,
-                    CrossThreadBind(&DatabaseTask::Run, std::move(task)));
+                    CrossThreadBindOnce(&DatabaseTask::Run, std::move(task)));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webgl/webgl_program.cc b/third_party/blink/renderer/modules/webgl/webgl_program.cc
index 2caeae2f..026b3e6 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_program.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_program.cc
@@ -162,8 +162,16 @@
   if (!object_)
     return;
   gpu::gles2::GLES2Interface* gl = context->ContextGL();
-  link_status_ = 0;
-  gl->GetProgramiv(object_, GL_LINK_STATUS, &link_status_);
+  GLint link_status = 0;
+  gl->GetProgramiv(object_, GL_LINK_STATUS, &link_status);
+  setLinkStatus(link_status);
+}
+
+void WebGLProgram::setLinkStatus(bool link_status) {
+  if (info_valid_)
+    return;
+
+  link_status_ = link_status;
   if (link_status_ == GL_TRUE) {
     required_transform_feedback_buffer_count_ =
         required_transform_feedback_buffer_count_after_next_link_;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_program.h b/third_party/blink/renderer/modules/webgl/webgl_program.h
index 6bc3aaf..ce15569 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_program.h
+++ b/third_party/blink/renderer/modules/webgl/webgl_program.h
@@ -42,6 +42,7 @@
   static WebGLProgram* Create(WebGLRenderingContextBase*);
 
   bool LinkStatus(WebGLRenderingContextBase*);
+  void setLinkStatus(bool link_status);
 
   bool CompletionStatus(WebGLRenderingContextBase*);
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
index 19ab020..66ffd77 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -1308,8 +1308,6 @@
   // context state.
   destruction_in_progress_ = true;
 
-  clearProgramCompletionQueries();
-
   // Now that the context and context group no longer hold on to the
   // objects they create, and now that the objects are eagerly finalized
   // rather than the context, there is very little useful work that this
@@ -1332,6 +1330,8 @@
   if (!GetDrawingBuffer())
     return;
 
+  clearProgramCompletionQueries();
+
   extensions_util_.reset();
 
   base::RepeatingClosure null_closure;
@@ -8210,6 +8210,11 @@
     GLuint available;
     ContextGL()->GetQueryObjectuivEXT(id, GL_QUERY_RESULT_AVAILABLE,
                                       &available);
+    if (available) {
+      GLuint result = 0u;
+      ContextGL()->GetQueryObjectuivEXT(id, GL_QUERY_RESULT, &result);
+      program->setLinkStatus(result);
+    }
     *completed = (available == GL_TRUE);
     return true;
   }
diff --git a/third_party/blink/renderer/modules/webusb/DEPS b/third_party/blink/renderer/modules/webusb/DEPS
index 97ae1c7..e699098f 100644
--- a/third_party/blink/renderer/modules/webusb/DEPS
+++ b/third_party/blink/renderer/modules/webusb/DEPS
@@ -1,4 +1,4 @@
 include_rules = [
-  "+device/usb/public/mojom",
+  "+services/device/public/mojom",
   "+mojo/public/cpp/bindings",
 ]
diff --git a/third_party/blink/renderer/modules/webusb/README.md b/third_party/blink/renderer/modules/webusb/README.md
index 0a64688c..a6796b2 100644
--- a/third_party/blink/renderer/modules/webusb/README.md
+++ b/third_party/blink/renderer/modules/webusb/README.md
@@ -1,11 +1,11 @@
 # WebUSB Blink Module
 
-`Source/modules/webusb` implements the renderer process details and bindings
-for the [WebUSB specification]. It communicates with the browser process through the [public Mojo interface] of `//device/usb` to the [UsbService].
+`renderer/modules/webusb` implements the renderer process details and bindings for the [WebUSB specification]. It communicates with the browser process through the [WebUsbService Mojo interface] which will connect to the DeviceService through [public Mojo interface] for the [UsbService].
 
 [WebUSB specification]: https://wicg.github.io/webusb/
-[public Mojo interface]: /device/usb/public/mojom
-[UsbService]: /device/usb/usb_service.h
+[WebUsbService Mojo interface]: ../../../public/mojom/usb/web_usb_service.mojom
+[public Mojo interface]: ../../../../../services/device/public/mojom
+[UsbService]: ../../../../../services/device/usb/usb_service.h
 
 
 ## Testing
diff --git a/third_party/blink/renderer/modules/webusb/usb.cc b/third_party/blink/renderer/modules/webusb/usb.cc
index 9ac19ab..b3a49dc1 100644
--- a/third_party/blink/renderer/modules/webusb/usb.cc
+++ b/third_party/blink/renderer/modules/webusb/usb.cc
@@ -6,8 +6,8 @@
 
 #include <utility>
 
-#include "device/usb/public/mojom/device.mojom-blink.h"
-#include "device/usb/public/mojom/device_enumeration_options.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
+#include "services/device/public/mojom/usb_enumeration_options.mojom-blink.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
diff --git a/third_party/blink/renderer/modules/webusb/usb.h b/third_party/blink/renderer/modules/webusb/usb.h
index b6b54f6..32f1d88 100644
--- a/third_party/blink/renderer/modules/webusb/usb.h
+++ b/third_party/blink/renderer/modules/webusb/usb.h
@@ -5,9 +5,9 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_H_
 
-#include "device/usb/public/mojom/device_manager.mojom-blink.h"
-#include "device/usb/public/mojom/device_manager_client.mojom-blink.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
+#include "services/device/public/mojom/usb_manager.mojom-blink.h"
+#include "services/device/public/mojom/usb_manager_client.mojom-blink.h"
 #include "third_party/blink/public/mojom/usb/web_usb_service.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/modules/webusb/usb_alternate_interface.h b/third_party/blink/renderer/modules/webusb/usb_alternate_interface.h
index da8d318..2fbe07a 100644
--- a/third_party/blink/renderer/modules/webusb/usb_alternate_interface.h
+++ b/third_party/blink/renderer/modules/webusb/usb_alternate_interface.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_ALTERNATE_INTERFACE_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_ALTERNATE_INTERFACE_H_
 
-#include "device/usb/public/mojom/device.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 
diff --git a/third_party/blink/renderer/modules/webusb/usb_configuration.cc b/third_party/blink/renderer/modules/webusb/usb_configuration.cc
index 56b0d63..e7da931f 100644
--- a/third_party/blink/renderer/modules/webusb/usb_configuration.cc
+++ b/third_party/blink/renderer/modules/webusb/usb_configuration.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/renderer/modules/webusb/usb_configuration.h"
 
-#include "device/usb/public/mojom/device.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "third_party/blink/renderer/modules/webusb/usb_device.h"
 #include "third_party/blink/renderer/modules/webusb/usb_interface.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
diff --git a/third_party/blink/renderer/modules/webusb/usb_configuration.h b/third_party/blink/renderer/modules/webusb/usb_configuration.h
index c8ed6bc..d779ab7 100644
--- a/third_party/blink/renderer/modules/webusb/usb_configuration.h
+++ b/third_party/blink/renderer/modules/webusb/usb_configuration.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_CONFIGURATION_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_CONFIGURATION_H_
 
-#include "device/usb/public/mojom/device.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 
diff --git a/third_party/blink/renderer/modules/webusb/usb_device.h b/third_party/blink/renderer/modules/webusb/usb_device.h
index 8344fa9..5fffa51 100644
--- a/third_party/blink/renderer/modules/webusb/usb_device.h
+++ b/third_party/blink/renderer/modules/webusb/usb_device.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_DEVICE_H_
 
 #include <bitset>
-#include "device/usb/public/mojom/device.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
diff --git a/third_party/blink/renderer/modules/webusb/usb_endpoint.cc b/third_party/blink/renderer/modules/webusb/usb_endpoint.cc
index 3533a94..5e0ea5c 100644
--- a/third_party/blink/renderer/modules/webusb/usb_endpoint.cc
+++ b/third_party/blink/renderer/modules/webusb/usb_endpoint.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/renderer/modules/webusb/usb_endpoint.h"
 
-#include "device/usb/public/mojom/device.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/webusb/usb_alternate_interface.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
diff --git a/third_party/blink/renderer/modules/webusb/usb_endpoint.h b/third_party/blink/renderer/modules/webusb/usb_endpoint.h
index 663a1d40..4695d515 100644
--- a/third_party/blink/renderer/modules/webusb/usb_endpoint.h
+++ b/third_party/blink/renderer/modules/webusb/usb_endpoint.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_ENDPOINT_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_ENDPOINT_H_
 
-#include "device/usb/public/mojom/device.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 
diff --git a/third_party/blink/renderer/modules/webusb/usb_interface.cc b/third_party/blink/renderer/modules/webusb/usb_interface.cc
index ff0ee42..741f161 100644
--- a/third_party/blink/renderer/modules/webusb/usb_interface.cc
+++ b/third_party/blink/renderer/modules/webusb/usb_interface.cc
@@ -4,7 +4,7 @@
 
 #include "third_party/blink/renderer/modules/webusb/usb_interface.h"
 
-#include "device/usb/public/mojom/device.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "third_party/blink/renderer/modules/webusb/usb_alternate_interface.h"
 #include "third_party/blink/renderer/modules/webusb/usb_configuration.h"
 #include "third_party/blink/renderer/modules/webusb/usb_device.h"
diff --git a/third_party/blink/renderer/modules/webusb/usb_interface.h b/third_party/blink/renderer/modules/webusb/usb_interface.h
index a8639a6..d7a3e2ff 100644
--- a/third_party/blink/renderer/modules/webusb/usb_interface.h
+++ b/third_party/blink/renderer/modules/webusb/usb_interface.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_INTERFACE_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBUSB_USB_INTERFACE_H_
 
-#include "device/usb/public/mojom/device.mojom-blink.h"
+#include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 
diff --git a/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread.cc b/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread.cc
index a33643f..a5e2602 100644
--- a/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread.cc
+++ b/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread.cc
@@ -79,8 +79,8 @@
   if (!holder)
     return;
   holder->GetThread()->BackingThread().PostTask(
-      FROM_HERE, CrossThreadBind(&CollectAllGarbageOnThreadForTesting,
-                                 CrossThreadUnretained(&done_event)));
+      FROM_HERE, CrossThreadBindOnce(&CollectAllGarbageOnThreadForTesting,
+                                     CrossThreadUnretained(&done_event)));
   done_event.Wait();
 }
 
diff --git a/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc b/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc
index 650d0f6..44d017dc 100644
--- a/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc
+++ b/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc
@@ -58,7 +58,7 @@
         std::make_unique<base::WaitableEvent>();
     thread->GetWorkerBackingThread().BackingThread().PostTask(
         FROM_HERE,
-        CrossThreadBind(
+        CrossThreadBindOnce(
             &AnimationAndPaintWorkletThreadTest::ExecuteScriptInWorklet,
             CrossThreadUnretained(this), CrossThreadUnretained(thread),
             CrossThreadUnretained(wait_event.get())));
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result_test.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result_test.cc
index e2ca15b..e2eb7e3f 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/shape_result_test.cc
+++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result_test.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/platform/fonts/shaping/shape_result.h"
 
+#include "base/containers/span.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/platform/fonts/font.h"
 #include "third_party/blink/renderer/platform/fonts/font_cache.h"
@@ -34,6 +35,14 @@
   void TestCopyRangesLatin(const ShapeResult*) const;
   void TestCopyRangesArabic(const ShapeResult*) const;
 
+  // Release the ShapeResults held inside an array of ShapeResult::ShapeRange
+  // instances.
+  static void ReleaseShapeRange(base::span<ShapeResult::ShapeRange> ranges) {
+    for (auto& range : ranges) {
+      range.target->Release();
+    }
+  }
+
   ShapeResult* CreateShapeResult(TextDirection direction) const {
     return new ShapeResult(
         direction == TextDirection::kLtr ? &font : &arabic_font, 0, direction);
@@ -79,6 +88,7 @@
   EXPECT_TRUE(CompareResultGlyphs(glyphs[1], reference_glyphs[1], 0u, 10u));
   EXPECT_TRUE(CompareResultGlyphs(glyphs[2], reference_glyphs[2], 0u, 10u));
   EXPECT_TRUE(CompareResultGlyphs(glyphs[3], reference_glyphs[3], 0u, 8u));
+  ReleaseShapeRange(ranges);
 }
 
 void ShapeResultTest::TestCopyRangesArabic(const ShapeResult* result) const {
@@ -115,6 +125,7 @@
   EXPECT_TRUE(CompareResultGlyphs(glyphs[1], reference_glyphs[1], 0u, 3u));
   EXPECT_TRUE(CompareResultGlyphs(glyphs[2], reference_glyphs[2], 0u, 3u));
   EXPECT_TRUE(CompareResultGlyphs(glyphs[3], reference_glyphs[3], 0u, 5u));
+  ReleaseShapeRange(ranges);
 }
 
 TEST_F(ShapeResultTest, CopyRangeLatin) {
@@ -189,6 +200,7 @@
   EXPECT_TRUE(CompareResultGlyphs(glyphs[0], reference_glyphs[0], 0u, 13u));
   EXPECT_TRUE(CompareResultGlyphs(glyphs[1], reference_glyphs[1], 0u, 3u));
   EXPECT_TRUE(CompareResultGlyphs(glyphs[2], reference_glyphs[2], 0u, 6u));
+  ReleaseShapeRange(ranges);
 }
 
 TEST_F(ShapeResultTest, CopyRangeArabic) {
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
index be091cb4..e07a8cc 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
@@ -119,8 +119,9 @@
     dark_mode_flags.setColorFilter(default_filter_);
   } else {
     auto invertedColor = ApplyIfNeeded(flags.getColor());
-    dark_mode_flags.setColor(SkColorSetRGB(
-        invertedColor.Red(), invertedColor.Green(), invertedColor.Blue()));
+    dark_mode_flags.setColor(
+        SkColorSetARGB(invertedColor.Alpha(), invertedColor.Red(),
+                       invertedColor.Green(), invertedColor.Blue()));
   }
 
   return base::make_optional<cc::PaintFlags>(std::move(dark_mode_flags));
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.h b/third_party/blink/renderer/platform/graphics/graphics_layer.h
index e4a9c8fe..ee45874 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_layer.h
+++ b/third_party/blink/renderer/platform/graphics/graphics_layer.h
@@ -225,8 +225,10 @@
                             bool prevent_contents_opaque_changes) {
     SetContentsTo(layer, prevent_contents_opaque_changes);
   }
-  bool HasContentsLayer() const { return contents_layer_; }
-  cc::Layer* ContentsLayer() const { return contents_layer_; }
+  bool HasContentsLayer() const { return ContentsLayer(); }
+  cc::Layer* ContentsLayer() const {
+    return const_cast<GraphicsLayer*>(this)->ContentsLayerIfRegistered();
+  }
 
   // For hosting this GraphicsLayer in a native layer hierarchy.
   cc::PictureLayer* CcLayer() const;
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc b/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc
index 1da22089..68593d4d 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc
@@ -173,4 +173,16 @@
   EXPECT_FALSE(cc_layer->GetPicture());
 }
 
+TEST_P(GraphicsLayerTest, ContentsLayer) {
+  auto& graphics_layer = layers_.graphics_layer();
+  auto contents_layer = cc::Layer::Create();
+  GraphicsLayer::RegisterContentsLayer(contents_layer.get());
+  graphics_layer.SetContentsToCcLayer(contents_layer.get(), true);
+  EXPECT_TRUE(graphics_layer.HasContentsLayer());
+  EXPECT_EQ(contents_layer.get(), graphics_layer.ContentsLayer());
+  GraphicsLayer::UnregisterContentsLayer(contents_layer.get());
+  EXPECT_FALSE(graphics_layer.HasContentsLayer());
+  EXPECT_EQ(nullptr, graphics_layer.ContentsLayer());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index def6f6bb..9066957 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -1021,8 +1021,7 @@
       break;
   }
   DCHECK(resource);
-  // TODO(yoav): turn to a DCHECK. See https://crbug.com/690632
-  CHECK_EQ(resource->GetType(), resource_type);
+  DCHECK_EQ(resource->GetType(), resource_type);
 
   if (policy != kUse)
     resource->VirtualTimePauser() = std::move(pauser);
@@ -1130,8 +1129,6 @@
     const ResourceLoaderOptions& options) {
   DCHECK(!GetProperties().IsDetached());
   DCHECK(loader_factory_);
-  if (!IsMainThread())
-    Context().CountUsage(mojom::WebFeature::kOffMainThreadFetch);
   return loader_factory_->CreateURLLoader(request, options, task_runner_);
 }
 
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index ecdf61a..87b4dfa 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1415,10 +1415,6 @@
       status: "experimental",
     },
     {
-      name: "TextUnderlinePositionLeftRight",
-      status: "stable",
-    },
-    {
       name: "TimerThrottlingForBackgroundTabs",
       status: "stable",
     },
diff --git a/third_party/blink/renderer/platform/scheduler/common/thread.cc b/third_party/blink/renderer/platform/scheduler/common/thread.cc
index 661a3b2..cec9b73 100644
--- a/third_party/blink/renderer/platform/scheduler/common/thread.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/thread.cc
@@ -68,7 +68,8 @@
 ThreadCreationParams::ThreadCreationParams(WebThreadType thread_type)
     : thread_type(thread_type),
       name(GetNameForThreadType(thread_type)),
-      frame_or_worker_scheduler(nullptr) {}
+      frame_or_worker_scheduler(nullptr),
+      supports_gc(false) {}
 
 ThreadCreationParams& ThreadCreationParams::SetThreadNameForTest(
     const char* thread_name) {
@@ -96,6 +97,7 @@
   // system is under the high pressure. Note that the main browser thread also
   // runs with same priority. (see: crbug.com/734539)
   params.thread_priority = base::ThreadPriority::DISPLAY;
+  params.supports_gc = true;
   return CreateThread(params);
 }
 
diff --git a/third_party/blink/renderer/platform/scheduler/public/thread.h b/third_party/blink/renderer/platform/scheduler/public/thread.h
index a309e5c7..63807af3 100644
--- a/third_party/blink/renderer/platform/scheduler/public/thread.h
+++ b/third_party/blink/renderer/platform/scheduler/public/thread.h
@@ -64,6 +64,7 @@
   const char* name;
   FrameOrWorkerScheduler* frame_or_worker_scheduler;  // NOT OWNED
   base::ThreadPriority thread_priority = base::ThreadPriority::NORMAL;
+  bool supports_gc = false;
 };
 
 // The interface of a thread recognized by Blink.
diff --git a/third_party/blink/renderer/platform/scheduler/worker/DEPS b/third_party/blink/renderer/platform/scheduler/worker/DEPS
index 802f7cb1..5fc733e 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/DEPS
+++ b/third_party/blink/renderer/platform/scheduler/worker/DEPS
@@ -4,5 +4,10 @@
   ],
   "worker_thread.h": [
     "+base/threading/simple_thread.h",
+    "+third_party/blink/renderer/platform/heap/gc_task_runner.h",
+  ],
+  "worker_thread.cc": [
+    "+third_party/blink/renderer/platform/memory_pressure_listener.h",
+    "+third_party/blink/renderer/platform/heap/gc_task_runner.h",
   ],
 }
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_thread.cc
index edf6775..2226b54 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread.cc
@@ -17,6 +17,7 @@
 #include "base/task/sequence_manager/task_queue.h"
 #include "base/time/default_tick_clock.h"
 #include "third_party/blink/public/platform/task_type.h"
+#include "third_party/blink/renderer/platform/memory_pressure_listener.h"
 #include "third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.h"
 #include "third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h"
 
@@ -28,7 +29,8 @@
       worker_scheduler_proxy_(params.frame_or_worker_scheduler
                                   ? std::make_unique<WorkerSchedulerProxy>(
                                         params.frame_or_worker_scheduler)
-                                  : nullptr) {
+                                  : nullptr),
+      supports_gc_(params.supports_gc) {
   auto non_main_thread_scheduler_factory = base::BindOnce(
       &WorkerThread::CreateNonMainThreadScheduler, base::Unretained(this));
   base::SimpleThread::Options options;
@@ -36,9 +38,17 @@
   thread_ = std::make_unique<SimpleThreadImpl>(
       params.name ? params.name : std::string(), options,
       std::move(non_main_thread_scheduler_factory));
+  if (supports_gc_) {
+    MemoryPressureListenerRegistry::Instance().RegisterThread(
+        const_cast<scheduler::WorkerThread*>(this));
+  }
 }
 
 WorkerThread::~WorkerThread() {
+  if (supports_gc_) {
+    MemoryPressureListenerRegistry::Instance().UnregisterThread(
+        const_cast<scheduler::WorkerThread*>(this));
+  }
   thread_->Quit();
   thread_->Join();
 }
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread.h b/third_party/blink/renderer/platform/scheduler/worker/worker_thread.h
index 9e46681e..43267bd0 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread.h
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread.h
@@ -15,6 +15,7 @@
 #include "base/task/sequence_manager/sequence_manager.h"
 #include "base/threading/simple_thread.h"
 #include "third_party/blink/public/platform/web_private_ptr.h"
+#include "third_party/blink/renderer/platform/heap/gc_task_runner.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread.h"
 
 namespace blink {
@@ -113,6 +114,8 @@
   std::unique_ptr<SimpleThreadImpl> thread_;
   const WebThreadType thread_type_;
   std::unique_ptr<scheduler::WorkerSchedulerProxy> worker_scheduler_proxy_;
+  bool supports_gc_;
+  std::unique_ptr<GCTaskRunner> gc_task_runner_;
 };
 
 }  // namespace scheduler
diff --git a/third_party/blink/renderer/platform/web_thread_supporting_gc.cc b/third_party/blink/renderer/platform/web_thread_supporting_gc.cc
index 8556fd86..4b65391c 100644
--- a/third_party/blink/renderer/platform/web_thread_supporting_gc.cc
+++ b/third_party/blink/renderer/platform/web_thread_supporting_gc.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "base/memory/ptr_util.h"
-#include "third_party/blink/renderer/platform/memory_pressure_listener.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
 #include "third_party/blink/renderer/platform/wtf/threading.h"
 
@@ -22,17 +21,16 @@
   if (params.thread_type == WebThreadType::kAudioWorkletThread) {
     thread_ = Thread::CreateWebAudioThread();
   } else {
-    thread_ = Thread::CreateThread(params);
+    ThreadCreationParams gc_enabled_params = params;
+    gc_enabled_params.supports_gc = true;
+    thread_ = Thread::CreateThread(gc_enabled_params);
   }
-  MemoryPressureListenerRegistry::Instance().RegisterThread(thread_.get());
 }
 
 WebThreadSupportingGC::~WebThreadSupportingGC() {
   DETACH_FROM_THREAD(thread_checker_);
-  Thread* thread_pointer = thread_.get();
   // blink::Thread's destructor blocks until all the tasks are processed.
   thread_.reset();
-  MemoryPressureListenerRegistry::Instance().UnregisterThread(thread_pointer);
 }
 
 void WebThreadSupportingGC::InitializeOnThread() {
diff --git a/third_party/blink/renderer/platform/web_thread_supporting_gc.h b/third_party/blink/renderer/platform/web_thread_supporting_gc.h
index 275dd9c..aafd3ec6 100644
--- a/third_party/blink/renderer/platform/web_thread_supporting_gc.h
+++ b/third_party/blink/renderer/platform/web_thread_supporting_gc.h
@@ -44,12 +44,13 @@
     thread_->GetTaskRunner()->PostDelayedTask(location, std::move(task), delay);
   }
 
-  void PostTask(const base::Location& location, CrossThreadClosure task) {
+  void PostTask(const base::Location& location,
+                WTF::CrossThreadOnceClosure task) {
     PostCrossThreadTask(*thread_->GetTaskRunner(), location, std::move(task));
   }
 
   void PostDelayedTask(const base::Location& location,
-                       CrossThreadClosure task,
+                       WTF::CrossThreadOnceClosure task,
                        TimeDelta delay) {
     PostDelayedCrossThreadTask(*thread_->GetTaskRunner(), location,
                                std::move(task), delay);
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 25c85c7..a94f0ac9 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1474,6 +1474,7 @@
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/layout-algorithm_algo-cross-line-002.html [ Failure ]
 crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/negative-margins-001.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/order_value.html [ Failure ]
+crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/overflow-top-left.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/percentage-heights-000.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/percentage-heights-002.html [ Failure ]
 crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/percentage-heights-003.html [ Failure ]
@@ -5624,3 +5625,9 @@
 
 # Sheriff 2019-05-17
 crbug.com/964239 virtual/threaded/external/wpt/css/css-scroll-snap/scroll-margin.html [ Pass Failure ]
+
+# Sheriff 2019-05-20
+crbug.com/963739 [ Fuchsia ] synthetic_gestures/smooth-scroll-tiny-delta.html [ Pass Timeout ]
+crbug.com/964158 [ Linux ] external/wpt/payment-handler/change-payment-method.https.html [ Pass Crash ]
+crbug.com/899710 [ Linux ] virtual/threaded/http/tests/devtools/tracing/timeline-paint/timeline-paint-with-layout-invalidations.js [ Pass Timeout ]
+crbug.com/964239 external/wpt/css/css-scroll-snap/scroll-margin.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/custom-elements/form-validation-bubble-anchor.html b/third_party/blink/web_tests/custom-elements/form-validation-bubble-anchor.html
new file mode 100644
index 0000000..1f663531
--- /dev/null
+++ b/third_party/blink/web_tests/custom-elements/form-validation-bubble-anchor.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<style>
+control-element {
+  display: inline-block;
+  width: 10em;
+  height: 2em;
+}
+</style>
+<body>
+<script>
+class ControlElement extends HTMLElement {
+  static formAssociated = true;
+  constructor() {
+    super();
+    this.i = this.attachInternals();
+  }
+}
+customElements.define('control-element', ControlElement);
+
+test(() => {
+  let control = new ControlElement();
+  assert_throws('NotFoundError', () => {
+    control.i.setValidity({patternMismatch: true}, 'p', document.body);
+  }, 'not a descendant');
+  assert_throws('NotFoundError', () => {
+    control.i.setValidity({patternMismatch: true}, 'p', control);
+  }, 'self');
+  control.innerHTML = '<span>';
+  assert_throws('NotFoundError', () => {
+    control.i.setValidity({patternMismatch: true}, 'p', control);
+  }, 'self with a child');
+
+  let shadow = control.attachShadow({mode:'open'});
+  let anchor = document.createElement('div');
+  shadow.appendChild(anchor);
+  control.i.setValidity({badInput: true}, 'b', anchor);
+}, 'setValidity() should throw if the anchor argument is not a shadow-including-descendant of the target');
+
+async_test(t => {
+  assert_own_property(window, 'internals');
+  document.body.insertAdjacentHTML('afterbegin', '<control-element tabindex=0><input><button></button></control-element>');
+  let control = document.body.querySelector('control-element');
+  let innerField = control.querySelector('input');
+  control.i.setValidity({tooLong: true}, 'Too long', innerField);
+  control.i.reportValidity();
+  assert_false(internals.isValidationMessageVisible(control));
+  assert_true(internals.isValidationMessageVisible(innerField));
+  assert_equals(document.activeElement, innerField);
+
+  let innerButton = control.querySelector('button');
+  control.i.setValidity({tooLong: true}, 'Too long', innerButton);
+  // Validation bubble closes if a different anchor is set.
+  assert_false(internals.isValidationMessageVisible(innerField));
+  assert_false(internals.isValidationMessageVisible(innerButton));
+
+  control.i.reportValidity();
+  assert_false(internals.isValidationMessageVisible(innerField));
+  assert_true(internals.isValidationMessageVisible(innerButton));
+  assert_equals(document.activeElement, innerButton);
+
+  innerButton.blur();
+  requestAnimationFrame(t.step_func_done(() => {
+    assert_false(internals.isValidationMessageVisible(innerField));
+    assert_false(internals.isValidationMessageVisible(innerButton));
+  }));
+}, 'Validation bubble is shown on the anchor element, and removing focus ' +
+    'from the anchor closes the validation bubble.');
+</script>
+</body>
diff --git a/third_party/blink/web_tests/custom-elements/tentative/ElementInternals.html b/third_party/blink/web_tests/custom-elements/tentative/ElementInternals.html
deleted file mode 100644
index 50dce26..0000000
--- a/third_party/blink/web_tests/custom-elements/tentative/ElementInternals.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<body>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-test(() => {
-  class MyElement1 extends HTMLElement {}
-  customElements.define('my-element1', MyElement1);
-  const element = new MyElement1();
-  const internals = element.attachInternals();
-
-  assert_throws('NotSupportedError', () => { internals.setFormValue(''); });
-  assert_throws('NotSupportedError', () => { internals.form; });
-  assert_throws('NotSupportedError', () => { internals.setValidity({}); });
-  assert_throws('NotSupportedError', () => { internals.willValidate; });
-  assert_throws('NotSupportedError', () => { internals.validity; });
-  assert_throws('NotSupportedError', () => { internals.validationMessage; });
-  assert_throws('NotSupportedError', () => { internals.checkValidity(); });
-  assert_throws('NotSupportedError', () => { internals.reportValidity(); });
-  assert_throws('NotSupportedError', () => { internals.labels; });
-}, 'Form-related operations and attributes should throw NotSupportedErrors' +
-     ' for non-form-associated custom elements.');
-</script>
-</body>
diff --git a/third_party/blink/web_tests/custom-elements/tentative/form-associated-disabled.html b/third_party/blink/web_tests/custom-elements/tentative/form-associated-disabled.html
deleted file mode 100644
index 5bab4b23..0000000
--- a/third_party/blink/web_tests/custom-elements/tentative/form-associated-disabled.html
+++ /dev/null
@@ -1,104 +0,0 @@
-<!DOCTYPE html>
-<body>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-class MyControl extends HTMLElement {
-  static get formAssociated() { return true; }
-
-  constructor() {
-    super();
-    this.internals_ = this.attachInternals();
-    this.internals_.setFormValue('my-control-value');
-    this.disabledHistory_ = [];
-  }
-
-  formDisabledCallback(isDisabled) {
-    this.disabledHistory_.push(isDisabled);
-  }
-  disabledHistory() {
-    return this.disabledHistory_;
-  }
-}
-customElements.define('my-control', MyControl);
-
-test(() => {
-  const control = new MyControl();
-  assert_true(control.matches(':enabled'));
-  assert_false(control.matches(':disabled'));
-
-  control.setAttribute('disabled', '');
-  assert_false(control.matches(':enabled'));
-  assert_true(control.matches(':disabled'));
-
-  control.removeAttribute('disabled', '');
-  assert_true(control.matches(':enabled'));
-  assert_false(control.matches(':disabled'));
-
-  assert_array_equals(control.disabledHistory(), [true, false]);
-}, 'Adding/removing disabled content attribute');
-
-test(() => {
-  const container = document.createElement('fieldset');
-  container.innerHTML = '<fieldset><fieldset><my-control></my-control></fieldset></fieldset>';
-  const middleFieldset = container.firstChild;
-  const control = container.querySelector('my-control');
-
-  assert_true(control.matches(':enabled'));
-  assert_false(control.matches(':disabled'));
-
-  middleFieldset.disabled = true;
-  assert_false(control.matches(':enabled'));
-  assert_true(control.matches(':disabled'));
-
-  middleFieldset.disabled = false;
-  assert_true(control.matches(':enabled'));
-  assert_false(control.matches(':disabled'));
-
-  container.disabled = true;
-  assert_false(control.matches(':enabled'));
-  assert_true(control.matches(':disabled'));
-  control.remove();
-  assert_true(control.matches(':enabled'));
-  assert_false(control.matches(':disabled'));
-
-  middleFieldset.appendChild(control);
-  assert_false(control.matches(':enabled'));
-  assert_true(control.matches(':disabled'));
-
-  assert_array_equals(control.disabledHistory(), [true, false, true, false, true]);
-}, 'Relationship with FIELDSET');
-
-test(() => {
-  const form = document.createElement('form');
-  document.body.appendChild(form);
-  form.innerHTML = '<my-control name="n1" disabled></my-control><input name="n2">'
-  const formData = new FormData(form);
-  assert_equals(formData.get('n1'), null);
-}, 'A disabled form-associated custom element should not submit its value');
-
-test(() => {
-  const control = new MyControl();
-  document.body.appendChild(control);
-  control.setAttribute('tabindex', '0');
-  control.setAttribute('disabled', '');
-  control.focus();
-  assert_not_equals(document.activeElement, control);
-
-  control.removeAttribute('disabled');
-  control.focus();
-  assert_equals(document.activeElement, control);
-}, 'Disabled attribute affects focus-capability');
-
-test(() => {
-  const container = document.createElement('div');
-  document.body.appendChild(container);
-  // inneHTML upgrades my-control at its CEReacions timing.
-  container.innerHTML = '<my-control disabled>';
-  assert_array_equals(container.firstChild.disabledHistory(), [true]);
-
-  container.innerHTML = '<fieldset disabled><my-control>';
-  assert_array_equals(container.querySelector('my-control').disabledHistory(), [true]);
-}, 'Upgrading an element with disabled content attribute');
-</script>
-</body>
diff --git a/third_party/blink/web_tests/custom-elements/tentative/form-associated-reset.html b/third_party/blink/web_tests/custom-elements/tentative/form-associated-reset.html
deleted file mode 100644
index 276c455f..0000000
--- a/third_party/blink/web_tests/custom-elements/tentative/form-associated-reset.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<body>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-class MyControl extends HTMLElement {
-  static get formAssociated() { return true; }
-
-  constructor() {
-    super();
-    this.resetCalled_ = false;
-  }
-
-  formResetCallback() {
-    this.resetCalled_ = true;
-  }
-  get resetCalled() { return this.resetCalled_; }
-}
-customElements.define('my-control', MyControl);
-
-test(() => {
-  document.body.insertAdjacentHTML('beforeend',
-      '<form><my-control></my-control><output>default</output></form>');
-  let form = document.body.lastChild;
-  let custom = form.firstChild;
-  let output = form.lastChild;
-  output.value = 'updated';
-  output.addEventListener('DOMSubtreeModified', () => {
-    assert_false(custom.resetCalled, 'formResetCallback should not be ' +
-                 'called before built-in control\'s reset');
-  });
-  form.reset();
-  assert_true(custom.resetCalled);
-}, 'form.reset(): formResetCallback is called after reset of the last ' +
-   'built-in form control and before the next statement.');
-
-let t = async_test('Clicking a reset button invokes formResetCallback in a ' +
-                   'microtask');
-t.step(() => {
-  document.body.insertAdjacentHTML('beforeend',
-      '<form><my-control></my-control><input type=reset></form>');
-  let form = document.body.lastChild;
-  let custom = form.firstChild;
-  let resetButton = form.lastChild;
-  assert_false(custom.resetCalled);
-  resetButton.click();
-  assert_false(custom.resetCalled);
-  window.queueMicrotask(t.step_func_done(() => {
-    assert_true(custom.resetCalled);
-  }));
-});
-</script>
-</body>
diff --git a/third_party/blink/web_tests/custom-elements/tentative/form-association.html b/third_party/blink/web_tests/custom-elements/tentative/form-association.html
deleted file mode 100644
index d565fcf..0000000
--- a/third_party/blink/web_tests/custom-elements/tentative/form-association.html
+++ /dev/null
@@ -1,192 +0,0 @@
-<!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-class PreDefined extends HTMLElement {
-  static get formAssociated() { return true; }
-
-  constructor() {
-    super();
-    this.internals_ = this.attachInternals();
-    this.formHistory_ = [];
-  }
-
-  formAssociatedCallback(nullableForm) {
-    this.formHistory_.push(nullableForm);
-  }
-  formHistory() {
-    return this.formHistory_;
-  }
-
-  get form() {
-    return this.internals_.form;
-  }
-}
-customElements.define('pre-defined', PreDefined);
-</script>
-<div id="container">
-
-<fieldset id="fs1">
-<form id="form1">
-<input>
-<pre-defined id="pd1"></pre-defined>
-<select></select>
-</form>
-</fieldset>
-
-<fieldset id="fs2">
-<pre-defined id="pd2" form="form2"></pre-defined>
-<form id="form2">
-<input>
-<select></select>
-</form>
-</fieldset>
-<pre-defined id="pd3" form="form2"></pre-defined>
-
-<table>
-<fieldset id="fs3">
-<form id="form3">
-<tr><td><select></select></tr>
-<tr><td><pre-defined id="pd4"></pre-defined></tr>
-<tr><td><input></tr>
-</form>  <!-- The end tag is bogus. -->
-</fieldset>  <!-- The end tag is bogus. -->
-<table>
-
-</div>
-
-<script>
-const $ = document.querySelector.bind(document);
-
-test(() => {
-  let controls = $('#form1').elements;
-  assert_equals(controls.length, 3);
-  assert_equals(controls[1], $('#pd1'), 'form.elements');
-  assert_equals($('#pd1').form, $('#form1'));
-  assert_array_equals($('#pd1').formHistory(), [$('#form1')]);
-  assert_equals($('#fs1').elements[1], $('#pd1'), 'fieldset.elements');
-
-  controls = $('#form2').elements;
-  assert_equals(controls.length, 4);
-  assert_equals(controls[0], $('#pd2'), 'form.elements');
-  assert_equals(controls[3], $('#pd3'));
-  assert_equals($('#pd2').form, $('#form2'));
-  assert_equals($('#pd3').form, $('#form2'));
-  assert_array_equals($('#pd2').formHistory(), [$('#form2')]);
-  assert_array_equals($('#pd3').formHistory(), [$('#form2')]);
-  controls = $('#fs2').elements;
-  assert_equals(controls.length, 3);
-  assert_equals(controls[0], $('#pd2'), 'fieldset.elements');
-
-  controls = $('#form3').elements;
-  assert_equals(controls.length, 2);
-  assert_not_equals(controls[1], $('#pd4'));
-  assert_equals($('#fs3').elements.length, 0);
-}, 'Associate by parser, customized at element creation');
-
-test(() => {
-  $('#container').innerHTML = '<fieldset id="fs1"><form id="form1"><input><will-be-defined id="wbd1">' +
-      '</will-be-defined><select></select></form></fieldset>' +
-      '<fieldset id="fs2"><will-be-defined id="wbd2" form="form2"></will-be-defined>' +
-      '<form id="form2"></form></fieldset><will-be-defined id="wbd3" form="form2"></will-be-defined>';
-  let controls = $('#form1').elements;
-  assert_equals(controls.length, 2);
-  assert_not_equals(controls[1], $('#wbd1'));
-  controls = $('#fs1').elements;
-  assert_equals(controls.length, 2);
-  assert_not_equals(controls[1], $('#wbd1'));
-  
-  assert_equals($('#form2').elements.length, 0);
-  assert_equals($('#fs2').elements.length, 0);
-
-  class WillBeDefined extends HTMLElement {
-    static get formAssociated() { return true; }
-
-    constructor() {
-      super();
-      this.internals_ = this.attachInternals();
-      this.formHistory_ = [];
-    }
-
-    formAssociatedCallback(nullableForm) {
-      this.formHistory_.push(nullableForm);
-    }
-    formHistory() {
-      return this.formHistory_;
-    }
-
-    get form() {
-      return this.internals_.form;
-    }
-  }
-  customElements.define('will-be-defined', WillBeDefined);
-  customElements.upgrade(container);
-
-  controls = $('#form1').elements;
-  assert_equals(controls.length, 3, 'form.elements.length');
-  assert_equals(controls[1], $('#wbd1'));
-  assert_equals($('#wbd1').form, $('#form1'));
-  controls = $('#fs1').elements;
-  assert_equals(controls.length, 3, 'fieldset.elements.length');
-  assert_equals(controls[1], $('#wbd1'));
-  
-  controls = $('#form2').elements;
-  assert_equals($('#wbd2').form, $('#form2'));
-  assert_equals($('#wbd3').form, $('#form2'));
-  assert_array_equals($('#wbd2').formHistory(), [$('#form2')]);
-  assert_array_equals($('#wbd3').formHistory(), [$('#form2')]);
-  assert_equals(controls.length, 2, 'form.elements.length');
-  assert_equals(controls[0], $('#wbd2'));
-  assert_equals(controls[1], $('#wbd3'));
-  controls = $('#fs2').elements;
-  assert_equals(controls.length, 1, 'fieldset.elements.length');
-  assert_equals(controls[0], $('#wbd2'));
-}, 'Parsed, connected, then upgraded');
-
-test(() => {
-  $('#container').innerHTML = '<fieldset id="fs1"><form id="form1"><input><pre-defined id="pd1">' +
-      '</pre-defined><select></select></form></fieldset>' +
-      '<fieldset id="fs2"><pre-defined id="pd2" form="form2"></pre-defined>' +
-      '<form id="form2"></form></fieldset><pre-defined id="pd3" form="form2"></pre-defined>';
-
-  const pd1 = $('#pd1');
-  assert_equals($('#form1').elements.length, 3, 'form.elements.length before removal');
-  assert_equals($('#fs1').elements.length, 3, 'fildset.elements.length before removal');
-  pd1.remove();
-  assert_equals(pd1.form, null);
-  assert_array_equals(pd1.formHistory(), [$('#form1'), null]);
-  assert_equals($('#form1').elements.length, 2, 'form.elements.length after removal');
-  assert_equals($('#fs1').elements.length, 2, 'fildset.elements.length after removal');
-
-  const pd2 = $('#pd2');
-  const pd3 = $('#pd3');
-  assert_equals($('#form2').elements.length, 2, 'form.elements.length before removal');
-  assert_equals($('#fs2').elements.length, 1, 'fieldset.elements.length before removal');
-  pd2.remove();
-  pd3.remove();
-  assert_equals(pd2.form, null);
-  assert_equals(pd3.form, null);
-  assert_array_equals(pd2.formHistory(), [$('#form2'), null]);
-  assert_array_equals(pd3.formHistory(), [$('#form2'), null]);
-  assert_equals($('#form2').elements.length, 0, 'form.elements.length after removal');
-  assert_equals($('#fs2').elements.length, 0, 'fieldset.elements.length after removal');
-}, 'Disassociation');
-
-test(() => {
-  $('#container').innerHTML = '<form id="form1"></form>' +
-      '<pre-defined id="pd1"></pre-defined><form id="form2"></form>';
-  const pd1 = $('#pd1');
-  const form1 = $('#form1');
-  const form2 = $('#form2');
-  assert_equals(pd1.form, null);
-
-  pd1.setAttribute('form', 'form1');
-  assert_equals(pd1.form, form1);
-
-  pd1.setAttribute('form', 'form2');
-  assert_equals(pd1.form, form2);
-
-  $('#container').innerHTML = '';
-  assert_equals(pd1.form, null);
-}, 'Updating "form" content attribute');
-</script>
diff --git a/third_party/blink/web_tests/custom-elements/tentative/form-label.html b/third_party/blink/web_tests/custom-elements/tentative/form-label.html
deleted file mode 100644
index f674827..0000000
--- a/third_party/blink/web_tests/custom-elements/tentative/form-label.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<body>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<div id="container"></div>
-<script>
-class MyControl extends HTMLElement {
-  static get formAssociated() { return true; }
-
-  constructor() {
-    super();
-    this.internals_ = this.attachInternals();
-  }
-  get i() { return this.internals_; }
-}
-customElements.define('my-control', MyControl);
-const container = document.querySelector('#container');
-
-test(() => {
-  container.innerHTML = '<label><span><my-control></my-control></span></label>';
-  let label = container.querySelector('label');
-  let control = container.querySelector('my-control');
-  assert_equals(label.control, control);
-  assert_equals(control.i.labels[0], label);
-
-  container.innerHTML = '<label for="mc"></label><form><my-control id="mc"></my-control></form>';
-  label = container.querySelector('label');
-  control = container.querySelector('my-control');
-  assert_equals(label.control, control);
-  assert_equals(label.form, control.i.form);
-  assert_equals(control.i.labels[0], label);
-
-  container.innerHTML = '<label for="mc"></label><label for="mc"><my-control id="mc">';
-  const labels = container.querySelectorAll('label');
-  control = container.querySelector('my-control');
-  assert_equals(control.i.labels[0], labels[0]);
-  assert_equals(control.i.labels[1], labels[1]);
-}, 'LABEL association');
-
-test(() => {
-  container.innerHTML = '<label for="mc"></label><form><my-control id="mc"></my-control></form>';
-  const control = container.querySelector('my-control');
-  let clickCount = 0;
-  control.addEventListener('click', e => { ++clickCount; });
-  container.querySelector('label').click();
-  assert_equals(clickCount, 1);
-}, 'LABEL click');
-</script>
-</body>
diff --git a/third_party/blink/web_tests/custom-elements/tentative/form-submission.html b/third_party/blink/web_tests/custom-elements/tentative/form-submission.html
deleted file mode 100644
index 56db047..0000000
--- a/third_party/blink/web_tests/custom-elements/tentative/form-submission.html
+++ /dev/null
@@ -1,120 +0,0 @@
-<!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<div id="container"></div>
-<script>
-class MyControl extends HTMLElement {
-  static get formAssociated() { return true; }
-
-  constructor() {
-    super();
-    this.internals_ = this.attachInternals();
-    this.value_ = '';
-  }
-
-  get value() {
-    return this.value_;
-  }
-  set value(str) {
-    this.internals_.setFormValue(str);
-    this.value_ = str;
-  }
-  setValues(nameValues) {
-    const formData = new FormData();
-    for (let p of nameValues) {
-      formData.append(p[0], p[1]);
-    }
-    this.internals_.setFormValue(formData);
-  }
-}
-customElements.define('my-control', MyControl);
-const $ = document.querySelector.bind(document);
-
-function submitPromise(t) {
-  return new Promise((resolve, reject) => {
-    const iframe = $('iframe');
-    iframe.onload = () => resolve(iframe.contentWindow.location.search);
-    iframe.onerror = () => reject();
-    $('form').submit();
-  });
-}
-
-promise_test(t => {
-  $('#container').innerHTML = '<form action="../../external/wpt/common/blank.html" target="if1">' +
-      '<input name=name-pd1 value="value-pd1">' +
-      '<my-control></my-control>' +
-      '</form>' +
-      '<iframe name="if1"></iframe>';
-  return submitPromise(t).then(query => {
-    assert_equals(query, '?name-pd1=value-pd1');
-  });
-}, 'Single value - name is missing');
-
-promise_test(t => {
-  $('#container').innerHTML = '<form action="../../external/wpt/common/blank.html" target="if1">' +
-      '<input name=name-pd1 value="value-pd1">' +
-      '<my-control name=""></my-control>' +
-      '<input name=name-pd2 value="value-pd2">' +
-      '</form>' +
-      '<iframe name="if1"></iframe>';
-  $('my-control').value = 'value-ce1';
-  return submitPromise(t).then(query => {
-    assert_equals(query, '?name-pd1=value-pd1&name-pd2=value-pd2');
-  });
-}, 'Single value - empty name exists');
-
-promise_test(t => {
-  $('#container').innerHTML = '<form action="../../external/wpt/common/blank.html" target="if1">' +
-      '<input name=name-pd1 value="value-pd1">' +
-      '<my-control name="name-ce1"></my-control>' +
-      '<my-control name="name-ce2"></my-control>' +
-      '</form>' +
-      '<iframe name="if1"></iframe>';
-  $('my-control').value = 'value-ce1';
-  return submitPromise(t).then(query => {
-    assert_equals(query, '?name-pd1=value-pd1&name-ce1=value-ce1&name-ce2=');
-  });
-}, 'Single value - Non-empty name exists');
-
-promise_test(t => {
-  $('#container').innerHTML = '<form action="../../external/wpt/common/blank.html" target="if1">' +
-      '<input name=name-pd1 value="value-pd1">' +
-      '<my-control name="name-ce1"></my-control>' +
-      '<my-control name="name-ce2"></my-control>' +
-      '</form>' +
-      '<iframe name="if1"></iframe>';
-  $('my-control').value = null;
-  return submitPromise(t).then(query => {
-    assert_equals(query, '?name-pd1=value-pd1&name-ce2=');
-  });
-}, 'Null value should submit nothing');
-
-promise_test(t => {
-  $('#container').innerHTML = '<form action="../../external/wpt/common/blank.html" target="if1">' +
-      '<input name=name-pd1 value="value-pd1">' +
-      '<my-control name=name-ce1></my-control>' +
-      '</form>' +
-      '<iframe name="if1"></iframe>';
-  $('my-control').value = 'value-ce1';
-  $('my-control').setValues([]);
-  $('my-control').setValues([['sub1', 'subvalue1'],
-                             ['sub2', 'subvalue2'],
-                             ['sub2', 'subvalue3']]);
-  return submitPromise(t).then(query => {
-    assert_equals(query, '?name-pd1=value-pd1&sub1=subvalue1&sub2=subvalue2&sub2=subvalue3');
-  });
-}, 'Multiple values - name content attribute is ignored');
-
-promise_test(t => {
-  $('#container').innerHTML = '<form action="../../external/wpt/common/blank.html" target="if1">' +
-      '<input name=name-pd1 value="value-pd1">' +
-      '<my-control name=name-ce1></my-control>' +
-      '</form>' +
-      '<iframe name="if1"></iframe>';
-  $('my-control').value = 'value-ce1';
-  $('my-control').setValues([]);
-  return submitPromise(t).then(query => {
-    assert_equals(query, '?name-pd1=value-pd1');
-  });
-}, 'setFormValue with an empty FormData should submit nothing');
-</script>
diff --git a/third_party/blink/web_tests/custom-elements/tentative/form-validation.html b/third_party/blink/web_tests/custom-elements/tentative/form-validation.html
deleted file mode 100644
index 4c6bb50..0000000
--- a/third_party/blink/web_tests/custom-elements/tentative/form-validation.html
+++ /dev/null
@@ -1,224 +0,0 @@
-<!DOCTYPE html>
-<body>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<div id="container"></div>
-<script>
-class MyControl extends HTMLElement {
-  static get formAssociated() { return true; }
-
-  constructor() {
-    super();
-    this.internals_ = this.attachInternals();
-  }
-  get i() { return this.internals_; }
-}
-customElements.define('my-control', MyControl);
-
-test(() => {
-  const control = new MyControl();
-  assert_true(control.i.willValidate, 'default value is true');
-
-  const datalist = document.createElement('datalist');
-  datalist.appendChild(control);
-  assert_false(control.i.willValidate, 'false in DATALIST');
-
-  const fieldset = document.createElement('fieldset');
-  fieldset.appendChild(control);
-  assert_true(control.i.willValidate, 'In enabled FIELDSET');
-  fieldset.disabled = true;
-  assert_false(control.i.willValidate, 'In disabled FIELDSET');
-  fieldset.removeChild(control);
-
-  control.setAttribute('disabled', '');
-  assert_false(control.i.willValidate, 'with disabled attribute');
-}, 'willValidate');
-
-test(() => {
-  const control = document.createElement('my-control');
-  const validity = control.i.validity;
-  assert_false(validity.valueMissing, 'default valueMissing');
-  assert_false(validity.typeMismatch, 'default typeMismatch');
-  assert_false(validity.patternMismatch, 'default patternMismatch');
-  assert_false(validity.tooLong, 'default tooLong');
-  assert_false(validity.tooShort, 'default tooShort');
-  assert_false(validity.rangeUnderflow, 'default rangeUnderflow');
-  assert_false(validity.rangeOverflow, 'default rangeOverflow');
-  assert_false(validity.stepMismatch, 'default stepMismatch');
-  assert_false(validity.badInput, 'default badInput');
-  assert_false(validity.customError, 'default customError');
-  assert_true(validity.valid, 'default valid');
-
-  control.i.setValidity({valueMissing: true}, 'valueMissing message');
-  assert_true(validity.valueMissing);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'valueMissing message');
-
-  control.i.setValidity({typeMismatch: true}, 'typeMismatch message');
-  assert_true(validity.typeMismatch);
-  assert_false(validity.valueMissing);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'typeMismatch message');
-
-  control.i.setValidity({patternMismatch: true}, 'patternMismatch message');
-  assert_true(validity.patternMismatch);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'patternMismatch message');
-
-  control.i.setValidity({tooLong: true}, 'tooLong message');
-  assert_true(validity.tooLong);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'tooLong message');
-
-  control.i.setValidity({tooShort: true}, 'tooShort message');
-  assert_true(validity.tooShort);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'tooShort message');
-
-  control.i.setValidity({rangeUnderflow: true}, 'rangeUnderflow message');
-  assert_true(validity.rangeUnderflow);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'rangeUnderflow message');
-
-  control.i.setValidity({rangeOverflow: true}, 'rangeOverflow message');
-  assert_true(validity.rangeOverflow);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'rangeOverflow message');
-
-  control.i.setValidity({stepMismatch: true}, 'stepMismatch message');
-  assert_true(validity.stepMismatch);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'stepMismatch message');
-
-  control.i.setValidity({badInput: true}, 'badInput message');
-  assert_true(validity.badInput);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'badInput message');
-
-  control.i.setValidity({customError: true}, 'customError message');
-  assert_true(validity.customError, 'customError should be true.');
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'customError message');
-
-  // Set multiple flags
-  control.i.setValidity({badInput: true, customError: true}, 'multiple errors');
-  assert_true(validity.badInput);
-  assert_true(validity.customError);
-  assert_false(validity.valid);
-  assert_equals(control.i.validationMessage, 'multiple errors');
-
-  // Clear flags
-  control.i.setValidity({}, 'unnecessary message');
-  assert_false(validity.badInput);
-  assert_false(validity.customError);
-  assert_true(validity.valid);
-  assert_equals(control.i.validationMessage, '');
-
-  assert_throws("TypeMismatchError", () => { control.i.setValidity({valueMissing: true}); },
-      'setValidity() requires the second argument if the first argument contains true');
-}, 'validity and setValidity()');
-
-test(() => {
-  const control = document.createElement('my-control');
-  let invalidCount = 0;
-  control.addEventListener('invalid', e => {
-    assert_equals(e.target, control);
-    assert_true(e.cancelable);
-    ++invalidCount;
-  });
-
-  assert_true(control.i.checkValidity(), 'default state');
-  assert_equals(invalidCount, 0);
-
-  control.i.setValidity({customError:true}, 'foo');
-  assert_false(control.i.checkValidity());
-  assert_equals(invalidCount, 1);
-}, 'checkValidity()');
-
-test(() => {
-  const control = document.createElement('my-control');
-  document.body.appendChild(control);
-  control.tabIndex = 0;
-  let invalidCount = 0;
-  control.addEventListener('invalid', e => {
-    assert_equals(e.target, control);
-    assert_true(e.cancelable);
-    ++invalidCount;
-  });
-
-  assert_true(control.i.reportValidity(), 'default state');
-  assert_equals(invalidCount, 0);
-
-  assert_not_equals(document.activeElement, control);
-  control.i.setValidity({customError:true}, 'foo');
-  assert_false(control.i.reportValidity());
-  assert_equals(invalidCount, 1);
-  assert_equals(document.activeElement, control);
-
-  control.blur();
-  control.addEventListener('invalid', e => e.preventDefault());
-  assert_false(control.i.reportValidity());
-  assert_not_equals(document.activeElement, control);
-}, 'reportValidity()');
-
-test(() => {
-  const container = document.getElementById('container');
-  container.innerHTML = '<form><input type=submit><my-control>';
-  const form = container.querySelector('form');
-  const control = container.querySelector('my-control');
-  control.tabIndex = 0;
-
-  assert_true(control.i.checkValidity());
-  assert_true(form.checkValidity());
-  control.i.setValidity({valueMissing: true}, 'Please fill out this field');
-  assert_false(form.checkValidity());
-  
-  assert_false(form.reportValidity());
-  assert_equals(document.activeElement, control);
-
-  control.blur();
-  container.querySelector('input[type=submit]').click();
-  assert_equals(document.activeElement, control);
-}, 'Custom control affects validation at the owner form');
-
-function isValid(element, comment) {
-  assert_true(element.matches(':valid'), comment ? (comment + ' - :valid') : undefined);
-  assert_false(element.matches(':invalid'), comment ? (comment + ' - :invalid') : undefined);
-}
-
-function isInvalid(element, comment) {
-  assert_false(element.matches(':valid'), comment ? (comment + ' - :valid') : undefined);
-  assert_true(element.matches(':invalid'), comment ? (comment + ' - :invalid') : undefined);
-}
-
-test(() => {
-  const container = document.getElementById('container');
-  container.innerHTML = '<form><fieldset><my-control>';
-  const form = container.querySelector('form');
-  const fieldset = container.querySelector('fieldset');
-  const control = container.querySelector('my-control');
-
-  isValid(control);
-  isValid(form);
-  isValid(fieldset);
-
-  control.i.setValidity({typeMismatch: true}, 'Invalid format');
-  isInvalid(control);
-  isInvalid(form);
-  isInvalid(fieldset);
-
-  control.remove();
-  isValid(form);
-  isValid(fieldset);
-
-  fieldset.appendChild(control);
-  isInvalid(form);
-  isInvalid(fieldset);
-
-  control.i.setValidity({});
-  isValid(control);
-  isValid(form);
-  isValid(fieldset);
-}, ':valid :invalid for FORM and FIELDSET');
-</script>
-</body>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index c3c7faa..ddfffe9b 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -39625,6 +39625,18 @@
      {}
     ]
    ],
+   "css/css-contain/contain-size-fieldset-002.html": [
+    [
+     "css/css-contain/contain-size-fieldset-002.html",
+     [
+      [
+       "/css/css-contain/reference/contain-size-fieldset-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-contain/contain-size-flexbox-001.html": [
     [
      "css/css-contain/contain-size-flexbox-001.html",
@@ -45349,6 +45361,18 @@
      {}
     ]
    ],
+   "css/css-flexbox/overflow-top-left.html": [
+    [
+     "css/css-flexbox/overflow-top-left.html",
+     [
+      [
+       "/css/css-flexbox/overflow-top-left-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-flexbox/percentage-heights-002.html": [
     [
      "css/css-flexbox/percentage-heights-002.html",
@@ -132954,6 +132978,26 @@
      {}
     ]
    ],
+   "css/css-backgrounds/parsing/background-position-x-computed-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "css/css-backgrounds/parsing/background-position-x-valid-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "css/css-backgrounds/parsing/background-position-y-computed-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "css/css-backgrounds/parsing/background-position-y-valid-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "css/css-backgrounds/parsing/border-radius-valid-expected.txt": [
     [
      {}
@@ -134404,6 +134448,11 @@
      {}
     ]
    ],
+   "css/css-contain/reference/contain-size-fieldset-002-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-contain/reference/contain-size-flexbox-001-ref.html": [
     [
      {}
@@ -135679,6 +135728,11 @@
      {}
     ]
    ],
+   "css/css-flexbox/overflow-top-left-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-flexbox/percentage-heights-002-ref.html": [
     [
      {}
@@ -148249,11 +148303,26 @@
      {}
     ]
    ],
+   "css/css-scroll-snap/parsing/scroll-padding-block-computed-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "css/css-scroll-snap/parsing/scroll-padding-block-valid-expected.txt": [
     [
      {}
     ]
    ],
+   "css/css-scroll-snap/parsing/scroll-padding-computed-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "css/css-scroll-snap/parsing/scroll-padding-inline-computed-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "css/css-scroll-snap/parsing/scroll-padding-inline-valid-expected.txt": [
     [
      {}
@@ -159939,6 +160008,11 @@
      {}
     ]
    ],
+   "css/cssom/cssstyledeclaration-properties-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "css/cssom/cssstyledeclaration-setter-logical-expected.txt": [
     [
      {}
@@ -163999,11 +164073,6 @@
      {}
     ]
    ],
-   "custom-elements/HTMLElement-attachInternals-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "custom-elements/HTMLElement-constructor-expected.txt": [
     [
      {}
@@ -165479,6 +165548,11 @@
      {}
     ]
    ],
+   "element-timing/META.yml": [
+    [
+     {}
+    ]
+   ],
    "element-timing/resources/TAOImage.py": [
     [
      {}
@@ -186304,11 +186378,6 @@
      {}
     ]
    ],
-   "pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "pointerevents/idlharness-expected.txt": [
     [
      {}
@@ -193784,11 +193853,6 @@
      {}
     ]
    ],
-   "shadow-dom/Element-interface-attachShadow-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "shadow-dom/META.yml": [
     [
      {}
@@ -204464,11 +204528,6 @@
      {}
     ]
    ],
-   "webrtc/RTCSctpTransport-maxMessageSize-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "webrtc/RTCStats-helper.js": [
     [
      {}
@@ -230672,6 +230731,42 @@
      {}
     ]
    ],
+   "css/css-backgrounds/parsing/background-position-x-computed.html": [
+    [
+     "css/css-backgrounds/parsing/background-position-x-computed.html",
+     {}
+    ]
+   ],
+   "css/css-backgrounds/parsing/background-position-x-invalid.html": [
+    [
+     "css/css-backgrounds/parsing/background-position-x-invalid.html",
+     {}
+    ]
+   ],
+   "css/css-backgrounds/parsing/background-position-x-valid.html": [
+    [
+     "css/css-backgrounds/parsing/background-position-x-valid.html",
+     {}
+    ]
+   ],
+   "css/css-backgrounds/parsing/background-position-y-computed.html": [
+    [
+     "css/css-backgrounds/parsing/background-position-y-computed.html",
+     {}
+    ]
+   ],
+   "css/css-backgrounds/parsing/background-position-y-invalid.html": [
+    [
+     "css/css-backgrounds/parsing/background-position-y-invalid.html",
+     {}
+    ]
+   ],
+   "css/css-backgrounds/parsing/background-position-y-valid.html": [
+    [
+     "css/css-backgrounds/parsing/background-position-y-valid.html",
+     {}
+    ]
+   ],
    "css/css-backgrounds/parsing/background-repeat-invalid.html": [
     [
      "css/css-backgrounds/parsing/background-repeat-invalid.html",
@@ -234572,6 +234667,24 @@
      {}
     ]
    ],
+   "css/css-logical/parsing/inset-block-inline-computed.html": [
+    [
+     "css/css-logical/parsing/inset-block-inline-computed.html",
+     {}
+    ]
+   ],
+   "css/css-logical/parsing/inset-block-inline-invalid.html": [
+    [
+     "css/css-logical/parsing/inset-block-inline-invalid.html",
+     {}
+    ]
+   ],
+   "css/css-logical/parsing/inset-block-inline-valid.html": [
+    [
+     "css/css-logical/parsing/inset-block-inline-valid.html",
+     {}
+    ]
+   ],
    "css/css-logical/parsing/max-block-size-invalid.html": [
     [
      "css/css-logical/parsing/max-block-size-invalid.html",
@@ -236012,12 +236125,42 @@
      {}
     ]
    ],
+   "css/css-scroll-snap/parsing/scroll-padding-block-computed.html": [
+    [
+     "css/css-scroll-snap/parsing/scroll-padding-block-computed.html",
+     {}
+    ]
+   ],
+   "css/css-scroll-snap/parsing/scroll-padding-block-invalid.html": [
+    [
+     "css/css-scroll-snap/parsing/scroll-padding-block-invalid.html",
+     {}
+    ]
+   ],
    "css/css-scroll-snap/parsing/scroll-padding-block-valid.html": [
     [
      "css/css-scroll-snap/parsing/scroll-padding-block-valid.html",
      {}
     ]
    ],
+   "css/css-scroll-snap/parsing/scroll-padding-computed.html": [
+    [
+     "css/css-scroll-snap/parsing/scroll-padding-computed.html",
+     {}
+    ]
+   ],
+   "css/css-scroll-snap/parsing/scroll-padding-inline-computed.html": [
+    [
+     "css/css-scroll-snap/parsing/scroll-padding-inline-computed.html",
+     {}
+    ]
+   ],
+   "css/css-scroll-snap/parsing/scroll-padding-inline-invalid.html": [
+    [
+     "css/css-scroll-snap/parsing/scroll-padding-inline-invalid.html",
+     {}
+    ]
+   ],
    "css/css-scroll-snap/parsing/scroll-padding-inline-valid.html": [
     [
      "css/css-scroll-snap/parsing/scroll-padding-inline-valid.html",
@@ -236510,6 +236653,12 @@
      {}
     ]
    ],
+   "css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-crash.html": [
+    [
+     "css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-crash.html",
+     {}
+    ]
+   ],
    "css/css-shapes/shape-outside/values/shape-image-threshold-000.html": [
     [
      "css/css-shapes/shape-outside/values/shape-image-threshold-000.html",
@@ -238808,6 +238957,12 @@
      {}
     ]
    ],
+   "css/css-text/overflow-wrap/overflow-wrap-break-word-long-crash.html": [
+    [
+     "css/css-text/overflow-wrap/overflow-wrap-break-word-long-crash.html",
+     {}
+    ]
+   ],
    "css/css-text/overflow-wrap/overflow-wrap-break-word-span-002.html": [
     [
      "css/css-text/overflow-wrap/overflow-wrap-break-word-span-002.html",
@@ -243834,6 +243989,12 @@
      {}
     ]
    ],
+   "css/cssom/cssstyledeclaration-properties.html": [
+    [
+     "css/cssom/cssstyledeclaration-properties.html",
+     {}
+    ]
+   ],
    "css/cssom/cssstyledeclaration-setter-attr.html": [
     [
      "css/cssom/cssstyledeclaration-setter-attr.html",
@@ -244238,6 +244399,24 @@
      {}
     ]
    ],
+   "css/filter-effects/parsing/flood-color-computed.html": [
+    [
+     "css/filter-effects/parsing/flood-color-computed.html",
+     {}
+    ]
+   ],
+   "css/filter-effects/parsing/flood-color-invalid.html": [
+    [
+     "css/filter-effects/parsing/flood-color-invalid.html",
+     {}
+    ]
+   ],
+   "css/filter-effects/parsing/flood-color-valid.html": [
+    [
+     "css/filter-effects/parsing/flood-color-valid.html",
+     {}
+    ]
+   ],
    "css/filter-effects/parsing/flood-opacity-computed.svg": [
     [
      "css/filter-effects/parsing/flood-opacity-computed.svg",
@@ -322816,6 +322995,12 @@
      {}
     ]
    ],
+   "webrtc/protocol/sctp-format.html": [
+    [
+     "webrtc/protocol/sctp-format.html",
+     {}
+    ]
+   ],
    "webrtc/protocol/simulcast-answer.html": [
     [
      "webrtc/protocol/simulcast-answer.html",
@@ -372992,11 +373177,11 @@
    "reftest"
   ],
   "css/css-backgrounds/inheritance-expected.txt": [
-   "fabdb48c4298030a4fe93f6e5d7597e88a0bcb00",
+   "e4bce58736cf33f814cae4c18a2b3e98e05db2ec",
    "support"
   ],
   "css/css-backgrounds/inheritance.html": [
-   "768b18a6284e8857636c37f880a59641c8b9ed99",
+   "fb8a69b46798762f435dc222954f1b7115e7cf9a",
    "testharness"
   ],
   "css/css-backgrounds/justfortest.html": [
@@ -373063,6 +373248,46 @@
    "1c05517c62aeee4f2d4837a3a9cf7b8880bd6e19",
    "testharness"
   ],
+  "css/css-backgrounds/parsing/background-position-x-computed-expected.txt": [
+   "777dc05f71398e2ff86c17fbd43010519f07e4ca",
+   "support"
+  ],
+  "css/css-backgrounds/parsing/background-position-x-computed.html": [
+   "6e997c95ae0b632713bed16a84d07c3ac6379d1b",
+   "testharness"
+  ],
+  "css/css-backgrounds/parsing/background-position-x-invalid.html": [
+   "7cdfcf426c0b6d0da54dc8d80e19b048db828a5e",
+   "testharness"
+  ],
+  "css/css-backgrounds/parsing/background-position-x-valid-expected.txt": [
+   "32c47f407848afcb6d5eeeb3d577f81365b40ab9",
+   "support"
+  ],
+  "css/css-backgrounds/parsing/background-position-x-valid.html": [
+   "282d7d27bf5560bef47f57e43dcc460143f50e7a",
+   "testharness"
+  ],
+  "css/css-backgrounds/parsing/background-position-y-computed-expected.txt": [
+   "86634ba52c136e54a4a635d9de6baa8d41dc4bd1",
+   "support"
+  ],
+  "css/css-backgrounds/parsing/background-position-y-computed.html": [
+   "ceff11f624d2d04fdca3201af09023081c3bf759",
+   "testharness"
+  ],
+  "css/css-backgrounds/parsing/background-position-y-invalid.html": [
+   "7885b142ee23ad321785a9136a2645411f0facec",
+   "testharness"
+  ],
+  "css/css-backgrounds/parsing/background-position-y-valid-expected.txt": [
+   "b3a864b234c19853e987a486607ac76a7eb5924c",
+   "support"
+  ],
+  "css/css-backgrounds/parsing/background-position-y-valid.html": [
+   "1413a2e959a4cf00b64fecf06932a083e1480e54",
+   "testharness"
+  ],
   "css/css-backgrounds/parsing/background-repeat-invalid.html": [
    "abb153378f4ce02507d39c5a5a979689df58c8ba",
    "testharness"
@@ -375731,6 +375956,10 @@
    "f92424716ce55fdfbc0ad9954ab2893d63b389b2",
    "reftest"
   ],
+  "css/css-contain/contain-size-fieldset-002.html": [
+   "54f6cb1f2694a70022c0dd93bb6ca59e33b85743",
+   "reftest"
+  ],
   "css/css-contain/contain-size-flexbox-001.html": [
    "16ba62eda041abe11424f63c65d6dfd46aa82570",
    "reftest"
@@ -376067,6 +376296,10 @@
    "85f5c73c2ece9a324511356d6f33798b3cfbe811",
    "support"
   ],
+  "css/css-contain/reference/contain-size-fieldset-002-ref.html": [
+   "51ff6998b63b3d6e108823c02eac219807f6ecb2",
+   "support"
+  ],
   "css/css-contain/reference/contain-size-flexbox-001-ref.html": [
    "70f408643007d8338f401ef947f7bb24f1eaedc9",
    "support"
@@ -379487,6 +379720,14 @@
    "ca9af99b939f77835933ccc76de5185b656f5977",
    "testharness"
   ],
+  "css/css-flexbox/overflow-top-left-ref.html": [
+   "48b2aa88158b6301c7c7df3d7af84d9d96192761",
+   "support"
+  ],
+  "css/css-flexbox/overflow-top-left.html": [
+   "682199815e03d214941a24b6a167d22ee852ced2",
+   "reftest"
+  ],
   "css/css-flexbox/parsing/flex-basis-computed.html": [
    "79781dd207e4f486846a2a2f8cf073bcd3dd9038",
    "testharness"
@@ -391911,6 +392152,18 @@
    "e785b468cdde191c811b57d74df59d5574314f91",
    "testharness"
   ],
+  "css/css-logical/parsing/inset-block-inline-computed.html": [
+   "258960d795e34994dae6de783b4d84ef6de77380",
+   "testharness"
+  ],
+  "css/css-logical/parsing/inset-block-inline-invalid.html": [
+   "fe073f852ea38910c35ee471f54e52d1b9aca95b",
+   "testharness"
+  ],
+  "css/css-logical/parsing/inset-block-inline-valid.html": [
+   "1287f697873efb6a538f8682a484f9db48df054d",
+   "testharness"
+  ],
   "css/css-logical/parsing/max-block-size-invalid.html": [
    "adcf6e497eac2ecbf3e28c50074a3e6ed83b0af6",
    "testharness"
@@ -397459,6 +397712,18 @@
    "be3499869159c5fb29f9859889f4f2354874853c",
    "testharness"
   ],
+  "css/css-scroll-snap/parsing/scroll-padding-block-computed-expected.txt": [
+   "5c7de8d9822306a4b5a516025188eece04cf6d70",
+   "support"
+  ],
+  "css/css-scroll-snap/parsing/scroll-padding-block-computed.html": [
+   "68ad0cd8362b62efcdf39665548fc0de7c1fd2ec",
+   "testharness"
+  ],
+  "css/css-scroll-snap/parsing/scroll-padding-block-invalid.html": [
+   "206e6f5da89a7cc1ae411b57652d7bf1e266844a",
+   "testharness"
+  ],
   "css/css-scroll-snap/parsing/scroll-padding-block-valid-expected.txt": [
    "3b5e7fa56b20b945a8835b0d513e53cf4016164c",
    "support"
@@ -397467,6 +397732,26 @@
    "79f675acd5b530db6f0fc6d31a5f059651c8b1f6",
    "testharness"
   ],
+  "css/css-scroll-snap/parsing/scroll-padding-computed-expected.txt": [
+   "bb6269d62522208035af8d1d72fb999668c723a4",
+   "support"
+  ],
+  "css/css-scroll-snap/parsing/scroll-padding-computed.html": [
+   "5a5123a6dac25b667a6da9467abf0188a600f84a",
+   "testharness"
+  ],
+  "css/css-scroll-snap/parsing/scroll-padding-inline-computed-expected.txt": [
+   "1cca11c245861f68d500409779b3e097487834f3",
+   "support"
+  ],
+  "css/css-scroll-snap/parsing/scroll-padding-inline-computed.html": [
+   "d753bacbca02e6615bb4f60fbc2dc16f631f043c",
+   "testharness"
+  ],
+  "css/css-scroll-snap/parsing/scroll-padding-inline-invalid.html": [
+   "0cf3fa7353f7123d0f27573c610ce42638c59d40",
+   "testharness"
+  ],
   "css/css-scroll-snap/parsing/scroll-padding-inline-valid-expected.txt": [
    "bfcdf15289ff370c169030fcbe3b5609bc3e00f1",
    "support"
@@ -397476,7 +397761,7 @@
    "testharness"
   ],
   "css/css-scroll-snap/parsing/scroll-padding-invalid.html": [
-   "9b24a539f7a9810c0bc8f92440da5c075a3d63d5",
+   "e060fcdc0ec064a255ff496fd329fab9917b73b4",
    "testharness"
   ],
   "css/css-scroll-snap/parsing/scroll-padding-valid-expected.txt": [
@@ -398595,6 +398880,10 @@
    "aa13170fe1a3ad10fbefb8c64f6a9824e0645105",
    "reftest"
   ],
+  "css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-crash.html": [
+   "de10bf8b741a79dab2198e1837977e0500ff4cbc",
+   "testharness"
+  ],
   "css/css-shapes/shape-outside/supported-shapes/support/rounded-rectangle.js": [
    "3e624322a43397e542444819f7b4ecccd939bd02",
    "support"
@@ -404063,6 +404352,10 @@
    "2c83c46aa50f6d51efbb4d05635d86f7c166042d",
    "reftest"
   ],
+  "css/css-text/overflow-wrap/overflow-wrap-break-word-long-crash.html": [
+   "e318386ded5bd3d1d61cf876fe420c8f5ada799f",
+   "testharness"
+  ],
   "css/css-text/overflow-wrap/overflow-wrap-break-word-span-001.html": [
    "0565b8bb75d5feff2352a1dd3eb9a8f8ef0d1bef",
    "reftest"
@@ -426083,6 +426376,14 @@
    "26574033ce99dfe69868e9379fa932f091901e8a",
    "testharness"
   ],
+  "css/cssom/cssstyledeclaration-properties-expected.txt": [
+   "ead818bf585910a1a6c65f90f30231393a6fc5f5",
+   "support"
+  ],
+  "css/cssom/cssstyledeclaration-properties.html": [
+   "12382cbcdcaf223c855275cec1cc9a30dca3a37a",
+   "testharness"
+  ],
   "css/cssom/cssstyledeclaration-setter-attr.html": [
    "20837052e39368455dedc6ce8901709cc00817cf",
    "testharness"
@@ -427055,6 +427356,18 @@
    "9d733495cc967bf698a7d0de766b5db02e8e5e0d",
    "testharness"
   ],
+  "css/filter-effects/parsing/flood-color-computed.html": [
+   "347b075c6afc2d4ffb600d5bd85b8772b4d84cbf",
+   "testharness"
+  ],
+  "css/filter-effects/parsing/flood-color-invalid.html": [
+   "7cc91489015c8d349d1e73463bb8e0fff88d0b0c",
+   "testharness"
+  ],
+  "css/filter-effects/parsing/flood-color-valid.html": [
+   "5fb4a266e6c0b3cd8eab37864ce53b4cff5686e4",
+   "testharness"
+  ],
   "css/filter-effects/parsing/flood-opacity-computed.svg": [
    "cfbc242f33beef4d061546e016e4854e52fb24fb",
    "testharness"
@@ -434955,10 +435268,6 @@
    "32613c47e241078fae04ecdd7ee9e5b0236819fc",
    "testharness"
   ],
-  "custom-elements/HTMLElement-attachInternals-expected.txt": [
-   "9594d45ff6b87206cac0a17b003ff1ae46f81aca",
-   "support"
-  ],
   "custom-elements/HTMLElement-attachInternals.html": [
    "22c9545215c8d97f1d8564c99cde806933c7f0f9",
    "testharness"
@@ -435040,7 +435349,7 @@
    "testharness"
   ],
   "custom-elements/form-associated/ElementInternals-validation-expected.txt": [
-   "d0b11b33a82abb7feccc9c1cb56bd71952d0058e",
+   "e3e31aa19b0eaadf420f171fef6071df90a80a79",
    "support"
   ],
   "custom-elements/form-associated/ElementInternals-validation.html": [
@@ -438111,120 +438420,124 @@
    "7cd0be939f16e8aea7b00ff2b13a06102e26cc4d",
    "testharness"
   ],
+  "element-timing/META.yml": [
+   "15510df7e5096b5da0b0d216b5d36b478834bf35",
+   "support"
+  ],
   "element-timing/background-image-data-uri.html": [
-   "16d6dfcba037f77453c38ae1273fdb9182d6a531",
+   "3cac0f56db860cf5c6111a41a195ceb6b5d6c3a1",
    "testharness"
   ],
   "element-timing/background-image-multiple-elements.html": [
-   "22b4158cbe7289afb6a1ce038ef840933c92a7f0",
+   "a4ad83dbae069f241224219487a31f3abb67ce75",
    "testharness"
   ],
   "element-timing/background-image-stretched.html": [
-   "28c355398245252c536a247910f56ec6aba6ac58",
+   "930b4cef8eb21b6eecbbfdd1eaf0c79ec87db551",
    "testharness"
   ],
   "element-timing/buffer-before-onload.html": [
-   "03c7048be1134b45c6c966404ce27f9ed5c8204e",
+   "88a641bbb666816da9a636ed43d23c205bf0e8f9",
    "testharness"
   ],
   "element-timing/cross-origin-element.sub.html": [
-   "0af0ae96413eb8c22383b5e676f9a4f3a994aeb0",
+   "40a97056c2bfba92485f627117f61cd56a563d0b",
    "testharness"
   ],
   "element-timing/cross-origin-iframe-element.sub.html": [
-   "a369d25bd43c6565ab4367b0a381ab39ec8664b7",
+   "7296cfccfda6068313d6032c2625e2100e7f06fd",
    "testharness"
   ],
   "element-timing/disconnect-image.html": [
-   "4ee0516fffecfe2f4c89ce4f789e7c6bb269ddd2",
+   "82e7461b0417fb6f667ad266c08789b58f06c457",
    "testharness"
   ],
   "element-timing/image-TAO-wildcard.sub.html": [
-   "4ec8aa7d8dad99da4e183c6d9b0dd719199e28d9",
+   "3af893a98904102bab92672cd28f7fb1e4d2107c",
    "testharness"
   ],
   "element-timing/image-carousel.html": [
-   "404eca3b208cd0c77e454a0f9ae12f500d3d0f57",
+   "39d9f0195c6ba17c3e83b41e5d2391203608b15a",
    "testharness"
   ],
   "element-timing/image-clipped-svg.html": [
-   "3007bf726a6812d1fa607162999310da837f221e",
+   "1e9971c8a8df75274480f2bd11fa2c730dc79adb",
    "testharness"
   ],
   "element-timing/image-data-uri.html": [
-   "2b5d04e45a3f4cdf2277cc302574c62b6476f0af",
+   "e698bcf1a5d7f55b60f55d5fc68e7c626f78474d",
    "testharness"
   ],
   "element-timing/image-not-added.html": [
-   "59a254e9f179b19bdfe878b49f1300fc0bda56d1",
+   "e65d1814b0e7591f43fd26f6f2ac47587039983e",
    "testharness"
   ],
   "element-timing/image-not-fully-visible.html": [
-   "57162491a7927ddf3d4625750fbce6bf7537493a",
+   "105bb55ebc0a3a64343cfb07a27d845e58e66bd8",
    "testharness"
   ],
   "element-timing/image-rect-iframe.html": [
-   "f0511308c7192b26949c6855fbf4a779ce48a871",
+   "7441405d7475b4a300962dc21dd9b50d52250c38",
    "testharness"
   ],
   "element-timing/image-with-css-scale.html": [
-   "bdffdb26b29e50ff73b8ca70a0e959bb031018ec",
+   "5c15daabe13dda37ce58a9c056cb2884cf1bb584",
    "testharness"
   ],
   "element-timing/image-with-rotation.html": [
-   "4433ecbc5f114604fec821622673ecf15bf6030d",
+   "c545becd19ba960c241ef6d82c998ea9d9dda87e",
    "testharness"
   ],
   "element-timing/images-repeated-resource.html": [
-   "fbb2d6a12cd39e9bcd96a610e87076d9d3d6f2d4",
+   "9bc8b5f45e4add4c384160d43649e13eebc1a563",
    "testharness"
   ],
   "element-timing/invisible-images.html": [
-   "50aa6d13a9a5bfc006305276011050c153fcf8b2",
+   "eb53cd7c2a692c76bb8220062d33edd3c3a48eef",
    "testharness"
   ],
   "element-timing/multiple-background-images.html": [
-   "f3fbe767303f91328a892686a6d0d5761b1b3575",
+   "a762ed13396124c20decfce310b19096a4117e2e",
    "testharness"
   ],
   "element-timing/observe-background-image.html": [
-   "680c5e475aad49b1963a7f45d908b47b04a3b77f",
+   "c642264a19a89bfa02df83cadd2b5cd2c428d0ce",
    "testharness"
   ],
   "element-timing/observe-child-element.html": [
-   "9166a4b0e6d129c356d74da2b81a6e02c08105b6",
+   "33e92a9abddd0232ace837878fdd5c715a1bd0c4",
    "testharness"
   ],
   "element-timing/observe-elementtiming.html": [
-   "73f93519cdaecdce0bf8466a7473231f9b3ffef2",
+   "0c67130dcc356ee7da9b3e2e10127352af7d169e",
    "testharness"
   ],
   "element-timing/observe-large-image.html": [
-   "13fc71bc4e3316b23be58b71620f5aa3cba658c3",
+   "e907452d82f2ce7a603e4728faa2062f55f4cce8",
    "testharness"
   ],
   "element-timing/observe-multiple-images.html": [
-   "b9e82ed10b1c01b01be8a155f48ee3d610f3910b",
+   "8a5fa0bb89a31f1bb1d1a277edb1b8102680a4bf",
    "testharness"
   ],
   "element-timing/observe-shadow-image.html": [
-   "a4d21bea80892384ece7c8049c894bed23f739bb",
+   "4309196cddcdca22076b095e1e1688571ec1c23b",
    "testharness"
   ],
   "element-timing/observe-svg-image.html": [
-   "c3c178e9b647752086248e4853d324940769c6f3",
+   "29fec392a993b793fe824e8a6f6c1a9867740f6c",
    "testharness"
   ],
   "element-timing/observe-video-poster.html": [
-   "500fcedcccf2682f15b4bb2aeffe046aa9eeb085",
+   "9f82478ea27779d7bb52dd9bc4966d5e5c09f6a3",
    "testharness"
   ],
   "element-timing/progressively-loaded-image.html": [
-   "c534621ccf86ae88daf96893373a0f691df804ad",
+   "a55c5896f2acdcdcc9f9b416a689b9dbba5aef44",
    "testharness"
   ],
   "element-timing/rectangular-image.html": [
-   "a1af9616ea115a3686ce09a06853a8efc8adefa2",
+   "0b44c4fdd9212374fc83d6a8c027673d91fcc3e0",
    "testharness"
   ],
   "element-timing/resources/TAOImage.py": [
@@ -466012,35 +466325,35 @@
    "support"
   ],
   "intersection-observer/bounding-box.html": [
-   "50f33f0443bb70e64bec2e2fcc930fa2b4118ed6",
+   "367243d558ddb00748d13e4be8af8a38b70e50a0",
    "testharness"
   ],
   "intersection-observer/client-rect.html": [
-   "6c50fdb14ac4e094ca8e42a4bfafb83f36e15a59",
+   "e85171ca7c9771cb0e53cc318c88bdfbc36362ff",
    "testharness"
   ],
   "intersection-observer/containing-block.html": [
-   "d4f46b0fa77d8ed930f5bac19c3f5854d4950ed0",
+   "f7ce6fa7246f006883b39479ad9bdda9ed84978c",
    "testharness"
   ],
   "intersection-observer/cross-origin-iframe.html": [
-   "2c9c4bcec69666f0e37509618e05a6b741f5533d",
+   "bdd6d3f529a0406d910580f477bce978c3e54c8c",
    "testharness"
   ],
   "intersection-observer/disconnect.html": [
-   "0abfbc4e8aafa3e5f073f8899188f409af21e566",
+   "9c02dafabe89da1df3fff4d6d8bc36c8f13da8ed",
    "testharness"
   ],
   "intersection-observer/display-none.html": [
-   "7cebc5633ef91228129d2a1c0478262615ad3ba1",
+   "cae35095e8ec25b4fb6aa2ec4a2b55076fb7f269",
    "testharness"
   ],
   "intersection-observer/edge-inclusive-intersection.html": [
-   "b9fa24b87808abc158307e8c69afeeb5ce3c1907",
+   "b73c407a274bde4f4361c6b03bb1d214d86095cf",
    "testharness"
   ],
   "intersection-observer/empty-root-margin.html": [
-   "48c9aa4d535fa0b65c04cf2622e471cbade224b4",
+   "9eaf856e957ec6feb2b743777bef2753f693dfd7",
    "testharness"
   ],
   "intersection-observer/idlharness.window-expected.txt": [
@@ -466052,19 +466365,19 @@
    "testharness"
   ],
   "intersection-observer/iframe-no-root-with-wrapping-scroller.html": [
-   "f219ba39c1478e5a50e37249673ef05f0d1bc7e6",
+   "28e6d09d7b085296d080f47b9a91edae65e0e1ac",
    "testharness"
   ],
   "intersection-observer/iframe-no-root.html": [
-   "e37aeac5530f348328274f9f8a2eeae9f08609ff",
+   "8532246fd1b55159f4043a732b71342181f508f1",
    "testharness"
   ],
   "intersection-observer/initial-observation-with-threshold.html": [
-   "d677f0eefa84b7394ab92ccb0ad0cd43b3208476",
+   "b9218b09ea6c8c3a1b12dca8cfdb13531449920b",
    "testharness"
   ],
   "intersection-observer/inline-client-rect.html": [
-   "0bdfc8de24458e0fb490de4f00537197c0662e53",
+   "c096230eb17a52d27168b45ab0a3a0b9105bbfb2",
    "testharness"
   ],
   "intersection-observer/inline-with-block-child-client-rect.html": [
@@ -466072,7 +466385,7 @@
    "testharness"
   ],
   "intersection-observer/isIntersecting-change-events.html": [
-   "f9362c3024c2003ac03c1e789c54486830710c92",
+   "3dcc77886204c59debc89a2ea8aa1dd327d7fd22",
    "testharness"
   ],
   "intersection-observer/isIntersecting-threshold-expected.txt": [
@@ -466080,35 +466393,35 @@
    "support"
   ],
   "intersection-observer/isIntersecting-threshold.html": [
-   "7d2957b13e024bb8caf16a7b71949873d419970d",
+   "106b65edd7525d089224ff3192f57614d6c58ed6",
    "testharness"
   ],
   "intersection-observer/multiple-targets.html": [
-   "525c5a699d1cc51080bebc650ae377b26c2fe7eb",
+   "22353e3aaae08c7af0af9fdb2f1e7aced6c7171c",
    "testharness"
   ],
   "intersection-observer/multiple-thresholds.html": [
-   "6450068941ce1d132e3bba6970b366a25a7dbc4a",
+   "3599e1f7229a28c07d2500f81e1449e5df0a594f",
    "testharness"
   ],
   "intersection-observer/observer-attributes.html": [
-   "ffca95ded3160b887adc6bbfada2e5b366efac24",
+   "4e2e5293c7cdfb120beb075e3e1ad8bf9edc6977",
    "testharness"
   ],
   "intersection-observer/observer-exceptions.html": [
-   "5d29234bbf32505a98ad132571c6d5467ce44d51",
+   "f8d089b75b425f80cf45a8f504448af8357f7804",
    "testharness"
   ],
   "intersection-observer/observer-in-iframe.html": [
-   "f4aa387de2a80eb7309b3d457eb605d87eae6046",
+   "e918bf1a4f0313a94cfb8b269658bb7e42cc8745",
    "support"
   ],
   "intersection-observer/observer-without-js-reference.html": [
-   "3214345b61052cfc0ab3720f688416faf23a5585",
+   "53100c50bb7438b71ebfb52a215169fcab1ac7ea",
    "testharness"
   ],
   "intersection-observer/remove-element.html": [
-   "3b6a65e2d0e42513aefd4568409b1a2f510b2db9",
+   "a093b22028c11c3e54db4a6f8fcccaad6a309bfb",
    "testharness"
   ],
   "intersection-observer/resources/cross-origin-subframe.html": [
@@ -466140,63 +466453,63 @@
    "support"
   ],
   "intersection-observer/root-margin.html": [
-   "c1fffec02becc50ccaad1f8fdaa9ffd16afef11c",
+   "898454c4f385794d78ef4635612b6754cdd060af",
    "testharness"
   ],
   "intersection-observer/same-document-no-root.html": [
-   "783880888abdcdd870e2edb2358f619d434ad51f",
+   "63e9f86d9c60533a2b4b193cf4e2860ef712ee4f",
    "testharness"
   ],
   "intersection-observer/same-document-root.html": [
-   "40467be72b4f298bb9d8704cbb938391e395a3ef",
+   "bfb9b729aa6ab607c0427050d5b543d51a493c1f",
    "testharness"
   ],
   "intersection-observer/same-document-zero-size-target.html": [
-   "d835b40634d33d0c7dd912ea81d4ef6d42af7c1b",
+   "20bd11d4beb1e8bdd623eaad96f11788747f0d15",
    "testharness"
   ],
   "intersection-observer/shadow-content.html": [
-   "d049c70919e129fa6c335e8601f6ce6a6cd73a9d",
+   "ce9473cb79258fca90321ee26240612c387ac9b9",
    "testharness"
   ],
   "intersection-observer/target-in-different-window.html": [
-   "cf8fe4e6ec9e6b33df2d61b6219a1b2d4bb74c79",
+   "645b7ec1908cc2788c8196786537ec5a4f305f88",
    "testharness"
   ],
   "intersection-observer/text-target.html": [
-   "13dc3abea2d8b0438ac76e9da974718778bcbb12",
+   "1abe5357c290087f7de1934df03b1ce83874bdfb",
    "testharness"
   ],
   "intersection-observer/timestamp.html": [
-   "be1980040d298b4d6d0055976ed42c202dec9888",
+   "3f573bcd88ff1781e03be03f1adeccfab8e5ba84",
    "testharness"
   ],
   "intersection-observer/unclipped-root.html": [
-   "24ae01cedc2ef95f6dd04a722d47aefa30e8b777",
+   "a59105e33e76bd37f55c9f2e00333881b7583f6c",
    "testharness"
   ],
   "intersection-observer/v2/animated-occlusion.html": [
-   "c1eafb7fa1427a507c203feac5e0685a39bcb5e4",
+   "fa69733b9fb100c3014885aef3e797c574984a99",
    "testharness"
   ],
   "intersection-observer/v2/blur-filter.html": [
-   "2f55066e3630f73f53bbab050cfab236c7cd60d7",
+   "8cf63066e1cb28cf64e45b2e6bba85558fe6f12e",
    "testharness"
   ],
   "intersection-observer/v2/box-shadow.html": [
-   "bcc6980aec3641db0573c8b081632b53880a423e",
+   "765fa8b2d5e0846a498b04cd4c3bb0e52945f860",
    "testharness"
   ],
   "intersection-observer/v2/cross-origin-effects.sub.html": [
-   "04b88b404ec035ed107d6a2ed9f499a0d5d105d3",
+   "5f328bec99a132ca21494cd362e3f6a6cd08f379",
    "testharness"
   ],
   "intersection-observer/v2/cross-origin-occlusion.sub.html": [
-   "b8bbcae3ea8bbe9ab9db5a23d29ad1113dee7877",
+   "4c2f286afb14c6ded9859010157abf1dce5f4e30",
    "testharness"
   ],
   "intersection-observer/v2/delay-test.html": [
-   "086301c44d4ef5f5dce2afb1d9ff6388f089fccf",
+   "231df32c31df0458a4d5de09da55f0244854e0a6",
    "testharness"
   ],
   "intersection-observer/v2/drop-shadow-filter-vertical-rl.html": [
@@ -466204,7 +466517,7 @@
    "testharness"
   ],
   "intersection-observer/v2/iframe-target.html": [
-   "3e53ee5f5814e8ef69d8454011ceafabfe8d1f17",
+   "53fbff86b7ae7ebd11bfa406f631c72238a44fbd",
    "testharness"
   ],
   "intersection-observer/v2/inline-occlusion.html": [
@@ -466216,15 +466529,15 @@
    "testharness"
   ],
   "intersection-observer/v2/simple-effects.html": [
-   "2b7a83a9c9507a79e91cb2ef890604d9b2ca5e3e",
+   "baf32203c79e56bc3cfc81c5dbffdcda10e83000",
    "testharness"
   ],
   "intersection-observer/v2/simple-occlusion-svg-foreign-object.html": [
-   "fcdff67a48925a74a200e328eaf4bcd6deefb9ae",
+   "588ec2abd69a56b889bf1465430f528a5f1b4726",
    "testharness"
   ],
   "intersection-observer/v2/simple-occlusion.html": [
-   "ea1ee31ebe4519f9563987934c1a9db7fac77136",
+   "f3ce518b341247c0abd8049c809f0764784df31e",
    "testharness"
   ],
   "intersection-observer/v2/text-editor-occlusion.html": [
@@ -466232,15 +466545,15 @@
    "testharness"
   ],
   "intersection-observer/v2/text-shadow.html": [
-   "c6445c514eecaf978e95d75f5d37a1387939c5e2",
+   "cdfc1a2d2a3102489e37eb464b66080c5c484d66",
    "testharness"
   ],
   "intersection-observer/zero-area-element-hidden.html": [
-   "e007040c8fe2e25bfca8fbe450b06a26934ad186",
+   "be57ac698314d1e2a93e0584065f2c90811418d8",
    "testharness"
   ],
   "intersection-observer/zero-area-element-visible.html": [
-   "6bf1297fe453dce1d748d047f54ec427289d8df4",
+   "5431750485fddca7f6ebc97b0a8a1dda498ab4e2",
    "testharness"
   ],
   "keyboard-lock/META.yml": [
@@ -479231,10 +479544,6 @@
    "895a89109c6d75d287b8508f0d1a10fa3189a671",
    "testharness"
   ],
-  "pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt": [
-   "15bf520ecb642acd4a9148dd49d2240f8335a716",
-   "support"
-  ],
   "pointerevents/extension/pointerevent_coalesced_events_attributes-manual.html": [
    "89149468a5d23d494f6b09d4142b43c8d1d2289c",
    "manual"
@@ -494452,17 +494761,13 @@
    "testharness"
   ],
   "shadow-dom/Element-interface-attachShadow-custom-element-expected.txt": [
-   "657afa55a06209c04f62d0f3f2627ab670bfb948",
+   "7acd1f93184773a6d4a90009ae529f91bccecc79",
    "support"
   ],
   "shadow-dom/Element-interface-attachShadow-custom-element.html": [
    "5d862c49244b4f5be33c9b6adc113e7400fcdd84",
    "testharness"
   ],
-  "shadow-dom/Element-interface-attachShadow-expected.txt": [
-   "c4c1156a5bcc0893fb5a241e04b854f76cbc891b",
-   "support"
-  ],
   "shadow-dom/Element-interface-attachShadow.html": [
    "304b64cd46603d2cdbbbd0f78c3032ca8ad3d4cd",
    "testharness"
@@ -495500,7 +495805,7 @@
    "testharness"
   ],
   "sms/constructor.tentative.https.any.js": [
-   "321e5510191b94ebb7f7bc1062d731ef49153c18",
+   "a624934ceeeace186038b15332d1c3c73968fbc7",
    "testharness"
   ],
   "sms/idlharness.https.any.js": [
@@ -508668,7 +508973,7 @@
    "support"
   ],
   "webrtc/RTCCertificate-postMessage.html": [
-   "5885f9fb1bbc3e97e5916d07e3df706316c170e8",
+   "ee8347c97ac39410531cd129762ec16f8ebb44df",
    "testharness"
   ],
   "webrtc/RTCCertificate.html": [
@@ -508744,11 +509049,11 @@
    "testharness"
   ],
   "webrtc/RTCDataChannel-send-expected.txt": [
-   "f81efcbd6cd77f5638ed2208834ece5f9737a6a2",
+   "096072c24c06f3626b1bff2f5690b1b82ae2939f",
    "support"
   ],
   "webrtc/RTCDataChannel-send.html": [
-   "76d3524d6ebc85306ceffcbe4a59a5e8928fd192",
+   "4565a8385febacd33aed74bd09bbaaaddef34538",
    "testharness"
   ],
   "webrtc/RTCDataChannelEvent-constructor.html": [
@@ -508784,7 +509089,7 @@
    "support"
   ],
   "webrtc/RTCIceTransport-extension.https.html": [
-   "206a4bb716f34566b699dacfd47585a14a5c282a",
+   "94beb9927861e83142cab9c1aa3043e4c479ed0d",
    "testharness"
   ],
   "webrtc/RTCIceTransport.html": [
@@ -508984,7 +509289,7 @@
    "testharness"
   ],
   "webrtc/RTCPeerConnection-setLocalDescription.html": [
-   "2becbd3e23efee6ee14988b770c34e8fba9d3455",
+   "c4671c3008e199176c57a2728bf25bab64fc2b40",
    "testharness"
   ],
   "webrtc/RTCPeerConnection-setRemoteDescription-answer.html": [
@@ -509088,7 +509393,7 @@
    "testharness"
   ],
   "webrtc/RTCRtpParameters-transactionId.html": [
-   "472b0439b5cc77d553b48000f6a7de3dda90b7d4",
+   "eb98a8348d44959bbe8c54f2265e30b95b079544",
    "testharness"
   ],
   "webrtc/RTCRtpReceiver-getCapabilities.html": [
@@ -509187,10 +509492,6 @@
    "777ac252bc18e36abba666833d79657798992997",
    "testharness"
   ],
-  "webrtc/RTCSctpTransport-maxMessageSize-expected.txt": [
-   "906c5954c95a66b4bdf24881c64056abdd98dc2c",
-   "support"
-  ],
   "webrtc/RTCSctpTransport-maxMessageSize.html": [
    "99767611509197a3d1037957551fea397ecad21e",
    "testharness"
@@ -509303,6 +509604,10 @@
    "9630919b80861b6559bbf90339788c826f581465",
    "testharness"
   ],
+  "webrtc/protocol/sctp-format.html": [
+   "207e51d4c3aaaaa8bc749fb06760cd7da26fd0d5",
+   "testharness"
+  ],
   "webrtc/protocol/simulcast-answer.html": [
    "4b84803389fabc26f4b47b27274e0af2e60e61f9",
    "testharness"
@@ -513956,7 +514261,7 @@
    "support"
   ],
   "webxr/idlharness.https.window-expected.txt": [
-   "296a45322d882bc64f93267964b3a956fe1f6359",
+   "92da502be8a50f62889cb95f68d5abaa7f67e893",
    "support"
   ],
   "webxr/idlharness.https.window.js": [
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/margin-collapse-through-percentage-height-block.html b/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/margin-collapse-through-percentage-height-block.html
new file mode 100644
index 0000000..0248ccb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/margin-collapse-through-percentage-height-block.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/CSS22/box.html#collapsing-margins" title="8.3.1 Collapsing margins">
+<link rel="help" href="http://crbug.com/962175">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="A percentage height is unresolvable (i.e. gets treated as auto) if the containing block is auto.">
+<p>Test passes if there is a filled green square.</p>
+<div style="height:200px;">
+  <div style="overflow:hidden; width:100px; background:green;">
+    <div style="margin-bottom:100px;"></div>
+    <div style="height:30%;"></div>
+    <div style="margin-top:100px;"></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/inheritance-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/inheritance-expected.txt
index fabdb48..e4bce58 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/inheritance-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/inheritance-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 60 tests; 59 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 64 tests; 63 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Property background-attachment has initial value scroll
 PASS Property background-attachment does not inherit
 PASS Property background-clip has initial value border-box
@@ -12,6 +12,10 @@
 PASS Property background-origin does not inherit
 PASS Property background-position has initial value 0% 0%
 PASS Property background-position does not inherit
+PASS Property background-position-x has initial value 0%
+PASS Property background-position-x does not inherit
+PASS Property background-position-y has initial value 0%
+PASS Property background-position-y does not inherit
 PASS Property background-repeat has initial value repeat
 PASS Property background-repeat does not inherit
 PASS Property background-size has initial value auto
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/inheritance.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/inheritance.html
index 768b18a..fb8a69b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/inheritance.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/inheritance.html
@@ -4,6 +4,7 @@
 <meta charset="utf-8">
 <title>Inheritance of CSS Backgrounds and Borders properties</title>
 <link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#property-index">
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-4/#property-index">
 <meta name="assert" content="Properties inherit or not according to the spec.">
 <meta name="assert" content="Properties have initial values according to the spec.">
 <script src="/resources/testharness.js"></script>
@@ -42,6 +43,8 @@
 assert_not_inherited('background-image', 'none', 'url("https://example.com/")');
 assert_not_inherited('background-origin', 'padding-box', 'content-box');
 assert_not_inherited('background-position', '0% 0%', '10px 20px');
+assert_not_inherited('background-position-x', '0%', '10px');
+assert_not_inherited('background-position-y', '0%', '20px');
 assert_not_inherited('background-repeat', 'repeat', 'space round');
 assert_not_inherited('background-size', 'auto', 'contain');
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-computed-expected.txt
new file mode 100644
index 0000000..777dc05
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-computed-expected.txt
@@ -0,0 +1,18 @@
+This is a testharness.js-based test.
+PASS Property background-position-x value 'center' computes to '50%'
+PASS Property background-position-x value 'left' computes to '0%'
+PASS Property background-position-x value 'right' computes to '100%'
+FAIL Property background-position-x value 'x-start' computes to 'x-start' assert_equals: expected "x-start" but got "0%"
+FAIL Property background-position-x value 'x-end' computes to 'x-end' assert_equals: expected "x-end" but got "0%"
+PASS Property background-position-x value '-20%' computes to '-20%'
+PASS Property background-position-x value '10px' computes to '10px'
+PASS Property background-position-x value '0.5em' computes to '20px'
+PASS Property background-position-x value 'calc(10px - 0.5em)' computes to '-10px'
+FAIL Property background-position-x value 'left -20%' computes to '-20%' assert_equals: expected "-20%" but got "0%"
+FAIL Property background-position-x value 'right 10px' computes to 'calc(100% + 10px)' assert_equals: expected "calc(100% + 10px)" but got "0%"
+FAIL Property background-position-x value '-20%, 10px' computes to '-20%, 10px' assert_equals: expected "-20%, 10px" but got "-20%"
+FAIL Property background-position-x value 'center, left, right' computes to '50%, 0%, 100px' assert_equals: expected "50%, 0%, 100px" but got "50%"
+FAIL Property background-position-x value '0.5em, x-start, x-end' computes to '20px, x-start, x-end' assert_equals: expected "20px, x-start, x-end" but got "0%"
+FAIL Property background-position-x value 'calc(10px - 0.5em), left -20%, right 10px' computes to '-10px, -20%, calc(100% + 10px)' assert_equals: expected "-10px, -20%, calc(100% + 10px)" but got "0%"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-computed.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-computed.html
new file mode 100644
index 0000000..6e997c95
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-computed.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Backgrounds and Borders Module Level 4: getComputedValue().backgroundPositionX</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-x">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+  #target {
+    font-size: 40px;
+  }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("background-position-x", "center", "50%");
+test_computed_value("background-position-x", "left", "0%");
+test_computed_value("background-position-x", "right", "100%");
+test_computed_value("background-position-x", "x-start");
+test_computed_value("background-position-x", "x-end");
+test_computed_value("background-position-x", "-20%");
+test_computed_value("background-position-x", "10px");
+test_computed_value("background-position-x", "0.5em", "20px");
+test_computed_value("background-position-x", "calc(10px - 0.5em)", "-10px");
+test_computed_value("background-position-x", "left -20%", "-20%");
+test_computed_value("background-position-x", "right 10px", "calc(100% + 10px)");
+test_computed_value("background-position-x", "-20%, 10px");
+test_computed_value("background-position-x", "center, left, right", "50%, 0%, 100px");
+test_computed_value("background-position-x", "0.5em, x-start, x-end", "20px, x-start, x-end");
+test_computed_value("background-position-x", "calc(10px - 0.5em), left -20%, right 10px", "-10px, -20%, calc(100% + 10px)");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-invalid.html
new file mode 100644
index 0000000..7cdfcf42
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-invalid.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Backgrounds and Borders Module Level 4: parsing background-position-x with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-x">
+<meta name="assert" content="background-position-x supports only the grammar '[ center | [ left | right | x-start | x-end ]? <length-percentage>? ]#'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("background-position-x", "top");
+test_invalid_value("background-position-x", "bottom");
+test_invalid_value("background-position-x", "y-start");
+test_invalid_value("background-position-x", "y-end");
+test_invalid_value("background-position-x", "center 10px");
+test_invalid_value("background-position-x", "20% left");
+test_invalid_value("background-position-x", "right left");
+test_invalid_value("background-position-x", "x-start center");
+test_invalid_value("background-position-x", "left, center right");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-valid-expected.txt
new file mode 100644
index 0000000..32c47f4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-valid-expected.txt
@@ -0,0 +1,18 @@
+This is a testharness.js-based test.
+FAIL e.style['background-position-x'] = "center" should set the property value assert_equals: serialization should be canonical expected "center" but got "50%"
+FAIL e.style['background-position-x'] = "left" should set the property value assert_equals: serialization should be canonical expected "left" but got "0%"
+FAIL e.style['background-position-x'] = "right" should set the property value assert_equals: serialization should be canonical expected "right" but got "100%"
+FAIL e.style['background-position-x'] = "x-start" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-position-x'] = "x-end" should set the property value assert_not_equals: property should be set got disallowed value ""
+PASS e.style['background-position-x'] = "-20%" should set the property value
+PASS e.style['background-position-x'] = "10px" should set the property value
+PASS e.style['background-position-x'] = "0.5em" should set the property value
+PASS e.style['background-position-x'] = "calc(10px - 0.5em)" should set the property value
+FAIL e.style['background-position-x'] = "left -20%" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-position-x'] = "right 10px" should set the property value assert_not_equals: property should be set got disallowed value ""
+PASS e.style['background-position-x'] = "-20%, 10px" should set the property value
+FAIL e.style['background-position-x'] = "center, left, right" should set the property value assert_equals: serialization should be canonical expected "center, left, right" but got "50%, 0%, 100%"
+FAIL e.style['background-position-x'] = "0.5em, x-start, x-end" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-position-x'] = "calc(10px - 0.5em), left -20%, right 10px" should set the property value assert_not_equals: property should be set got disallowed value ""
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-valid.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-valid.html
new file mode 100644
index 0000000..282d7d27
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-x-valid.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Backgrounds and Borders Module Level 4: parsing background-position-x with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-x">
+<meta name="assert" content="background-position-x supports the full grammar '[ center | [ left | right | x-start | x-end ]? <length-percentage>? ]#'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("background-position-x", "center");
+test_valid_value("background-position-x", "left");
+test_valid_value("background-position-x", "right");
+test_valid_value("background-position-x", "x-start");
+test_valid_value("background-position-x", "x-end");
+test_valid_value("background-position-x", "-20%");
+test_valid_value("background-position-x", "10px");
+test_valid_value("background-position-x", "0.5em");
+test_valid_value("background-position-x", "calc(10px - 0.5em)");
+test_valid_value("background-position-x", "left -20%");
+test_valid_value("background-position-x", "right 10px");
+test_valid_value("background-position-x", "-20%, 10px");
+test_valid_value("background-position-x", "center, left, right");
+test_valid_value("background-position-x", "0.5em, x-start, x-end");
+test_valid_value("background-position-x", "calc(10px - 0.5em), left -20%, right 10px");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-computed-expected.txt
new file mode 100644
index 0000000..86634ba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-computed-expected.txt
@@ -0,0 +1,18 @@
+This is a testharness.js-based test.
+PASS Property background-position-y value 'center' computes to '50%'
+PASS Property background-position-y value 'top' computes to '0%'
+PASS Property background-position-y value 'bottom' computes to '100%'
+FAIL Property background-position-y value 'y-start' computes to 'y-start' assert_equals: expected "y-start" but got "0%"
+FAIL Property background-position-y value 'y-end' computes to 'y-end' assert_equals: expected "y-end" but got "0%"
+PASS Property background-position-y value '-20%' computes to '-20%'
+PASS Property background-position-y value '10px' computes to '10px'
+PASS Property background-position-y value '0.5em' computes to '20px'
+PASS Property background-position-y value 'calc(10px - 0.5em)' computes to '-10px'
+FAIL Property background-position-y value 'top -20%' computes to '-20%' assert_equals: expected "-20%" but got "0%"
+FAIL Property background-position-y value 'bottom 10px' computes to 'calc(100% + 10px)' assert_equals: expected "calc(100% + 10px)" but got "0%"
+FAIL Property background-position-y value '-20%, 10px' computes to '-20%, 10px' assert_equals: expected "-20%, 10px" but got "-20%"
+FAIL Property background-position-y value 'center, top, bottom' computes to '50%, 0%, 100px' assert_equals: expected "50%, 0%, 100px" but got "50%"
+FAIL Property background-position-y value '0.5em, y-start, y-end' computes to '20px, y-start, y-end' assert_equals: expected "20px, y-start, y-end" but got "0%"
+FAIL Property background-position-y value 'calc(10px - 0.5em), top -20%, bottom 10px' computes to '-10px, -20%, calc(100% + 10px)' assert_equals: expected "-10px, -20%, calc(100% + 10px)" but got "0%"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-computed.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-computed.html
new file mode 100644
index 0000000..ceff11f6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-computed.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Backgrounds and Borders Module Level 4: getComputedValue().backgroundPositionY</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-y">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+  #target {
+    font-size: 40px;
+  }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("background-position-y", "center", "50%");
+test_computed_value("background-position-y", "top", "0%");
+test_computed_value("background-position-y", "bottom", "100%");
+test_computed_value("background-position-y", "y-start");
+test_computed_value("background-position-y", "y-end");
+test_computed_value("background-position-y", "-20%");
+test_computed_value("background-position-y", "10px");
+test_computed_value("background-position-y", "0.5em", "20px");
+test_computed_value("background-position-y", "calc(10px - 0.5em)", "-10px");
+test_computed_value("background-position-y", "top -20%", "-20%");
+test_computed_value("background-position-y", "bottom 10px", "calc(100% + 10px)");
+test_computed_value("background-position-y", "-20%, 10px");
+test_computed_value("background-position-y", "center, top, bottom", "50%, 0%, 100px");
+test_computed_value("background-position-y", "0.5em, y-start, y-end", "20px, y-start, y-end");
+test_computed_value("background-position-y", "calc(10px - 0.5em), top -20%, bottom 10px", "-10px, -20%, calc(100% + 10px)");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-invalid.html
new file mode 100644
index 0000000..7885b14
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-invalid.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Backgrounds and Borders Module Level 4: parsing background-position-y with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-y">
+<meta name="assert" content="background-position-y supports only the grammar '[ center | [ top | bottom | y-start | y-end ]? <length-percentage>? ]#'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("background-position-y", "left");
+test_invalid_value("background-position-y", "right");
+test_invalid_value("background-position-y", "x-start");
+test_invalid_value("background-position-y", "x-end");
+test_invalid_value("background-position-y", "center 10px");
+test_invalid_value("background-position-y", "20% top");
+test_invalid_value("background-position-y", "bottom top");
+test_invalid_value("background-position-y", "y-start center");
+test_invalid_value("background-position-y", "top, center bottom");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-valid-expected.txt
new file mode 100644
index 0000000..b3a864b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-valid-expected.txt
@@ -0,0 +1,18 @@
+This is a testharness.js-based test.
+FAIL e.style['background-position-y'] = "center" should set the property value assert_equals: serialization should be canonical expected "center" but got "50%"
+FAIL e.style['background-position-y'] = "top" should set the property value assert_equals: serialization should be canonical expected "top" but got "0%"
+FAIL e.style['background-position-y'] = "bottom" should set the property value assert_equals: serialization should be canonical expected "bottom" but got "100%"
+FAIL e.style['background-position-y'] = "y-start" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-position-y'] = "y-end" should set the property value assert_not_equals: property should be set got disallowed value ""
+PASS e.style['background-position-y'] = "-20%" should set the property value
+PASS e.style['background-position-y'] = "10px" should set the property value
+PASS e.style['background-position-y'] = "0.5em" should set the property value
+PASS e.style['background-position-y'] = "calc(10px - 0.5em)" should set the property value
+FAIL e.style['background-position-y'] = "top -20%" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-position-y'] = "bottom 10px" should set the property value assert_not_equals: property should be set got disallowed value ""
+PASS e.style['background-position-y'] = "-20%, 10px" should set the property value
+FAIL e.style['background-position-y'] = "center, top, bottom" should set the property value assert_equals: serialization should be canonical expected "center, top, bottom" but got "50%, 0%, 100%"
+FAIL e.style['background-position-y'] = "0.5em, y-start, y-end" should set the property value assert_not_equals: property should be set got disallowed value ""
+FAIL e.style['background-position-y'] = "calc(10px - 0.5em), top -20%, bottom 10px" should set the property value assert_not_equals: property should be set got disallowed value ""
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-valid.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-valid.html
new file mode 100644
index 0000000..1413a2e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-position-y-valid.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Backgrounds and Borders Module Level 4: parsing background-position-y with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-4/#propdef-background-position-y">
+<meta name="assert" content="background-position-y supports the full grammar '[ center | [ top | bottom | y-start | y-end ]? <length-percentage>? ]#'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("background-position-y", "center");
+test_valid_value("background-position-y", "top");
+test_valid_value("background-position-y", "bottom");
+test_valid_value("background-position-y", "y-start");
+test_valid_value("background-position-y", "y-end");
+test_valid_value("background-position-y", "-20%");
+test_valid_value("background-position-y", "10px");
+test_valid_value("background-position-y", "0.5em");
+test_valid_value("background-position-y", "calc(10px - 0.5em)");
+test_valid_value("background-position-y", "top -20%");
+test_valid_value("background-position-y", "bottom 10px");
+test_valid_value("background-position-y", "-20%, 10px");
+test_valid_value("background-position-y", "center, top, bottom");
+test_valid_value("background-position-y", "0.5em, y-start, y-end");
+test_valid_value("background-position-y", "calc(10px - 0.5em), top -20%, bottom 10px");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-top-left-ref.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-top-left-ref.html
new file mode 100644
index 0000000..48b2aa8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-top-left-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<style>
+.row-wrapper, .column-wrapper {
+  margin: 4px 0;
+  overflow: auto;
+  direction: rtl;
+  border: 2px solid black;
+}
+
+.column-wrapper {
+  width: 300px;
+}
+
+.row-wrapper {
+  height: 300px;
+  writing-mode: vertical-rl;
+}
+
+.column-wrapper > div {
+  margin: 4px;
+  height: 30px;
+  background: #CCC;
+}
+
+.column-wrapper > .h-overflow {
+  margin-top: 8px;  // Compensate for margin collapsing.
+}
+
+.h-overflow {
+  width: 500px;
+}
+
+.row-wrapper > div {
+  margin: 4px;
+  width: 30px;
+  background: #CCC;
+}
+
+.v-overflow {
+  height: 500px;
+}
+
+.row-wrapper > .v-overflow {
+  margin-right: 8px;  // Compensate for margin collapsing.
+}
+
+</style>
+
+<div class=column-wrapper>
+  <div>one</div>
+  <div class=h-overflow>two</div>
+</div>
+
+<div class=row-wrapper>
+  <div>one</div>
+  <div class=v-overflow>two</div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-top-left.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-top-left.html
new file mode 100644
index 0000000..6821998
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/overflow-top-left.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<head>
+<title>cross-axis top and left overflow</title>
+<link rel="author" title="Google, Inc." href="http://www.google.com/">
+<link rel="match" href="overflow-top-left-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#cross-sizing">
+</head>
+
+<style>
+.row-wrapper, .column-wrapper {
+  margin: 4px 0;
+  overflow: auto;
+  display: flex;
+  direction: rtl;
+  border: 2px solid black;
+}
+
+.column-wrapper {
+  width: 300px;
+  display: flex;
+  flex-direction: column;
+}
+
+.row-wrapper {
+  height: 300px;
+  flex-direction: column;
+  writing-mode: vertical-rl;
+}
+
+.column-wrapper > div {
+  margin: 4px;
+  height: 30px;
+  background: #CCC;
+}
+
+.h-overflow {
+  width: 500px;
+}
+
+.row-wrapper > div {
+  margin: 4px;
+  width: 30px;
+  background: #CCC;
+}
+
+.v-overflow {
+  height: 500px;
+}
+</style>
+
+<div class=column-wrapper>
+  <div>one</div>
+  <div class=h-overflow>two</div>
+</div>
+
+<div class=row-wrapper>
+  <div>one</div>
+  <div class=v-overflow>two</div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-computed.html b/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-computed.html
new file mode 100644
index 0000000..258960d7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-computed.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: getComputedValue().insetBlock / insetInline</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-inset-block">
+<meta name="assert" content="Computed value is as specified, with lengths made absolute.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+  #target {
+    font-size: 40px;
+  }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("inset-block-start", "auto");
+test_computed_value("inset-block-end", "-10px");
+test_computed_value("inset-inline-start", "-20%");
+test_computed_value("inset-inline-end", "calc(10px - 0.5em)", "-10px");
+
+test_computed_value("inset-block", "auto");
+test_computed_value("inset-block", "-10px");
+test_computed_value("inset-block", "calc(10px - 0.5em) -20%", "-10px -20%");
+test_computed_value("inset-block", "auto auto", "auto");
+test_computed_value("inset-inline", "-20%");
+test_computed_value("inset-inline", "calc(10px - 0.5em)", "-10px");
+test_computed_value("inset-inline", "-10px auto");
+test_computed_value("inset-inline", "auto calc(10px + 0.5em)", "auto 30px");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-invalid.html
new file mode 100644
index 0000000..fe073f85
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-invalid.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: parsing inset-block and inset-inline with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-inset-block">
+<meta name="assert" content="inset-block, inset-inline support only the grammar '<'top'>{1,2}'.">
+<meta name="assert" content="inset-block, inset-inline longhands support only the grammar '<'top'>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("inset-block-start", "none");
+test_invalid_value("inset-block-end", "10");
+test_invalid_value("inset-inline-start", "20% calc(10px - 0.5em)");
+test_invalid_value("inset-inline-end", "10px, auto");
+
+test_invalid_value("inset-block", "none");
+test_invalid_value("inset-block", "20%, calc(10px - 0.5em)");
+test_invalid_value("inset-inline", "10px auto 20px");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-valid.html b/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-valid.html
new file mode 100644
index 0000000..1287f697
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-logical/parsing/inset-block-inline-valid.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Logical Properties and Values: parsing inset-block and inset-inline with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-inset-block">
+<meta name="assert" content="inset-block, inset-inline support the full grammar '<'top'>{1,2}'.">
+<meta name="assert" content="inset-block, inset-inline longhands support the full grammar '<'top'>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("inset-block-start", "auto");
+test_valid_value("inset-block-end", "-10px");
+test_valid_value("inset-inline-start", "-20%");
+test_valid_value("inset-inline-end", "calc(10px - 0.5em)");
+
+test_valid_value("inset-block", "auto");
+test_valid_value("inset-block", "-10px");
+test_valid_value("inset-block", "calc(10px - 0.5em) -20%");
+test_valid_value("inset-block", "auto auto", "auto");
+test_valid_value("inset-inline", "-20%");
+test_valid_value("inset-inline", "calc(10px - 0.5em)");
+test_valid_value("inset-inline", "-10px auto");
+test_valid_value("inset-inline", "auto calc(10px + 0.5em)");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-computed-expected.txt
new file mode 100644
index 0000000..5c7de8d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-computed-expected.txt
@@ -0,0 +1,24 @@
+This is a testharness.js-based test.
+PASS Property scroll-padding-block-start value 'auto' computes to 'auto'
+PASS Property scroll-padding-block-start value '10px' computes to '10px'
+PASS Property scroll-padding-block-start value '20%' computes to '20%'
+PASS Property scroll-padding-block-start value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-block-start value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-block-start value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-block-end value 'auto' computes to 'auto'
+PASS Property scroll-padding-block-end value '10px' computes to '10px'
+PASS Property scroll-padding-block-end value '20%' computes to '20%'
+PASS Property scroll-padding-block-end value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-block-end value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-block-end value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-block value 'auto' computes to 'auto'
+PASS Property scroll-padding-block value '10px' computes to '10px'
+PASS Property scroll-padding-block value '20%' computes to '20%'
+PASS Property scroll-padding-block value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-block value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-block value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-block value '1px 2px' computes to '1px 2px'
+FAIL Property scroll-padding-block value '1px auto' computes to '1px auto' assert_equals: expected "1px auto" but got "auto"
+PASS Property scroll-padding-block value 'auto auto' computes to 'auto'
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-computed.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-computed.html
new file mode 100644
index 0000000..68ad0cd83
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-computed.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Scroll Snap: getComputedValue().scrollPaddingBlock</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-block">
+<meta name="assert" content="scroll-padding-block computed value is per side, either the keyword auto or a computed <length-percentage> value.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<style>
+  #target {
+    font-size: 40px;
+  }
+</style>
+<script>
+test_computed_value("scroll-padding-block-start", "auto");
+test_computed_value("scroll-padding-block-start", "10px");
+test_computed_value("scroll-padding-block-start", "20%");
+test_computed_value("scroll-padding-block-start", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-block-start", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-block-start", "calc(50% + 60px)");
+
+
+test_computed_value("scroll-padding-block-end", "auto");
+test_computed_value("scroll-padding-block-end", "10px");
+test_computed_value("scroll-padding-block-end", "20%");
+test_computed_value("scroll-padding-block-end", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-block-end", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-block-end", "calc(50% + 60px)");
+
+
+test_computed_value("scroll-padding-block", "auto");
+test_computed_value("scroll-padding-block", "10px");
+test_computed_value("scroll-padding-block", "20%");
+test_computed_value("scroll-padding-block", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-block", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-block", "calc(50% + 60px)");
+
+test_computed_value("scroll-padding-block", "1px 2px");
+test_computed_value("scroll-padding-block", "1px auto");
+test_computed_value("scroll-padding-block", "auto auto", "auto");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-invalid.html
new file mode 100644
index 0000000..206e6f5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-block-invalid.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Scroll Snap Test: scroll-padding-block with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-block">
+<meta name="assert" content="scroll-padding-block supports only the grammar '[ auto | <length-percentage> ]{1,2}'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("scroll-padding-block-start", "none");
+test_invalid_value("scroll-padding-block-start", "-10px");
+test_invalid_value("scroll-padding-block-start", "10px 20%");
+
+
+test_invalid_value("scroll-padding-block-end", "none");
+test_invalid_value("scroll-padding-block-end", "-10px");
+test_invalid_value("scroll-padding-block-end", "10px 20%");
+
+
+test_invalid_value("scroll-padding-block", "none");
+test_invalid_value("scroll-padding-block", "-10px");
+test_invalid_value("scroll-padding-block", "10px 20px 30px 40px 50px");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-computed-expected.txt
new file mode 100644
index 0000000..bb6269d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-computed-expected.txt
@@ -0,0 +1,43 @@
+This is a testharness.js-based test.
+PASS Property scroll-padding-top value 'auto' computes to 'auto'
+PASS Property scroll-padding-top value '0' computes to '0px'
+PASS Property scroll-padding-top value '10px' computes to '10px'
+PASS Property scroll-padding-top value '20%' computes to '20%'
+PASS Property scroll-padding-top value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-top value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-top value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-right value 'auto' computes to 'auto'
+PASS Property scroll-padding-right value '0' computes to '0px'
+PASS Property scroll-padding-right value '10px' computes to '10px'
+PASS Property scroll-padding-right value '20%' computes to '20%'
+PASS Property scroll-padding-right value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-right value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-right value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-bottom value 'auto' computes to 'auto'
+PASS Property scroll-padding-bottom value '0' computes to '0px'
+PASS Property scroll-padding-bottom value '10px' computes to '10px'
+PASS Property scroll-padding-bottom value '20%' computes to '20%'
+PASS Property scroll-padding-bottom value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-bottom value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-bottom value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-left value 'auto' computes to 'auto'
+PASS Property scroll-padding-left value '0' computes to '0px'
+PASS Property scroll-padding-left value '10px' computes to '10px'
+PASS Property scroll-padding-left value '20%' computes to '20%'
+PASS Property scroll-padding-left value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-left value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-left value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding value 'auto' computes to 'auto'
+PASS Property scroll-padding value '10px' computes to '10px'
+PASS Property scroll-padding value '0' computes to '0px'
+PASS Property scroll-padding value '20%' computes to '20%'
+PASS Property scroll-padding value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding value '1px 2px' computes to '1px 2px'
+PASS Property scroll-padding value '1px 2px 3%' computes to '1px 2px 3%'
+PASS Property scroll-padding value '1px 2px 3% 4px' computes to '1px 2px 3% 4px'
+FAIL Property scroll-padding value '1px auto' computes to '1px auto' assert_equals: expected "1px auto" but got "auto"
+PASS Property scroll-padding value '0 0 0 0' computes to '0px'
+PASS Property scroll-padding value 'auto auto auto auto' computes to 'auto'
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-computed.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-computed.html
new file mode 100644
index 0000000..5a5123a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-computed.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Scroll Snap: getComputedValue().scrollPadding</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding">
+<meta name="assert" content="scroll-padding computed value is per side, either the keyword auto or a computed <length-percentage> value.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<style>
+  #target {
+    font-size: 40px;
+  }
+</style>
+<script>
+test_computed_value("scroll-padding-top", "auto");
+test_computed_value("scroll-padding-top", "0", "0px");
+test_computed_value("scroll-padding-top", "10px");
+test_computed_value("scroll-padding-top", "20%");
+test_computed_value("scroll-padding-top", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-top", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-top", "calc(50% + 60px)");
+
+
+test_computed_value("scroll-padding-right", "auto");
+test_computed_value("scroll-padding-right", "0", "0px");
+test_computed_value("scroll-padding-right", "10px");
+test_computed_value("scroll-padding-right", "20%");
+test_computed_value("scroll-padding-right", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-right", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-right", "calc(50% + 60px)");
+
+
+test_computed_value("scroll-padding-bottom", "auto");
+test_computed_value("scroll-padding-bottom", "0", "0px");
+test_computed_value("scroll-padding-bottom", "10px");
+test_computed_value("scroll-padding-bottom", "20%");
+test_computed_value("scroll-padding-bottom", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-bottom", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-bottom", "calc(50% + 60px)");
+
+
+test_computed_value("scroll-padding-left", "auto");
+test_computed_value("scroll-padding-left", "0", "0px");
+test_computed_value("scroll-padding-left", "10px");
+test_computed_value("scroll-padding-left", "20%");
+test_computed_value("scroll-padding-left", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-left", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-left", "calc(50% + 60px)");
+
+
+test_computed_value("scroll-padding", "auto");
+test_computed_value("scroll-padding", "10px");
+test_computed_value("scroll-padding", "0", "0px");
+test_computed_value("scroll-padding", "20%");
+test_computed_value("scroll-padding", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding", "calc(10px - 0.5em)", "0px");
+
+test_computed_value("scroll-padding", "1px 2px");
+test_computed_value("scroll-padding", "1px 2px 3%");
+test_computed_value("scroll-padding", "1px 2px 3% 4px");
+test_computed_value("scroll-padding", "1px auto");
+test_computed_value("scroll-padding", "0 0 0 0", "0px");
+test_computed_value("scroll-padding", "auto auto auto auto", "auto");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-computed-expected.txt
new file mode 100644
index 0000000..1cca11c2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-computed-expected.txt
@@ -0,0 +1,24 @@
+This is a testharness.js-based test.
+PASS Property scroll-padding-inline-start value 'auto' computes to 'auto'
+PASS Property scroll-padding-inline-start value '10px' computes to '10px'
+PASS Property scroll-padding-inline-start value '20%' computes to '20%'
+PASS Property scroll-padding-inline-start value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-inline-start value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-inline-start value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-inline-end value 'auto' computes to 'auto'
+PASS Property scroll-padding-inline-end value '10px' computes to '10px'
+PASS Property scroll-padding-inline-end value '20%' computes to '20%'
+PASS Property scroll-padding-inline-end value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-inline-end value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-inline-end value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-inline value 'auto' computes to 'auto'
+PASS Property scroll-padding-inline value '10px' computes to '10px'
+PASS Property scroll-padding-inline value '20%' computes to '20%'
+PASS Property scroll-padding-inline value 'calc(10px + 0.5em)' computes to '30px'
+PASS Property scroll-padding-inline value 'calc(10px - 0.5em)' computes to '0px'
+PASS Property scroll-padding-inline value 'calc(50% + 60px)' computes to 'calc(50% + 60px)'
+PASS Property scroll-padding-inline value '1px 2px' computes to '1px 2px'
+FAIL Property scroll-padding-inline value '1px auto' computes to '1px auto' assert_equals: expected "1px auto" but got "auto"
+PASS Property scroll-padding-inline value 'auto auto' computes to 'auto'
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-computed.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-computed.html
new file mode 100644
index 0000000..d753bac
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-computed.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Scroll Snap: getComputedValue().scrollPaddingInline</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-inline">
+<meta name="assert" content="scroll-padding-inline computed value is per side, either the keyword auto or a computed <length-percentage> value.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<style>
+  #target {
+    font-size: 40px;
+  }
+</style>
+<script>
+test_computed_value("scroll-padding-inline-start", "auto");
+test_computed_value("scroll-padding-inline-start", "10px");
+test_computed_value("scroll-padding-inline-start", "20%");
+test_computed_value("scroll-padding-inline-start", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-inline-start", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-inline-start", "calc(50% + 60px)");
+
+
+test_computed_value("scroll-padding-inline-end", "auto");
+test_computed_value("scroll-padding-inline-end", "10px");
+test_computed_value("scroll-padding-inline-end", "20%");
+test_computed_value("scroll-padding-inline-end", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-inline-end", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-inline-end", "calc(50% + 60px)");
+
+
+test_computed_value("scroll-padding-inline", "auto");
+test_computed_value("scroll-padding-inline", "10px");
+test_computed_value("scroll-padding-inline", "20%");
+test_computed_value("scroll-padding-inline", "calc(10px + 0.5em)", "30px");
+test_computed_value("scroll-padding-inline", "calc(10px - 0.5em)", "0px");
+test_computed_value("scroll-padding-inline", "calc(50% + 60px)");
+
+test_computed_value("scroll-padding-inline", "1px 2px");
+test_computed_value("scroll-padding-inline", "1px auto");
+test_computed_value("scroll-padding-inline", "auto auto", "auto");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-invalid.html
new file mode 100644
index 0000000..0cf3fa7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-inline-invalid.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Scroll Snap Test: scroll-padding-inline with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-inline">
+<meta name="assert" content="scroll-padding-inline supports only the grammar '[ auto | <length-percentage> ]{1,2}'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("scroll-padding-inline-start", "none");
+test_invalid_value("scroll-padding-inline-start", "-10px");
+test_invalid_value("scroll-padding-inline-start", "10px 20%");
+
+
+test_invalid_value("scroll-padding-inline-end", "none");
+test_invalid_value("scroll-padding-inline-end", "-10px");
+test_invalid_value("scroll-padding-inline-end", "10px 20%");
+
+
+test_invalid_value("scroll-padding-inline", "none");
+test_invalid_value("scroll-padding-inline", "-10px");
+test_invalid_value("scroll-padding-inline", "10px 20px 30px 40px 50px");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-invalid.html
index 9b24a53..e060fcdc 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-invalid.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/parsing/scroll-padding-invalid.html
@@ -13,22 +13,32 @@
 <script>
 test_invalid_value("scroll-padding-top", "20");
 test_invalid_value("scroll-padding-top", "-20px");
+test_invalid_value("scroll-padding-top", "none");
+test_invalid_value("scroll-padding-top", "10px 20%");
 
 
 test_invalid_value("scroll-padding-right", "20");
 test_invalid_value("scroll-padding-right", "-20px");
+test_invalid_value("scroll-padding-right", "none");
+test_invalid_value("scroll-padding-right", "10px 20%");
 
 
 test_invalid_value("scroll-padding-bottom", "20");
 test_invalid_value("scroll-padding-bottom", "-20px");
+test_invalid_value("scroll-padding-bottom", "none");
+test_invalid_value("scroll-padding-bottom", "10px 20%");
 
 
 test_invalid_value("scroll-padding-left", "20");
 test_invalid_value("scroll-padding-left", "-20px");
+test_invalid_value("scroll-padding-left", "none");
+test_invalid_value("scroll-padding-left", "10px 20%");
 
 
 test_invalid_value("scroll-padding", "20");
 test_invalid_value("scroll-padding", "-20px");
+test_invalid_value("scroll-padding", "none");
+test_invalid_value("scroll-padding", "10px 20px 30px 40px 50px");
 </script>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-crash.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-crash.html
new file mode 100644
index 0000000..de10bf8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-crash.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta name="assert" content="This test passes if the renderer does not crash."/>
+<link rel="help" href="https://crbug.com/963580" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div style="float:left; width:200px; height:200px; background: green;"></div>
+x
+<div style="width:200px; height:200px;">
+  <div id="target" style="float:left; width:100px; height:100px; shape-outside:polygon(10px 10px, 20px 20px);"></div>
+  y
+</div>
+<div style="float:left; width:200px; height:200px;"></div>
+<script>
+test(() => {
+  document.body.offsetTop;
+  target.style.shapeOutside = "none";
+  document.body.offsetTop;
+}, 'Test passes if the renderer does not crash.');
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom/cssstyledeclaration-properties-expected.txt b/third_party/blink/web_tests/external/wpt/css/cssom/cssstyledeclaration-properties-expected.txt
new file mode 100644
index 0000000..ead818b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/cssom/cssstyledeclaration-properties-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL CSS Test: CSSStyleDeclaration properties are defined as WebIDL attributes, not using getOwnPropertyNames() assert_false: shouldn't have an own property for WebIDL attributes expected false got true
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom/cssstyledeclaration-properties.html b/third_party/blink/web_tests/external/wpt/css/cssom/cssstyledeclaration-properties.html
new file mode 100644
index 0000000..12382cb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/cssom/cssstyledeclaration-properties.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<title>CSS Test: CSSStyleDeclaration properties are defined as WebIDL attributes, not using getOwnPropertyNames()</title>
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<link rel="help" href="https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-_camel_cased_attribute">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(function() {
+    let declaration = document.documentElement.style;
+    assert_true(declaration instanceof CSSStyleDeclaration, "Should be a CSStyleDeclaration");
+    assert_true("color" in declaration, "Should support the color property");
+    assert_false(declaration.hasOwnProperty("color"), "shouldn't have an own property for WebIDL attributes");
+  });
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-computed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-computed.html
new file mode 100644
index 0000000..347b075
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-computed.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Filter Effects Module Level 1: getComputedValue().floodColor</title>
+<link rel="help" href="https://drafts.fxtf.org/filter-effects/#FloodColorProperty">
+<meta name="assert" content="flood-color computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<style>
+  #target {
+    color: lime;
+  }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("flood-color", "currentcolor", "rgb(0, 255, 0)");
+
+test_computed_value("flood-color", "red", "rgb(255, 0, 0)");
+test_computed_value("flood-color", "#00FF00", "rgb(0, 255, 0)");
+test_computed_value("flood-color", "rgb(0, 0, 255)");
+test_computed_value("flood-color", "rgb(100%, 100%, 0%)", "rgb(255, 255, 0)");
+test_computed_value("flood-color", "hsl(120, 100%, 50%)", "rgb(0, 255, 0)");
+test_computed_value("flood-color", "teal", "rgb(0, 128, 128)");
+
+test_computed_value("flood-color", "transparent", "rgba(0, 0, 0, 0)");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-invalid.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-invalid.html
new file mode 100644
index 0000000..7cc91489
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-invalid.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Filter Effects Module Level 1: parsing flood-color with invalid values</title>
+<link rel="help" href="https://drafts.fxtf.org/filter-effects/#FloodColorProperty">
+<meta name="assert" content="flood-color supports only the grammar '<color>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("flood-color", "none");
+test_invalid_value("flood-color", "black white");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-valid.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-valid.html
new file mode 100644
index 0000000..5fb4a26
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/parsing/flood-color-valid.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Filter Effects Module Level 1: parsing flood-color with valid values</title>
+<link rel="help" href="https://drafts.fxtf.org/filter-effects/#FloodColorProperty">
+<meta name="assert" content="flood-color supports the full grammar '<color>'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("flood-color", "currentcolor");
+
+test_valid_value("flood-color", "red");
+test_valid_value("flood-color", "#00FF00", "rgb(0, 255, 0)");
+test_valid_value("flood-color", "rgb(0, 0, 255)");
+test_valid_value("flood-color", "rgb(100%, 100%, 0%)", "rgb(255, 255, 0)");
+test_valid_value("flood-color", "hsl(120, 100%, 50%)", "rgb(0, 255, 0)");
+test_valid_value("flood-color", "teal");
+
+test_valid_value("flood-color", "transparent");
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/HTMLElement-attachInternals-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/HTMLElement-attachInternals-expected.txt
deleted file mode 100644
index 9594d45f..0000000
--- a/third_party/blink/web_tests/external/wpt/custom-elements/HTMLElement-attachInternals-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This is a testharness.js-based test.
-FAIL Successful attachInternals() and the second call. assert_throws: New - 2nd call function "() => { element.attachInternals(); }" threw object "InvalidStateError: Failed to execute 'attachInternals' on 'HTMLElement': ElementInternals for the specified element was already attached." that is not a DOMException NotSupportedError: property "code" is equal to 11, expected 9
-PASS attachInternals() throws a NotSupportedError if it is called for a customized built-in element
-FAIL If a custom element definition for the local name of the element doesn't exist, throw an NotSupportedError assert_throws: function "() => { builtin.attachInternals() }" threw object "InvalidStateError: Failed to execute 'attachInternals' on 'HTMLElement': Unable to attach ElementInternals to non-custom elements." that is not a DOMException NotSupportedError: property "code" is equal to 11, expected 9
-PASS If a custom element definition for the local name of the element has disable internals flag, throw a NotSupportedError
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-validation-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-validation-expected.txt
index d0b11b3..e3e31aa 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-validation-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/ElementInternals-validation-expected.txt
@@ -1,9 +1,7 @@
 This is a testharness.js-based test.
 PASS willValidate
 FAIL validity and setValidity() assert_throws: setValidity() requires the second argument if the first argument contains true function "() => { control.i.setValidity({valueMissing: true}); }" threw object "TypeMismatchError: Failed to execute 'setValidity' on 'ElementInternals': The second argument should not be empty if one or more flags in the first argument are true." ("TypeMismatchError") expected object "TypeError" ("TypeError")
-FAIL "anchor" argument of setValidity() assert_throws: Not a descendant function "() => {
-    control.i.setValidity(flags, m, document.body);
-  }" did not throw
+PASS "anchor" argument of setValidity()
 PASS checkValidity()
 PASS reportValidity()
 PASS Custom control affects validation at the owner form
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/META.yml b/third_party/blink/web_tests/external/wpt/element-timing/META.yml
new file mode 100644
index 0000000..15510df7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/element-timing/META.yml
@@ -0,0 +1,3 @@
+spec: https://wicg.github.io/element-timing/
+suggested_reviewers:
+  - npm1
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/background-image-data-uri.html b/third_party/blink/web_tests/external/wpt/element-timing/background-image-data-uri.html
index 16d6dfcb..3cac0f5 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/background-image-data-uri.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/background-image-data-uri.html
@@ -18,6 +18,9 @@
 <script>
   let beforeRender = performance.now();
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/background-image-multiple-elements.html b/third_party/blink/web_tests/external/wpt/element-timing/background-image-multiple-elements.html
index 22b4158..a4ad83d 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/background-image-multiple-elements.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/background-image-multiple-elements.html
@@ -23,6 +23,9 @@
 <script src="resources/element-timing-helpers.js"></script>
 <script>
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     let beforeRender = performance.now();
     let numObservedElements = 0;
     let observedDiv1 = false;
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/background-image-stretched.html b/third_party/blink/web_tests/external/wpt/element-timing/background-image-stretched.html
index 28c355398..930b4cef 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/background-image-stretched.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/background-image-stretched.html
@@ -18,6 +18,9 @@
 <script>
   let beforeRender = performance.now();
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/buffer-before-onload.html b/third_party/blink/web_tests/external/wpt/element-timing/buffer-before-onload.html
index 03c7048..88a641bb 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/buffer-before-onload.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/buffer-before-onload.html
@@ -14,6 +14,9 @@
   the performance timeline.
   */
   async_test(function(t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     beforeRender = performance.now();
     const img = document.createElement('img');
     img.src = 'resources/square20.jpg';
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/cross-origin-element.sub.html b/third_party/blink/web_tests/external/wpt/element-timing/cross-origin-element.sub.html
index 0af0ae96..40a97056 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/cross-origin-element.sub.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/cross-origin-element.sub.html
@@ -12,6 +12,9 @@
 <script src="resources/element-timing-helpers.js"></script>
 <script>
   async_test((t) => {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     let img;
     const pathname = 'http://{{domains[www]}}:{{ports[http][1]}}'
           + '/element-timing/resources/square100.png';
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/cross-origin-iframe-element.sub.html b/third_party/blink/web_tests/external/wpt/element-timing/cross-origin-iframe-element.sub.html
index a369d25b..7296cfc 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/cross-origin-iframe-element.sub.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/cross-origin-iframe-element.sub.html
@@ -7,6 +7,9 @@
 <script src="resources/element-timing-helpers.js"></script>
 <script>
   async_test((t) => {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done((entryList) => {
         assert_unreached("We should not observe a cross origin element.");
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/disconnect-image.html b/third_party/blink/web_tests/external/wpt/element-timing/disconnect-image.html
index 4ee0516..82e7461 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/disconnect-image.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/disconnect-image.html
@@ -9,6 +9,9 @@
   let beforeRender;
   let img;
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-TAO-wildcard.sub.html b/third_party/blink/web_tests/external/wpt/element-timing/image-TAO-wildcard.sub.html
index 4ec8aa7d..3af893a 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-TAO-wildcard.sub.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-TAO-wildcard.sub.html
@@ -12,6 +12,9 @@
 <script src="resources/element-timing-helpers.js"></script>
 <script>
   async_test((t) => {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     let beforeRender;
     let img;
     const img_src = 'http://{{domains[www]}}:{{ports[http][1]}}/element-timing/'
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-carousel.html b/third_party/blink/web_tests/external/wpt/element-timing/image-carousel.html
index 404eca3..39d9f01 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-carousel.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-carousel.html
@@ -26,6 +26,9 @@
 
 <script>
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const beforeRenderTimes = [];
     let entry_count = 0;
     const entry_count_per_element = [0, 0];
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-clipped-svg.html b/third_party/blink/web_tests/external/wpt/element-timing/image-clipped-svg.html
index 3007bf7..1e9971c 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-clipped-svg.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-clipped-svg.html
@@ -7,6 +7,9 @@
 <script>
 let beforeRender;
 async_test(function (t) {
+  if (!window.PerformanceElementTiming) {
+    assert_unreached("PerformanceElementTiming is not implemented");
+  }
   const observer = new PerformanceObserver(
     t.step_func_done(function(entryList) {
       assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-data-uri.html b/third_party/blink/web_tests/external/wpt/element-timing/image-data-uri.html
index 2b5d04e45..e698bcf 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-data-uri.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-data-uri.html
@@ -16,6 +16,9 @@
 <script>
   let beforeRender = performance.now();
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-not-added.html b/third_party/blink/web_tests/external/wpt/element-timing/image-not-added.html
index 59a254e..e65d181 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-not-added.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-not-added.html
@@ -5,6 +5,9 @@
 <script src="/resources/testharnessreport.js"></script>
 <script>
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(() => {
         // The image should not have caused an entry, so fail test.
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-not-fully-visible.html b/third_party/blink/web_tests/external/wpt/element-timing/image-not-fully-visible.html
index 5716249..105bb55 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-not-fully-visible.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-not-fully-visible.html
@@ -14,6 +14,9 @@
   let beforeRender;
   let img;
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-rect-iframe.html b/third_party/blink/web_tests/external/wpt/element-timing/image-rect-iframe.html
index f051130..7441405 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-rect-iframe.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-rect-iframe.html
@@ -11,6 +11,9 @@
 <script src="/resources/testharnessreport.js"></script>
 <script>
   async_test((t) => {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     on_event(window, 'message', e => {
       assert_equals(e.data.length, 1);
       assert_equals(e.data.entryType, 'element');
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-with-css-scale.html b/third_party/blink/web_tests/external/wpt/element-timing/image-with-css-scale.html
index bdffdb26..5c15daa 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-with-css-scale.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-with-css-scale.html
@@ -21,6 +21,9 @@
 <script>
   const beforeRender = performance.now();
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-with-rotation.html b/third_party/blink/web_tests/external/wpt/element-timing/image-with-rotation.html
index 4433ecb..c545becd 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-with-rotation.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-with-rotation.html
@@ -21,6 +21,9 @@
 <script>
   const beforeRender = performance.now();
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/images-repeated-resource.html b/third_party/blink/web_tests/external/wpt/element-timing/images-repeated-resource.html
index fbb2d6a1..9bc8b5f4 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/images-repeated-resource.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/images-repeated-resource.html
@@ -21,6 +21,9 @@
   const pathname = window.location.href.substring(0, index) +
       '/resources/square100.png';
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func(function(entryList) {
         entryList.getEntries().forEach(entry => {
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/invisible-images.html b/third_party/blink/web_tests/external/wpt/element-timing/invisible-images.html
index 50aa6d13..eb53cd7c 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/invisible-images.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/invisible-images.html
@@ -16,6 +16,9 @@
 </style>
 <script>
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(() => {
         // The image should not have caused an entry, so fail test.
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/multiple-background-images.html b/third_party/blink/web_tests/external/wpt/element-timing/multiple-background-images.html
index f3fbe76..a762ed1 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/multiple-background-images.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/multiple-background-images.html
@@ -18,6 +18,9 @@
 <script>
   let beforeRender = performance.now();
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     let numObservedElements = 0;
     let observedCircle = false;
     let observedSquare = false;
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-background-image.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-background-image.html
index 680c5e4..c642264a 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-background-image.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-background-image.html
@@ -18,6 +18,9 @@
 <script>
   let beforeRender = performance.now();
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-child-element.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-child-element.html
index 9166a4b..33e92a9 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-child-element.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-child-element.html
@@ -12,6 +12,9 @@
 <script src="resources/element-timing-helpers.js"></script>
 <script>
   async_test((t) => {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done((entryList) => {
         assert_unreached("Should not have received an entry!");
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-elementtiming.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-elementtiming.html
index 73f9351..0c67130d 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-elementtiming.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-elementtiming.html
@@ -14,6 +14,9 @@
   let beforeRender;
   let img;
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-large-image.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-large-image.html
index 13fc71b..e907452 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-large-image.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-large-image.html
@@ -14,6 +14,9 @@
   let beforeRender;
   let img;
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-multiple-images.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-multiple-images.html
index b9e82ed..8a5fa0b 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-multiple-images.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-multiple-images.html
@@ -22,6 +22,9 @@
 <script>
   let beforeRender, image1Observed=0, image2Observed=0, image3Observed=0;
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const index = window.location.href.lastIndexOf('/');
     const observer = new PerformanceObserver(
       t.step_func(function(entryList) {
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-shadow-image.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-shadow-image.html
index a4d21be..4309196 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-shadow-image.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-shadow-image.html
@@ -14,6 +14,9 @@
   let beforeRender;
   let img;
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-svg-image.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-svg-image.html
index c3c178e..29fec392 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-svg-image.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-svg-image.html
@@ -7,6 +7,9 @@
 <script>
 let beforeRender;
 async_test(function (t) {
+  if (!window.PerformanceElementTiming) {
+    assert_unreached("PerformanceElementTiming is not implemented");
+  }
   const observer = new PerformanceObserver(
     t.step_func_done(function(entryList) {
       assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/observe-video-poster.html b/third_party/blink/web_tests/external/wpt/element-timing/observe-video-poster.html
index 500fcedc..9f82478 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/observe-video-poster.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/observe-video-poster.html
@@ -7,6 +7,9 @@
 <script>
 let beforeRender;
 async_test(function (t) {
+  if (!window.PerformanceElementTiming) {
+    assert_unreached("PerformanceElementTiming is not implemented");
+  }
   const observer = new PerformanceObserver(
     t.step_func_done(function(entryList) {
       assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/progressively-loaded-image.html b/third_party/blink/web_tests/external/wpt/element-timing/progressively-loaded-image.html
index c534621c..a55c589 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/progressively-loaded-image.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/progressively-loaded-image.html
@@ -14,6 +14,9 @@
   let numInitial = 75;
   let sleep = 500;
   async_test(function(t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const img_src = 'resources/progressive-image.py?name=square20.jpg&numInitial='
       + numInitial + '&sleep=' + sleep;
     const observer = new PerformanceObserver(
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/rectangular-image.html b/third_party/blink/web_tests/external/wpt/element-timing/rectangular-image.html
index a1af961..0b44c4fd 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/rectangular-image.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/rectangular-image.html
@@ -14,6 +14,9 @@
   let beforeRender;
   let img;
   async_test(function (t) {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
     const observer = new PerformanceObserver(
       t.step_func_done(function(entryList) {
         assert_equals(entryList.getEntries().length, 1);
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/bounding-box.html b/third_party/blink/web_tests/external/wpt/intersection-observer/bounding-box.html
index 50f33f04..367243d5 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/bounding-box.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/bounding-box.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/client-rect.html b/third_party/blink/web_tests/external/wpt/intersection-observer/client-rect.html
index 6c50fdb1..e85171c 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/client-rect.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/client-rect.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/containing-block.html b/third_party/blink/web_tests/external/wpt/intersection-observer/containing-block.html
index d4f46b0..f7ce6fa7 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/containing-block.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/containing-block.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.html b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.html
index 2c9c4bcec..bdd6d3f 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/disconnect.html b/third_party/blink/web_tests/external/wpt/intersection-observer/disconnect.html
index 0abfbc4..9c02daf 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/disconnect.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/disconnect.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/display-none.html b/third_party/blink/web_tests/external/wpt/intersection-observer/display-none.html
index 7cebc56..cae3509 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/display-none.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/display-none.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/edge-inclusive-intersection.html b/third_party/blink/web_tests/external/wpt/intersection-observer/edge-inclusive-intersection.html
index b9fa24b87..b73c407 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/edge-inclusive-intersection.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/edge-inclusive-intersection.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/empty-root-margin.html b/third_party/blink/web_tests/external/wpt/intersection-observer/empty-root-margin.html
index 48c9aa4..9eaf856 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/empty-root-margin.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/empty-root-margin.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root-with-wrapping-scroller.html b/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root-with-wrapping-scroller.html
index f219ba3..28e6d09d7b 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root-with-wrapping-scroller.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root-with-wrapping-scroller.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root.html b/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root.html
index e37aeac..8532246 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/iframe-no-root.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/initial-observation-with-threshold.html b/third_party/blink/web_tests/external/wpt/intersection-observer/initial-observation-with-threshold.html
index d677f0ee..b9218b0 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/initial-observation-with-threshold.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/initial-observation-with-threshold.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/inline-client-rect.html b/third_party/blink/web_tests/external/wpt/intersection-observer/inline-client-rect.html
index 0bdfc8d..c096230 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/inline-client-rect.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/inline-client-rect.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/isIntersecting-change-events.html b/third_party/blink/web_tests/external/wpt/intersection-observer/isIntersecting-change-events.html
index f9362c30..3dcc778 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/isIntersecting-change-events.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/isIntersecting-change-events.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/isIntersecting-threshold.html b/third_party/blink/web_tests/external/wpt/intersection-observer/isIntersecting-threshold.html
index 7d2957b..106b65ed 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/isIntersecting-threshold.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/isIntersecting-threshold.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/multiple-targets.html b/third_party/blink/web_tests/external/wpt/intersection-observer/multiple-targets.html
index 525c5a6..22353e3a 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/multiple-targets.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/multiple-targets.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/multiple-thresholds.html b/third_party/blink/web_tests/external/wpt/intersection-observer/multiple-thresholds.html
index 64500689..3599e1f 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/multiple-thresholds.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/multiple-thresholds.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/observer-attributes.html b/third_party/blink/web_tests/external/wpt/intersection-observer/observer-attributes.html
index ffca95d..4e2e529 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/observer-attributes.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/observer-attributes.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/observer-exceptions.html b/third_party/blink/web_tests/external/wpt/intersection-observer/observer-exceptions.html
index 5d29234..f8d089b 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/observer-exceptions.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/observer-exceptions.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/observer-in-iframe.html b/third_party/blink/web_tests/external/wpt/intersection-observer/observer-in-iframe.html
index f4aa387d..e918bf1a 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/observer-in-iframe.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/observer-in-iframe.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <style>
 pre, #log {
   position: absolute;
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/observer-without-js-reference.html b/third_party/blink/web_tests/external/wpt/intersection-observer/observer-without-js-reference.html
index 3214345..53100c50 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/observer-without-js-reference.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/observer-without-js-reference.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/remove-element.html b/third_party/blink/web_tests/external/wpt/intersection-observer/remove-element.html
index 3b6a65e..a093b22 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/remove-element.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/remove-element.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/root-margin.html b/third_party/blink/web_tests/external/wpt/intersection-observer/root-margin.html
index c1fffec..898454c4f 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/root-margin.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/root-margin.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-no-root.html b/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-no-root.html
index 7838808..63e9f86d 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-no-root.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-no-root.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-root.html b/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-root.html
index 40467be..bfb9b72 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-root.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-root.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-zero-size-target.html b/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-zero-size-target.html
index d835b406..20bd11d 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-zero-size-target.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/same-document-zero-size-target.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/shadow-content.html b/third_party/blink/web_tests/external/wpt/intersection-observer/shadow-content.html
index d049c70..ce9473cb 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/shadow-content.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/shadow-content.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/target-in-different-window.html b/third_party/blink/web_tests/external/wpt/intersection-observer/target-in-different-window.html
index cf8fe4e..645b7ec 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/target-in-different-window.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/target-in-different-window.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/text-target.html b/third_party/blink/web_tests/external/wpt/intersection-observer/text-target.html
index 13dc3ab..1abe535 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/text-target.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/text-target.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/timestamp.html b/third_party/blink/web_tests/external/wpt/intersection-observer/timestamp.html
index be198004..3f573bc 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/timestamp.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/timestamp.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/unclipped-root.html b/third_party/blink/web_tests/external/wpt/intersection-observer/unclipped-root.html
index 24ae01c..a59105e 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/unclipped-root.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/unclipped-root.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/animated-occlusion.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/animated-occlusion.html
index c1eafb7..fa69733b 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/animated-occlusion.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/animated-occlusion.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/blur-filter.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/blur-filter.html
index 2f55066..8cf6306 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/blur-filter.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/blur-filter.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/box-shadow.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/box-shadow.html
index bcc6980..765fa8b 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/box-shadow.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/box-shadow.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-effects.sub.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-effects.sub.html
index 04b88b40..5f328bec 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-effects.sub.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-effects.sub.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-occlusion.sub.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-occlusion.sub.html
index b8bbcae..4c2f286 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-occlusion.sub.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/cross-origin-occlusion.sub.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/delay-test.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/delay-test.html
index 086301c4..231df32c 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/delay-test.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/delay-test.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/iframe-target.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/iframe-target.html
index 3e53ee5..53fbff8 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/iframe-target.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/iframe-target.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-effects.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-effects.html
index 2b7a83a9..baf3220 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-effects.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-effects.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion-svg-foreign-object.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion-svg-foreign-object.html
index fcdff67a..588ec2a 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion-svg-foreign-object.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion-svg-foreign-object.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion.html
index ea1ee31..f3ce518 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/simple-occlusion.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/text-shadow.html b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/text-shadow.html
index c6445c5..cdfc1a2d2 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/v2/text-shadow.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/v2/text-shadow.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="../resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-hidden.html b/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-hidden.html
index e007040..be57ac6 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-hidden.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-hidden.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-visible.html b/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-visible.html
index 6bf1297f..54317504 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-visible.html
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/zero-area-element-visible.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<meta name="viewport" content="width=device-width,initial-scale=1">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="./resources/intersection-observer-test-utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/change-payment-method.https-expected.txt b/third_party/blink/web_tests/external/wpt/payment-handler/change-payment-method.https-expected.txt
index 046d3ae..099831a 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/change-payment-method.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/change-payment-method.https-expected.txt
@@ -1,4 +1,4 @@
 This is a testharness.js-based test.
-FAIL Tests for PaymentRequestEvent.changePaymentMethod() Uncaught TypeError: Cannot set property 'click' of undefined
+FAIL Tests for PaymentRequestEvent.changePaymentMethod() Not allowed to install this payment handler
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/change-payment-method.https.html b/third_party/blink/web_tests/external/wpt/payment-handler/change-payment-method.https.html
index b85dad6..56690d2b 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/change-payment-method.https.html
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/change-payment-method.https.html
@@ -8,8 +8,8 @@
 <link rel="manifest" href="/payment-handler/basic-card.json" />
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="/resources/testdriver-vendor.js"></script>
 <script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
 <script src="register-and-activate-service-worker.js"></script>
 <p>If the payment sheet is shown, please authorize the mock payment.</p>
 <script>
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/Element-interface-attachShadow-custom-element-expected.txt b/third_party/blink/web_tests/external/wpt/shadow-dom/Element-interface-attachShadow-custom-element-expected.txt
deleted file mode 100644
index 657afa5..0000000
--- a/third_party/blink/web_tests/external/wpt/shadow-dom/Element-interface-attachShadow-custom-element-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-This is a testharness.js-based test.
-PASS Element.attachShadow must create an instance of ShadowRoot for autonomous custom elements
-PASS Element.attachShadow must create an instance of ShadowRoot for undefined autonomous custom elements
-FAIL Element.attachShadow for an autonomous custom element with disabledFeatures=["shadow"] should throw a NotSupportedError assert_throws: No definition, host function "() => {
-    element.attachShadow({mode: 'closed'});
-  }" threw object "InvalidStateError: Failed to execute 'attachShadow' on 'Element': Shadow root cannot be created on a host which already hosts a shadow tree." that is not a DOMException NotSupportedError: property "code" is equal to 11, expected 9
-FAIL Element.attachShadow for a customized built-in element with disabledFeatures=["shadow"] should throw a NotSupportedError assert_throws: No definition, host. function "() => {
-    element.attachShadow({mode: 'closed'});
-  }" threw object "InvalidStateError: Failed to execute 'attachShadow' on 'Element': Shadow root cannot be created on a host which already hosts a shadow tree." that is not a DOMException NotSupportedError: property "code" is equal to 11, expected 9
-PASS Element.attachShadow for a custom element with disabledFeatures=["SHADOW"] should not throw a NotSupportedError
-PASS Element.attachShadow must throw a NotSupportedError for customized built-in elements
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/Element-interface-attachShadow-expected.txt b/third_party/blink/web_tests/external/wpt/shadow-dom/Element-interface-attachShadow-expected.txt
deleted file mode 100644
index c4c1156..0000000
--- a/third_party/blink/web_tests/external/wpt/shadow-dom/Element-interface-attachShadow-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-This is a testharness.js-based test.
-PASS Check the existence of Element.attachShadow
-PASS Nodes other than Element should not have attachShadow
-PASS Element.attachShadow must throw a TypeError if mode is not "open" or "closed"
-PASS Element.attachShadow must create an instance of ShadowRoot
-FAIL Element.attachShadow must throw a NotSupportedError if the context object already hosts a shadow tree assert_throws: Calling attachShadow({mode: "open"}) twice on the same element must throw function "function () {
-        var div = document.createElement('div');
-        div.attachShadow({mode: "open"});
-        div.attachShadow({mode: "open"});
-    }" threw object "InvalidStateError: Failed to execute 'attachShadow' on 'Element': Shadow root cannot be created on a host which already hosts a shadow tree." ("InvalidStateError") expected object "[object Object]" ("NotSupportedError")
-PASS Element.attachShadow must throw a NotSupportedError for non-safelisted elements
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/sms/constructor.tentative.https.any.js b/third_party/blink/web_tests/external/wpt/sms/constructor.tentative.https.any.js
index 321e5510..a624934c 100644
--- a/third_party/blink/web_tests/external/wpt/sms/constructor.tentative.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/sms/constructor.tentative.https.any.js
@@ -2,7 +2,7 @@
 
 'use strict';
 
-promise_test(async t => {
+test(function() {
   let used = false;
 
   new SMSReceiver({
@@ -15,46 +15,38 @@
   assert_true(used, 'constructor options "timeout" member was used');
 }, 'constructor uses timeout property');
 
-promise_test(async t => {
-  try {
+test(function() {
+  assert_throws(new TypeError(), function () {
     new SMSReceiver({timeout: 0});
     assert_unreached('Timeout 0 should reject');
-  } catch (error) {
-    assert_equals(error.name, 'TypeError');
-  }
+  });
 }, 'constructor throws with invalid timeout (0)');
 
-promise_test(async t => {
-  try {
+test(function() {
+  assert_throws(new TypeError(), function () {
     new SMSReceiver({timeout: null});
     assert_unreached('Timeout of null should reject');
-  } catch (error) {
-    assert_equals(error.name, 'TypeError');
-  }
+  });
 }, 'constructor throws with invalid timeout (null)');
 
-promise_test(async t => {
-  try {
+test(function() {
+  assert_throws(new TypeError(), function () {
     new SMSReceiver({timeout: -1});
     assert_unreached('Timeout negative numbers should reject');
-  } catch (error) {
-    assert_equals(error.name, 'TypeError');
-  }
+  });
 }, 'constructor throws with invalid timeout (-1)');
 
-promise_test(async t => {
-  try {
+test(function() {
+  assert_throws(new TypeError(), function () {
     new SMSReceiver({timeout: NaN});
     assert_unreached('Timeout of NaN should reject');
-  } catch (error) {
-    assert_equals(error.name, 'TypeError');
-  }
+  });
 }, 'constructor throws with invalid timeout (NaN)');
 
-promise_test(async t => {
+test(function() {
   new SMSReceiver();
 }, 'constructor uses a default value for the timeout when none is passed');
 
-promise_test(async t => {
+test(function() {
   new SMSReceiver({timeout: undefined});
 }, 'constructor uses a default value for the timeout');
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCCertificate-postMessage.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCCertificate-postMessage.html
index 5885f9f..ee8347c 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCCertificate-postMessage.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCCertificate-postMessage.html
@@ -42,9 +42,10 @@
             iframe.contentWindow.postMessage(certificate, "*");
             let certificate2 = await promise;
 
-            new RTCPeerConnection({certificates: [certificate]});
-
-            new RTCPeerConnection({certificates: [certificate2]});
+            const pc1 = new RTCPeerConnection({certificates: [certificate]});
+            t.add_cleanup(() => pc1.close());
+            const pc2 = new RTCPeerConnection({certificates: [certificate2]});
+            t.add_cleanup(() => pc2.close());
 
             assert_equals(certificate.expires, certificate2.expires);
             for (let fingerprint of certificate2.getFingerprints())
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-send.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-send.html
index 76d3524d..4565a83 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-send.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-send.html
@@ -300,6 +300,7 @@
 
 promise_test(async t => {
   let pc1 = new RTCPeerConnection();
+  t.add_cleanup(() => pc1.close());
   let [channel1, channel2] = await createDataChannelPair(pc1);
   let message = 'hello888'; // 8 bytes
   while (message.length <= pc1.sctp.maxMessageSize) {
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCIceTransport-extension.https.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCIceTransport-extension.https.html
index 206a4bb..94beb99 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCIceTransport-extension.https.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCIceTransport-extension.https.html
@@ -98,7 +98,7 @@
   iceTransport.gather({});
   let candidate;
   do {
-    ({ candidate } = await watcher.wait_for('icecandidate'));
+    (({ candidate } = await watcher.wait_for('icecandidate')));
   } while (candidate !== null);
   assert_equals(iceTransport.gatheringState, 'gathering');
   await watcher.wait_for('gatheringstatechange');
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-setLocalDescription.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-setLocalDescription.html
index 2becbd3..c4671c3 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-setLocalDescription.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-setLocalDescription.html
@@ -125,6 +125,7 @@
 
   promise_test(async t => {
     const pc = new RTCPeerConnection();
+    t.add_cleanup(() => pc.close());
     const offer = await pc.createOffer();
     let eventSequence = '';
     const signalingstatechangeResolver = new Resolver();
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpParameters-transactionId.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpParameters-transactionId.html
index 472b0439..eb98a83 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpParameters-transactionId.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpParameters-transactionId.html
@@ -63,6 +63,7 @@
    */
   promise_test(async t => {
     const pc = new RTCPeerConnection();
+    t.add_cleanup(() => pc.close());
     const { sender } = pc.addTransceiver('audio');
     await doOfferAnswerExchange(t, pc);
 
@@ -73,7 +74,6 @@
     validateSenderRtpParameters(param2);
 
     assert_not_equals(param1.transactionId, param2.transactionId);
-
   }, `sender.getParameters() should return different transaction IDs for each call`);
 
   /*
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/basic-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/basic-a11y-test-expected.txt
index 6d5fb9c1..5a83a893 100644
--- a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/basic-a11y-test-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/basic-a11y-test-expected.txt
@@ -7,7 +7,4 @@
 Tests accessibility in the sensors view using the axe-core linter.
 aXe violations: []
 
-Tests accessibility in the preferences view using the axe-core linter.
-aXe violations: []
-
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/basic-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/basic-a11y-test.js
index 18d4dbd7..c9f853b 100644
--- a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/basic-a11y-test.js
+++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/basic-a11y-test.js
@@ -12,8 +12,6 @@
       'performance.monitor',
       // Sensors
       'sensors',
-      // Settings
-      'preferences',
     ];
 
 
diff --git a/third_party/blink/web_tests/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style-expected.txt b/third_party/blink/web_tests/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style-expected.txt
index 1d7f9c7..79481608 100644
--- a/third_party/blink/web_tests/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style-expected.txt
@@ -1,19 +1,26 @@
-CONSOLE MESSAGE: line 58: Injecting in main world: this should fail.
-CONSOLE ERROR: line 20: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-VW0vOGrZCqH0TKtw5B5uFtLP1DqNIIUce/tDyu/378c='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+CONSOLE MESSAGE: line 74: Injecting in main world: this should fail.
+CONSOLE ERROR: line 20: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-9mofj90uV/hjdJ1EZ8ch4jBC+3bw4vt8GBxoMUosVmo='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
-CONSOLE MESSAGE: line 31: PASS: Style assignment in test 4 was blocked by CSP.
-CONSOLE MESSAGE: line 62: Injecting into isolated world without bypass: this should fail.
-CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-mqk0x+ZowQUO8stz3Tm8e/4c044WSEbqlTVrz4jf9ko='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+CONSOLE MESSAGE: line 31: PASS: Style assignment in test 6 was blocked by CSP.
+CONSOLE MESSAGE: line 78: Injecting into isolated world without bypass: this should fail.
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-RMFtATOlfMpeC8MJSEmpniQZnGMRT24P+KNCE5zJg08='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
-CONSOLE MESSAGE: PASS: Style assignment in test 3 was blocked by CSP.
+CONSOLE MESSAGE: PASS: Style assignment in test 5 was blocked by CSP.
 CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-ZBTj5RHLnrF+IxdRZM2RuLfjTJQXNSi7fLQHr09onfY='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
-CONSOLE MESSAGE: PASS: Style attribute assignment in test 3 was blocked by CSP.
-CONSOLE MESSAGE: line 70: Starting to bypass main world's CSP: this should pass!
+CONSOLE MESSAGE: PASS: Style attribute assignment in test 5 was blocked by CSP.
+CONSOLE MESSAGE: line 86: Have a separate CSP for the isolated world. Allow unsafe-inline. This should pass.
+CONSOLE MESSAGE: PASS: Style assignment in test 4 was not blocked by CSP.
+CONSOLE MESSAGE: PASS: Style attribute assignment in test 4 was not blocked by CSP.
+CONSOLE MESSAGE: line 93: Have a separate CSP for the isolated world. Use an empty CSP. This should pass.
+CONSOLE MESSAGE: PASS: Style assignment in test 3 was not blocked by CSP.
+CONSOLE MESSAGE: PASS: Style attribute assignment in test 3 was not blocked by CSP.
+CONSOLE MESSAGE: line 99: Have a separate CSP for the isolated world. Disallow unsafe-inline.
+CONSOLE MESSAGE: line 103: internals.runtimeFlags.isolatedWorldCSPEnabled is false
 CONSOLE MESSAGE: PASS: Style assignment in test 2 was not blocked by CSP.
 CONSOLE MESSAGE: PASS: Style attribute assignment in test 2 was not blocked by CSP.
-CONSOLE MESSAGE: line 76: Injecting into main world again: this should fail.
+CONSOLE MESSAGE: line 110: Injecting into main world again: this should fail.
 CONSOLE ERROR: line 20: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-bUBNmssmL79UBWplbQJyN9Hi2tRE9H345W5DVyjdUq4='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
 CONSOLE MESSAGE: line 31: PASS: Style assignment in test 1 was blocked by CSP.
-This test ensures that style applied in isolated worlds marked with their own Content Security Policy aren't affected by the page's content security policy. Extensions, for example, should be able to inject inline CSS (even though it's probably a bad idea to do so).
+This tests the behavior of inline CSS in isolated worlds and its interaction with the page and isolated world CSP.
diff --git a/third_party/blink/web_tests/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style.html b/third_party/blink/web_tests/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style.html
index f1db7c7..a042b99 100644
--- a/third_party/blink/web_tests/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style.html
+++ b/third_party/blink/web_tests/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style.html
@@ -6,10 +6,8 @@
 </head>
 <body>
     <p>
-        This test ensures that style applied in isolated worlds marked with
-        their own Content Security Policy aren't affected by the page's content
-        security policy. Extensions, for example, should be able to inject
-        inline CSS (even though it's probably a bad idea to do so).
+        This tests the behavior of inline CSS in isolated worlds and its
+        interaction with the page and isolated world CSP.
     </p>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/bypass-main-world-csp-for-inline-style.js b/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/bypass-main-world-csp-for-inline-style.js
index e88fa14..9130e8a4 100644
--- a/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/bypass-main-world-csp-for-inline-style.js
+++ b/third_party/blink/web_tests/http/tests/security/isolatedWorld/resources/bypass-main-world-csp-for-inline-style.js
@@ -3,7 +3,7 @@
     testRunner.waitUntilDone();
 }
 
-tests = 4;
+tests = 6;
 window.addEventListener("message", function(message) {
     tests -= 1;
     test();
@@ -53,33 +53,67 @@
         window.postMessage("next", "*");
     }
 
+    function testInlineStyleInIsolatedWorldHelper(
+        worldId, functionStr, shouldSucceedStr, tests) {
+      testRunner.evaluateScriptInIsolatedWorld(
+          worldId,
+          String(eval(functionStr)) +
+              `\n${functionStr}(${shouldSucceedStr}, ${tests});`);
+    }
+
+    function testInlineStyleInIsolatedWorld(worldId, shouldSucceed, tests) {
+      var success = shouldSucceed ? 'true' : 'false';
+      testInlineStyleInIsolatedWorldHelper(
+          worldId, 'injectInlineStyle', success, tests);
+      testInlineStyleInIsolatedWorldHelper(
+          worldId, 'injectInlineStyleAttribute', success, tests);
+    }
+
     switch (tests) {
-        case 4:
-            console.log("Injecting in main world: this should fail.");
-            injectInlineStyle(false, tests);
-            break;
-        case 3:
-            console.log("Injecting into isolated world without bypass: this should fail.");
-            // Clear any existing csp or security origin as a side effect of
-            // another test.
-            testRunner.setIsolatedWorldInfo(1, null, null);
-            testRunner.evaluateScriptInIsolatedWorld(1, String(eval("injectInlineStyle")) + "\ninjectInlineStyle(false," + tests + ");");
-            testRunner.evaluateScriptInIsolatedWorld(1, String(eval("injectInlineStyleAttribute")) + "\ninjectInlineStyleAttribute(false," + tests + ");");
-            break;
-        case 2:
-            console.log("Starting to bypass main world's CSP: this should pass!");
-            testRunner.setIsolatedWorldInfo(1, 'chrome-extension://123', 'style-src \'unsafe-inline\' *');
-            testRunner.evaluateScriptInIsolatedWorld(1, String(eval("injectInlineStyle")) + "\ninjectInlineStyle(true," + tests + ");");
-            testRunner.evaluateScriptInIsolatedWorld(1, String(eval("injectInlineStyleAttribute")) + "\ninjectInlineStyleAttribute(true," + tests + ");");
-            break;
-        case 1:
-            console.log("Injecting into main world again: this should fail.");
-            injectInlineStyle(false, tests);
-            break;
-        case 0:
-            testRunner.setIsolatedWorldInfo(1, null, null);
-            testRunner.notifyDone();
-            break;
+      case 6:
+        console.log("Injecting in main world: this should fail.");
+        injectInlineStyle(false, tests);
+        break;
+      case 5:
+        console.log(
+            "Injecting into isolated world without bypass: this should fail.");
+        // Clear any existing csp or security origin as a side effect of
+        // another test.
+        testRunner.setIsolatedWorldInfo(1, null, null);
+        testInlineStyleInIsolatedWorld(1, false, tests);
+        break;
+      case 4:
+        console.log(
+            'Have a separate CSP for the isolated world. Allow unsafe-inline. This should pass.');
+        testRunner.setIsolatedWorldInfo(
+            1, 'chrome-extension://123', 'style-src \'unsafe-inline\'');
+        testInlineStyleInIsolatedWorld(1, true, tests);
+        break;
+      case 3:
+        console.log(
+            'Have a separate CSP for the isolated world. Use an empty CSP. This should pass.');
+        testRunner.setIsolatedWorldInfo(1, 'chrome-extension://123', '');
+        testInlineStyleInIsolatedWorld(1, true, tests);
+        break;
+      case 2:
+        console.log(
+            'Have a separate CSP for the isolated world. Disallow unsafe-inline.');
+        testRunner.setIsolatedWorldInfo(
+            1, 'chrome-extension://123', 'style-src \'none\'');
+        console.log(
+            'internals.runtimeFlags.isolatedWorldCSPEnabled is ' +
+            internals.runtimeFlags.isolatedWorldCSPEnabled);
+        var allowUnsafeInline = !internals.runtimeFlags.isolatedWorldCSPEnabled;
+        testInlineStyleInIsolatedWorld(1, allowUnsafeInline, tests);
+        break;
+      case 1:
+        console.log("Injecting into main world again: this should fail.");
+        injectInlineStyle(false, tests);
+        break;
+      case 0:
+        testRunner.setIsolatedWorldInfo(1, null, null);
+        testRunner.notifyDone();
+        break;
     }
 }
 
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/resources/usecounter-fetch-worker.js b/third_party/blink/web_tests/http/tests/serviceworker/resources/usecounter-fetch-worker.js
deleted file mode 100644
index c865335..0000000
--- a/third_party/blink/web_tests/http/tests/serviceworker/resources/usecounter-fetch-worker.js
+++ /dev/null
@@ -1,6 +0,0 @@
-
-onmessage = e => {
-  fetch('./blank.html').then(() => {
-    e.source.postMessage({});
-  });
-};
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/usecounter-fetch.html b/third_party/blink/web_tests/http/tests/serviceworker/usecounter-fetch.html
deleted file mode 100644
index 3bb87474..0000000
--- a/third_party/blink/web_tests/http/tests/serviceworker/usecounter-fetch.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<title>Service Worker: UseCounter for off-main-thread-fetch</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/test-helpers.js"></script>
-<script src="resources/usecounter.js"></script>
-<script>
-promise_test((t) => {
-    const kOffMainThreadFetch = 2067;  // from web_feature.mojom
-    const url = 'resources/usecounter-fetch-worker.js';
-    const scope = 'resources/blank.html?usecounter-fetch';
-    let worker;
-    let frame;
-
-    return service_worker_unregister_and_register(t, url, scope)
-      .then((registration) => {
-          add_completion_callback(() => registration.unregister());
-          worker = registration.installing;
-          return wait_for_state(t, worker, 'activated');
-        })
-      .then(() => with_iframe(scope))
-      .then((f) => {
-          frame = f;
-          add_completion_callback(() => frame.remove());
-          return new Promise((resolve) => {
-            navigator.serviceWorker.onmessage = () => {
-              resolve();
-            };
-            worker.postMessage({});
-          });
-        })
-      .then(() => {
-        assert_true(
-            frame.contentWindow.internals.isUseCounted(
-                frame.contentDocument, kOffMainThreadFetch),
-            'The usecounter for off-main-thread-fetch must be counted.');
-      });
-  }, 'Usecounter for off-main-thread-fetch');
-
-</script>
-</html>
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
index 01ebc1d..0e3e22f0 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
index 6fed243..310a6f2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
new file mode 100644
index 0000000..8dd35947
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
new file mode 100644
index 0000000..e133a9e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
new file mode 100644
index 0000000..8dd35947
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
new file mode 100644
index 0000000..e133a9e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
similarity index 86%
rename from third_party/blink/web_tests/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
rename to third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
index 15bf520..e84ebdb 100644
--- a/third_party/blink/web_tests/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
@@ -5,7 +5,7 @@
 PASS touch pointerover should not have any coalesced events
 PASS touch pointerenter should not have any coalesced events
 PASS touch pointerdown should not have any coalesced events
-FAIL touch pointermove should have >2 coalesced events as main thread is busy.assert_greater_than: pointermove should have at least 2 coalesced events. expected a number greater than 1 but got 1
+FAIL touch pointermove should have >2 coalesced events as main thread is busy. assert_greater_than: pointermove should have at least 2 coalesced events. expected a number greater than 1 but got 1
 PASS touch pointermove coalesced events should all be marked as trusted.
 PASS touch time stamps of coalesced events must be ascending.
 PASS touch pointermove coalesced events should all bubbles and cancelable as false.
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
new file mode 100644
index 0000000..8dd35947
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
new file mode 100644
index 0000000..e133a9e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt b/third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
similarity index 86%
copy from third_party/blink/web_tests/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
copy to third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
index 15bf520..e84ebdb 100644
--- a/third_party/blink/web_tests/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-retina/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
@@ -5,7 +5,7 @@
 PASS touch pointerover should not have any coalesced events
 PASS touch pointerenter should not have any coalesced events
 PASS touch pointerdown should not have any coalesced events
-FAIL touch pointermove should have >2 coalesced events as main thread is busy.assert_greater_than: pointermove should have at least 2 coalesced events. expected a number greater than 1 but got 1
+FAIL touch pointermove should have >2 coalesced events as main thread is busy. assert_greater_than: pointermove should have at least 2 coalesced events. expected a number greater than 1 but got 1
 PASS touch pointermove coalesced events should all be marked as trusted.
 PASS touch time stamps of coalesced events must be ascending.
 PASS touch pointermove coalesced events should all bubbles and cancelable as false.
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
new file mode 100644
index 0000000..8dd35947
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
new file mode 100644
index 0000000..e133a9e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
index e84ebdb..623d109f 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes-manual-expected.txt
@@ -5,7 +5,7 @@
 PASS touch pointerover should not have any coalesced events
 PASS touch pointerenter should not have any coalesced events
 PASS touch pointerdown should not have any coalesced events
-FAIL touch pointermove should have >2 coalesced events as main thread is busy. assert_greater_than: pointermove should have at least 2 coalesced events. expected a number greater than 1 but got 1
+PASS touch pointermove should have >2 coalesced events as main thread is busy.
 PASS touch pointermove coalesced events should all be marked as trusted.
 PASS touch time stamps of coalesced events must be ascending.
 PASS touch pointermove coalesced events should all bubbles and cancelable as false.
diff --git a/third_party/blink/web_tests/platform/mac/http/tests/misc/timer-vs-loading-expected.txt b/third_party/blink/web_tests/platform/mac/http/tests/misc/timer-vs-loading-expected.txt
deleted file mode 100644
index 8b13789..0000000
--- a/third_party/blink/web_tests/platform/mac/http/tests/misc/timer-vs-loading-expected.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
index 93d2d69..8dd35947 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
index 82a894c..e133a9e9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
index 42bb074..5b4aadf 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
index b0b264b5..8257781 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
new file mode 100644
index 0000000..5b4aadf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-mode/paint/dark-mode/native-theme-off/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
new file mode 100644
index 0000000..8257781
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-mode/paint/dark-mode/native-theme-on/text-input-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/shadow-dom/attach-shadow-with-parameter.html b/third_party/blink/web_tests/shadow-dom/attach-shadow-with-parameter.html
index 74ae0a4..511618fc 100644
--- a/third_party/blink/web_tests/shadow-dom/attach-shadow-with-parameter.html
+++ b/third_party/blink/web_tests/shadow-dom/attach-shadow-with-parameter.html
@@ -22,9 +22,9 @@
     assert_throws({name: 'TypeError'}, () => { host3.attachShadow({mode: 'illegal'}); },
         'Attach shadow root whose mode is neither open nor closed should throw TypeError.');
 
-    assert_throws({name: 'InvalidStateError'}, () => { host1.attachShadow({mode: 'open'}); },
-        'Attach shadow on a host which has open shadow root will raise InvalidStateError exception.');
-    assert_throws({name: 'InvalidStateError'}, () => { host2.attachShadow({mode: 'open'}); },
-        'Attach shadow on a host wich has closed shadow root will raise InvalidStateError exception.');
+    assert_throws({name: 'NotSupportedError'}, () => { host1.attachShadow({mode: 'open'}); },
+        'Attach shadow on a host which has open shadow root will raise NotSupportedError exception.');
+    assert_throws({name: 'NotSupportedError'}, () => { host2.attachShadow({mode: 'open'}); },
+        'Attach shadow on a host wich has closed shadow root will raise NotSupportedError exception.');
 }, 'Test for Element.attachShadow() with mode parameter.');
 </script>
diff --git a/third_party/blink/web_tests/virtual/isolated_world_csp/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style-expected.txt b/third_party/blink/web_tests/virtual/isolated_world_csp/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style-expected.txt
new file mode 100644
index 0000000..6738f62
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/isolated_world_csp/http/tests/security/isolatedWorld/bypass-main-world-csp-for-inline-style-expected.txt
@@ -0,0 +1,30 @@
+CONSOLE MESSAGE: line 74: Injecting in main world: this should fail.
+CONSOLE ERROR: line 20: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-9mofj90uV/hjdJ1EZ8ch4jBC+3bw4vt8GBxoMUosVmo='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+
+CONSOLE MESSAGE: line 31: PASS: Style assignment in test 6 was blocked by CSP.
+CONSOLE MESSAGE: line 78: Injecting into isolated world without bypass: this should fail.
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-RMFtATOlfMpeC8MJSEmpniQZnGMRT24P+KNCE5zJg08='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+
+CONSOLE MESSAGE: PASS: Style assignment in test 5 was blocked by CSP.
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-ZBTj5RHLnrF+IxdRZM2RuLfjTJQXNSi7fLQHr09onfY='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+
+CONSOLE MESSAGE: PASS: Style attribute assignment in test 5 was blocked by CSP.
+CONSOLE MESSAGE: line 86: Have a separate CSP for the isolated world. Allow unsafe-inline. This should pass.
+CONSOLE MESSAGE: PASS: Style assignment in test 4 was not blocked by CSP.
+CONSOLE MESSAGE: PASS: Style attribute assignment in test 4 was not blocked by CSP.
+CONSOLE MESSAGE: line 93: Have a separate CSP for the isolated world. Use an empty CSP. This should pass.
+CONSOLE MESSAGE: PASS: Style assignment in test 3 was not blocked by CSP.
+CONSOLE MESSAGE: PASS: Style attribute assignment in test 3 was not blocked by CSP.
+CONSOLE MESSAGE: line 99: Have a separate CSP for the isolated world. Disallow unsafe-inline.
+CONSOLE MESSAGE: line 103: internals.runtimeFlags.isolatedWorldCSPEnabled is true
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-0B38VDo0PSzEMTh/bG58xIoc1+UQzjQ8WF/8+v2xP9w='), or a nonce ('nonce-...') is required to enable inline execution.
+
+CONSOLE MESSAGE: PASS: Style assignment in test 2 was blocked by CSP.
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "style-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-ZBTj5RHLnrF+IxdRZM2RuLfjTJQXNSi7fLQHr09onfY='), or a nonce ('nonce-...') is required to enable inline execution.
+
+CONSOLE MESSAGE: PASS: Style attribute assignment in test 2 was blocked by CSP.
+CONSOLE MESSAGE: line 110: Injecting into main world again: this should fail.
+CONSOLE ERROR: line 20: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-bUBNmssmL79UBWplbQJyN9Hi2tRE9H345W5DVyjdUq4='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+
+CONSOLE MESSAGE: line 31: PASS: Style assignment in test 1 was blocked by CSP.
+This tests the behavior of inline CSS in isolated worlds and its interaction with the page and isolated world CSP.
diff --git a/third_party/closure_compiler/externs/file_manager_private.js b/third_party/closure_compiler/externs/file_manager_private.js
index 47773f0..8ef69d1 100644
--- a/third_party/closure_compiler/externs/file_manager_private.js
+++ b/third_party/closure_compiler/externs/file_manager_private.js
@@ -763,6 +763,12 @@
 chrome.fileManagerPrivate.setPreferences = function(changeInfo) {};
 
 /**
+ * Sets the ARC flag and returns what was the value before setting.
+ * @param {function(boolean)} callback
+ */
+chrome.fileManagerPrivate.setArcStorageToastShownFlag = function(callback) {};
+
+/**
  * Performs drive content search. |searchParams| |callback|
  * @param {chrome.fileManagerPrivate.SearchParams} searchParams
  * @param {function((!Array<Entry>|undefined), (string|undefined))} callback
diff --git a/third_party/closure_compiler/externs/webview_tag.js b/third_party/closure_compiler/externs/webview_tag.js
index 0b18fee..537ad913 100644
--- a/third_party/closure_compiler/externs/webview_tag.js
+++ b/third_party/closure_compiler/externs/webview_tag.js
@@ -198,6 +198,9 @@
 /** @type {!WebRequestOptionallySynchronousEvent} */
 WebRequestEventInterface.prototype.onBeforeSendHeaders;
 
+/** @type {!WebRequestOptionallySynchronousEvent} */
+WebRequestEventInterface.prototype.onHeadersReceived;
+
 /**
  * @constructor
  * @extends {HTMLIFrameElement}
diff --git a/third_party/feed/README.chromium b/third_party/feed/README.chromium
index 839dc15..214134e 100644
--- a/third_party/feed/README.chromium
+++ b/third_party/feed/README.chromium
@@ -2,7 +2,7 @@
 Short name: feed
 URL: https://chromium.googlesource.com/feed
 Version: 0
-Revision: 80206bfdbfec6a374e1ee5055331bd302551457d
+Revision: eb5622ba5a63b0e62ee8cc7afd49d087faa107c9
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/feed/java_sources.gni b/third_party/feed/java_sources.gni
index 9ee2e9f2..165ffb2 100644
--- a/third_party/feed/java_sources.gni
+++ b/third_party/feed/java_sources.gni
@@ -8,6 +8,14 @@
   "src/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/ContentMetadata.java",
   "src/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/ContentRemoval.java",
   "src/src/main/java/com/google/android/libraries/feed/api/client/knowncontent/KnownContent.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/client/lifecycle/AppLifecycleListener.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/client/requestmanager/RequestManager.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/client/scope/ProcessScope.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/client/scope/ProcessScopeBuilder.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/client/scope/StreamScope.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/client/scope/StreamScopeBuilder.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/client/stream/Header.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/client/stream/Stream.java",
   "src/src/main/java/com/google/android/libraries/feed/api/common/MutationContext.java",
   "src/src/main/java/com/google/android/libraries/feed/api/host/action/ActionApi.java",
   "src/src/main/java/com/google/android/libraries/feed/api/host/action/ActionEnabledApi.java",
@@ -55,21 +63,52 @@
   "src/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipCallbackApi.java",
   "src/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipInfo.java",
   "src/src/main/java/com/google/android/libraries/feed/api/host/stream/TooltipSupportedApi.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/ActionManager.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/actionmanager/ActionReader.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionParser.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionParserFactory.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionSource.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/actionparser/ActionSourceConverter.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/common/ActionPropertiesWithId.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/common/DismissActionWithSemanticProperties.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/common/PayloadWithId.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/common/SemanticPropertiesWithId.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/common/ThreadUtils.java",
   "src/src/main/java/com/google/android/libraries/feed/api/internal/knowncontent/FeedKnownContent.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/lifecycle/Resettable.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/FeatureChange.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/FeatureChangeObserver.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelChild.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelCursor.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelError.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelFeature.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelMutation.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProvider.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProviderFactory.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelProviderObserver.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/ModelToken.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/RemoveTracking.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/TokenCompleted.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/modelprovider/TokenCompletedObserver.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/protocoladapter/ProtocolAdapter.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/requestmanager/FeedRequestManager.java",
   "src/src/main/java/com/google/android/libraries/feed/api/internal/sessionmanager/FeedSessionManager.java",
-  "src/src/main/java/com/google/android/libraries/feed/api/lifecycle/AppLifecycleListener.java",
-  "src/src/main/java/com/google/android/libraries/feed/api/lifecycle/Resettable.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/store/ActionPropertiesMutation.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/store/ContentMutation.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/store/LocalActionMutation.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/store/SemanticPropertiesMutation.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/store/SessionMutation.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/store/Store.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/store/StoreListener.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/store/UploadableActionMutation.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/stream/BasicStreamFactory.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/stream/StreamFactory.java",
   "src/src/main/java/com/google/android/libraries/feed/api/requestmanager/ActionUploadRequestManager.java",
-  "src/src/main/java/com/google/android/libraries/feed/api/requestmanager/RequestManager.java",
   "src/src/main/java/com/google/android/libraries/feed/api/scope/ClearAllListener.java",
   "src/src/main/java/com/google/android/libraries/feed/api/scope/FeedProcessScope.java",
   "src/src/main/java/com/google/android/libraries/feed/api/scope/FeedStreamScope.java",
   "src/src/main/java/com/google/android/libraries/feed/api/sessionmanager/SessionManager.java",
-  "src/src/main/java/com/google/android/libraries/feed/api/stream/ContentChangedListener.java",
-  "src/src/main/java/com/google/android/libraries/feed/api/stream/Header.java",
   "src/src/main/java/com/google/android/libraries/feed/api/stream/NonDismissibleHeader.java",
-  "src/src/main/java/com/google/android/libraries/feed/api/stream/ScrollListener.java",
-  "src/src/main/java/com/google/android/libraries/feed/api/stream/Stream.java",
   "src/src/main/java/com/google/android/libraries/feed/basicstream/BasicStream.java",
   "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemAnimator.java",
   "src/src/main/java/com/google/android/libraries/feed/basicstream/internal/StreamItemTouchCallbacks.java",
@@ -205,43 +244,6 @@
   "src/src/main/java/com/google/android/libraries/feed/hostimpl/storage/InMemoryJournalStorage.java",
   "src/src/main/java/com/google/android/libraries/feed/hostimpl/storage/PersistentContentStorage.java",
   "src/src/main/java/com/google/android/libraries/feed/hostimpl/storage/PersistentJournalStorage.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/actionmanager/ActionManager.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/actionmanager/ActionReader.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/actionparser/ActionParser.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/actionparser/ActionParserFactory.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/actionparser/ActionSource.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/actionparser/ActionSourceConverter.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/common/ActionPropertiesWithId.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/common/DismissActionWithSemanticProperties.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/common/PayloadWithId.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/common/SemanticPropertiesWithId.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/common/ThreadUtils.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/FeatureChange.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/FeatureChangeObserver.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelChild.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelCursor.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelError.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelFeature.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelMutation.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelProvider.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelProviderFactory.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelProviderObserver.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/ModelToken.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/RemoveTracking.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/TokenCompleted.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/modelprovider/TokenCompletedObserver.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/protocoladapter/ProtocolAdapter.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/requestmanager/FeedRequestManager.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/store/ActionPropertiesMutation.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/store/ContentMutation.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/store/LocalActionMutation.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/store/SemanticPropertiesMutation.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/store/SessionMutation.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/store/Store.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/store/StoreListener.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/store/UploadableActionMutation.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/stream/BasicStreamFactory.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/stream/StreamFactory.java",
   "src/src/main/java/com/google/android/libraries/feed/mocknetworkclient/MockServerNetworkClient.java",
   "src/src/main/java/com/google/android/libraries/feed/piet/AdapterFactory.java",
   "src/src/main/java/com/google/android/libraries/feed/piet/AdapterParameters.java",
@@ -333,6 +335,8 @@
 ]
 
 feed_conformance_test_lib_sources = [
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/ContentIdGenerators.java",
+  "src/src/main/java/com/google/android/libraries/feed/api/internal/common/testing/InternalProtocolBuilder.java",
   "src/src/main/java/com/google/android/libraries/feed/common/concurrent/testing/FakeDirectExecutor.java",
   "src/src/main/java/com/google/android/libraries/feed/common/concurrent/testing/FakeMainThreadRunner.java",
   "src/src/main/java/com/google/android/libraries/feed/common/concurrent/testing/FakeTaskQueue.java",
@@ -345,8 +349,6 @@
   "src/src/main/java/com/google/android/libraries/feed/common/testing/RunnableSubject.java",
   "src/src/main/java/com/google/android/libraries/feed/common/testing/SessionTestUtils.java",
   "src/src/main/java/com/google/android/libraries/feed/common/time/testing/FakeClock.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/common/testing/ContentIdGenerators.java",
-  "src/src/main/java/com/google/android/libraries/feed/internalapi/common/testing/InternalProtocolBuilder.java",
   "src/src/main/java/com/google/android/libraries/feed/testing/conformance/network/NetworkClientConformanceTest.java",
   "src/src/main/java/com/google/android/libraries/feed/testing/conformance/scheduler/SchedulerConformanceTest.java",
   "src/src/main/java/com/google/android/libraries/feed/testing/conformance/storage/ContentStorageConformanceTest.java",
diff --git a/third_party/feed/proto_sources.gni b/third_party/feed/proto_sources.gni
index a616f1a..01caa60b 100644
--- a/third_party/feed/proto_sources.gni
+++ b/third_party/feed/proto_sources.gni
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 feed_lib_proto_sources = [
+  "src/src/main/proto/com/google/android/libraries/feed/api/internal/proto/stream_data.proto",
   "src/src/main/proto/com/google/android/libraries/feed/basicstream/internal/proto/stream_saved_instance_state.proto",
-  "src/src/main/proto/com/google/android/libraries/feed/internalapi/proto/stream_data.proto",
   "src/src/main/proto/com/google/android/libraries/feed/sharedstream/proto/scroll_state.proto",
   "src/src/main/proto/com/google/android/libraries/feed/sharedstream/proto/ui_refresh_reason.proto",
   "src/src/main/proto/com/google/android/libraries/feed/testing/proto/ui_context_for_test.proto",
diff --git a/third_party/inspector_protocol/README.chromium b/third_party/inspector_protocol/README.chromium
index e568b1a..a2ac26d 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: 0aafd2876f7485db7b07c513c0457b7cbbbe3304
+Revision: 8ec18cf0885bef0b5c2a922c5dc3813cbf63e962
 License: BSD
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/inspector_protocol/lib/Values_cpp.template b/third_party/inspector_protocol/lib/Values_cpp.template
index 764b4d3..7d3b907a 100644
--- a/third_party/inspector_protocol/lib/Values_cpp.template
+++ b/third_party/inspector_protocol/lib/Values_cpp.template
@@ -178,7 +178,12 @@
       key = StringUtil::fromUTF8(key_span.data(), key_span.size());
       tokenizer->Next();
     } else if (tokenizer->TokenTag() == cbor::CBORTokenTag::STRING16) {
-      return nullptr;  // STRING16 not supported yet.
+      span<uint8_t> key_span = tokenizer->GetString16WireRep();
+      if (key_span.size() & 1) return nullptr;  // UTF16 is 2 byte multiple.
+      key = StringUtil::fromUTF16(
+          reinterpret_cast<const uint16_t*>(key_span.data()),
+          key_span.size() / 2);
+      tokenizer->Next();
     } else {
       // Error::CBOR_INVALID_MAP_KEY
       return nullptr;
diff --git a/third_party/libusb/BUILD.gn b/third_party/libusb/BUILD.gn
index 7989bf8f..4e0e07f 100644
--- a/third_party/libusb/BUILD.gn
+++ b/third_party/libusb/BUILD.gn
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-# libusb is only used by //device/usb on Windows and macOS.
+# libusb is only used by //services/device/usb on Windows and macOS.
 assert(is_win || is_mac)
 
 import("//build/config/features.gni")
@@ -24,8 +24,8 @@
 
 static_library("libusb") {
   visibility = [
-    "//device:device_unittests",
-    "//device/usb",
+    "//services/device:tests",
+    "//services/device/usb",
   ]
   sources = [
     "src/config.h",
diff --git a/third_party/polymer/v1_0/bower.json b/third_party/polymer/v1_0/bower.json
index eb44683d..4987a4a 100644
--- a/third_party/polymer/v1_0/bower.json
+++ b/third_party/polymer/v1_0/bower.json
@@ -39,7 +39,6 @@
     "paper-ripple": "PolymerElements/paper-ripple#2.0.1",
     "paper-spinner": "PolymerElements/paper-spinner#2.0.0",
     "paper-styles": "PolymerElements/paper-styles#2.1.0",
-    "paper-tabs": "PolymerElements/paper-tabs#2.0.0",
     "paper-tooltip": "PolymerElements/paper-tooltip#2.1.1",
     "polymer2": "Polymer/polymer#2.7.0",
     "polymer": "Polymer/polymer#1.11.2",
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/BUILD.gn b/third_party/polymer/v1_0/components-chromium/paper-tabs/BUILD.gn
deleted file mode 100644
index d171bc08..0000000
--- a/third_party/polymer/v1_0/components-chromium/paper-tabs/BUILD.gn
+++ /dev/null
@@ -1,25 +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.
-#
-# NOTE: Created with generate_gn.py, please do not edit.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-js_library("paper-tab-extracted") {
-  deps = [
-    "../iron-behaviors:iron-button-state-extracted",
-    "../iron-behaviors:iron-control-state-extracted",
-    "../paper-behaviors:paper-ripple-behavior-extracted",
-  ]
-}
-
-js_library("paper-tabs-extracted") {
-  deps = [
-    ":paper-tab-extracted",
-    "../iron-icon:iron-icon-extracted",
-    "../iron-menu-behavior:iron-menubar-behavior-extracted",
-    "../iron-resizable-behavior:iron-resizable-behavior-extracted",
-    "../paper-icon-button:paper-icon-button-extracted",
-  ]
-}
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/bower.json b/third_party/polymer/v1_0/components-chromium/paper-tabs/bower.json
deleted file mode 100644
index 9372c3ac..0000000
--- a/third_party/polymer/v1_0/components-chromium/paper-tabs/bower.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-  "name": "paper-tabs",
-  "version": "2.0.0",
-  "license": "http://polymer.github.io/LICENSE.txt",
-  "description": "Material design tabs",
-  "private": true,
-  "main": "paper-tabs.html",
-  "authors": [
-    "The Polymer Authors"
-  ],
-  "keywords": [
-    "web-components",
-    "polymer",
-    "tabs",
-    "control"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/PolymerElements/paper-tabs.git"
-  },
-  "dependencies": {
-    "iron-behaviors": "PolymerElements/iron-behaviors#1 - 2",
-    "iron-flex-layout": "PolymerElements/iron-flex-layout#1 - 2",
-    "iron-icon": "PolymerElements/iron-icon#1 - 2",
-    "iron-iconset-svg": "PolymerElements/iron-iconset-svg#1 - 2",
-    "iron-menu-behavior": "PolymerElements/iron-menu-behavior#1 - 2",
-    "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#1 - 2",
-    "paper-behaviors": "PolymerElements/paper-behaviors#1 - 2",
-    "paper-icon-button": "PolymerElements/paper-icon-button#1 - 2",
-    "paper-styles": "PolymerElements/paper-styles#1 - 2",
-    "polymer": "Polymer/polymer#1.9 - 2"
-  },
-  "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
-    "iron-demo-helpers": "PolymerElements/iron-demo-helpers#1 - 2",
-    "iron-pages": "PolymerElements/iron-pages#1 - 2",
-    "iron-test-helpers": "PolymerElements/iron-test-helpers#1 - 2",
-    "web-component-tester": "^6.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
-  },
-  "variants": {
-    "1.x": {
-      "dependencies": {
-        "iron-behaviors": "PolymerElements/iron-behaviors#^1.0.0",
-        "iron-flex-layout": "PolymerElements/iron-flex-layout#^1.0.0",
-        "iron-icon": "PolymerElements/iron-icon#^1.0.0",
-        "iron-iconset-svg": "PolymerElements/iron-iconset-svg#^1.0.0",
-        "iron-menu-behavior": "PolymerElements/iron-menu-behavior#^1.1.0",
-        "iron-resizable-behavior": "PolymerElements/iron-resizable-behavior#^1.0.0",
-        "paper-behaviors": "PolymerElements/paper-behaviors#^1.0.0",
-        "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0",
-        "paper-styles": "PolymerElements/paper-styles#^1.0.0",
-        "polymer": "Polymer/polymer#^1.9"
-      },
-      "devDependencies": {
-        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-        "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0",
-        "iron-pages": "PolymerElements/iron-pages#^1.0.0",
-        "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0",
-        "web-component-tester": "^4.0.0",
-        "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
-      },
-      "resolutions": {
-        "webcomponentsjs": "^0.7"
-      }
-    }
-  },
-  "ignore": [],
-  "resolutions": {
-    "webcomponentsjs": "^1.0.0"
-  }
-}
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tab-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tab-extracted.js
deleted file mode 100644
index 640f02b..0000000
--- a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tab-extracted.js
+++ /dev/null
@@ -1,64 +0,0 @@
-Polymer({
-      is: 'paper-tab',
-
-      behaviors: [
-        Polymer.IronControlState,
-        Polymer.IronButtonState,
-        Polymer.PaperRippleBehavior
-      ],
-
-      properties: {
-
-        /**
-         * If true, the tab will forward keyboard clicks (enter/space) to
-         * the first anchor element found in its descendants
-         */
-        link: {
-          type: Boolean,
-          value: false,
-          reflectToAttribute: true
-        }
-
-      },
-
-      hostAttributes: {
-        role: 'tab'
-      },
-
-      listeners: {
-        down: '_updateNoink',
-        tap: '_onTap'
-      },
-
-      attached: function() {
-        this._updateNoink();
-      },
-
-      get _parentNoink () {
-        var parent = Polymer.dom(this).parentNode;
-        return !!parent && !!parent.noink;
-      },
-
-      _updateNoink: function() {
-        this.noink = !!this.noink || !!this._parentNoink;
-      },
-
-      _onTap: function(event) {
-        if (this.link) {
-          var anchor = this.queryEffectiveChildren('a');
-
-          if (!anchor) {
-            return;
-          }
-
-          // Don't get stuck in a loop delegating
-          // the listener from the child anchor
-          if (event.target === anchor) {
-            return;
-          }
-
-          anchor.click();
-        }
-      }
-
-    });
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tab.html b/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tab.html
deleted file mode 100644
index 1a85d396..0000000
--- a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tab.html
+++ /dev/null
@@ -1,108 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head><link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-behaviors/iron-button-state.html">
-<link rel="import" href="../iron-behaviors/iron-control-state.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../paper-behaviors/paper-ripple-behavior.html">
-
-<!--
-`paper-tab` is styled to look like a tab.  It should be used in conjunction with
-`paper-tabs`.
-
-Example:
-
-    <paper-tabs selected="0">
-      <paper-tab>TAB 1</paper-tab>
-      <paper-tab>TAB 2</paper-tab>
-      <paper-tab>TAB 3</paper-tab>
-    </paper-tabs>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-tab-ink` | Ink color | `--paper-yellow-a100`
-`--paper-tab` | Mixin applied to the tab | `{}`
-`--paper-tab-content` | Mixin applied to the tab content | `{}`
-`--paper-tab-content-unselected` | Mixin applied to the tab content when the tab is not selected | `{}`
-
-This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`.
-In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`.
-
--->
-
-</head><body><dom-module id="paper-tab">
-  <template>
-    <style>
-      :host {
-        @apply --layout-inline;
-        @apply --layout-center;
-        @apply --layout-center-justified;
-        @apply --layout-flex-auto;
-
-        position: relative;
-        padding: 0 12px;
-        overflow: hidden;
-        cursor: pointer;
-        vertical-align: middle;
-
-        @apply --paper-font-common-base;
-        @apply --paper-tab;
-      }
-
-      :host(:focus) {
-        outline: none;
-      }
-
-      :host([link]) {
-        padding: 0;
-      }
-
-      .tab-content {
-        height: 100%;
-        transform: translateZ(0);
-        transition: opacity 0.1s cubic-bezier(0.4, 0.0, 1, 1);
-        @apply --layout-horizontal;
-        @apply --layout-center-center;
-        @apply --layout-flex-auto;
-        @apply --paper-tab-content;
-      }
-
-      :host(:not(.iron-selected)) > .tab-content {
-        opacity: 0.8;
-
-        @apply --paper-tab-content-unselected;
-      }
-
-      :host(:focus) .tab-content {
-        opacity: 1;
-        font-weight: 700;
-      }
-
-      paper-ripple {
-        color: var(--paper-tab-ink, var(--paper-yellow-a100));
-      }
-
-      .tab-content > ::slotted(a) {
-        @apply --layout-flex-auto;
-
-        height: 100%;
-      }
-    </style>
-
-    <div class="tab-content">
-      <slot></slot>
-    </div>
-  </template>
-
-  </dom-module>
-<script src="paper-tab-extracted.js"></script></body></html>
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-extracted.js b/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-extracted.js
deleted file mode 100644
index 9c20f8db..0000000
--- a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-extracted.js
+++ /dev/null
@@ -1,429 +0,0 @@
-Polymer({
-      is: 'paper-tabs',
-
-      behaviors: [
-        Polymer.IronResizableBehavior,
-        Polymer.IronMenubarBehavior
-      ],
-
-      properties: {
-        /**
-         * If true, ink ripple effect is disabled. When this property is changed,
-         * all descendant `<paper-tab>` elements have their `noink` property
-         * changed to the new value as well.
-         */
-        noink: {
-          type: Boolean,
-          value: false,
-          observer: '_noinkChanged'
-        },
-
-        /**
-         * If true, the bottom bar to indicate the selected tab will not be shown.
-         */
-        noBar: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, the slide effect for the bottom bar is disabled.
-         */
-        noSlide: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, tabs are scrollable and the tab width is based on the label width.
-         */
-        scrollable: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, tabs expand to fit their container. This currently only applies when
-         * scrollable is true.
-         */
-        fitContainer: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, dragging on the tabs to scroll is disabled.
-         */
-        disableDrag: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, scroll buttons (left/right arrow) will be hidden for scrollable tabs.
-         */
-        hideScrollButtons: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * If true, the tabs are aligned to bottom (the selection bar appears at the top).
-         */
-        alignBottom: {
-          type: Boolean,
-          value: false
-        },
-
-        selectable: {
-          type: String,
-          value: 'paper-tab'
-        },
-
-        /**
-         * If true, tabs are automatically selected when focused using the
-         * keyboard.
-         */
-        autoselect: {
-          type: Boolean,
-          value: false
-        },
-
-        /**
-         * The delay (in milliseconds) between when the user stops interacting
-         * with the tabs through the keyboard and when the focused item is
-         * automatically selected (if `autoselect` is true).
-         */
-        autoselectDelay: {
-          type: Number,
-          value: 0
-        },
-
-        _step: {
-          type: Number,
-          value: 10
-        },
-
-        _holdDelay: {
-          type: Number,
-          value: 1
-        },
-
-        _leftHidden: {
-          type: Boolean,
-          value: false
-        },
-
-        _rightHidden: {
-          type: Boolean,
-          value: false
-        },
-
-        _previousTab: {
-          type: Object
-        }
-      },
-
-      hostAttributes: {
-        role: 'tablist'
-      },
-
-      listeners: {
-        'iron-resize': '_onTabSizingChanged',
-        'iron-items-changed': '_onTabSizingChanged',
-        'iron-select': '_onIronSelect',
-        'iron-deselect': '_onIronDeselect'
-      },
-
-      keyBindings: {
-        'left:keyup right:keyup': '_onArrowKeyup'
-      },
-
-      created: function() {
-        this._holdJob = null;
-        this._pendingActivationItem = undefined;
-        this._pendingActivationTimeout = undefined;
-        this._bindDelayedActivationHandler = this._delayedActivationHandler.bind(this);
-        this.addEventListener('blur', this._onBlurCapture.bind(this), true);
-      },
-
-      ready: function() {
-        this.setScrollDirection('y', this.$.tabsContainer);
-      },
-
-      detached: function() {
-        this._cancelPendingActivation();
-      },
-
-      _noinkChanged: function(noink) {
-        var childTabs = Polymer.dom(this).querySelectorAll('paper-tab');
-        childTabs.forEach(noink ? this._setNoinkAttribute : this._removeNoinkAttribute);
-      },
-
-      _setNoinkAttribute: function(element) {
-        element.setAttribute('noink', '');
-      },
-
-      _removeNoinkAttribute: function(element) {
-        element.removeAttribute('noink');
-      },
-
-      _computeScrollButtonClass: function(hideThisButton, scrollable, hideScrollButtons) {
-        if (!scrollable || hideScrollButtons) {
-          return 'hidden';
-        }
-
-        if (hideThisButton) {
-          return 'not-visible';
-        }
-
-        return '';
-      },
-
-      _computeTabsContentClass: function(scrollable, fitContainer) {
-        return scrollable ? 'scrollable' + (fitContainer ? ' fit-container' : '') : ' fit-container';
-      },
-
-      _computeSelectionBarClass: function(noBar, alignBottom) {
-        if (noBar) {
-          return 'hidden';
-        } else if (alignBottom) {
-          return 'align-bottom';
-        }
-
-        return '';
-      },
-
-      // TODO(cdata): Add `track` response back in when gesture lands.
-
-      _onTabSizingChanged: function() {
-        this.debounce('_onTabSizingChanged', function() {
-          this._scroll();
-          this._tabChanged(this.selectedItem);
-        }, 10);
-      },
-
-      _onIronSelect: function(event) {
-        this._tabChanged(event.detail.item, this._previousTab);
-        this._previousTab = event.detail.item;
-        this.cancelDebouncer('tab-changed');
-      },
-
-      _onIronDeselect: function(event) {
-        this.debounce('tab-changed', function() {
-          this._tabChanged(null, this._previousTab);
-          this._previousTab = null;
-        // See polymer/polymer#1305
-        }, 1);
-      },
-
-      _activateHandler: function() {
-        // Cancel item activations scheduled by keyboard events when any other
-        // action causes an item to be activated (e.g. clicks).
-        this._cancelPendingActivation();
-
-        Polymer.IronMenuBehaviorImpl._activateHandler.apply(this, arguments);
-      },
-
-      /**
-       * Activates an item after a delay (in milliseconds).
-       */
-      _scheduleActivation: function(item, delay) {
-        this._pendingActivationItem = item;
-        this._pendingActivationTimeout = this.async(
-            this._bindDelayedActivationHandler, delay);
-      },
-
-      /**
-       * Activates the last item given to `_scheduleActivation`.
-       */
-      _delayedActivationHandler: function() {
-        var item = this._pendingActivationItem;
-        this._pendingActivationItem = undefined;
-        this._pendingActivationTimeout = undefined;
-        item.fire(this.activateEvent, null, {
-          bubbles: true,
-          cancelable: true
-        });
-      },
-
-      /**
-       * Cancels a previously scheduled item activation made with
-       * `_scheduleActivation`.
-       */
-      _cancelPendingActivation: function() {
-        if (this._pendingActivationTimeout !== undefined) {
-          this.cancelAsync(this._pendingActivationTimeout);
-          this._pendingActivationItem = undefined;
-          this._pendingActivationTimeout = undefined;
-        }
-      },
-
-      _onArrowKeyup: function(event) {
-        if (this.autoselect) {
-          this._scheduleActivation(this.focusedItem, this.autoselectDelay);
-        }
-      },
-
-      _onBlurCapture: function(event) {
-        // Cancel a scheduled item activation (if any) when that item is
-        // blurred.
-        if (event.target === this._pendingActivationItem) {
-          this._cancelPendingActivation();
-        }
-      },
-
-      get _tabContainerScrollSize () {
-        return Math.max(
-          0,
-          this.$.tabsContainer.scrollWidth -
-            this.$.tabsContainer.offsetWidth
-        );
-      },
-
-      _scroll: function(e, detail) {
-        if (!this.scrollable) {
-          return;
-        }
-
-        var ddx = (detail && -detail.ddx) || 0;
-        this._affectScroll(ddx);
-      },
-
-      _down: function(e) {
-        // go one beat async to defeat IronMenuBehavior
-        // autorefocus-on-no-selection timeout
-        this.async(function() {
-          if (this._defaultFocusAsync) {
-            this.cancelAsync(this._defaultFocusAsync);
-            this._defaultFocusAsync = null;
-          }
-        }, 1);
-      },
-
-      _affectScroll: function(dx) {
-        this.$.tabsContainer.scrollLeft += dx;
-
-        var scrollLeft = this.$.tabsContainer.scrollLeft;
-
-        this._leftHidden = scrollLeft === 0;
-        this._rightHidden = scrollLeft === this._tabContainerScrollSize;
-      },
-
-      _onLeftScrollButtonDown: function() {
-        this._scrollToLeft();
-        this._holdJob = setInterval(this._scrollToLeft.bind(this), this._holdDelay);
-      },
-
-      _onRightScrollButtonDown: function() {
-        this._scrollToRight();
-        this._holdJob = setInterval(this._scrollToRight.bind(this), this._holdDelay);
-      },
-
-      _onScrollButtonUp: function() {
-        clearInterval(this._holdJob);
-        this._holdJob = null;
-      },
-
-      _scrollToLeft: function() {
-        this._affectScroll(-this._step);
-      },
-
-      _scrollToRight: function() {
-        this._affectScroll(this._step);
-      },
-
-      _tabChanged: function(tab, old) {
-        if (!tab) {
-          // Remove the bar without animation.
-          this.$.selectionBar.classList.remove('expand');
-          this.$.selectionBar.classList.remove('contract');
-          this._positionBar(0, 0);
-          return;
-        }
-
-        var r = this.$.tabsContent.getBoundingClientRect();
-        var w = r.width;
-        var tabRect = tab.getBoundingClientRect();
-        var tabOffsetLeft = tabRect.left - r.left;
-
-        this._pos = {
-          width: this._calcPercent(tabRect.width, w),
-          left: this._calcPercent(tabOffsetLeft, w)
-        };
-
-        if (this.noSlide || old == null) {
-          // Position the bar without animation.
-          this.$.selectionBar.classList.remove('expand');
-          this.$.selectionBar.classList.remove('contract');
-          this._positionBar(this._pos.width, this._pos.left);
-          return;
-        }
-
-        var oldRect = old.getBoundingClientRect();
-        var oldIndex = this.items.indexOf(old);
-        var index = this.items.indexOf(tab);
-        var m = 5;
-
-        // bar animation: expand
-        this.$.selectionBar.classList.add('expand');
-
-        var moveRight = oldIndex < index;
-        var isRTL = this._isRTL;
-        if (isRTL) {
-          moveRight = !moveRight;
-        }
-
-        if (moveRight) {
-          this._positionBar(this._calcPercent(tabRect.left + tabRect.width - oldRect.left, w) - m,
-              this._left);
-        } else {
-          this._positionBar(this._calcPercent(oldRect.left + oldRect.width - tabRect.left, w) - m,
-              this._calcPercent(tabOffsetLeft, w) + m);
-        }
-
-        if (this.scrollable) {
-          this._scrollToSelectedIfNeeded(tabRect.width, tabOffsetLeft);
-        }
-      },
-
-      _scrollToSelectedIfNeeded: function(tabWidth, tabOffsetLeft) {
-        var l = tabOffsetLeft - this.$.tabsContainer.scrollLeft;
-        if (l < 0) {
-          this.$.tabsContainer.scrollLeft += l;
-        } else {
-          l += (tabWidth - this.$.tabsContainer.offsetWidth);
-          if (l > 0) {
-            this.$.tabsContainer.scrollLeft += l;
-          }
-        }
-      },
-
-      _calcPercent: function(w, w0) {
-        return 100 * w / w0;
-      },
-
-      _positionBar: function(width, left) {
-        width = width || 0;
-        left = left || 0;
-
-        this._width = width;
-        this._left = left;
-        this.transform(
-            'translateX(' + left + '%) scaleX(' + (width / 100) + ')',
-            this.$.selectionBar);
-      },
-
-      _onBarTransitionEnd: function(e) {
-        var cl = this.$.selectionBar.classList;
-        // bar animation: expand -> contract
-        if (cl.contains('expand')) {
-          cl.remove('expand');
-          cl.add('contract');
-          this._positionBar(this._pos.width, this._pos.left);
-        // bar animation done
-        } else if (cl.contains('contract')) {
-          cl.remove('contract');
-        }
-      }
-    });
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-icons.html b/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-icons.html
deleted file mode 100644
index c299046..0000000
--- a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-icons.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
--->
-
-<link rel="import" href="../iron-iconset-svg/iron-iconset-svg.html">
-
-<iron-iconset-svg name="paper-tabs" size="24">
-<svg><defs>
-<g id="chevron-left"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></g>
-<g id="chevron-right"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></g>
-</defs></svg>
-</iron-iconset-svg>
diff --git a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs.html b/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs.html
deleted file mode 100644
index 7c1da8c..0000000
--- a/third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs.html
+++ /dev/null
@@ -1,218 +0,0 @@
-<!--
-@license
-Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
-The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
-Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head><link rel="import" href="../polymer/polymer.html">
-<link rel="import" href="../iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="../iron-icon/iron-icon.html">
-<link rel="import" href="../iron-menu-behavior/iron-menubar-behavior.html">
-<link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
-<link rel="import" href="../paper-icon-button/paper-icon-button.html">
-<link rel="import" href="../paper-styles/color.html">
-<link rel="import" href="paper-tabs-icons.html">
-<link rel="import" href="paper-tab.html">
-
-<!--
-Material design: [Tabs](https://www.google.com/design/spec/components/tabs.html)
-
-`paper-tabs` makes it easy to explore and switch between different views or functional aspects of
-an app, or to browse categorized data sets.
-
-Use `selected` property to get or set the selected tab.
-
-Example:
-
-    <paper-tabs selected="0">
-      <paper-tab>TAB 1</paper-tab>
-      <paper-tab>TAB 2</paper-tab>
-      <paper-tab>TAB 3</paper-tab>
-    </paper-tabs>
-
-See <a href="?active=paper-tab">paper-tab</a> for more information about
-`paper-tab`.
-
-A common usage for `paper-tabs` is to use it along with `iron-pages` to switch
-between different views.
-
-    <paper-tabs selected="{{selected}}">
-      <paper-tab>Tab 1</paper-tab>
-      <paper-tab>Tab 2</paper-tab>
-      <paper-tab>Tab 3</paper-tab>
-    </paper-tabs>
-
-    <iron-pages selected="{{selected}}">
-      <div>Page 1</div>
-      <div>Page 2</div>
-      <div>Page 3</div>
-    </iron-pages>
-
-
-To use links in tabs, add `link` attribute to `paper-tab` and put an `<a>`
-element in `paper-tab` with a `tabindex` of -1.
-
-Example:
-
-<pre><code>
-&lt;style is="custom-style">
-  .link {
-    &#64;apply --layout-horizontal;
-    &#64;apply --layout-center-center;
-  }
-&lt;/style>
-
-&lt;paper-tabs selected="0">
-  &lt;paper-tab link>
-    &lt;a href="#link1" class="link" tabindex="-1">TAB ONE&lt;/a>
-  &lt;/paper-tab>
-  &lt;paper-tab link>
-    &lt;a href="#link2" class="link" tabindex="-1">TAB TWO&lt;/a>
-  &lt;/paper-tab>
-  &lt;paper-tab link>
-    &lt;a href="#link3" class="link" tabindex="-1">TAB THREE&lt;/a>
-  &lt;/paper-tab>
-&lt;/paper-tabs>
-</code></pre>
-
-### Styling
-
-The following custom properties and mixins are available for styling:
-
-Custom property | Description | Default
-----------------|-------------|----------
-`--paper-tabs-selection-bar-color` | Color for the selection bar | `--paper-yellow-a100`
-`--paper-tabs-selection-bar` | Mixin applied to the selection bar | `{}`
-`--paper-tabs` | Mixin applied to the tabs | `{}`
-`--paper-tabs-content` | Mixin applied to the content container of tabs | `{}`
-`--paper-tabs-container` | Mixin applied to the layout container of tabs | `{}`
-
-@hero hero.svg
-@demo demo/index.html
--->
-
-</head><body><dom-module id="paper-tabs">
-  <template>
-    <style>
-      :host {
-        @apply --layout;
-        @apply --layout-center;
-
-        height: 48px;
-        font-size: 14px;
-        font-weight: 500;
-        overflow: hidden;
-        user-select: none;
-
-        /* NOTE: Both values are needed, since some phones require the value to be `transparent`. */
-        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-        -webkit-tap-highlight-color: transparent;
-
-        @apply --paper-tabs;
-      }
-
-      :host-context([dir=rtl]) {
-        @apply --layout-horizontal-reverse;
-      }
-
-      #tabsContainer {
-        position: relative;
-        height: 100%;
-        white-space: nowrap;
-        overflow: hidden;
-        @apply --layout-flex-auto;
-        @apply --paper-tabs-container;
-      }
-
-      #tabsContent {
-        height: 100%;
-        flex-basis: auto;
-        @apply --paper-tabs-content;
-      }
-
-      #tabsContent.scrollable {
-        position: absolute;
-        white-space: nowrap;
-      }
-
-      #tabsContent:not(.scrollable),
-      #tabsContent.scrollable.fit-container {
-        @apply --layout-horizontal;
-      }
-
-      #tabsContent.scrollable.fit-container {
-        min-width: 100%;
-      }
-
-      #tabsContent.scrollable.fit-container > ::slotted(*) {
-        /* IE - prevent tabs from compressing when they should scroll. */
-        flex: 1 0 auto;
-      }
-
-      .hidden {
-        display: none;
-      }
-
-      .not-visible {
-        opacity: 0;
-        cursor: default;
-      }
-
-      paper-icon-button {
-        width: 48px;
-        height: 48px;
-        padding: 12px;
-        margin: 0 4px;
-      }
-
-      #selectionBar {
-        position: absolute;
-        height: 0;
-        bottom: 0;
-        left: 0;
-        right: 0;
-        border-bottom: 2px solid var(--paper-tabs-selection-bar-color, var(--paper-yellow-a100));
-        transform: scale(0);
-        transform-origin: left center;
-        transition: transform;
-
-        @apply --paper-tabs-selection-bar;
-      }
-
-      #selectionBar.align-bottom {
-        top: 0;
-        bottom: auto;
-      }
-
-      #selectionBar.expand {
-        transition-duration: 0.15s;
-        transition-timing-function: cubic-bezier(0.4, 0.0, 1, 1);
-      }
-
-      #selectionBar.contract {
-        transition-duration: 0.18s;
-        transition-timing-function: cubic-bezier(0.0, 0.0, 0.2, 1);
-      }
-
-      #tabsContent > ::slotted(:not(#selectionBar)) {
-        height: 100%;
-      }
-    </style>
-
-    <paper-icon-button icon="paper-tabs:chevron-left" class$="[[_computeScrollButtonClass(_leftHidden, scrollable, hideScrollButtons)]]" on-up="_onScrollButtonUp" on-down="_onLeftScrollButtonDown" tabindex="-1"></paper-icon-button>
-
-    <div id="tabsContainer" on-track="_scroll" on-down="_down">
-      <div id="tabsContent" class$="[[_computeTabsContentClass(scrollable, fitContainer)]]">
-        <div id="selectionBar" class$="[[_computeSelectionBarClass(noBar, alignBottom)]]" on-transitionend="_onBarTransitionEnd"></div>
-        <slot></slot>
-      </div>
-    </div>
-
-    <paper-icon-button icon="paper-tabs:chevron-right" class$="[[_computeScrollButtonClass(_rightHidden, scrollable, hideScrollButtons)]]" on-up="_onScrollButtonUp" on-down="_onRightScrollButtonDown" tabindex="-1"></paper-icon-button>
-
-  </template>
-
-  </dom-module>
-<script src="paper-tabs-extracted.js"></script></body></html>
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components_summary.txt b/third_party/polymer/v1_0/components_summary.txt
index 74c3728..ab27fa6 100644
--- a/third_party/polymer/v1_0/components_summary.txt
+++ b/third_party/polymer/v1_0/components_summary.txt
@@ -220,12 +220,6 @@
 Revision: fc4b85ab853f107fc8bb18ea6cda1c2e9ac5a75f
 Tree link: https://github.com/PolymerElements/paper-styles/tree/v2.1.0
 
-Name: paper-tabs
-Repository: https://github.com/PolymerElements/paper-tabs.git
-Tree: v2.0.0
-Revision: 775a9f019072a58b6a8a936f79450cd01b3b2cba
-Tree link: https://github.com/PolymerElements/paper-tabs/tree/v2.0.0
-
 Name: paper-tooltip
 Repository: https://github.com/PolymerElements/paper-tooltip.git
 Tree: v2.1.1
diff --git a/third_party/sqlite/amalgamation/sqlite3.c b/third_party/sqlite/amalgamation/sqlite3.c
index 7443e231..aa2b673 100644
--- a/third_party/sqlite/amalgamation/sqlite3.c
+++ b/third_party/sqlite/amalgamation/sqlite3.c
@@ -68691,6 +68691,7 @@
           ** case this happens.  */
           void *pCellKey;
           u8 * const pCellBody = pCell - pPage->childPtrSize;
+          const int nOverrun = 18;  /* Size of the overrun padding */
           pPage->xParseCell(pPage, pCellBody, &pCur->info);
           nCell = (int)pCur->info.nKey;
           testcase( nCell<0 );   /* True if key size is 2^32 or more */
@@ -68701,13 +68702,14 @@
             rc = SQLITE_CORRUPT_PAGE(pPage);
             goto moveto_finish;
           }
-          pCellKey = sqlite3Malloc( nCell+18 );
+          pCellKey = sqlite3Malloc( nCell+nOverrun );
           if( pCellKey==0 ){
             rc = SQLITE_NOMEM_BKPT;
             goto moveto_finish;
           }
           pCur->ix = (u16)idx;
           rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0);
+          memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */
           pCur->curFlags &= ~BTCF_ValidOvfl;
           if( rc ){
             sqlite3_free(pCellKey);
@@ -88313,7 +88315,7 @@
     ** OP_Delete will have also set the pC->movetoTarget field to the rowid of
     ** the row that is being deleted */
     i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor);
-    assert( pC->movetoTarget==iKey );
+    assert( CORRUPT_DB || pC->movetoTarget==iKey );
   }
 #endif
 
@@ -222384,7 +222386,7 @@
 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
 
 /************** End of stmt.c ************************************************/
-#if __LINE__!=222387
+#if __LINE__!=222389
 #undef SQLITE_SOURCE_ID
 #define SQLITE_SOURCE_ID      "2019-04-16 19:49:53 884b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f8315alt2"
 #endif
diff --git a/third_party/sqlite/patched/src/btree.c b/third_party/sqlite/patched/src/btree.c
index 70c2637..9cbb6c2 100644
--- a/third_party/sqlite/patched/src/btree.c
+++ b/third_party/sqlite/patched/src/btree.c
@@ -5516,6 +5516,7 @@
           ** case this happens.  */
           void *pCellKey;
           u8 * const pCellBody = pCell - pPage->childPtrSize;
+          const int nOverrun = 18;  /* Size of the overrun padding */
           pPage->xParseCell(pPage, pCellBody, &pCur->info);
           nCell = (int)pCur->info.nKey;
           testcase( nCell<0 );   /* True if key size is 2^32 or more */
@@ -5526,13 +5527,14 @@
             rc = SQLITE_CORRUPT_PAGE(pPage);
             goto moveto_finish;
           }
-          pCellKey = sqlite3Malloc( nCell+18 );
+          pCellKey = sqlite3Malloc( nCell+nOverrun );
           if( pCellKey==0 ){
             rc = SQLITE_NOMEM_BKPT;
             goto moveto_finish;
           }
           pCur->ix = (u16)idx;
           rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0);
+          memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */
           pCur->curFlags &= ~BTCF_ValidOvfl;
           if( rc ){
             sqlite3_free(pCellKey);
diff --git a/third_party/sqlite/patched/src/vdbe.c b/third_party/sqlite/patched/src/vdbe.c
index a5b0d4b4..5f0728ac 100644
--- a/third_party/sqlite/patched/src/vdbe.c
+++ b/third_party/sqlite/patched/src/vdbe.c
@@ -4734,7 +4734,7 @@
     ** OP_Delete will have also set the pC->movetoTarget field to the rowid of
     ** the row that is being deleted */
     i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor);
-    assert( pC->movetoTarget==iKey );
+    assert( CORRUPT_DB || pC->movetoTarget==iKey );
   }
 #endif
 
diff --git a/third_party/sqlite/patched/test/corruptL.test b/third_party/sqlite/patched/test/corruptL.test
index de0196ecc..3a6c1384 100644
--- a/third_party/sqlite/patched/test/corruptL.test
+++ b/third_party/sqlite/patched/test/corruptL.test
@@ -838,4 +838,57 @@
   INSERT INTO t3 SELECT * FROM t2;
 } {1 {database disk image is malformed}}
 
+
+#-------------------------------------------------------------------------
+reset_db
+do_test 11.0 {
+  sqlite3 db {}
+  db deserialize [decode_hexdb {
+| size 595 pagesize 512 filename x.db
+| page 1 offset 0
+|      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
+|     16: 02 00 00 01 00 40 20 20 00 01 00 0c 00 00 00 07   .....@  ........
+|     32: 00 00 00 05 07 a1 1f fa 00 00 00 08 00 00 00 04   ................
+|     48: 00 00 01 00 00 49 00 00 00 00 00 05 00 00 00 00   .....I..........
+|     80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1c   ................
+|     96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0   ..,P............
+|    112: 01 56 01 86 01 2a 01 06 00 00 62 00 00 00 00 00   .V...*....b.....
+|    128: 00 ed e2 78 74 64 33 ff 43 52 45 41 54 45 20 49   ...xtd3.CREATE I
+|    144: 4e 44 45 58 20 74 33 78 20 4f 4e 20 74 33 28 38   NDEX t3x ON t3(8
+|    160: 29 2e 04 06 17 15 11 01 45 69 6e 64 65 68 74 32   ).......Eindeht2
+|    176: 63 64 74 31 e5 43 52 45 41 54 45 20 49 4e 44 45   cdt1.CREATE INDE
+|    192: 58 20 74 32 63 c4 20 4f 4e 20 74 32 28 63 2c 64   X t2c. ON t2(c,d
+|    208: 29 28 05 06 17 01 11 11 3d 74 61 6c 36 74 62 74   )(......=tal6tbt
+|    224: 65 32 04 43 52 45 41 54 45 20 54 41 42 4c 45 20   e2.CREATE TABLE
+|    240: 74 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00   t...............
+|    256: 00 00 00 00 00 00 22 07 06 17 11 11 01 30 e8 03   .............0..
+|    272: 62 6c 65 74 34 74 35 02 43 52 45 41 54 45 20 54   blet4t5.CREATE T
+|    288: 41 42 4c 45 20 74 34 28 94 29 2a 06 06 17 13 11   ABLE t4(.)*.....
+|    304: 01 3f 69 33 74 6e 65 78 78 74 64 33 ff 43 52 45   .?i3tnexxtd3.CRE
+|    320: 41 54 45 20 49 4e 44 45 58 20 74 33 78 20 4f 4e   ATE INDEX t3x ON
+|    336: 20 74 31 28 38 29 2e 04 06 17 15 11 01 45 69 6e    t1(8).......Ein
+|    352: 64 65 68 74 32 63 64 74 31 e5 43 52 45 41 54 45   deht2cdt1.CREATE
+|    368: 20 49 4e 44 45 58 20 74 32 63 c4 20 4f 4e 20 74    INDEX t2c. ON t
+|    384: 32 28 63 2c 64 29 28 05 06 17 01 11 11 3d 74 61   2(c,d)(......=ta
+|    400: 6c 32 74 62 74 65 32 04 43 52 45 41 54 45 20 54   l2tbte2.CREATE T
+|    416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29   ABLE t3(c,x,e,f)
+|    432: 28 02 06 17 11 11 01 3d 74 61 9e 93 65 74 32 74   (......=ta..et2t
+|    448: 32 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   2.CREATE TABLE t
+|    464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11   2(c,d,e,f)$.....
+|    480: 01 35 55 61 62 6c 88 74 31 74 31 02 43 52 45 41   .5Uabl.t1t1.CREA
+|    496: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29   TE TABLE t1(a,b)
+| page 2 offset 512
+|      0: 0d 00 00 00 0d 25 00 01 cf 00 01 fa 01 f3 01 de   .....%..........
+|     16: 01 00 00 00 fd 00 00 0d 00 00 00 00 45 20 54 41   ............E TA
+|     32: 42 4c 45 20 74 34 28 94 29 2a 06 06 17 13 11 01   BLE t4(.)*......
+|     48: 3f 69 33 74 6e 65 78 78 74 64 33 ff 43 52 45 a0   ?i3tnexxtd3.CRE.
+|     64: a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 74 13 11 01   ............t...
+|     80: 49 45 74 00 00 00 00 00 00 00 00 00 00 00 00 00   IEt.............
+| end x.db
+}]} {}
+
+do_catchsql_test 11.1 {
+  DELETE FROM t3 WHERE x IN (SELECT x FROM t4);
+} {1 {database disk image is malformed}}
+
 finish_test
diff --git a/third_party/sqlite/patches/0001-Custom-shell.c-helpers-to-load-Chromium-s-ICU-data.patch b/third_party/sqlite/patches/0001-Custom-shell.c-helpers-to-load-Chromium-s-ICU-data.patch
index 3da8ad0..910bd2b 100644
--- a/third_party/sqlite/patches/0001-Custom-shell.c-helpers-to-load-Chromium-s-ICU-data.patch
+++ b/third_party/sqlite/patches/0001-Custom-shell.c-helpers-to-load-Chromium-s-ICU-data.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: "tc@google.com" <tc@google.com>
 Date: Tue, 6 Jan 2009 22:39:41 +0000
-Subject: [PATCH 1/7] Custom shell.c helpers to load Chromium's ICU data.
+Subject: [PATCH 1/9] Custom shell.c helpers to load Chromium's ICU data.
 
 History uses fts3 with an icu-based segmenter.  These changes allow building a
 sqlite3 binary for Linux or Windows which can read those files.
diff --git a/third_party/sqlite/patches/0002-Don-t-generate-VDBE-code-for-VACUUM-after-a-syntax-e.patch b/third_party/sqlite/patches/0002-Don-t-generate-VDBE-code-for-VACUUM-after-a-syntax-e.patch
index 389c1aa..0403573 100644
--- a/third_party/sqlite/patches/0002-Don-t-generate-VDBE-code-for-VACUUM-after-a-syntax-e.patch
+++ b/third_party/sqlite/patches/0002-Don-t-generate-VDBE-code-for-VACUUM-after-a-syntax-e.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 1 May 2019 14:44:32 -0700
-Subject: [PATCH 2/7] Don't generate VDBE code for VACUUM after a syntax error
+Subject: [PATCH 2/9] Don't generate VDBE code for VACUUM after a syntax error
 
 This backports https://www.sqlite.org/src/info/930842470da27d72
 
diff --git a/third_party/sqlite/patches/0003-Fix-use-after-free-xDestroy-error.patch b/third_party/sqlite/patches/0003-Fix-use-after-free-xDestroy-error.patch
index b14ffd4..9d0aec7 100644
--- a/third_party/sqlite/patches/0003-Fix-use-after-free-xDestroy-error.patch
+++ b/third_party/sqlite/patches/0003-Fix-use-after-free-xDestroy-error.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 1 May 2019 14:47:06 -0700
-Subject: [PATCH 3/7] Fix use-after-free xDestroy error
+Subject: [PATCH 3/9] Fix use-after-free xDestroy error
 
 This backports https://www.sqlite.org/src/info/1dbbb0101e8213b9
 
diff --git a/third_party/sqlite/patches/0004-Fix-memory-leak-segfault.patch b/third_party/sqlite/patches/0004-Fix-memory-leak-segfault.patch
index 2c0534c..1a386bdc 100644
--- a/third_party/sqlite/patches/0004-Fix-memory-leak-segfault.patch
+++ b/third_party/sqlite/patches/0004-Fix-memory-leak-segfault.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Fri, 3 May 2019 14:46:06 -0700
-Subject: [PATCH 4/7] Fix memory-leak/segfault
+Subject: [PATCH 4/9] Fix memory-leak/segfault
 
 Backports https://www.sqlite.org/src/info/a9b90aa12eecdd9f
 
diff --git a/third_party/sqlite/patches/0005-Ensure-UTF16-strings-are-zero-terminated.patch b/third_party/sqlite/patches/0005-Ensure-UTF16-strings-are-zero-terminated.patch
index 511bc2d..43ad5bd 100644
--- a/third_party/sqlite/patches/0005-Ensure-UTF16-strings-are-zero-terminated.patch
+++ b/third_party/sqlite/patches/0005-Ensure-UTF16-strings-are-zero-terminated.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Fri, 3 May 2019 14:49:17 -0700
-Subject: [PATCH 5/7] Ensure UTF16 strings are zero-terminated
+Subject: [PATCH 5/9] Ensure UTF16 strings are zero-terminated
 
 Backports https://www.sqlite.org/src/info/3a16ddf91f0c9c51
 
diff --git a/third_party/sqlite/patches/0006-Detect-errors-in-byte-offset.patch b/third_party/sqlite/patches/0006-Detect-errors-in-byte-offset.patch
index 7706b0a..cec9e7d1 100644
--- a/third_party/sqlite/patches/0006-Detect-errors-in-byte-offset.patch
+++ b/third_party/sqlite/patches/0006-Detect-errors-in-byte-offset.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 15 May 2019 18:32:47 -0700
-Subject: [PATCH 6/7] Detect errors in byte offset
+Subject: [PATCH 6/9] Detect errors in byte offset
 
 Backports https://www.sqlite.org/src/vdiff?from=3c75605b4652ae88&to=ad8fc5d8b440c49d
 
diff --git a/third_party/sqlite/patches/0007-Ensure-correct-zero-termination-of-UTF16-strings.patch b/third_party/sqlite/patches/0007-Ensure-correct-zero-termination-of-UTF16-strings.patch
index 57e87e6..3bbd93e 100644
--- a/third_party/sqlite/patches/0007-Ensure-correct-zero-termination-of-UTF16-strings.patch
+++ b/third_party/sqlite/patches/0007-Ensure-correct-zero-termination-of-UTF16-strings.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 15 May 2019 18:39:12 -0700
-Subject: [PATCH 7/7] Ensure correct zero-termination of UTF16 strings
+Subject: [PATCH 7/9] Ensure correct zero-termination of UTF16 strings
 
 Backports https://www.sqlite.org/src/info/d612fb7873cf59df
 
diff --git a/third_party/sqlite/patches/0008-Fix-OP_Delete-assert.patch b/third_party/sqlite/patches/0008-Fix-OP_Delete-assert.patch
new file mode 100644
index 0000000..8a77058a
--- /dev/null
+++ b/third_party/sqlite/patches/0008-Fix-OP_Delete-assert.patch
@@ -0,0 +1,91 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Darwin Huang <huangdarwin@chromium.org>
+Date: Fri, 17 May 2019 16:00:46 -0700
+Subject: [PATCH 8/9] Fix OP_Delete assert
+
+Backports https://www.sqlite.org/src/info/915388ab39ba3ca8
+
+Bug: https://crbug.com/962055#c6
+---
+ third_party/sqlite/patched/src/vdbe.c         |  2 +-
+ third_party/sqlite/patched/test/corruptL.test | 53 +++++++++++++++++++
+ 2 files changed, 54 insertions(+), 1 deletion(-)
+
+diff --git a/third_party/sqlite/patched/src/vdbe.c b/third_party/sqlite/patched/src/vdbe.c
+index a5b0d4b48e28..5f0728acd242 100644
+--- a/third_party/sqlite/patched/src/vdbe.c
++++ b/third_party/sqlite/patched/src/vdbe.c
+@@ -4734,7 +4734,7 @@ case OP_Delete: {
+     ** OP_Delete will have also set the pC->movetoTarget field to the rowid of
+     ** the row that is being deleted */
+     i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor);
+-    assert( pC->movetoTarget==iKey );
++    assert( CORRUPT_DB || pC->movetoTarget==iKey );
+   }
+ #endif
+ 
+diff --git a/third_party/sqlite/patched/test/corruptL.test b/third_party/sqlite/patched/test/corruptL.test
+index de0196ecc09e..3a6c1384df1d 100644
+--- a/third_party/sqlite/patched/test/corruptL.test
++++ b/third_party/sqlite/patched/test/corruptL.test
+@@ -838,4 +838,57 @@ do_catchsql_test 8.1 {
+   INSERT INTO t3 SELECT * FROM t2;
+ } {1 {database disk image is malformed}}
+ 
++
++#-------------------------------------------------------------------------
++reset_db
++do_test 11.0 {
++  sqlite3 db {}
++  db deserialize [decode_hexdb {
++| size 595 pagesize 512 filename x.db
++| page 1 offset 0
++|      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
++|     16: 02 00 00 01 00 40 20 20 00 01 00 0c 00 00 00 07   .....@  ........
++|     32: 00 00 00 05 07 a1 1f fa 00 00 00 08 00 00 00 04   ................
++|     48: 00 00 01 00 00 49 00 00 00 00 00 05 00 00 00 00   .....I..........
++|     80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1c   ................
++|     96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0   ..,P............
++|    112: 01 56 01 86 01 2a 01 06 00 00 62 00 00 00 00 00   .V...*....b.....
++|    128: 00 ed e2 78 74 64 33 ff 43 52 45 41 54 45 20 49   ...xtd3.CREATE I
++|    144: 4e 44 45 58 20 74 33 78 20 4f 4e 20 74 33 28 38   NDEX t3x ON t3(8
++|    160: 29 2e 04 06 17 15 11 01 45 69 6e 64 65 68 74 32   ).......Eindeht2
++|    176: 63 64 74 31 e5 43 52 45 41 54 45 20 49 4e 44 45   cdt1.CREATE INDE
++|    192: 58 20 74 32 63 c4 20 4f 4e 20 74 32 28 63 2c 64   X t2c. ON t2(c,d
++|    208: 29 28 05 06 17 01 11 11 3d 74 61 6c 36 74 62 74   )(......=tal6tbt
++|    224: 65 32 04 43 52 45 41 54 45 20 54 41 42 4c 45 20   e2.CREATE TABLE
++|    240: 74 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00   t...............
++|    256: 00 00 00 00 00 00 22 07 06 17 11 11 01 30 e8 03   .............0..
++|    272: 62 6c 65 74 34 74 35 02 43 52 45 41 54 45 20 54   blet4t5.CREATE T
++|    288: 41 42 4c 45 20 74 34 28 94 29 2a 06 06 17 13 11   ABLE t4(.)*.....
++|    304: 01 3f 69 33 74 6e 65 78 78 74 64 33 ff 43 52 45   .?i3tnexxtd3.CRE
++|    320: 41 54 45 20 49 4e 44 45 58 20 74 33 78 20 4f 4e   ATE INDEX t3x ON
++|    336: 20 74 31 28 38 29 2e 04 06 17 15 11 01 45 69 6e    t1(8).......Ein
++|    352: 64 65 68 74 32 63 64 74 31 e5 43 52 45 41 54 45   deht2cdt1.CREATE
++|    368: 20 49 4e 44 45 58 20 74 32 63 c4 20 4f 4e 20 74    INDEX t2c. ON t
++|    384: 32 28 63 2c 64 29 28 05 06 17 01 11 11 3d 74 61   2(c,d)(......=ta
++|    400: 6c 32 74 62 74 65 32 04 43 52 45 41 54 45 20 54   l2tbte2.CREATE T
++|    416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29   ABLE t3(c,x,e,f)
++|    432: 28 02 06 17 11 11 01 3d 74 61 9e 93 65 74 32 74   (......=ta..et2t
++|    448: 32 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   2.CREATE TABLE t
++|    464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11   2(c,d,e,f)$.....
++|    480: 01 35 55 61 62 6c 88 74 31 74 31 02 43 52 45 41   .5Uabl.t1t1.CREA
++|    496: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29   TE TABLE t1(a,b)
++| page 2 offset 512
++|      0: 0d 00 00 00 0d 25 00 01 cf 00 01 fa 01 f3 01 de   .....%..........
++|     16: 01 00 00 00 fd 00 00 0d 00 00 00 00 45 20 54 41   ............E TA
++|     32: 42 4c 45 20 74 34 28 94 29 2a 06 06 17 13 11 01   BLE t4(.)*......
++|     48: 3f 69 33 74 6e 65 78 78 74 64 33 ff 43 52 45 a0   ?i3tnexxtd3.CRE.
++|     64: a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 74 13 11 01   ............t...
++|     80: 49 45 74 00 00 00 00 00 00 00 00 00 00 00 00 00   IEt.............
++| end x.db
++}]} {}
++
++do_catchsql_test 11.1 {
++  DELETE FROM t3 WHERE x IN (SELECT x FROM t4);
++} {1 {database disk image is malformed}}
++
+ finish_test
+-- 
+2.21.0.1020.gf2820cf01a-goog
+
diff --git a/third_party/sqlite/patches/0009-Initialize-18-byte-overrun-area-for-btree.patch b/third_party/sqlite/patches/0009-Initialize-18-byte-overrun-area-for-btree.patch
new file mode 100644
index 0000000..9147d2a
--- /dev/null
+++ b/third_party/sqlite/patches/0009-Initialize-18-byte-overrun-area-for-btree.patch
@@ -0,0 +1,43 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Darwin Huang <huangdarwin@chromium.org>
+Date: Fri, 17 May 2019 16:03:01 -0700
+Subject: [PATCH 9/9] Initialize 18-byte overrun area for btree
+
+Backports https://sqlite.org/src/info/4b05caeb1b9767ba
+
+Bug: 962083
+---
+ third_party/sqlite/patched/src/btree.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/third_party/sqlite/patched/src/btree.c b/third_party/sqlite/patched/src/btree.c
+index 70c26373baa2..9cbb6c271984 100644
+--- a/third_party/sqlite/patched/src/btree.c
++++ b/third_party/sqlite/patched/src/btree.c
+@@ -5516,6 +5516,7 @@ int sqlite3BtreeMovetoUnpacked(
+           ** case this happens.  */
+           void *pCellKey;
+           u8 * const pCellBody = pCell - pPage->childPtrSize;
++          const int nOverrun = 18;  /* Size of the overrun padding */
+           pPage->xParseCell(pPage, pCellBody, &pCur->info);
+           nCell = (int)pCur->info.nKey;
+           testcase( nCell<0 );   /* True if key size is 2^32 or more */
+@@ -5526,13 +5527,14 @@ int sqlite3BtreeMovetoUnpacked(
+             rc = SQLITE_CORRUPT_PAGE(pPage);
+             goto moveto_finish;
+           }
+-          pCellKey = sqlite3Malloc( nCell+18 );
++          pCellKey = sqlite3Malloc( nCell+nOverrun );
+           if( pCellKey==0 ){
+             rc = SQLITE_NOMEM_BKPT;
+             goto moveto_finish;
+           }
+           pCur->ix = (u16)idx;
+           rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0);
++          memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */
+           pCur->curFlags &= ~BTCF_ValidOvfl;
+           if( rc ){
+             sqlite3_free(pCellKey);
+-- 
+2.21.0.1020.gf2820cf01a-goog
+
diff --git a/third_party/unrar/BUILD.gn b/third_party/unrar/BUILD.gn
index cabb1f891..333a008 100644
--- a/third_party/unrar/BUILD.gn
+++ b/third_party/unrar/BUILD.gn
@@ -3,9 +3,8 @@
 # found in the LICENSE file.
 
 import("//build/config/features.gni")
-import("//testing/libfuzzer/fuzzer_test.gni")
 
-if (safe_browsing_mode == 1 || use_fuzzing_engine) {
+if (safe_browsing_mode == 1) {
   static_library("unrar") {
     sources = [
       "src/archive.cpp",
@@ -66,40 +65,31 @@
       "//build/config/compiler:no_chromium_code",
 
       # This must be after no_chromium_code for warning flags to be ordered correctly
-      ":unrar_config",
+      ":unrar_warnings",
     ]
 
-    if (use_libfuzzer) {
-      configs -= [ "//build/config/compiler:no_exceptions" ]
-    }
+    defines = [
+      "_FILE_OFFSET_BITS=64",
+      "LARGEFILE_SOURCE",
+      "RAR_SMP",
+      "SILENT",
+      "NOVOLUME",
+
+      # The following is set to disable certain macro definitions in the unrar
+      # source code.
+      "CHROMIUM_UNRAR",
+
+      # Disables exceptions in unrar, replaces them with process termination.
+      "UNRAR_NO_EXCEPTIONS",
+    ]
 
     deps = [
       "//base",
     ]
   }
-
-  if (use_fuzzing_engine && !is_asan && !is_msan) {
-    fuzzer_test("unrar_fuzzer") {
-      sources = [
-        "unrar_fuzzer.cc",
-      ]
-      deps = [
-        ":unrar",
-      ]
-      include_dirs = [ "//third_party/unrar/src" ]
-      additional_configs = [
-        "//build/config/compiler:no_chromium_code",
-        ":unrar_config",
-      ]
-      configs_to_remove = [
-        "//build/config/compiler:no_exceptions",
-        "//build/config/compiler:chromium_code",
-      ]
-    }
-  }
 }
 
-config("unrar_config") {
+config("unrar_warnings") {
   cflags = [
     # unrar frequently drops parentheses around logical ops
     "-Wno-logical-op-parentheses",
@@ -116,18 +106,4 @@
     # unrar has missing braces for initialization in rarvm.cpp
     "-Wno-missing-braces",
   ]
-
-  defines = [
-    "_FILE_OFFSET_BITS=64",
-    "LARGEFILE_SOURCE",
-    "RAR_SMP",
-    "SILENT",
-    "NOVOLUME",
-    "CHROMIUM_UNRAR",
-  ]
-
-  if (!use_libfuzzer) {
-    # Disables exceptions in unrar, replaces them with process termination.
-    defines += [ "UNRAR_NO_EXCEPTIONS" ]
-  }
 }
diff --git a/third_party/unrar/unrar_fuzzer.cc b/third_party/unrar/unrar_fuzzer.cc
deleted file mode 100644
index 61b59f1..0000000
--- a/third_party/unrar/unrar_fuzzer.cc
+++ /dev/null
@@ -1,71 +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 <ftw.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <unistd.h>
-
-#include <fstream>
-#include <memory>
-#include <string>
-
-#include "rar.hpp"
-
-static int removeFile(const char* fpath,
-                      const struct stat* sb,
-                      int typeflag,
-                      struct FTW* ftwbuf) {
-  if (remove(fpath) != 0)
-    abort();
-  return 0;
-}
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  // unrar likes to create files in the current directory.
-  // So, the following few lines created and 'cd' to a directory named 'o'
-  // in the current working directory.
-  constexpr size_t kMaxCwdLength = 10000;
-  static char cwd[kMaxCwdLength];
-  if (!getcwd(cwd, sizeof(cwd)))
-    abort();
-
-  std::string original_path = std::string(cwd, strlen(cwd));
-  std::string out_path = original_path + "/o";
-
-  if (!(opendir(out_path.c_str()) || mkdir(out_path.c_str(), 0700) == 0))
-    abort();
-  if (chdir(out_path.c_str()) != 0)
-    abort();
-
-  static const std::string filename = "temp.rar";
-  std::ofstream file(filename,
-                     std::ios::binary | std::ios::out | std::ios::trunc);
-  if (!file.is_open())
-    abort();
-  file.write(reinterpret_cast<const char*>(data), size);
-  file.close();
-
-  std::unique_ptr<CommandData> cmd_data(new CommandData);
-  cmd_data->ParseArg(const_cast<wchar_t*>(L"-p"));
-  cmd_data->ParseArg(const_cast<wchar_t*>(L"x"));
-  cmd_data->ParseDone();
-  std::wstring wide_filename(filename.begin(), filename.end());
-  cmd_data->AddArcName(wide_filename.c_str());
-
-  try {
-    CmdExtract extractor(cmd_data.get());
-    extractor.DoExtract();
-  } catch (...) {
-  }
-
-  // 'cd' back to the original directory and delete 'o' along with
-  // all its contents.
-  if (chdir(original_path.c_str()) != 0)
-    abort();
-  if (nftw(out_path.c_str(), removeFile, 20,
-           FTW_DEPTH | FTW_MOUNT | FTW_PHYS) != 0)
-    abort();
-  return 0;
-}
diff --git a/tools/cfi/blacklist.txt b/tools/cfi/blacklist.txt
index 273b8788..9cf2f22a 100644
--- a/tools/cfi/blacklist.txt
+++ b/tools/cfi/blacklist.txt
@@ -204,6 +204,7 @@
 
 # PropertyCallbackArguments::Call methods cast function pointers
 src:*v8/src/api-arguments-inl.h
+src:*v8/src/api/api-arguments-inl.h
 
 # v8 callback that casts argument template parameters
 fun:*PendingPhantomCallback*Invoke*
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index 45f430e..c9d1d29 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -39,11 +39,7 @@
 COMPILER_RT_BUILD_DIR = os.path.join(LLVM_BUILD_DIR, 'compiler-rt')
 CLANG_DIR = os.path.join(LLVM_DIR, 'tools', 'clang')
 LLD_DIR = os.path.join(LLVM_DIR, 'tools', 'lld')
-# TODO(thakis): Use projects/compiler-rt on Linux too once tests pass there.
-if sys.platform in ['darwin', 'win32']:
-  COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt')
-else:
-  COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'compiler-rt')
+COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt')
 LIBCXX_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxx')
 LIBCXXABI_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxxabi')
 LLVM_BUILD_TOOLS_DIR = os.path.abspath(
@@ -145,8 +141,7 @@
   Checkout('Clang', LLVM_REPO_URL + '/cfe/trunk', CLANG_DIR)
   Checkout('LLD', LLVM_REPO_URL + '/lld/trunk', LLD_DIR)
   # Remove compiler-rt at old location.
-  if (sys.platform == 'darwin' and
-      os.path.exists(os.path.join(LLVM_DIR, 'compiler-rt'))):
+  if os.path.exists(os.path.join(LLVM_DIR, 'compiler-rt')):
     RmTree(os.path.join(LLVM_DIR, 'compiler-rt'))
   Checkout('compiler-rt', LLVM_REPO_URL + '/compiler-rt/trunk', COMPILER_RT_DIR)
   if sys.platform == 'darwin':
@@ -416,6 +411,28 @@
         # Ignore args.disable_asserts for the bootstrap compiler.
         '-DLLVM_ENABLE_ASSERTIONS=ON',
         ]
+    if sys.platform == 'darwin':
+      # On macOS, the bootstrap toolchain needs to have compiler-rt because
+      # dsymutil's link needs libclang_rt.osx.a. Only the x86_64 osx
+      # libraries are needed though, and only libclang_rt (i.e.
+      # COMPILER_RT_BUILD_BUILTINS).
+      bootstrap_args.extend([
+          "-DDARWIN_osx_ARCHS=x86_64",
+          "-DCOMPILER_RT_BUILD_BUILTINS=ON",
+          "-DCOMPILER_RT_BUILD_CRT=OFF",
+          "-DCOMPILER_RT_BUILD_LIBFUZZER=OFF",
+          "-DCOMPILER_RT_BUILD_PROFILE=OFF",
+          "-DCOMPILER_RT_BUILD_SANITIZERS=OFF",
+          "-DCOMPILER_RT_BUILD_XRAY=OFF",
+          "-DCOMPILER_RT_ENABLE_IOS=OFF",
+          "-DCOMPILER_RT_ENABLE_WATCHOS=OFF",
+          "-DCOMPILER_RT_ENABLE_TVOS=OFF",
+          ])
+    else:
+      # On non-darwin, the bootstrap toolchain doesn't need compiler-rt,
+      # so don't build it during bootstrap. If we ever do need it,
+      # consider setting COMPILER_RT_DEFAULT_TARGET_ONLY.
+      bootstrap_args.append("-DLLVM_TOOL_COMPILER_RT_BUILD=OFF")
     if cc is not None:  bootstrap_args.append('-DCMAKE_C_COMPILER=' + cc)
     if cxx is not None: bootstrap_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
     RmCmakeCache('.')
@@ -576,12 +593,12 @@
   # Do an out-of-tree build of compiler-rt.
   # On Windows, this is used to get the 32-bit ASan run-time.
   # TODO(hans): Remove once the regular build above produces this.
-  if sys.platform != 'darwin':
+  if sys.platform == 'win32':
     if os.path.isdir(COMPILER_RT_BUILD_DIR):
       RmTree(COMPILER_RT_BUILD_DIR)
     os.makedirs(COMPILER_RT_BUILD_DIR)
     os.chdir(COMPILER_RT_BUILD_DIR)
-    if args.bootstrap and sys.platform == 'win32':
+    if args.bootstrap:
       # The bootstrap compiler produces 64-bit binaries by default.
       cflags += ['-m32']
       cxxflags += ['-m32']
@@ -589,34 +606,19 @@
         '-DLLVM_ENABLE_THREADS=OFF',
         '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
         '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags)]
-    if sys.platform != 'win32':
-      compiler_rt_args += ['-DLLVM_CONFIG_PATH=' +
-                           os.path.join(LLVM_BUILD_DIR, 'bin', 'llvm-config'),
-                          ]
     RmCmakeCache('.')
-    RunCommand(['cmake'] + compiler_rt_args +
-               [LLVM_DIR if sys.platform == 'win32' else COMPILER_RT_DIR],
+    RunCommand(['cmake'] + compiler_rt_args + [LLVM_DIR],
                msvc_arch='x86', env=deployment_env)
     RunCommand(['ninja', 'compiler-rt'], msvc_arch='x86')
 
     # Copy select output to the main tree.
     # TODO(hans): Make this (and the .gypi and .isolate files) version number
     # independent.
-    rt_lib_src_dir = os.path.join(COMPILER_RT_BUILD_DIR, 'lib', platform)
-    if sys.platform == 'win32':
-      # TODO(thakis): This too is due to compiler-rt being part of the checkout
-      # on Windows, see TODO above COMPILER_RT_DIR.
-      rt_lib_src_dir = os.path.join(COMPILER_RT_BUILD_DIR, 'lib', 'clang',
-                                    RELEASE_VERSION, 'lib', platform)
+    rt_lib_src_dir = os.path.join(COMPILER_RT_BUILD_DIR, 'lib', 'clang',
+                                  RELEASE_VERSION, 'lib', platform)
     # Blacklists:
     CopyDirectoryContents(os.path.join(rt_lib_src_dir, '..', '..', 'share'),
                           os.path.join(rt_lib_dst_dir, '..', '..', 'share'))
-    # Headers:
-    if sys.platform != 'win32':
-      CopyDirectoryContents(
-          os.path.join(COMPILER_RT_BUILD_DIR, 'include/sanitizer'),
-          os.path.join(LLVM_BUILD_DIR, 'lib/clang', RELEASE_VERSION,
-                       'include/sanitizer'))
     # Static and dynamic libraries:
     CopyDirectoryContents(rt_lib_src_dir, rt_lib_dst_dir)
 
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 7ebacdf..073ea24 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -36,8 +36,8 @@
 # Do NOT CHANGE this if you don't know what you're doing -- see
 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
-CLANG_REVISION = '360094'
-CLANG_SUB_REVISION = 5
+CLANG_REVISION = '361104'
+CLANG_SUB_REVISION = 2
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
 RELEASE_VERSION = '9.0.0'
diff --git a/tools/grit/grit/format/policy_templates_json_unittest.py b/tools/grit/grit/format/policy_templates_json_unittest.py
index 0c9b157..a738654 100755
--- a/tools/grit/grit/format/policy_templates_json_unittest.py
+++ b/tools/grit/grit/format/policy_templates_json_unittest.py
@@ -27,20 +27,38 @@
   def testPolicyTranslation(self):
     # Create test policy_templates.json data.
     caption = "The main policy"
-    caption_translation = "Die Hauptrichtilinie"
+    caption_translation = "Die Hauptrichtlinie"
 
     message = \
       "Red cabbage stays red cabbage and wedding dress stays wedding dress"
     message_translation = \
       "Blaukraut bleibt Blaukraut und Brautkleid bleibt Brautkleid"
 
+    schema_key_description = "Number of users"
+    schema_key_description_translation = "Anzahl der Nutzer"
+
     policy_json = """
         {
           "policy_definitions": [
             {
               'name': 'MainPolicy',
               'type': 'main',
-              'schema': { 'type': 'boolean' },
+              'schema': {
+                'properties': {
+                  'default_launch_container': {
+                    'enum': [
+                      'tab',
+                      'window',
+                    ],
+                    'type': 'string',
+                  },
+                  'users_number': {
+                    'description': '''%s''',
+                    'type': 'integer',
+                  },
+                },
+                'type': 'object',
+              },
               'supported_on': ['chrome_os:29-'],
               'features': {
                 'can_be_recommended': True,
@@ -59,19 +77,24 @@
               'text': '''%s'''
             }
           }
-        }""" % (caption, message)
+        }""" % (schema_key_description, caption, message)
 
     # Create translations. The translation IDs are hashed from the English text.
     caption_id = grit.extern.tclib.GenerateMessageId(caption);
     message_id = grit.extern.tclib.GenerateMessageId(message);
+    schema_key_description_id = grit.extern.tclib.GenerateMessageId(
+        schema_key_description)
     policy_xtb = """
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="de">
 <translation id="%s">%s</translation>
 <translation id="%s">%s</translation>
+<translation id="%s">%s</translation>
 </translationbundle>""" % (caption_id, caption_translation,
-                           message_id, message_translation)
+                           message_id, message_translation,
+                           schema_key_description_id,
+                           schema_key_description_translation)
 
     # Write both to a temp file.
     tmp_dir_name = tempfile.gettempdir()
@@ -132,7 +155,22 @@
       'type': 'main',
       'example_value': True,
       'supported_on': ['chrome_os:29-'],
-      'schema': {'type': 'boolean'},
+      'schema': {
+        'properties': {
+          'default_launch_container': {
+            'enum': [
+              'tab',
+              'window',
+            ],
+            'type': 'string',
+          },
+          'users_number': {
+            'description': '''%s''',
+            'type': 'integer',
+          },
+        },
+        'type': 'object',
+      },
     },
   ],
   'messages': {
@@ -141,7 +179,8 @@
       },
   },
 
-}""" % (caption_translation, message_translation)
+}""" % (caption_translation, schema_key_description_translation,
+        message_translation)
     self.assertEqual(expected, output)
 
 
diff --git a/tools/grit/grit/gather/policy_json.py b/tools/grit/grit/gather/policy_json.py
index d0a7d672..2fe3f02d 100644
--- a/tools/grit/grit/gather/policy_json.py
+++ b/tools/grit/grit/gather/policy_json.py
@@ -42,8 +42,8 @@
         for node2 in node1.childNodes:
           example_text.append(node2.toxml())
       else:
-         raise Exception('Unexpected element inside a placeholder: ' +
-                         node2.toxml())
+        raise Exception('Unexpected element inside a placeholder: ' +
+                        node2.toxml())
     if example_text == []:
       # In such cases the original text is okay for an example.
       example_text = text
@@ -154,6 +154,31 @@
     else:
       raise Exception('Unexpected type %s' % item_type)
 
+  def _AddSchemaKeys(self, obj, depth):
+    obj_type = type(obj)
+    if obj_type == dict:
+      self._AddNontranslateableChunk('{\n')
+      for key in sorted(obj.keys()):
+        self._AddIndentedNontranslateableChunk(depth + 1, "'%s': " % key)
+        if key == 'description' and type(obj[key]) == str:
+          self._AddNontranslateableChunk("'''")
+          self._ParseMessage(obj[key], 'Description of schema property')
+          self._AddNontranslateableChunk("''',\n")
+        elif type(obj[key]) in (bool, int, str):
+          self._AddSchemaKeys(obj[key], 0)
+        else:
+          self._AddSchemaKeys(obj[key], depth + 1)
+      self._AddIndentedNontranslateableChunk(depth, '},\n')
+    elif obj_type == list:
+      self._AddNontranslateableChunk('[\n')
+      for item in obj:
+        self._AddSchemaKeys(item, depth + 1)
+      self._AddIndentedNontranslateableChunk(depth, '],\n')
+    elif obj_type in (bool, int, str):
+      self._AddIndentedNontranslateableChunk(depth, "'%s',\n" % obj)
+    else:
+      raise Exception('Invalid schema object: %s' % obj)
+
   def _AddPolicyKey(self, item, item_type, parent_item, key, depth):
     '''Given a policy/enumeration item and a key, adds that key and its value
     into the output.
@@ -176,6 +201,8 @@
           item[key],
           self._GetDescription(item, item_type, parent_item, key))
       self._AddNontranslateableChunk("''',\n")
+    elif key in ('schema', 'validation_schema', 'description_schema'):
+      self._AddSchemaKeys(item[key], depth)
     else:
       str_val = item[key]
       if type(str_val) == types.StringType:
diff --git a/tools/grit/grit/gather/policy_json_unittest.py b/tools/grit/grit/gather/policy_json_unittest.py
index 34f4a42..58bfcbf 100755
--- a/tools/grit/grit/gather/policy_json_unittest.py
+++ b/tools/grit/grit/gather/policy_json_unittest.py
@@ -81,6 +81,79 @@
     expected = self.GetExpectedOutput(original)
     self.failUnless(expected == eval(gatherer.Translate('en')))
 
+  def testSchema(self):
+    original = ("{"
+                "  'policy_definitions': ["
+                "    {"
+                "      'name': 'Policy1',"
+                "      'schema': {"
+                "        'type': 'object',"
+                "        'properties': {"
+                "          'outer': {"
+                "            'description': 'outer description',"
+                "            'type': 'object',"
+                "            'inner': {"
+                "              'description': 'inner description',"
+                "              'type': 'integer',"
+                "            },"
+                "          },"
+                "        },"
+                "      },"
+                "      'caption': 'nothing special',"
+                "    },"
+                "  ],"
+                "  'messages': {}"
+                "}")
+    gatherer = policy_json.PolicyJson(StringIO.StringIO(original))
+    gatherer.Parse()
+    self.failUnless(len(gatherer.GetCliques()) == 3)
+    expected = self.GetExpectedOutput(original)
+    self.failUnless(expected == eval(gatherer.Translate('en')))
+
+  def testValidationSchema(self):
+    original = ("{"
+                "  'policy_definitions': ["
+                "    {"
+                "      'name': 'Policy1',"
+                "      'validation_schema': {"
+                "        'type': 'object',"
+                "        'properties': {"
+                "          'description': 'properties description',"
+                "          'type': 'object',"
+                "        },"
+                "      },"
+                "    },"
+                "  ],"
+                "  'messages': {}"
+                "}")
+    gatherer = policy_json.PolicyJson(StringIO.StringIO(original))
+    gatherer.Parse()
+    self.failUnless(len(gatherer.GetCliques()) == 1)
+    expected = self.GetExpectedOutput(original)
+    self.failUnless(expected == eval(gatherer.Translate('en')))
+
+  def testDescriptionSchema(self):
+    original = ("{"
+                "  'policy_definitions': ["
+                "    {"
+                "      'name': 'Policy1',"
+                "      'description_schema': {"
+                "        'type': 'object',"
+                "        'properties': {"
+                "          'description': 'properties description',"
+                "          'type': 'object',"
+                "        },"
+                "      },"
+                "    },"
+                "  ],"
+                "  'messages': {}"
+                "}")
+    gatherer = policy_json.PolicyJson(StringIO.StringIO(original))
+    gatherer.Parse()
+    self.failUnless(len(gatherer.GetCliques()) == 1)
+    expected = self.GetExpectedOutput(original)
+    self.failUnless(expected == eval(gatherer.Translate('en')))
+
   # Keeping for backwards compatibility.
   def testSubPolicyOldFormat(self):
     original = (
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 0bf8312..4093f15 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -336,21 +336,6 @@
       'Chromium Android ARM 32-bit Goma RBE Prod (dbg)': 'android_debug_static_bot',
       'Chromium Android ARM 32-bit Goma RBE Prod (dbg) (clobber)': 'android_debug_static_bot',
 
-      # For RBE load testing.
-      'Chromium Linux Goma RBE LoadTest': 'release_bot',
-      'Chromium Linux Goma RBE LoadTest (debug)': 'release_bot',
-      'Chromium Linux Goma RBE LoadTest (clobber)': 'release_bot',
-      'Chromium Linux Goma RBE LoadTest (clobber) (debug)': 'release_bot',
-      'Chromium Linux Goma RBE LoadTest (ATS)': 'release_bot',
-      'Chromium Linux Goma RBE LoadTest (ATS) (debug)': 'release_bot',
-      'Chromium Linux Goma RBE LoadTest (ATS) (clobber)': 'release_bot',
-      'Chromium Linux Goma RBE LoadTest (ATS) (clobber) (debug)': 'release_bot',
-
-      'Chromium Android ARM 32-bit Goma RBE LoadTest': 'release_bot',
-      'Chromium Android ARM 32-bit Goma RBE LoadTest (debug)': 'release_bot',
-      'Chromium Android ARM 32-bit Goma RBE LoadTest (clobber)': 'release_bot',
-      'Chromium Android ARM 32-bit Goma RBE LoadTest (clobber) (debug)': 'release_bot',
-
       # RBE FYI
       'Cast Linux (Goma RBE FYI)': 'cast_release_bot',
       'chromeos-amd64-generic-rel (Goma RBE FYI)': 'cros_chrome_sdk_headless_ozone',
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index cdcfe711..2332d67 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -964,6 +964,11 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="Accel_Show_Or_Switch_Ime">
+  <owner>essential-inputs-team@google.com</owner>
+  <description>Emitted when the user presses the MODECHANGE key.</description>
+</action>
+
 <action name="Accel_Show_Stylus_Tools">
   <owner>jdufault@chromium.org</owner>
   <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 8a3f492d..e8e4e67 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -3386,8 +3386,9 @@
   <int value="12" label="User requested to provide cardholder name"/>
   <int value="13" label="Max strikes, did not show infobar (mobile only)"/>
   <int value="14" label="User requested to provide expiration date"/>
-  <int value="15" label="Card was not in a supported bin range"/>
-  <int value="16" label="Upload was offered for a dynamic form"/>
+  <int value="15" label="Upload was offered for a non-focusable form"/>
+  <int value="16" label="Card was not in a supported bin range"/>
+  <int value="17" label="Upload was offered for a dynamic form"/>
 </enum>
 
 <enum name="AutofillCardUploadEnabled">
@@ -14571,6 +14572,16 @@
   <int value="19" label="DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020"/>
 </enum>
 
+<enum name="DXGI_FORMAT">
+  <summary>
+    Resource data formats. Defined here:
+    https://github.com/apitrace/dxsdk/blob/master/Include/dxgiformat.h
+  </summary>
+  <int value="87" label="DXGI_FORMAT_B8G8R8A8_UNORM"/>
+  <int value="103" label="DXGI_FORMAT_NV12"/>
+  <int value="107" label="DXGI_FORMAT_YUY2"/>
+</enum>
+
 <enum name="DxgiFramePresentationMode">
   <int value="0" label="Composed"/>
   <int value="1" label="Overlay"/>
@@ -19350,6 +19361,7 @@
   <int value="1335" label="AUTOTESTPRIVATE_GETSHELFALIGNMENT"/>
   <int value="1336" label="AUTOTESTPRIVATE_SETSHELFALIGNMENT"/>
   <int value="1337" label="BLUETOOTH_RECORDPAIRING"/>
+  <int value="1338" label="FILEMANAGERPRIVATE_SETARCSTORAGETOASTSHOWNFLAG"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -22366,7 +22378,7 @@
   <int value="2064" label="PresentationRequestStartInsecureOrigin"/>
   <int value="2065" label="PersistentClientHintHeader"/>
   <int value="2066" label="StyleSheetListNonNullAnonymousNamedGetter"/>
-  <int value="2067" label="OffMainThreadFetch"/>
+  <int value="2067" label="OBSOLETE_OffMainThreadFetch"/>
   <int value="2068"
       label="OBSOLETE_HTMLOptionsCollectionNamedGetterReturnsNodeList"/>
   <int value="2069" label="ARIAActiveDescendantAttribute"/>
@@ -31338,6 +31350,21 @@
   <int value="3" label="Consumer manual launch"/>
 </enum>
 
+<enum name="KioskNextHomeBridgeAction">
+  <int value="0" label="List apps"/>
+  <int value="1" label="Launch app"/>
+  <int value="2" label="Uninstall app"/>
+  <int value="3" label="Notified of app change"/>
+  <int value="4" label="Get ARC Android id"/>
+  <int value="5" label="Launch intent"/>
+</enum>
+
+<enum name="KioskNextHomeLaunchIntentResult">
+  <int value="0" label="Success"/>
+  <int value="1" label="Not allowed"/>
+  <int value="2" label="ARC not available"/>
+</enum>
+
 <enum name="LanguageCode">
   <summary>ISO 639 Language Codes.</summary>
   <int value="24929" label="Afar"/>
@@ -32769,6 +32796,7 @@
   <int value="-2013551096" label="ViewsSimplifiedFullscreenUI:disabled"/>
   <int value="-2013124655" label="EnableEphemeralFlashPermission:disabled"/>
   <int value="-2012990889" label="SpannableInlineAutocomplete:enabled"/>
+  <int value="-2011532551" label="SignedExchangeSubresourcePrefetch:disabled"/>
   <int value="-2010634516" label="OmniboxLocalEntitySuggestions:disabled"/>
   <int value="-2009622663" label="WebRtcHWH264Encoding:enabled"/>
   <int value="-2008272679" label="disable-webrtc-hw-encoding"/>
@@ -32969,6 +32997,7 @@
   <int value="-1736075054" label="EnableFullscreenAppList:enabled"/>
   <int value="-1735643253" label="enable-display-list-2d-canvas"/>
   <int value="-1734254845" label="ash-enable-night-light"/>
+  <int value="-1732888954" label="UseButtonTranslateBubbleUI:enabled"/>
   <int value="-1732561795" label="ConsistentOmniboxGeolocation:enabled"/>
   <int value="-1731149013" label="AndroidMessagesIntegration:enabled"/>
   <int value="-1729926412" label="enable-webusb-notifications"/>
@@ -34777,6 +34806,7 @@
   <int value="1019623058" label="ash-enable-shelf-model-synchronization"/>
   <int value="1019857902"
       label="disable-hide-inactive-stacked-tab-close-buttons"/>
+  <int value="1022424308" label="SignedExchangeSubresourcePrefetch:enabled"/>
   <int value="1022992701" label="enable-origin-chip-always"/>
   <int value="1027252926" label="SyncSupportSecondaryAccount:enabled"/>
   <int value="1033148287" label="NTPShortcuts:disabled"/>
@@ -34955,6 +34985,7 @@
   <int value="1277386636" label="QueryInOmnibox:disabled"/>
   <int value="1279584261" label="enable-carrier-switching"/>
   <int value="1280614081" label="show-overdraw-feedback"/>
+  <int value="1281471853" label="UseButtonTranslateBubbleUI:disabled"/>
   <int value="1283908088" label="ImprovedLanguageSettings:disabled"/>
   <int value="1283956865" label="force-tablet-mode"/>
   <int value="1283960113" label="disable-fixed-position-compositing"/>
@@ -36131,6 +36162,13 @@
   <int value="1999" label="Unknown CBError code"/>
 </enum>
 
+<enum name="MacThermalState">
+  <int value="0" label="Nominal"/>
+  <int value="1" label="Fair"/>
+  <int value="2" label="Serious"/>
+  <int value="3" label="Critical"/>
+</enum>
+
 <enum name="MainFrameDownloadSandboxGesture">
   <obsolete>
     Deprecated as of 03/2019.
@@ -54706,6 +54744,16 @@
   <int value="1" label="Unknown reason"/>
 </enum>
 
+<enum name="SyncMissingBookmarkPermanentNodes">
+  <int value="0" label="Bookmark Bar"/>
+  <int value="1" label="Other Bookmarks"/>
+  <int value="2" label="Mobile Bookmarks"/>
+  <int value="3" label="Bookmark Bar and Other Bookmarks"/>
+  <int value="4" label="Bookmarks Bar and Mobile Bookmarks"/>
+  <int value="5" label="Other Bookmarks and Mobile Bookmarks"/>
+  <int value="6" label="Bookmark Bar and Other Bookmarks and Mobile Bookmarks"/>
+</enum>
+
 <enum name="SyncModelTypes">
   <int value="0" label="Unspecified"/>
   <int value="1" label="Top Level Folder"/>
@@ -61118,6 +61166,12 @@
   <int value="1" label="OpenVR"/>
 </enum>
 
+<enum name="XRSessionRequestDialogAction">
+  <int value="0" label="UserConsented"/>
+  <int value="1" label="UserDenied"/>
+  <int value="2" label="UserAbortedConsentFlow"/>
+</enum>
+
 <enum name="YoungGenerationHandling">
   <int value="0" label="Regular Scavenge"/>
   <int value="1" label="Scavenge using fast promotion mode"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 35cb74e..4af17de 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -1430,6 +1430,27 @@
   <summary>Records that a specific background task has loaded native.</summary>
 </histogram>
 
+<histogram name="Android.BackgroundTaskScheduler.TaskLoadedNative.FullBrowser"
+    enum="BackgroundTaskId" expires_after="2020-05-14">
+  <owner>mheikal@chromium.org</owner>
+  <owner>hanxi@chromium.org</owner>
+  <owner>hnakashima@chromium.org</owner>
+  <summary>
+    Records that a specific background task has loaded native in Full Browser
+    Mode.
+  </summary>
+</histogram>
+
+<histogram name="Android.BackgroundTaskScheduler.TaskLoadedNative.ReducedMode"
+    enum="BackgroundTaskId" expires_after="2020-05-14">
+  <owner>mheikal@chromium.org</owner>
+  <owner>hanxi@chromium.org</owner>
+  <owner>hnakashima@chromium.org</owner>
+  <summary>
+    Records that a specific background task has loaded native in Reduced Mode.
+  </summary>
+</histogram>
+
 <histogram name="Android.BackgroundTaskScheduler.TaskScheduled.Failure"
     enum="BackgroundTaskId">
   <owner>fgorski@chromium.org</owner>
@@ -43693,6 +43714,19 @@
 </histogram>
 
 <histogram name="GPU.DirectComposition.OverlayFormatUsed2" enum="OverlayFormat"
+    expires_after="2019-05-31">
+  <obsolete>
+    Deprecated 5/2019. Replaced by GPU.DirectComposition.OverlayFormatUsed3.
+  </obsolete>
+  <owner>sunnyps@chromium.org</owner>
+  <owner>zmo@chromium.org</owner>
+  <summary>
+    Which overlay format was chosen for YUV overlays. Recorded once per GPU
+    process launch only if hardware overlays are supported.
+  </summary>
+</histogram>
+
+<histogram name="GPU.DirectComposition.OverlayFormatUsed3" enum="DXGI_FORMAT"
     expires_after="2020-12-31">
   <owner>sunnyps@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
@@ -43848,6 +43882,18 @@
 </histogram>
 
 <histogram name="GPU.DirectComposition.SwapChainFormat2" enum="OverlayFormat"
+    expires_after="2019-05-31">
+  <obsolete>
+    Deprecated 5/2019. Replaced by GPU.DirectComposition.SwapChainFormatUsed3.
+  </obsolete>
+  <owner>sunnyps@chromium.org</owner>
+  <owner>zmo@chromium.org</owner>
+  <summary>
+    What format was used for each overlay swap chain on each swap buffers.
+  </summary>
+</histogram>
+
+<histogram name="GPU.DirectComposition.SwapChainFormat3" enum="DXGI_FORMAT"
     expires_after="2020-12-31">
   <owner>sunnyps@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
@@ -49786,6 +49832,39 @@
   </summary>
 </histogram>
 
+<histogram name="KioskNextHome.Bridge.Action" enum="KioskNextHomeBridgeAction"
+    expires_after="2019-12-31">
+  <owner>brunoad@chromium.org</owner>
+  <owner>maroun@chromium.org</owner>
+  <owner>michaelpg@chromium.org</owner>
+  <summary>
+    Records usage of methods in KioskNextHome Mojo bridge. Recorded on every
+    method invocation.
+  </summary>
+</histogram>
+
+<histogram name="KioskNextHome.Bridge.GetAndroidIdSuccess"
+    enum="BooleanSuccess" expires_after="2019-12-31">
+  <owner>brunoad@chromium.org</owner>
+  <owner>maroun@chromium.org</owner>
+  <owner>michaelpg@chromium.org</owner>
+  <summary>
+    Records the result (success or failure) of every call from KioskNextHome
+    bridge to get the Android id.
+  </summary>
+</histogram>
+
+<histogram name="KioskNextHome.Bridge.LaunchIntentResult"
+    enum="KioskNextHomeLaunchIntentResult" expires_after="2019-12-31">
+  <owner>brunoad@chromium.org</owner>
+  <owner>maroun@chromium.org</owner>
+  <owner>michaelpg@chromium.org</owner>
+  <summary>
+    Records the result (success or error reason) of every call from
+    KioskNextHome bridge to launch an intent.
+  </summary>
+</histogram>
+
 <histogram base="true" name="KioskNextHome.StateTransition.AnimationSmoothness"
     units="%" expires_after="2019-12-31">
 <!-- Name completed by histogram_suffixes name="EnterOrExitOverview" -->
@@ -96301,6 +96380,16 @@
   </summary>
 </histogram>
 
+<histogram name="Power.Mac.ThermalState" enum="MacThermalState"
+    expires_after="2020-05-13">
+  <owner>lgrey@chromium.org</owner>
+  <owner>sdy@chromium.org</owner>
+  <summary>
+    Thermal state of the user's machine as reported by macOS's [NSProcessInfo
+    thermalState]. Sampled once per minute.
+  </summary>
+</histogram>
+
 <histogram name="Power.MetricsDailyEventInterval" enum="DailyEventIntervalType"
     expires_after="M77">
   <owner>derat@chromium.org</owner>
@@ -126460,6 +126549,18 @@
   </summary>
 </histogram>
 
+<histogram name="Sync.MissingBookmarkPermanentNodes"
+    enum="SyncMissingBookmarkPermanentNodes" expires_after="M80">
+  <owner>mamir@chromium.org</owner>
+  <owner>mastiz@chromium.org</owner>
+  <summary>
+    Recorded after applying the first sync merge for Bookmarks in case of merge
+    failure. Merge failure is detected by missing one or more permanent nodes in
+    the merge result. This metric records which permanent nodes are missing.
+    It's recorded only for USS infrastrucre.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Sync.ModelTypeConfigurationTime.Ephemeral"
     units="ms" expires_after="2020-05-01">
   <owner>jkrcal@chromium.org</owner>
@@ -144755,6 +144856,46 @@
   </summary>
 </histogram>
 
+<histogram name="XR.WebXR.ConsentFlow" enum="XRSessionRequestDialogAction"
+    expires_after="M80">
+  <owner>sumankancherla@chromium.org</owner>
+  <owner>xr-dev@chromium.org</owner>
+  <summary>
+    Records the actions of a user consent dialog which is displayed on
+    requesting an XR session.
+  </summary>
+</histogram>
+
+<histogram name="XR.WebXR.ConsentFlowDuration.ConsentFlowAborted" units="ms"
+    expires_after="M80">
+  <owner>sumankancherla@chromium.org</owner>
+  <owner>xr-dev@chromium.org</owner>
+  <summary>
+    Time the user takes to abort the consent flow by clicking on the
+    window-close system button of a session request consent dialog.
+  </summary>
+</histogram>
+
+<histogram name="XR.WebXR.ConsentFlowDuration.ConsentGranted" units="ms"
+    expires_after="M80">
+  <owner>sumankancherla@chromium.org</owner>
+  <owner>xr-dev@chromium.org</owner>
+  <summary>
+    Time the user takes to click on the allow-and-enter-VR button on a session
+    request consent dialog.
+  </summary>
+</histogram>
+
+<histogram name="XR.WebXR.ConsentFlowDuration.ConsentNotGranted" units="ms"
+    expires_after="M80">
+  <owner>sumankancherla@chromium.org</owner>
+  <owner>xr-dev@chromium.org</owner>
+  <summary>
+    Time the user takes to click on dont-allow button on a session request
+    consent dialog.
+  </summary>
+</histogram>
+
 <histogram name="XR.WebXR.PresentationSession" enum="VRPresentationStartAction">
   <owner>billorr@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 417a24c..584ee15 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -80,6 +80,132 @@
   </metric>
 </event>
 
+<event name="AdFrameLoad">
+  <owner>johnidel@chromium.org</owner>
+  <owner>jkarlin@chromium.org</owner>
+  <summary>
+    Records metrics associated with a single ad frame for a page load. An ad
+    frame includes itself and all of its child frames. Only recorded for frames
+    with non-zero bytes. Recorded when a page is destroyed or when the app is
+    backgrounded on mobile.
+  </summary>
+  <metric name="CpuTime.PreActivation">
+    <summary>
+      Wall time of tasks attributed to the frame after the frame recieved user
+      activation. Measured in millseconds.
+    </summary>
+  </metric>
+  <metric name="CpuTime.Total">
+    <summary>
+      Total wall time of tasks attributed to the frame. Measured in
+      milliseconds.
+    </summary>
+  </metric>
+  <metric name="FrameDepth">
+    <summary>
+      The depth of this frame's frame tree. There is no set limit on a frame's
+      maximum depth.
+    </summary>
+  </metric>
+  <metric name="Loading.CacheBytes">
+    <summary>
+      Bytes loaded from the cache for all resources loaded within the frame.
+      This is rounded down to the nearest exponential bucket (with a bucket
+      ratio of 1.3).
+    </summary>
+  </metric>
+  <metric name="Loading.ImageBytes">
+    <summary>
+      Network bytes loaded for resources with an image mime type within the
+      frame. Includes header bytes. This is rounded down to the nearest
+      exponential bucket (with a bucket ratio of 1.3).
+    </summary>
+  </metric>
+  <metric name="Loading.JavascriptBytes">
+    <summary>
+      Network bytes loaded for resources with a javascript mime type within the
+      frame. Includes header bytes. This is rounded down to the nearest
+      exponential bucket (with a bucket ratio of 1.3).
+    </summary>
+  </metric>
+  <metric name="Loading.NetworkBytes">
+    <summary>
+      Network bytes loaded for all resources within the frame. Includes header
+      bytes. This is rounded down to the nearest exponential bucket (with a
+      bucket ratio of 1.3).
+    </summary>
+  </metric>
+  <metric name="Loading.NumResources">
+    <summary>
+      Total number of resources loaded by the frame, including incomplete
+      resources.
+    </summary>
+  </metric>
+  <metric name="Loading.VideoBytes">
+    <summary>
+      Network bytes loaded for resources with a video/ mime type within the
+      frame. Includes header bytes. This is rounded down to the nearest
+      exponential bucket (with a bucket ratio of 1.3).
+    </summary>
+  </metric>
+  <metric name="Status.CrossOrigin">
+    <summary>
+      An enum representing whether the frame was Cross-Origin or Same-Origin to
+      it's parent frame. See FrameData::OriginStatus.
+    </summary>
+  </metric>
+  <metric name="Status.Media">
+    <summary>
+      An enum representing whether media was played in the frame. See
+      FrameData::MediaStatus.
+    </summary>
+  </metric>
+  <metric name="Status.UserActivation">
+    <summary>
+      An enum representing whether the frame received user activation. See
+      FrameData::UserActivationStatus.
+    </summary>
+  </metric>
+  <metric name="Timing.FirstContentfulPaint">
+    <summary>
+      Number of milliseconds before FirstContentfulpaint was reached in the
+      frame. This is relative to subframe navigation start.
+    </summary>
+  </metric>
+  <metric name="Timing.Interactive">
+    <summary>
+      Number of millseconds before Time-To-Interactive was reached in the frame.
+      This is relative to subframe navigation start.
+    </summary>
+  </metric>
+  <metric name="Timing.PreActivationForegroundDuration">
+    <summary>
+      Number of millseconds that the current web contents spent in the
+      foreground prior to the frame receiving user activation.
+    </summary>
+  </metric>
+  <metric name="Visibility.FrameHeight">
+    <summary>
+      Last known height of the iframe in pixels. Not reported accurately when
+      &quot;Visiblity.Hidden&quot; is true. This is rounded down to the nearest
+      exponential bucket (with a bucket ratio of 1.15).
+    </summary>
+  </metric>
+  <metric name="Visibility.FrameWidth">
+    <summary>
+      Last known width of the iframe in pixels. Not reported accurately when
+      &quot;Visiblity.Hidden&quot; is true. This is rounded down to the nearest
+      exponential bucket (with a bucket ratio of 1.15).
+    </summary>
+  </metric>
+  <metric name="Visibility.Hidden">
+    <summary>
+      A 0 or 1 values representing whether the frame had a display=none styling
+      set. Records the last known value.
+    </summary>
+  </metric>
+</event>
+
 <event name="AdPageLoad">
   <owner>johnidel@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
diff --git a/tools/perf/contrib/cluster_telemetry/analysis_metrics_ct.py b/tools/perf/contrib/cluster_telemetry/analysis_metrics_ct.py
deleted file mode 100644
index 634df839..0000000
--- a/tools/perf/contrib/cluster_telemetry/analysis_metrics_ct.py
+++ /dev/null
@@ -1,57 +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.
-
-from core import perf_benchmark
-
-from contrib.cluster_telemetry import ct_benchmarks_util
-from contrib.cluster_telemetry import local_trace_measurement
-from contrib.cluster_telemetry import page_set
-
-from telemetry.web_perf import timeline_based_measurement
-
-
-class AnalysisMetricsCT(perf_benchmark.PerfBenchmark):
-  """Benchmark that reads in the provided local trace file and invokes TBMv2
-     metrics on that trace"""
-
-  test = local_trace_measurement.LocalTraceMeasurement
-  metric_name = ""  # Set by ProcessCommandLineArgs.
-
-  def CreateCoreTimelineBasedMeasurementOptions(self):
-    tbm_options = timeline_based_measurement.Options()
-    tbm_options.AddTimelineBasedMetric(AnalysisMetricsCT.metric_name)
-    return tbm_options
-
-  @classmethod
-  def AddBenchmarkCommandLineArgs(cls, parser):
-    super(AnalysisMetricsCT, cls).AddBenchmarkCommandLineArgs(parser)
-    ct_benchmarks_util.AddBenchmarkCommandLineArgs(parser)
-    parser.add_option('--local-trace-path', type='string',
-                      default=None,
-                      help='The local path to the trace file')
-    parser.add_option('--cloud-trace-link', type='string',
-                      default=None,
-                      help='Cloud link from where the local trace file was ' +
-                           'downloaded')
-    parser.add_option('--metric-name', type='string',
-                      default=None,
-                      help='The metric to parse the trace with')
-
-  @classmethod
-  def ProcessCommandLineArgs(cls, parser, args):
-    if not args.local_trace_path:
-      parser.error('Please specify --local-trace-path')
-    if not args.cloud_trace_link:
-      parser.error('Please specify --cloud-trace-link')
-    if not args.metric_name:
-      parser.error('Please specify --metric-name')
-    cls.metric_name = args.metric_name
-
-  def CreateStorySet(self, options):
-    return page_set.CTBrowserLessPageSet(options.local_trace_path,
-                                         options.cloud_trace_link)
-
-  @classmethod
-  def Name(cls):
-    return 'analysis_metrics_ct'
diff --git a/tools/perf/contrib/cluster_telemetry/local_trace_measurement.py b/tools/perf/contrib/cluster_telemetry/local_trace_measurement.py
deleted file mode 100644
index dca8243..0000000
--- a/tools/perf/contrib/cluster_telemetry/local_trace_measurement.py
+++ /dev/null
@@ -1,65 +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 logging
-import os
-import time
-
-from telemetry.value import common_value_helpers
-from telemetry.web_perf import timeline_based_measurement
-from tracing.metrics import metric_runner
-
-
-class LocalTraceMeasurement(
-    timeline_based_measurement.TimelineBasedMeasurement):
-  """Collects metrics from the provided trace file."""
-
-  def __init__(self, options, results_wrapper=None):
-    super(LocalTraceMeasurement, self).__init__(options, results_wrapper)
-
-  def WillRunStory(self, platform):
-    """Executes any necessary actions before running the story."""
-    pass
-
-  def Measure(self, platform, results):
-    """Collect all possible metrics and add them to results."""
-    # Extract the file name without the "file:/" prefix.
-    assert results.current_page.name.startswith("file:/"), \
-        "current page path should start with file:/"
-    filename = results.current_page.name[len("file:/"):]
-
-    metrics = self._tbm_options.GetTimelineBasedMetrics()
-    extra_import_options = {
-        'trackDetailedModelStats': True
-    }
-    trace_size_in_mib = os.path.getsize(filename) / (2 ** 20)
-    # Bails out on trace that are too big. See crbug.com/812631 for more
-    # details.
-    if trace_size_in_mib > 400:
-      results.Fail('Trace size is too big: %s MiB' % trace_size_in_mib)
-      return
-
-    logging.warning('Starting to compute metrics on trace')
-    start = time.time()
-    mre_result = metric_runner.RunMetric(
-        filename, metrics, extra_import_options,
-        report_progress=False,
-        canonical_url=results.current_page.cloud_trace_link)
-    logging.warning('Processing resulting traces took %.3f seconds' % (
-        time.time() - start))
-    page = results.current_page
-
-    for f in mre_result.failures:
-      results.Fail(f.stack)
-
-    histogram_dicts = mre_result.pairs.get('histograms', [])
-    results.ImportHistogramDicts(histogram_dicts)
-
-    for d in mre_result.pairs.get('scalars', []):
-      results.AddValue(common_value_helpers.TranslateScalarValue(d, page))
-
-  def DidRunStory(self, platform, results):
-    """Clean up after running the story."""
-    pass
diff --git a/tools/perf/contrib/cluster_telemetry/page_set.py b/tools/perf/contrib/cluster_telemetry/page_set.py
index 49fe522b..5ceea7b 100644
--- a/tools/perf/contrib/cluster_telemetry/page_set.py
+++ b/tools/perf/contrib/cluster_telemetry/page_set.py
@@ -2,8 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-from contrib.cluster_telemetry import shared_browserless_story
-
 from telemetry.page import cache_temperature as cache_temperature_module
 from telemetry.page import traffic_setting as traffic_setting_module
 from telemetry.page import page as page_module
@@ -39,28 +37,6 @@
       self._run_page_interaction_callback(action_runner)
 
 
-class LocalTracePath(story.Story):
-  def __init__(self, local_trace_path, cloud_trace_link, shared_state_class):
-    super(LocalTracePath, self).__init__(
-        shared_state_class=shared_state_class,
-        name=local_trace_path)
-    self.cloud_trace_link = cloud_trace_link
-  def Run(self, shared_state):
-    pass
-
-
-class CTBrowserLessPageSet(story.StorySet):
-  """Page set used by CT Benchmarks that do not require a browser."""
-  def __init__(self, local_trace_path, cloud_trace_link):
-    super(CTBrowserLessPageSet, self).__init__()
-    shared_state_class = shared_browserless_story.SharedBrowserlessStory
-    self.AddStory(
-        LocalTracePath(
-            local_trace_path=local_trace_path,
-            cloud_trace_link=cloud_trace_link,
-            shared_state_class=shared_state_class))
-
-
 class CTPageSet(story.StorySet):
   """Page set used by CT Benchmarks."""
 
diff --git a/tools/perf/contrib/cluster_telemetry/shared_browserless_story.py b/tools/perf/contrib/cluster_telemetry/shared_browserless_story.py
deleted file mode 100644
index 771ca24..0000000
--- a/tools/perf/contrib/cluster_telemetry/shared_browserless_story.py
+++ /dev/null
@@ -1,40 +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.
-
-
-from telemetry import story as story_module
-from telemetry.core import platform as p_module
-
-
-class SharedBrowserlessStory(story_module.SharedState):
-  """
-  This class subclasses story_module.SharedState and removes all logic required
-  to bring up a browser that is found in shared_page_state.SharedPageState.
-  """
-
-  def __init__(self, test, finder_options, story_set, possible_browser=None):
-    super(SharedBrowserlessStory, self).__init__(
-        test, finder_options, story_set, possible_browser)
-
-  @property
-  def platform(self):
-    p_module.GetHostPlatform()
-
-  def WillRunStory(self, unused_page):
-    return
-
-  def DidRunStory(self, results):
-    return
-
-  def CanRunStory(self, unused_page):
-    return True
-
-  def RunStory(self, results):
-    return
-
-  def TearDownState(self):
-    pass
-
-  def DumpStateUponFailure(self, story, results):
-    pass
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 33822472c..3995740 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -169,6 +169,9 @@
 crbug.com/865400 [ Pixel_2 Android_Webview ] loading.mobile/VoiceMemos_cold_3g [ Skip ]
 crbug.com/919191 [ Nexus5X_Webview ] loading.mobile/OLX_3g [ Skip ]
 
+# Benchmark: memory.desktop
+crbug.com/965066 [ Win_10 ] memory.desktop/TrivialFullscreenVideoPageSharedPageState [ Skip ]
+
 # Benchmark: oilpan_gc_times.key_silk_cases
 crbug.com/446332 [ All ] oilpan_gc_times.key_silk_cases/slide_drawer [ Skip ]
 crbug.com/507865 [ All ] oilpan_gc_times.key_silk_cases/polymer_topeka [ Skip ]
@@ -314,6 +317,33 @@
 crbug.com/947267 [ Nexus_5X ] system_health.memory_mobile/background:media:imgur [ Skip ]
 crbug.com/954949 [ Nexus5X_Webview ] system_health.memory_mobile/browse:news:washingtonpost [ Skip ]
 crbug.com/961417 [ Android_Go ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+crbug.com/964960 [ Nexus_5X ] system_health.memory_mobile/load:media:soundcloud:2018 [ Skip ]
+crbug.com/964960 [ Nexus_5X ] system_health.memory_mobile/load:social:twitter [ Skip ]
+crbug.com/964960 [ Nexus_5X ] system_health.memory_mobile/load:media:facebook_photos [ Skip ]
+crbug.com/964960 [ Nexus_5X ] system_health.memory_mobile/load:search:yahoo:2018 [ Skip ]
+
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/browse:media:flickr_infinite_scroll [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/browse:search:amp:2018 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:games:lazors [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:games:spychase:2018 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:media:flickr:2018 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:news:irctc [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:search:baidu:2018 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:search:google:2018 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:tools:stackoverflow:2018 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/background:search:google [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/browse:media:googleplaystore:2019 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/browse:media:imgur [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/browse:media:facebook_photos [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/browse:media:youtube [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/browse:shopping:lazada [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/browse:tools:maps [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:media:dailymotion [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:news:qq [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:news:wikipedia:2018 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:search:ebay:2018 [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:search:taobao [ Skip ]
+crbug.com/964804 [ Nexus_5X ] system_health.memory_mobile/load:tools:dropbox [ Skip ]
 
 # Benchmark: tab_switching.typical_25
 crbug.com/747026 [ Mac ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc
index db33d5b..b8f23b3 100644
--- a/ui/accessibility/ax_node.cc
+++ b/ui/accessibility/ax_node.cc
@@ -23,23 +23,22 @@
                int32_t index_in_parent)
     : tree_(tree),
       index_in_parent_(index_in_parent),
+      unignored_child_count_(0),
       parent_(parent),
       language_info_(nullptr) {
   data_.id = id;
+  // If this node is the root, use the given index_in_parent to provide
+  // consistency.
+  if (!parent)
+    unignored_index_in_parent_ = index_in_parent_;
+  else
+    unignored_index_in_parent_ = -1;
 }
 
 AXNode::~AXNode() = default;
 
 int AXNode::GetUnignoredChildCount() const {
-  int count = 0;
-  for (int i = 0; i < child_count(); i++) {
-    AXNode* child = children_[i];
-    if (child->data().HasState(ax::mojom::State::kIgnored))
-      count += child->GetUnignoredChildCount();
-    else
-      count++;
-  }
-  return count;
+  return unignored_child_count_;
 }
 
 AXNodeData&& AXNode::TakeData() {
@@ -75,15 +74,7 @@
 }
 
 int AXNode::GetUnignoredIndexInParent() const {
-  AXNode* parent = GetUnignoredParent();
-  if (parent) {
-    for (int i = 0; i < parent->GetUnignoredChildCount(); ++i) {
-      if (parent->GetUnignoredChildAtIndex(i) == this)
-        return i;
-    }
-  }
-
-  return 0;
+  return unignored_index_in_parent_;
 }
 
 bool AXNode::IsText() const {
@@ -117,6 +108,11 @@
   index_in_parent_ = index_in_parent;
 }
 
+void AXNode::UpdateUnignoredCachedValues() {
+  if (!data().HasState(ax::mojom::State::kIgnored))
+    UpdateUnignoredCachedValuesRecursive(0);
+}
+
 void AXNode::SwapChildren(std::vector<AXNode*>& children) {
   children.swap(children_);
 }
@@ -687,6 +683,21 @@
   }
 }
 
+int AXNode::UpdateUnignoredCachedValuesRecursive(int startIndex) {
+  int count = 0;
+  for (int i = 0; i < child_count(); i++) {
+    AXNode* child = children_[i];
+    if (child->data().HasState(ax::mojom::State::kIgnored)) {
+      child->unignored_index_in_parent_ = -1;
+      count += child->UpdateUnignoredCachedValuesRecursive(startIndex + count);
+    } else {
+      child->unignored_index_in_parent_ = startIndex + count++;
+    }
+  }
+  unignored_child_count_ = count;
+  return count;
+}
+
 // Finds ordered set that immediately contains node.
 // Is not required for set's role to match node's role.
 AXNode* AXNode::GetOrderedSet() const {
diff --git a/ui/accessibility/ax_node.h b/ui/accessibility/ax_node.h
index a9e2cb69..2fee8f0d 100644
--- a/ui/accessibility/ax_node.h
+++ b/ui/accessibility/ax_node.h
@@ -94,6 +94,9 @@
   // Set the index in parent, for example if siblings were inserted or deleted.
   void SetIndexInParent(int index_in_parent);
 
+  // Update the unignored index in parent for unignored children.
+  void UpdateUnignoredCachedValues();
+
   // Swap the internal children vector with |children|. This instance
   // now owns all of the passed children.
   void SwapChildren(std::vector<AXNode*>& children);
@@ -308,11 +311,15 @@
   void IdVectorToNodeVector(std::vector<int32_t>& ids,
                             std::vector<AXNode*>* nodes) const;
 
+  int UpdateUnignoredCachedValuesRecursive(int startIndex);
+
   // Finds and returns a pointer to ordered set containing node.
   AXNode* GetOrderedSet() const;
 
   OwnerTree* tree_;  // Owns this.
   int index_in_parent_;
+  int unignored_index_in_parent_;
+  int unignored_child_count_;
   AXNode* parent_;
   std::vector<AXNode*> children_;
   AXNodeData data_;
diff --git a/ui/accessibility/ax_table_info.cc b/ui/accessibility/ax_table_info.cc
index 7466c2f..272caaa 100644
--- a/ui/accessibility/ax_table_info.cc
+++ b/ui/accessibility/ax_table_info.cc
@@ -376,8 +376,13 @@
   data.id = id;
   data.role = ax::mojom::Role::kColumn;
   node->SetData(data);
-  for (AXTreeObserver& observer : tree_->observers())
+  for (AXTreeObserver& observer : tree_->observers()) {
     observer.OnNodeCreated(tree_, node);
+    observer.OnAtomicUpdateFinished(
+        tree_, false,
+        {AXTreeObserver::Change(node,
+                                AXTreeObserver::ChangeType::NODE_CREATED)});
+  }
   return node;
 }
 
@@ -389,8 +394,14 @@
   data.id = id;
   data.role = ax::mojom::Role::kTableHeaderContainer;
   node->SetData(data);
-  for (AXTreeObserver& observer : tree_->observers())
+
+  for (AXTreeObserver& observer : tree_->observers()) {
     observer.OnNodeCreated(tree_, node);
+    observer.OnAtomicUpdateFinished(
+        tree_, false,
+        {AXTreeObserver::Change(node,
+                                AXTreeObserver::ChangeType::NODE_CREATED)});
+  }
 
   return node;
 }
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
index 36e661e..97acf858 100644
--- a/ui/accessibility/ax_tree.cc
+++ b/ui/accessibility/ax_tree.cc
@@ -132,6 +132,10 @@
   // decisions about when to notify observers of removals or reparenting.
   std::set<int> changed_node_ids;
 
+  // keeps track of parents whose unignored children have changed. Used for
+  // caching unignored relationships.
+  std::unordered_set<int> changed_unignored_parent_ids;
+
   // Keeps track of new nodes created during this update.
   std::set<const AXNode*> new_nodes;
 
@@ -498,6 +502,12 @@
     changes.push_back(AXTreeObserver::Change(node, change));
   }
 
+  for (int parent_id : update_state.changed_unignored_parent_ids) {
+    AXNode* parent = GetFromId(parent_id);
+    if (parent)
+      parent->UpdateUnignoredCachedValues();
+  }
+
   // Tree is no longer updating.
   SetTreeUpdateInProgressState(false);
 
@@ -566,6 +576,10 @@
     else
       observer.OnNodeReparented(this, new_node);
   }
+  AXNode* unignored_parent = new_node->GetUnignoredParent();
+  if (unignored_parent) {
+    update_state->changed_unignored_parent_ids.insert(unignored_parent->id());
+  }
   return new_node;
 }
 
@@ -589,10 +603,18 @@
     if (!update_state->IsNewNode(node) ||
         update_state->IsReparentedNode(node)) {
       auto it = update_state->reparented_node_id_to_data.find(node->id());
-      if (it != update_state->reparented_node_id_to_data.end())
-        CallNodeChangeCallbacks(node, it->second, src);
-      else
-        CallNodeChangeCallbacks(node, node->data(), src);
+      const AXNodeData& old_data =
+          it != update_state->reparented_node_id_to_data.end() ? it->second
+                                                               : node->data();
+      CallNodeChangeCallbacks(node, old_data, src);
+      if (old_data.HasState(ax::mojom::State::kIgnored) !=
+          src.HasState(ax::mojom::State::kIgnored)) {
+        AXNode* unignored_parent = node->GetUnignoredParent();
+        if (unignored_parent) {
+          update_state->changed_unignored_parent_ids.insert(
+              unignored_parent->id());
+        }
+      }
     }
     UpdateReverseRelations(node, src);
     node->SetData(src);
@@ -851,6 +873,10 @@
   for (int i = 0; i < node->child_count(); ++i)
     DestroyNodeAndSubtree(node->ChildAtIndex(i), update_state);
   if (update_state) {
+    AXNode* unignored_parent = node->GetUnignoredParent();
+    if (unignored_parent) {
+      update_state->changed_unignored_parent_ids.insert(unignored_parent->id());
+    }
     update_state->pending_nodes.erase(node);
     update_state->removed_node_ids.insert(node->id());
   }
@@ -971,8 +997,8 @@
   bool node_is_radio_button =
       (original_node.data().role == ax::mojom::Role::kRadioButton);
 
-  for (int i = 0; i < local_parent->child_count(); ++i) {
-    const AXNode* child = local_parent->ChildAtIndex(i);
+  for (int i = 0; i < local_parent->GetUnignoredChildCount(); ++i) {
+    const AXNode* child = local_parent->GetUnignoredChildAtIndex(i);
 
     // Invisible children should not be counted.
     // However, in the collapsed container case (e.g. a combobox), items can
diff --git a/ui/accessibility/ax_tree_unittest.cc b/ui/accessibility/ax_tree_unittest.cc
index 3a14156..5f87853 100644
--- a/ui/accessibility/ax_tree_unittest.cc
+++ b/ui/accessibility/ax_tree_unittest.cc
@@ -1403,6 +1403,124 @@
   EXPECT_EQ(1, root->GetUnignoredChildAtIndex(0)->GetUnignoredParent()->id());
 }
 
+TEST(AXTreeTest, CachedUnignoredValues) {
+  AXTreeUpdate initial_state;
+  initial_state.root_id = 1;
+  initial_state.nodes.resize(5);
+  initial_state.nodes[0].id = 1;
+  initial_state.nodes[0].child_ids = {2, 3};
+  initial_state.nodes[1].id = 2;
+  initial_state.nodes[1].AddState(ax::mojom::State::kIgnored);
+  initial_state.nodes[1].child_ids = {4, 5};
+  initial_state.nodes[2].id = 3;
+  initial_state.nodes[3].id = 4;
+  initial_state.nodes[4].id = 5;
+
+  AXTree tree(initial_state);
+  AXNode* root = tree.root();
+  ASSERT_EQ(2, root->child_count());
+  ASSERT_EQ(2, root->ChildAtIndex(0)->id());
+  ASSERT_EQ(3, root->ChildAtIndex(1)->id());
+
+  EXPECT_EQ(3, root->GetUnignoredChildCount());
+  EXPECT_EQ(4, root->GetUnignoredChildAtIndex(0)->id());
+  EXPECT_EQ(5, root->GetUnignoredChildAtIndex(1)->id());
+  EXPECT_EQ(3, root->GetUnignoredChildAtIndex(2)->id());
+  EXPECT_EQ(0, root->GetUnignoredChildAtIndex(0)->GetUnignoredIndexInParent());
+  EXPECT_EQ(1, root->GetUnignoredChildAtIndex(1)->GetUnignoredIndexInParent());
+  EXPECT_EQ(2, root->GetUnignoredChildAtIndex(2)->GetUnignoredIndexInParent());
+
+  EXPECT_EQ(1, root->GetUnignoredChildAtIndex(0)->GetUnignoredParent()->id());
+
+  EXPECT_EQ(-1, tree.GetFromId(2)->GetUnignoredIndexInParent());
+
+  // Ensure when a node goes from ignored to unignored, its children have their
+  // unignored_index_in_parent updated.
+  AXTreeUpdate update = initial_state;
+  update.nodes[1].RemoveState(ax::mojom::State::kIgnored);
+
+  EXPECT_TRUE(tree.Unserialize(update));
+
+  root = tree.root();
+  EXPECT_EQ(2, root->GetUnignoredChildCount());
+  EXPECT_EQ(2, root->GetUnignoredChildAtIndex(0)->id());
+  EXPECT_EQ(0, tree.GetFromId(4)->GetUnignoredIndexInParent());
+  EXPECT_EQ(1, tree.GetFromId(5)->GetUnignoredIndexInParent());
+
+  // Ensure when a node goes from unignored to unignored, siblings are correctly
+  // updated.
+  AXTreeUpdate update2 = update;
+  update2.nodes[3].AddState(ax::mojom::State::kIgnored);
+
+  EXPECT_TRUE(tree.Unserialize(update2));
+
+  EXPECT_EQ(-1, tree.GetFromId(4)->GetUnignoredIndexInParent());
+  EXPECT_EQ(0, tree.GetFromId(5)->GetUnignoredIndexInParent());
+
+  // Ensure siblings of a deleted node are updated.
+  AXTreeUpdate update3 = update2;
+  update3.nodes.resize(1);
+  update3.nodes[0].id = 1;
+  update3.nodes[0].child_ids = {3};
+
+  EXPECT_TRUE(tree.Unserialize(update3));
+
+  EXPECT_EQ(0, tree.GetFromId(3)->GetUnignoredIndexInParent());
+
+  // Ensure new nodes are correctly updated.
+  AXTreeUpdate update4 = update3;
+  update4.nodes.resize(3);
+  update4.nodes[0].id = 1;
+  update4.nodes[0].child_ids = {3, 6};
+  update4.nodes[1].id = 6;
+  update4.nodes[1].child_ids = {7};
+  update4.nodes[2].id = 7;
+
+  EXPECT_TRUE(tree.Unserialize(update4));
+
+  EXPECT_EQ(0, tree.GetFromId(3)->GetUnignoredIndexInParent());
+  EXPECT_EQ(1, tree.GetFromId(6)->GetUnignoredIndexInParent());
+  EXPECT_EQ(0, tree.GetFromId(7)->GetUnignoredIndexInParent());
+
+  // Ensure reparented nodes are correctly updated.
+  AXTreeUpdate update5 = update4;
+  update5.nodes.resize(2);
+  update5.node_id_to_clear = 6;
+  update5.nodes[0].id = 1;
+  update5.nodes[0].child_ids = {3, 7};
+  update5.nodes[1].id = 7;
+  update5.nodes[1].child_ids = {};
+
+  EXPECT_TRUE(tree.Unserialize(update5));
+
+  EXPECT_EQ(2, tree.GetFromId(1)->GetUnignoredChildCount());
+  EXPECT_EQ(0, tree.GetFromId(3)->GetUnignoredIndexInParent());
+  EXPECT_EQ(1, tree.GetFromId(7)->GetUnignoredIndexInParent());
+
+  AXTreeUpdate update6;
+  update6.nodes.resize(1);
+  update6.nodes[0].id = 7;
+  update6.nodes[0].AddState(ax::mojom::State::kIgnored);
+
+  EXPECT_TRUE(tree.Unserialize(update6));
+
+  EXPECT_EQ(1, tree.GetFromId(1)->GetUnignoredChildCount());
+  EXPECT_EQ(0, tree.GetFromId(3)->GetUnignoredIndexInParent());
+  EXPECT_EQ(-1, tree.GetFromId(7)->GetUnignoredIndexInParent());
+
+  AXTreeUpdate update7 = update6;
+  update7.nodes.resize(2);
+  update7.nodes[0].id = 7;
+  update7.nodes[0].child_ids = {8};
+  update7.nodes[1].id = 8;
+
+  EXPECT_TRUE(tree.Unserialize(update7));
+
+  EXPECT_EQ(2, tree.GetFromId(1)->GetUnignoredChildCount());
+  EXPECT_EQ(0, tree.GetFromId(3)->GetUnignoredIndexInParent());
+  EXPECT_EQ(-1, tree.GetFromId(7)->GetUnignoredIndexInParent());
+}
+
 TEST(AXTreeTest, TestRecursionUnignoredChildCount) {
   AXTreeUpdate tree_update;
   tree_update.root_id = 1;
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index 2429001..103c0da2 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -36,9 +36,6 @@
     "input_state_lookup_win.h",
     "layout_manager.h",
     "local/window_port_local.h",
-    "mus/client_surface_embedder.h",
-    "mus/property_converter.h",
-    "mus/property_utils.h",
     "null_window_targeter.h",
     "scoped_keyboard_hook.h",
     "scoped_simple_keyboard_hook.h",
@@ -81,9 +78,6 @@
     "input_state_lookup_win.cc",
     "layout_manager.cc",
     "local/window_port_local.cc",
-    "mus/client_surface_embedder.cc",
-    "mus/property_converter.cc",
-    "mus/property_utils.cc",
     "native_window_occlusion_tracker_win.cc",
     "native_window_occlusion_tracker_win.h",
     "null_window_targeter.cc",
@@ -124,7 +118,6 @@
     "//gpu/ipc/client",
     "//mojo/public/cpp/system",
     "//services/service_manager/public/cpp",
-    "//services/ws/public/cpp",
     "//services/ws/public/mojom",
     "//skia",
     "//ui/base",
@@ -237,7 +230,6 @@
     "//base/test:test_support",
     "//cc:test_support",
     "//components/viz/test:test_support",
-    "//services/service_manager/public/cpp",
     "//services/ws/public/cpp/input_devices",
     "//services/ws/public/mojom",
     "//skia",
@@ -314,7 +306,6 @@
   sources = [
     "../compositor_extra/shadow_unittest.cc",
     "gestures/gesture_recognizer_unittest.cc",
-    "mus/property_converter_unittest.cc",
     "test/aura_test_suite.h",
     "test/run_all_unittests.cc",
     "window_event_dispatcher_unittest.cc",
@@ -337,7 +328,7 @@
     "//cc/mojo_embedder",
     "//components/viz/client",
     "//mojo/core/embedder",
-    "//services/ws/public/cpp",
+    "//services/ws/public/mojom",
     "//skia",
     "//testing/gtest",
     "//ui/aura_extra",
diff --git a/ui/aura/mus/DEPS b/ui/aura/mus/DEPS
deleted file mode 100644
index de43abf4..0000000
--- a/ui/aura/mus/DEPS
+++ /dev/null
@@ -1,27 +0,0 @@
-include_rules = [
-  "+cc/base/switches.h",
-  "+cc/mojo_embedder/async_layer_tree_frame_sink.h",
-  "+cc/trees/layer_tree_frame_sink_client.h",
-  "+cc/trees/layer_tree_frame_sink.h",
-  "+cc/scheduler/begin_frame_source.h",
-  "+components/discardable_memory/client/client_discardable_shared_memory_manager.h",
-  "+components/viz/client",
-  "+components/viz/common",
-  "+components/viz/service/frame_sinks/frame_sink_manager_impl.h",
-  "+gpu/command_buffer/client/gpu_memory_buffer_manager.h",
-  "+gpu/command_buffer/client/gles2_interface.h",
-  "+gpu/command_buffer/common",
-  "+gpu/ipc/client/gpu_channel_host.h",
-  "+mojo/public/cpp/system/buffer.h",
-  "+mojo/public/cpp/system/platform_handle.h",
-  "+services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h",
-  "+services/ws/public",
-  "+ui/gl/gl_bindings.h",
-]
-
-specific_include_rules = {
-  # Tests can depend upon wm.
-  "focus_synchronizer_unittest.cc": [
-    "+ui/wm",
-  ],
-}
diff --git a/ui/aura/mus/client_surface_embedder.cc b/ui/aura/mus/client_surface_embedder.cc
deleted file mode 100644
index 17c24769a..0000000
--- a/ui/aura/mus/client_surface_embedder.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/aura/mus/client_surface_embedder.h"
-
-#include "ui/aura/window.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/layer_owner.h"
-#include "ui/gfx/geometry/dip_util.h"
-
-namespace aura {
-namespace {
-
-// Returns the target visibility respecting the window hierarchy. It returns
-// true only when the target visibility of the window and all its ancestors are
-// true. This can check if the window is going to be drawn without the effect
-// of LayerAnimator.
-bool GetTargetVisibility(aura::Window* window) {
-  if (!window)
-    return false;
-  while (window && window->TargetVisibility())
-    window = window->parent();
-  return window == nullptr;
-}
-
-}  // namespace
-
-ClientSurfaceEmbedder::ClientSurfaceEmbedder(Window* window)
-    : window_(window),
-      surface_layer_owner_(std::make_unique<ui::LayerOwner>(
-          std::make_unique<ui::Layer>(ui::LAYER_SOLID_COLOR))) {
-  surface_layer_owner_->layer()->set_name("ClientSurfaceEmbedder");
-  surface_layer_owner_->layer()->SetMasksToBounds(true);
-  // The frame provided by the parent window->layer() needs to show through
-  // the surface layer.
-  surface_layer_owner_->layer()->SetFillsBoundsOpaquely(false);
-  surface_layer_owner_->layer()->SetVisible(GetTargetVisibility(window_));
-
-  window_->layer()->Add(surface_layer_owner_->layer());
-
-  // Window's layer may contain content from this client (the embedder), e.g.
-  // this is the case with window decorations provided by Window Manager.
-  // This content should appear underneath the content of the embedded client.
-  window_->layer()->StackAtTop(surface_layer_owner_->layer());
-  window_->AddObserver(this);
-}
-
-ClientSurfaceEmbedder::~ClientSurfaceEmbedder() {
-  window_->RemoveObserver(this);
-}
-
-void ClientSurfaceEmbedder::SetSurfaceId(const viz::SurfaceId& surface_id) {
-  // Set the background to transparent to avoid a flash of color before the
-  // client surface is rendered. See https://crbug.com/930199
-  const gfx::Size size = window_->bounds().size();
-  surface_layer_owner_->layer()->SetBounds(gfx::Rect(size));
-  surface_layer_owner_->layer()->SetShowSurface(
-      surface_id, size, SK_ColorTRANSPARENT,
-      cc::DeadlinePolicy::UseDefaultDeadline(),
-      false /* stretch_content_to_fill_bounds */);
-  window_->layer()->StackAtTop(surface_layer_owner_->layer());
-}
-
-viz::SurfaceId ClientSurfaceEmbedder::GetSurfaceId() const {
-  const viz::SurfaceId* id = surface_layer_owner_->layer()->GetSurfaceId();
-  return id ? *id : viz::SurfaceId();
-}
-
-ui::Layer* ClientSurfaceEmbedder::GetSurfaceLayerForTesting() const {
-  return surface_layer_owner_->layer();
-}
-
-void ClientSurfaceEmbedder::OnWindowVisibilityChanged(Window* window,
-                                                      bool visible) {
-  if (window->Contains(window_))
-    surface_layer_owner_->layer()->SetVisible(GetTargetVisibility(window_));
-}
-
-void ClientSurfaceEmbedder::OnWindowHierarchyChanged(
-    const HierarchyChangeParams& params) {
-  // Window may change visibility as a result of being reparented to a different
-  // parent window with different visibility.
-  if (params.target == window_)
-    surface_layer_owner_->layer()->SetVisible(GetTargetVisibility(window_));
-}
-
-}  // namespace aura
diff --git a/ui/aura/mus/client_surface_embedder.h b/ui/aura/mus/client_surface_embedder.h
deleted file mode 100644
index 98b491f..0000000
--- a/ui/aura/mus/client_surface_embedder.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_AURA_MUS_CLIENT_SURFACE_EMBEDDER_H_
-#define UI_AURA_MUS_CLIENT_SURFACE_EMBEDDER_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "ui/aura/aura_export.h"
-#include "ui/aura/window_observer.h"
-
-namespace ui {
-class LayerOwner;
-class Layer;
-}
-
-namespace viz {
-class SurfaceId;
-}
-
-namespace aura {
-
-class Window;
-
-// Used to display content from another client. The other client is rendering
-// to viz using the SurfaceId supplied to SetSurfaceId(). This class can't
-// outlive the window.
-class AURA_EXPORT ClientSurfaceEmbedder : public WindowObserver {
- public:
-  explicit ClientSurfaceEmbedder(Window* window);
-  ~ClientSurfaceEmbedder() override;
-
-  // Sets the current SurfaceId *and* updates the size of the layer to match
-  // that of the window.
-  void SetSurfaceId(const viz::SurfaceId& surface_id);
-
-  // Returns the SurfaceId, empty if SetSurfaceId() has not been called yet.
-  viz::SurfaceId GetSurfaceId() const;
-
-  ui::Layer* GetSurfaceLayerForTesting() const;
-
- private:
-  // aura::WindowObserver:
-  void OnWindowVisibilityChanged(Window* window, bool visible) override;
-  void OnWindowHierarchyChanged(const HierarchyChangeParams& params) override;
-
-  // The window which embeds the client.
-  Window* window_;
-
-  // Contains the client's content. This (and other Layers) are wrapped in a
-  // LayerOwner so that animations clone the layer.
-  std::unique_ptr<ui::LayerOwner> surface_layer_owner_;
-
-  DISALLOW_COPY_AND_ASSIGN(ClientSurfaceEmbedder);
-};
-
-}  // namespace aura
-
-#endif  // UI_AURA_MUS_CLIENT_SURFACE_EMBEDDER_H_
diff --git a/ui/aura/mus/property_converter.cc b/ui/aura/mus/property_converter.cc
deleted file mode 100644
index 3310687..0000000
--- a/ui/aura/mus/property_converter.cc
+++ /dev/null
@@ -1,552 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/aura/mus/property_converter.h"
-
-#include "base/bind.h"
-#include "base/time/time.h"
-#include "base/unguessable_token.h"
-#include "mojo/public/cpp/bindings/type_converter.h"
-#include "services/ws/public/cpp/property_type_converters.h"
-#include "services/ws/public/mojom/window_manager.mojom.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/base/class_property.h"
-
-namespace aura {
-
-namespace {
-
-// Get the WindowProperty's value as a byte array. Only supports aura properties
-// that point to types with a matching std::vector<uint8_t> mojo::TypeConverter.
-template <typename T>
-std::unique_ptr<std::vector<uint8_t>> GetArray(Window* window,
-                                               const WindowProperty<T>* key) {
-  const T value = window->GetProperty(key);
-  if (!value)
-    return std::make_unique<std::vector<uint8_t>>();
-  return std::make_unique<std::vector<uint8_t>>(
-      mojo::ConvertTo<std::vector<uint8_t>>(*value));
-}
-
-// A validator that always returns true regardless of its input.
-bool AlwaysTrue(int64_t value) {
-  return true;
-}
-
-bool ValidateResizeBehaviour(int64_t value) {
-  // Resize behaviour is a 3 bitfield.
-  return value >= 0 && value <= (ws::mojom::kResizeBehaviorCanMaximize |
-                                 ws::mojom::kResizeBehaviorCanMinimize |
-                                 ws::mojom::kResizeBehaviorCanResize);
-}
-
-bool ValidateShowState(int64_t value) {
-  return value == int64_t(ws::mojom::ShowState::DEFAULT) ||
-         value == int64_t(ws::mojom::ShowState::NORMAL) ||
-         value == int64_t(ws::mojom::ShowState::MINIMIZED) ||
-         value == int64_t(ws::mojom::ShowState::MAXIMIZED) ||
-         value == int64_t(ws::mojom::ShowState::INACTIVE) ||
-         value == int64_t(ws::mojom::ShowState::FULLSCREEN);
-}
-
-bool ValidateWindowCornerRadius(int64_t value) {
-  return value >= -1;
-}
-
-}  // namespace
-
-PropertyConverter::PrimitiveProperty::PrimitiveProperty() {}
-
-PropertyConverter::PrimitiveProperty::PrimitiveProperty(
-    const PrimitiveProperty& property) = default;
-
-PropertyConverter::PrimitiveProperty::~PrimitiveProperty() {}
-
-// static
-base::RepeatingCallback<bool(int64_t)>
-PropertyConverter::CreateAcceptAnyValueCallback() {
-  return base::Bind(&AlwaysTrue);
-}
-
-PropertyConverter::PropertyConverter() {
-  // Add known aura properties with associated mus properties.
-  RegisterImageSkiaProperty(client::kAvatarIconKey,
-                            ws::mojom::WindowManager::kAvatarIcon_Property);
-  RegisterPrimitiveProperty(client::kAlwaysOnTopKey,
-                            ws::mojom::WindowManager::kAlwaysOnTop_Property,
-                            CreateAcceptAnyValueCallback());
-  RegisterPrimitiveProperty(client::kDrawAttentionKey,
-                            ws::mojom::WindowManager::kDrawAttention_Property,
-                            CreateAcceptAnyValueCallback());
-  RegisterRectProperty(
-      client::kEmbeddedWindowEnsureNotInRect,
-      ws::mojom::WindowManager::kEmbeddedWindowEnsureNotInRect);
-  RegisterPrimitiveProperty(client::kResizeBehaviorKey,
-                            ws::mojom::WindowManager::kResizeBehavior_Property,
-                            base::Bind(&ValidateResizeBehaviour));
-  RegisterPrimitiveProperty(client::kShowStateKey,
-                            ws::mojom::WindowManager::kShowState_Property,
-                            base::Bind(&ValidateShowState));
-  RegisterRectProperty(client::kRestoreBoundsKey,
-                       ws::mojom::WindowManager::kRestoreBounds_Property);
-  RegisterSizeProperty(client::kPreferredSize,
-                       ws::mojom::WindowManager::kPreferredSize_Property);
-  RegisterSizeProperty(client::kMaximumSize,
-                       ws::mojom::WindowManager::kMaximumSize_Property);
-  RegisterSizeProperty(client::kMinimumSize,
-                       ws::mojom::WindowManager::kMinimumSize_Property);
-  RegisterStringProperty(client::kNameKey,
-                         ws::mojom::WindowManager::kName_Property);
-  RegisterString16Property(client::kTitleKey,
-                           ws::mojom::WindowManager::kWindowTitle_Property);
-  RegisterSizeFProperty(client::kAspectRatio,
-                        ws::mojom::WindowManager::kAspectRatio_Property);
-  RegisterPrimitiveProperty(
-      client::kWindowCornerRadiusKey,
-      ws::mojom::WindowManager::kWindowCornerRadius_Property,
-      base::BindRepeating(&ValidateWindowCornerRadius));
-  RegisterPrimitiveProperty(
-      client::kAnimationsDisabledKey,
-      ws::mojom::WindowManager::kAnimationsDisabled_Property,
-      CreateAcceptAnyValueCallback());
-  RegisterWindowPtrProperty(
-      client::kChildModalParentKey,
-      ws::mojom::WindowManager::kChildModalParent_Property);
-  RegisterPrimitiveProperty(
-      client::kWindowLayerDrawn,
-      ws::mojom::WindowManager::kWindowLayerDrawn_Property,
-      CreateAcceptAnyValueCallback());
-}
-
-PropertyConverter::~PropertyConverter() {}
-
-const void* PropertyConverter::GetPropertyKeyFromTransportName(
-    const std::string& transport_name) {
-  for (const auto& primitive_property : primitive_properties_) {
-    if (primitive_property.second.transport_name == transport_name)
-      return primitive_property.first;
-  }
-
-  for (const auto& image_property : image_properties_) {
-    if (image_property.second == transport_name)
-      return image_property.first->name;
-  }
-
-  for (const auto& rect_property : rect_properties_) {
-    if (rect_property.second == transport_name)
-      return rect_property.first->name;
-  }
-
-  for (const auto& size_property : size_properties_) {
-    if (size_property.second == transport_name)
-      return size_property.first->name;
-  }
-
-  for (const auto& size_f_property : size_f_properties_) {
-    if (size_f_property.second == transport_name)
-      return size_f_property.first->name;
-  }
-
-  for (const auto& string_property : string_properties_) {
-    if (string_property.second == transport_name)
-      return string_property.first->name;
-  }
-
-  for (const auto& string16_property : string16_properties_) {
-    if (string16_property.second == transport_name)
-      return string16_property.first->name;
-  }
-
-  for (const auto& unguessable_token_property : unguessable_token_properties_) {
-    if (unguessable_token_property.second == transport_name)
-      return unguessable_token_property.first->name;
-  }
-
-  for (const auto& window_ptr_property : window_ptr_properties_) {
-    if (window_ptr_property.second == transport_name)
-      return window_ptr_property.first->name;
-  }
-
-  return nullptr;
-}
-
-bool PropertyConverter::IsTransportNameRegistered(
-    const std::string& name) const {
-  return transport_names_.count(name) > 0;
-}
-
-bool PropertyConverter::ConvertPropertyForTransport(
-    Window* window,
-    const void* key,
-    std::string* transport_name,
-    std::unique_ptr<std::vector<uint8_t>>* transport_value) {
-  *transport_name = GetTransportNameForPropertyKey(key);
-  if (transport_name->empty())
-    return false;
-
-  auto* image_key = static_cast<const WindowProperty<gfx::ImageSkia*>*>(key);
-  if (image_properties_.count(image_key) > 0) {
-    const gfx::ImageSkia* value = window->GetProperty(image_key);
-    if (value) {
-      // TODO(crbug.com/667566): Support additional scales or gfx::Image[Skia].
-      SkBitmap bitmap = value->GetRepresentation(1.f).GetBitmap();
-      *transport_value = std::make_unique<std::vector<uint8_t>>(
-          mojo::ConvertTo<std::vector<uint8_t>>(bitmap));
-    } else {
-      *transport_value = std::make_unique<std::vector<uint8_t>>();
-    }
-    return true;
-  }
-
-  auto* rect_key = static_cast<const WindowProperty<gfx::Rect*>*>(key);
-  if (rect_properties_.count(rect_key) > 0) {
-    *transport_value = GetArray(window, rect_key);
-    return true;
-  }
-
-  auto* size_key = static_cast<const WindowProperty<gfx::Size*>*>(key);
-  if (size_properties_.count(size_key) > 0) {
-    *transport_value = GetArray(window, size_key);
-    return true;
-  }
-
-  auto* size_f_key = static_cast<const WindowProperty<gfx::SizeF*>*>(key);
-  if (size_f_properties_.count(size_f_key) > 0) {
-    *transport_value = GetArray(window, size_f_key);
-    return true;
-  }
-
-  auto* string_key = static_cast<const WindowProperty<std::string*>*>(key);
-  if (string_properties_.count(string_key) > 0) {
-    *transport_value = GetArray(window, string_key);
-    return true;
-  }
-
-  auto* string16_key = static_cast<const WindowProperty<base::string16*>*>(key);
-  if (string16_properties_.count(string16_key) > 0) {
-    *transport_value = GetArray(window, string16_key);
-    return true;
-  }
-
-  auto* unguessable_token_key =
-      static_cast<const WindowProperty<base::UnguessableToken*>*>(key);
-  if (unguessable_token_properties_.count(unguessable_token_key) > 0) {
-    *transport_value = GetArray(window, unguessable_token_key);
-    return true;
-  }
-
-  // window_ptr_properties_ aren't processed here since Window* values aren't
-  // transferrable. A post processing step in WindowTree and WindowTreeClient
-  // takes care of the conversion.
-  if (IsWindowPtrPropertyRegistered(
-          static_cast<const WindowProperty<Window*>*>(key))) {
-    return true;
-  }
-
-  // Handle primitive property types generically.
-  DCHECK_GT(primitive_properties_.count(key), 0u);
-  PrimitiveType default_value = primitive_properties_[key].default_value;
-  // TODO(msw): Using the int64_t accessor is wasteful for smaller types.
-  const PrimitiveType value = window->GetPropertyInternal(key, default_value);
-  *transport_value = std::make_unique<std::vector<uint8_t>>(
-      mojo::ConvertTo<std::vector<uint8_t>>(value));
-  return true;
-}
-
-std::string PropertyConverter::GetTransportNameForPropertyKey(const void* key) {
-  if (primitive_properties_.count(key) > 0)
-    return primitive_properties_[key].transport_name;
-
-  auto* image_key = static_cast<const WindowProperty<gfx::ImageSkia*>*>(key);
-  if (image_properties_.count(image_key) > 0)
-    return image_properties_[image_key];
-
-  auto* rect_key = static_cast<const WindowProperty<gfx::Rect*>*>(key);
-  if (rect_properties_.count(rect_key) > 0)
-    return rect_properties_[rect_key];
-
-  auto* size_key = static_cast<const WindowProperty<gfx::Size*>*>(key);
-  if (size_properties_.count(size_key) > 0)
-    return size_properties_[size_key];
-
-  auto* size_f_key = static_cast<const WindowProperty<gfx::SizeF*>*>(key);
-  if (size_f_properties_.count(size_f_key) > 0)
-    return size_f_properties_[size_f_key];
-
-  auto* string_key = static_cast<const WindowProperty<std::string*>*>(key);
-  if (string_properties_.count(string_key) > 0)
-    return string_properties_[string_key];
-
-  auto* string16_key = static_cast<const WindowProperty<base::string16*>*>(key);
-  if (string16_properties_.count(string16_key) > 0)
-    return string16_properties_[string16_key];
-
-  auto* unguessable_token_key =
-      static_cast<const WindowProperty<base::UnguessableToken*>*>(key);
-  if (unguessable_token_properties_.count(unguessable_token_key) > 0)
-    return unguessable_token_properties_[unguessable_token_key];
-
-  auto* window_ptr_key = static_cast<const WindowProperty<Window*>*>(key);
-  if (window_ptr_properties_.count(window_ptr_key) > 0)
-    return window_ptr_properties_[window_ptr_key];
-
-  return std::string();
-}
-
-void PropertyConverter::SetPropertyFromTransportValue(
-    Window* window,
-    const std::string& transport_name,
-    const std::vector<uint8_t>* data) {
-  for (const auto& primitive_property : primitive_properties_) {
-    if (primitive_property.second.transport_name == transport_name) {
-      // aura::Window only supports property types that fit in PrimitiveType.
-      if (data->size() != 8u) {
-        DVLOG(2) << "Property size mismatch (PrimitiveType): "
-                 << transport_name;
-        return;
-      }
-      const PrimitiveType value = mojo::ConvertTo<PrimitiveType>(*data);
-      if (!primitive_property.second.validator.Run(value)) {
-        DVLOG(2) << "Property value rejected (PrimitiveType): "
-                 << transport_name;
-        return;
-      }
-      // TODO(msw): Should aura::Window just store all properties by name?
-      window->SetPropertyInternal(
-          primitive_property.first, primitive_property.second.property_name,
-          nullptr, value, primitive_property.second.default_value);
-      return;
-    }
-  }
-
-  for (const auto& image_property : image_properties_) {
-    if (image_property.second == transport_name) {
-      // TODO(msw): Validate the data somehow, before trying to convert?
-      // TODO(crbug.com/667566): Support additional scales or gfx::Image[Skia].
-      const SkBitmap bitmap = mojo::ConvertTo<SkBitmap>(*data);
-      const gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
-      window->SetProperty(image_property.first, new gfx::ImageSkia(image));
-      return;
-    }
-  }
-
-  for (const auto& rect_property : rect_properties_) {
-    if (rect_property.second == transport_name) {
-      if (data->size() != 16u) {
-        DVLOG(2) << "Property size mismatch (gfx::Rect): " << transport_name;
-        return;
-      }
-      const gfx::Rect value = mojo::ConvertTo<gfx::Rect>(*data);
-      window->SetProperty(rect_property.first, new gfx::Rect(value));
-      return;
-    }
-  }
-
-  for (const auto& size_property : size_properties_) {
-    if (size_property.second == transport_name) {
-      if (data->size() != 8u) {
-        DVLOG(2) << "Property size mismatch (gfx::Size): " << transport_name;
-        return;
-      }
-      const gfx::Size value = mojo::ConvertTo<gfx::Size>(*data);
-      window->SetProperty(size_property.first, new gfx::Size(value));
-      return;
-    }
-  }
-
-  for (const auto& size_f_property : size_f_properties_) {
-    if (size_f_property.second == transport_name) {
-      if (data->size() != 8u) {
-        DVLOG(2) << "Property size mismatch (gfx::Size): " << transport_name;
-        return;
-      }
-      const gfx::SizeF value = mojo::ConvertTo<gfx::SizeF>(*data);
-      window->SetProperty(size_f_property.first, new gfx::SizeF(value));
-      return;
-    }
-  }
-
-  for (const auto& string_property : string_properties_) {
-    if (string_property.second == transport_name) {
-      // TODO(msw): Validate the data somehow, before trying to convert?
-      const std::string value = mojo::ConvertTo<std::string>(*data);
-      window->SetProperty(string_property.first, new std::string(value));
-      return;
-    }
-  }
-
-  for (const auto& string16_property : string16_properties_) {
-    if (string16_property.second == transport_name) {
-      // TODO(msw): Validate the data somehow, before trying to convert?
-      const base::string16 value = mojo::ConvertTo<base::string16>(*data);
-      window->SetProperty(string16_property.first, new base::string16(value));
-      return;
-    }
-  }
-
-  for (const auto& unguessable_token_property : unguessable_token_properties_) {
-    if (unguessable_token_property.second == transport_name) {
-      base::UnguessableToken token =
-          mojo::ConvertTo<base::UnguessableToken>(*data);
-      if (token.is_empty()) {
-        window->ClearProperty(unguessable_token_property.first);
-      } else {
-        // |window| takes ownership of the newly allocated token.
-        window->SetProperty(unguessable_token_property.first,
-                            new base::UnguessableToken(token));
-      }
-      return;
-    }
-  }
-
-  // window_ptr_properties_ aren't processed here since Window* values aren't
-  // transferrable. A post processing step in WindowTree and WindowTreeClient
-  // takes care of the conversion.
-  for (const auto& window_ptr_property : window_ptr_properties_) {
-    if (window_ptr_property.second == transport_name) {
-      LOG(ERROR) << transport_name << " is a registered window property but "
-                 << "should not be processed here.";
-      return;
-    }
-  }
-
-  // WARNING: Adding a new map, be sure and update
-  // GetPropertyKeyFromTransportName() as well.
-
-  DVLOG(2) << "Unknown mus property name: " << transport_name;
-}
-
-bool PropertyConverter::GetPropertyValueFromTransportValue(
-    const std::string& transport_name,
-    const std::vector<uint8_t>& transport_data,
-    PrimitiveType* value) {
-  // aura::Window only supports property types that fit in PrimitiveType.
-  if (transport_data.size() != 8u) {
-    DVLOG(2) << "Property size mismatch (PrimitiveType): " << transport_name;
-    return false;
-  }
-  for (const auto& primitive_property : primitive_properties_) {
-    if (primitive_property.second.transport_name == transport_name) {
-      PrimitiveType v = mojo::ConvertTo<PrimitiveType>(transport_data);
-      if (!primitive_property.second.validator.Run(v)) {
-        DVLOG(2) << "Property value rejected (PrimitiveType): "
-                 << transport_name;
-        return false;
-      }
-      *value = v;
-      return true;
-    }
-  }
-  return false;
-}
-
-void PropertyConverter::RegisterImageSkiaProperty(
-    const WindowProperty<gfx::ImageSkia*>* property,
-    const char* transport_name) {
-  DCHECK(!IsTransportNameRegistered(transport_name))
-      << "Property already registered: " << transport_name;
-  image_properties_[property] = transport_name;
-  transport_names_.insert(transport_name);
-}
-
-void PropertyConverter::RegisterRectProperty(
-    const WindowProperty<gfx::Rect*>* property,
-    const char* transport_name) {
-  DCHECK(!IsTransportNameRegistered(transport_name))
-      << "Property already registered: " << transport_name;
-  rect_properties_[property] = transport_name;
-  transport_names_.insert(transport_name);
-}
-
-void PropertyConverter::RegisterSizeProperty(
-    const WindowProperty<gfx::Size*>* property,
-    const char* transport_name) {
-  DCHECK(!IsTransportNameRegistered(transport_name))
-      << "Property already registered: " << transport_name;
-  size_properties_[property] = transport_name;
-  transport_names_.insert(transport_name);
-}
-
-void PropertyConverter::RegisterSizeFProperty(
-    const WindowProperty<gfx::SizeF*>* property,
-    const char* transport_name) {
-  DCHECK(!IsTransportNameRegistered(transport_name))
-      << "Property already registered: " << transport_name;
-  size_f_properties_[property] = transport_name;
-  transport_names_.insert(transport_name);
-}
-
-void PropertyConverter::RegisterStringProperty(
-    const WindowProperty<std::string*>* property,
-    const char* transport_name) {
-  DCHECK(!IsTransportNameRegistered(transport_name))
-      << "Property already registered: " << transport_name;
-  string_properties_[property] = transport_name;
-  transport_names_.insert(transport_name);
-}
-
-void PropertyConverter::RegisterString16Property(
-    const WindowProperty<base::string16*>* property,
-    const char* transport_name) {
-  DCHECK(!IsTransportNameRegistered(transport_name))
-      << "Property already registered: " << transport_name;
-  string16_properties_[property] = transport_name;
-  transport_names_.insert(transport_name);
-}
-
-void PropertyConverter::RegisterTimeDeltaProperty(
-    const WindowProperty<base::TimeDelta>* property,
-    const char* transport_name) {
-  // TimeDelta is internally handled (by class_property) as a primitive
-  // value (int64_t) . See ClassPropertyCaster<base::TimeDelta> for details.
-  RegisterPrimitiveProperty(property, transport_name,
-                            CreateAcceptAnyValueCallback());
-}
-
-void PropertyConverter::RegisterUnguessableTokenProperty(
-    const WindowProperty<base::UnguessableToken*>* property,
-    const char* transport_name) {
-  DCHECK(!IsTransportNameRegistered(transport_name))
-      << "Property already registered: " << transport_name;
-  unguessable_token_properties_[property] = transport_name;
-  transport_names_.insert(transport_name);
-}
-
-void PropertyConverter::RegisterWindowPtrProperty(
-    const WindowProperty<Window*>* property,
-    const char* transport_name) {
-  DCHECK(!IsTransportNameRegistered(transport_name))
-      << "Property already registered: " << transport_name;
-  window_ptr_properties_[property] = transport_name;
-  transport_names_.insert(transport_name);
-}
-
-const WindowProperty<Window*>* PropertyConverter::GetWindowPtrProperty(
-    const std::string& transport_name) const {
-  for (const auto& iter : window_ptr_properties_) {
-    if (transport_name == iter.second)
-      return iter.first;
-  }
-  return nullptr;
-}
-
-bool PropertyConverter::IsWindowPtrPropertyRegistered(
-    const WindowProperty<Window*>* property) const {
-  return window_ptr_properties_.find(property) != window_ptr_properties_.end();
-}
-
-base::flat_map<std::string, std::vector<uint8_t>>
-PropertyConverter::GetTransportProperties(Window* window) {
-  base::flat_map<std::string, std::vector<uint8_t>> properties;
-  std::string name;
-  std::unique_ptr<std::vector<uint8_t>> value;
-  for (const void* key : window->GetAllPropertyKeys()) {
-    if (ConvertPropertyForTransport(window, key, &name, &value))
-      properties[name] = value ? std::move(*value) : std::vector<uint8_t>();
-  }
-  return properties;
-}
-
-}  // namespace aura
diff --git a/ui/aura/mus/property_converter.h b/ui/aura/mus/property_converter.h
deleted file mode 100644
index 099feeaf..0000000
--- a/ui/aura/mus/property_converter.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_AURA_MUS_PROPERTY_CONVERTER_H_
-#define UI_AURA_MUS_PROPERTY_CONVERTER_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "ui/aura/aura_export.h"
-#include "ui/aura/window.h"
-
-namespace base {
-class TimeDelta;
-class UnguessableToken;
-}
-
-namespace gfx {
-class Rect;
-class Size;
-}
-
-namespace aura {
-
-// PropertyConverter is used to convert Window properties for transport to the
-// mus window server and back. Any time a property changes from one side it is
-// mapped to the other using this class. Not all Window properties need to map
-// to server properties, and similarly not all transport properties need map to
-// Window properties.
-class AURA_EXPORT PropertyConverter {
- public:
-  // All primitive values are stored using this type.
-  using PrimitiveType = int64_t;
-
-  PropertyConverter();
-  ~PropertyConverter();
-
-  // Creates a validation callback for use in RegisterProperty() which will
-  // accept any value.
-  static base::RepeatingCallback<bool(int64_t)> CreateAcceptAnyValueCallback();
-
-  // Returns the key for the window property registered against the specified
-  // transport name.
-  const void* GetPropertyKeyFromTransportName(const std::string& name);
-
-  // Returns true if RegisterProperty() has been called with the specified
-  // transport name.
-  bool IsTransportNameRegistered(const std::string& name) const;
-
-  // Maps a property on the Window to a property pushed to the server. Return
-  // true if the property should be sent to the server, false if the property
-  // is only used locally.
-  bool ConvertPropertyForTransport(
-      Window* window,
-      const void* key,
-      std::string* transport_name,
-      std::unique_ptr<std::vector<uint8_t>>* transport_value);
-
-  // Returns the transport name for a Window property.
-  std::string GetTransportNameForPropertyKey(const void* key);
-
-  // Applies a value from the server to |window|. |transport_name| is the
-  // name of the property and |transport_data| the value. |transport_data| may
-  // be null.
-  void SetPropertyFromTransportValue(
-      Window* window,
-      const std::string& transport_name,
-      const std::vector<uint8_t>* transport_data);
-
-  // Returns the value for a particular transport value. All primitives are
-  // serialized as a PrimitiveType, so this function may be used for any
-  // primitive. Returns true on success and sets |value| accordingly. A return
-  // value of false indicates the value isn't known or the property type isn't
-  // primitive.
-  bool GetPropertyValueFromTransportValue(
-      const std::string& transport_name,
-      const std::vector<uint8_t>& transport_data,
-      PrimitiveType* value);
-
-  // Register a property to support conversion between mus and aura.
-  // |validator| is a callback used to validate incoming values from
-  // transport_data; if it returns false, the value is rejected.
-  template <typename T>
-  void RegisterPrimitiveProperty(
-      const WindowProperty<T>* property,
-      const char* transport_name,
-      const base::RepeatingCallback<bool(int64_t)>& validator) {
-    DCHECK(!IsTransportNameRegistered(transport_name))
-        << "Property already registered: " << transport_name;
-    PrimitiveProperty primitive_property;
-    primitive_property.property_name = property->name;
-    primitive_property.transport_name = transport_name;
-    primitive_property.default_value =
-        ui::ClassPropertyCaster<T>::ToInt64(property->default_value);
-    primitive_property.validator = validator;
-    primitive_properties_[property] = primitive_property;
-    transport_names_.insert(transport_name);
-  }
-
-  // Register owned properties to support conversion between mus and aura.
-  void RegisterImageSkiaProperty(
-      const WindowProperty<gfx::ImageSkia*>* property,
-      const char* transport_name);
-  void RegisterRectProperty(const WindowProperty<gfx::Rect*>* property,
-                            const char* transport_name);
-  void RegisterSizeProperty(const WindowProperty<gfx::Size*>* property,
-                            const char* transport_name);
-  void RegisterSizeFProperty(const WindowProperty<gfx::SizeF*>* property,
-                             const char* transport_name);
-  void RegisterStringProperty(const WindowProperty<std::string*>* property,
-                              const char* transport_name);
-  void RegisterString16Property(const WindowProperty<base::string16*>* property,
-                                const char* transport_name);
-  void RegisterTimeDeltaProperty(
-      const WindowProperty<base::TimeDelta>* property,
-      const char* transport_name);
-  void RegisterUnguessableTokenProperty(
-      const WindowProperty<base::UnguessableToken*>* property,
-      const char* transport_name);
-  void RegisterWindowPtrProperty(const WindowProperty<Window*>* property,
-                                 const char* transport_name);
-
-  // Returns the window property key of Window* value which is registered with
-  // the transport_name. If the name is not registered or registered with a
-  // different type, returns nullptr.
-  const WindowProperty<Window*>* GetWindowPtrProperty(
-      const std::string& transport_name) const;
-
-  bool IsWindowPtrPropertyRegistered(
-      const WindowProperty<Window*>* property) const;
-
-  // Get a flat map of the window's registered properties, to use for transport.
-  base::flat_map<std::string, std::vector<uint8_t>> GetTransportProperties(
-      Window* window);
-
- private:
-  // Contains data needed to store and convert primitive-type properties.
-  struct AURA_EXPORT PrimitiveProperty {
-    PrimitiveProperty();
-    PrimitiveProperty(const PrimitiveProperty& property);
-    ~PrimitiveProperty();
-
-    // The aura::WindowProperty::name used for storage.
-    const char* property_name = nullptr;
-    // The mus property name used for transport.
-    const char* transport_name = nullptr;
-    // The aura::WindowProperty::default_value stored using PrimitiveType.
-    PrimitiveType default_value = 0;
-    // A callback used to validate incoming values.
-    base::RepeatingCallback<bool(int64_t)> validator;
-  };
-
-  // A map of aura::WindowProperty<T> to PrimitiveProperty structs.
-  // This supports the internal codepaths for primitive types, eg. T=bool.
-  std::map<const void*, PrimitiveProperty> primitive_properties_;
-
-  // Maps of aura::WindowProperty<T> to their mus property names.
-  // This supports types that can be serialized for Mojo, eg. T=std::string*.
-  std::map<const WindowProperty<gfx::ImageSkia*>*, const char*>
-      image_properties_;
-  std::map<const WindowProperty<gfx::Rect*>*, const char*> rect_properties_;
-  std::map<const WindowProperty<gfx::Size*>*, const char*> size_properties_;
-  std::map<const WindowProperty<gfx::SizeF*>*, const char*> size_f_properties_;
-  std::map<const WindowProperty<std::string*>*, const char*> string_properties_;
-  std::map<const WindowProperty<base::string16*>*, const char*>
-      string16_properties_;
-  std::map<const WindowProperty<base::UnguessableToken*>*, const char*>
-      unguessable_token_properties_;
-  std::map<const WindowProperty<Window*>*, const char*> window_ptr_properties_;
-
-  // Set of transport names supplied to RegisterProperty().
-  std::set<std::string> transport_names_;
-
-  DISALLOW_COPY_AND_ASSIGN(PropertyConverter);
-};
-
-}  // namespace aura
-
-#endif  // UI_AURA_MUS_PROPERTY_CONVERTER_H_
diff --git a/ui/aura/mus/property_converter_unittest.cc b/ui/aura/mus/property_converter_unittest.cc
deleted file mode 100644
index c4d9d17..0000000
--- a/ui/aura/mus/property_converter_unittest.cc
+++ /dev/null
@@ -1,464 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/aura/mus/property_converter.h"
-
-#include <stdint.h>
-#include <string>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "services/ws/public/cpp/property_type_converters.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/test/aura_test_base.h"
-#include "ui/aura/window.h"
-#include "ui/base/class_property.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/image/image_skia.h"
-#include "ui/gfx/skia_util.h"
-
-// See aura_constants.cc for bool, int32_t, int64_t, std::string, gfx::Rect,
-// base::string16, uint32_t (via SkColor), and gfx::ImageSkia.
-DEFINE_UI_CLASS_PROPERTY_TYPE(uint8_t)
-DEFINE_UI_CLASS_PROPERTY_TYPE(uint16_t)
-DEFINE_UI_CLASS_PROPERTY_TYPE(uint64_t)
-DEFINE_UI_CLASS_PROPERTY_TYPE(int8_t)
-DEFINE_UI_CLASS_PROPERTY_TYPE(int16_t)
-
-namespace aura {
-
-namespace {
-
-DEFINE_UI_CLASS_PROPERTY_KEY(bool, kTestPropertyKey0, false)
-DEFINE_UI_CLASS_PROPERTY_KEY(bool, kTestPropertyKey1, true)
-DEFINE_UI_CLASS_PROPERTY_KEY(uint8_t, kTestPropertyKey2, UINT8_MAX / 3)
-DEFINE_UI_CLASS_PROPERTY_KEY(uint16_t, kTestPropertyKey3, UINT16_MAX / 3)
-DEFINE_UI_CLASS_PROPERTY_KEY(uint32_t, kTestPropertyKey4, UINT32_MAX)
-DEFINE_UI_CLASS_PROPERTY_KEY(uint64_t, kTestPropertyKey5, UINT64_MAX)
-DEFINE_UI_CLASS_PROPERTY_KEY(int8_t, kTestPropertyKey6, 0)
-DEFINE_UI_CLASS_PROPERTY_KEY(int16_t, kTestPropertyKey7, 1)
-DEFINE_UI_CLASS_PROPERTY_KEY(int32_t, kTestPropertyKey8, -1)
-DEFINE_UI_CLASS_PROPERTY_KEY(int64_t, kTestPropertyKey9, 777)
-
-DEFINE_UI_CLASS_PROPERTY_KEY(base::TimeDelta,
-                             kTestTimeDeltaKey,
-                             base::TimeDelta())
-
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::ImageSkia,
-                                   kTestImageSkiaPropertyKey,
-                                   nullptr)
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Rect, kTestRectPropertyKey, nullptr)
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Size, kTestSizePropertyKey, nullptr)
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(std::string, kTestStringPropertyKey, nullptr)
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(base::string16,
-                                   kTestString16PropertyKey,
-                                   nullptr)
-
-DEFINE_UI_CLASS_PROPERTY_KEY(Window*, kTestWindowPtrPropertyKey, nullptr)
-DEFINE_UI_CLASS_PROPERTY_KEY(Window*, kTestWindowPtrUnregisteredKey, nullptr)
-
-const char kTestPropertyServerKey0[] = "test-property-server0";
-const char kTestPropertyServerKey1[] = "test-property-server1";
-const char kTestPropertyServerKey2[] = "test-property-server2";
-const char kTestPropertyServerKey3[] = "test-property-server3";
-const char kTestPropertyServerKey4[] = "test-property-server4";
-const char kTestPropertyServerKey5[] = "test-property-server5";
-const char kTestPropertyServerKey6[] = "test-property-server6";
-const char kTestPropertyServerKey7[] = "test-property-server7";
-const char kTestPropertyServerKey8[] = "test-property-server8";
-const char kTestPropertyServerKey9[] = "test-property-server9";
-
-const char kTestImageSkiaPropertyServerKey[] = "test-imageskia-property-server";
-const char kTestRectPropertyServerKey[] = "test-rect-property-server";
-const char kTestSizePropertyServerKey[] = "test-size-property-server";
-const char kTestStringPropertyServerKey[] = "test-string-property-server";
-const char kTestString16PropertyServerKey[] = "test-string16-property-server";
-const char kTestTimeDeltaPropertyServerKey[] =
-    "test-time-delta-property-server";
-const char kTestWindowPtrPropertyServerKey[] =
-    "test-window-ptr-property-server";
-
-// Test registration, naming and value conversion for primitive property types.
-template <typename T>
-void TestPrimitiveProperty(PropertyConverter* property_converter,
-                           Window* window,
-                           const WindowProperty<T>* key,
-                           const char* transport_name,
-                           T value_1,
-                           T value_2) {
-  property_converter->RegisterPrimitiveProperty(
-      key, transport_name, PropertyConverter::CreateAcceptAnyValueCallback());
-  EXPECT_EQ(transport_name,
-            property_converter->GetTransportNameForPropertyKey(key));
-  EXPECT_TRUE(property_converter->IsTransportNameRegistered(transport_name));
-
-  window->SetProperty(key, value_1);
-  EXPECT_EQ(value_1, window->GetProperty(key));
-
-  std::string transport_name_out;
-  std::unique_ptr<std::vector<uint8_t>> transport_value_out;
-  EXPECT_TRUE(property_converter->ConvertPropertyForTransport(
-      window, key, &transport_name_out, &transport_value_out));
-  EXPECT_EQ(transport_name, transport_name_out);
-  const int64_t storage_value_1 = static_cast<int64_t>(value_1);
-  std::vector<uint8_t> transport_value1 =
-      mojo::ConvertTo<std::vector<uint8_t>>(storage_value_1);
-  EXPECT_EQ(transport_value1, *transport_value_out.get());
-
-  int64_t decoded_value_1 = 0;
-  EXPECT_TRUE(property_converter->GetPropertyValueFromTransportValue(
-      transport_name, *transport_value_out, &decoded_value_1));
-  EXPECT_EQ(value_1, static_cast<T>(decoded_value_1));
-
-  const int64_t storage_value_2 = static_cast<int64_t>(value_2);
-  std::vector<uint8_t> transport_value2 =
-      mojo::ConvertTo<std::vector<uint8_t>>(storage_value_2);
-  property_converter->SetPropertyFromTransportValue(window, transport_name,
-                                                    &transport_value2);
-  EXPECT_EQ(value_2, window->GetProperty(key));
-  int64_t decoded_value_2 = 0;
-  EXPECT_TRUE(property_converter->GetPropertyValueFromTransportValue(
-      transport_name, transport_value2, &decoded_value_2));
-  EXPECT_EQ(value_2, static_cast<T>(decoded_value_2));
-}
-
-bool OnlyAllowNegativeNumbers(int64_t number) {
-  return number < 0;
-}
-
-}  // namespace
-
-using PropertyConverterTest = test::AuraTestBase;
-
-// Verifies property setting behavior for a std::string* property.
-TEST_F(PropertyConverterTest, PrimitiveProperties) {
-  PropertyConverter property_converter;
-  std::unique_ptr<Window> window(CreateNormalWindow(1, root_window(), nullptr));
-
-  EXPECT_FALSE(
-      property_converter.IsTransportNameRegistered(kTestPropertyServerKey0));
-
-  const bool value_0a = true, value_0b = false;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey0,
-                        kTestPropertyServerKey0, value_0a, value_0b);
-
-  const bool value_1a = true, value_1b = false;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey1,
-                        kTestPropertyServerKey1, value_1a, value_1b);
-
-  const uint8_t value_2a = UINT8_MAX / 2, value_2b = UINT8_MAX / 3;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey2,
-                        kTestPropertyServerKey2, value_2a, value_2b);
-
-  const uint16_t value_3a = UINT16_MAX / 3, value_3b = UINT16_MAX / 4;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey3,
-                        kTestPropertyServerKey3, value_3a, value_3b);
-
-  const uint32_t value_4a = UINT32_MAX / 4, value_4b = UINT32_MAX / 5;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey4,
-                        kTestPropertyServerKey4, value_4a, value_4b);
-
-  const uint64_t value_5a = UINT64_MAX / 5, value_5b = UINT64_MAX / 6;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey5,
-                        kTestPropertyServerKey5, value_5a, value_5b);
-
-  const int8_t value_6a = INT8_MIN / 2, value_6b = INT8_MIN / 3;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey6,
-                        kTestPropertyServerKey6, value_6a, value_6b);
-
-  const int16_t value_7a = INT16_MIN / 3, value_7b = INT16_MIN / 4;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey7,
-                        kTestPropertyServerKey7, value_7a, value_7b);
-
-  const int32_t value_8a = INT32_MIN / 4, value_8b = INT32_MIN / 5;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey8,
-                        kTestPropertyServerKey8, value_8a, value_8b);
-
-  const int64_t value_9a = INT64_MIN / 5, value_9b = INT64_MIN / 6;
-  TestPrimitiveProperty(&property_converter, window.get(), kTestPropertyKey9,
-                        kTestPropertyServerKey9, value_9a, value_9b);
-}
-
-TEST_F(PropertyConverterTest, TestPrimitiveVerifier) {
-  std::unique_ptr<Window> window(CreateNormalWindow(1, root_window(), nullptr));
-
-  PropertyConverter property_converter;
-  property_converter.RegisterPrimitiveProperty(
-      kTestPropertyKey8, kTestPropertyServerKey8,
-      base::Bind(&OnlyAllowNegativeNumbers));
-
-  // Test that we reject invalid TransportValues during
-  // GetPropertyValueFromTransportValue().
-  int64_t int_value = 5;
-  std::vector<uint8_t> transport =
-      mojo::ConvertTo<std::vector<uint8_t>>(int_value);
-  EXPECT_FALSE(property_converter.GetPropertyValueFromTransportValue(
-      kTestPropertyServerKey8, transport, &int_value));
-
-  // Test that we reject invalid TransportValues during
-  // SetPropertyFromTransportValue().
-  EXPECT_EQ(-1, window->GetProperty(kTestPropertyKey8));
-  property_converter.SetPropertyFromTransportValue(
-      window.get(), kTestPropertyServerKey8, &transport);
-  EXPECT_EQ(-1, window->GetProperty(kTestPropertyKey8));
-}
-
-// Verifies property setting behavior for a gfx::ImageSkia* property.
-TEST_F(PropertyConverterTest, ImageSkiaProperty) {
-  PropertyConverter property_converter;
-  property_converter.RegisterImageSkiaProperty(kTestImageSkiaPropertyKey,
-                                               kTestImageSkiaPropertyServerKey);
-  EXPECT_EQ(kTestImageSkiaPropertyServerKey,
-            property_converter.GetTransportNameForPropertyKey(
-                kTestImageSkiaPropertyKey));
-  EXPECT_TRUE(property_converter.IsTransportNameRegistered(
-      kTestImageSkiaPropertyServerKey));
-
-  SkBitmap bitmap_1;
-  bitmap_1.allocN32Pixels(16, 32);
-  bitmap_1.eraseARGB(255, 11, 22, 33);
-  gfx::ImageSkia value_1 = gfx::ImageSkia::CreateFrom1xBitmap(bitmap_1);
-  std::unique_ptr<Window> window(CreateNormalWindow(1, root_window(), nullptr));
-  window->SetProperty(kTestImageSkiaPropertyKey, new gfx::ImageSkia(value_1));
-  gfx::ImageSkia* image_out_1 = window->GetProperty(kTestImageSkiaPropertyKey);
-  EXPECT_TRUE(gfx::BitmapsAreEqual(bitmap_1, *image_out_1->bitmap()));
-
-  std::string transport_name_out;
-  std::unique_ptr<std::vector<uint8_t>> transport_value_out;
-  EXPECT_TRUE(property_converter.ConvertPropertyForTransport(
-      window.get(), kTestImageSkiaPropertyKey, &transport_name_out,
-      &transport_value_out));
-  EXPECT_EQ(kTestImageSkiaPropertyServerKey, transport_name_out);
-  EXPECT_EQ(mojo::ConvertTo<std::vector<uint8_t>>(bitmap_1),
-            *transport_value_out.get());
-
-  SkBitmap bitmap_2;
-  bitmap_2.allocN32Pixels(16, 16);
-  bitmap_2.eraseARGB(255, 33, 22, 11);
-  EXPECT_FALSE(gfx::BitmapsAreEqual(bitmap_1, bitmap_2));
-  gfx::ImageSkia value_2 = gfx::ImageSkia::CreateFrom1xBitmap(bitmap_2);
-  std::vector<uint8_t> transport_value =
-      mojo::ConvertTo<std::vector<uint8_t>>(bitmap_2);
-  property_converter.SetPropertyFromTransportValue(
-      window.get(), kTestImageSkiaPropertyServerKey, &transport_value);
-  gfx::ImageSkia* image_out_2 = window->GetProperty(kTestImageSkiaPropertyKey);
-  EXPECT_TRUE(gfx::BitmapsAreEqual(bitmap_2, *image_out_2->bitmap()));
-}
-
-// Verifies property setting behavior for a gfx::Rect* property.
-TEST_F(PropertyConverterTest, RectProperty) {
-  PropertyConverter property_converter;
-  property_converter.RegisterRectProperty(kTestRectPropertyKey,
-                                          kTestRectPropertyServerKey);
-  EXPECT_EQ(
-      kTestRectPropertyServerKey,
-      property_converter.GetTransportNameForPropertyKey(kTestRectPropertyKey));
-  EXPECT_TRUE(
-      property_converter.IsTransportNameRegistered(kTestRectPropertyServerKey));
-
-  gfx::Rect value_1(1, 2, 3, 4);
-  std::unique_ptr<Window> window(CreateNormalWindow(1, root_window(), nullptr));
-  window->SetProperty(kTestRectPropertyKey, new gfx::Rect(value_1));
-  EXPECT_EQ(value_1, *window->GetProperty(kTestRectPropertyKey));
-
-  std::string transport_name_out;
-  std::unique_ptr<std::vector<uint8_t>> transport_value_out;
-  EXPECT_TRUE(property_converter.ConvertPropertyForTransport(
-      window.get(), kTestRectPropertyKey, &transport_name_out,
-      &transport_value_out));
-  EXPECT_EQ(kTestRectPropertyServerKey, transport_name_out);
-  EXPECT_EQ(mojo::ConvertTo<std::vector<uint8_t>>(value_1),
-            *transport_value_out.get());
-
-  gfx::Rect value_2(1, 3, 5, 7);
-  std::vector<uint8_t> transport_value =
-      mojo::ConvertTo<std::vector<uint8_t>>(value_2);
-  property_converter.SetPropertyFromTransportValue(
-      window.get(), kTestRectPropertyServerKey, &transport_value);
-  EXPECT_EQ(value_2, *window->GetProperty(kTestRectPropertyKey));
-}
-
-// Verifies property setting behavior for a gfx::Size* property.
-TEST_F(PropertyConverterTest, SizeProperty) {
-  PropertyConverter property_converter;
-  property_converter.RegisterSizeProperty(kTestSizePropertyKey,
-                                          kTestSizePropertyServerKey);
-  EXPECT_EQ(
-      kTestSizePropertyServerKey,
-      property_converter.GetTransportNameForPropertyKey(kTestSizePropertyKey));
-  EXPECT_TRUE(
-      property_converter.IsTransportNameRegistered(kTestSizePropertyServerKey));
-
-  gfx::Size value_1(1, 2);
-  std::unique_ptr<Window> window(CreateNormalWindow(1, root_window(), nullptr));
-  window->SetProperty(kTestSizePropertyKey, new gfx::Size(value_1));
-  EXPECT_EQ(value_1, *window->GetProperty(kTestSizePropertyKey));
-
-  std::string transport_name_out;
-  std::unique_ptr<std::vector<uint8_t>> transport_value_out;
-  EXPECT_TRUE(property_converter.ConvertPropertyForTransport(
-      window.get(), kTestSizePropertyKey, &transport_name_out,
-      &transport_value_out));
-  EXPECT_EQ(kTestSizePropertyServerKey, transport_name_out);
-  EXPECT_EQ(mojo::ConvertTo<std::vector<uint8_t>>(value_1),
-            *transport_value_out.get());
-
-  gfx::Size value_2(1, 3);
-  std::vector<uint8_t> transport_value =
-      mojo::ConvertTo<std::vector<uint8_t>>(value_2);
-  property_converter.SetPropertyFromTransportValue(
-      window.get(), kTestSizePropertyServerKey, &transport_value);
-  EXPECT_EQ(value_2, *window->GetProperty(kTestSizePropertyKey));
-}
-
-// Verifies property setting behavior for a std::string* property.
-TEST_F(PropertyConverterTest, StringProperty) {
-  PropertyConverter property_converter;
-  property_converter.RegisterStringProperty(kTestStringPropertyKey,
-                                            kTestStringPropertyServerKey);
-  EXPECT_EQ(kTestStringPropertyServerKey,
-            property_converter.GetTransportNameForPropertyKey(
-                kTestStringPropertyKey));
-  EXPECT_TRUE(property_converter.IsTransportNameRegistered(
-      kTestStringPropertyServerKey));
-
-  std::string value_1 = "test value";
-  std::unique_ptr<Window> window(CreateNormalWindow(1, root_window(), nullptr));
-  window->SetProperty(kTestStringPropertyKey, new std::string(value_1));
-  EXPECT_EQ(value_1, *window->GetProperty(kTestStringPropertyKey));
-
-  std::string transport_name_out;
-  std::unique_ptr<std::vector<uint8_t>> transport_value_out;
-  EXPECT_TRUE(property_converter.ConvertPropertyForTransport(
-      window.get(), kTestStringPropertyKey, &transport_name_out,
-      &transport_value_out));
-  EXPECT_EQ(kTestStringPropertyServerKey, transport_name_out);
-  EXPECT_EQ(mojo::ConvertTo<std::vector<uint8_t>>(value_1),
-            *transport_value_out.get());
-
-  std::string value_2 = "another test value";
-  std::vector<uint8_t> transport_value =
-      mojo::ConvertTo<std::vector<uint8_t>>(value_2);
-  property_converter.SetPropertyFromTransportValue(
-      window.get(), kTestStringPropertyServerKey, &transport_value);
-  EXPECT_EQ(value_2, *window->GetProperty(kTestStringPropertyKey));
-}
-
-// Verifies property setting behavior for a base::string16* property.
-TEST_F(PropertyConverterTest, String16Property) {
-  PropertyConverter property_converter;
-  property_converter.RegisterString16Property(kTestString16PropertyKey,
-                                              kTestString16PropertyServerKey);
-  EXPECT_EQ(kTestString16PropertyServerKey,
-            property_converter.GetTransportNameForPropertyKey(
-                kTestString16PropertyKey));
-  EXPECT_TRUE(property_converter.IsTransportNameRegistered(
-      kTestString16PropertyServerKey));
-
-  base::string16 value_1 = base::ASCIIToUTF16("test value");
-  std::unique_ptr<Window> window(CreateNormalWindow(1, root_window(), nullptr));
-  window->SetProperty(kTestString16PropertyKey, new base::string16(value_1));
-  EXPECT_EQ(value_1, *window->GetProperty(kTestString16PropertyKey));
-
-  std::string transport_name_out;
-  std::unique_ptr<std::vector<uint8_t>> transport_value_out;
-  EXPECT_TRUE(property_converter.ConvertPropertyForTransport(
-      window.get(), kTestString16PropertyKey, &transport_name_out,
-      &transport_value_out));
-  EXPECT_EQ(kTestString16PropertyServerKey, transport_name_out);
-  EXPECT_EQ(mojo::ConvertTo<std::vector<uint8_t>>(value_1),
-            *transport_value_out.get());
-
-  base::string16 value_2 = base::ASCIIToUTF16("another test value");
-  std::vector<uint8_t> transport_value =
-      mojo::ConvertTo<std::vector<uint8_t>>(value_2);
-  property_converter.SetPropertyFromTransportValue(
-      window.get(), kTestString16PropertyServerKey, &transport_value);
-  EXPECT_EQ(value_2, *window->GetProperty(kTestString16PropertyKey));
-}
-
-TEST_F(PropertyConverterTest, TimeDeltaProperty) {
-  PropertyConverter property_converter;
-  property_converter.RegisterTimeDeltaProperty(kTestTimeDeltaKey,
-                                               kTestTimeDeltaPropertyServerKey);
-  EXPECT_EQ(
-      kTestTimeDeltaPropertyServerKey,
-      property_converter.GetTransportNameForPropertyKey(kTestTimeDeltaKey));
-  EXPECT_TRUE(property_converter.IsTransportNameRegistered(
-      kTestTimeDeltaPropertyServerKey));
-
-  std::unique_ptr<Window> window(CreateNormalWindow(1, root_window(), nullptr));
-  const base::TimeDelta time_delta =
-      base::TimeDelta::FromMilliseconds(123456789);
-  window->SetProperty(kTestTimeDeltaKey, time_delta);
-
-  std::string transport_name_out;
-  std::unique_ptr<std::vector<uint8_t>> transport_value_out;
-  EXPECT_TRUE(property_converter.ConvertPropertyForTransport(
-      window.get(), kTestTimeDeltaKey, &transport_name_out,
-      &transport_value_out));
-  EXPECT_EQ(kTestTimeDeltaPropertyServerKey, transport_name_out);
-  const int64_t storage_value_1 = time_delta.InMicroseconds();
-  std::vector<uint8_t> transport_value =
-      mojo::ConvertTo<std::vector<uint8_t>>(storage_value_1);
-  EXPECT_EQ(transport_value, *transport_value_out.get());
-
-  int64_t decoded_value_1 = 0;
-  EXPECT_TRUE(property_converter.GetPropertyValueFromTransportValue(
-      kTestTimeDeltaPropertyServerKey, *transport_value_out, &decoded_value_1));
-  EXPECT_EQ(time_delta.InMicroseconds(), decoded_value_1);
-
-  window->SetProperty(kTestTimeDeltaKey, base::TimeDelta());
-  property_converter.SetPropertyFromTransportValue(
-      window.get(), kTestTimeDeltaPropertyServerKey, &transport_value);
-  EXPECT_EQ(time_delta, window->GetProperty(kTestTimeDeltaKey));
-}
-
-TEST_F(PropertyConverterTest, WindowPtrProperty) {
-  PropertyConverter property_converter;
-  property_converter.RegisterString16Property(kTestString16PropertyKey,
-                                              kTestString16PropertyServerKey);
-  property_converter.RegisterWindowPtrProperty(kTestWindowPtrPropertyKey,
-                                               kTestWindowPtrPropertyServerKey);
-  EXPECT_EQ(kTestWindowPtrPropertyServerKey,
-            property_converter.GetTransportNameForPropertyKey(
-                kTestWindowPtrPropertyKey));
-  EXPECT_TRUE(property_converter.IsTransportNameRegistered(
-      kTestWindowPtrPropertyServerKey));
-
-  EXPECT_TRUE(property_converter.IsWindowPtrPropertyRegistered(
-      kTestWindowPtrPropertyKey));
-  EXPECT_EQ(kTestWindowPtrPropertyKey, property_converter.GetWindowPtrProperty(
-                                           kTestWindowPtrPropertyServerKey));
-  EXPECT_FALSE(property_converter.IsWindowPtrPropertyRegistered(
-      kTestWindowPtrUnregisteredKey));
-  EXPECT_FALSE(
-      property_converter.GetWindowPtrProperty(kTestString16PropertyServerKey));
-
-  std::unique_ptr<Window> window1(
-      CreateNormalWindow(1, root_window(), nullptr));
-  std::unique_ptr<Window> window2(
-      CreateNormalWindow(2, root_window(), nullptr));
-  window1->SetProperty(kTestWindowPtrPropertyKey, window2.get());
-
-  std::string transport_name_out;
-  std::unique_ptr<std::vector<uint8_t>> transport_value_out;
-  EXPECT_TRUE(property_converter.ConvertPropertyForTransport(
-      window1.get(), kTestWindowPtrPropertyKey, &transport_name_out,
-      &transport_value_out));
-  EXPECT_EQ(kTestWindowPtrPropertyServerKey, transport_name_out);
-  EXPECT_FALSE(transport_value_out);
-
-  window1->ClearProperty(kTestWindowPtrPropertyKey);
-  std::vector<uint8_t> transport_value = mojo::ConvertTo<std::vector<uint8_t>>(
-      reinterpret_cast<uint64_t>(window2.get()));
-  property_converter.SetPropertyFromTransportValue(
-      window1.get(), kTestWindowPtrPropertyServerKey, &transport_value);
-  EXPECT_FALSE(window1->GetProperty(kTestWindowPtrPropertyKey));
-}
-
-}  // namespace aura
diff --git a/ui/aura/mus/property_utils.cc b/ui/aura/mus/property_utils.cc
deleted file mode 100644
index 7f00f7f..0000000
--- a/ui/aura/mus/property_utils.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/aura/mus/property_utils.h"
-
-#include "base/logging.h"
-#include "services/ws/public/cpp/property_type_converters.h"
-#include "services/ws/public/mojom/window_manager.mojom.h"
-#include "services/ws/public/mojom/window_tree_constants.mojom.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/client/window_types.h"
-
-namespace aura {
-namespace {
-
-client::WindowType UiWindowTypeToWindowType(ws::mojom::WindowType type) {
-  switch (type) {
-    case ws::mojom::WindowType::WINDOW:
-      return client::WINDOW_TYPE_NORMAL;
-    case ws::mojom::WindowType::CONTROL:
-      return client::WINDOW_TYPE_CONTROL;
-    case ws::mojom::WindowType::WINDOW_FRAMELESS:
-    case ws::mojom::WindowType::POPUP:
-    case ws::mojom::WindowType::BUBBLE:
-    case ws::mojom::WindowType::DRAG:
-      return client::WINDOW_TYPE_POPUP;
-    case ws::mojom::WindowType::MENU:
-      return client::WINDOW_TYPE_MENU;
-    case ws::mojom::WindowType::TOOLTIP:
-      return client::WINDOW_TYPE_TOOLTIP;
-    case ws::mojom::WindowType::UNKNOWN:
-      return client::WINDOW_TYPE_UNKNOWN;
-  }
-  NOTREACHED();
-  return client::WINDOW_TYPE_UNKNOWN;
-}
-
-}  // namespace
-
-void SetWindowType(Window* window, ws::mojom::WindowType window_type) {
-  if (window_type == ws::mojom::WindowType::UNKNOWN)
-    return;
-  window->SetProperty(client::kWindowTypeKey, window_type);
-  window->SetType(UiWindowTypeToWindowType(window_type));
-}
-
-ws::mojom::WindowType GetWindowTypeFromProperties(
-    const std::map<std::string, std::vector<uint8_t>>& properties) {
-  auto iter =
-      properties.find(ws::mojom::WindowManager::kWindowType_InitProperty);
-  if (iter == properties.end())
-    return ws::mojom::WindowType::UNKNOWN;
-  return static_cast<ws::mojom::WindowType>(
-      mojo::ConvertTo<int32_t>(iter->second));
-}
-
-ws::mojom::OcclusionState WindowOcclusionStateToMojom(
-    Window::OcclusionState input) {
-  switch (input) {
-    case Window::OcclusionState::UNKNOWN:
-      return ws::mojom::OcclusionState::kUnknown;
-    case Window::OcclusionState::VISIBLE:
-      return ws::mojom::OcclusionState::kVisible;
-    case Window::OcclusionState::OCCLUDED:
-      return ws::mojom::OcclusionState::kOccluded;
-    case Window::OcclusionState::HIDDEN:
-      return ws::mojom::OcclusionState::kHidden;
-  }
-  NOTREACHED();
-  return ws::mojom::OcclusionState::kUnknown;
-}
-
-Window::OcclusionState WindowOcclusionStateFromMojom(
-    ws::mojom::OcclusionState input) {
-  switch (input) {
-    case ws::mojom::OcclusionState::kUnknown:
-      return Window::OcclusionState::UNKNOWN;
-    case ws::mojom::OcclusionState::kVisible:
-      return aura::Window::OcclusionState::VISIBLE;
-    case ws::mojom::OcclusionState::kOccluded:
-      return Window::OcclusionState::OCCLUDED;
-    case ws::mojom::OcclusionState::kHidden:
-      return Window::OcclusionState::HIDDEN;
-  }
-  NOTREACHED();
-  return Window::OcclusionState::UNKNOWN;
-}
-
-}  // namespace aura
diff --git a/ui/aura/mus/property_utils.h b/ui/aura/mus/property_utils.h
deleted file mode 100644
index 0416f18..0000000
--- a/ui/aura/mus/property_utils.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_AURA_MUS_PROPERTY_UTILS_H_
-#define UI_AURA_MUS_PROPERTY_UTILS_H_
-
-#include <stdint.h>
-#include <map>
-#include <string>
-#include <vector>
-
-#include "ui/aura/aura_export.h"
-#include "ui/aura/window.h"
-
-namespace ws {
-namespace mojom {
-enum class OcclusionState;
-enum class WindowType;
-}
-}
-
-namespace aura {
-
-// Configures the two window type properties on |window|. Specifically this
-// sets the property client::kWindowTypeKey as well as calling SetType().
-// This *must* be called before Init(). No-op for WindowType::UNKNOWN.
-AURA_EXPORT void SetWindowType(Window* window,
-                               ws::mojom::WindowType window_type);
-
-// Returns the window type specified in |properties|, or WindowType::UNKNOWN.
-AURA_EXPORT ws::mojom::WindowType GetWindowTypeFromProperties(
-    const std::map<std::string, std::vector<uint8_t>>& properties);
-
-// Helpers to map Window::OcclusionState to/from its ws::mojom equivalent.
-AURA_EXPORT ws::mojom::OcclusionState WindowOcclusionStateToMojom(
-    Window::OcclusionState input);
-AURA_EXPORT Window::OcclusionState WindowOcclusionStateFromMojom(
-    ws::mojom::OcclusionState input);
-
-}  // namespace aura
-
-#endif  // UI_AURA_MUS_PROPERTY_UTILS_H_
diff --git a/ui/base/ime/init/input_method_factory.cc b/ui/base/ime/init/input_method_factory.cc
index b79ccae..43dfbeb 100644
--- a/ui/base/ime/init/input_method_factory.cc
+++ b/ui/base/ime/init/input_method_factory.cc
@@ -6,6 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
+#include "base/win/windows_version.h"
 #include "build/build_config.h"
 #include "ui/base/ime/mock_input_method.h"
 #include "ui/base/ui_base_features.h"
@@ -59,8 +60,10 @@
 #if defined(OS_CHROMEOS)
   return std::make_unique<InputMethodChromeOS>(delegate);
 #elif defined(OS_WIN)
-  if (base::FeatureList::IsEnabled(features::kTSFImeSupport))
+  if (base::FeatureList::IsEnabled(features::kTSFImeSupport) &&
+      base::win::GetVersion() > base::win::Version::WIN7) {
     return std::make_unique<InputMethodWinTSF>(delegate, widget);
+  }
   return std::make_unique<InputMethodWinImm32>(delegate, widget);
 #elif defined(OS_MACOSX)
   return std::make_unique<InputMethodMac>(delegate);
diff --git a/ui/chromeos/BUILD.gn b/ui/chromeos/BUILD.gn
index 63b3139..3d7f749 100644
--- a/ui/chromeos/BUILD.gn
+++ b/ui/chromeos/BUILD.gn
@@ -37,7 +37,6 @@
     "//mojo/public/cpp/bindings",
     "//services/device/public/mojom",
     "//services/service_manager/public/cpp",
-    "//services/ws/public/cpp",
     "//services/ws/public/mojom",
     "//skia",
     "//ui/aura",
diff --git a/ui/chromeos/DEPS b/ui/chromeos/DEPS
index 31ddc40..b2859c8c 100644
--- a/ui/chromeos/DEPS
+++ b/ui/chromeos/DEPS
@@ -7,7 +7,6 @@
   "+mojo/public/cpp/bindings",
   "+services/device/public",
   "+services/service_manager/public",
-  "+services/ws/public/cpp",
   "+services/ws/public/mojom",
   "+third_party/cros_system_api",
   "+third_party/skia",
diff --git a/ui/chromeos/events/event_rewriter_chromeos.cc b/ui/chromeos/events/event_rewriter_chromeos.cc
index 7722e2b..edb0490 100644
--- a/ui/chromeos/events/event_rewriter_chromeos.cc
+++ b/ui/chromeos/events/event_rewriter_chromeos.cc
@@ -1496,11 +1496,6 @@
       {{ui::EF_NONE, ui::VKEY_ZOOM},
        {ui::EF_NONE, ui::DomCode::ZOOM_TOGGLE, ui::DomKey::ZOOM_TOGGLE,
         ui::VKEY_MEDIA_LAUNCH_APP2}},
-      // Next keyboard layout IME is through space + control + shift
-      {{ui::EF_NONE, ui::VKEY_MODECHANGE},
-       {ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
-        ui::DomCode::KEYBOARD_LAYOUT_SELECT, ui::DomKey::MODE_CHANGE,
-        ui::VKEY_SPACE}},
   };
 
   // Some key codes have a Dom code but no VKEY value assigned. They're mapped
diff --git a/ui/chromeos/file_manager_strings.grdp b/ui/chromeos/file_manager_strings.grdp
index 73875eb..08015149 100644
--- a/ui/chromeos/file_manager_strings.grdp
+++ b/ui/chromeos/file_manager_strings.grdp
@@ -83,7 +83,7 @@
   <message name="IDS_FILE_BROWSER_MEDIA_VIEW_AUDIO_ROOT_LABEL" desc="A label for the 'Audio' root of media views.">
     Audio
   </message>
-  <message name="IDS_FILE_BROWSER_PLUGIN_VM_DIRECTORY_LABEL" desc="PluginVm local directory label.">
+  <message name="IDS_FILE_BROWSER_PLUGIN_VM_DIRECTORY_LABEL" translateable="false" desc="PluginVm local directory label.">
     Plugin VM
   </message>
   <message name="IDS_FILE_BROWSER_RECENT_ROOT_LABEL" desc="A label for the 'Recent' root which shows files recently modified by the user.">
@@ -101,6 +101,12 @@
   <message name="IDS_FILE_BROWSER_SIZE_COLUMN_LABEL" desc="Size column label.">
     Size
   </message>
+  <message name="IDS_FILE_BROWSER_COLUMN_ASC_SORT_MESSAGE" desc="Message read by Chromevox/screenreader when focusing file list table column, when clicking will sort in ascending order.">
+    Click to sort the column in ascending order.
+  </message>
+  <message name="IDS_FILE_BROWSER_COLUMN_DESC_SORT_MESSAGE" desc="Message read by Chromevox/screenreader when focusing file list table column, when clicking will sort in descending order.">
+    Click to sort the column in descending order.
+  </message>
 
   <message name="IDS_FILE_BROWSER_SIZE_BYTES" desc="Size in bytes.">
     <ph name="NUMBER_OF_BYTES">$1<ex>42</ex></ph> bytes
@@ -555,10 +561,10 @@
   <message name="IDS_FILE_BROWSER_MANAGE_LINUX_SHARING_BUTTON_LABEL" desc="Label for menu that will take users to the settings page where they can manage which files and folders are shared with the crostini Linux container.">
     Manage Linux sharing
   </message>
-  <message name="IDS_FILE_BROWSER_SHARE_WITH_PLUGIN_VM_BUTTON_LABEL" desc="Label for menu that will share a folder with the Plugin VM.">
+  <message name="IDS_FILE_BROWSER_SHARE_WITH_PLUGIN_VM_BUTTON_LABEL" translateable="false" desc="Label for menu that will share a folder with the Plugin VM.">
     Share with Plugin VM
   </message>
-  <message name="IDS_FILE_BROWSER_MANAGE_PLUGIN_VM_SHARING_BUTTON_LABEL" desc="Label for menu that will take users to the settings page where they can manage which files and folders are shared with the Plugin VM.">
+  <message name="IDS_FILE_BROWSER_MANAGE_PLUGIN_VM_SHARING_BUTTON_LABEL" translateable="false" desc="Label for menu that will take users to the settings page where they can manage which files and folders are shared with the Plugin VM.">
     Manage Plugin VM sharing
   </message>
   <message name="IDS_FILE_BROWSER_TOGGLE_HIDDEN_FILES_COMMAND_LABEL" desc="Label for menu or button with checkmark that toggles visibility of hidden files.">
@@ -1081,10 +1087,10 @@
   <message name="IDS_FILE_BROWSER_UNABLE_TO_OPEN_CROSTINI" desc="Message shown when a user tries to use a crostini app to open a file which cannot be shared with the crostini container (e.g. in Play or USB).  This message will be removed once we support this action.">
     To open files with <ph name="APP_NAME">$1<ex>Visual Studio Code</ex></ph>, first copy to Linux files folder.
   </message>
-  <message name="IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_CROSTINI_TITLE" desc="Message title shown when a user shares the root of a volume such as Downloads with the crostini container.">
+  <message name="IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_CROSTINI_TITLE" desc="Message title shown when a user shares the root of a volume such as 'My files' with the crostini container.">
     Share folder with Linux
   </message>
-  <message name="IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_CROSTINI" desc="Confirmation message shown when a user shares the root of a volume such as Downloads with the crostini container.">
+  <message name="IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_CROSTINI" desc="Confirmation message shown when a user shares the root of a volume such as 'My files' with the crostini container.">
     Give Linux apps permission to modify files in the <ph name="FOLDER_NAME">$1<ex>Downloads</ex></ph> folder
   </message>
   <message name="IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_CROSTINI_DRIVE" desc="Confirmation message shown when a user shares the root of a Drive volume (My Drive, Team Drives, Computers) with the crostini container.">
@@ -1096,10 +1102,19 @@
   <message name="IDS_FILE_BROWSER_FOLDER_SHARED_WITH_CROSTINI_PLURAL" desc="Confirmation message shown when a user shares more than 1 folder with the crostini container.">
     <ph name="NUMBER_OF_ITEMS">$1<ex>3</ex></ph> folders shared with Linux
   </message>
-  <message name="IDS_FILE_BROWSER_FOLDER_SHARED_WITH_PLUGIN_VM" desc="Confirmation message shown when a user shares a folder with the Plugin VM.">
+  <message name="IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_TITLE" translateable="false" desc="Message title shown when a user shares the root of a volume such as 'My files' with the Plugin VM.">
+    Share folder with PluginVm
+  </message>
+  <message name="IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM" translateable="false" desc="Confirmation message shown when a user shares the root of a volume such as 'My files' with the Plugin VM." >
+    Give Plugin VM permission to modify files in the <ph name="FOLDER_NAME">$1<ex>Downloads</ex></ph> folder
+  </message>
+  <message name="IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_DRIVE" translateable="false" desc="Confirmation message shown when a user shares the root of a Drive volume (My Drive, Team Drives, Computers) with the Plugin VM.">
+    Give Plugin VM permission to modify files in your Google Drive. Changes will sync to your other devices.
+  </message>
+  <message name="IDS_FILE_BROWSER_FOLDER_SHARED_WITH_PLUGIN_VM" translateable="false" desc="Confirmation message shown when a user shares a folder with the Plugin VM.">
     1 folder shared with Plugin VM
   </message>
-  <message name="IDS_FILE_BROWSER_FOLDER_SHARED_WITH_PLUGIN_VM_PLURAL" desc="Confirmation message shown when a user shares more than 1 folder with the Plugin VM.">
+  <message name="IDS_FILE_BROWSER_FOLDER_SHARED_WITH_PLUGIN_VM_PLURAL" translateable="false" desc="Confirmation message shown when a user shares more than 1 folder with the Plugin VM.">
     <ph name="NUMBER_OF_ITEMS">$1<ex>3</ex></ph> folders shared with Plugin VM
   </message>
 
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_COLUMN_ASC_SORT_MESSAGE.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_COLUMN_ASC_SORT_MESSAGE.png.sha1
new file mode 100644
index 0000000..bcac07c
--- /dev/null
+++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_COLUMN_ASC_SORT_MESSAGE.png.sha1
@@ -0,0 +1 @@
+edae0f9cd79831643500fc679d3b0bc33c8b2ccf
\ No newline at end of file
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_COLUMN_DESC_SORT_MESSAGE.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_COLUMN_DESC_SORT_MESSAGE.png.sha1
new file mode 100644
index 0000000..7454c64
--- /dev/null
+++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_COLUMN_DESC_SORT_MESSAGE.png.sha1
@@ -0,0 +1 @@
+1b4858c8acac7c2fcdf4e61e5a2779edfeb97c1c
\ No newline at end of file
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM.png.sha1
new file mode 100644
index 0000000..cedfa08
--- /dev/null
+++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM.png.sha1
@@ -0,0 +1 @@
+ebf82d9232981d2e3244a3397fc8cb91654b0fc1
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_DRIVE.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_DRIVE.png.sha1
new file mode 100644
index 0000000..865fe7c
--- /dev/null
+++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_DRIVE.png.sha1
@@ -0,0 +1 @@
+1809502a0f4893f38b7a483fec6e91e1838326ac
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_TITLE.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_TITLE.png.sha1
new file mode 100644
index 0000000..cedfa08
--- /dev/null
+++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_TITLE.png.sha1
@@ -0,0 +1 @@
+ebf82d9232981d2e3244a3397fc8cb91654b0fc1
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
index 886ce68..04e83ddcc 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">ይህን ፋይል ለመድረስ መስመር ላይ መሆን አለብዎት።</translation>
 <translation id="4212740939091998969">«<ph name="FOLDER_NAME" />» የሚባል አቃፊ አስቀድሞ አለ። እባክዎ የተለየ ስም ይምረጡ።</translation>
 <translation id="4215448920900139318">የ<ph name="FILE_COUNT" />ን ምትኬ በማስቀመጥ ላይ</translation>
+<translation id="4242533952199664413">ቅንብሮችን ክፈት</translation>
 <translation id="426015154560005552">የአረብኛ ቁልፍ ሰሌዳ</translation>
 <translation id="4261901459838235729">Google ማቅረቢያ</translation>
 <translation id="4290535918735525311">1 አቃፊ ከLinux ጋር ተጋርቷል</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
index 605f0e61..0c26537 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">يجب أن تكون متصلاً بالإنترنت للدخول إلى هذا الملف.</translation>
 <translation id="4212740939091998969">المجلَّد الذي يحمل الاسم "<ph name="FOLDER_NAME" />" موجود مسبقًا. يُرجى اختيار اسم آخر.</translation>
 <translation id="4215448920900139318">جارٍ الاحتفاظ بنسخة احتياطية من <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">فتح الإعدادات</translation>
 <translation id="426015154560005552">لوحة مفاتيح اللغة العربية</translation>
 <translation id="4261901459838235729">‏عرض تقديمي من Google</translation>
 <translation id="4290535918735525311">‏تمت مشاركة مجلد واحد مع نظام التشغيل Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
index 0cd27d00..dbc7f4d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Трябва да сте онлайн, за да осъществите достъп до този файл.</translation>
 <translation id="4212740939091998969">Папката „<ph name="FOLDER_NAME" />“ вече съществува. Моля, изберете друго име.</translation>
 <translation id="4215448920900139318">Създаваме резервно копие на <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Отваряне на настройките</translation>
 <translation id="426015154560005552">Арабска клавиатура</translation>
 <translation id="4261901459838235729">Презентация в Google</translation>
 <translation id="4290535918735525311">1 папка е споделена с Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
index 8e7cc5e..4e382dc 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">আপনার এই ফাইলটিতে অ্যাক্সেস পেতে অনলাইন হওয়া আবশ্যক৷</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" নামের ফোল্ডার আগে থেকেই আছে। অন্য একটি নাম লিখুন।</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" />টির ব্যাক আপ নেওয়া হচ্ছে</translation>
+<translation id="4242533952199664413">সেটিংস খুলুন</translation>
 <translation id="426015154560005552">আরবি কীবোর্ড</translation>
 <translation id="4261901459838235729">Google উপস্থাপনা</translation>
 <translation id="4290535918735525311">Linux ব্যবহার করে ১টি ফোল্ডার শেয়ার করা হয়েছে</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
index ad114a8..5c76435 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Heu d'estar en línia per accedir a aquest fitxer.</translation>
 <translation id="4212740939091998969">Ja hi ha una carpeta anomenada "<ph name="FOLDER_NAME" />". Tria un altre nom.</translation>
 <translation id="4215448920900139318">S'estan afegint <ph name="FILE_COUNT" /> a la còpia de seguretat</translation>
+<translation id="4242533952199664413">Obre la configuració</translation>
 <translation id="426015154560005552">Teclat àrab</translation>
 <translation id="4261901459838235729">Presentació de Google</translation>
 <translation id="4290535918735525311">S'ha compartit 1 carpeta amb Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
index bf2bf6d..d9f1651 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Pro přístup k souboru musíte být online.</translation>
 <translation id="4212740939091998969">Složka s názvem „<ph name="FOLDER_NAME" />“ již existuje. Zvolte jiný název.</translation>
 <translation id="4215448920900139318">Zálohování souborů: <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Otevřít Nastavení</translation>
 <translation id="426015154560005552">Arabská klávesnice</translation>
 <translation id="4261901459838235729">Prezentace Google</translation>
 <translation id="4290535918735525311">1 složka je sdílena se systémem Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
index 1f1ab5fd8..09ebb56 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Du skal være online for at få adgang til denne fil.</translation>
 <translation id="4212740939091998969">Der findes allerede en mappe med navnet "<ph name="FOLDER_NAME" />". Vælg et andet navn.</translation>
 <translation id="4215448920900139318">Sikkerhedskopierer <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Åbn Indstillinger</translation>
 <translation id="426015154560005552">Arabisk tastatur</translation>
 <translation id="4261901459838235729">Google-præsentation</translation>
 <translation id="4290535918735525311">1 mappe er delt med Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
index aee646f..81ec406 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -62,7 +62,7 @@
 <translation id="164969095109328410">Chrome-Gerät</translation>
 <translation id="1665611772925418501">Die Datei konnte nicht geändert werden.</translation>
 <translation id="1673103856845176271">Auf die Datei konnte aus Sicherheitsgründen nicht zugegriffen werden.</translation>
-<translation id="1679806121152819234">VM-Plug-in</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="169515659049020177">Umschalttaste</translation>
 <translation id="1722487484194605434"><ph name="NUMBER_OF_ITEMS" /> Elemente werden gezippt...</translation>
 <translation id="174173592514158117">Alle Google Play-Ordner anzeigen</translation>
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Sie müssen online sein, um auf diese Datei zugreifen zu können.</translation>
 <translation id="4212740939091998969">Es existiert bereits ein Ordner mit dem Namen "<ph name="FOLDER_NAME" />". Wählen Sie bitte einen anderen Namen aus.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> werden gesichert</translation>
+<translation id="4242533952199664413">Einstellungen öffnen</translation>
 <translation id="426015154560005552">Arabische Tastatur</translation>
 <translation id="4261901459838235729">Google-Präsentation</translation>
 <translation id="4290535918735525311">1 Ordner für Linux freigegeben</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_el.xtb b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
index d6ff64ad..d641a43 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_el.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
@@ -271,6 +271,7 @@
 <translation id="421017592316736757">Πρέπει να είστε συνδεδεμένοι στο διαδίκτυο για να αποκτήσετε πρόσβαση σε αυτό το αρχείο.</translation>
 <translation id="4212740939091998969">Ο φάκελος με την ονομασία "<ph name="FOLDER_NAME" />" υπάρχει ήδη. Επιλέξτε διαφορετικό όνομα.</translation>
 <translation id="4215448920900139318">Δημιουργία αντιγράφου ασφαλείας για το <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Ανοίξτε τις ρυθμίσεις</translation>
 <translation id="426015154560005552">Πληκτρολόγιο Αραβικών</translation>
 <translation id="4261901459838235729">Παρουσίαση Google</translation>
 <translation id="4290535918735525311">1 φάκελος που κοινοποιήθηκε με Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
index 1e9da9d4..46d3d04f 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">You must be online to access this file.</translation>
 <translation id="4212740939091998969">The folder named '<ph name="FOLDER_NAME" />' already exists. Please choose a different name.</translation>
 <translation id="4215448920900139318">Backing up <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Open settings</translation>
 <translation id="426015154560005552">Arabic keyboard</translation>
 <translation id="4261901459838235729">Google Presentation</translation>
 <translation id="4290535918735525311">1 folder shared with Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
index c7abc7f..90f0bba6 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Tienes que estar conectado para acceder a este archivo.</translation>
 <translation id="4212740939091998969">Ya existe una carpeta con el nombre "<ph name="FOLDER_NAME" />". Elige otro.</translation>
 <translation id="4215448920900139318">Guardando una copia de seguridad de <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Abrir la configuración</translation>
 <translation id="426015154560005552">Teclado árabe</translation>
 <translation id="4261901459838235729">Presentación de Google</translation>
 <translation id="4290535918735525311">Se compartió 1 carpeta con Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
index bad081fc..75fba443 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Tienes que conectarte a Internet para acceder a este archivo.</translation>
 <translation id="4212740939091998969">Ya existe la carpeta "<ph name="FOLDER_NAME" />". Elige otro nombre.</translation>
 <translation id="4215448920900139318">Creando copia de seguridad de <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Abrir Configuración</translation>
 <translation id="426015154560005552">Teclado árabe</translation>
 <translation id="4261901459838235729">Presentación de Google</translation>
 <translation id="4290535918735525311">1 carpeta compartida con Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
index cf94a6d9..6f4ae63 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Faili juurde pääsemiseks on vaja võrguühendust.</translation>
 <translation id="4212740939091998969">Kaust nimega „<ph name="FOLDER_NAME" />” on juba olemas. Valige muu nimi.</translation>
 <translation id="4215448920900139318">Varundamine: <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Ava seaded</translation>
 <translation id="426015154560005552">Araabia klaviatuur</translation>
 <translation id="4261901459838235729">Google'i esitlus</translation>
 <translation id="4290535918735525311">1 kausta jagatakse Linuxiga</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
index bd0d3f2..92e403e 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">باید آنلاین باشید تا به این فایل دسترسی داشته باشید.</translation>
 <translation id="4212740939091998969">پوشه‌ای با نام «<ph name="FOLDER_NAME" />» ازقبل وجود دارد. لطفاً نام دیگری انتخاب کنید.</translation>
 <translation id="4215448920900139318">درحال پشتیبان‌ گرفتن از <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">باز کردن تنظیمات</translation>
 <translation id="426015154560005552">صفحه‌کلید عربی</translation>
 <translation id="4261901459838235729">‏ارائه Google </translation>
 <translation id="4290535918735525311">‏۱ پوشه با Linux هم‌رسانی شد</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
index 9b72db5..4699841 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Sinun täytyy olla online-tilassa käyttääksesi tätä tiedostoa.</translation>
 <translation id="4212740939091998969">Kansio nimeltä <ph name="FOLDER_NAME" /> on jo olemassa. Valitse toinen nimi.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> varmuuskopioidaan</translation>
+<translation id="4242533952199664413">Avaa asetukset</translation>
 <translation id="426015154560005552">Arabialainen näppäimistö</translation>
 <translation id="4261901459838235729">Google-esitys</translation>
 <translation id="4290535918735525311">1 kansio jaettu Linuxin kanssa</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
index 486c32d..22bd497 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Kailangan kang mag-online upang ma-access ang file na ito.</translation>
 <translation id="4212740939091998969">Mayroon nang folder na may pangalang "<ph name="FOLDER_NAME" />." Pumili ng ibang pangalan.</translation>
 <translation id="4215448920900139318">Bina-back up ang <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Buksan ang mga setting</translation>
 <translation id="426015154560005552">Arabic keyboard</translation>
 <translation id="4261901459838235729">Presentation ng Google</translation>
 <translation id="4290535918735525311">1 folder ang naibahagi sa Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
index dee0c05..5994f95 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Pour accéder à ce fichier, vous devez être connecté à Internet.</translation>
 <translation id="4212740939091998969">Le nom "<ph name="FOLDER_NAME" />" est déjà attribué à un dossier. Veuillez en choisir un autre.</translation>
 <translation id="4215448920900139318">Sauvegarde de <ph name="FILE_COUNT" />…</translation>
+<translation id="4242533952199664413">Ouvrir les paramètres</translation>
 <translation id="426015154560005552">Clavier arabe</translation>
 <translation id="4261901459838235729">Présentation Google</translation>
 <translation id="4290535918735525311">1 dossier partagé avec Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
index a12e9cf..6f9dc1b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">આ ફાઇલ એક્સેસ કરવા તમારું ઑનલાઇન હોું જરૂરી છે.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" નામનું ફોલ્ડર પહેલાંથી અસ્તિત્વમાં છે. કૃપા કરીને કોઈ અલગ નામ પસંદ કરો.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" />નો બૅકઅપ લઈ રહ્યાં છીએ</translation>
+<translation id="4242533952199664413">સેટિંગ્સ ખોલો</translation>
 <translation id="426015154560005552">અરેબિક કીબોર્ડ</translation>
 <translation id="4261901459838235729">Google પ્રસ્તુતિ</translation>
 <translation id="4290535918735525311">Linux વડે શેર કરેલું 1 ફોલ્ડર</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
index 688a5bf..1f94d1f 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">इस फ़ाइल को एक्सेस करने के लिए आपका ऑनलाइन होना ज़रूरी है.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" नाम का फ़ोल्डर पहले से मौजूद है. कृपया कोई अलग नाम चुनें.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> का बैक अप लिया जा रहा है</translation>
+<translation id="4242533952199664413">सेटिंग खोलें</translation>
 <translation id="426015154560005552">अरबी कीबोर्ड</translation>
 <translation id="4261901459838235729">Google प्रस्‍तुतिकरण</translation>
 <translation id="4290535918735525311">Linux के साथ एक फ़ोल्डर शेयर किया गया</translation>
@@ -270,7 +271,7 @@
 <translation id="4299729908419173967">ब्राज़ीलियाई</translation>
 <translation id="4309915981827077375">सामान्य जानकारी</translation>
 <translation id="4326192123064055915">कॉफ़ी</translation>
-<translation id="4336032328163998280">कॉपी बनाने का कार्य विफल रहा. <ph name="ERROR_MESSAGE" /></translation>
+<translation id="4336032328163998280">कॉपी बनाने का काम विफल रहा. <ph name="ERROR_MESSAGE" /></translation>
 <translation id="4364327530094270451">खरबूजा</translation>
 <translation id="4372884569765913867">1x1</translation>
 <translation id="4425149324548788773">मेरी डिस्क</translation>
@@ -454,7 +455,7 @@
 <translation id="6358884629796491903">ड्रैगन</translation>
 <translation id="637062427944097960">यह फ़ाइल किसी अलग डेस्कटॉप पर खुली है. उसे देखने के लिए <ph name="USER_NAME" /> (<ph name="MAIL_ADDRESS" />) पर जाएं.</translation>
 <translation id="6395575651121294044"><ph name="NUMBER_OF_FILES" /> आइटम</translation>
-<translation id="6398765197997659313">पूर्ण स्क्रीन से बाहर निकलें</translation>
+<translation id="6398765197997659313">फ़ुल स्क्रीन से बाहर निकलें</translation>
 <translation id="642282551015776456">यह नाम कि‍सी फ़ाइल या फ़ोल्‍डर के लि‍ए उपयोग नहीं कि‍या जा सकता</translation>
 <translation id="6462109140674788769">यूनानी कीबोर्ड</translation>
 <translation id="6466492211071551451">आयरिश कीबोर्ड</translation>
@@ -644,7 +645,7 @@
 <translation id="8477649328507734757">स्पिन</translation>
 <translation id="8487700953926739672">ऑफ़लाइन उपलब्ध है</translation>
 <translation id="8521441079177373948">यूके</translation>
-<translation id="8525306231823319788">पूर्ण स्‍क्रीन</translation>
+<translation id="8525306231823319788">फ़ुल स्‍क्रीन</translation>
 <translation id="8551494947769799688">लातवियाई</translation>
 <translation id="8561206103590473338">हाथी</translation>
 <translation id="8569764466147087991">खोलने के लिए फ़ाइल को चुनें</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
index 499eb9f..ee01d729 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Morate biti na mreži da biste pristupili toj datoteci.</translation>
 <translation id="4212740939091998969">Mapa s nazivom "<ph name="FOLDER_NAME" />" već postoji. Odaberite drugi naziv.</translation>
 <translation id="4215448920900139318">Sigurnosno kopiranje datoteka (ukupno <ph name="FILE_COUNT" />)</translation>
+<translation id="4242533952199664413">Otvori postavke</translation>
 <translation id="426015154560005552">arapska tipkovnica</translation>
 <translation id="4261901459838235729">Googleova prezentacija</translation>
 <translation id="4290535918735525311">Jedna mapa podijeljena s Linuxom</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
index 6a633bc..0a3566c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Online kell lennie a fájl eléréséhez.</translation>
 <translation id="4212740939091998969">Már van „<ph name="FOLDER_NAME" />” nevű mappa. Válasszon másik nevet.</translation>
 <translation id="4215448920900139318">Biztonsági másolat készítése a következőkről: <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Beállítások megnyitása</translation>
 <translation id="426015154560005552">Arab billentyűzet</translation>
 <translation id="4261901459838235729">Google-bemutató</translation>
 <translation id="4290535918735525311">1 mappa megosztva Linuxszal</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
index 6d8f8381..a7e00b6e 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Anda harus online untuk mengakses file ini.</translation>
 <translation id="4212740939091998969">Folder bernama "<ph name="FOLDER_NAME" />" sudah ada. Harap pilih nama lain.</translation>
 <translation id="4215448920900139318">Mem-backup <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Buka setelan</translation>
 <translation id="426015154560005552">Keyboard Arab</translation>
 <translation id="4261901459838235729">Presentasi Google</translation>
 <translation id="4290535918735525311">1 folder dibagikan dengan Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
index 29f0d24..16d4027 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Per poter accedere a questo file devi essere online.</translation>
 <translation id="4212740939091998969">Esiste già una cartella denominata "<ph name="FOLDER_NAME" />". Scegli un nome diverso.</translation>
 <translation id="4215448920900139318">Backup di <ph name="FILE_COUNT" /> in corso</translation>
+<translation id="4242533952199664413">Apri le impostazioni</translation>
 <translation id="426015154560005552">Tastiera Arabo</translation>
 <translation id="4261901459838235729">Presentazione Google</translation>
 <translation id="4290535918735525311">1 cartella condivisa con Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
index 0fe26cd..6c6605a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">עליך להיות במצב מקוון כדי לגשת לקובץ זה.</translation>
 <translation id="4212740939091998969">כבר קיימת תיקייה בשם "<ph name="FOLDER_NAME" />". יש לבחור שם אחר.</translation>
 <translation id="4215448920900139318">מגבה <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">פתח את 'הגדרות'</translation>
 <translation id="426015154560005552">מקלדת ערבית</translation>
 <translation id="4261901459838235729">‏מצגת Google</translation>
 <translation id="4290535918735525311">‏תיקייה אחת שותפה עם Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
index 8c56c7d..8b14698d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">このファイルにアクセスするには、オンライン接続が必要です。</translation>
 <translation id="4212740939091998969">「<ph name="FOLDER_NAME" />」という名前のフォルダはすでに存在します。別の名前を選択してください。</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" />をバックアップしています</translation>
+<translation id="4242533952199664413">設定を開く</translation>
 <translation id="426015154560005552">アラビア語キーボード</translation>
 <translation id="4261901459838235729">Google プレゼンテーション</translation>
 <translation id="4290535918735525311">1 個のフォルダを Linux と共有しました</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
index 4ef6560..fc698c65 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -259,6 +259,7 @@
 <translation id="421017592316736757">ಈ ಫೈಲ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಆನ್‌ಲೈನ್‌ನಲ್ಲಿರಬೇಕು.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" ಹೆಸರಿನ ಫೋಲ್ಡರ್ ಈಗಾಗಲೇ ಇದೆ. ಬೇರೊಂದು ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> ಬ್ಯಾಕಪ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
+<translation id="4242533952199664413">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆ</translation>
 <translation id="426015154560005552">ಅರೇಬಿಕ್ ಕೀಬೋರ್ಡ್</translation>
 <translation id="4261901459838235729">Google ಪ್ರಸ್ತುತಿ</translation>
 <translation id="4290535918735525311">Linux ಮೂಲಕ 1 ಫೋಲ್ಡರ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
index de717935..9624763 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">이 파일에 액세스하려면 온라인 상태여야 합니다.</translation>
 <translation id="4212740939091998969">이름이 '<ph name="FOLDER_NAME" />'인 폴더가 이미 존재합니다. 다른 이름을 선택하세요.</translation>
 <translation id="4215448920900139318">파일 <ph name="FILE_COUNT" />개 백업 중</translation>
+<translation id="4242533952199664413">설정 열기</translation>
 <translation id="426015154560005552">아랍어 키보드</translation>
 <translation id="4261901459838235729">Google 프레젠테이션</translation>
 <translation id="4290535918735525311">폴더 1개가 Linux와 공유됨</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
index f3094db..5ce1137 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Jei norite pasiekti šį failą, turite prisijungti.</translation>
 <translation id="4212740939091998969">Aplankas pavadinimu „<ph name="FOLDER_NAME" />“ jau yra. Pasirinkite kitą pavadinimą.</translation>
 <translation id="4215448920900139318">Kuriama atsarginė kopija: <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Atidaryti nustatymus</translation>
 <translation id="426015154560005552">Arabiška klaviatūra</translation>
 <translation id="4261901459838235729">„Google“ pristatymas</translation>
 <translation id="4290535918735525311">1 aplankas bendrinamas su „Linux“</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
index bc6776c..6e4d560 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Lai piekļūtu šim failam, jums ir jābūt tiešsaistē.</translation>
 <translation id="4212740939091998969">Mape ar nosaukumu “<ph name="FOLDER_NAME" />” jau pastāv. Lūdzu, izvēlieties citu nosaukumu.</translation>
 <translation id="4215448920900139318">Dublēšana: <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Atvērt iestatījumus</translation>
 <translation id="426015154560005552">Arābu tastatūra</translation>
 <translation id="4261901459838235729">Google prezentācija</translation>
 <translation id="4290535918735525311">1 mape kopīgota ar Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
index 5f85aca..3e72b8f 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">ഈ ഫയൽ ആക്‌സസ് ചെയ്യുന്നതിന് നിങ്ങൾ ഓൺലൈനിലായിരിക്കണം.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" എന്ന് പേരുള്ള ഫോൾഡർ മുമ്പേ നിലവിലുണ്ട്. മറ്റൊരു പേര് തിരഞ്ഞെടുക്കുക.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> ബാക്കപ്പ് ചെയ്യുന്നു</translation>
+<translation id="4242533952199664413">ക്രമീകരണം തുറക്കുക</translation>
 <translation id="426015154560005552">അറബിക് കീബോർഡ്</translation>
 <translation id="4261901459838235729">Google അവതരണം</translation>
 <translation id="4290535918735525311">Linux ഉപയോഗിച്ച് ഒരു ഫോൾഡർ പങ്കിട്ടു</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
index c1b555d92..8507ffb 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">या फाइलमध्ये अॅक्सेस करण्‍यासाठी तुम्ही ऑनलाइन असणे आवश्यक आहे.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" नावाचे फोल्डर आधीच अस्तित्वात आहे. कृपया वेगळे नाव निवडा.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> चा बॅकअप घेत आहे</translation>
+<translation id="4242533952199664413">सेटिंग्ज उघडा</translation>
 <translation id="426015154560005552">अरेबिक कीबोर्ड</translation>
 <translation id="4261901459838235729">Google सादरीकरण</translation>
 <translation id="4290535918735525311">Linux सह एक फोल्डर शेअर केला</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
index 2316bc90a..6273767b 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Anda mesti berada dalam talian untuk mengakses fail ini.</translation>
 <translation id="4212740939091998969">Fail bernama "<ph name="FOLDER_NAME" />" sudah wujud. Sila pilih nama lain.</translation>
 <translation id="4215448920900139318">Menyandarkan <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Buka tetapan</translation>
 <translation id="426015154560005552">Papan kekunci bahasa Arab</translation>
 <translation id="4261901459838235729">Persembahan Google</translation>
 <translation id="4290535918735525311">1 folder dikongsi dengan Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
index bbc585c1..fa758b7 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Je moet online zijn om dit bestand te openen.</translation>
 <translation id="4212740939091998969">Er bestaat al een map met de naam '<ph name="FOLDER_NAME" />'. Kies een andere naam.</translation>
 <translation id="4215448920900139318">Back-up van <ph name="FILE_COUNT" /> maken</translation>
+<translation id="4242533952199664413">Instellingen openen</translation>
 <translation id="426015154560005552">Arabisch toetsenbord</translation>
 <translation id="4261901459838235729">Google-presentatie</translation>
 <translation id="4290535918735525311">1 map gedeeld met Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
index 2721d0e..8a93c690 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Du må ha internettilkobling for å få tilgang til denne filen.</translation>
 <translation id="4212740939091998969">Det finnes allerede en mappe som heter «<ph name="FOLDER_NAME" />». Velg et annet navn.</translation>
 <translation id="4215448920900139318">Sikkerhetskopierer <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Åpne innstillingene</translation>
 <translation id="426015154560005552">Arabisk tastatur</translation>
 <translation id="4261901459838235729">Google-presentasjon</translation>
 <translation id="4290535918735525311">1 mappe er delt med Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
index d90a520..3d7dd4d 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Musisz być w trybie online, by uzyskać dostęp do tego pliku.</translation>
 <translation id="4212740939091998969">Istnieje już folder „<ph name="FOLDER_NAME" />”. Wybierz inną nazwę.</translation>
 <translation id="4215448920900139318">Tworzę kopie zapasowe – <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Otwórz ustawienia</translation>
 <translation id="426015154560005552">Klawiatura arabska</translation>
 <translation id="4261901459838235729">Prezentacja Google</translation>
 <translation id="4290535918735525311">Folder udostępniono Linuksowi</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
index 6b52865..704c497 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">É necessário estar conectado para acessar este arquivo.</translation>
 <translation id="4212740939091998969">Já existe uma pasta chamada "<ph name="FOLDER_NAME" />". Escolha outro nome.</translation>
 <translation id="4215448920900139318">Fazendo backup de <ph name="FILE_COUNT" /> arquivo(s)</translation>
+<translation id="4242533952199664413">Abrir configurações.</translation>
 <translation id="426015154560005552">Teclado árabe</translation>
 <translation id="4261901459838235729">Apresentação do Google</translation>
 <translation id="4290535918735525311">1 pasta compartilhada com o Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
index a24c5f0..08a934641 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Tem de estar online para aceder a este ficheiro.</translation>
 <translation id="4212740939091998969">A pasta com o nome "<ph name="FOLDER_NAME" />" já existe. Escolha um nome diferente.</translation>
 <translation id="4215448920900139318">A fazer uma cópia de segurança de <ph name="FILE_COUNT" />...</translation>
+<translation id="4242533952199664413">Abrir definições</translation>
 <translation id="426015154560005552">Teclado árabe</translation>
 <translation id="4261901459838235729">Apresentação do Google</translation>
 <translation id="4290535918735525311">1 pasta partilhada com o Linux.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
index 04a6e52..95eb197 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Trebuie să fiți online pentru a accesa acest fișier.</translation>
 <translation id="4212740939091998969">Dosarul cu numele „<ph name="FOLDER_NAME" />” există deja. Alege un alt nume.</translation>
 <translation id="4215448920900139318">Se face backup pentru <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Deschide setările</translation>
 <translation id="426015154560005552">Tastatură arabă</translation>
 <translation id="4261901459838235729">Prezentare Google</translation>
 <translation id="4290535918735525311">Un dosar cu accesul permis pentru Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
index 344fd051..98321007 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Для доступа к файлу необходимо подключение к Интернету.</translation>
 <translation id="4212740939091998969">Папка "<ph name="FOLDER_NAME" />" уже существует. Укажите другое название.</translation>
 <translation id="4215448920900139318">Сохранение файлов (<ph name="FILE_COUNT" />)…</translation>
+<translation id="4242533952199664413">Открыть настройки</translation>
 <translation id="426015154560005552">Арабская раскладка</translation>
 <translation id="4261901459838235729">Презентация Google</translation>
 <translation id="4290535918735525311">Linux предоставлен доступ к 1 папке</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
index a77189e..17eadd3 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Ak chcete pristupovať k tomuto súboru, musíte byť online.</translation>
 <translation id="4212740939091998969">Priečinok s názvom <ph name="FOLDER_NAME" /> už existuje. Vyberte iný názov.</translation>
 <translation id="4215448920900139318">Zálohujú sa fotky (<ph name="FILE_COUNT" />)</translation>
+<translation id="4242533952199664413">Otvoriť nastavenia</translation>
 <translation id="426015154560005552">Arabská klávesnica</translation>
 <translation id="4261901459838235729">Prezentácia Google</translation>
 <translation id="4290535918735525311">So systémom Linux zdieľate 1 priečinok</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
index 2c40b23..229112f3 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Če želite dostopati do datoteke, mora biti vzpostavljena povezava z internetom.</translation>
 <translation id="4212740939091998969">Mapa z imenom »<ph name="FOLDER_NAME" />« že obstaja. Izberite drugo ime.</translation>
 <translation id="4215448920900139318">Varnostno kopiranje: <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Odpri nastavitve</translation>
 <translation id="426015154560005552">Tipkovnica za arabščino</translation>
 <translation id="4261901459838235729">Googlova predstavitev</translation>
 <translation id="4290535918735525311">1 mapa v skupni rabi z Linuxom</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
index 9deb9e11..6d1412ab 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Морате да будете на мрежи да бисте приступили овој датотеци.</translation>
 <translation id="4212740939091998969">Директоријум „<ph name="FOLDER_NAME" />“ већ постоји. Одаберите други назив.</translation>
 <translation id="4215448920900139318">Праве се резервне копије (<ph name="FILE_COUNT" />)</translation>
+<translation id="4242533952199664413">Отвори подешавања</translation>
 <translation id="426015154560005552">Арапска тастатура</translation>
 <translation id="4261901459838235729">Google презентација</translation>
 <translation id="4290535918735525311">1 директоријум се дели са Linux-ом</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
index 7adb737..1294955 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Du måste vara online för att kunna öppna filen.</translation>
 <translation id="4212740939091998969">Det finns redan en mapp med namnet <ph name="FOLDER_NAME" />. Välj ett annat namn.</translation>
 <translation id="4215448920900139318">Säkerhetskopierar <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Öppna Inställningar</translation>
 <translation id="426015154560005552">Tangentbord för arabiska</translation>
 <translation id="4261901459838235729">Presentation i Google Dokument</translation>
 <translation id="4290535918735525311">1 mapp delas med Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
index 9184a9b..c38d57b6 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Sharti uwe mtandaoni ili kufikia faili hii.</translation>
 <translation id="4212740939091998969">Folda iitwayo "<ph name="FOLDER_NAME" />" tayari ipo. Tafadhali chagua jina tofauti.</translation>
 <translation id="4215448920900139318">Inahifadhi nakala ya <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Fungua mipangilio</translation>
 <translation id="426015154560005552">Kibodi ya Kiarabu</translation>
 <translation id="4261901459838235729">Wasilisho la Google</translation>
 <translation id="4290535918735525311">Folda 1 imeshirikiwa na Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
index f04b9b5..7411919 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -262,6 +262,7 @@
 <translation id="421017592316736757">இந்தக் கோப்பை அணுக ஆன்லைனில் இருக்க வேண்டும்.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" என்ற பெயருள்ள கோப்புறை ஏற்கனவே உள்ளது. வேறொரு பெயரைத் தேர்வுசெய்யவும்.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> கோப்புகளைக் காப்புப் பிரதி எடுக்கிறது</translation>
+<translation id="4242533952199664413">அமைப்புகளைத் திற</translation>
 <translation id="426015154560005552">அரபிக் விசைப்பலகை</translation>
 <translation id="4261901459838235729">Google விளக்கக்காட்சி</translation>
 <translation id="4290535918735525311">Linuxஸுடன் 1 கோப்புறை பகிரப்பட்டது</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
index 2d4de8b..da05b8a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">ఈ ఫైల్‌ను యాక్సెస్ చేయడానికి మీరు తప్పనిసరిగా ఆన్‌లైన్‌లో ఉండాలి.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" పేరు గల ఫోల్డర్ ఇప్పటికే ఉంది. దయచేసి వేరే పేరును ఎంచుకోండి.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> వాటిని బ్యాకప్ చేస్తోంది</translation>
+<translation id="4242533952199664413">సెట్టింగ్‌లను తెరువు</translation>
 <translation id="426015154560005552">అరబిక్ కీబోర్డ్</translation>
 <translation id="4261901459838235729">Google ప్రెజెంటేషన్</translation>
 <translation id="4290535918735525311">Linuxతో 1 ఫోల్డర్ షేర్ చేయబడింది</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
index 81e733a..5269021 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">คุณจะต้องออนไลน์เพื่อเข้าถึงไฟล์นี้</translation>
 <translation id="4212740939091998969">มีโฟลเดอร์ชื่อ "<ph name="FOLDER_NAME" />" อยู่แล้ว โปรดเลือกชื่ออื่น</translation>
 <translation id="4215448920900139318">กำลังสำรอง <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">เปิดการตั้งค่า</translation>
 <translation id="426015154560005552">แป้นพิมพ์อาหรับ</translation>
 <translation id="4261901459838235729">งานนำเสนอของ Google</translation>
 <translation id="4290535918735525311">แชร์กับ Linux แล้ว 1 โฟลเดอร์</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
index d053b9f6..20dafde0 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Bu dosyaya erişebilmek için çevrimiçi olmalısınız.</translation>
 <translation id="4212740939091998969">"<ph name="FOLDER_NAME" />" adlı klasör zaten var. Lütfen farklı bir ad seçin.</translation>
 <translation id="4215448920900139318"><ph name="FILE_COUNT" /> yedekleniyor</translation>
+<translation id="4242533952199664413">Ayarları aç</translation>
 <translation id="426015154560005552">Arapça klavye</translation>
 <translation id="4261901459838235729">Google sunusu</translation>
 <translation id="4290535918735525311">Linux ile 1 klasör paylaşılıyor</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
index b2e17a0..630390e 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Щоб отримати доступ до цього файлу, потрібно перебувати в режимі онлайн.</translation>
 <translation id="4212740939091998969">Папка з назвою "<ph name="FOLDER_NAME" />" уже існує. Укажіть іншу назву.</translation>
 <translation id="4215448920900139318">Створюється резервна копія: <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Відкрити налаштування</translation>
 <translation id="426015154560005552">Арабська клавіатура</translation>
 <translation id="4261901459838235729">Презентація Google</translation>
 <translation id="4290535918735525311">Linux має доступ до 1 папки</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
index 5e5efcd..de53c472 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">Bạn phải trực tuyến để truy cập tệp này.</translation>
 <translation id="4212740939091998969">Thư mục có tên "<ph name="FOLDER_NAME" />" đã tồn tại. Hãy chọn một tên khác.</translation>
 <translation id="4215448920900139318">Đang sao lưu <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">Mở cài đặt</translation>
 <translation id="426015154560005552">Bàn phím tiếng Ả Rập</translation>
 <translation id="4261901459838235729">Bản trình bày Google</translation>
 <translation id="4290535918735525311">Đã chia sẻ 1 thư mục với Linux</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
index 6bab288..0584c899 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">您必须在线访问此文件。</translation>
 <translation id="4212740939091998969">已有名为“<ph name="FOLDER_NAME" />”的文件夹。请另选一个名称。</translation>
 <translation id="4215448920900139318">正在备份 <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">打开“设置”</translation>
 <translation id="426015154560005552">阿拉伯语键盘</translation>
 <translation id="4261901459838235729">Google 演示文稿</translation>
 <translation id="4290535918735525311">与 Linux 共享了 1 个文件夹</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
index 235965c0..78a64426 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
@@ -62,7 +62,7 @@
 <translation id="164969095109328410">Chrome 裝置</translation>
 <translation id="1665611772925418501">無法修改檔案。</translation>
 <translation id="1673103856845176271">基於安全理由,你無法存取檔案。</translation>
-<translation id="1679806121152819234">外掛程式 VM</translation>
+<translation id="1679806121152819234">Plugin VM</translation>
 <translation id="169515659049020177">Shift</translation>
 <translation id="1722487484194605434">正在壓縮 <ph name="NUMBER_OF_ITEMS" /> 個項目...</translation>
 <translation id="174173592514158117">顯示所有 Play 資料夾</translation>
@@ -263,6 +263,7 @@
 <translation id="421017592316736757">你必須連上網路才能存取這個檔案。</translation>
 <translation id="4212740939091998969">名稱為「<ph name="FOLDER_NAME" />」的資料夾已經存在,請選擇其他名稱。</translation>
 <translation id="4215448920900139318">正在備份 <ph name="FILE_COUNT" /></translation>
+<translation id="4242533952199664413">開啟設定</translation>
 <translation id="426015154560005552">阿拉伯文鍵盤</translation>
 <translation id="4261901459838235729">Google 簡報</translation>
 <translation id="4290535918735525311">已與 Linux 共用 1 個資料夾</translation>
diff --git a/ui/compositor/DEPS b/ui/compositor/DEPS
index a03ced13..adc2e10 100644
--- a/ui/compositor/DEPS
+++ b/ui/compositor/DEPS
@@ -5,7 +5,6 @@
   "+components/viz/service",
   "+gpu/command_buffer/client/gles2_interface.h",
   "+services/viz/privileged/interfaces/compositing",
-  "+services/ws/public/cpp",
   "+skia/ext/refptr.h",
   "+third_party/khronos/GLES2/gl2.h",
   "+third_party/skia",
diff --git a/ui/display/display_features.cc b/ui/display/display_features.cc
index 0a3e792..ad2894d 100644
--- a/ui/display/display_features.cc
+++ b/ui/display/display_features.cc
@@ -7,9 +7,6 @@
 namespace display {
 namespace features {
 
-const base::Feature kHighDynamicRange{"HighDynamicRange",
-                                      base::FEATURE_ENABLED_BY_DEFAULT};
-
 // This features allows listing all display modes of external displays in the
 // display settings and setting any one of them exactly as requested, which can
 // be very useful for debugging and development purposes.
diff --git a/ui/display/display_features.h b/ui/display/display_features.h
index fbb27b6..43e5f4a 100644
--- a/ui/display/display_features.h
+++ b/ui/display/display_features.h
@@ -11,8 +11,6 @@
 namespace display {
 namespace features {
 
-DISPLAY_EXPORT extern const base::Feature kHighDynamicRange;
-
 #if defined(OS_CHROMEOS)
 DISPLAY_EXPORT extern const base::Feature kUseMonitorColorSpace;
 #endif
diff --git a/ui/file_manager/base/js/filtered_volume_manager.js b/ui/file_manager/base/js/filtered_volume_manager.js
index 752f840c..92a0b0a 100644
--- a/ui/file_manager/base/js/filtered_volume_manager.js
+++ b/ui/file_manager/base/js/filtered_volume_manager.js
@@ -105,11 +105,14 @@
       });
     }
 
-    queue.run(callNextStep => {
-      this.backgroundPage_.volumeManagerFactory.getInstance(volumeManager => {
+    queue.run(async (callNextStep) => {
+      try {
+        const volumeManager =
+            await this.backgroundPage_.volumeManagerFactory.getInstance();
         this.onReady_(volumeManager);
+      } finally {
         callNextStep();
-      });
+      }
     });
   }
 
diff --git a/ui/file_manager/externs/background/volume_manager_factory.js b/ui/file_manager/externs/background/volume_manager_factory.js
index 201f00d..7115c52 100644
--- a/ui/file_manager/externs/background/volume_manager_factory.js
+++ b/ui/file_manager/externs/background/volume_manager_factory.js
@@ -5,10 +5,9 @@
 var volumeManagerFactory = {};
 
 /**
- * @param {function(VolumeManager)=} opt_callback
- * @return {Promise}
+ * @return {!Promise<!VolumeManager>}
  */
-volumeManagerFactory.getInstance = function(opt_callback) {};
+volumeManagerFactory.getInstance = function() {};
 
 /**
  * @return {VolumeManager}
diff --git a/ui/file_manager/file_manager/background/js/crostini.js b/ui/file_manager/file_manager/background/js/crostini.js
index 38187ac..c3d90f5 100644
--- a/ui/file_manager/file_manager/background/js/crostini.js
+++ b/ui/file_manager/file_manager/background/js/crostini.js
@@ -243,6 +243,13 @@
     return false;
   }
 
+  // TODO(crbug.com/958840): Sharing Play files root is disallowed until
+  // we can ensure it will not also share Downloads.
+  if (root === VolumeManagerCommon.RootType.ANDROID_FILES &&
+      entry.fullPath === '/') {
+    return false;
+  }
+
   // Special case to disallow PluginVm sharing on /MyFiles/PluginVm and
   // subfolders since it gets shared by default.
   if (vmName === CrostiniImpl.PLUGIN_VM &&
diff --git a/ui/file_manager/file_manager/background/js/crostini_unittest.js b/ui/file_manager/file_manager/background/js/crostini_unittest.js
index fe94175..a5fda05 100644
--- a/ui/file_manager/file_manager/background/js/crostini_unittest.js
+++ b/ui/file_manager/file_manager/background/js/crostini_unittest.js
@@ -171,14 +171,22 @@
   setDriveFsEnabled(true);
   // TODO(crbug.com/917920): Add computers_grand_root and computers when DriveFS
   // enforces allowed write paths.
+
   const allowed = [
     'downloads', 'removable', 'android_files', 'drive',
     'shared_drives_grand_root', 'team_drive'
   ];
   for (const type of allowed) {
     volumeManagerRootType = type;
-    assertTrue(crostini.canSharePath('vm', root, true));
-    assertTrue(crostini.canSharePath('vm', root, false));
+    // TODO(crbug.com/958840): Sharing Play files root is disallowed until
+    // we can ensure it will not also share Downloads.
+    if (type === 'android_files') {
+      assertFalse(crostini.canSharePath('vm', root, true));
+      assertFalse(crostini.canSharePath('vm', root, false));
+    } else {
+      assertTrue(crostini.canSharePath('vm', root, true));
+      assertTrue(crostini.canSharePath('vm', root, false));
+    }
     assertFalse(crostini.canSharePath('vm', rootFile, true));
     assertTrue(crostini.canSharePath('vm', rootFile, false));
     assertTrue(crostini.canSharePath('vm', rootFolder, true));
diff --git a/ui/file_manager/file_manager/background/js/launcher_search.js b/ui/file_manager/file_manager/background/js/launcher_search.js
index fc4be8e..605444c 100644
--- a/ui/file_manager/file_manager/background/js/launcher_search.js
+++ b/ui/file_manager/file_manager/background/js/launcher_search.js
@@ -196,6 +196,11 @@
             // Execute default task.
             chrome.fileManagerPrivate.executeTask(
                 defaultTask.taskId, [entry], result => {
+                  if (chrome.runtime.lastError) {
+                    console.warn(
+                        'Unable to execute task: ' +
+                        chrome.runtime.lastError.message);
+                  }
                   if (result === 'opened' || result === 'message_sent') {
                     return;
                   }
diff --git a/ui/file_manager/file_manager/background/js/volume_manager_factory.js b/ui/file_manager/file_manager/background/js/volume_manager_factory.js
index 98e15ae..de56fbe 100644
--- a/ui/file_manager/file_manager/background/js/volume_manager_factory.js
+++ b/ui/file_manager/file_manager/background/js/volume_manager_factory.js
@@ -19,21 +19,15 @@
    * Returns the VolumeManager instance asynchronously. If it has not been
    * created or is under initialization, it will waits for the finish of the
    * initialization.
-   * @param {function(VolumeManager)=} opt_callback Called with the
-   *     VolumeManager instance. TODO(hirono): Remove the callback and use
-   *     Promise instead.
    * @return {!Promise<!VolumeManager>} Promise to be fulfilled with the volume
    *     manager.
    */
-  function getInstance(opt_callback) {
+  function getInstance() {
     if (!instancePromise) {
       instance = new VolumeManagerImpl();
       instancePromise =
           new Promise(fulfill => instance.initialize(() => fulfill(instance)));
     }
-    if (opt_callback) {
-      instancePromise.then(opt_callback);
-    }
     return instancePromise;
   }
 
diff --git a/ui/file_manager/file_manager/background/js/volume_manager_impl.js b/ui/file_manager/file_manager/background/js/volume_manager_impl.js
index a2d3ffa..26ff613 100644
--- a/ui/file_manager/file_manager/background/js/volume_manager_impl.js
+++ b/ui/file_manager/file_manager/background/js/volume_manager_impl.js
@@ -74,51 +74,47 @@
    * @return {!Promise<!VolumeInfo>}
    * @private
    */
-  addVolumeMetadata_(volumeMetadata) {
-    return volumeManagerUtil.createVolumeInfo(volumeMetadata)
-        .then(
-            /**
-             * @param {!VolumeInfo} volumeInfo
-             * @return {!VolumeInfo}
-             */
-            volumeInfo => {
-              // We don't show Downloads and Drive on volume list if they have
-              // mount error, since users can do nothing in this situation. We
-              // show Removable and Provided volumes regardless of mount error
-              // so that users can unmount or format the volume.
-              // TODO(fukino): Once the Files app gets ready, show erroneous
-              // Drive volume so that users can see auth warning banner on the
-              // volume. crbug.com/517772.
-              let shouldShow = true;
-              switch (volumeInfo.volumeType) {
-                case VolumeManagerCommon.VolumeType.DOWNLOADS:
-                case VolumeManagerCommon.VolumeType.DRIVE:
-                  shouldShow = !!volumeInfo.fileSystem;
-                  break;
-              }
-              if (!shouldShow) {
-                return volumeInfo;
-              }
-              if (this.volumeInfoList.findIndex(volumeInfo.volumeId) === -1) {
-                this.volumeInfoList.add(volumeInfo);
+  async addVolumeMetadata_(volumeMetadata) {
+    const volumeInfo = await volumeManagerUtil.createVolumeInfo(volumeMetadata);
 
-                // Update the network connection status, because until the drive
-                // is initialized, the status is set to not ready.
-                // TODO(mtomasz): The connection status should be migrated into
-                // chrome.fileManagerPrivate.VolumeMetadata.
-                if (volumeMetadata.volumeType ===
-                    VolumeManagerCommon.VolumeType.DRIVE) {
-                  this.onDriveConnectionStatusChanged_();
-                }
-              } else if (
-                  volumeMetadata.volumeType ===
-                  VolumeManagerCommon.VolumeType.REMOVABLE) {
-                // Update for remounted USB external storage, because they were
-                // remounted to switch read-only policy.
-                this.volumeInfoList.add(volumeInfo);
-              }
-              return volumeInfo;
-            });
+    // We don't show Downloads and Drive on volume list if they have
+    // mount error, since users can do nothing in this situation. We
+    // show Removable and Provided volumes regardless of mount error
+    // so that users can unmount or format the volume.
+    // TODO(fukino): Once the Files app gets ready, show erroneous
+    // Drive volume so that users can see auth warning banner on the
+    // volume. crbug.com/517772.
+    let shouldShow = true;
+    switch (volumeInfo.volumeType) {
+      case VolumeManagerCommon.VolumeType.DOWNLOADS:
+      case VolumeManagerCommon.VolumeType.DRIVE:
+        shouldShow = !!volumeInfo.fileSystem;
+        break;
+    }
+
+    if (!shouldShow) {
+      return volumeInfo;
+    }
+
+    if (this.volumeInfoList.findIndex(volumeInfo.volumeId) === -1) {
+      this.volumeInfoList.add(volumeInfo);
+
+      // Update the network connection status, because until the drive
+      // is initialized, the status is set to not ready.
+      // TODO(mtomasz): The connection status should be migrated into
+      // chrome.fileManagerPrivate.VolumeMetadata.
+      if (volumeMetadata.volumeType === VolumeManagerCommon.VolumeType.DRIVE) {
+        this.onDriveConnectionStatusChanged_();
+      }
+    } else if (
+        volumeMetadata.volumeType ===
+        VolumeManagerCommon.VolumeType.REMOVABLE) {
+      // Update for remounted USB external storage, because they were
+      // remounted to switch read-only policy.
+      this.volumeInfoList.add(volumeInfo);
+    }
+
+    return volumeInfo;
   }
 
   /**
@@ -166,59 +162,59 @@
    * @private
    */
   onMountCompleted_(event) {
-    this.mountQueue_.run(callback => {
-      switch (event.eventType) {
-        case 'mount':
-          var requestKey = this.makeRequestKey_(
-              'mount', event.volumeMetadata.sourcePath || '');
+    this.mountQueue_.run(async (callback) => {
+      try {
+        switch (event.eventType) {
+          case 'mount':
+            var requestKey = this.makeRequestKey_(
+                'mount', event.volumeMetadata.sourcePath || '');
 
-          if (event.status === 'success' ||
-              event.status ===
-                  VolumeManagerCommon.VolumeError.UNKNOWN_FILESYSTEM ||
-              event.status ===
-                  VolumeManagerCommon.VolumeError.UNSUPPORTED_FILESYSTEM) {
-            this.addVolumeMetadata_(event.volumeMetadata).then(volumeInfo => {
+            if (event.status === 'success' ||
+                event.status ===
+                    VolumeManagerCommon.VolumeError.UNKNOWN_FILESYSTEM ||
+                event.status ===
+                    VolumeManagerCommon.VolumeError.UNSUPPORTED_FILESYSTEM) {
+              const volumeInfo =
+                  await this.addVolumeMetadata_(event.volumeMetadata);
               this.finishRequest_(requestKey, event.status, volumeInfo);
-              callback();
-            });
-          } else if (
-              event.status ===
-              VolumeManagerCommon.VolumeError.ALREADY_MOUNTED) {
-            const navigationEvent =
-                new Event(VolumeManagerCommon.VOLUME_ALREADY_MOUNTED);
-            navigationEvent.volumeId = event.volumeMetadata.volumeId;
-            this.dispatchEvent(navigationEvent);
-            this.finishRequest_(requestKey, event.status);
-            callback();
-          } else {
-            console.warn('Failed to mount a volume: ' + event.status);
-            this.finishRequest_(requestKey, event.status);
-            callback();
-          }
-          break;
+            } else if (
+                event.status ===
+                VolumeManagerCommon.VolumeError.ALREADY_MOUNTED) {
+              const navigationEvent =
+                  new Event(VolumeManagerCommon.VOLUME_ALREADY_MOUNTED);
+              navigationEvent.volumeId = event.volumeMetadata.volumeId;
+              this.dispatchEvent(navigationEvent);
+              this.finishRequest_(requestKey, event.status);
+            } else {
+              console.warn('Failed to mount a volume: ' + event.status);
+              this.finishRequest_(requestKey, event.status);
+            }
+            break;
 
-        case 'unmount':
-          const volumeId = event.volumeMetadata.volumeId;
-          const status = event.status;
-          var requestKey = this.makeRequestKey_('unmount', volumeId);
-          const requested = requestKey in this.requests_;
-          const volumeInfoIndex = this.volumeInfoList.findIndex(volumeId);
-          const volumeInfo = volumeInfoIndex !== -1 ?
-              this.volumeInfoList.item(volumeInfoIndex) :
-              null;
-          if (event.status === 'success' && !requested && volumeInfo) {
-            console.warn('Unmounted volume without a request: ' + volumeId);
-            this.dispatchEvent(
-                new CustomEvent('externally-unmounted', {detail: volumeInfo}));
-          }
+          case 'unmount':
+            const volumeId = event.volumeMetadata.volumeId;
+            const status = event.status;
+            var requestKey = this.makeRequestKey_('unmount', volumeId);
+            const requested = requestKey in this.requests_;
+            const volumeInfoIndex = this.volumeInfoList.findIndex(volumeId);
+            const volumeInfo = volumeInfoIndex !== -1 ?
+                this.volumeInfoList.item(volumeInfoIndex) :
+                null;
+            if (event.status === 'success' && !requested && volumeInfo) {
+              console.warn('Unmounted volume without a request: ' + volumeId);
+              this.dispatchEvent(new CustomEvent(
+                  'externally-unmounted', {detail: volumeInfo}));
+            }
 
-          this.finishRequest_(requestKey, status);
-          if (event.status === 'success') {
-            this.volumeInfoList.remove(event.volumeMetadata.volumeId);
-          }
-          console.warn('unmounted volume: ' + volumeId);
-          callback();
-          break;
+            this.finishRequest_(requestKey, status);
+            if (event.status === 'success') {
+              this.volumeInfoList.remove(event.volumeMetadata.volumeId);
+            }
+            console.warn('unmounted volume: ' + volumeId);
+            break;
+        }
+      } finally {
+        callback();
       }
     });
   }
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.js b/ui/file_manager/file_manager/foreground/js/file_manager.js
index a23602a6..ba56758 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager.js
@@ -1649,28 +1649,25 @@
       // The toast is for removable volumes.
       return;
     }
-    const key = 'show-arc-storage-toast-shown';
-    if (window.sessionStorage.getItem(key)) {
-      // We show the toast only once.
-      // TODO(yusukes): We should show the UI only once *per user session*.
-      // Since sessionStorage is deleted when you close the app window, the
-      // current code is not perfect.
-      return;
-    }
     chrome.fileManagerPrivate.getPreferences(pref => {
       if (!pref.arcEnabled || pref.arcRemovableMediaAccessEnabled) {
         // We don't show the toast when ARC is disabled or the setting has
         // already been enabled.
         return;
       }
-      this.ui.toast.show(str('FILE_BROWSER_PLAY_STORE_ACCESS_LABEL'), {
-        text: str('FILE_BROWSER_OPEN_PLAY_STORE_SETTINGS_LABEL'),
-        callback: () => {
-          chrome.fileManagerPrivate.openSettingsSubpage(
-              'storage/externalStoragePreferences');
+      chrome.fileManagerPrivate.setArcStorageToastShownFlag(originalFlag => {
+        if (originalFlag) {
+          // We show the toast only once.
+          return;
         }
+        this.ui.toast.show(str('FILE_BROWSER_PLAY_STORE_ACCESS_LABEL'), {
+          text: str('FILE_BROWSER_OPEN_PLAY_STORE_SETTINGS_LABEL'),
+          callback: () => {
+            chrome.fileManagerPrivate.openSettingsSubpage(
+                'storage/externalStoragePreferences');
+          }
+        });
       });
-      window.sessionStorage.setItem(key, 'true');
     });
   };
 })();
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
index db884c6..4277ace 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -2056,9 +2056,9 @@
     // Non-Drive volume roots are always '/'.
     if (dir.fullPath == '/') {
       fileManager.ui_.confirmDialog.showHtml(
-          strf('SHARE_ROOT_FOLDER_WITH_CROSTINI_TITLE'),
-          strf('SHARE_ROOT_FOLDER_WITH_CROSTINI', info.volumeInfo.label), share,
-          () => {});
+          strf('SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_TITLE'),
+          strf('SHARE_ROOT_FOLDER_WITH_PLUGIN_VM', info.volumeInfo.label),
+          share, () => {});
     } else if (
         info.isRootEntry &&
         (info.rootType == VolumeManagerCommon.RootType.DRIVE ||
@@ -2069,8 +2069,8 @@
       // Computers Grand Root.  Do not show for roots of a single Shared Drive
       // or Computer.
       fileManager.ui_.confirmDialog.showHtml(
-          strf('SHARE_ROOT_FOLDER_WITH_CROSTINI_TITLE'),
-          strf('SHARE_ROOT_FOLDER_WITH_CROSTINI_DRIVE'), share, () => {});
+          strf('SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_TITLE'),
+          strf('SHARE_ROOT_FOLDER_WITH_PLUGIN_VM_DRIVE'), share, () => {});
     } else {
       // This is not a root, share it without confirmation dialog.
       share();
diff --git a/ui/file_manager/file_manager/foreground/js/file_tasks.js b/ui/file_manager/file_manager/foreground/js/file_tasks.js
index 63c71e10..446f802 100644
--- a/ui/file_manager/file_manager/foreground/js/file_tasks.js
+++ b/ui/file_manager/file_manager/foreground/js/file_tasks.js
@@ -645,6 +645,12 @@
     };
 
     const onViewFiles = result => {
+      if (chrome.runtime.lastError) {
+        // Suppress the Unchecked runtime.lastError console message
+        console.debug(chrome.runtime.lastError.message);
+        onViewFilesFailure();
+        return;
+      }
       switch (result) {
         case 'opened':
           callback(true, this.entries_);
@@ -661,10 +667,6 @@
           callback(true, this.entries_);
           break;
         case 'failed':
-          // Suppress the Unchecked runtime.lastError console message
-          if (chrome.runtime.lastError) {
-            console.debug(chrome.runtime.lastError.message);
-          }
           onViewFilesFailure();
           break;
       }
@@ -711,6 +713,12 @@
           FileTasks.recordZipHandlerUMA_(task.taskId);
           chrome.fileManagerPrivate.executeTask(
               task.taskId, this.entries_, (result) => {
+                if (chrome.runtime.lastError) {
+                  console.warn(
+                      'Unable to execute task: ' +
+                      chrome.runtime.lastError.message);
+                  return;
+                }
                 if (result !== 'message_sent') {
                   return;
                 }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_table.js b/ui/file_manager/file_manager/foreground/js/ui/file_table.js
index da00aa4a..dd65a40 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_table.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_table.js
@@ -14,6 +14,32 @@
 }
 
 /**
+ * Customize the column header to decorate with a11y attributes that announces
+ * the sorting used when clicked.
+ *
+ * @this {cr.ui.table.TableColumn} Bound by cr.ui.table.TableHeader before
+ * calling.
+ * @param {Element} table Table being rendered.
+ * @return {Element}
+ */
+function renderHeader_(table) {
+  const column = /** @type {cr.ui.table.TableColumn} */ (this);
+  const textElement = table.ownerDocument.createElement('span');
+  textElement.textContent = column.name;
+  const dm = table.dataModel;
+
+  let sortOrder = column.defaultOrder;
+  if (dm && dm.sortStatus.field === column.id) {
+    // Here we have to flip, because clicking will perform the opposite sorting.
+    sortOrder = dm.sortStatus.direction === 'desc' ? 'asc' : 'desc';
+  }
+
+  textElement.setAttribute('aria-describedby', 'sort-column-' + sortOrder);
+  textElement.setAttribute('role', 'button');
+  return textElement;
+}
+
+/**
  * Inherits from cr.ui.TableColumnModel.
  */
 FileTableColumnModel.prototype.__proto__ =
@@ -397,25 +423,30 @@
       const nameColumn = new cr.ui.table.TableColumn(
           'name', str('NAME_COLUMN_LABEL'), fullPage ? 386 : 324);
       nameColumn.renderFunction = self.renderName_.bind(self);
+      nameColumn.headerRenderFunction = renderHeader_;
 
       const sizeColumn = new cr.ui.table.TableColumn(
           'size', str('SIZE_COLUMN_LABEL'), 110, true);
       sizeColumn.renderFunction = self.renderSize_.bind(self);
       sizeColumn.defaultOrder = 'desc';
+      sizeColumn.headerRenderFunction = renderHeader_;
 
       const statusColumn = new cr.ui.table.TableColumn(
           'status', str('STATUS_COLUMN_LABEL'), 60, true);
       statusColumn.renderFunction = self.renderStatus_.bind(self);
       statusColumn.visible = self.importStatusVisible_;
+      statusColumn.headerRenderFunction = renderHeader_;
 
       const typeColumn = new cr.ui.table.TableColumn(
           'type', str('TYPE_COLUMN_LABEL'), fullPage ? 110 : 110);
       typeColumn.renderFunction = self.renderType_.bind(self);
+      typeColumn.headerRenderFunction = renderHeader_;
 
       const modTimeColumn = new cr.ui.table.TableColumn(
           'modificationTime', str('DATE_COLUMN_LABEL'), fullPage ? 150 : 210);
       modTimeColumn.renderFunction = self.renderDate_.bind(self);
       modTimeColumn.defaultOrder = 'desc';
+      modTimeColumn.headerRenderFunction = renderHeader_;
 
       const columns =
           [nameColumn, sizeColumn, statusColumn, typeColumn, modTimeColumn];
diff --git a/ui/file_manager/file_manager/foreground/js/ui/files_alert_dialog.js b/ui/file_manager/file_manager/foreground/js/ui/files_alert_dialog.js
index b980958..6d31cb5 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/files_alert_dialog.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/files_alert_dialog.js
@@ -4,21 +4,21 @@
 
 /**
  * Alert dialog.
- * @param {!HTMLElement} parentNode
- * @constructor
- * @extends {cr.ui.dialogs.AlertDialog}
  */
-const FilesAlertDialog = function(parentNode) {
-  cr.ui.dialogs.AlertDialog.call(this, parentNode);
-};
+class FilesAlertDialog extends cr.ui.dialogs.AlertDialog {
+  /**
+   * @param {!HTMLElement} parentNode
+   */
+  constructor(parentNode) {
+    super(parentNode);
+  }
 
-FilesAlertDialog.prototype.__proto__ = cr.ui.dialogs.AlertDialog.prototype;
-
-/**
- * @protected
- * @override
- */
-FilesAlertDialog.prototype.initDom_ = function() {
-  cr.ui.dialogs.AlertDialog.prototype.initDom_.call(this);
-  this.frame_.classList.add('files-alert-dialog');
-};
+  /**
+   * @protected
+   * @override
+   */
+  initDom_() {
+    super.initDom_();
+    this.frame_.classList.add('files-alert-dialog');
+  }
+}
diff --git a/ui/file_manager/file_manager/main.html b/ui/file_manager/file_manager/main.html
index ccf7f00f..b70c7c8 100644
--- a/ui/file_manager/file_manager/main.html
+++ b/ui/file_manager/file_manager/main.html
@@ -525,6 +525,8 @@
               <div class="downloads-warning" hidden></div>
               <div id="list-container" role="main">
                 <div id="more-actions-info" hidden>$i18n{SEE_MENU_FOR_ACTIONS}</div>
+                <div id="sort-column-asc" hidden>$i18n{COLUMN_ASC_SORT_MESSAGE}</div>
+                <div id="sort-column-desc" hidden>$i18n{COLUMN_DESC_SORT_MESSAGE}</div>
                 <div id="empty-folder" hidden>
                   <div class="image"></div>
                   <span id="empty-folder-label" class="label">$i18n{EMPTY_FOLDER}</span>
diff --git a/ui/file_manager/file_manager/test/crostini_share.js b/ui/file_manager/file_manager/test/crostini_share.js
index 3db134b..6e07290 100644
--- a/ui/file_manager/file_manager/test/crostini_share.js
+++ b/ui/file_manager/file_manager/test/crostini_share.js
@@ -18,8 +18,30 @@
 const crostiniShare = {};
 const pluginVmShare = {};
 
-shareBase.testSharePathsSuccess =
-    async (vmName, vmNameSelector, enumUma, done) => {
+// Right click clickTarget, ensure menuVisible is shown,
+// Click menuTarget, ensure dialog is shown with expectedText.
+shareBase.verifyShareWithDialog =
+    async (name, clickTarget, menuVisible, menuTarget, expectedText) => {
+  const dialog = '.cr-dialog-container';
+  const dialogVisible = '.cr-dialog-container.shown';
+  const dialogText = '.cr-dialog-container.shown .cr-dialog-text';
+  const dialogCancel = 'button.cr-dialog-cancel';
+
+  // Check 'Share with <VM>' is shown in menu.
+  assertTrue(test.fakeMouseRightClick(clickTarget), 'right-click ' + name);
+  await test.waitForElement(menuVisible);
+
+  // Click 'Share with <VM>', verify dialog and text.
+  assertTrue(test.fakeMouseClick(menuTarget, 'Share with <VM> ' + name));
+  await test.waitForElement(dialogVisible);
+  assertEquals(expectedText, document.querySelector(dialogText).innerText);
+
+  // Click Cancel button to close.
+  assertTrue(test.fakeMouseClick(dialogCancel));
+  await test.waitForElementLost(dialog);
+};
+
+shareBase.testSharePaths = async (vmName, vmNameSelector, enumUma, done) => {
   const share = 'share-with-' + vmNameSelector;
   const manage = 'manage-' + vmNameSelector + '-sharing';
   const menuNoShareWith = '#file-context-menu:not([hidden]) ' +
@@ -33,10 +55,24 @@
   const shareWith = '#file-context-menu [command="#' + share + '"]';
   const menuShareWithDirTree = '#directory-tree-context-menu:not([hidden]) ' +
       '[command="#' + share + '"]:not([hidden]):not([disabled])';
+  const menuNoShareWithDirTree = '#directory-tree-context-menu:not([hidden]) ' +
+      '[command="#' + share + '"][hidden][disabled="disabled"]';
   const shareWithDirTree =
       '#directory-tree-context-menu [command="#' + share + '"]';
   const photos = '#file-list [file-name="photos"]';
   const myFilesDirTree = '#directory-tree [root-type-icon="my_files"]';
+  const removableRoot = '#directory-tree [volume-type-icon="removable"]';
+  const menuShareWithVolumeRoot = '#roots-context-menu:not([hidden]) ' +
+      '[command="#' + share + '"]:not([hidden]):not([disabled])';
+  const shareWithVolumeRoot = '#roots-context-menu [command="#' + share + '"]';
+  const fakeLinuxFiles = '#directory-tree [root-type-icon="crostini"]';
+  const googleDrive = '#directory-tree .tree-item [volume-type-icon="drive"]';
+  const menuHidden = '#file-context-menu[hidden]';
+  const androidRoot = '#directory-tree [volume-type-icon="android_files"]';
+
+  const shareLabel = {'termina': 'Linux apps', 'PluginVm': 'Plugin VM'};
+  const givePermission = `Give ${shareLabel[vmName]} permission to modify `;
+
   const oldSharePaths = chrome.fileManagerPrivate.sharePathsWithCrostini;
   let sharePathsCalled = false;
   let sharePathsPersist;
@@ -116,64 +152,11 @@
   assertTrue(test.fakeMouseRightClick(photos), 'right-click photos');
   await test.waitForElement(menuShareWith);
 
-  // Verify dialog is shown for MyFiles root.
-  // Check 'Share with <VM>' is shown in menu.
-  assertTrue(test.fakeMouseRightClick(myFilesDirTree), 'right-click MyFiles');
-  await test.waitForElement(menuShareWithDirTree);
+  // Verify share for MyFiles.
+  await shareBase.verifyShareWithDialog(
+      'MyFiles root', myFilesDirTree, menuShareWithDirTree, shareWithDirTree,
+      givePermission + 'files in the My files folder');
 
-  // Click 'Share with <VM>', verify dialog.
-  assertTrue(test.fakeMouseClick(shareWithDirTree, 'Share with <VM>'));
-  await test.waitForElement('.cr-dialog-container.shown');
-
-  // Click Cancel button to close.
-  assertTrue(test.fakeMouseClick('button.cr-dialog-cancel'));
-  await test.waitForElementLost('.cr-dialog-container');
-
-  // Restore fmp.*.
-  chrome.fileManagerPrivate.sharePathsWithCrostini = oldSharePaths;
-  // Restore Crostini.unregisterSharedPath.
-  fileManager.crostini.unregisterSharedPath = oldCrostiniUnregister;
-  done();
-};
-
-crostiniShare.testSharePathsSuccess = done => {
-  shareBase.testSharePathsSuccess(
-      shareBase.vmNameTermina, shareBase.vmNameSelectorLinux,
-      shareBase.enumUmaShareWithLinux, done);
-};
-
-pluginVmShare.testSharePathsSuccess = done => {
-  shareBase.testSharePathsSuccess(
-      shareBase.vmNamePluginVm, shareBase.vmNameSelectorPluginVm,
-      shareBase.enumUmaShareWithPluginVm, done);
-};
-
-// Verify right-click menu with 'Share with <VM>' is not shown
-// for:
-// * Files (not directory).
-// * Any folder already shared.
-// * Root Downloads folder.
-// * Any folder outside of downloads (e.g. crostini or drive).
-// * Is shown for drive if DriveFS is enabled.
-shareBase.testSharePathShown = async (vmName, vmNameSelector, done) => {
-  const share = 'share-with-' + vmNameSelector;
-  const myFiles = '#directory-tree .tree-item [root-type-icon="my_files"]';
-  const downloads = '#file-list li [file-type-icon="downloads"]';
-  const linuxFiles = '#directory-tree .tree-item [root-type-icon="crostini"]';
-  const googleDrive = '#directory-tree .tree-item [volume-type-icon="drive"]';
-  const menuHidden = '#file-context-menu[hidden]';
-  const menuNoShareWith = '#file-context-menu:not([hidden]) ' +
-      '[command="#' + share + '"][hidden][disabled="disabled"]';
-  const menuShareWith = '#file-context-menu:not([hidden]) ' +
-      '[command="#' + share + '"]:not([hidden]):not([disabled])';
-  const removableVolumeRoot = '#directory-tree [volume-type-icon="removable"]';
-  const menuShareWithDirTree = '#directory-tree-context-menu:not([hidden]) ' +
-      '[command="#' + share + '"]:not([hidden]):not([disabled])';
-  const menuShareWithVolumeRoot = '#roots-context-menu:not([hidden]) ' +
-      '[command="#' + share + '"]:not([hidden]):not([disabled])';
-  let alreadySharedPhotosDir;
-
-  await test.setupAndWaitUntilReady();
   // Right-click 'hello.txt' file.
   // Check 'Share with <VM>' is not shown in menu.
   assertTrue(
@@ -181,47 +164,22 @@
       'right-click hello.txt');
   await test.waitForElement(menuNoShareWith);
 
-  // Set a folder as already shared.
-  alreadySharedPhotosDir =
-      mockVolumeManager
-          .getCurrentProfileVolumeInfo(VolumeManagerCommon.VolumeType.DOWNLOADS)
-          .fileSystem.entries['/photos'];
-  fileManager.crostini.registerSharedPath(vmName, alreadySharedPhotosDir);
-  assertTrue(
-      test.fakeMouseRightClick('#file-list [file-name="photos"]'),
-      'right-click hello.txt');
-  await test.waitForElement(menuNoShareWith);
-
-  // Select 'My files' in directory tree to show Downloads in file list.
-  assertTrue(test.fakeMouseClick(myFiles), 'click My files');
-  await test.waitForElement(downloads);
-
-  // Right-click 'Downloads' directory.
-  // Check 'Share with <VM>' is shown in menu.
-  assertTrue(test.fakeMouseRightClick(downloads), 'right-click downloads');
-  await test.waitForElement(menuShareWith);
-
-  // Right-click 'MyFiles' in directory tree.
-  // Check 'Share with <VM>' is shown in menu.
-  assertTrue(test.fakeMouseRightClick(myFiles), 'MyFiles dirtree');
-  await test.waitForElement(menuShareWithDirTree);
-
-  // Select removable root.
+  // Verify share for removable root.
   test.mountRemovable();
-  await test.waitForElement(removableVolumeRoot);
-
-  // Right-click 'MyUSB' removable root.
-  // Check 'Share with <VM>' is shown in menu.
-  assertTrue(test.fakeMouseRightClick(removableVolumeRoot), 'removable root');
-  await test.waitForElement(menuShareWithVolumeRoot);
+  await test.waitForElement(removableRoot);
+  await shareBase.verifyShareWithDialog(
+      'Removable root', removableRoot, menuShareWithVolumeRoot,
+      shareWithVolumeRoot, givePermission + 'files in the MyUSB folder');
 
   // Select 'Linux files' in directory tree to show dir A in file list.
-  await test.waitForElement(linuxFiles);
+  await test.waitForElement(fakeLinuxFiles);
 
-  assertTrue(test.fakeMouseClick(linuxFiles), 'click Linux files');
+  assertTrue(test.fakeMouseClick(fakeLinuxFiles), 'click Linux files');
   await test.waitForFiles(
       test.TestEntryInfo.getExpectedRows(test.BASIC_CROSTINI_ENTRY_SET));
 
+  // Set DRIVE_FS_ENABLED=false, and check that 'Share with <VM>' is not shown.
+  loadTimeData.data_['DRIVE_FS_ENABLED'] = false;
   // Check 'Share with <VM>' is not shown in menu.
   assertTrue(
       test.fakeMouseRightClick('#file-list [file-name="A"]'),
@@ -236,43 +194,66 @@
       test.TestEntryInfo.getExpectedRows(test.BASIC_DRIVE_ENTRY_SET));
 
   // Check 'Share with <VM>' is not shown in menu.
-  assertTrue(
-      test.fakeMouseRightClick('#file-list [file-name="photos"]'),
-      'right-click photos');
+  assertTrue(test.fakeMouseRightClick(photos), 'right-click photos');
   await test.waitForElement(menuNoShareWith);
 
   // Close menu by clicking file-list.
   assertTrue(test.fakeMouseClick('#file-list'));
   await test.waitForElement(menuHidden);
 
-  // Set DRIVE_FS_ENABLED, and check that 'Share with <VM>' is shown.
+  // Set DRIVE_FS_ENABLED=true, and check that 'Share with <VM>' is shown.
   loadTimeData.data_['DRIVE_FS_ENABLED'] = true;
-  // Check 'Share with <VM>' is not shown in menu.
-  assertTrue(
-      test.fakeMouseRightClick('#file-list [file-name="photos"]'),
-      'right-click photos');
+  // Check 'Share with <VM>' is shown in menu.
+  assertTrue(test.fakeMouseRightClick(photos), 'right-click photos');
   await test.waitForElement(menuShareWith);
 
-  // Reset Linux files back to unmounted.
-  chrome.fileManagerPrivate.removeMount('crostini');
-  await test.waitForElement(
-      '#directory-tree .tree-item [root-type-icon="crostini"]');
+  // Verify share with dialog for MyDrive.
+  await shareBase.verifyShareWithDialog(
+      'My Drive', googleDrive, menuShareWithVolumeRoot, shareWithVolumeRoot,
+      givePermission + 'files in your Google Drive. ' +
+          'Changes will sync to your other devices.');
 
-  // Unset DRIVE_FS_ENABLED.
-  loadTimeData.data_['DRIVE_FS_ENABLED'] = false;
-  // Clear Crostini shared folders.
-  fileManager.crostini.unregisterSharedPath(vmName, alreadySharedPhotosDir);
+  // Verify no share for Play files root.
+  /** @type {MockFileSystem} */ (
+      mockVolumeManager
+          .getCurrentProfileVolumeInfo(
+              VolumeManagerCommon.VolumeType.ANDROID_FILES)
+          .fileSystem)
+      .populate(['/Pictures/']);
+  test.mountAndroidFiles();
+  await test.waitForElement(androidRoot);
+  assertTrue(test.fakeMouseRightClick(androidRoot), 'right-click Play files');
+  await test.waitForElement(menuNoShareWithDirTree);
+
+  // Verify share for folders under Play files root.
+  assertTrue(test.fakeMouseClick(androidRoot), 'click Play files');
+  const pictures = '#file-list [file-name="Pictures"]';
+  await test.waitForElement(pictures);
+  assertTrue(test.fakeMouseRightClick(pictures), 'right-click Pictures');
+  await test.waitForElement(menuShareWith);
+
+  // Reset Linux files and Play files back to unmounted.
+  chrome.fileManagerPrivate.removeMount('crostini');
+  await test.waitForElement(fakeLinuxFiles);
+  chrome.fileManagerPrivate.removeMount('android_files');
+
+  // Restore fmp.*.
+  chrome.fileManagerPrivate.sharePathsWithCrostini = oldSharePaths;
+  // Restore Crostini.unregisterSharedPath.
+  fileManager.crostini.unregisterSharedPath = oldCrostiniUnregister;
   done();
 };
 
-crostiniShare.testSharePathShown = done => {
-  shareBase.testSharePathShown(
-      shareBase.vmNameTermina, shareBase.vmNameSelectorLinux, done);
+crostiniShare.testSharePaths = done => {
+  shareBase.testSharePaths(
+      shareBase.vmNameTermina, shareBase.vmNameSelectorLinux,
+      shareBase.enumUmaShareWithLinux, done);
 };
 
-pluginVmShare.testSharePathShown = done => {
-  shareBase.testSharePathShown(
-      shareBase.vmNamePluginVm, shareBase.vmNameSelectorPluginVm, done);
+pluginVmShare.testSharePaths = done => {
+  shareBase.testSharePaths(
+      shareBase.vmNamePluginVm, shareBase.vmNameSelectorPluginVm,
+      shareBase.enumUmaShareWithPluginVm, done);
 };
 
 // Verify gear menu 'Manage ? sharing'.
diff --git a/ui/file_manager/file_manager/test/js/strings.js b/ui/file_manager/file_manager/test/js/strings.js
index 5d8a144..7a32af3 100644
--- a/ui/file_manager/file_manager/test/js/strings.js
+++ b/ui/file_manager/file_manager/test/js/strings.js
@@ -10,7 +10,7 @@
 // Extend with additional fields not found in grdp files.
 loadTimeData.overrideValues({
   'CROSTINI_ENABLED': true,
-  'DRIVE_FS_ENABLED': false,
+  'DRIVE_FS_ENABLED': true,
   'GOOGLE_DRIVE_REDEEM_URL': 'http://www.google.com/intl/en/chrome/devices' +
       '/goodies.html?utm_source=filesapp&utm_medium=banner&utm_campaign=gsg',
   'GOOGLE_DRIVE_OVERVIEW_URL':
@@ -26,4 +26,4 @@
 // Overwrite LoadTimeData.prototype.data setter as nop.
 // Default implementation throws errors when both background and
 // foreground re-set loadTimeData.data.
-Object.defineProperty(LoadTimeData.prototype, 'data', {set: () => {}});
\ No newline at end of file
+Object.defineProperty(LoadTimeData.prototype, 'data', {set: () => {}});
diff --git a/ui/file_manager/file_manager/test/js/test_util.js b/ui/file_manager/file_manager/test/js/test_util.js
index ba62bc7..b489489d 100644
--- a/ui/file_manager/file_manager/test/js/test_util.js
+++ b/ui/file_manager/file_manager/test/js/test_util.js
@@ -447,42 +447,55 @@
               'MyUSB')
           .fileSystem);
   fsRemovable.populate([], true);
+
+  const fsAndroidFiles = /** @type {MockFileSystem} */ (
+      mockVolumeManager
+          .createVolumeInfo(
+              VolumeManagerCommon.VolumeType.ANDROID_FILES, 'android_files',
+              str('ANDROID_FILES_ROOT_LABEL'))
+          .fileSystem);
+  fsAndroidFiles.populate([], true);
+};
+
+/**
+ * Sends mount event.
+ * @param {!VolumeManagerCommon.VolumeType} volumeType
+ * @param {string} volumeId
+ */
+test.mount = function(volumeType, volumeId) {
+  chrome.fileManagerPrivate.onMountCompleted.dispatchEvent({
+    status: 'success',
+    eventType: 'mount',
+    volumeMetadata: {
+      volumeType: volumeType,
+      volumeId: volumeId,
+      isReadOnly: false,
+      iconSet: {},
+      profile: {isCurrentProfile: true, displayName: ''},
+      mountContext: 'user',
+    },
+  });
 };
 
 /**
  * Sends mount event for crostini volume.
  */
 test.mountCrostini = function() {
-  chrome.fileManagerPrivate.onMountCompleted.dispatchEvent({
-    status: 'success',
-    eventType: 'mount',
-    volumeMetadata: {
-      volumeType: VolumeManagerCommon.VolumeType.CROSTINI,
-      volumeId: 'crostini',
-      isReadOnly: false,
-      iconSet: {},
-      profile: {isCurrentProfile: true, displayName: ''},
-      mountContext: 'user',
-    },
-  });
+  test.mount(VolumeManagerCommon.VolumeType.CROSTINI, 'crostini');
 };
 
 /**
- * Sends mount event for crostini volume.
+ * Sends mount event for removable volume.
  */
 test.mountRemovable = function() {
-  chrome.fileManagerPrivate.onMountCompleted.dispatchEvent({
-    status: 'success',
-    eventType: 'mount',
-    volumeMetadata: {
-      volumeType: VolumeManagerCommon.VolumeType.REMOVABLE,
-      volumeId: 'removable:MyUSB',
-      isReadOnly: false,
-      iconSet: {},
-      profile: {isCurrentProfile: true, displayName: ''},
-      mountContext: 'user',
-    },
-  });
+  test.mount(VolumeManagerCommon.VolumeType.REMOVABLE, 'removable:MyUSB');
+};
+
+/**
+ * Sends mount event for android files volume.
+ */
+test.mountAndroidFiles = function() {
+  test.mount(VolumeManagerCommon.VolumeType.ANDROID_FILES, 'android_files');
 };
 
 /**
diff --git a/ui/file_manager/image_loader/piex_loader.js b/ui/file_manager/image_loader/piex_loader.js
index 23c35e9..2f902ea 100644
--- a/ui/file_manager/image_loader/piex_loader.js
+++ b/ui/file_manager/image_loader/piex_loader.js
@@ -25,11 +25,11 @@
  * but only declare the parts required for PIEX work.
  * @typedef {{
  *   calledRun: boolean,
- *   onAbort: function(!Error):undefined,
+ *   onAbort: function((!Error|string)):undefined,
  *   HEAP8: !Uint8Array,
  *   _malloc: function(number):number,
  *   _free: function(number):undefined,
- *   image: function(number, number):Object
+ *   image: function(number, number):PiexWasmImageResult
  * }}
  */
 var PiexWasmModule;
@@ -41,15 +41,15 @@
 var Module = window['Module'] || {};
 
 /**
- * Set true only if the Module.onAbort() handler is called.
+ * Set true only if the wasm Module.onAbort() handler is called.
  * @type {boolean}
  */
 let wasmFailed = false;
 
 /**
  * Installs an (Emscripten) wasm Module.onAbort handler, that records that
- * the Module has failed and then re-throws the error.
- * @throws
+ * the Module has failed and re-throws the error.
+ * @throws {!Error|string}
  */
 Module.onAbort = (error) => {
   wasmFailed = true;
@@ -233,7 +233,8 @@
 
   this.naclPromise_ =
       new Promise(function(fulfill) {
-        chrome.fileManagerPrivate.isPiexLoaderEnabled(fulfill);
+        const useNacl = !useWasm;
+        fulfill(useNacl);
       })
           .then(function(enabled) {
             if (!enabled) {
@@ -429,6 +430,149 @@
 }
 
 /**
+ * Piex wasm extacts the preview image metadata from a raw image. The preview
+ * image |format| is either 0 (JPEG) or 1 (RGB), and has a |colorSpace| (sRGB
+ * or AdobeRGB1998) and a JETA EXIF image |orientation|.
+ *
+ * An RGB format preview image has both |width| and |height|, but JPEG format
+ * previews have neither (PIEX C++ does not attempt to parse/decode JPEG).
+ *
+ * The |offset| to, and |length| of, the preview image relative to the source
+ * data is indicated by those fields, and they are never 0. Note their values
+ * are controlled by a third-party and are untrustworthy (Security).
+ *
+ * @typedef {{
+ *  format:number,
+ *  colorSpace:ColorSpace,
+ *  orientation:number,
+ *  width:?number,
+ *  height:?number,
+ *  offset:number,
+ *  length:number
+ * }}
+ */
+var PiexWasmPreviewImageMetadata;
+
+/**
+ * The piex wasm Module.image(<raw image source>,...) API returns |error|, or
+ * else the source |preview| and/or |thumbnail| image metadata.
+ *
+ * FilesApp (and related) only use |preview| images. Preview images are JPEG.
+ * The |thumbnail| images are small, lower-quality, JPEG or RGB format images
+ * and are not currently used in FilesApp.
+ *
+ * @typedef {{
+ *  error:?string,
+ *  preview:?PiexWasmPreviewImageMetadata,
+ *  thumbnail:?PiexWasmPreviewImageMetadata
+ * }}
+ */
+var PiexWasmImageResult;
+
+/**
+ * Piex wasm raw image preview image extractor.
+ */
+class ImageBuffer {
+  /**
+   * @param {!ArrayBuffer} buffer - raw image source data.
+   * @param {number} id - caller-defined id.
+   */
+  constructor(buffer, id) {
+    /**
+     * @type {number}
+     * @const
+     * @private
+     */
+    this.id = id;
+
+    /**
+     * @type {!Uint8Array}
+     * @const
+     * @private
+     */
+    this.source = new Uint8Array(buffer);
+
+    /**
+     * @type {number}
+     * @const
+     * @private
+     */
+    this.length = buffer.byteLength;
+
+    /**
+     * @type {number}
+     * @private
+     */
+    this.memory = 0;
+  }
+
+  /**
+   * Calls Module.image() to process |this.source|, and returns the result.
+   * @return {!PiexWasmImageResult}
+   * @throws {!Error}
+   */
+  process() {
+    this.memory = Module._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);
+
+    if (result.error) {
+      throw new Error(result.error);
+    }
+
+    return result;
+  }
+
+  /**
+   * Returns the preview image data. If no preview image was found, returns
+   * an empty preview image.
+   *
+   * @param {!PiexWasmImageResult} result
+   *
+   * @throws {!Error} Data access security error.
+   *
+   * @return {{id:number, thumbnail:!ArrayBuffer, orientation:number,
+   *          colorSpace: ColorSpace}}
+   */
+  preview(result) {
+    const preview = result.preview;
+    if (!preview) {
+      return {
+        thumbnail: new ArrayBuffer(0),
+        colorSpace: ColorSpace.SRGB,
+        orientation: 1,
+        id: this.id,
+      };
+    }
+
+    const offset = preview.offset;
+    const length = preview.length;
+    if (offset > this.length || (this.length - offset) < length) {
+      throw new Error('Preview image access failed');
+    }
+
+    const view = new Uint8Array(this.source.buffer, offset, length);
+    return {
+      thumbnail: new Uint8Array(view).buffer,
+      orientation: preview.orientation,
+      colorSpace: preview.colorSpace,
+      id: this.id,
+    };
+  }
+
+  /**
+   * Release resources.
+   */
+  close() {
+    Module._free(this.memory);
+  }
+}
+
+/**
  * Starts to load RAW image.
  * @param {string} url
  * @return {!Promise<!PiexLoaderResponse>}
@@ -441,6 +585,30 @@
     this.unloadTimer_ = 0;
   }
 
+  if (useWasm) {
+    let imageBuffer;
+    return readFromFileSystem(url)
+        .then((buffer) => {
+          if (wasmModuleFailed() === true) {
+            return Promise.reject('piex wasm module failed');
+          }
+          imageBuffer = new ImageBuffer(buffer, requestId);
+          return imageBuffer.process();
+        })
+        .then((result) => {
+          imageBuffer.close();
+          return new PiexLoaderResponse(imageBuffer.preview(result));
+        })
+        .catch((error) => {
+          if (wasmModuleFailed() === true) {
+            return Promise.reject('piex wasm module failed');
+          }
+          imageBuffer && imageBuffer.close();
+          console.error('[PiexLoader] ' + error);
+          return Promise.reject(error);
+        });
+  }
+
   // Prevents unloading the NaCl module during handling the promises below.
   this.requests_[requestId] = null;
 
diff --git a/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js b/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
index cb6532c..bbfd4c9 100644
--- a/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
+++ b/ui/file_manager/integration_tests/file_manager/directory_tree_context_menu.js
@@ -810,7 +810,6 @@
    */
   testcase.dirContextMenuPlayFiles = async () => {
     const playFilesMenus = [
-      ['#share-with-linux', true],
       ['#new-folder', false],
     ];
     const folderMenus = [
diff --git a/ui/file_manager/integration_tests/file_manager/file_list.js b/ui/file_manager/integration_tests/file_manager/file_list.js
new file mode 100644
index 0000000..78868cf
--- /dev/null
+++ b/ui/file_manager/integration_tests/file_manager/file_list.js
@@ -0,0 +1,30 @@
+// 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.
+
+'use strict';
+
+(() => {
+  /**
+   * Tests that file list column header have ARIA attributes.
+   */
+  testcase.fileListAriaAttributes = async () => {
+    const appId = await setupAndWaitUntilReady(
+        RootPath.DOWNLOADS, [ENTRIES.beautiful], []);
+
+    // Fetch column header.
+    const columnHeadersQuery =
+        ['#detail-table .table-header [aria-describedby]'];
+    const columnHeaders = await remoteCall.callRemoteTestUtil(
+        'deepQueryAllElements', appId, [columnHeadersQuery, ['display']]);
+
+    chrome.test.assertTrue(columnHeaders.length > 0);
+    for (const header of columnHeaders) {
+      // aria-describedby is used to tell users that they can click and which
+      // type of sort asc/desc will happen.
+      chrome.test.assertTrue('aria-describedby' in header.attributes);
+      // role button is used so users know that it's clickable.
+      chrome.test.assertEq('button', header.attributes.role);
+    }
+  };
+})();
diff --git a/ui/file_manager/integration_tests/file_manager_test_manifest.json b/ui/file_manager/integration_tests/file_manager_test_manifest.json
index 1ce76be6..73b9c03 100644
--- a/ui/file_manager/integration_tests/file_manager_test_manifest.json
+++ b/ui/file_manager/integration_tests/file_manager_test_manifest.json
@@ -13,17 +13,16 @@
       "test_util.js",
       "remote_call.js",
       "file_manager/background.js",
-      "file_manager/test_util_unittest.js",
       "file_manager/context_menu.js",
       "file_manager/copy_between_windows.js",
       "file_manager/create_new_folder.js",
       "file_manager/crostini.js",
       "file_manager/delete.js",
-      "file_manager/details_panel.js",
       "file_manager/directory_tree_context_menu.js",
       "file_manager/drive_specific.js",
       "file_manager/file_dialog.js",
       "file_manager/file_display.js",
+      "file_manager/file_list.js",
       "file_manager/files_tooltip.js",
       "file_manager/folder_shortcuts.js",
       "file_manager/gear_menu.js",
diff --git a/ui/gl/vsync_thread_win.cc b/ui/gl/vsync_thread_win.cc
index 98460e34..cfb1d2d 100644
--- a/ui/gl/vsync_thread_win.cc
+++ b/ui/gl/vsync_thread_win.cc
@@ -95,11 +95,11 @@
     }
   }
 
-  if (window_output_) {
-    window_output_->WaitForVBlank();
-  } else {
-    Sleep(static_cast<DWORD>(interval.InMilliseconds()));
-  }
+  bool wait_for_vblank_succeeded =
+      window_output_ && SUCCEEDED(window_output_->WaitForVBlank());
+
+  if (!wait_for_vblank_succeeded)
+    Sleep(static_cast<DWORD>(interval.InMillisecondsRoundedUp()));
 
   base::AutoLock auto_lock(lock_);
   DCHECK(started_);
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
index 1e5aa6f..0529f8b 100644
--- a/ui/ozone/platform/wayland/BUILD.gn
+++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -66,6 +66,8 @@
     "host/wayland_screen.h",
     "host/wayland_shared_memory_buffer_manager.cc",
     "host/wayland_shared_memory_buffer_manager.h",
+    "host/wayland_shm.cc",
+    "host/wayland_shm.h",
     "host/wayland_shm_buffer.cc",
     "host/wayland_shm_buffer.h",
     "host/wayland_touch.cc",
diff --git a/ui/ozone/platform/wayland/gpu/wayland_connection_proxy.cc b/ui/ozone/platform/wayland/gpu/wayland_connection_proxy.cc
index 8662e20..479bc11 100644
--- a/ui/ozone/platform/wayland/gpu/wayland_connection_proxy.cc
+++ b/ui/ozone/platform/wayland/gpu/wayland_connection_proxy.cc
@@ -150,6 +150,22 @@
     base::File file,
     size_t length,
     const gfx::Size size) {
+  DCHECK(gpu_thread_runner_);
+  // Do a mojo call on the GpuMainThread instead of the io child thread to
+  // ensure proper functionality.
+  gpu_thread_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&WaylandConnectionProxy::CreateShmBufferInternal,
+                     base::Unretained(this), widget, std::move(file), length,
+                     std::move(size)));
+}
+
+void WaylandConnectionProxy::CreateShmBufferInternal(
+    gfx::AcceleratedWidget widget,
+    base::File file,
+    size_t length,
+    const gfx::Size size) {
+  DCHECK(gpu_thread_runner_->BelongsToCurrentThread());
   if (!wc_ptr_.is_bound())
     BindHostInterface();
 
@@ -160,11 +176,36 @@
 void WaylandConnectionProxy::PresentShmBufferForWidget(
     gfx::AcceleratedWidget widget,
     const gfx::Rect& damage) {
+  DCHECK(gpu_thread_runner_);
+  // Do a mojo call on the GpuMainThread instead of the io child thread to
+  // ensure proper functionality.
+  gpu_thread_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&WaylandConnectionProxy::PresentShmBufferForWidgetInternal,
+                     base::Unretained(this), widget, damage));
+}
+
+void WaylandConnectionProxy::PresentShmBufferForWidgetInternal(
+    gfx::AcceleratedWidget widget,
+    const gfx::Rect& damage) {
+  DCHECK(gpu_thread_runner_->BelongsToCurrentThread());
   DCHECK(wc_ptr_);
   wc_ptr_->PresentShmBufferForWidget(widget, damage);
 }
 
 void WaylandConnectionProxy::DestroyShmBuffer(gfx::AcceleratedWidget widget) {
+  DCHECK(gpu_thread_runner_);
+  // Do a mojo call on the GpuMainThread instead of the io child thread to
+  // ensure proper functionality.
+  gpu_thread_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&WaylandConnectionProxy::DestroyShmBufferInternal,
+                     base::Unretained(this), widget));
+}
+
+void WaylandConnectionProxy::DestroyShmBufferInternal(
+    gfx::AcceleratedWidget widget) {
+  DCHECK(gpu_thread_runner_->BelongsToCurrentThread());
   DCHECK(wc_ptr_);
   wc_ptr_->DestroyShmBuffer(widget);
 }
diff --git a/ui/ozone/platform/wayland/gpu/wayland_connection_proxy.h b/ui/ozone/platform/wayland/gpu/wayland_connection_proxy.h
index 9280bcc..f367ca9 100644
--- a/ui/ozone/platform/wayland/gpu/wayland_connection_proxy.h
+++ b/ui/ozone/platform/wayland/gpu/wayland_connection_proxy.h
@@ -150,6 +150,14 @@
   void DestroyZwpLinuxDmabufInternal(gfx::AcceleratedWidget widget,
                                      uint32_t buffer_id);
 
+  void CreateShmBufferInternal(gfx::AcceleratedWidget widget,
+                               base::File file,
+                               size_t length,
+                               const gfx::Size size);
+  void PresentShmBufferForWidgetInternal(gfx::AcceleratedWidget widget,
+                                         const gfx::Rect& damage);
+  void DestroyShmBufferInternal(gfx::AcceleratedWidget widget);
+
   void BindHostInterface();
 
   // Non-owned pointer to a WaylandConnection. It is only used in a single
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc
index 9d3fe04..d241780 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.cc
+++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -25,6 +25,7 @@
 #include "ui/ozone/platform/wayland/host/wayland_input_method_context.h"
 #include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
 #include "ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.h"
+#include "ui/ozone/platform/wayland/host/wayland_shm.h"
 #include "ui/ozone/platform/wayland/host/wayland_window.h"
 #include "ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.h"
 
@@ -403,8 +404,9 @@
     if (!connection->subcompositor_)
       LOG(ERROR) << "Failed to bind to wl_subcompositor global";
   } else if (!connection->shm_ && strcmp(interface, "wl_shm") == 0) {
-    connection->shm_ =
+    wl::Object<wl_shm> shm =
         wl::Bind<wl_shm>(registry, name, std::min(version, kMaxShmVersion));
+    connection->shm_ = std::make_unique<WaylandShm>(shm.release(), connection);
     if (!connection->shm_)
       LOG(ERROR) << "Failed to bind to wl_shm global";
     connection->shm_buffer_manager_ =
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h
index 3f9d12dd..2b06d42 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.h
+++ b/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -35,6 +35,7 @@
 class WaylandOutputManager;
 class WaylandWindow;
 class WaylandZwpLinuxDmabuf;
+class WaylandShm;
 
 class WaylandConnection : public PlatformEventSource,
                           public ozone::mojom::WaylandConnection,
@@ -105,7 +106,6 @@
   wl_display* display() const { return display_.get(); }
   wl_compositor* compositor() const { return compositor_.get(); }
   wl_subcompositor* subcompositor() const { return subcompositor_.get(); }
-  wl_shm* shm() const { return shm_.get(); }
   xdg_shell* shell() const { return shell_.get(); }
   zxdg_shell_v6* shell_v6() const { return shell_v6_.get(); }
   wl_seat* seat() const { return seat_.get(); }
@@ -152,6 +152,8 @@
 
   WaylandZwpLinuxDmabuf* zwp_dmabuf() const { return zwp_dmabuf_.get(); }
 
+  WaylandShm* shm() const { return shm_.get(); }
+
   // Returns bound pointer to own mojo interface.
   ozone::mojom::WaylandConnectionPtr BindInterface();
 
@@ -237,7 +239,6 @@
   wl::Object<wl_compositor> compositor_;
   wl::Object<wl_subcompositor> subcompositor_;
   wl::Object<wl_seat> seat_;
-  wl::Object<wl_shm> shm_;
   wl::Object<xdg_shell> shell_;
   wl::Object<zxdg_shell_v6> shell_v6_;
   wl::Object<wp_presentation> presentation_;
@@ -254,6 +255,7 @@
   std::unique_ptr<WaylandCursorPosition> wayland_cursor_position_;
   std::unique_ptr<WaylandShmBufferManager> shm_buffer_manager_;
   std::unique_ptr<WaylandZwpLinuxDmabuf> zwp_dmabuf_;
+  std::unique_ptr<WaylandShm> shm_;
 
   // Objects that are using when GPU runs in own process.
   std::unique_ptr<WaylandBufferManager> buffer_manager_;
diff --git a/ui/ozone/platform/wayland/host/wayland_cursor.cc b/ui/ozone/platform/wayland/host/wayland_cursor.cc
index d397281..85b16dc 100644
--- a/ui/ozone/platform/wayland/host/wayland_cursor.cc
+++ b/ui/ozone/platform/wayland/host/wayland_cursor.cc
@@ -11,6 +11,7 @@
 #include "ui/gfx/skia_util.h"
 #include "ui/ozone/platform/wayland/common/wayland_util.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_shm.h"
 
 namespace ui {
 
diff --git a/ui/ozone/platform/wayland/host/wayland_cursor.h b/ui/ozone/platform/wayland/host/wayland_cursor.h
index bad636c..c2890f9 100644
--- a/ui/ozone/platform/wayland/host/wayland_cursor.h
+++ b/ui/ozone/platform/wayland/host/wayland_cursor.h
@@ -26,6 +26,7 @@
 namespace ui {
 
 class WaylandConnection;
+class WaylandShm;
 
 // Manages the actual visual representation (what users see drawn) of the
 // 'pointer' (which is the Wayland term for mouse/mice).
@@ -54,7 +55,7 @@
 
   void HideCursor(uint32_t serial);
 
-  wl_shm* shm_ = nullptr;                // Owned by WaylandConnection.
+  WaylandShm* shm_ = nullptr;            // Owned by WaylandConnection.
   wl_pointer* input_pointer_ = nullptr;  // Owned by WaylandPointer.
 
   // Holds the buffers and their memory until the compositor releases them.
diff --git a/ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.cc b/ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.cc
index af129fe..283f92a5 100644
--- a/ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.cc
+++ b/ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.cc
@@ -8,19 +8,11 @@
 
 #include "base/trace_event/trace_event.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_shm.h"
 #include "ui/ozone/platform/wayland/host/wayland_window.h"
 
 namespace ui {
 
-WaylandShmBufferManager::ShmBuffer::ShmBuffer() = default;
-
-WaylandShmBufferManager::ShmBuffer::ShmBuffer(
-    wl::Object<struct wl_buffer> buffer,
-    wl::Object<struct wl_shm_pool> pool)
-    : shm_buffer(std::move(buffer)), shm_pool(std::move(pool)) {}
-
-WaylandShmBufferManager::ShmBuffer::~ShmBuffer() = default;
-
 WaylandShmBufferManager::WaylandShmBufferManager(WaylandConnection* connection)
     : connection_(connection) {}
 
@@ -43,20 +35,11 @@
   if (it != shm_buffers_.end())
     return false;
 
-  wl::Object<wl_shm_pool> pool(
-      wl_shm_create_pool(connection_->shm(), fd.get(), length));
-  if (!pool)
+  auto buffer = connection_->shm()->CreateBuffer(std::move(fd), length, size);
+  if (!buffer)
     return false;
 
-  wl::Object<wl_buffer> shm_buffer(
-      wl_shm_pool_create_buffer(pool.get(), 0, size.width(), size.height(),
-                                size.width() * 4, WL_SHM_FORMAT_ARGB8888));
-  if (!shm_buffer)
-    return false;
-
-  shm_buffers_.insert(std::make_pair(
-      widget,
-      std::make_unique<ShmBuffer>(std::move(shm_buffer), std::move(pool))));
+  shm_buffers_.insert(std::make_pair(widget, std::move(buffer)));
 
   connection_->ScheduleFlush();
   return true;
@@ -77,7 +60,7 @@
   wl_surface* surface = connection_->GetWindow(widget)->surface();
   wl_surface_damage(surface, damage.x(), damage.y(), damage.width(),
                     damage.height());
-  wl_surface_attach(surface, it->second->shm_buffer.get(), 0, 0);
+  wl_surface_attach(surface, it->second.get(), 0, 0);
   wl_surface_commit(surface);
   connection_->ScheduleFlush();
   return true;
diff --git a/ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.h b/ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.h
index e10ffe6..5d4a4838 100644
--- a/ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.h
+++ b/ui/ozone/platform/wayland/host/wayland_shared_memory_buffer_manager.h
@@ -45,25 +45,8 @@
   bool DestroyBuffer(gfx::AcceleratedWidget widget);
 
  private:
-  // Internal representation of a shared memory buffer.
-  struct ShmBuffer {
-    ShmBuffer();
-    ShmBuffer(wl::Object<struct wl_buffer> buffer,
-              wl::Object<struct wl_shm_pool> pool);
-    ~ShmBuffer();
-
-    // A wl_buffer backed by a shared memory handle passed from the gpu process.
-    wl::Object<struct wl_buffer> shm_buffer;
-
-    // Is used to create shared memory based buffer objects.
-    wl::Object<struct wl_shm_pool> shm_pool;
-
-    DISALLOW_COPY_AND_ASSIGN(ShmBuffer);
-  };
-
   // A container of created buffers.
-  base::flat_map<gfx::AcceleratedWidget, std::unique_ptr<ShmBuffer>>
-      shm_buffers_;
+  base::flat_map<gfx::AcceleratedWidget, wl::Object<wl_buffer>> shm_buffers_;
 
   // Non-owned pointer to the main connection.
   WaylandConnection* connection_ = nullptr;
diff --git a/ui/ozone/platform/wayland/host/wayland_shm.cc b/ui/ozone/platform/wayland/host/wayland_shm.cc
new file mode 100644
index 0000000..9128e31e
--- /dev/null
+++ b/ui/ozone/platform/wayland/host/wayland_shm.cc
@@ -0,0 +1,41 @@
+// 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 "ui/ozone/platform/wayland/host/wayland_shm.h"
+
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+
+namespace ui {
+
+namespace {
+
+constexpr uint32_t kShmFormat = WL_SHM_FORMAT_ARGB8888;
+
+}  // namespace
+
+WaylandShm::WaylandShm(wl_shm* shm, WaylandConnection* connection)
+    : shm_(shm), connection_(connection) {}
+
+WaylandShm::~WaylandShm() = default;
+
+wl::Object<wl_buffer> WaylandShm::CreateBuffer(base::ScopedFD fd,
+                                               size_t length,
+                                               const gfx::Size& size) {
+  if (!fd.is_valid() || length == 0 || size.IsEmpty())
+    return wl::Object<wl_buffer>(nullptr);
+
+  wl::Object<wl_shm_pool> pool(
+      wl_shm_create_pool(shm_.get(), fd.get(), length));
+  if (!pool)
+    return wl::Object<wl_buffer>(nullptr);
+
+  wl::Object<wl_buffer> shm_buffer(
+      wl_shm_pool_create_buffer(pool.get(), 0, size.width(), size.height(),
+                                size.width() * 4, kShmFormat));
+
+  connection_->ScheduleFlush();
+  return shm_buffer;
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_shm.h b/ui/ozone/platform/wayland/host/wayland_shm.h
new file mode 100644
index 0000000..4f7f13e
--- /dev/null
+++ b/ui/ozone/platform/wayland/host/wayland_shm.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 UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SHM_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SHM_H_
+
+#include <memory>
+
+#include "base/files/scoped_file.h"
+#include "base/macros.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/ozone/platform/wayland/common/wayland_object.h"
+#include "ui/ozone/platform/wayland/common/wayland_util.h"
+
+namespace ui {
+
+class WaylandConnection;
+
+// Wrapper around |wl_shm| Wayland factory, which creates
+// |wl_buffer|s backed by a fd to a shared memory.
+class WaylandShm {
+ public:
+  WaylandShm(wl_shm* shm, WaylandConnection* connection);
+  ~WaylandShm();
+
+  // Creates a wl_buffer based on shared memory handle for the specified
+  // |widget|.
+  wl::Object<struct wl_buffer> CreateBuffer(base::ScopedFD fd,
+                                            size_t length,
+                                            const gfx::Size& size);
+
+ private:
+  wl::Object<wl_shm> const shm_;
+
+  // Non-owned pointer to the main connection.
+  WaylandConnection* const connection_;
+
+  DISALLOW_COPY_AND_ASSIGN(WaylandShm);
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_SHM_H_
diff --git a/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc b/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
index 9a17e35..298ea68b 100644
--- a/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
+++ b/ui/ozone/platform/wayland/host/wayland_shm_buffer.cc
@@ -8,16 +8,11 @@
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "ui/gfx/skia_util.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
-
-namespace {
-
-const uint32_t kShmFormat = WL_SHM_FORMAT_ARGB8888;
-
-}  // namespace
+#include "ui/ozone/platform/wayland/host/wayland_shm.h"
 
 namespace ui {
 
-WaylandShmBuffer::WaylandShmBuffer(wl_shm* shm, const gfx::Size& size)
+WaylandShmBuffer::WaylandShmBuffer(WaylandShm* shm, const gfx::Size& size)
     : size_(size) {
   Initialize(shm);
 }
@@ -27,7 +22,7 @@
 WaylandShmBuffer& WaylandShmBuffer::operator=(WaylandShmBuffer&& buffer) =
     default;
 
-void WaylandShmBuffer::Initialize(wl_shm* shm) {
+void WaylandShmBuffer::Initialize(WaylandShm* shm) {
   DCHECK(shm);
 
   SkImageInfo info = SkImageInfo::MakeN32Premul(size_.width(), size_.height());
@@ -48,18 +43,15 @@
       base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
           std::move(shared_memory_region));
 
-  wl::Object<wl_shm_pool> pool(wl_shm_create_pool(
-      shm, platform_shared_memory.GetPlatformHandle().fd, buffer_size));
-
-  auto* new_buffer = wl_shm_pool_create_buffer(
-      pool.get(), 0, size_.width(), size_.height(), stride, kShmFormat);
-  if (!new_buffer) {
+  base::subtle::ScopedFDPair fd_pair =
+      platform_shared_memory.PassPlatformHandle();
+  buffer_ = shm->CreateBuffer(std::move(fd_pair.fd), buffer_size, size_);
+  if (!buffer_) {
     shared_memory_mapping_ = base::WritableSharedMemoryMapping();
     return;
   }
 
   stride_ = stride;
-  buffer_.reset(new_buffer);
 }
 
 uint8_t* WaylandShmBuffer::GetMemory() const {
diff --git a/ui/ozone/platform/wayland/host/wayland_shm_buffer.h b/ui/ozone/platform/wayland/host/wayland_shm_buffer.h
index 1b70920e..a33bf7d1 100644
--- a/ui/ozone/platform/wayland/host/wayland_shm_buffer.h
+++ b/ui/ozone/platform/wayland/host/wayland_shm_buffer.h
@@ -18,6 +18,8 @@
 
 namespace ui {
 
+class WaylandShm;
+
 // Encapsulates a Wayland SHM buffer, covering basically 2 use cases:
 // (1) Buffers created and mmap'ed locally to draw skia bitmap(s) into; and
 // (2) Buffers created using file descriptor (e.g: sent by gpu process/thread,
@@ -26,7 +28,7 @@
 // wl_buffer and WritableSharedMemoryMapping (if any) instance.
 class WaylandShmBuffer {
  public:
-  WaylandShmBuffer(wl_shm* shm, const gfx::Size& size);
+  WaylandShmBuffer(WaylandShm* shm, const gfx::Size& size);
   ~WaylandShmBuffer();
 
   WaylandShmBuffer(WaylandShmBuffer&& buffer);
@@ -49,7 +51,7 @@
   int stride() const { return stride_; }
 
  private:
-  void Initialize(wl_shm* shm);
+  void Initialize(WaylandShm* shm);
 
   gfx::Size size_;
   int stride_;
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb
index a880ddd..1ef0a681 100644
--- a/ui/strings/translations/ui_strings_id.xtb
+++ b/ui/strings/translations/ui_strings_id.xtb
@@ -184,7 +184,7 @@
 <translation id="8098075892845277643">Mulai kueri suara Asisten Google</translation>
 <translation id="8106081041558092062">{HOURS,plural, =1{1 jam yang lalu}other{# jam yang lalu}}</translation>
 <translation id="8131263257437993507">{SECONDS,plural, =1{1 dtk lagi}other{# dtk lagi}}</translation>
-<translation id="8144660977431427332">Penelusuran Anda didukung oleh Asisten Google. <ph name="LEARN_MORE" /></translation>
+<translation id="8144660977431427332">Penelusuran Anda difasilitasi oleh Asisten Google. <ph name="LEARN_MORE" /></translation>
 <translation id="8152264887680882389"><ph name="TEXT" />, Dilengkapi otomatis</translation>
 <translation id="815598010540052116">Gulir ke Bawah</translation>
 <translation id="8170087467028567933">Menghapus saran ini akan menyembunyikannya dari akun Anda di seluruh perangkat.</translation>
diff --git a/ui/strings/translations/ui_strings_zh-TW.xtb b/ui/strings/translations/ui_strings_zh-TW.xtb
index af490972..1897178b 100644
--- a/ui/strings/translations/ui_strings_zh-TW.xtb
+++ b/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -181,7 +181,7 @@
 <translation id="8074552109918343525">{MAX_UNREAD_NOTIFICATIONS,plural, =1{超過 1 則未讀通知}other{超過 # 則未讀通知}}</translation>
 <translation id="8086866675552927481">{MINUTES,plural, =1{1 分鐘內}other{# 分鐘內}}</translation>
 <translation id="8087772101393322318"><ph name="KEY_MODIFIER_NAME" /> + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="8098075892845277643">開啟 Google 助理語音查詢</translation>
+<translation id="8098075892845277643">使用 Google 助理進行語音查詢</translation>
 <translation id="8106081041558092062">{HOURS,plural, =1{1 小時前}other{# 小時前}}</translation>
 <translation id="8131263257437993507">{SECONDS,plural, =1{還剩 1 秒}other{還剩 # 秒}}</translation>
 <translation id="8144660977431427332">你的搜尋結果由 Google 助理提供。<ph name="LEARN_MORE" /></translation>
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 0bedd6d..c73caf1e 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -1092,6 +1092,7 @@
     "//ui/base",
     "//ui/base:test_support",
     "//ui/base/clipboard",
+    "//ui/base/clipboard:clipboard_test_support",
     "//ui/base/ime/init",
     "//ui/compositor:test_support",
     "//ui/events:dom_keycode_converter",
diff --git a/ui/views/border.cc b/ui/views/border.cc
index 1c55530..1840a41 100644
--- a/ui/views/border.cc
+++ b/ui/views/border.cc
@@ -124,7 +124,7 @@
 
   // Overridden from Border:
   void Paint(const View& view, gfx::Canvas* canvas) override;
-  gfx::Insets GetInsets() const override ;
+  gfx::Insets GetInsets() const override;
   gfx::Size GetMinimumSize() const override;
 
  private:
diff --git a/ui/views/cocoa/text_input_host.h b/ui/views/cocoa/text_input_host.h
index e7223fd..e03a683 100644
--- a/ui/views/cocoa/text_input_host.h
+++ b/ui/views/cocoa/text_input_host.h
@@ -21,7 +21,7 @@
 class VIEWS_EXPORT TextInputHost
     : public views_bridge_mac::mojom::TextInputHost {
  public:
-  TextInputHost(BridgedNativeWidgetHostImpl* host_impl);
+  explicit TextInputHost(BridgedNativeWidgetHostImpl* host_impl);
   ~TextInputHost() override;
   void BindRequest(
       views_bridge_mac::mojom::TextInputHostAssociatedRequest request);
diff --git a/ui/views/controls/button/button.h b/ui/views/controls/button/button.h
index 95f20c9..66450e5 100644
--- a/ui/views/controls/button/button.h
+++ b/ui/views/controls/button/button.h
@@ -223,7 +223,7 @@
   // TODO(cyan): Consider having Button implement ButtonControllerDelegate.
   class DefaultButtonControllerDelegate : public ButtonControllerDelegate {
    public:
-    DefaultButtonControllerDelegate(Button* button);
+    explicit DefaultButtonControllerDelegate(Button* button);
     ~DefaultButtonControllerDelegate() override;
 
     // views::ButtonControllerDelegate:
diff --git a/ui/views/controls/button/button_controller_delegate.h b/ui/views/controls/button/button_controller_delegate.h
index 8c32a47..49e5036 100644
--- a/ui/views/controls/button/button_controller_delegate.h
+++ b/ui/views/controls/button/button_controller_delegate.h
@@ -13,7 +13,7 @@
 // ButtonController between different Button types.
 class VIEWS_EXPORT ButtonControllerDelegate {
  public:
-  ButtonControllerDelegate(Button* button) : button_(button) {}
+  explicit ButtonControllerDelegate(Button* button) : button_(button) {}
 
   virtual ~ButtonControllerDelegate() {}
 
diff --git a/ui/views/controls/editable_combobox/editable_combobox.cc b/ui/views/controls/editable_combobox/editable_combobox.cc
index ed3a0de..57541ff 100644
--- a/ui/views/controls/editable_combobox/editable_combobox.cc
+++ b/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -24,6 +24,7 @@
 #include "ui/base/models/menu_separator_types.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/events/event.h"
+#include "ui/events/event_constants.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/font_list.h"
 #include "ui/gfx/geometry/insets.h"
@@ -369,6 +370,32 @@
   ShowDropDownMenu(ui::MENU_SOURCE_KEYBOARD);
 }
 
+bool EditableCombobox::HandleMouseEvent(Textfield* sender,
+                                        const ui::MouseEvent& mouse_event) {
+  // We show the menu on mouse release instead of mouse press so that the menu
+  // showing up doesn't interrupt a potential text selection operation by the
+  // user.
+  // If we don't already have focus when the mouse is pressed, we set
+  // |show_menu_on_next_focus_| to false so that the focus event that will
+  // follow the press event and precede the release event does not end up
+  // showing the menu and interrupting a text selection operation.
+  if (mouse_event.type() == ui::ET_MOUSE_PRESSED && !textfield_->HasFocus())
+    show_menu_on_next_focus_ = false;
+  else if (mouse_event.type() == ui::ET_MOUSE_RELEASED)
+    ShowDropDownMenu(ui::MENU_SOURCE_MOUSE);
+  return false;
+}
+
+bool EditableCombobox::HandleGestureEvent(
+    Textfield* sender,
+    const ui::GestureEvent& gesture_event) {
+  ShowDropDownMenu(ui::MENU_SOURCE_TOUCH);
+  return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// EditableCombobox, View overrides:
+
 void EditableCombobox::OnViewBlurred(View* observed_view) {
   CloseMenu();
 }
diff --git a/ui/views/controls/editable_combobox/editable_combobox.h b/ui/views/controls/editable_combobox/editable_combobox.h
index 3e7b3521..02bcab0 100644
--- a/ui/views/controls/editable_combobox/editable_combobox.h
+++ b/ui/views/controls/editable_combobox/editable_combobox.h
@@ -128,6 +128,10 @@
   // Overridden from TextfieldController:
   void ContentsChanged(Textfield* sender,
                        const base::string16& new_contents) override;
+  bool HandleMouseEvent(Textfield* sender,
+                        const ui::MouseEvent& mouse_event) override;
+  bool HandleGestureEvent(Textfield* sender,
+                          const ui::GestureEvent& gesture_event) override;
 
   // Overridden from ViewObserver:
   void OnViewFocused(View* observed_view) override;
diff --git a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
index bb2f070..42c7e696 100644
--- a/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
+++ b/ui/views/controls/editable_combobox/editable_combobox_unittest.cc
@@ -80,6 +80,7 @@
  protected:
   void ClickArrow();
   void ClickMenuItem(int index);
+  void ClickTextfield();
   bool IsMenuOpen();
   void PerformMouseEvent(Widget* widget,
                          const gfx::Point& point,
@@ -141,6 +142,7 @@
   dummy_focusable_view_->SetID(2);
 
   InitWidget();
+  combobox_->GetTextfieldForTest()->RequestFocus();
   combobox_->RequestFocus();
   combobox_->SizeToPreferredSize();
 }
@@ -183,6 +185,11 @@
   PerformClick(*child_widgets.begin(), middle_of_item);
 }
 
+void EditableComboboxTest::ClickTextfield() {
+  const gfx::Point textfield(combobox_->x() + 1, combobox_->y() + 1);
+  PerformClick(widget_, textfield);
+}
+
 bool EditableComboboxTest::IsMenuOpen() {
   return combobox_->GetMenuRunnerForTest() &&
          combobox_->GetMenuRunnerForTest()->IsRunning();
@@ -224,6 +231,7 @@
 
 TEST_F(EditableComboboxTest, FocusOnTextfieldOpensMenu) {
   InitEditableCombobox();
+  dummy_focusable_view_->RequestFocus();
   EXPECT_FALSE(IsMenuOpen());
   combobox_->GetTextfieldForTest()->RequestFocus();
   EXPECT_TRUE(IsMenuOpen());
@@ -627,6 +635,7 @@
 
 TEST_F(EditableComboboxTest, ArrowButtonOpensAndClosesMenu) {
   InitEditableCombobox();
+  dummy_focusable_view_->RequestFocus();
   EXPECT_FALSE(IsMenuOpen());
 
   ClickArrow();
@@ -656,5 +665,20 @@
   EXPECT_TRUE(IsMenuOpen());
 }
 
+TEST_F(EditableComboboxTest, ShowMenuOnClickWhenAlreadyFocused) {
+  std::vector<base::string16> items = {ASCIIToUTF16("item0"),
+                                       ASCIIToUTF16("item1")};
+  InitEditableCombobox(items, /*filter_on_edit=*/false,
+                       /*show_on_empty=*/true);
+
+  dummy_focusable_view_->RequestFocus();
+  combobox_->set_show_menu_on_next_focus(false);
+  combobox_->GetTextfieldForTest()->RequestFocus();
+  EXPECT_FALSE(IsMenuOpen());
+
+  ClickTextfield();
+  EXPECT_TRUE(IsMenuOpen());
+}
+
 }  // namespace
 }  // namespace views
diff --git a/ui/views/controls/table/table_grouper.h b/ui/views/controls/table/table_grouper.h
index c6676dc..af2fc0f 100644
--- a/ui/views/controls/table/table_grouper.h
+++ b/ui/views/controls/table/table_grouper.h
@@ -27,4 +27,4 @@
 
 }  // namespace views
 
-#endif  // UI_VIEWS_CONTROLS_TABLE_GROUP_TABLE_VIEW_H_
+#endif  // UI_VIEWS_CONTROLS_TABLE_TABLE_GROUPER_H_
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
index c3af486..1347bbf 100644
--- a/ui/views/controls/textfield/textfield.cc
+++ b/ui/views/controls/textfield/textfield.cc
@@ -682,6 +682,8 @@
 }
 
 void Textfield::OnMouseReleased(const ui::MouseEvent& event) {
+  if (controller_)
+    controller_->HandleMouseEvent(this, event);
   selection_controller_.OnMouseReleased(event);
 }
 
diff --git a/ui/views/controls/textfield/textfield_unittest.cc b/ui/views/controls/textfield/textfield_unittest.cc
index d31831b..00bc39c0 100644
--- a/ui/views/controls/textfield/textfield_unittest.cc
+++ b/ui/views/controls/textfield/textfield_unittest.cc
@@ -25,6 +25,7 @@
 #include "ui/aura/window.h"
 #include "ui/base/clipboard/clipboard.h"
 #include "ui/base/clipboard/scoped_clipboard_writer.h"
+#include "ui/base/clipboard/test/test_clipboard.h"
 #include "ui/base/dragdrop/drag_drop_types.h"
 #include "ui/base/emoji/emoji_panel_helper.h"
 #include "ui/base/ime/constants.h"
@@ -406,6 +407,14 @@
     ViewsTestBase::TearDown();
   }
 
+  void SetUp() override {
+    // OS clipboard is a global resource, which causes flakiness when unit tests
+    // run in parallel. So, use a per-instance test clipboard.
+    ui::Clipboard::SetClipboardForCurrentThread(
+        std::make_unique<ui::TestClipboard>());
+    ViewsTestBase::SetUp();
+  }
+
   ui::ClipboardType GetAndResetCopiedToClipboard() {
     ui::ClipboardType clipboard_type = copied_to_clipboard_;
     copied_to_clipboard_ = ui::CLIPBOARD_TYPE_LAST;
@@ -2268,7 +2277,6 @@
 
 TEST_F(TextfieldTest, CutCopyPaste) {
   InitTextfield();
-
   // Ensure IDS_APP_CUT cuts.
   textfield_->SetText(ASCIIToUTF16("123"));
   textfield_->SelectAll(false);
diff --git a/ui/views/controls/tree/tree_view.h b/ui/views/controls/tree/tree_view.h
index 14c8482..649a244d 100644
--- a/ui/views/controls/tree/tree_view.h
+++ b/ui/views/controls/tree/tree_view.h
@@ -441,4 +441,4 @@
 
 }  // namespace views
 
-#endif  // UI_VIEWS_CONTROLS_TREE_TREE_VIEW_VIEWS_H_
+#endif  // UI_VIEWS_CONTROLS_TREE_TREE_VIEW_H_
diff --git a/ui/views/controls/tree/tree_view_drawing_provider.h b/ui/views/controls/tree/tree_view_drawing_provider.h
index a463581..814574ed42 100644
--- a/ui/views/controls/tree/tree_view_drawing_provider.h
+++ b/ui/views/controls/tree/tree_view_drawing_provider.h
@@ -44,4 +44,4 @@
 
 }  // namespace views
 
-#endif  // UI_VIEWS_CONTROLS_TREE_TREE_VIEW_DISPLAY_PROVIDER_H_
+#endif  // UI_VIEWS_CONTROLS_TREE_TREE_VIEW_DRAWING_PROVIDER_H_
diff --git a/ui/views/linux_ui/status_icon_linux.h b/ui/views/linux_ui/status_icon_linux.h
index 5ede7a8..a613269 100644
--- a/ui/views/linux_ui/status_icon_linux.h
+++ b/ui/views/linux_ui/status_icon_linux.h
@@ -58,4 +58,4 @@
 
 }  // namespace views
 
-#endif  // UI_LINUX_UI_STATUS_ICON_LINUX_H_
+#endif  // UI_VIEWS_LINUX_UI_STATUS_ICON_LINUX_H_
diff --git a/ui/views/metadata/type_conversion.h b/ui/views/metadata/type_conversion.h
index 57e427e..1d11cb6 100644
--- a/ui/views/metadata/type_conversion.h
+++ b/ui/views/metadata/type_conversion.h
@@ -40,7 +40,8 @@
     base::string16 str_value;
   };
 
-  EnumStrings(std::vector<EnumString> init_val) : pairs(std::move(init_val)) {}
+  explicit EnumStrings(std::vector<EnumString> init_val)
+      : pairs(std::move(init_val)) {}
 
   const std::vector<EnumString> pairs;
 };
diff --git a/ui/views/test/combobox_test_api.h b/ui/views/test/combobox_test_api.h
index 725ef35..74a8ca7 100644
--- a/ui/views/test/combobox_test_api.h
+++ b/ui/views/test/combobox_test_api.h
@@ -47,4 +47,4 @@
 
 }  // namespace views
 
-#endif  // UI_VIEWS_TEST_MENU_RUNNER_TEST_API_H_
+#endif  // UI_VIEWS_TEST_COMBOBOX_TEST_API_H_
diff --git a/ui/views/test/desktop_test_views_delegate.h b/ui/views/test/desktop_test_views_delegate.h
index 91b91b1..49d542e 100644
--- a/ui/views/test/desktop_test_views_delegate.h
+++ b/ui/views/test/desktop_test_views_delegate.h
@@ -28,4 +28,4 @@
 
 }  // namespace views
 
-#endif
+#endif  // UI_VIEWS_TEST_DESKTOP_TEST_VIEWS_DELEGATE_H_
diff --git a/ui/views/touchui/touch_selection_controller_impl_unittest.cc b/ui/views/touchui/touch_selection_controller_impl_unittest.cc
index a856611..1a8a5315 100644
--- a/ui/views/touchui/touch_selection_controller_impl_unittest.cc
+++ b/ui/views/touchui/touch_selection_controller_impl_unittest.cc
@@ -697,7 +697,6 @@
   gfx::Rect bounds_;
 
   // Cursor position inside the client view.
-  //gfx::Rect cursor_rect_;
   gfx::SelectionBound cursor_bound_;
 
   DISALLOW_COPY_AND_ASSIGN(TestTouchEditable);
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index 0aa303b..6004845 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -1325,7 +1325,7 @@
 }
 
 void RotateClockwise(gfx::Transform* transform) {
-  transform->matrix().set3x3( 0, 1, 0,
+  transform->matrix().set3x3( 0, 1, 0,  // NOLINT
                              -1, 0, 0,
                               0, 0, 1);
 }
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.h b/ui/views/widget/desktop_aura/desktop_screen_x11.h
index 06ca082..877d4ae3 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.h
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.h
@@ -67,7 +67,7 @@
   friend class test::DesktopScreenX11TestApi;
 
   // Constructor used in tests.
-  DesktopScreenX11(const std::vector<display::Display>& test_displays);
+  explicit DesktopScreenX11(const std::vector<display::Display>& test_displays);
 
   // Removes |delayed_configuration_task_| from the task queue (if
   // it's in the queue) and adds it back at the end of the queue.
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc
index fd150880..c9a1535 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc
@@ -247,8 +247,8 @@
   EXPECT_FALSE(widget->IsActive());
   // TODO(shuchen): uncomment the below check once the
   // "default-focused-input-method" logic is removed in aura::WindowTreeHost.
-  //EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE,
-  //          widget->GetInputMethod()->GetTextInputType());
+  // EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE,
+  //           widget->GetInputMethod()->GetTextInputType());
 
   widget->Activate();
   ActivationWaiter waiter(
diff --git a/ui/views/widget/desktop_aura/x11_desktop_handler_observer.h b/ui/views/widget/desktop_aura/x11_desktop_handler_observer.h
index 252ca21..679d867 100644
--- a/ui/views/widget/desktop_aura/x11_desktop_handler_observer.h
+++ b/ui/views/widget/desktop_aura/x11_desktop_handler_observer.h
@@ -23,4 +23,4 @@
 
 }  // namespace views
 
-#endif  // UI_DISPLAY_DESKTOP_OBSERVER_H_
+#endif  // UI_VIEWS_WIDGET_DESKTOP_AURA_X11_DESKTOP_HANDLER_OBSERVER_H_
diff --git a/ui/views/widget/desktop_aura/x11_topmost_window_finder.h b/ui/views/widget/desktop_aura/x11_topmost_window_finder.h
index 7e2a746..31ed462 100644
--- a/ui/views/widget/desktop_aura/x11_topmost_window_finder.h
+++ b/ui/views/widget/desktop_aura/x11_topmost_window_finder.h
@@ -50,6 +50,6 @@
   DISALLOW_COPY_AND_ASSIGN(X11TopmostWindowFinder);
 };
 
-}  // namespace
+}  // namespace views
 
 #endif  // UI_VIEWS_WIDGET_DESKTOP_AURA_X11_TOPMOST_WINDOW_FINDER_H_
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index 62b9ebd2..d5ec872 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -24,7 +24,6 @@
 #include "ui/aura/client/window_parenting_client.h"
 #include "ui/aura/client/window_types.h"
 #include "ui/aura/env.h"
-#include "ui/aura/mus/property_utils.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_observer.h"
@@ -152,9 +151,7 @@
   ownership_ = params.ownership;
 
   RegisterNativeWidgetForWindow(this, window_);
-  // MusClient has assertions that ws::mojom::WindowType matches
-  // views::Widget::InitParams::Type.
-  aura::SetWindowType(window_, static_cast<ws::mojom::WindowType>(params.type));
+  window_->SetType(GetAuraWindowTypeForWidgetType(params.type));
   if (params.corner_radius) {
     window_->SetProperty(aura::client::kWindowCornerRadiusKey,
                          *params.corner_radius);
diff --git a/ui/views/widget/native_widget_aura_unittest.cc b/ui/views/widget/native_widget_aura_unittest.cc
index 2f9d3266e..a71649b 100644
--- a/ui/views/widget/native_widget_aura_unittest.cc
+++ b/ui/views/widget/native_widget_aura_unittest.cc
@@ -98,9 +98,9 @@
   NativeWidgetAura* window = Init(parent.get(), widget.get());
 
   window->CenterWindow(gfx::Size(100, 100));
-  EXPECT_EQ(gfx::Rect( (640 - 100) / 2,
-                       (480 - 100) / 2,
-                       100, 100),
+  EXPECT_EQ(gfx::Rect((640 - 100) / 2,
+                      (480 - 100) / 2,
+                      100, 100),
             window->GetNativeWindow()->bounds());
   widget->CloseNow();
 }
@@ -115,9 +115,9 @@
   NativeWidgetAura* window = Init(parent.get(), widget.get());
 
   window->CenterWindow(gfx::Size(100, 100));
-  EXPECT_EQ(gfx::Rect( (480 - 100) / 2,
-                       (320 - 100) / 2,
-                       100, 100),
+  EXPECT_EQ(gfx::Rect((480 - 100) / 2,
+                      (320 - 100) / 2,
+                      100, 100),
             window->GetNativeWindow()->bounds());
   widget->CloseNow();
 }
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 8239277..1feff54 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -187,7 +187,8 @@
   if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET) {
     delete native_widget_;
   } else {
-    DCHECK(native_widget_destroyed_)
+    // TODO(crbug.com/937381): Revert to DCHECK once we figure out the reason.
+    CHECK(native_widget_destroyed_)
         << "Destroying a widget with a live native widget. "
         << "Widget probably should use WIDGET_OWNS_NATIVE_WIDGET ownership.";
   }
diff --git a/ui/views/widget/widget_utils.h b/ui/views/widget/widget_utils.h
index f67d9f6e..93479e8e 100644
--- a/ui/views/widget/widget_utils.h
+++ b/ui/views/widget/widget_utils.h
@@ -17,4 +17,4 @@
 
 }  // namespace views
 
-#endif  // UI_VIEWS_WIDGET_WIDGET_H_
+#endif  // UI_VIEWS_WIDGET_WIDGET_UTILS_H_
diff --git a/ui/views/widget/widget_utils_mac.h b/ui/views/widget/widget_utils_mac.h
index 2ee5ec7..8a3d31a 100644
--- a/ui/views/widget/widget_utils_mac.h
+++ b/ui/views/widget/widget_utils_mac.h
@@ -13,4 +13,4 @@
 
 }  // namespace views
 
-#endif  // UI_VIEWS_WIDGET_WIDGET_UTILS_MAC_H_
\ No newline at end of file
+#endif  // UI_VIEWS_WIDGET_WIDGET_UTILS_MAC_H_
diff --git a/ui/views/window/window_resize_utils.cc b/ui/views/window/window_resize_utils.cc
index 61ddee4..8ec1727 100644
--- a/ui/views/window/window_resize_utils.cc
+++ b/ui/views/window/window_resize_utils.cc
@@ -103,4 +103,4 @@
   rect->SetByBounds(left, top, right, bottom);
 }
 
-}  // namespace views
\ No newline at end of file
+}  // namespace views
diff --git a/ui/views/window/window_resize_utils.h b/ui/views/window/window_resize_utils.h
index f833e82..77d3b162 100644
--- a/ui/views/window/window_resize_utils.h
+++ b/ui/views/window/window_resize_utils.h
@@ -53,4 +53,4 @@
 
 }  // namespace views
 
-#endif  // UI_VIEWS_WINDOW_WINDOW_RESIZE_UTILS_H_
\ No newline at end of file
+#endif  // UI_VIEWS_WINDOW_WINDOW_RESIZE_UTILS_H_
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_list.html b/ui/webui/resources/cr_components/certificate_manager/certificate_list.html
index 8748868..c0798d5 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_list.html
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_list.html
@@ -19,6 +19,11 @@
         min-height: 48px;
         padding: 0 20px;
       }
+
+      /* TODO(aee): add platform conditional after crbug/964506 is fixed. */
+      #importAndBind {
+        margin-inline-start: 8px;
+      }
     </style>
     <div class="button-box">
       <span class="flex">
diff --git a/ui/webui/resources/cr_components/chromeos/BUILD.gn b/ui/webui/resources/cr_components/chromeos/BUILD.gn
index 895487a..2ec0ddce 100644
--- a/ui/webui/resources/cr_components/chromeos/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/BUILD.gn
@@ -13,6 +13,7 @@
     "multidevice_setup:closure_compile",
     "network:closure_compile",
     "quick_unlock:closure_compile",
+    "smb_shares:closure_compile",
   ]
 }
 
diff --git a/ui/webui/resources/cr_elements/paper_tabs_style_css.html b/ui/webui/resources/cr_elements/paper_tabs_style_css.html
deleted file mode 100644
index c769c86..0000000
--- a/ui/webui/resources/cr_elements/paper_tabs_style_css.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<link rel="import" href="../html/polymer.html">
-
-<link rel="import" href="shared_vars_css.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
-
-<!-- Common paper-tabs styling for Material Design WebUI. -->
-<dom-module id="paper-tabs-style">
-  <template>
-    <style>
-      paper-tabs {
-        --paper-tabs-selection-bar-color: var(--google-blue-600);
-      }
-
-      :host-context([dark]) paper-tabs {
-        /* TODO(dbeam): verify these colors with Namrata. */
-        --paper-tabs-selection-bar-color: var(--google-blue-refresh-300);
-      }
-
-      paper-tab {
-        --paper-tab-content: {
-          color: var(--google-blue-600);
-        };
-        --paper-tab-content-unselected: {
-          color: var(--cr-secondary-text-color);
-        };
-      }
-
-      :host-context([dark]) paper-tab {
-        --paper-tab-content: {
-          color: var(--google-blue-refresh-300);
-        };
-      }
-    </style>
-  </template>
-</dom-module>
diff --git a/ui/webui/resources/cr_elements_resources.grdp b/ui/webui/resources/cr_elements_resources.grdp
index ffd4744f..c4427629 100644
--- a/ui/webui/resources/cr_elements_resources.grdp
+++ b/ui/webui/resources/cr_elements_resources.grdp
@@ -376,10 +376,6 @@
              file="cr_elements/paper_button_style_css.html"
              type="chrome_html"
              compress="gzip" />
-  <structure name="IDR_CR_ELEMENTS_PAPER_TABS_STYLE_CSS_HTML"
-             file="cr_elements/paper_tabs_style_css.html"
-             type="chrome_html"
-             compress="gzip" />
   <structure name="IDR_CR_ELEMENTS_SEARCH_HIGHLIGHT_STYLE_CSS_HTML"
              file="cr_elements/search_highlight_style_css.html"
              type="chrome_html"
diff --git a/ui/webui/resources/js/cr/ui/table/table_column.js b/ui/webui/resources/js/cr/ui/table/table_column.js
index 5def72b..c6d5a87 100644
--- a/ui/webui/resources/js/cr/ui/table/table_column.js
+++ b/ui/webui/resources/js/cr/ui/table/table_column.js
@@ -127,7 +127,7 @@
 
   /**
    * The column header render function.
-   * @type {function(Element): Text}
+   * @type {function(Element):Node}
    */
   cr.defineProperty(TableColumn, 'headerRenderFunction');
 
diff --git a/ui/webui/resources/js/cr/ui/table/table_column_model.js b/ui/webui/resources/js/cr/ui/table/table_column_model.js
index 98a0f86..4eef9834 100644
--- a/ui/webui/resources/js/cr/ui/table/table_column_model.js
+++ b/ui/webui/resources/js/cr/ui/table/table_column_model.js
@@ -17,6 +17,7 @@
    * @extends {cr.EventTarget}
    */
   function TableColumnModel(tableColumns) {
+    /** @type {!Array<cr.ui.table.TableColumn>} */
     this.columns_ = [];
     for (let i = 0; i < tableColumns.length; i++) {
       this.columns_.push(tableColumns[i].clone());
@@ -75,7 +76,7 @@
     /**
      * Returns width (in percent) of column at the given index.
      * @param {number} index The index of the column.
-     * @return {string} Column width in pixels.
+     * @return {number} Column width in pixels.
      */
     getWidth: function(index) {
       return this.columns_[index].width;
diff --git a/ui/webui/resources/polymer_resources.grdp b/ui/webui/resources/polymer_resources.grdp
index df840c4c..e6cedee 100644
--- a/ui/webui/resources/polymer_resources.grdp
+++ b/ui/webui/resources/polymer_resources.grdp
@@ -526,26 +526,6 @@
              file="../../../third_party/polymer/v1_0/components-chromium/paper-styles/typography.html"
              type="chrome_html"
              compress="gzip" />
-  <structure name="IDR_POLYMER_1_0_PAPER_TABS_PAPER_TAB_EXTRACTED_JS"
-             file="../../../third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tab-extracted.js"
-             type="chrome_html"
-             compress="gzip" />
-  <structure name="IDR_POLYMER_1_0_PAPER_TABS_PAPER_TAB_HTML"
-             file="../../../third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tab.html"
-             type="chrome_html"
-             compress="gzip" />
-  <structure name="IDR_POLYMER_1_0_PAPER_TABS_PAPER_TABS_EXTRACTED_JS"
-             file="../../../third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-extracted.js"
-             type="chrome_html"
-             compress="gzip" />
-  <structure name="IDR_POLYMER_1_0_PAPER_TABS_PAPER_TABS_ICONS_HTML"
-             file="../../../third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs-icons.html"
-             type="chrome_html"
-             compress="gzip" />
-  <structure name="IDR_POLYMER_1_0_PAPER_TABS_PAPER_TABS_HTML"
-             file="../../../third_party/polymer/v1_0/components-chromium/paper-tabs/paper-tabs.html"
-             type="chrome_html"
-             compress="gzip" />
   <structure name="IDR_POLYMER_1_0_PAPER_TOOLTIP_PAPER_TOOLTIP_EXTRACTED_JS"
              file="../../../third_party/polymer/v1_0/components-chromium/paper-tooltip/paper-tooltip-extracted.js"
              type="chrome_html"
diff --git a/ui/wm/BUILD.gn b/ui/wm/BUILD.gn
index 38d53f5..578f0d6a 100644
--- a/ui/wm/BUILD.gn
+++ b/ui/wm/BUILD.gn
@@ -109,11 +109,8 @@
 
   deps = [
     ":wm",
-    "//services/service_manager/public/cpp",
-    "//services/ws/public/cpp",
     "//services/ws/public/cpp/input_devices",
     "//services/ws/public/mojom",
-    "//services/ws/test_ws:mojom",
     "//skia",
     "//ui/aura",
     "//ui/aura:test_support",
diff --git a/ui/wm/test/DEPS b/ui/wm/test/DEPS
index 6abbbb8..c024b8c8 100644
--- a/ui/wm/test/DEPS
+++ b/ui/wm/test/DEPS
@@ -1,7 +1,5 @@
 include_rules = [
-  "+services/service_manager/public",
   "+services/ws/public",
-  "+services/ws/test_ws",
   "+ui/aura",
   "+ui/base/resource/resource_bundle.h",
   "+ui/base/ui_base_paths.h",